muonroi-cli 1.8.4 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
  5. package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
  7. package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
  9. package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
  10. package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
  11. package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
  12. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  13. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  14. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  15. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  16. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  17. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  18. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  19. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  20. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  21. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  22. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  23. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  24. package/dist/src/agent-harness/mock-model.d.ts +38 -0
  25. package/dist/src/agent-harness/mock-model.js +69 -3
  26. package/dist/src/agent-harness/test-spawn.js +31 -0
  27. package/dist/src/chat/chat-keychain.d.ts +7 -12
  28. package/dist/src/chat/chat-keychain.js +19 -86
  29. package/dist/src/cli/config/screen-providers.js +1 -1
  30. package/dist/src/cli/cost-forensics.d.ts +10 -0
  31. package/dist/src/cli/cost-forensics.js +18 -3
  32. package/dist/src/cli/keys-bundle.d.ts +1 -1
  33. package/dist/src/cli/keys-bundle.js +1 -1
  34. package/dist/src/cli/keys.d.ts +10 -47
  35. package/dist/src/cli/keys.js +31 -399
  36. package/dist/src/council/clarifier.d.ts +31 -3
  37. package/dist/src/council/clarifier.js +220 -32
  38. package/dist/src/council/context.js +49 -15
  39. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  40. package/dist/src/council/debate-checkpoint.js +176 -0
  41. package/dist/src/council/debate-planner.js +54 -5
  42. package/dist/src/council/debate-summary.d.ts +25 -0
  43. package/dist/src/council/debate-summary.js +85 -0
  44. package/dist/src/council/debate.d.ts +169 -2
  45. package/dist/src/council/debate.js +1265 -135
  46. package/dist/src/council/index.d.ts +108 -1
  47. package/dist/src/council/index.js +670 -197
  48. package/dist/src/council/leader.d.ts +26 -0
  49. package/dist/src/council/leader.js +150 -9
  50. package/dist/src/council/llm.d.ts +94 -0
  51. package/dist/src/council/llm.js +348 -55
  52. package/dist/src/council/panel-select.d.ts +30 -0
  53. package/dist/src/council/panel-select.js +82 -0
  54. package/dist/src/council/planner.js +40 -0
  55. package/dist/src/council/preflight.d.ts +17 -0
  56. package/dist/src/council/preflight.js +50 -2
  57. package/dist/src/council/prompts.d.ts +39 -4
  58. package/dist/src/council/prompts.js +256 -69
  59. package/dist/src/council/stance-recall.d.ts +42 -0
  60. package/dist/src/council/stance-recall.js +57 -0
  61. package/dist/src/council/strip-think.d.ts +17 -0
  62. package/dist/src/council/strip-think.js +33 -0
  63. package/dist/src/council/types.d.ts +138 -0
  64. package/dist/src/ee/artifact-cache.d.ts +16 -0
  65. package/dist/src/ee/artifact-cache.js +32 -0
  66. package/dist/src/ee/auth.d.ts +20 -0
  67. package/dist/src/ee/auth.js +54 -2
  68. package/dist/src/ee/bridge.d.ts +10 -0
  69. package/dist/src/ee/bridge.js +58 -0
  70. package/dist/src/ee/client.js +109 -21
  71. package/dist/src/ee/ee-onboarding.js +6 -26
  72. package/dist/src/ee/export-transcripts.d.ts +1 -0
  73. package/dist/src/ee/export-transcripts.js +8 -10
  74. package/dist/src/ee/extract-session.js +29 -0
  75. package/dist/src/ee/extract-style.d.ts +58 -0
  76. package/dist/src/ee/extract-style.js +270 -0
  77. package/dist/src/ee/recall-ledger.d.ts +9 -0
  78. package/dist/src/ee/recall-ledger.js +3 -0
  79. package/dist/src/ee/scope.d.ts +1 -0
  80. package/dist/src/ee/scope.js +26 -1
  81. package/dist/src/ee/search.d.ts +7 -0
  82. package/dist/src/ee/search.js +24 -0
  83. package/dist/src/ee/transcript-emit.js +2 -0
  84. package/dist/src/ee/types.d.ts +22 -0
  85. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  86. package/dist/src/ee/who-am-i-brain.js +220 -0
  87. package/dist/src/ee/who-am-i.d.ts +10 -3
  88. package/dist/src/ee/who-am-i.js +12 -0
  89. package/dist/src/ee/workflow-event.d.ts +48 -0
  90. package/dist/src/ee/workflow-event.js +81 -0
  91. package/dist/src/flow/compaction/compress.d.ts +3 -3
  92. package/dist/src/flow/compaction/compress.js +58 -8
  93. package/dist/src/flow/compaction/extract.d.ts +4 -7
  94. package/dist/src/flow/compaction/extract.js +50 -10
  95. package/dist/src/flow/compaction/index.d.ts +14 -1
  96. package/dist/src/flow/compaction/index.js +96 -3
  97. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  98. package/dist/src/flow/compaction/input-guard.js +43 -0
  99. package/dist/src/flow/compaction/progress.d.ts +35 -0
  100. package/dist/src/flow/compaction/progress.js +35 -0
  101. package/dist/src/flow/fold-planning.d.ts +36 -0
  102. package/dist/src/flow/fold-planning.js +83 -0
  103. package/dist/src/flow/hierarchy.d.ts +146 -0
  104. package/dist/src/flow/hierarchy.js +427 -0
  105. package/dist/src/flow/index.d.ts +1 -0
  106. package/dist/src/flow/index.js +2 -0
  107. package/dist/src/flow/run-artifacts.d.ts +102 -0
  108. package/dist/src/flow/run-artifacts.js +208 -0
  109. package/dist/src/generated/version.d.ts +1 -1
  110. package/dist/src/generated/version.js +1 -1
  111. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  112. package/dist/src/gsd/assessment-schema.js +134 -0
  113. package/dist/src/gsd/capability-registry.d.ts +45 -0
  114. package/dist/src/gsd/capability-registry.js +337 -0
  115. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  116. package/dist/src/gsd/complexity-assessor.js +152 -0
  117. package/dist/src/gsd/config-bridge.d.ts +7 -0
  118. package/dist/src/gsd/config-bridge.js +114 -0
  119. package/dist/src/gsd/config-loader.d.ts +27 -0
  120. package/dist/src/gsd/config-loader.js +50 -0
  121. package/dist/src/gsd/council-context.d.ts +44 -0
  122. package/dist/src/gsd/council-context.js +114 -0
  123. package/dist/src/gsd/ee-closure.d.ts +28 -0
  124. package/dist/src/gsd/ee-closure.js +49 -0
  125. package/dist/src/gsd/flags.d.ts +66 -0
  126. package/dist/src/gsd/flags.js +102 -0
  127. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  128. package/dist/src/gsd/gsd-dispatch.js +131 -0
  129. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  130. package/dist/src/gsd/gsd-runtime.js +37 -0
  131. package/dist/src/gsd/host-adapter.d.ts +11 -0
  132. package/dist/src/gsd/host-adapter.js +29 -0
  133. package/dist/src/gsd/index.d.ts +24 -1
  134. package/dist/src/gsd/index.js +27 -0
  135. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  136. package/dist/src/gsd/loop-host-contract.js +39 -0
  137. package/dist/src/gsd/loop-host.d.ts +69 -0
  138. package/dist/src/gsd/loop-host.js +245 -0
  139. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  140. package/dist/src/gsd/loop-resolver.js +79 -0
  141. package/dist/src/gsd/model-tier.d.ts +13 -0
  142. package/dist/src/gsd/model-tier.js +45 -0
  143. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  144. package/dist/src/gsd/mutation-gate.js +41 -0
  145. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  146. package/dist/src/gsd/native-roadmap.js +343 -0
  147. package/dist/src/gsd/native-state.d.ts +47 -0
  148. package/dist/src/gsd/native-state.js +220 -0
  149. package/dist/src/gsd/paths.d.ts +23 -0
  150. package/dist/src/gsd/paths.js +66 -0
  151. package/dist/src/gsd/phase-dag.d.ts +12 -0
  152. package/dist/src/gsd/phase-dag.js +94 -0
  153. package/dist/src/gsd/phase-sync.d.ts +42 -0
  154. package/dist/src/gsd/phase-sync.js +321 -0
  155. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  156. package/dist/src/gsd/pil-gate-context.js +64 -0
  157. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  158. package/dist/src/gsd/pil-gate-critic.js +74 -0
  159. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  160. package/dist/src/gsd/plan-council-prompts.js +79 -0
  161. package/dist/src/gsd/plan-council.d.ts +44 -0
  162. package/dist/src/gsd/plan-council.js +283 -0
  163. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  164. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  165. package/dist/src/gsd/product-workspace.d.ts +13 -0
  166. package/dist/src/gsd/product-workspace.js +124 -0
  167. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  168. package/dist/src/gsd/ship-bridge.js +65 -0
  169. package/dist/src/gsd/state-document.d.ts +40 -0
  170. package/dist/src/gsd/state-document.js +163 -0
  171. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  172. package/dist/src/gsd/verdict-schema.js +144 -0
  173. package/dist/src/gsd/verify-context.d.ts +22 -0
  174. package/dist/src/gsd/verify-context.js +27 -0
  175. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  176. package/dist/src/gsd/verify-council-prompts.js +85 -0
  177. package/dist/src/gsd/verify-council.d.ts +25 -0
  178. package/dist/src/gsd/verify-council.js +119 -0
  179. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  180. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  181. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  182. package/dist/src/gsd/workflow-engine.js +207 -0
  183. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  184. package/dist/src/gsd/workflow-tools.js +277 -0
  185. package/dist/src/headless/council-answers.js +4 -0
  186. package/dist/src/hooks/index.js +1 -1
  187. package/dist/src/index.js +172 -270
  188. package/dist/src/lsp/builtins.js +3 -1
  189. package/dist/src/lsp/manager.d.ts +5 -1
  190. package/dist/src/lsp/manager.js +249 -3
  191. package/dist/src/lsp/npm-cache.d.ts +11 -1
  192. package/dist/src/lsp/npm-cache.js +17 -1
  193. package/dist/src/lsp/runtime.d.ts +6 -1
  194. package/dist/src/lsp/runtime.js +17 -1
  195. package/dist/src/lsp/types.d.ts +83 -1
  196. package/dist/src/lsp/types.js +10 -0
  197. package/dist/src/maintain/pr-builder.js +23 -13
  198. package/dist/src/mcp/auto-setup.js +57 -32
  199. package/dist/src/mcp/client-pool.js +44 -16
  200. package/dist/src/mcp/lsp-tools.d.ts +5 -1
  201. package/dist/src/mcp/lsp-tools.js +93 -2
  202. package/dist/src/mcp/mcp-keychain.d.ts +3 -5
  203. package/dist/src/mcp/mcp-keychain.js +9 -49
  204. package/dist/src/mcp/research-onboarding.js +8 -7
  205. package/dist/src/mcp/runtime.js +34 -2
  206. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  207. package/dist/src/mcp/setup-guide-text.js +22 -2
  208. package/dist/src/mcp/tools-server.d.ts +10 -0
  209. package/dist/src/mcp/tools-server.js +10 -2
  210. package/dist/src/models/catalog-client.d.ts +87 -0
  211. package/dist/src/models/catalog-client.js +105 -38
  212. package/dist/src/models/catalog.json +528 -265
  213. package/dist/src/models/registry.d.ts +22 -7
  214. package/dist/src/models/registry.js +73 -10
  215. package/dist/src/ops/doctor.js +1 -1
  216. package/dist/src/orchestrator/ask-user.d.ts +61 -0
  217. package/dist/src/orchestrator/ask-user.js +65 -0
  218. package/dist/src/orchestrator/auto-commit.js +1 -1
  219. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  220. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  221. package/dist/src/orchestrator/cache-prefix.js +83 -0
  222. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  223. package/dist/src/orchestrator/compact-request.js +41 -0
  224. package/dist/src/orchestrator/compaction.d.ts +12 -3
  225. package/dist/src/orchestrator/compaction.js +35 -15
  226. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  227. package/dist/src/orchestrator/council-manager.js +74 -32
  228. package/dist/src/orchestrator/council-request.d.ts +49 -0
  229. package/dist/src/orchestrator/council-request.js +62 -0
  230. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  231. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  232. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  233. package/dist/src/orchestrator/error-utils.js +132 -24
  234. package/dist/src/orchestrator/grounding-check.js +39 -1
  235. package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
  236. package/dist/src/orchestrator/interactive-pause.js +36 -0
  237. package/dist/src/orchestrator/message-processor.d.ts +4 -0
  238. package/dist/src/orchestrator/message-processor.js +268 -41
  239. package/dist/src/orchestrator/orchestrator.d.ts +64 -3
  240. package/dist/src/orchestrator/orchestrator.js +823 -120
  241. package/dist/src/orchestrator/preprocessor.js +3 -3
  242. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  243. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  244. package/dist/src/orchestrator/prompts.js +17 -17
  245. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  246. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  247. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  248. package/dist/src/orchestrator/retry-classifier.js +46 -2
  249. package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
  250. package/dist/src/orchestrator/safety-askcard.js +5 -2
  251. package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
  252. package/dist/src/orchestrator/safety-intercept.js +62 -0
  253. package/dist/src/orchestrator/scope-reminder.js +1 -1
  254. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  255. package/dist/src/orchestrator/session-experience.js +2 -1
  256. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  257. package/dist/src/orchestrator/should-run-gate.js +18 -0
  258. package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
  259. package/dist/src/orchestrator/stall-watchdog.js +65 -10
  260. package/dist/src/orchestrator/stream-runner.d.ts +13 -3
  261. package/dist/src/orchestrator/stream-runner.js +115 -49
  262. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  263. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  264. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  265. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  266. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  267. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  268. package/dist/src/orchestrator/tool-engine.d.ts +41 -0
  269. package/dist/src/orchestrator/tool-engine.js +846 -66
  270. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  271. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  272. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  273. package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
  274. package/dist/src/orchestrator/turn-watchdog.js +84 -0
  275. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  276. package/dist/src/pil/agent-operating-contract.js +6 -4
  277. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  278. package/dist/src/pil/cheap-model-playbook.js +5 -1
  279. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  280. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  281. package/dist/src/pil/discovery-types.d.ts +1 -0
  282. package/dist/src/pil/discovery.d.ts +1 -1
  283. package/dist/src/pil/discovery.js +18 -13
  284. package/dist/src/pil/layer1-intent.d.ts +18 -6
  285. package/dist/src/pil/layer1-intent.js +66 -757
  286. package/dist/src/pil/layer15-context-scan.js +15 -1
  287. package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
  288. package/dist/src/pil/layer1_5-complexity-size.js +31 -5
  289. package/dist/src/pil/layer3-ee-injection.js +23 -8
  290. package/dist/src/pil/layer4-gsd.js +69 -16
  291. package/dist/src/pil/layer5-context.js +7 -3
  292. package/dist/src/pil/layer6-output.d.ts +23 -0
  293. package/dist/src/pil/layer6-output.js +5 -1
  294. package/dist/src/pil/llm-classify.d.ts +111 -5
  295. package/dist/src/pil/llm-classify.js +421 -189
  296. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  297. package/dist/src/pil/native-capabilities-workbook.js +8 -0
  298. package/dist/src/pil/pipeline.js +36 -2
  299. package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
  300. package/dist/src/pil/repo-grounding-probe.js +136 -0
  301. package/dist/src/pil/repo-structure-hints.d.ts +7 -0
  302. package/dist/src/pil/repo-structure-hints.js +45 -0
  303. package/dist/src/pil/response-tools.js +5 -3
  304. package/dist/src/pil/schema.d.ts +1 -0
  305. package/dist/src/pil/schema.js +2 -0
  306. package/dist/src/pil/types.d.ts +18 -0
  307. package/dist/src/playbook/directives.d.ts +4 -0
  308. package/dist/src/playbook/directives.js +17 -5
  309. package/dist/src/product-loop/artifact-io.js +4 -0
  310. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  311. package/dist/src/product-loop/backlog-builder.js +30 -6
  312. package/dist/src/product-loop/criteria-seed.d.ts +51 -0
  313. package/dist/src/product-loop/criteria-seed.js +200 -0
  314. package/dist/src/product-loop/discovery-context-format.js +3 -1
  315. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  316. package/dist/src/product-loop/discovery-interview.d.ts +9 -0
  317. package/dist/src/product-loop/discovery-interview.js +60 -12
  318. package/dist/src/product-loop/discovery-recommender.js +2 -1
  319. package/dist/src/product-loop/discovery-schema.js +19 -2
  320. package/dist/src/product-loop/discovery-triage.d.ts +23 -0
  321. package/dist/src/product-loop/discovery-triage.js +109 -0
  322. package/dist/src/product-loop/gather.js +150 -2
  323. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  324. package/dist/src/product-loop/ideal-trace.js +64 -0
  325. package/dist/src/product-loop/index.d.ts +13 -1
  326. package/dist/src/product-loop/index.js +340 -52
  327. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  328. package/dist/src/product-loop/loop-driver.js +330 -106
  329. package/dist/src/product-loop/phase-plan.d.ts +21 -0
  330. package/dist/src/product-loop/phase-plan.js +81 -6
  331. package/dist/src/product-loop/phase-rituals.d.ts +3 -0
  332. package/dist/src/product-loop/phase-rituals.js +8 -3
  333. package/dist/src/product-loop/phase-runner.js +39 -12
  334. package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
  335. package/dist/src/product-loop/plan-adherence-review.js +144 -0
  336. package/dist/src/product-loop/sprint-runner.d.ts +173 -0
  337. package/dist/src/product-loop/sprint-runner.js +863 -19
  338. package/dist/src/product-loop/types.d.ts +61 -5
  339. package/dist/src/providers/adapter.d.ts +1 -1
  340. package/dist/src/providers/adapter.js +3 -4
  341. package/dist/src/providers/anthropic.d.ts +9 -8
  342. package/dist/src/providers/anthropic.js +13 -47
  343. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  344. package/dist/src/providers/auth/browser-flow.js +1 -1
  345. package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
  346. package/dist/src/providers/auth/grok-oauth.js +30 -5
  347. package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
  348. package/dist/src/providers/auth/openai-oauth.js +15 -1
  349. package/dist/src/providers/auth/registry.js +0 -34
  350. package/dist/src/providers/auth/token-store.d.ts +9 -9
  351. package/dist/src/providers/auth/token-store.js +8 -67
  352. package/dist/src/providers/auth/types.d.ts +9 -1
  353. package/dist/src/providers/auth/types.js +1 -1
  354. package/dist/src/providers/capabilities.d.ts +24 -5
  355. package/dist/src/providers/capabilities.js +42 -24
  356. package/dist/src/providers/endpoints.d.ts +2 -2
  357. package/dist/src/providers/endpoints.js +11 -10
  358. package/dist/src/providers/env-store.d.ts +17 -0
  359. package/dist/src/providers/env-store.js +228 -0
  360. package/dist/src/providers/keychain.d.ts +22 -18
  361. package/dist/src/providers/keychain.js +127 -140
  362. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  363. package/dist/src/providers/openai-compatible.js +8 -1
  364. package/dist/src/providers/pricing.d.ts +2 -2
  365. package/dist/src/providers/pricing.js +3 -13
  366. package/dist/src/providers/runtime.d.ts +43 -3
  367. package/dist/src/providers/runtime.js +88 -14
  368. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  369. package/dist/src/providers/strategies/base.strategy.js +24 -1
  370. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  371. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  372. package/dist/src/providers/strategies/registry.js +4 -4
  373. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  374. package/dist/src/providers/strategies/thinking-mode.js +288 -1
  375. package/dist/src/providers/strategies/xai.strategy.js +27 -0
  376. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  377. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  378. package/dist/src/providers/types.d.ts +5 -6
  379. package/dist/src/providers/types.js +2 -2
  380. package/dist/src/providers/vision-backend.d.ts +47 -0
  381. package/dist/src/providers/vision-backend.js +258 -0
  382. package/dist/src/providers/vision-proxy.d.ts +22 -9
  383. package/dist/src/providers/vision-proxy.js +63 -132
  384. package/dist/src/providers/warm.d.ts +65 -0
  385. package/dist/src/providers/warm.js +145 -0
  386. package/dist/src/providers/wire-debug.js +95 -0
  387. package/dist/src/router/decide.d.ts +13 -0
  388. package/dist/src/router/decide.js +138 -36
  389. package/dist/src/router/peak-hour.d.ts +38 -0
  390. package/dist/src/router/peak-hour.js +107 -0
  391. package/dist/src/router/step-router.js +3 -2
  392. package/dist/src/router/warm.js +4 -5
  393. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  394. package/dist/src/scaffold/continuation-prompt.js +26 -0
  395. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  396. package/dist/src/scaffold/point-to-existing.js +25 -0
  397. package/dist/src/self-qa/agentic-loop.js +6 -5
  398. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  399. package/dist/src/{ui/state → state}/active-run.js +21 -0
  400. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  401. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  402. package/dist/src/state/turn-trace.d.ts +43 -0
  403. package/dist/src/state/turn-trace.js +32 -0
  404. package/dist/src/storage/db.js +2 -1
  405. package/dist/src/storage/index.d.ts +1 -1
  406. package/dist/src/storage/index.js +1 -1
  407. package/dist/src/storage/interaction-log.d.ts +1 -1
  408. package/dist/src/storage/migrations.js +71 -1
  409. package/dist/src/storage/sessions.d.ts +28 -10
  410. package/dist/src/storage/sessions.js +78 -21
  411. package/dist/src/storage/transcript-view.js +1 -1
  412. package/dist/src/storage/transcript.d.ts +51 -0
  413. package/dist/src/storage/transcript.js +340 -15
  414. package/dist/src/tools/file.d.ts +15 -0
  415. package/dist/src/tools/file.js +32 -0
  416. package/dist/src/tools/git-safety.d.ts +19 -0
  417. package/dist/src/tools/git-safety.js +168 -0
  418. package/dist/src/tools/native-tools.d.ts +1 -1
  419. package/dist/src/tools/native-tools.js +81 -1
  420. package/dist/src/tools/registry.d.ts +20 -0
  421. package/dist/src/tools/registry.js +576 -23
  422. package/dist/src/tools/research.d.ts +29 -0
  423. package/dist/src/tools/research.js +233 -0
  424. package/dist/src/types/index.d.ts +147 -4
  425. package/dist/src/ui/app.js +0 -0
  426. package/dist/src/ui/cards/product-status-card.js +1 -1
  427. package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
  428. package/dist/src/ui/components/agent-rail-activities.js +47 -0
  429. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  430. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  431. package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
  432. package/dist/src/ui/components/compact-progress-card.js +42 -0
  433. package/dist/src/ui/components/context-rail.d.ts +26 -0
  434. package/dist/src/ui/components/context-rail.js +33 -0
  435. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  436. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  437. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  438. package/dist/src/ui/components/council-debate-pill.js +34 -0
  439. package/dist/src/ui/components/council-info-card.js +2 -2
  440. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  441. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  442. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  443. package/dist/src/ui/components/council-message-bubble.js +16 -15
  444. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  445. package/dist/src/ui/components/council-phase-timeline.js +66 -17
  446. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  447. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  448. package/dist/src/ui/components/council-question-card.js +13 -12
  449. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  450. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  451. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  452. package/dist/src/ui/components/council-round-group.js +88 -0
  453. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  454. package/dist/src/ui/components/council-status-list.js +36 -24
  455. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  456. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  457. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  458. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  459. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  460. package/dist/src/ui/components/message-view.d.ts +15 -0
  461. package/dist/src/ui/components/message-view.js +50 -1
  462. package/dist/src/ui/components/prompt-box.js +18 -16
  463. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  464. package/dist/src/ui/components/session-tree-card.js +46 -0
  465. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  466. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  467. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  468. package/dist/src/ui/components/task-list-panel.js +22 -2
  469. package/dist/src/ui/components/tool-group.d.ts +15 -3
  470. package/dist/src/ui/components/tool-group.js +69 -11
  471. package/dist/src/ui/containers/modals-layer.d.ts +4 -2
  472. package/dist/src/ui/containers/modals-layer.js +2 -2
  473. package/dist/src/ui/council-harness-event.d.ts +57 -0
  474. package/dist/src/ui/council-harness-event.js +46 -0
  475. package/dist/src/ui/heartbeat-debug.d.ts +29 -0
  476. package/dist/src/ui/heartbeat-debug.js +45 -0
  477. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  478. package/dist/src/ui/mcp-modal.js +2 -4
  479. package/dist/src/ui/modals/api-key-modal.js +1 -1
  480. package/dist/src/ui/modals/connect-modal.js +4 -3
  481. package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
  482. package/dist/src/ui/modals/model-picker-modal.js +8 -10
  483. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  484. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  485. package/dist/src/ui/picker-providers.d.ts +1 -1
  486. package/dist/src/ui/picker-providers.js +1 -1
  487. package/dist/src/ui/primitives/index.d.ts +1 -0
  488. package/dist/src/ui/primitives/index.js +2 -0
  489. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  490. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  491. package/dist/src/ui/slash/compact.js +5 -7
  492. package/dist/src/ui/slash/cost.js +1 -1
  493. package/dist/src/ui/slash/council.js +19 -1
  494. package/dist/src/ui/slash/debug.d.ts +3 -31
  495. package/dist/src/ui/slash/debug.js +9 -20
  496. package/dist/src/ui/slash/ee.js +81 -0
  497. package/dist/src/ui/slash/ideal.d.ts +6 -2
  498. package/dist/src/ui/slash/ideal.js +97 -7
  499. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  500. package/dist/src/ui/slash/menu-items.js +23 -20
  501. package/dist/src/ui/slash/registry.d.ts +2 -0
  502. package/dist/src/ui/slash/registry.js +4 -0
  503. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  504. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  505. package/dist/src/ui/status-bar/index.d.ts +1 -1
  506. package/dist/src/ui/status-bar/index.js +7 -3
  507. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  508. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  509. package/dist/src/ui/theme.d.ts +1 -0
  510. package/dist/src/ui/theme.js +2 -0
  511. package/dist/src/ui/types.d.ts +7 -0
  512. package/dist/src/ui/use-app-logic.js +0 -0
  513. package/dist/src/ui/utils/agent-activities.d.ts +39 -0
  514. package/dist/src/ui/utils/agent-activities.js +96 -0
  515. package/dist/src/ui/utils/format.d.ts +14 -0
  516. package/dist/src/ui/utils/format.js +23 -3
  517. package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
  518. package/dist/src/ui/utils/group-tool-entries.js +111 -0
  519. package/dist/src/ui/utils/tool-summary.d.ts +21 -0
  520. package/dist/src/ui/utils/tool-summary.js +91 -0
  521. package/dist/src/usage/downgrade.js +2 -2
  522. package/dist/src/usage/product-ledger.js +2 -2
  523. package/dist/src/utils/event-loop-monitor.d.ts +85 -0
  524. package/dist/src/utils/event-loop-monitor.js +107 -0
  525. package/dist/src/utils/install-manager.js +2 -1
  526. package/dist/src/utils/llm-deadline.d.ts +14 -0
  527. package/dist/src/utils/llm-deadline.js +19 -0
  528. package/dist/src/utils/logger.js +2 -2
  529. package/dist/src/utils/loop-profiler.d.ts +102 -0
  530. package/dist/src/utils/loop-profiler.js +202 -0
  531. package/dist/src/utils/permission-mode.js +5 -3
  532. package/dist/src/utils/redactor.js +1 -1
  533. package/dist/src/utils/settings.d.ts +180 -5
  534. package/dist/src/utils/settings.js +271 -31
  535. package/dist/src/utils/side-question.d.ts +1 -2
  536. package/dist/src/utils/side-question.js +2 -2
  537. package/dist/src/utils/visible-retry.d.ts +11 -0
  538. package/dist/src/utils/visible-retry.js +10 -1
  539. package/dist/src/verify/entrypoint.d.ts +1 -1
  540. package/dist/src/verify/entrypoint.js +52 -17
  541. package/dist/src/verify/orchestrator.d.ts +1 -1
  542. package/dist/src/verify/orchestrator.js +20 -3
  543. package/dist/src/verify/recipes.d.ts +13 -0
  544. package/dist/src/verify/recipes.js +15 -0
  545. package/package.json +134 -132
  546. package/dist/src/cli/bw-vault.d.ts +0 -55
  547. package/dist/src/cli/bw-vault.js +0 -133
  548. package/dist/src/mcp/ee-tools.d.ts +0 -46
  549. package/dist/src/mcp/ee-tools.js +0 -193
  550. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  551. package/dist/src/providers/auth/gcloud.js +0 -102
  552. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  553. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  554. package/dist/src/providers/gemini.d.ts +0 -11
  555. package/dist/src/providers/gemini.js +0 -45
  556. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  557. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  558. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  559. package/dist/src/providers/strategies/google.strategy.js +0 -174
  560. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  561. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  562. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -0,0 +1,283 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { resolvePlanCouncilLeader } from "../council/leader.js";
3
+ import { buildCouncilContextBundle } from "./council-context.js";
4
+ import { getPlanReviewDebateRetries } from "./flags.js";
5
+ import { buildGsdPerspectiveTaskRequest } from "./model-tier.js";
6
+ import { planningArtifact } from "./paths.js";
7
+ import { buildDebateTopic, buildPerspectivePrompt, perspectivesForDepth, } from "./plan-council-prompts.js";
8
+ import { extractStructuredVerdict } from "./verdict-schema.js";
9
+ import { advancePhase, setStateField } from "./workflow-engine.js";
10
+ function readPlanBody(cwd) {
11
+ const path = planningArtifact(cwd, "PLAN.md");
12
+ if (!existsSync(path))
13
+ return "";
14
+ return readFileSync(path, "utf8");
15
+ }
16
+ function heuristicReview(planBody, perspective) {
17
+ const concerns = [];
18
+ const evidence = [];
19
+ const lower = planBody.toLowerCase();
20
+ const hasStructure = /\d+\.|step|acceptance|criteria|verify/i.test(planBody);
21
+ if (planBody.trim().length < 80 && !hasStructure) {
22
+ concerns.push("Plan is too short — lacks concrete steps.");
23
+ }
24
+ if (!hasStructure) {
25
+ concerns.push("Missing numbered steps or acceptance criteria.");
26
+ }
27
+ if (perspective.id === "security" && /rm\s+-rf|chmod\s+777|eval\(/i.test(planBody)) {
28
+ concerns.push("Plan mentions dangerous shell patterns.");
29
+ evidence.push("security: dangerous command pattern detected in plan text");
30
+ }
31
+ if (perspective.id === "research" && !/file:|src\/|\.ts|\.tsx/i.test(planBody)) {
32
+ concerns.push("No codebase file references — plan may be ungrounded.");
33
+ }
34
+ if (perspective.id === "skeptic" && /rewrite|refactor entire|migrate all/i.test(lower)) {
35
+ concerns.push("Scope may be larger than necessary (YAGNI risk).");
36
+ }
37
+ const verdict = concerns.length >= 3 ? "block" : concerns.length >= 1 ? "revise" : "approve";
38
+ return { id: perspective.id, role: perspective.role, verdict, concerns, evidence, source: "heuristic-fallback" };
39
+ }
40
+ function fromStructured(perspective, parsed, raw) {
41
+ return {
42
+ id: perspective.id,
43
+ role: perspective.role,
44
+ verdict: parsed.verdict,
45
+ concerns: parsed.concerns.map(String),
46
+ evidence: parsed.evidence.map(String),
47
+ source: "structured",
48
+ raw,
49
+ };
50
+ }
51
+ async function runPerspective(planBody, perspective, runFn, bundle) {
52
+ // No runner — heuristic path (test scaffolding / offline runs).
53
+ if (!runFn) {
54
+ return heuristicReview(planBody, perspective);
55
+ }
56
+ try {
57
+ const raw = await runFn(buildPerspectivePrompt(perspective, planBody, bundle), perspective);
58
+ const parsed = extractStructuredVerdict(raw);
59
+ if (!parsed) {
60
+ // Tolerant parse failed — DO NOT silently approve. Fall back to heuristic
61
+ // so the perspective still contributes a verdict, and flag the source so
62
+ // telemetry can detect prompt-compliance regressions.
63
+ console.error(`[gsd] plan-council perspective ${perspective.id} emitted no structured verdict — using heuristic fallback`);
64
+ const fallback = heuristicReview(planBody, perspective);
65
+ return { ...fallback, source: "heuristic-fallback", raw };
66
+ }
67
+ return fromStructured(perspective, parsed, raw);
68
+ }
69
+ catch (err) {
70
+ console.error(`[gsd] plan-council perspective ${perspective.id} failed: ${err.message}`);
71
+ return heuristicReview(planBody, perspective);
72
+ }
73
+ }
74
+ function mergeVerdict(results) {
75
+ if (results.some((r) => r.verdict === "block"))
76
+ return "block";
77
+ if (results.some((r) => r.verdict === "revise"))
78
+ return "revise";
79
+ return "pass";
80
+ }
81
+ function formatPlanReview(results, leaderModelId, cycle) {
82
+ const sections = results.map((r) => {
83
+ const concerns = r.concerns.length ? r.concerns.map((c) => `- ${c}`).join("\n") : "- (none)";
84
+ const evidence = r.evidence.length ? r.evidence.map((e) => `- ${e}`).join("\n") : "- (none)";
85
+ return `## ${r.role} (${r.id})\n\n**Verdict:** ${r.verdict} (source: ${r.source})\n\n**Concerns:**\n${concerns}\n\n**Evidence:**\n${evidence}\n`;
86
+ });
87
+ return ["# PLAN-REVIEW", "", `Leader: \`${leaderModelId}\``, `Revision cycle: ${cycle}`, "", ...sections].join("\n");
88
+ }
89
+ function formatPlanVerify(verdict, results, opts) {
90
+ const allConcerns = results.flatMap((r) => r.concerns);
91
+ return [
92
+ "# PLAN-VERIFY",
93
+ "",
94
+ `verdict: ${verdict}`,
95
+ `revisionRequired: ${verdict === "revise" || verdict === "block" ? "yes" : "no"}`,
96
+ `verdictSource: ${opts.source}`,
97
+ `verdictParseFailed: ${opts.parseFailed ? "yes" : "no"}`,
98
+ "",
99
+ "## Summary",
100
+ verdict === "pass"
101
+ ? "All perspectives approved — execute gate unlocked."
102
+ : `Council raised ${allConcerns.length} concern(s) — ${verdict === "block" ? "blocked" : "revision required"}.`,
103
+ "",
104
+ "## Concerns",
105
+ allConcerns.length ? allConcerns.map((c) => `- ${c}`).join("\n") : "- (none)",
106
+ ].join("\n");
107
+ }
108
+ function applyVerdict(cwd, verdict) {
109
+ if (verdict === "pass") {
110
+ setStateField(cwd, "Plan Verified", "yes");
111
+ advancePhase(cwd, "execute");
112
+ }
113
+ else {
114
+ setStateField(cwd, "Plan Verified", "no");
115
+ if (verdict === "revise") {
116
+ advancePhase(cwd, "plan");
117
+ }
118
+ }
119
+ }
120
+ export async function runPlanCouncil(opts) {
121
+ const { cwd, sessionModelId, depth, runPerspectiveFn, revisionCycle = 0 } = opts;
122
+ const perspectives = perspectivesForDepth(depth);
123
+ if (perspectives.length === 0) {
124
+ return { skipped: true, perspectives: [], verdict: "pass", revisionRequired: false };
125
+ }
126
+ const planBody = readPlanBody(cwd);
127
+ if (!planBody.trim()) {
128
+ return {
129
+ skipped: false,
130
+ perspectives: [],
131
+ verdict: "block",
132
+ revisionRequired: true,
133
+ verdictSource: "heuristic-fallback",
134
+ };
135
+ }
136
+ // ---------- Debate path (production wiring: runCouncilV2 synthesis) ----------
137
+ if (opts.runDebate) {
138
+ const leader = await resolvePlanCouncilLeader(sessionModelId);
139
+ const bundle = buildCouncilContextBundle(cwd, { depth, revisionCycle });
140
+ const topic = buildDebateTopic(planBody, bundle);
141
+ // The council debate returns an EMPTY synthesis on any of its fail-open
142
+ // paths (provider unreachable, sub-phase catch, user/watchdog abort) — a
143
+ // silent null we must NOT collapse into a permanent forced-`revise`. Retry
144
+ // the debate on empty (covers transient aborts), then fall back to the
145
+ // perspective path so an autonomous /ideal run never bricks with 0 code.
146
+ const maxRetries = getPlanReviewDebateRetries();
147
+ let synthesis = "";
148
+ let lastDebateError;
149
+ for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
150
+ try {
151
+ synthesis = (await opts.runDebate(topic)) ?? "";
152
+ }
153
+ catch (err) {
154
+ lastDebateError = err.message;
155
+ console.error(`[gsd] plan-review debate threw (attempt ${attempt + 1}/${maxRetries + 1}): ${lastDebateError}`);
156
+ synthesis = "";
157
+ }
158
+ if (synthesis.trim())
159
+ break;
160
+ if (attempt < maxRetries) {
161
+ console.error(`[gsd] plan-review debate returned empty synthesis ` +
162
+ `(attempt ${attempt + 1}/${maxRetries + 1}) — provider unreachable / aborted / ` +
163
+ `sub-phase fail-open; retrying`);
164
+ }
165
+ }
166
+ // Persistent empty synthesis after retries — this is a DEBATE FAILURE, not
167
+ // a plan defect. Do NOT write a misleading "leader did not emit a verdict"
168
+ // forced-revise (which would brick the run). Log the real reason
169
+ // (No-Silent-Catch) and fall through to the perspective path below, which
170
+ // produces a genuine verdict from parallel sub-agent reviewers (heuristic
171
+ // last resort) so the loop can proceed.
172
+ if (!synthesis.trim()) {
173
+ console.error(`[gsd] plan-review debate produced no synthesis after ${maxRetries + 1} attempt(s)` +
174
+ `${lastDebateError ? ` (last error: ${lastDebateError})` : ""} — ` +
175
+ `falling back to perspective review`);
176
+ }
177
+ else {
178
+ const parsed = extractStructuredVerdict(synthesis);
179
+ const parseFailed = parsed === null;
180
+ // Model-first: if we could not extract structured verdict, DO NOT regex
181
+ // the prose. Force a conservative revise so the loop iterates and the
182
+ // leader gets another chance to emit valid JSON (the prior-concerns
183
+ // directive re-states the contract).
184
+ // Map "approve" → "pass" so the merged verdict matches the union the rest
185
+ // of the pipeline expects (applyVerdict keys the gate on `=== "pass"`).
186
+ const rawVerdict = parseFailed ? "revise" : parsed.verdict;
187
+ const verdict = rawVerdict === "approve" ? "pass" : rawVerdict;
188
+ const source = parseFailed ? "parse-failed" : "structured";
189
+ const concerns = parsed?.concerns.map(String) ?? [
190
+ "Council leader did not emit a structured verdict block — forcing revision.",
191
+ ];
192
+ const evidence = parsed?.evidence.map(String) ?? [];
193
+ const rationale = parsed?.rationale ?? "";
194
+ const planReviewPath = planningArtifact(cwd, "PLAN-REVIEW.md");
195
+ const planVerifyPath = planningArtifact(cwd, "PLAN-VERIFY.md");
196
+ const reviewContent = [
197
+ "# PLAN-REVIEW",
198
+ "",
199
+ `Leader: \`${leader.modelId}\``,
200
+ `Revision cycle: ${revisionCycle}`,
201
+ `Verdict source: ${source}${parseFailed ? " (parse failed — forced revise)" : ""}`,
202
+ "",
203
+ "## Council Debate Synthesis",
204
+ "",
205
+ synthesis.trim() || "No synthesis generated.",
206
+ rationale ? `\n**Rationale:** ${rationale}` : "",
207
+ "",
208
+ "## Merged Concerns",
209
+ "",
210
+ concerns.length ? concerns.map((c) => `- ${c}`).join("\n") : "- (none)",
211
+ ].join("\n");
212
+ const verifyContent = [
213
+ "# PLAN-VERIFY",
214
+ "",
215
+ `verdict: ${verdict}`,
216
+ `revisionRequired: ${verdict === "revise" || verdict === "block" ? "yes" : "no"}`,
217
+ `verdictSource: ${source}`,
218
+ `verdictParseFailed: ${parseFailed ? "yes" : "no"}`,
219
+ "",
220
+ "## Summary",
221
+ verdict === "pass"
222
+ ? "Council leader approved via structured verdict."
223
+ : parseFailed
224
+ ? "Structured verdict missing — forced revision so the leader re-emits valid JSON."
225
+ : `Council requested ${verdict}.`,
226
+ "",
227
+ "## Concerns",
228
+ concerns.length ? concerns.map((c) => `- ${c}`).join("\n") : "- (none)",
229
+ ].join("\n");
230
+ writeFileSync(planReviewPath, reviewContent, "utf8");
231
+ writeFileSync(planVerifyPath, verifyContent, "utf8");
232
+ applyVerdict(cwd, verdict);
233
+ return {
234
+ skipped: false,
235
+ perspectives: [],
236
+ planReviewPath,
237
+ planVerifyPath,
238
+ verdict,
239
+ leaderModelId: leader.modelId,
240
+ revisionRequired: verdict === "revise" || verdict === "block",
241
+ contextBundleChars: bundle.totalChars,
242
+ hadPriorConcerns: bundle.hadPriorConcerns,
243
+ verdictSource: source,
244
+ verdictParseFailed: parseFailed,
245
+ };
246
+ }
247
+ }
248
+ // ---------- Perspective path (parallel sub-agents) ----------
249
+ const leader = await resolvePlanCouncilLeader(sessionModelId);
250
+ const bundle = buildCouncilContextBundle(cwd, { depth, revisionCycle });
251
+ // Perspectives are independent — run in parallel, preserve declared order.
252
+ const settled = await Promise.all(perspectives.map((p) => runPerspective(planBody, p, runPerspectiveFn, bundle)));
253
+ const results = settled;
254
+ const verdict = mergeVerdict(results);
255
+ const anyParseFailed = results.some((r) => r.source === "heuristic-fallback");
256
+ const source = anyParseFailed ? "heuristic-fallback" : "structured";
257
+ const planReviewPath = planningArtifact(cwd, "PLAN-REVIEW.md");
258
+ const planVerifyPath = planningArtifact(cwd, "PLAN-VERIFY.md");
259
+ writeFileSync(planReviewPath, formatPlanReview(results, leader.modelId, revisionCycle), "utf8");
260
+ writeFileSync(planVerifyPath, formatPlanVerify(verdict, results, { source, parseFailed: false }), "utf8");
261
+ applyVerdict(cwd, verdict);
262
+ return {
263
+ skipped: false,
264
+ perspectives: results,
265
+ planReviewPath,
266
+ planVerifyPath,
267
+ verdict,
268
+ leaderModelId: leader.modelId,
269
+ revisionRequired: verdict === "revise" || verdict === "block",
270
+ contextBundleChars: bundle.totalChars,
271
+ hadPriorConcerns: bundle.hadPriorConcerns,
272
+ verdictSource: source,
273
+ verdictParseFailed: false,
274
+ };
275
+ }
276
+ /** Adapter: wrap orchestrator runTask as perspective runner. */
277
+ export function taskToPerspectiveRunner(runTask, sessionModelId) {
278
+ return async (prompt, perspective) => {
279
+ const result = await runTask(buildGsdPerspectiveTaskRequest(prompt, perspective, sessionModelId));
280
+ return result.output ?? "";
281
+ };
282
+ }
283
+ //# sourceMappingURL=plan-council.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Single source of truth for the GSD plan-gate's EVALUATION AXES.
3
+ *
4
+ * The plan gate has two prompt paths — the interactive full-council debate
5
+ * (`buildDebateTopic`) and the headless/offline perspective review
6
+ * (`buildPerspectivePrompt` over `PLAN_PERSPECTIVES`). Both must judge a plan
7
+ * against the SAME criteria, or the two gates drift: a plan the debate would
8
+ * revise could pass headless (or vice-versa). The verdict *schema* is already
9
+ * shared (`PlanCouncilVerdictSchema` + `VERDICT_OUTPUT_CONTRACT`); this module
10
+ * closes the remaining gap by making the review CRITERIA a single constant both
11
+ * builders derive from. A parity test locks it: drop or rename an axis and the
12
+ * mismatch surfaces immediately.
13
+ *
14
+ * Council decision 2026-07-11 (multi-provider, research-grounded): unify the
15
+ * gate's criteria vocabulary + verdict contract behind one source; keep both
16
+ * paths (interactive debate + headless fallback) but stop them from diverging.
17
+ */
18
+ export type PlanGateDimensionId = "correctness" | "structure" | "safety" | "grounding" | "feasibility";
19
+ export interface PlanGateDimension {
20
+ id: PlanGateDimensionId;
21
+ /** Short human label used in rendered prompt axes. */
22
+ label: string;
23
+ /** What a reviewer checks for this axis (drives both the debate topic and the perspective mandates). */
24
+ probe: string;
25
+ }
26
+ /**
27
+ * The canonical axes every plan is judged against — the union of what the
28
+ * interactive debate ("complete, correct, safe, optimal") and the headless
29
+ * perspectives (architect / skeptic / research / security / implementer)
30
+ * historically evaluated, deduplicated into one list.
31
+ */
32
+ export declare const PLAN_GATE_DIMENSIONS: readonly PlanGateDimension[];
33
+ /** Fast lookup by id. */
34
+ export declare const PLAN_GATE_DIMENSION_BY_ID: Readonly<Record<PlanGateDimensionId, PlanGateDimension>>;
35
+ /**
36
+ * Render the axes as a bullet list for a prompt. Both the debate topic and the
37
+ * perspective prompt append this so a plan is judged against identical criteria
38
+ * regardless of which gate path runs.
39
+ */
40
+ export declare function renderGateAxes(): string;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Single source of truth for the GSD plan-gate's EVALUATION AXES.
3
+ *
4
+ * The plan gate has two prompt paths — the interactive full-council debate
5
+ * (`buildDebateTopic`) and the headless/offline perspective review
6
+ * (`buildPerspectivePrompt` over `PLAN_PERSPECTIVES`). Both must judge a plan
7
+ * against the SAME criteria, or the two gates drift: a plan the debate would
8
+ * revise could pass headless (or vice-versa). The verdict *schema* is already
9
+ * shared (`PlanCouncilVerdictSchema` + `VERDICT_OUTPUT_CONTRACT`); this module
10
+ * closes the remaining gap by making the review CRITERIA a single constant both
11
+ * builders derive from. A parity test locks it: drop or rename an axis and the
12
+ * mismatch surfaces immediately.
13
+ *
14
+ * Council decision 2026-07-11 (multi-provider, research-grounded): unify the
15
+ * gate's criteria vocabulary + verdict contract behind one source; keep both
16
+ * paths (interactive debate + headless fallback) but stop them from diverging.
17
+ */
18
+ /**
19
+ * The canonical axes every plan is judged against — the union of what the
20
+ * interactive debate ("complete, correct, safe, optimal") and the headless
21
+ * perspectives (architect / skeptic / research / security / implementer)
22
+ * historically evaluated, deduplicated into one list.
23
+ */
24
+ export const PLAN_GATE_DIMENSIONS = [
25
+ {
26
+ id: "correctness",
27
+ label: "Correct & complete",
28
+ probe: "Every task has concrete steps and acceptance criteria; nothing essential is missing.",
29
+ },
30
+ {
31
+ id: "structure",
32
+ label: "Structural fit",
33
+ probe: "File map is correct, dependency order is sound, module boundaries are respected.",
34
+ },
35
+ {
36
+ id: "safety",
37
+ label: "Safe",
38
+ probe: "Permission model, path traversal, secret handling, and any planned bash are safe.",
39
+ },
40
+ {
41
+ id: "grounding",
42
+ label: "Grounded",
43
+ probe: "Plan claims cite real codebase evidence (file:line), not assumptions.",
44
+ },
45
+ {
46
+ id: "feasibility",
47
+ label: "Feasible & optimal",
48
+ probe: "Estimates are realistic and it is the simplest approach that works — no YAGNI or scope creep.",
49
+ },
50
+ ];
51
+ /** Fast lookup by id. */
52
+ export const PLAN_GATE_DIMENSION_BY_ID = Object.fromEntries(PLAN_GATE_DIMENSIONS.map((d) => [d.id, d]));
53
+ /**
54
+ * Render the axes as a bullet list for a prompt. Both the debate topic and the
55
+ * perspective prompt append this so a plan is judged against identical criteria
56
+ * regardless of which gate path runs.
57
+ */
58
+ export function renderGateAxes() {
59
+ return [
60
+ "The plan is judged against these axes:",
61
+ ...PLAN_GATE_DIMENSIONS.map((d) => `- ${d.label}: ${d.probe}`),
62
+ ].join("\n");
63
+ }
64
+ //# sourceMappingURL=plan-gate-vocabulary.js.map
@@ -0,0 +1,13 @@
1
+ import type { PhasePlanArtifact, ProductSpec } from "../product-loop/types.js";
2
+ export interface ProductWorkspaceOpts {
3
+ idea: string;
4
+ sessionModelId: string;
5
+ productSpec?: ProductSpec;
6
+ runId?: string;
7
+ }
8
+ export declare function buildProjectMd(idea: string, spec?: ProductSpec): string;
9
+ export declare function buildRoadmapFromPhasePlan(idea: string, plan: PhasePlanArtifact): string;
10
+ /** Bootstrap gsd-compatible PROJECT.md + ROADMAP.md for WorkflowKind.product (/ideal). */
11
+ export declare function ensureProductPlanningWorkspace(cwd: string, opts: ProductWorkspaceOpts): string;
12
+ export declare function syncRoadmapFromPhasePlan(cwd: string, idea: string, plan: PhasePlanArtifact): void;
13
+ export declare function readProjectMdSummary(cwd: string): string | null;
@@ -0,0 +1,124 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { ensurePlanningWorkspace } from "./config-bridge.js";
3
+ import { planningArtifact, planningRoot } from "./paths.js";
4
+ import { setStateField } from "./workflow-engine.js";
5
+ export function buildProjectMd(idea, spec) {
6
+ const title = idea.trim().slice(0, 80) || "Product";
7
+ const mvp = spec?.mvp?.length ? spec.mvp.map((m) => `- [ ] ${m}`).join("\n") : `- [ ] ${idea.trim()}`;
8
+ return `# ${title}
9
+
10
+ ## What This Is
11
+
12
+ ${idea.trim()}
13
+
14
+ ## Core Value
15
+
16
+ Ship the scoped MVP via Muonroi /ideal with gsd-native phase tracking.
17
+
18
+ ## Requirements
19
+
20
+ ### Active
21
+
22
+ ${mvp}
23
+
24
+ ### Out of Scope
25
+
26
+ - Post-MVP backlog — tracked in product-loop artifacts, not this milestone
27
+
28
+ ## Context
29
+
30
+ - Workflow kind: **product** (Muonroi /ideal (native workflow))
31
+ - Stack: ${spec?.stack ?? "TBD"}
32
+ `;
33
+ }
34
+ export function buildRoadmapFromPhasePlan(idea, plan) {
35
+ const title = idea.trim().slice(0, 80) || "Product";
36
+ const lines = [
37
+ `# Roadmap: ${title}`,
38
+ "",
39
+ "## Overview",
40
+ "",
41
+ `Product loop decomposition — ${plan.phases.length} phase(s) synced from /ideal phase plan.`,
42
+ "",
43
+ "## Phases",
44
+ "",
45
+ ];
46
+ plan.phases.forEach((phase, index) => {
47
+ const num = index + 1;
48
+ lines.push(`- [ ] **Phase ${num}: ${phase.name}** - ${phase.goal.slice(0, 120)}`);
49
+ });
50
+ lines.push("", "## Phase Details", "");
51
+ plan.phases.forEach((phase, index) => {
52
+ const num = index + 1;
53
+ const depText = phase.dependsOn.length > 0
54
+ ? phase.dependsOn
55
+ .map((dep) => {
56
+ // Defensive: dependsOn is declared string[] but an un-normalised
57
+ // LLM plan can carry bare numbers — String() keeps this crash-proof
58
+ // regardless of caller (parsePhasePlanJson normalises the common path).
59
+ const depStr = String(dep);
60
+ const match = depStr.match(/phase-(\d+)/i) ?? depStr.match(/^(\d+)$/);
61
+ return match ? `Phase ${match[1]}` : depStr;
62
+ })
63
+ .join(", ")
64
+ : index === 0
65
+ ? "Nothing (first phase)"
66
+ : `Phase ${index}`;
67
+ lines.push(`### Phase ${num}: ${phase.name}`);
68
+ lines.push(`**Goal**: ${phase.goal}`);
69
+ lines.push(`**Depends on**: ${depText}`);
70
+ lines.push("**Success Criteria** (what must be TRUE):");
71
+ for (const [j, c] of phase.successCriteria.entries()) {
72
+ lines.push(` ${j + 1}. ${c}`);
73
+ }
74
+ lines.push("**Plans**: TBD");
75
+ lines.push("");
76
+ lines.push("Plans:");
77
+ lines.push(`- [ ] ${String(num).padStart(2, "0")}-01: Sprint scope for ${phase.name}`);
78
+ lines.push("");
79
+ });
80
+ return `${lines.join("\n")}\n`;
81
+ }
82
+ /** Bootstrap gsd-compatible PROJECT.md + ROADMAP.md for WorkflowKind.product (/ideal). */
83
+ export function ensureProductPlanningWorkspace(cwd, opts) {
84
+ const root = ensurePlanningWorkspace(cwd, opts.sessionModelId);
85
+ setStateField(cwd, "Workflow Kind", "product");
86
+ if (opts.runId) {
87
+ setStateField(cwd, "Ideal Run", opts.runId);
88
+ }
89
+ const projectPath = planningArtifact(cwd, "PROJECT.md");
90
+ if (!existsSync(projectPath)) {
91
+ writeFileSync(projectPath, `${buildProjectMd(opts.idea, opts.productSpec)}\n`, "utf8");
92
+ }
93
+ const roadmapPath = planningArtifact(cwd, "ROADMAP.md");
94
+ if (!existsSync(roadmapPath)) {
95
+ const stub = [
96
+ `# Roadmap: ${opts.idea.trim().slice(0, 80)}`,
97
+ "",
98
+ "## Overview",
99
+ "",
100
+ "Awaiting /ideal phase plan — ROADMAP will sync when phase-runner generates phases.md.",
101
+ "",
102
+ "## Phases",
103
+ "",
104
+ "- [ ] **Phase 1: MVP** - Initial /ideal scope",
105
+ "",
106
+ ].join("\n");
107
+ writeFileSync(roadmapPath, `${stub}\n`, "utf8");
108
+ }
109
+ return root;
110
+ }
111
+ export function syncRoadmapFromPhasePlan(cwd, idea, plan) {
112
+ mkdirSync(planningRoot(cwd), { recursive: true });
113
+ const path = planningArtifact(cwd, "ROADMAP.md");
114
+ writeFileSync(path, buildRoadmapFromPhasePlan(idea, plan), "utf8");
115
+ }
116
+ export function readProjectMdSummary(cwd) {
117
+ const path = planningArtifact(cwd, "PROJECT.md");
118
+ if (!existsSync(path))
119
+ return null;
120
+ const raw = readFileSync(path, "utf8");
121
+ const match = raw.match(/## What This Is\s+([\s\S]*?)(?=\n## |\n---|Z)/);
122
+ return match?.[1]?.trim() ?? raw.slice(0, 400);
123
+ }
124
+ //# sourceMappingURL=product-workspace.js.map
@@ -0,0 +1,25 @@
1
+ export interface TaskShipOpts {
2
+ cwd: string;
3
+ notes?: string[];
4
+ commitMessage?: string;
5
+ verifyEvidence?: string;
6
+ changedFiles?: string[];
7
+ }
8
+ export interface TaskShipResult {
9
+ ok: boolean;
10
+ shipMdPath: string;
11
+ notes: string[];
12
+ }
13
+ export declare function readPlanContext(cwd: string): {
14
+ title: string;
15
+ planPath: string | null;
16
+ };
17
+ export declare function writeTaskShipMd(cwd: string, payload: {
18
+ title: string;
19
+ verifyEvidence?: string;
20
+ changedFiles?: string[];
21
+ notes: string[];
22
+ commitMessage?: string;
23
+ }): string;
24
+ /** Task-level ship — SHIP.md only (no git, no README/package.json). */
25
+ export declare function runTaskShip(opts: TaskShipOpts): TaskShipResult;
@@ -0,0 +1,65 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { planningArtifact } from "./paths.js";
3
+ export function readPlanContext(cwd) {
4
+ const planPath = planningArtifact(cwd, "PLAN.md");
5
+ if (!existsSync(planPath)) {
6
+ return { title: "Task delivery", planPath: null };
7
+ }
8
+ const body = readFileSync(planPath, "utf8");
9
+ const h1 = body.match(/^#\s+(.+)$/m);
10
+ return { title: h1?.[1]?.trim() ?? "Task delivery", planPath };
11
+ }
12
+ export function writeTaskShipMd(cwd, payload) {
13
+ const shipPath = planningArtifact(cwd, "SHIP.md");
14
+ const lines = [
15
+ `# Ship: ${payload.title}`,
16
+ "",
17
+ "## Status",
18
+ "",
19
+ "Ready for delivery (gsd_ship — muonroi-cli native host).",
20
+ "",
21
+ ];
22
+ if (payload.verifyEvidence?.trim()) {
23
+ lines.push("## Verify evidence", "", payload.verifyEvidence.trim(), "");
24
+ }
25
+ if (payload.commitMessage?.trim()) {
26
+ lines.push("## Suggested commit message (unverified — agent-supplied)", "", payload.commitMessage.trim(), "");
27
+ }
28
+ if (payload.changedFiles?.length) {
29
+ lines.push("## Files touched", "");
30
+ for (const f of payload.changedFiles)
31
+ lines.push(`- ${f}`);
32
+ lines.push("");
33
+ }
34
+ if (payload.notes.length) {
35
+ lines.push("## Notes", "");
36
+ for (const n of payload.notes)
37
+ lines.push(`- ${n}`);
38
+ lines.push("");
39
+ }
40
+ lines.push("---", `_Generated by gsd_ship at ${new Date().toISOString()}_`, "");
41
+ writeFileSync(shipPath, lines.join("\n"), "utf8");
42
+ return shipPath;
43
+ }
44
+ /** Task-level ship — SHIP.md only (no git, no README/package.json). */
45
+ export function runTaskShip(opts) {
46
+ const ctx = readPlanContext(opts.cwd);
47
+ let verifyEvidence = opts.verifyEvidence;
48
+ if (!verifyEvidence) {
49
+ const verifyPath = planningArtifact(opts.cwd, "VERIFY.md");
50
+ if (existsSync(verifyPath)) {
51
+ verifyEvidence = readFileSync(verifyPath, "utf8").trim();
52
+ }
53
+ }
54
+ const notes = [...(opts.notes ?? [])];
55
+ const shipMdPath = writeTaskShipMd(opts.cwd, {
56
+ title: ctx.title,
57
+ verifyEvidence,
58
+ changedFiles: opts.changedFiles,
59
+ notes,
60
+ commitMessage: opts.commitMessage,
61
+ });
62
+ notes.push(`Wrote ${shipMdPath}`);
63
+ return { ok: true, shipMdPath, notes };
64
+ }
65
+ //# sourceMappingURL=ship-bridge.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * state-document.ts — Native replacement for gsd-core/bin/lib/state-document.cjs
3
+ *
4
+ * STATE.md Document Module — pure transforms for STATE.md text.
5
+ * This module does not read the filesystem and does not own persistence or locking.
6
+ */
7
+ export interface StateDocumentModule {
8
+ stateExtractField: (content: string, fieldName: string) => string | null;
9
+ stateReplaceField: (content: string, fieldName: string, newValue: string) => string | null;
10
+ }
11
+ /**
12
+ * Extract a field value from STATE.md content.
13
+ * Supports bold inline (**FieldName:** value), plain line-start (FieldName: value),
14
+ * and pipe-table (| FieldName | value |) formats.
15
+ */
16
+ export declare function stateExtractField(content: string, fieldName: string): string | null;
17
+ /**
18
+ * Replace a field value in STATE.md content.
19
+ * Returns null if the field is not found in any known format.
20
+ */
21
+ export declare function stateReplaceField(content: string, fieldName: string, newValue: string): string | null;
22
+ /**
23
+ * Replace a field with a primary name, falling back to an alternate field name.
24
+ */
25
+ export declare function stateReplaceFieldWithFallback(content: string, primary: string, fallback: string | undefined, value: string): string;
26
+ /** Normalize a status string to a canonical value. */
27
+ export declare function normalizeStateStatus(status: string, pausedAt?: string): string;
28
+ /** Compute progress percentage from plan and phase counts. */
29
+ export declare function computeProgressPercent(completedPlans: number | null, totalPlans: number | null, completedPhases: number | null, totalPhases: number | null): number | null;
30
+ /**
31
+ * KNOWN_TEMPLATE_DEFAULTS — per-field table of handler-written values.
32
+ * A value in this list is safe to overwrite on the next handler call.
33
+ */
34
+ export declare const KNOWN_TEMPLATE_DEFAULTS: Record<string, string[]>;
35
+ /**
36
+ * Regex patterns matching handler-generated Status values with variable components.
37
+ */
38
+ export declare const KNOWN_STATUS_PATTERNS: RegExp[];
39
+ /** Check if a value is a known template default (handler may overwrite it). */
40
+ export declare function isStateTemplateDefault(field: string, value: string | null | undefined): boolean;