muonroi-cli 1.8.4 → 1.8.5

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 (458) 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-tee.d.ts +48 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  6. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  8. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  9. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  10. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  12. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  14. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  16. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  17. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  18. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  19. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  21. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  22. package/dist/src/agent-harness/mock-model.js +63 -1
  23. package/dist/src/agent-harness/test-spawn.js +31 -0
  24. package/dist/src/cli/config/screen-providers.js +1 -1
  25. package/dist/src/cli/cost-forensics.d.ts +10 -0
  26. package/dist/src/cli/cost-forensics.js +18 -3
  27. package/dist/src/cli/keys-bundle.d.ts +1 -1
  28. package/dist/src/cli/keys-bundle.js +1 -1
  29. package/dist/src/cli/keys.d.ts +2 -2
  30. package/dist/src/cli/keys.js +19 -81
  31. package/dist/src/council/clarifier.d.ts +28 -2
  32. package/dist/src/council/clarifier.js +81 -15
  33. package/dist/src/council/context.js +49 -15
  34. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  35. package/dist/src/council/debate-checkpoint.js +176 -0
  36. package/dist/src/council/debate-planner.js +51 -3
  37. package/dist/src/council/debate-summary.d.ts +25 -0
  38. package/dist/src/council/debate-summary.js +85 -0
  39. package/dist/src/council/debate.d.ts +169 -2
  40. package/dist/src/council/debate.js +1210 -134
  41. package/dist/src/council/index.d.ts +85 -1
  42. package/dist/src/council/index.js +634 -196
  43. package/dist/src/council/leader.d.ts +26 -0
  44. package/dist/src/council/leader.js +150 -9
  45. package/dist/src/council/llm.d.ts +32 -0
  46. package/dist/src/council/llm.js +231 -38
  47. package/dist/src/council/panel-select.d.ts +30 -0
  48. package/dist/src/council/panel-select.js +72 -0
  49. package/dist/src/council/planner.js +23 -0
  50. package/dist/src/council/preflight.d.ts +7 -0
  51. package/dist/src/council/preflight.js +14 -2
  52. package/dist/src/council/prompts.d.ts +30 -3
  53. package/dist/src/council/prompts.js +234 -64
  54. package/dist/src/council/stance-recall.d.ts +42 -0
  55. package/dist/src/council/stance-recall.js +57 -0
  56. package/dist/src/council/strip-think.d.ts +17 -0
  57. package/dist/src/council/strip-think.js +33 -0
  58. package/dist/src/council/types.d.ts +128 -0
  59. package/dist/src/ee/artifact-cache.d.ts +16 -0
  60. package/dist/src/ee/artifact-cache.js +32 -0
  61. package/dist/src/ee/auth.d.ts +1 -0
  62. package/dist/src/ee/auth.js +15 -2
  63. package/dist/src/ee/bridge.d.ts +10 -0
  64. package/dist/src/ee/bridge.js +58 -0
  65. package/dist/src/ee/client.js +81 -18
  66. package/dist/src/ee/export-transcripts.d.ts +1 -0
  67. package/dist/src/ee/export-transcripts.js +8 -10
  68. package/dist/src/ee/extract-session.js +29 -0
  69. package/dist/src/ee/extract-style.d.ts +58 -0
  70. package/dist/src/ee/extract-style.js +270 -0
  71. package/dist/src/ee/recall-ledger.d.ts +9 -0
  72. package/dist/src/ee/recall-ledger.js +3 -0
  73. package/dist/src/ee/scope.d.ts +1 -0
  74. package/dist/src/ee/scope.js +26 -1
  75. package/dist/src/ee/search.d.ts +7 -0
  76. package/dist/src/ee/search.js +24 -0
  77. package/dist/src/ee/transcript-emit.js +2 -0
  78. package/dist/src/ee/types.d.ts +22 -0
  79. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  80. package/dist/src/ee/who-am-i-brain.js +220 -0
  81. package/dist/src/ee/who-am-i.d.ts +10 -3
  82. package/dist/src/ee/who-am-i.js +12 -0
  83. package/dist/src/ee/workflow-event.d.ts +48 -0
  84. package/dist/src/ee/workflow-event.js +81 -0
  85. package/dist/src/flow/compaction/compress.d.ts +3 -3
  86. package/dist/src/flow/compaction/compress.js +45 -8
  87. package/dist/src/flow/compaction/extract.d.ts +4 -7
  88. package/dist/src/flow/compaction/extract.js +50 -10
  89. package/dist/src/flow/compaction/index.d.ts +13 -1
  90. package/dist/src/flow/compaction/index.js +70 -3
  91. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  92. package/dist/src/flow/compaction/input-guard.js +43 -0
  93. package/dist/src/flow/fold-planning.d.ts +36 -0
  94. package/dist/src/flow/fold-planning.js +83 -0
  95. package/dist/src/flow/hierarchy.d.ts +146 -0
  96. package/dist/src/flow/hierarchy.js +427 -0
  97. package/dist/src/flow/index.d.ts +1 -0
  98. package/dist/src/flow/index.js +2 -0
  99. package/dist/src/flow/run-artifacts.d.ts +102 -0
  100. package/dist/src/flow/run-artifacts.js +208 -0
  101. package/dist/src/generated/version.d.ts +1 -1
  102. package/dist/src/generated/version.js +1 -1
  103. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  104. package/dist/src/gsd/assessment-schema.js +134 -0
  105. package/dist/src/gsd/capability-registry.d.ts +45 -0
  106. package/dist/src/gsd/capability-registry.js +337 -0
  107. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  108. package/dist/src/gsd/complexity-assessor.js +152 -0
  109. package/dist/src/gsd/config-bridge.d.ts +7 -0
  110. package/dist/src/gsd/config-bridge.js +114 -0
  111. package/dist/src/gsd/config-loader.d.ts +27 -0
  112. package/dist/src/gsd/config-loader.js +50 -0
  113. package/dist/src/gsd/council-context.d.ts +44 -0
  114. package/dist/src/gsd/council-context.js +114 -0
  115. package/dist/src/gsd/ee-closure.d.ts +28 -0
  116. package/dist/src/gsd/ee-closure.js +49 -0
  117. package/dist/src/gsd/flags.d.ts +55 -0
  118. package/dist/src/gsd/flags.js +83 -0
  119. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  120. package/dist/src/gsd/gsd-dispatch.js +131 -0
  121. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  122. package/dist/src/gsd/gsd-runtime.js +37 -0
  123. package/dist/src/gsd/host-adapter.d.ts +11 -0
  124. package/dist/src/gsd/host-adapter.js +29 -0
  125. package/dist/src/gsd/index.d.ts +24 -1
  126. package/dist/src/gsd/index.js +27 -0
  127. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  128. package/dist/src/gsd/loop-host-contract.js +39 -0
  129. package/dist/src/gsd/loop-host.d.ts +69 -0
  130. package/dist/src/gsd/loop-host.js +245 -0
  131. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  132. package/dist/src/gsd/loop-resolver.js +79 -0
  133. package/dist/src/gsd/model-tier.d.ts +13 -0
  134. package/dist/src/gsd/model-tier.js +45 -0
  135. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  136. package/dist/src/gsd/mutation-gate.js +41 -0
  137. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  138. package/dist/src/gsd/native-roadmap.js +343 -0
  139. package/dist/src/gsd/native-state.d.ts +47 -0
  140. package/dist/src/gsd/native-state.js +220 -0
  141. package/dist/src/gsd/paths.d.ts +23 -0
  142. package/dist/src/gsd/paths.js +66 -0
  143. package/dist/src/gsd/phase-dag.d.ts +12 -0
  144. package/dist/src/gsd/phase-dag.js +94 -0
  145. package/dist/src/gsd/phase-sync.d.ts +42 -0
  146. package/dist/src/gsd/phase-sync.js +321 -0
  147. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  148. package/dist/src/gsd/pil-gate-context.js +64 -0
  149. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  150. package/dist/src/gsd/pil-gate-critic.js +74 -0
  151. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  152. package/dist/src/gsd/plan-council-prompts.js +79 -0
  153. package/dist/src/gsd/plan-council.d.ts +44 -0
  154. package/dist/src/gsd/plan-council.js +251 -0
  155. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  157. package/dist/src/gsd/product-workspace.d.ts +13 -0
  158. package/dist/src/gsd/product-workspace.js +124 -0
  159. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  160. package/dist/src/gsd/ship-bridge.js +65 -0
  161. package/dist/src/gsd/state-document.d.ts +40 -0
  162. package/dist/src/gsd/state-document.js +163 -0
  163. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  164. package/dist/src/gsd/verdict-schema.js +144 -0
  165. package/dist/src/gsd/verify-context.d.ts +22 -0
  166. package/dist/src/gsd/verify-context.js +27 -0
  167. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  168. package/dist/src/gsd/verify-council-prompts.js +85 -0
  169. package/dist/src/gsd/verify-council.d.ts +25 -0
  170. package/dist/src/gsd/verify-council.js +119 -0
  171. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  173. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  174. package/dist/src/gsd/workflow-engine.js +207 -0
  175. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  176. package/dist/src/gsd/workflow-tools.js +277 -0
  177. package/dist/src/hooks/index.js +1 -1
  178. package/dist/src/index.js +44 -11
  179. package/dist/src/maintain/pr-builder.js +23 -13
  180. package/dist/src/mcp/auto-setup.js +57 -32
  181. package/dist/src/mcp/client-pool.js +1 -1
  182. package/dist/src/mcp/ee-tools.js +1 -0
  183. package/dist/src/mcp/research-onboarding.js +8 -7
  184. package/dist/src/mcp/runtime.js +34 -2
  185. package/dist/src/models/catalog-client.d.ts +87 -0
  186. package/dist/src/models/catalog-client.js +105 -38
  187. package/dist/src/models/catalog.json +528 -265
  188. package/dist/src/models/registry.d.ts +22 -7
  189. package/dist/src/models/registry.js +73 -10
  190. package/dist/src/ops/doctor.js +1 -1
  191. package/dist/src/orchestrator/auto-commit.js +1 -1
  192. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  193. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  194. package/dist/src/orchestrator/cache-prefix.js +83 -0
  195. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  196. package/dist/src/orchestrator/compact-request.js +41 -0
  197. package/dist/src/orchestrator/compaction.d.ts +10 -0
  198. package/dist/src/orchestrator/compaction.js +27 -7
  199. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  200. package/dist/src/orchestrator/council-manager.js +65 -24
  201. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  202. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  203. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  204. package/dist/src/orchestrator/error-utils.js +132 -24
  205. package/dist/src/orchestrator/grounding-check.js +39 -1
  206. package/dist/src/orchestrator/message-processor.js +242 -33
  207. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  208. package/dist/src/orchestrator/orchestrator.js +651 -102
  209. package/dist/src/orchestrator/preprocessor.js +1 -1
  210. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  211. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  212. package/dist/src/orchestrator/prompts.js +17 -17
  213. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  214. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  215. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  216. package/dist/src/orchestrator/retry-classifier.js +46 -2
  217. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  218. package/dist/src/orchestrator/safety-intercept.js +55 -0
  219. package/dist/src/orchestrator/scope-reminder.js +1 -1
  220. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  221. package/dist/src/orchestrator/session-experience.js +2 -1
  222. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  223. package/dist/src/orchestrator/should-run-gate.js +18 -0
  224. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  225. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  226. package/dist/src/orchestrator/stream-runner.js +62 -29
  227. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  228. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  229. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  230. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  231. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  232. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  233. package/dist/src/orchestrator/tool-engine.d.ts +22 -0
  234. package/dist/src/orchestrator/tool-engine.js +620 -56
  235. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  236. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  237. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  238. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  239. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  240. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  241. package/dist/src/pil/agent-operating-contract.js +1 -1
  242. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  243. package/dist/src/pil/cheap-model-playbook.js +5 -1
  244. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  245. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  246. package/dist/src/pil/discovery-types.d.ts +1 -0
  247. package/dist/src/pil/discovery.js +16 -11
  248. package/dist/src/pil/layer1-intent.d.ts +18 -6
  249. package/dist/src/pil/layer1-intent.js +66 -757
  250. package/dist/src/pil/layer15-context-scan.js +15 -1
  251. package/dist/src/pil/layer3-ee-injection.js +23 -8
  252. package/dist/src/pil/layer4-gsd.js +69 -16
  253. package/dist/src/pil/layer5-context.js +7 -3
  254. package/dist/src/pil/layer6-output.d.ts +23 -0
  255. package/dist/src/pil/layer6-output.js +5 -1
  256. package/dist/src/pil/llm-classify.d.ts +33 -2
  257. package/dist/src/pil/llm-classify.js +123 -131
  258. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  259. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  260. package/dist/src/pil/pipeline.js +34 -2
  261. package/dist/src/pil/response-tools.js +5 -3
  262. package/dist/src/pil/schema.d.ts +1 -0
  263. package/dist/src/pil/schema.js +2 -0
  264. package/dist/src/pil/types.d.ts +18 -0
  265. package/dist/src/playbook/directives.d.ts +4 -0
  266. package/dist/src/playbook/directives.js +17 -5
  267. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  268. package/dist/src/product-loop/backlog-builder.js +30 -6
  269. package/dist/src/product-loop/discovery-context-format.js +3 -1
  270. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  271. package/dist/src/product-loop/discovery-interview.js +32 -3
  272. package/dist/src/product-loop/discovery-schema.js +5 -1
  273. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  274. package/dist/src/product-loop/ideal-trace.js +64 -0
  275. package/dist/src/product-loop/index.d.ts +13 -1
  276. package/dist/src/product-loop/index.js +333 -52
  277. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  278. package/dist/src/product-loop/loop-driver.js +310 -99
  279. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  280. package/dist/src/product-loop/phase-plan.js +39 -2
  281. package/dist/src/product-loop/phase-runner.js +9 -1
  282. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  283. package/dist/src/product-loop/sprint-runner.js +559 -16
  284. package/dist/src/product-loop/types.d.ts +36 -5
  285. package/dist/src/providers/adapter.d.ts +1 -1
  286. package/dist/src/providers/adapter.js +3 -4
  287. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  288. package/dist/src/providers/auth/browser-flow.js +1 -1
  289. package/dist/src/providers/auth/openai-oauth.js +1 -1
  290. package/dist/src/providers/auth/registry.js +0 -34
  291. package/dist/src/providers/auth/token-store.js +4 -1
  292. package/dist/src/providers/auth/types.d.ts +1 -1
  293. package/dist/src/providers/auth/types.js +1 -1
  294. package/dist/src/providers/capabilities.d.ts +24 -5
  295. package/dist/src/providers/capabilities.js +42 -24
  296. package/dist/src/providers/endpoints.d.ts +2 -2
  297. package/dist/src/providers/endpoints.js +11 -10
  298. package/dist/src/providers/keychain.d.ts +1 -1
  299. package/dist/src/providers/keychain.js +7 -9
  300. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  301. package/dist/src/providers/openai-compatible.js +8 -1
  302. package/dist/src/providers/pricing.d.ts +2 -2
  303. package/dist/src/providers/pricing.js +3 -13
  304. package/dist/src/providers/runtime.d.ts +27 -2
  305. package/dist/src/providers/runtime.js +78 -15
  306. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  307. package/dist/src/providers/strategies/base.strategy.js +24 -1
  308. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  309. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  310. package/dist/src/providers/strategies/registry.js +4 -4
  311. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  312. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  313. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  314. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  315. package/dist/src/providers/types.d.ts +5 -6
  316. package/dist/src/providers/types.js +2 -2
  317. package/dist/src/providers/vision-backend.d.ts +47 -0
  318. package/dist/src/providers/vision-backend.js +258 -0
  319. package/dist/src/providers/vision-proxy.d.ts +22 -9
  320. package/dist/src/providers/vision-proxy.js +63 -132
  321. package/dist/src/providers/wire-debug.js +95 -0
  322. package/dist/src/router/decide.d.ts +13 -0
  323. package/dist/src/router/decide.js +138 -36
  324. package/dist/src/router/peak-hour.d.ts +38 -0
  325. package/dist/src/router/peak-hour.js +107 -0
  326. package/dist/src/router/step-router.js +3 -2
  327. package/dist/src/router/warm.js +4 -5
  328. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  329. package/dist/src/scaffold/continuation-prompt.js +26 -0
  330. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  331. package/dist/src/scaffold/point-to-existing.js +25 -0
  332. package/dist/src/self-qa/agentic-loop.js +3 -3
  333. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  334. package/dist/src/{ui/state → state}/active-run.js +21 -0
  335. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  336. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  337. package/dist/src/state/turn-trace.d.ts +43 -0
  338. package/dist/src/state/turn-trace.js +32 -0
  339. package/dist/src/storage/db.js +2 -1
  340. package/dist/src/storage/index.d.ts +1 -1
  341. package/dist/src/storage/index.js +1 -1
  342. package/dist/src/storage/interaction-log.d.ts +1 -1
  343. package/dist/src/storage/migrations.js +71 -1
  344. package/dist/src/storage/sessions.d.ts +28 -10
  345. package/dist/src/storage/sessions.js +78 -21
  346. package/dist/src/storage/transcript-view.js +1 -1
  347. package/dist/src/storage/transcript.d.ts +51 -0
  348. package/dist/src/storage/transcript.js +284 -13
  349. package/dist/src/tools/file.d.ts +15 -0
  350. package/dist/src/tools/file.js +32 -0
  351. package/dist/src/tools/native-tools.js +5 -0
  352. package/dist/src/tools/registry.d.ts +3 -0
  353. package/dist/src/tools/registry.js +460 -22
  354. package/dist/src/tools/research.d.ts +29 -0
  355. package/dist/src/tools/research.js +233 -0
  356. package/dist/src/types/index.d.ts +118 -3
  357. package/dist/src/ui/app.js +0 -0
  358. package/dist/src/ui/cards/product-status-card.js +1 -1
  359. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  360. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  361. package/dist/src/ui/components/context-rail.d.ts +26 -0
  362. package/dist/src/ui/components/context-rail.js +33 -0
  363. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  364. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  365. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  366. package/dist/src/ui/components/council-debate-pill.js +34 -0
  367. package/dist/src/ui/components/council-info-card.js +2 -2
  368. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  369. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  370. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  371. package/dist/src/ui/components/council-message-bubble.js +16 -15
  372. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  373. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  374. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  375. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  376. package/dist/src/ui/components/council-question-card.js +12 -12
  377. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  378. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  379. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  380. package/dist/src/ui/components/council-round-group.js +88 -0
  381. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  382. package/dist/src/ui/components/council-status-list.js +36 -24
  383. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  384. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  385. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  386. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  387. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  388. package/dist/src/ui/components/prompt-box.js +18 -16
  389. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  390. package/dist/src/ui/components/session-tree-card.js +46 -0
  391. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  392. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  393. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  394. package/dist/src/ui/components/task-list-panel.js +22 -2
  395. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  396. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  397. package/dist/src/ui/mcp-modal.js +2 -4
  398. package/dist/src/ui/modals/api-key-modal.js +1 -1
  399. package/dist/src/ui/modals/connect-modal.js +4 -3
  400. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  401. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  402. package/dist/src/ui/picker-providers.d.ts +1 -1
  403. package/dist/src/ui/picker-providers.js +1 -1
  404. package/dist/src/ui/primitives/index.d.ts +1 -0
  405. package/dist/src/ui/primitives/index.js +2 -0
  406. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  407. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  408. package/dist/src/ui/slash/compact.js +5 -7
  409. package/dist/src/ui/slash/cost.js +1 -1
  410. package/dist/src/ui/slash/council.js +19 -1
  411. package/dist/src/ui/slash/debug.d.ts +3 -31
  412. package/dist/src/ui/slash/debug.js +9 -20
  413. package/dist/src/ui/slash/ideal.d.ts +6 -2
  414. package/dist/src/ui/slash/ideal.js +97 -7
  415. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  416. package/dist/src/ui/slash/menu-items.js +12 -18
  417. package/dist/src/ui/slash/registry.d.ts +2 -0
  418. package/dist/src/ui/slash/registry.js +4 -0
  419. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  420. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  421. package/dist/src/ui/status-bar/index.d.ts +1 -1
  422. package/dist/src/ui/status-bar/index.js +7 -3
  423. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  424. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  425. package/dist/src/ui/theme.d.ts +1 -0
  426. package/dist/src/ui/theme.js +2 -0
  427. package/dist/src/ui/types.d.ts +7 -0
  428. package/dist/src/ui/use-app-logic.js +0 -0
  429. package/dist/src/ui/utils/format.d.ts +14 -0
  430. package/dist/src/ui/utils/format.js +23 -3
  431. package/dist/src/usage/downgrade.js +2 -2
  432. package/dist/src/usage/product-ledger.js +2 -2
  433. package/dist/src/utils/install-manager.js +2 -1
  434. package/dist/src/utils/logger.js +2 -2
  435. package/dist/src/utils/permission-mode.js +5 -3
  436. package/dist/src/utils/redactor.js +1 -1
  437. package/dist/src/utils/settings.d.ts +153 -5
  438. package/dist/src/utils/settings.js +233 -29
  439. package/dist/src/utils/visible-retry.d.ts +11 -0
  440. package/dist/src/utils/visible-retry.js +10 -1
  441. package/dist/src/verify/entrypoint.d.ts +1 -1
  442. package/dist/src/verify/entrypoint.js +1 -1
  443. package/dist/src/verify/recipes.d.ts +13 -0
  444. package/dist/src/verify/recipes.js +15 -0
  445. package/package.json +135 -132
  446. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  447. package/dist/src/providers/auth/gcloud.js +0 -102
  448. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  449. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  450. package/dist/src/providers/gemini.d.ts +0 -11
  451. package/dist/src/providers/gemini.js +0 -45
  452. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  453. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  454. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  455. package/dist/src/providers/strategies/google.strategy.js +0 -174
  456. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  457. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  458. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -17,6 +17,12 @@
17
17
  * All directive text is English. The agent is responsible for translating
18
18
  * user-facing prompts into the user's language at render time.
19
19
  */
20
+ /** When true and tier is standard/heavy, CHECK-PLAN points to gsd_plan_review tool. */
21
+ export function buildNativeCheckPlanHint() {
22
+ return (" 4. CHECK-PLAN — call gsd_plan_review (native council) BEFORE executing. " +
23
+ "Multi-perspective review spawns research/skeptic/architect sub-agents; leader synthesizes PLAN-VERIFY.md. " +
24
+ "gsd_execute is blocked until verdict: pass.");
25
+ }
20
26
  const HEADER = "[playbook]";
21
27
  /**
22
28
  * High-precision predicate: is this turn about the Muonroi ECOSYSTEM (where the
@@ -60,12 +66,15 @@ export function buildLanguageNudge(lang) {
60
66
  // senior-engineer reasoning over labeled scaffolds — feedback 12eceab7).
61
67
  function buildHeavy(input) {
62
68
  const phaseHint = input.phase ? ` (hint: this reads like a "${input.phase}" task)` : "";
69
+ const checkPlan = input.nativeGsd
70
+ ? buildNativeCheckPlanHint()
71
+ : " 4. CHECK-PLAN — review your own plan BEFORE executing: does it cover the acceptance criteria, handle the edge cases, and match what the user actually asked? Revise until it does (update the todo_write list if steps change). Confirm with the user only if the plan diverges from their intent.";
63
72
  return [
64
73
  `${HEADER} This reads like a HEAVY task${phaseHint} — architectural, cross-cutting, multi-file, or with real unresolved design choices. Don't start editing yet; work through these phases:`,
65
74
  " 1. DISCUSS — surface the decisions/ambiguities that actually change the design. For the ones the prompt doesn't already answer, ask up front with AskUserQuestion (put your recommended option first; write the question text in the user's language). Skip questions the prompt already settles — don't interrogate.",
66
- " 2. RESEARCH — gather the codebase facts the task depends on: read/grep the relevant modules, and dispatch parallel research Agents when the areas are independent. When you delegate, give each sub-agent a NON-overlapping scope and tell it the exact return shape you need (findings as file:line + a one-line conclusion) only the sub's final synthesis re-enters your context. Ground every later decision in what you actually found, not assumptions.",
67
- " 3. PLAN — write a concrete, numbered plan: the change per file, the order, and the acceptance criteria (how you'll know it's done). Then record the plan as a todo_write checklist (one item per step) so the user sees a live progress list.",
68
- " 4. CHECK-PLAN — review your own plan BEFORE executing: does it cover the acceptance criteria, handle the edge cases, and match what the user actually asked? Revise until it does (update the todo_write list if steps change). Confirm with the user only if the plan diverges from their intent.",
75
+ " 2. RESEARCH — gather the codebase facts the task depends on: read/grep the relevant modules, and dispatch parallel research Agents when the areas are independent. When you delegate (via `delegate`), give each sub-agent a NON-overlapping scope and tell it the exact return shape you need. Regularly check background tasks and subagents using `delegation_list` / `delegation_read` (or `process_list` / `process_logs` for shell processes) to monitor progress, and terminate them with `delegation_kill` / `process_stop` if they are no longer needed.",
76
+ " 3. PLAN — write a concrete, numbered plan via gsd_plan (or PLAN.md): the change per file, the order, and the acceptance criteria (how you'll know it's done). Then record the plan as a todo_write checklist (one item per step) so the user sees a live progress list.",
77
+ checkPlan,
69
78
  " 5. IMPLEMENT — execute in atomic steps; parallelize independent work. Keep the todo_write list accurate: mark each item in_progress before you start it and completed when it lands (exactly ONE item in_progress at a time). When you're in a git repo, COMMIT each completed chunk before starting the next one (small, logically-scoped commits; message ends with the mandatory attribution line) — do NOT pile the whole task into one commit at the end.",
70
79
  " 6. VERIFY — run the relevant tests / lint / type-check and report evidence (command + result) before claiming done.",
71
80
  "This depth is a recommendation from how the task reads. If, once you look, it's genuinely smaller than it appears, say so and drop to the STANDARD flow rather than over-processing it.",
@@ -92,10 +101,13 @@ function buildStandard(input) {
92
101
  "If the limits are blown and you still have no fix, STOP and report what you tried + why you're stuck.",
93
102
  ].join("\n");
94
103
  }
104
+ const checkStep = input.nativeGsd
105
+ ? " 2. CHECK — call gsd_plan_review (lightweight council: research + skeptic perspectives) before editing files."
106
+ : " 2. CHECK — sanity-check that plan against the real code (read the key files you named) and against the user's intent; fix the plan if reality differs. If a genuine ambiguity blocks you, ask ONE focused question via AskUserQuestion instead of guessing.";
95
107
  return [
96
108
  `${HEADER} This reads like a STANDARD task${phaseHint} — work like a senior engineer, but keep it lightweight:`,
97
- " 1. PLAN — state a short, concrete plan: the files/functions you'll touch and in what order. A few bullets in your reply, not an essay. If it breaks into ≥3 steps, also record them with todo_write so the user gets a live checklist.",
98
- " 2. CHECK — sanity-check that plan against the real code (read the key files you named) and against the user's intent; fix the plan if reality differs. If a genuine ambiguity blocks you, ask ONE focused question via AskUserQuestion instead of guessing.",
109
+ " 1. PLAN — state a short, concrete plan via gsd_plan: the files/functions you'll touch and in what order. A few bullets in your reply, not an essay. If it breaks into ≥3 steps, also record them with todo_write so the user gets a live checklist.",
110
+ checkStep,
99
111
  " 3. IMPLEMENT — execute the plan in small steps with the appropriate tools. If you made a todo_write checklist, keep it updated as you go (exactly one item in_progress at a time). When you're in a git repo, COMMIT each cohesive chunk as it lands (small commits; message ends with the mandatory attribution line) rather than batching everything into one final commit.",
100
112
  " 4. VERIFY — run the relevant tests / type-check / quick smoke and report evidence before claiming done.",
101
113
  "You don't need subagents or a discussion round for this. But if it turns out to be architectural or spans many files, escalate to the HEAVY flow (discuss → research → checked plan) rather than charging ahead.",
@@ -8,7 +8,7 @@
8
8
  * — NO hardcoded model id or provider anywhere in this file.
9
9
  */
10
10
  import type { ClarifiedSpec, CouncilLLM } from "../council/types.js";
11
- import type { Backlog, ImplementationPlanArtifact } from "./types.js";
11
+ import type { Backlog, EffortPoints, ImplementationPlanArtifact } from "./types.js";
12
12
  export interface BuildBacklogInput {
13
13
  runId: string;
14
14
  productSlug: string;
@@ -18,6 +18,19 @@ export interface BuildBacklogInput {
18
18
  leaderModelId: string;
19
19
  costAware: boolean;
20
20
  }
21
+ /**
22
+ * Deterministic keyword heuristic for a story-point prior (1 | 3 | 5).
23
+ *
24
+ * Used as the FALLBACK when the LLM effort estimate fails or returns unparseable
25
+ * JSON — cheap models (deepseek) often emit malformed arrays, and the previous
26
+ * flat-3 fallback made every item identical, so sprint bin-packing degenerated
27
+ * into a mechanical "≈2-3 items per sprint" split with no relation to real size
28
+ * (observed live: a "migrate 5 native modules" item and a "remove dependency"
29
+ * item both scored 3). A rough size signal from the title is strictly better than
30
+ * uniform. Verb-driven: creation/migration reads large, deletion/config reads
31
+ * small, everything else medium.
32
+ */
33
+ export declare function heuristicEffort(title: string): EffortPoints;
21
34
  /**
22
35
  * Build a Backlog from a ClarifiedSpec + the Phase 1 implementation_plan artifact.
23
36
  *
@@ -23,11 +23,35 @@ function hashSpec(spec) {
23
23
  function keywordMatch(haystack, needle) {
24
24
  return haystack.toLowerCase().includes(needle.toLowerCase());
25
25
  }
26
+ /**
27
+ * Deterministic keyword heuristic for a story-point prior (1 | 3 | 5).
28
+ *
29
+ * Used as the FALLBACK when the LLM effort estimate fails or returns unparseable
30
+ * JSON — cheap models (deepseek) often emit malformed arrays, and the previous
31
+ * flat-3 fallback made every item identical, so sprint bin-packing degenerated
32
+ * into a mechanical "≈2-3 items per sprint" split with no relation to real size
33
+ * (observed live: a "migrate 5 native modules" item and a "remove dependency"
34
+ * item both scored 3). A rough size signal from the title is strictly better than
35
+ * uniform. Verb-driven: creation/migration reads large, deletion/config reads
36
+ * small, everything else medium.
37
+ */
38
+ export function heuristicEffort(title) {
39
+ const t = title.toLowerCase();
40
+ const large = /\b(implement|build|create|migrat\w*|rewrite|refactor|orchestrat\w*|engine|subsystem|native|integrat\w*|pipeline|architect\w*)\b/;
41
+ const small = /\b(remove|delete|drop|inventory|rename|config\w*|flag|doc\w*|cleanup|wire|rename|bump|stub|export)\b/;
42
+ if (large.test(t))
43
+ return 5;
44
+ if (small.test(t))
45
+ return 1;
46
+ return 3;
47
+ }
26
48
  /**
27
49
  * Ask the LLM to estimate effortPoints for a batch of feature titles in a
28
50
  * single call. Parses JSON array response: [1, 3, 5, ...].
29
51
  *
30
- * Falls back to 3 (medium) for any item that fails to parse correctly.
52
+ * Falls back to a per-title keyword heuristic ({@link heuristicEffort}) NOT a
53
+ * flat 3 — for any item the LLM fails to score, so sprint packing keeps a real
54
+ * size signal even when the cheap model returns garbage.
31
55
  *
32
56
  * Model selection: pickCouncilTaskModel("effort_estimate", leaderModelId, costAware)
33
57
  */
@@ -46,25 +70,25 @@ async function estimateEffortBatch(titles, llm, leaderModelId, costAware) {
46
70
  raw = await llm.generate(model, system, prompt, 256);
47
71
  }
48
72
  catch {
49
- // Graceful degrade: default everything to M=3
50
- return titles.map(() => 3);
73
+ // Graceful degrade: keyword heuristic prior per title (NOT flat 3).
74
+ return titles.map((t) => heuristicEffort(t));
51
75
  }
52
76
  try {
53
77
  const match = raw.match(/\[[\s\S]*\]/);
54
78
  if (match) {
55
79
  const arr = JSON.parse(match[0]);
56
- return titles.map((_, i) => {
80
+ return titles.map((t, i) => {
57
81
  const v = arr[i];
58
82
  if (v === 1 || v === 3 || v === 5)
59
83
  return v;
60
- return 3;
84
+ return heuristicEffort(t); // this item unscored/invalid → heuristic, not flat 3
61
85
  });
62
86
  }
63
87
  }
64
88
  catch {
65
89
  // JSON parse failed — fall through
66
90
  }
67
- return titles.map(() => 3);
91
+ return titles.map((t) => heuristicEffort(t));
68
92
  }
69
93
  /**
70
94
  * Build a Backlog from a ClarifiedSpec + the Phase 1 implementation_plan artifact.
@@ -34,7 +34,9 @@ export function formatProjectContextForPrompt(ctx) {
34
34
  lines.push(`Backend stack: ${lang} / ${fw}${runtime}`);
35
35
  }
36
36
  if (c.dbStrategy) {
37
- lines.push(`Database: ${c.dbStrategy.mode ?? "(unspecified)"} ${c.dbStrategy.engine ?? ""}`.trimEnd());
37
+ lines.push(c.dbStrategy.mode === "none"
38
+ ? "Database: none (stateless — no persistent storage)"
39
+ : `Database: ${c.dbStrategy.mode ?? "(unspecified)"} ${c.dbStrategy.engine ?? ""}`.trimEnd());
38
40
  }
39
41
  if (c.frontendApproach) {
40
42
  const harness = c.frontendApproach.agentHarness
@@ -164,7 +164,10 @@ export function buildEcosystemPreamble() {
164
164
  "- Angular with @muonroi/agent-harness-angular directive.",
165
165
  'When recommending `frontendApproach`, ALWAYS fill the optional `agentHarness` slot — pick "react" for React/Next, "angular" for Angular, "opentui" for terminal UI, "core" for non-DOM integration. Only use "none" when the project has no UI at all.',
166
166
  "",
167
- "Recommend non-ecosystem options ONLY when the user's prompt explicitly opts out (e.g. mentions Node.js/Express/Django by name).",
167
+ "Strongest-default, still extensible:",
168
+ "- Keep the Muonroi/.NET path as the PRIMARY recommendation — it is the ecosystem's strongest, best-supported option.",
169
+ "- BUT for stack choices (architecture/stack/platform) ALWAYS include at least one mainstream NON-ecosystem alternative in `alternatives` (pick what genuinely fits the task — e.g. Python for data/ML/scripting, Go or Rust for a fast static-binary CLI, Node/TypeScript for JS-native tooling), with a one-line rationale. A user outside the Muonroi ecosystem must always see a real, viable path — never a .NET-only menu.",
170
+ "- Promote the non-ecosystem option to PRIMARY only when the prompt names another stack, or the task is a poor fit for .NET (e.g. a shell-glue one-liner, a data-science notebook, an npm-ecosystem plugin). Otherwise it stays a first-class alternative, not the default.",
168
171
  ].join("\n");
169
172
  }
170
173
  /**
@@ -3,6 +3,13 @@ import { appendUserOverride, buildProjectContextFromState, markDone, markUserGat
3
3
  import { computePromptSpecificity, toEntry, } from "./discovery-recommender.js";
4
4
  import { DISCOVERY_QUESTIONS, isFePolicyAccepted, isRequiredForPlatform, REQUIRED_QUESTION_IDS, validateAnswer, } from "./discovery-schema.js";
5
5
  import { buildRepoBrief } from "./repo-brief.js";
6
+ /**
7
+ * Under existing-repo collapse, keep ONLY these questions as interactive
8
+ * per-field cards — they are the fields whose answers actually shape the
9
+ * technical change. Everything else in DISCOVERY_QUESTIONS is auto-filled and
10
+ * surfaced together on the compact __user_gate__ confirm card.
11
+ */
12
+ const KEEP_CARD_FOR_EXISTING = new Set(["backendArchitecture"]);
6
13
  export async function iterateInterview(opts) {
7
14
  const { flowDir, runId, detection } = opts;
8
15
  const _itvDbg = process.env.MUONROI_DEBUG_LEADER === "1";
@@ -20,7 +27,18 @@ export async function iterateInterview(opts) {
20
27
  // but optional ones (baStatus, designStatus, deployment, frontendApproach when
21
28
  // not web) are deferred unless the user explicitly re-runs with more context.
22
29
  const specificity = computePromptSpecificity(opts.idea);
23
- const skipOptionalForMinimal = specificity === "minimal";
30
+ // Existing-codebase work (refactor / migration / feature-add on a repo that
31
+ // already has source) should NOT re-run the full greenfield product-scoping
32
+ // questionnaire. productType/audience/targetPlatform/frontend/design/deployment
33
+ // are derivable from the codebase and inert for the technical change — asking
34
+ // them per-field is the over-ask users complained about. For any non-greenfield
35
+ // classification (existing OR ambiguous polyglot) we collapse to the ONE
36
+ // decision-relevant card (backendArchitecture) plus the compact "assumed from
37
+ // codebase" confirm gate (the same __user_gate__ path used for minimal/detailed
38
+ // prompts). This mirrors the repoBrief-build condition below. Escape hatch:
39
+ // MUONROI_DISCOVERY_EXISTING_COLLAPSE=0 restores the full per-field interview.
40
+ const collapseForExisting = detection.classification !== "greenfield" && process.env.MUONROI_DISCOVERY_EXISTING_COLLAPSE !== "0";
41
+ const skipOptionalForMinimal = specificity === "minimal" || collapseForExisting;
24
42
  // G2-b: for a minimal OR well-specified ("detailed") prompt the recommender's
25
43
  // primary is high-confidence — minimal picks smallest-scope defaults, detailed
26
44
  // respects the stated context. In both cases surfacing a card for EVERY
@@ -30,7 +48,8 @@ export async function iterateInterview(opts) {
30
48
  // (the user gate) listing the assumptions so the user can proceed or adjust.
31
49
  // "moderate" prompts keep the per-question cards (genuinely ambiguous). Escape
32
50
  // hatch: MUONROI_DISCOVERY_AUTOFILL=0 restores per-question cards everywhere.
33
- const autoFillRequired = (specificity === "minimal" || specificity === "detailed") && process.env.MUONROI_DISCOVERY_AUTOFILL !== "0";
51
+ const autoFillRequired = (specificity === "minimal" || specificity === "detailed" || collapseForExisting) &&
52
+ process.env.MUONROI_DISCOVERY_AUTOFILL !== "0";
34
53
  const assumed = [];
35
54
  // G1 follow-up: keep the recommendation behind each auto-filled assumption so
36
55
  // the user-gate "edit: <field>" path can re-render the SAME per-question card
@@ -94,7 +113,17 @@ export async function iterateInterview(opts) {
94
113
  // policy) so a malformed recommendation falls back to the normal card flow.
95
114
  // The assumed answers are surfaced together on the single user-gate card.
96
115
  let autoAccepted = false;
97
- if (autoFillRequired && effectivelyRequired && recommendation.primary?.value != null) {
116
+ // Keep backendArchitecture interactive under existing-repo collapse (the one
117
+ // field whose answer shapes the technical work), and NEVER silently auto-accept
118
+ // a weakly-grounded recommendation (synthFailed = the rationale failed the
119
+ // repo-brief citation check twice) — fall through to a per-question card so the
120
+ // user can catch a hallucinated value instead of it being assumed.
121
+ const keepInteractive = collapseForExisting && KEEP_CARD_FOR_EXISTING.has(question.id);
122
+ if (autoFillRequired &&
123
+ effectivelyRequired &&
124
+ recommendation.primary?.value != null &&
125
+ !recommendation.synthFailed &&
126
+ !keepInteractive) {
98
127
  const v = recommendation.primary.value;
99
128
  const validation = validateAnswer(question.id, v);
100
129
  const feLib = question.id === "frontendApproach" ? v?.library : undefined;
@@ -18,7 +18,7 @@ export const DISCOVERY_QUESTIONS = [
18
18
  id: "dbStrategy",
19
19
  required: true,
20
20
  recommendMode: "council",
21
- prompt: "Database strategy: greenfield, existing schema, or migration?",
21
+ prompt: "Database strategy: none (stateless — no persistent storage), greenfield, existing schema, or migration? Choose none for a CLI/tool/filter that keeps no data.",
22
22
  },
23
23
  {
24
24
  id: "frontendApproach",
@@ -74,6 +74,10 @@ export function getSchemaHintForLeader(questionId) {
74
74
  return `value MUST be an object {"persona": string, "scale": one of ${Array.from(SCALES)
75
75
  .map((s) => JSON.stringify(s))
76
76
  .join("|")}, "geography": string}`;
77
+ case "dbStrategy":
78
+ // F7 — give the recommender an explicit "no persistence" option so it
79
+ // stops mis-ranking "greenfield" for stateless products (CLI/tool/filter).
80
+ return `value MUST be an object {"mode": one of "none"|"greenfield"|"existing-schema"|"migrate-from", "engine": string, "notes"?: string}. Pick "mode":"none" with "engine":"" when the product keeps NO persistent data (e.g. a stateless CLI, filter, or one-shot tool) — do NOT default to "greenfield" in that case.`;
77
81
  case "frontendApproach":
78
82
  return `value MUST be an object {"library": one of ${Array.from(ACCEPTED_FE_LIBRARIES)
79
83
  .map((l) => JSON.stringify(l))
@@ -0,0 +1,7 @@
1
+ export declare function isIdealTraceEnabled(): boolean;
2
+ /**
3
+ * Emit one diagnostic breadcrumb. `marker` is a stable dotted label
4
+ * (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
5
+ * scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
6
+ */
7
+ export declare function idealTrace(marker: string, extra?: Record<string, unknown>): void;
@@ -0,0 +1,64 @@
1
+ // src/product-loop/ideal-trace.ts
2
+ //
3
+ // Env-gated diagnostic tracer for the /ideal → council → sprint path.
4
+ //
5
+ // WHY THIS EXISTS
6
+ // ---------------
7
+ // "blocker 5" — the observed but non-deterministic "Plan locked → idle" stall
8
+ // after the sprint-planning debate synthesis — could not be root-caused from a
9
+ // harness run because greenfield almost always halts at CB3 first, and the tail
10
+ // path (post-debate menu → persist → writeDecisionsLock → stats → return, then
11
+ // sprint-runner's Implementation stage) has no durable breadcrumb. When the flow
12
+ // goes idle mid-tail, there is nothing to say WHICH line was last reached.
13
+ //
14
+ // This tracer writes one synchronous JSONL line per choke point when
15
+ // `MUONROI_IDEAL_TRACE` is set. Synchronous (`appendFileSync`) is deliberate: if
16
+ // the process hangs or is killed at the stall, the LAST line in the file is the
17
+ // last point the flow reached — an async write could be lost to an unflushed
18
+ // buffer. Unset → zero behaviour change (no file, no stderr, single env read).
19
+ //
20
+ // USAGE
21
+ // MUONROI_IDEAL_TRACE=1 → <tmpdir>/muonroi-ideal-trace.jsonl
22
+ // MUONROI_IDEAL_TRACE=/path/to/ideal-trace.log → explicit path
23
+ // Then reproduce the stall and read the file; the trailing marker is the hang.
24
+ import { appendFileSync } from "node:fs";
25
+ import * as os from "node:os";
26
+ import * as path from "node:path";
27
+ /**
28
+ * Resolve the trace sink for the CURRENT env value, or null when disabled.
29
+ * Not cached — the flag is fixed for a CLI session, and re-reading env per call
30
+ * is trivial on this (slow, non-hot) council path; caching would wrongly pin an
31
+ * early "disabled" read for the whole process.
32
+ */
33
+ function tracePath() {
34
+ const raw = process.env.MUONROI_IDEAL_TRACE;
35
+ if (!raw || raw === "0" || raw === "false")
36
+ return null;
37
+ return raw === "1" || raw === "true" ? path.join(os.tmpdir(), "muonroi-ideal-trace.jsonl") : raw;
38
+ }
39
+ export function isIdealTraceEnabled() {
40
+ return tracePath() !== null;
41
+ }
42
+ /**
43
+ * Emit one diagnostic breadcrumb. `marker` is a stable dotted label
44
+ * (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
45
+ * scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
46
+ */
47
+ export function idealTrace(marker, extra) {
48
+ const file = tracePath();
49
+ if (!file)
50
+ return;
51
+ const record = { ts: new Date().toISOString(), marker, ...extra };
52
+ const line = JSON.stringify(record);
53
+ try {
54
+ appendFileSync(file, `${line}\n`, "utf8");
55
+ }
56
+ catch (err) {
57
+ // Best-effort diagnostics: a bad path must never break the council/sprint
58
+ // flow. Surface once on stderr so a misconfigured path is noticed.
59
+ process.stderr.write(`[ideal-trace] append failed (${file}): ${err?.message}\n`);
60
+ }
61
+ // Mirror to stderr so it also lands in MUONROI_DEBUG_LLM_WIRE-style captures.
62
+ process.stderr.write(`[ideal-trace] ${line}\n`);
63
+ }
64
+ //# sourceMappingURL=ideal-trace.js.map
@@ -18,7 +18,7 @@ export interface ProductLoopOptions {
18
18
  /** Required for resume/abort/ship/status<runId>. */
19
19
  runId?: string;
20
20
  /** Subcommand selector. Default = start. */
21
- subcommand?: "start" | "status" | "resume" | "abort" | "ship";
21
+ subcommand?: "start" | "status" | "resume" | "abort" | "ship" | "review";
22
22
  flowDir: string;
23
23
  /** Session model id from the orchestrator (this.modelId). Used to resolve real council models. */
24
24
  sessionModelId: string;
@@ -29,6 +29,8 @@ export interface ProductLoopOptions {
29
29
  /** Optional bridges; sprint-runner uses them when present. */
30
30
  cwd?: string;
31
31
  processMessageFn?: (message: string) => AsyncGenerator<StreamChunk, void, unknown>;
32
+ /** Isolated bounded task-runner bridge — see DriverContext.runIsolatedTask. */
33
+ runIsolatedTask?: (request: import("../types/index.js").TaskRequest) => Promise<import("../types/index.js").ToolResult>;
32
34
  detectVerifyRecipe?: () => Promise<VerifyRecipe | null>;
33
35
  /** Test hook: pre-resolved role assignments so the harness can pin model ids. */
34
36
  roleAssignments?: Map<RoleSlot, {
@@ -53,6 +55,16 @@ export interface ProductLoopOptions {
53
55
  * not set, the dispatcher routes to runHotPath (single sprint, no council debate).
54
56
  */
55
57
  complexity?: "low" | "medium" | "high";
58
+ /**
59
+ * LLM-decided clarity signal (PIL Layer 1 `needsClarification`). When true the
60
+ * request is UNDERSPECIFIED — the model judged it lacks information it would
61
+ * need to proceed without guessing. It earns the interview/Council path even
62
+ * on an existing repo where a well-specified `standard` task would hot-path.
63
+ * Agent-first replacement for the regex sufficiency scorer: only `quick`
64
+ * (complexity=low) tasks still hot-path when underspecified — a trivial ask is
65
+ * not worth an interview no matter how terse.
66
+ */
67
+ needsClarification?: boolean;
56
68
  /**
57
69
  * Sufficiency gaps from PIL Layer 1. When non-empty, the dispatcher forces
58
70
  * the Council path regardless of complexity — vague prompts MUST go through