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
@@ -21,11 +21,9 @@ export function SessionPickerModal({ t, sessions, focusIndex, width, height, })
21
21
  const titleRaw = s.title?.trim() || "(untitled)";
22
22
  const titleMax = Math.max(8, panelWidth - 38);
23
23
  const title = titleRaw.length > titleMax ? `${titleRaw.slice(0, titleMax - 1)}…` : titleRaw;
24
- // Show the FULL session id (not slice(-8)). The resumed-session
25
- // header displays the full id, so a truncated id here made users
26
- // think they had resumed a "different" session when it was the
27
- // same one shown in two formats.
28
- const idLabel = s.id;
24
+ // Short 8-char id — the tree's root id, enough to disambiguate
25
+ // rows without crowding the model column.
26
+ const idLabel = s.id.slice(0, 8);
29
27
  return (_jsx(Semantic, { id: `session-item-${idx}`, role: "listitem", name: `${title} ${idLabel}`, value: s.id, selected: focused || undefined, children: _jsxs("box", { backgroundColor: focused ? t.selectedBg : undefined, paddingLeft: 2, paddingRight: 2, width: "100%", flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: focused ? t.selected : t.text, children: `${ts} ${title}` }), _jsx("text", { fg: focused ? t.primary : t.textMuted, children: `${s.model} ${idLabel}` })] }) }, s.id));
30
28
  })) }), _jsx("box", { flexShrink: 0, paddingLeft: 2, paddingRight: 2, paddingTop: 1, children: _jsx("text", { fg: t.textMuted, children: "↑↓ navigate · enter resume (restarts CLI) · esc cancel" }) })] }) }) }));
31
29
  }
@@ -9,7 +9,7 @@ import type { ProviderId } from "../providers/types.js";
9
9
  * previously hidden because `configuredProviders` stayed pinned to the splash
10
10
  * list (app.tsx never re-applied the async `getConfiguredProviders()` result).
11
11
  *
12
- * Providers with no catalog models (anthropic/ollama/google in the default
12
+ * Providers with no catalog models (anthropic/ollama in the default
13
13
  * catalog) are excluded — they cannot be routed to and would render as dead
14
14
  * chips with an empty model list. (xai now ships catalog models, so a
15
15
  * configured/OAuth-logged-in xai surfaces here.)
@@ -8,7 +8,7 @@
8
8
  * previously hidden because `configuredProviders` stayed pinned to the splash
9
9
  * list (app.tsx never re-applied the async `getConfiguredProviders()` result).
10
10
  *
11
- * Providers with no catalog models (anthropic/ollama/google in the default
11
+ * Providers with no catalog models (anthropic/ollama in the default
12
12
  * catalog) are excluded — they cannot be routed to and would render as dead
13
13
  * chips with an empty model list. (xai now ships catalog models, so a
14
14
  * configured/OAuth-logged-in xai surfaces here.)
@@ -0,0 +1 @@
1
+ export * from "./semantic-primitives.js";
@@ -0,0 +1,2 @@
1
+ export * from "./semantic-primitives.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,76 @@
1
+ /**
2
+ * src/ui/primitives/semantic-primitives.tsx
3
+ *
4
+ * Role-fixed semantic primitives. Compose these instead of hand-writing
5
+ * `<Semantic role="...">` in feature code. Two things they buy you:
6
+ *
7
+ * 1. The `role` is fixed per component, so it can't be typo'd or drift, and
8
+ * TypeScript enforces the right props per role.
9
+ * 2. Interactive state is passed as plain booleans (`focused`, `selected`,
10
+ * `disabled`, `hidden`) and mirrored to the Semantic node's `true|undefined`
11
+ * flags automatically — no more `focus={cond ? true : undefined}` written
12
+ * by hand at every call site (the #1 source of harness/state drift).
13
+ *
14
+ * Feature authors should reach for these first; a raw `<Semantic>` is only for
15
+ * genuinely bespoke roles not covered here (or a namespaced `x-*` role).
16
+ *
17
+ * These are invisible wrappers (like `<Semantic>` itself): zero OpenTUI element,
18
+ * zero runtime cost when the agent runtime is unset.
19
+ */
20
+ import type * as React from "react";
21
+ /**
22
+ * Common props shared by every primitive. `focused`/`selected`/`disabled`/
23
+ * `hidden` are plain booleans here (not `true`-literal) and are mirrored to the
24
+ * underlying Semantic flags.
25
+ */
26
+ export interface BlockProps {
27
+ id: string;
28
+ name?: string;
29
+ value?: string;
30
+ state?: string;
31
+ focused?: boolean;
32
+ selected?: boolean;
33
+ disabled?: boolean;
34
+ hidden?: boolean;
35
+ props?: Record<string, unknown>;
36
+ children?: React.ReactNode;
37
+ }
38
+ /** A modal dialog. `isModal` defaults to true (pass `isModal={false}` to opt out). */
39
+ export declare function Dialog({ isModal, ...rest }: BlockProps & {
40
+ isModal?: boolean;
41
+ }): React.ReactNode;
42
+ /** A generic grouping region / panel. */
43
+ export declare function Region(props: BlockProps): React.ReactNode;
44
+ /** A titled content panel (IDE-style). */
45
+ export declare function Panel(props: BlockProps): React.ReactNode;
46
+ /** A single-line or multi-line text input. Pass `value` + `focused`. */
47
+ export declare function TextBox(props: BlockProps): React.ReactNode;
48
+ /** A pressable button. Pass `disabled`/`focused` as booleans. */
49
+ export declare function Button(props: BlockProps): React.ReactNode;
50
+ /** A toggle. Reflect checked state via `selected`. */
51
+ export declare function Checkbox(props: BlockProps): React.ReactNode;
52
+ /** A scrollable list container. */
53
+ export declare function ListBox(props: BlockProps): React.ReactNode;
54
+ /** A single list row. Reflect highlight via `selected`. */
55
+ export declare function ListItem(props: BlockProps): React.ReactNode;
56
+ /** A command / context menu. `isModal` defaults to true. */
57
+ export declare function Menu({ isModal, ...rest }: BlockProps & {
58
+ isModal?: boolean;
59
+ }): React.ReactNode;
60
+ /** A single menu entry. */
61
+ export declare function MenuItem(props: BlockProps): React.ReactNode;
62
+ /** A transient notification. */
63
+ export declare function Toast(props: BlockProps): React.ReactNode;
64
+ /** The persistent status bar. */
65
+ export declare function StatusBar(props: BlockProps): React.ReactNode;
66
+ /** A determinate/indeterminate progress indicator. Put `0..1` in `value`. */
67
+ export declare function ProgressBar(props: BlockProps): React.ReactNode;
68
+ /** A scrollback / message log. */
69
+ export declare function Log(props: BlockProps): React.ReactNode;
70
+ /**
71
+ * Escape hatch for a namespaced custom role not covered above. `role` MUST start
72
+ * with `x-` (enforced by the `Role` type). Prefer a named primitive when one fits.
73
+ */
74
+ export declare function CustomBlock({ role, ...rest }: BlockProps & {
75
+ role: `x-${string}`;
76
+ }): React.ReactNode;
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { Semantic } from "@muonroi/agent-harness-opentui";
3
+ /** Coerce a boolean into the Semantic flag shape (`true` present, else absent). */
4
+ function flag(value) {
5
+ return value ? true : undefined;
6
+ }
7
+ /**
8
+ * Internal base. Renders a `<Semantic>` with a fixed `role`, mapping the plain
9
+ * boolean props to the flag shape. `isModal` is passed through for the roles
10
+ * that support it (dialog/menu).
11
+ */
12
+ function Block({ role, isModal, id, name, value, state, focused, selected, disabled, hidden, props, children, }) {
13
+ return (_jsx(Semantic, { id: id, role: role, name: name, value: value, state: state, focus: flag(focused), selected: flag(selected), disabled: flag(disabled), hidden: flag(hidden), isModal: flag(isModal), props: props, children: children }));
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Role-fixed primitives
17
+ // ---------------------------------------------------------------------------
18
+ /** A modal dialog. `isModal` defaults to true (pass `isModal={false}` to opt out). */
19
+ export function Dialog({ isModal = true, ...rest }) {
20
+ return _jsx(Block, { role: "dialog", isModal: isModal, ...rest });
21
+ }
22
+ /** A generic grouping region / panel. */
23
+ export function Region(props) {
24
+ return _jsx(Block, { role: "region", ...props });
25
+ }
26
+ /** A titled content panel (IDE-style). */
27
+ export function Panel(props) {
28
+ return _jsx(Block, { role: "panel", ...props });
29
+ }
30
+ /** A single-line or multi-line text input. Pass `value` + `focused`. */
31
+ export function TextBox(props) {
32
+ return _jsx(Block, { role: "textbox", ...props });
33
+ }
34
+ /** A pressable button. Pass `disabled`/`focused` as booleans. */
35
+ export function Button(props) {
36
+ return _jsx(Block, { role: "button", ...props });
37
+ }
38
+ /** A toggle. Reflect checked state via `selected`. */
39
+ export function Checkbox(props) {
40
+ return _jsx(Block, { role: "checkbox", ...props });
41
+ }
42
+ /** A scrollable list container. */
43
+ export function ListBox(props) {
44
+ return _jsx(Block, { role: "listbox", ...props });
45
+ }
46
+ /** A single list row. Reflect highlight via `selected`. */
47
+ export function ListItem(props) {
48
+ return _jsx(Block, { role: "listitem", ...props });
49
+ }
50
+ /** A command / context menu. `isModal` defaults to true. */
51
+ export function Menu({ isModal = true, ...rest }) {
52
+ return _jsx(Block, { role: "menu", isModal: isModal, ...rest });
53
+ }
54
+ /** A single menu entry. */
55
+ export function MenuItem(props) {
56
+ return _jsx(Block, { role: "menuitem", ...props });
57
+ }
58
+ /** A transient notification. */
59
+ export function Toast(props) {
60
+ return _jsx(Block, { role: "toast", ...props });
61
+ }
62
+ /** The persistent status bar. */
63
+ export function StatusBar(props) {
64
+ return _jsx(Block, { role: "statusbar", ...props });
65
+ }
66
+ /** A determinate/indeterminate progress indicator. Put `0..1` in `value`. */
67
+ export function ProgressBar(props) {
68
+ return _jsx(Block, { role: "progressbar", ...props });
69
+ }
70
+ /** A scrollback / message log. */
71
+ export function Log(props) {
72
+ return _jsx(Block, { role: "log", ...props });
73
+ }
74
+ /**
75
+ * Escape hatch for a namespaced custom role not covered above. `role` MUST start
76
+ * with `x-` (enforced by the `Role` type). Prefer a named primitive when one fits.
77
+ */
78
+ export function CustomBlock({ role, ...rest }) {
79
+ return _jsx(Block, { role: role, ...rest });
80
+ }
81
+ //# sourceMappingURL=semantic-primitives.js.map
@@ -15,11 +15,9 @@ import { FLOW_DIR_NAME } from "../../flow/scaffold.js";
15
15
  import { registerSlash } from "./registry.js";
16
16
  export const handleCompactSlash = async (_args, ctx) => {
17
17
  const flowDir = path.join(ctx.cwd, FLOW_DIR_NAME);
18
- // Check for active run
18
+ // Check for active run (informational only). /compact should work on any
19
+ // session, not only inside a product-loop run, so we no longer block here.
19
20
  const runId = await getActiveRunId(flowDir);
20
- if (!runId) {
21
- return "No active run. Nothing to compact. Start with /discuss to create a run.";
22
- }
23
21
  // Fire-and-forget: notify EE that surfaced suggestions are going stale due to compact
24
22
  const { surfacedIds, timestamp } = getLastSurfacedState();
25
23
  if (surfacedIds.length > 0) {
@@ -31,9 +29,9 @@ export const handleCompactSlash = async (_args, ctx) => {
31
29
  .catch(() => { });
32
30
  }
33
31
  // Return signal for orchestrator to perform compaction
34
- // The orchestrator intercepts __COMPACT__ and calls deliberateCompact()
35
- // with its own this.messages and this.systemPrompt
36
- return `__COMPACT__\nRun: ${runId}\nReady for two-pass compaction.`;
32
+ const instructions = _args.length > 0 ? `\nInstructions: ${_args.join(" ")}` : "";
33
+ const runLine = runId ? `Run: ${runId}` : "No active run — compacting chat history only.";
34
+ return `__COMPACT__\n${runLine}${instructions}\nReady for two-pass compaction.`;
37
35
  };
38
36
  // Self-register on module import
39
37
  registerSlash("compact", handleCompactSlash);
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { healthDetailed } from "../../ee/health.js";
11
11
  import { getDefaultEEClient } from "../../ee/intercept.js";
12
- import { statusBarStore } from "../status-bar/store.js";
12
+ import { statusBarStore } from "../../state/status-bar-store.js";
13
13
  import { registerSlash } from "./registry.js";
14
14
  export const handleCostSlash = async (_args, _ctx) => {
15
15
  const s = statusBarStore.getState();
@@ -1,3 +1,4 @@
1
+ import { getCouncilLanguage, normalizeCouncilLanguage, saveUserSettings } from "../../utils/settings.js";
1
2
  import { handleCouncilInspectSlash } from "./council-inspect.js";
2
3
  import { registerSlash } from "./registry.js";
3
4
  export const handleCouncilSlash = async (args, ctx) => {
@@ -5,6 +6,22 @@ export const handleCouncilSlash = async (args, ctx) => {
5
6
  if (args[0] === "inspect") {
6
7
  return handleCouncilInspectSlash(args.slice(1), ctx);
7
8
  }
9
+ // Feature B — /council lang [value] : read or set the debate language.
10
+ // The chosen language IS the debate language (no translate pass).
11
+ if (args[0] === "lang" || args[0] === "language") {
12
+ const value = args.slice(1).join(" ").trim();
13
+ if (!value) {
14
+ const current = getCouncilLanguage();
15
+ return (`Council debate language: ${current}\n` +
16
+ `- "auto" (default): debate + conclusion follow the language of your prompt.\n` +
17
+ `- "english": force the historical English-only debate.\n` +
18
+ `- <locale> (e.g. "vietnamese", "日本語"): pin the debate to that language.\n` +
19
+ `Set with: /council lang <value>`);
20
+ }
21
+ const normalized = normalizeCouncilLanguage(value);
22
+ saveUserSettings({ councilLanguage: normalized });
23
+ return `Council debate language set to: ${normalized}`;
24
+ }
8
25
  let rounds;
9
26
  const firstArg = args[0];
10
27
  if (firstArg && /^\d+$/.test(firstArg)) {
@@ -14,7 +31,8 @@ export const handleCouncilSlash = async (args, ctx) => {
14
31
  const topic = args.join(" ") || ctx.lastPrompt || "";
15
32
  if (!topic) {
16
33
  return ("/council [rounds] <topic> — multi-model discussion\n" +
17
- "Default: uses models from the same provider. Set councilPreferMultiProvider + roleModels for cross-provider.\n" +
34
+ "Default: multi-provider lineup from catalog (implement/verify/research across providers).\n" +
35
+ "Override via roleModels in settings, or councilPreferMultiProvider: false for same-provider.\n" +
18
36
  "Example: /council 3 REST vs gRPC for our microservices");
19
37
  }
20
38
  return `__COUNCIL__\n${rounds ?? ""}\n${topic}`;
@@ -10,36 +10,8 @@
10
10
  * /debug off — disable
11
11
  * /debug status — show current pipeline state without toggling
12
12
  */
13
+ import { isDebugEnabled, recordTurnTrace } from "../../state/turn-trace.js";
13
14
  import type { SlashHandler } from "./registry.js";
14
- export interface PipelineStep {
15
- name: string;
16
- duration_ms: number;
17
- input_summary: string;
18
- output_summary: string;
19
- tokens_saved?: number;
20
- }
21
- export interface TurnTrace {
22
- turn_id: number;
23
- timestamp: number;
24
- raw_prompt: string;
25
- steps: PipelineStep[];
26
- model_requested: string;
27
- model_used: string;
28
- routed: boolean;
29
- input_tokens: number;
30
- output_tokens: number;
31
- cache_read_tokens: number;
32
- cost_usd: number;
33
- estimated_savings: SavingsEstimate;
34
- }
35
- export interface SavingsEstimate {
36
- pil_tokens_saved: number;
37
- cache_tokens_saved: number;
38
- router_cost_saved_usd: number;
39
- total_tokens_saved: number;
40
- total_cost_saved_usd: number;
41
- }
42
- export declare function isDebugEnabled(): boolean;
43
- export declare function recordTurnTrace(trace: TurnTrace): void;
44
- export declare function getLastTrace(): TurnTrace | null;
15
+ export type { PipelineStep, SavingsEstimate, TurnTrace } from "../../state/turn-trace.js";
16
+ export { isDebugEnabled, recordTurnTrace };
45
17
  export declare const handleDebugSlash: SlashHandler;
@@ -10,23 +10,10 @@
10
10
  * /debug off — disable
11
11
  * /debug status — show current pipeline state without toggling
12
12
  */
13
- import { statusBarStore } from "../status-bar/store.js";
13
+ import { statusBarStore } from "../../state/status-bar-store.js";
14
+ import { getAllTraces, getLastTrace, isDebugEnabled, recordTurnTrace, setDebugEnabled, } from "../../state/turn-trace.js";
14
15
  import { registerSlash } from "./registry.js";
15
- let debugEnabled = false;
16
- const turnTraces = [];
17
- export function isDebugEnabled() {
18
- return debugEnabled;
19
- }
20
- export function recordTurnTrace(trace) {
21
- if (!debugEnabled)
22
- return;
23
- turnTraces.push(trace);
24
- if (turnTraces.length > 50)
25
- turnTraces.shift();
26
- }
27
- export function getLastTrace() {
28
- return turnTraces[turnTraces.length - 1] ?? null;
29
- }
16
+ export { isDebugEnabled, recordTurnTrace };
30
17
  function formatTrace(trace) {
31
18
  const lines = [];
32
19
  lines.push(`┌─ Turn #${trace.turn_id} ─────────────────────────────────`);
@@ -62,6 +49,7 @@ function formatTrace(trace) {
62
49
  }
63
50
  function formatSessionSummary() {
64
51
  const s = statusBarStore.getState();
52
+ const turnTraces = getAllTraces();
65
53
  const totalSavings = turnTraces.reduce((acc, t) => ({
66
54
  tokens: acc.tokens + t.estimated_savings.total_tokens_saved,
67
55
  cost: acc.cost + t.estimated_savings.total_cost_saved_usd,
@@ -82,11 +70,11 @@ function formatSessionSummary() {
82
70
  export const handleDebugSlash = async (args, _ctx) => {
83
71
  const cmd = args[0]?.toLowerCase();
84
72
  if (cmd === "on") {
85
- debugEnabled = true;
73
+ setDebugEnabled(true);
86
74
  return "Pipeline debug tracing: ON\nEach turn will show: PIL → Router → EE hooks → Model → Savings";
87
75
  }
88
76
  if (cmd === "off") {
89
- debugEnabled = false;
77
+ setDebugEnabled(false);
90
78
  return "Pipeline debug tracing: OFF";
91
79
  }
92
80
  if (cmd === "status") {
@@ -99,8 +87,9 @@ export const handleDebugSlash = async (args, _ctx) => {
99
87
  return formatTrace(last);
100
88
  }
101
89
  // Toggle
102
- debugEnabled = !debugEnabled;
103
- if (debugEnabled) {
90
+ const next = !isDebugEnabled();
91
+ setDebugEnabled(next);
92
+ if (next) {
104
93
  return "Pipeline debug tracing: ON\nEach turn will show: PIL → Router → EE hooks → Model → Savings\n\nCommands: /debug off | /debug status | /debug last";
105
94
  }
106
95
  return "Pipeline debug tracing: OFF";
@@ -154,6 +154,8 @@ const HELP = [
154
154
  "**Experience Engine (/ee)**",
155
155
  "",
156
156
  "Usage:",
157
+ " /ee config — Show EE connection settings",
158
+ " /ee config <url> [token] — Connect to an EE server (writes ~/.experience/config.json)",
157
159
  " /ee stats [7d|30d|all] — Knowledge base statistics",
158
160
  " /ee timeline <topic> — Chronological principle evolution",
159
161
  " /ee graph <id> — Principle relationship graph",
@@ -167,10 +169,89 @@ const HELP = [
167
169
  " /ee mode — Show detected client mode (thin/fat/disabled)",
168
170
  ].join("\n");
169
171
  // ─── Handler ─────────────────────────────────────────────────────────────────
172
+ /** Never echo a token back in full — the transcript is persisted to SQLite. */
173
+ function maskToken(token) {
174
+ if (!token)
175
+ return "(none)";
176
+ return token.length <= 4 ? "set (…)" : `set (…${token.slice(-4)})`;
177
+ }
178
+ /**
179
+ * Show or set the EE connection. Until this existed, EE was configurable only
180
+ * by the one-shot first-run wizard — and index.ts marks eeSetupPrompted even
181
+ * when the user SKIPS it, so skipping once left hand-editing
182
+ * ~/.experience/config.json as the only way back in.
183
+ */
184
+ async function handleConfig(args) {
185
+ const { getCachedServerBaseUrl, getCachedAuthToken, getExperienceConfigPath, probeEEHealth, refreshAuthToken } = await import("../../ee/auth.js");
186
+ const url = args[0];
187
+ if (!url) {
188
+ const baseUrl = getCachedServerBaseUrl();
189
+ const lines = [
190
+ "**EE Config**",
191
+ "",
192
+ ` serverBaseUrl: ${baseUrl ?? "(not configured)"}`,
193
+ ` serverAuthToken: ${maskToken(getCachedAuthToken())}`,
194
+ ` config file: ${getExperienceConfigPath()}`,
195
+ ];
196
+ if (process.env.MUONROI_EE_BASE_URL) {
197
+ lines.push("", ` ⚠ MUONROI_EE_BASE_URL=${process.env.MUONROI_EE_BASE_URL} overrides the config file.`);
198
+ }
199
+ if (baseUrl) {
200
+ const health = await probeEEHealth(baseUrl, getCachedAuthToken() ?? undefined);
201
+ lines.push("", health.ok ? ` ✓ reachable (${health.detail})` : ` ⚠ not reachable — ${health.detail}`);
202
+ }
203
+ else {
204
+ lines.push("", "Connect one with: `/ee config <url> [token]`");
205
+ }
206
+ return lines.join("\n");
207
+ }
208
+ let normalized;
209
+ try {
210
+ normalized = new URL(url).toString().replace(/\/$/, "");
211
+ }
212
+ catch {
213
+ return `"${url}" is not a valid URL. Example: \`/ee config https://experience.example.com <token>\``;
214
+ }
215
+ const token = args[1];
216
+ try {
217
+ const { writeExperienceConfig } = await import("../../ee/auth.js");
218
+ await writeExperienceConfig({
219
+ serverBaseUrl: normalized,
220
+ ...(token ? { serverAuthToken: token } : {}),
221
+ });
222
+ }
223
+ catch (err) {
224
+ const message = err?.message ?? String(err);
225
+ console.error(`[slash/ee] writing ${getExperienceConfigPath()} failed: ${message}`);
226
+ return `Could not write ${getExperienceConfigPath()}: ${message}`;
227
+ }
228
+ // Re-read so THIS session picks the change up; without it the new server is
229
+ // only live after a restart.
230
+ await refreshAuthToken();
231
+ const { detectEEClientMode, describeMode } = await import("../../ee/client-mode.js");
232
+ const info = await detectEEClientMode({ force: true });
233
+ const health = await probeEEHealth(normalized, token || (getCachedAuthToken() ?? undefined));
234
+ return [
235
+ "**EE Config saved**",
236
+ "",
237
+ ` serverBaseUrl: ${normalized}`,
238
+ ` serverAuthToken: ${maskToken(token ?? getCachedAuthToken())}`,
239
+ ` config file: ${getExperienceConfigPath()}`,
240
+ ` client mode: ${info.mode} — ${describeMode(info)}`,
241
+ "",
242
+ health.ok
243
+ ? ` ✓ reachable (${health.detail}) — recall is live for this session.`
244
+ : ` ⚠ saved, but not reachable — ${health.detail}. EE calls degrade gracefully until it responds.`,
245
+ ].join("\n");
246
+ }
170
247
  export const handleEESlash = async (args, _ctx) => {
171
248
  const sub = args[0]?.toLowerCase();
172
249
  if (!sub)
173
250
  return HELP;
251
+ // `config` must not construct the EE client: it is the command you reach for
252
+ // precisely when there is no server configured yet.
253
+ if (sub === "config" || sub === "setup")
254
+ return await handleConfig(args.slice(1));
174
255
  const client = getDefaultEEClient();
175
256
  switch (sub) {
176
257
  case "stats": {
@@ -7,7 +7,7 @@
7
7
  * /ideal "<idea>" start a new product run (default)
8
8
  * /ideal status list active runs
9
9
  * /ideal status <runId> detail of one run
10
- * /ideal resume <runId> resume halted/crashed run
10
+ * /ideal resume [runId] resume halted/crashed run (no id = newest incomplete)
11
11
  * /ideal abort <runId> hard kill
12
12
  * /ideal ship <runId> force user-approval gate (skip if Cond #1-#4 pass)
13
13
  *
@@ -47,7 +47,7 @@ export interface IdealFlags {
47
47
  /** Mode C only — opt-in: run `gh pr create` after PR is built. Default false. */
48
48
  ghPr?: boolean;
49
49
  }
50
- export type IdealSubcommand = "start" | "status" | "resume" | "abort" | "ship" | "help";
50
+ export type IdealSubcommand = "start" | "status" | "resume" | "abort" | "ship" | "review" | "milestones" | "phases" | "help";
51
51
  export interface IdealParseResult {
52
52
  subcommand: IdealSubcommand;
53
53
  idea?: string;
@@ -60,6 +60,10 @@ export interface IdealParseResult {
60
60
  * SlashHandler signature (which depends on a SlashContext).
61
61
  */
62
62
  export declare function parseIdealArgs(args: string[]): IdealParseResult;
63
+ /** Render `/ideal milestones` — every milestone with its phases + linked runs. */
64
+ export declare function renderMilestones(cwd: string): Promise<string>;
65
+ /** Render `/ideal phases [milestoneId]` — phases under one milestone. */
66
+ export declare function renderPhases(cwd: string, milestoneId?: string): Promise<string>;
63
67
  /**
64
68
  * Slash handler. Returns a sentinel string parseable by app.tsx, OR a help/error
65
69
  * string when no orchestrator dispatch is appropriate.
@@ -7,7 +7,7 @@
7
7
  * /ideal "<idea>" start a new product run (default)
8
8
  * /ideal status list active runs
9
9
  * /ideal status <runId> detail of one run
10
- * /ideal resume <runId> resume halted/crashed run
10
+ * /ideal resume [runId] resume halted/crashed run (no id = newest incomplete)
11
11
  * /ideal abort <runId> hard kill
12
12
  * /ideal ship <runId> force user-approval gate (skip if Cond #1-#4 pass)
13
13
  *
@@ -25,7 +25,9 @@
25
25
  * app.tsx parses and dispatches to orchestrator.runProductLoopV1, mirroring
26
26
  * the existing __COUNCIL__ pattern in src/ui/slash/council.ts.
27
27
  */
28
+ import * as path from "node:path";
28
29
  import { Command, InvalidArgumentError } from "commander";
30
+ import { getActivePointer, listMilestones, listPhases, migrateLegacyRuns } from "../../flow/hierarchy.js";
29
31
  import { registerSlash } from "./registry.js";
30
32
  const DEFAULTS = {
31
33
  maxCost: 50,
@@ -38,8 +40,11 @@ const HELP_TEXT = [
38
40
  "Subcommands:",
39
41
  ' /ideal "<idea>" Start a new product run',
40
42
  " /ideal status [runId] List active runs (or detail one)",
41
- " /ideal resume <runId> Resume a halted / crashed run",
42
- " /ideal abort <runId> Hard-kill a run",
43
+ " /ideal resume [runId] Resume a run (no id = newest incomplete run)",
44
+ " /ideal review [runId] Render a run's transcript + sprint scores (no id = newest run)",
45
+ " /ideal milestones List milestones (idea/product groups) and their phases",
46
+ " /ideal phases [mId] List phases under a milestone (no id = active milestone)",
47
+ " /ideal abort [runId] Hard-kill a run (no id = newest incomplete run)",
43
48
  " /ideal ship <runId> Force user-approval gate (skip Cond #1-#4 if passing)",
44
49
  "",
45
50
  "Flags (start only):",
@@ -85,7 +90,18 @@ export function parseIdealArgs(args) {
85
90
  return { subcommand: "help", flags: { ...DEFAULTS, noCustomerDebate }, warnings };
86
91
  }
87
92
  // Detect non-start subcommands by first token (subcommand keywords are reserved).
88
- const RESERVED = new Set(["status", "resume", "abort", "ship", "help", "--help", "-h"]);
93
+ const RESERVED = new Set([
94
+ "status",
95
+ "resume",
96
+ "abort",
97
+ "ship",
98
+ "review",
99
+ "milestones",
100
+ "phases",
101
+ "help",
102
+ "--help",
103
+ "-h",
104
+ ]);
89
105
  const head = args[0];
90
106
  if (RESERVED.has(head)) {
91
107
  if (head === "help" || head === "--help" || head === "-h") {
@@ -193,18 +209,92 @@ export function parseIdealArgs(args) {
193
209
  warnings,
194
210
  };
195
211
  }
212
+ function flowDirOf(cwd) {
213
+ return path.join(cwd, ".muonroi-flow");
214
+ }
215
+ /** Render `/ideal milestones` — every milestone with its phases + linked runs. */
216
+ export async function renderMilestones(cwd) {
217
+ const flowDir = flowDirOf(cwd);
218
+ // Lazily backfill pre-hierarchy runs so old work is visible. Idempotent.
219
+ await migrateLegacyRuns(flowDir, new Date().toISOString()).catch(() => 0);
220
+ const milestones = await listMilestones(flowDir);
221
+ if (milestones.length === 0) {
222
+ return 'No milestones yet. Start one with `/ideal "<idea>"`.';
223
+ }
224
+ const { milestoneId: activeM, phaseId: activeP } = await getActivePointer(flowDir);
225
+ const lines = ["# Milestones", ""];
226
+ for (const m of milestones) {
227
+ const active = m.id === activeM ? " ← active" : "";
228
+ lines.push(`## ${m.id}: ${m.title} [${m.status}]${active}`);
229
+ if (m.goal)
230
+ lines.push(` goal: ${m.goal}`);
231
+ const phases = await listPhases(flowDir, m.id);
232
+ if (phases.length === 0) {
233
+ lines.push(" (no phases yet)");
234
+ }
235
+ else {
236
+ for (const p of phases) {
237
+ const runs = p.runIds.length > 0 ? ` — runs: ${p.runIds.join(", ")}` : "";
238
+ const pActive = m.id === activeM && p.id === activeP ? " ←" : "";
239
+ lines.push(` - [${p.status === "done" ? "x" : " "}] ${p.id}: ${p.title} [${p.status}]${runs}${pActive}`);
240
+ }
241
+ }
242
+ lines.push("");
243
+ }
244
+ return lines.join("\n").trimEnd();
245
+ }
246
+ /** Render `/ideal phases [milestoneId]` — phases under one milestone. */
247
+ export async function renderPhases(cwd, milestoneId) {
248
+ const flowDir = flowDirOf(cwd);
249
+ let mId = milestoneId;
250
+ if (!mId) {
251
+ mId = (await getActivePointer(flowDir)).milestoneId ?? undefined;
252
+ }
253
+ if (!mId) {
254
+ return "No active milestone. Run `/ideal milestones` to list, or pass a milestone id.";
255
+ }
256
+ const phases = await listPhases(flowDir, mId);
257
+ if (phases.length === 0) {
258
+ return `No phases under ${mId}.`;
259
+ }
260
+ const { phaseId: activeP } = await getActivePointer(flowDir);
261
+ const lines = [`# Phases of ${mId}`, ""];
262
+ for (const p of phases) {
263
+ const runs = p.runIds.length > 0 ? ` — runs: ${p.runIds.join(", ")}` : "";
264
+ const pActive = p.id === activeP ? " ← active" : "";
265
+ lines.push(`- [${p.status === "done" ? "x" : " "}] ${p.id}: ${p.title} [${p.status}]${runs}${pActive}`);
266
+ if (p.goal)
267
+ lines.push(` goal: ${p.goal}`);
268
+ }
269
+ return lines.join("\n");
270
+ }
196
271
  /**
197
272
  * Slash handler. Returns a sentinel string parseable by app.tsx, OR a help/error
198
273
  * string when no orchestrator dispatch is appropriate.
199
274
  */
200
- export const handleIdealSlash = async (args) => {
275
+ export const handleIdealSlash = async (args, ctx) => {
201
276
  const result = parseIdealArgs(args);
202
277
  if (result.subcommand === "help") {
203
278
  const warnings = result.warnings.length ? `\n\n${result.warnings.join("\n")}` : "";
204
279
  return `${HELP_TEXT}${warnings}`;
205
280
  }
206
- // Status/abort/resume/ship without a runId: status is allowed (lists), the rest are not.
207
- if (result.subcommand !== "start" && result.subcommand !== "status" && !result.runId) {
281
+ // Milestones/phases are read-only index views render inline (no orchestrator
282
+ // dispatch). `runId` carries the optional milestone id for `phases`.
283
+ if (result.subcommand === "milestones") {
284
+ return renderMilestones(ctx.cwd);
285
+ }
286
+ if (result.subcommand === "phases") {
287
+ return renderPhases(ctx.cwd, result.runId);
288
+ }
289
+ // Status/resume/abort without a runId are allowed: status lists all runs,
290
+ // resume + abort auto-detect the newest incomplete run (A/B). ship still
291
+ // requires an explicit runId.
292
+ if (result.subcommand !== "start" &&
293
+ result.subcommand !== "status" &&
294
+ result.subcommand !== "resume" &&
295
+ result.subcommand !== "abort" &&
296
+ result.subcommand !== "review" &&
297
+ !result.runId) {
208
298
  return `error: /ideal ${result.subcommand} requires a runId\n\n${HELP_TEXT}`;
209
299
  }
210
300
  const payload = {