muonroi-cli 1.8.3 → 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 (477) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +133 -122
  3. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  4. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.d.ts +48 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  9. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  10. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  12. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  14. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  16. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  17. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  18. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  19. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  21. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  22. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  23. package/dist/src/agent-harness/mock-model.js +63 -1
  24. package/dist/src/agent-harness/test-spawn.js +31 -0
  25. package/dist/src/cli/config/screen-providers.js +1 -1
  26. package/dist/src/cli/cost-forensics.d.ts +10 -0
  27. package/dist/src/cli/cost-forensics.js +30 -15
  28. package/dist/src/cli/keys-bundle.d.ts +1 -1
  29. package/dist/src/cli/keys-bundle.js +1 -1
  30. package/dist/src/cli/keys.d.ts +2 -2
  31. package/dist/src/cli/keys.js +19 -81
  32. package/dist/src/council/clarifier.d.ts +28 -2
  33. package/dist/src/council/clarifier.js +81 -15
  34. package/dist/src/council/context.js +49 -15
  35. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  36. package/dist/src/council/debate-checkpoint.js +176 -0
  37. package/dist/src/council/debate-planner.js +51 -3
  38. package/dist/src/council/debate-summary.d.ts +25 -0
  39. package/dist/src/council/debate-summary.js +85 -0
  40. package/dist/src/council/debate.d.ts +169 -2
  41. package/dist/src/council/debate.js +1210 -134
  42. package/dist/src/council/index.d.ts +85 -1
  43. package/dist/src/council/index.js +634 -196
  44. package/dist/src/council/leader.d.ts +26 -0
  45. package/dist/src/council/leader.js +150 -9
  46. package/dist/src/council/llm.d.ts +32 -0
  47. package/dist/src/council/llm.js +231 -38
  48. package/dist/src/council/panel-select.d.ts +30 -0
  49. package/dist/src/council/panel-select.js +72 -0
  50. package/dist/src/council/planner.js +23 -0
  51. package/dist/src/council/preflight.d.ts +7 -0
  52. package/dist/src/council/preflight.js +14 -2
  53. package/dist/src/council/prompts.d.ts +30 -3
  54. package/dist/src/council/prompts.js +254 -84
  55. package/dist/src/council/stance-recall.d.ts +42 -0
  56. package/dist/src/council/stance-recall.js +57 -0
  57. package/dist/src/council/strip-think.d.ts +17 -0
  58. package/dist/src/council/strip-think.js +33 -0
  59. package/dist/src/council/types.d.ts +128 -0
  60. package/dist/src/ee/artifact-cache.d.ts +16 -0
  61. package/dist/src/ee/artifact-cache.js +32 -0
  62. package/dist/src/ee/auth.d.ts +1 -0
  63. package/dist/src/ee/auth.js +15 -2
  64. package/dist/src/ee/bridge.d.ts +10 -0
  65. package/dist/src/ee/bridge.js +58 -0
  66. package/dist/src/ee/client.js +81 -18
  67. package/dist/src/ee/export-transcripts.d.ts +1 -0
  68. package/dist/src/ee/export-transcripts.js +8 -10
  69. package/dist/src/ee/extract-session.js +29 -0
  70. package/dist/src/ee/extract-style.d.ts +58 -0
  71. package/dist/src/ee/extract-style.js +270 -0
  72. package/dist/src/ee/recall-ledger.d.ts +9 -0
  73. package/dist/src/ee/recall-ledger.js +3 -0
  74. package/dist/src/ee/scope.d.ts +1 -0
  75. package/dist/src/ee/scope.js +26 -1
  76. package/dist/src/ee/search.d.ts +7 -0
  77. package/dist/src/ee/search.js +24 -0
  78. package/dist/src/ee/transcript-emit.js +2 -0
  79. package/dist/src/ee/types.d.ts +22 -0
  80. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  81. package/dist/src/ee/who-am-i-brain.js +220 -0
  82. package/dist/src/ee/who-am-i.d.ts +10 -3
  83. package/dist/src/ee/who-am-i.js +12 -0
  84. package/dist/src/ee/workflow-event.d.ts +48 -0
  85. package/dist/src/ee/workflow-event.js +81 -0
  86. package/dist/src/flow/compaction/compress.d.ts +3 -3
  87. package/dist/src/flow/compaction/compress.js +45 -8
  88. package/dist/src/flow/compaction/extract.d.ts +4 -7
  89. package/dist/src/flow/compaction/extract.js +50 -10
  90. package/dist/src/flow/compaction/index.d.ts +13 -1
  91. package/dist/src/flow/compaction/index.js +70 -3
  92. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  93. package/dist/src/flow/compaction/input-guard.js +43 -0
  94. package/dist/src/flow/fold-planning.d.ts +36 -0
  95. package/dist/src/flow/fold-planning.js +83 -0
  96. package/dist/src/flow/hierarchy.d.ts +146 -0
  97. package/dist/src/flow/hierarchy.js +427 -0
  98. package/dist/src/flow/index.d.ts +1 -0
  99. package/dist/src/flow/index.js +2 -0
  100. package/dist/src/flow/run-artifacts.d.ts +102 -0
  101. package/dist/src/flow/run-artifacts.js +208 -0
  102. package/dist/src/generated/version.d.ts +1 -1
  103. package/dist/src/generated/version.js +1 -1
  104. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  105. package/dist/src/gsd/assessment-schema.js +134 -0
  106. package/dist/src/gsd/capability-registry.d.ts +45 -0
  107. package/dist/src/gsd/capability-registry.js +337 -0
  108. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  109. package/dist/src/gsd/complexity-assessor.js +152 -0
  110. package/dist/src/gsd/config-bridge.d.ts +7 -0
  111. package/dist/src/gsd/config-bridge.js +114 -0
  112. package/dist/src/gsd/config-loader.d.ts +27 -0
  113. package/dist/src/gsd/config-loader.js +50 -0
  114. package/dist/src/gsd/council-context.d.ts +44 -0
  115. package/dist/src/gsd/council-context.js +114 -0
  116. package/dist/src/gsd/ee-closure.d.ts +28 -0
  117. package/dist/src/gsd/ee-closure.js +49 -0
  118. package/dist/src/gsd/flags.d.ts +55 -0
  119. package/dist/src/gsd/flags.js +83 -0
  120. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  121. package/dist/src/gsd/gsd-dispatch.js +131 -0
  122. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  123. package/dist/src/gsd/gsd-runtime.js +37 -0
  124. package/dist/src/gsd/host-adapter.d.ts +11 -0
  125. package/dist/src/gsd/host-adapter.js +29 -0
  126. package/dist/src/gsd/index.d.ts +24 -1
  127. package/dist/src/gsd/index.js +27 -0
  128. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  129. package/dist/src/gsd/loop-host-contract.js +39 -0
  130. package/dist/src/gsd/loop-host.d.ts +69 -0
  131. package/dist/src/gsd/loop-host.js +245 -0
  132. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  133. package/dist/src/gsd/loop-resolver.js +79 -0
  134. package/dist/src/gsd/model-tier.d.ts +13 -0
  135. package/dist/src/gsd/model-tier.js +45 -0
  136. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  137. package/dist/src/gsd/mutation-gate.js +41 -0
  138. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  139. package/dist/src/gsd/native-roadmap.js +343 -0
  140. package/dist/src/gsd/native-state.d.ts +47 -0
  141. package/dist/src/gsd/native-state.js +220 -0
  142. package/dist/src/gsd/paths.d.ts +23 -0
  143. package/dist/src/gsd/paths.js +66 -0
  144. package/dist/src/gsd/phase-dag.d.ts +12 -0
  145. package/dist/src/gsd/phase-dag.js +94 -0
  146. package/dist/src/gsd/phase-sync.d.ts +42 -0
  147. package/dist/src/gsd/phase-sync.js +321 -0
  148. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  149. package/dist/src/gsd/pil-gate-context.js +64 -0
  150. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  151. package/dist/src/gsd/pil-gate-critic.js +74 -0
  152. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  153. package/dist/src/gsd/plan-council-prompts.js +79 -0
  154. package/dist/src/gsd/plan-council.d.ts +44 -0
  155. package/dist/src/gsd/plan-council.js +251 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  157. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  158. package/dist/src/gsd/product-workspace.d.ts +13 -0
  159. package/dist/src/gsd/product-workspace.js +124 -0
  160. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  161. package/dist/src/gsd/ship-bridge.js +65 -0
  162. package/dist/src/gsd/state-document.d.ts +40 -0
  163. package/dist/src/gsd/state-document.js +163 -0
  164. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  165. package/dist/src/gsd/verdict-schema.js +144 -0
  166. package/dist/src/gsd/verify-context.d.ts +22 -0
  167. package/dist/src/gsd/verify-context.js +27 -0
  168. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  169. package/dist/src/gsd/verify-council-prompts.js +85 -0
  170. package/dist/src/gsd/verify-council.d.ts +25 -0
  171. package/dist/src/gsd/verify-council.js +119 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  173. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  174. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  175. package/dist/src/gsd/workflow-engine.js +207 -0
  176. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  177. package/dist/src/gsd/workflow-tools.js +277 -0
  178. package/dist/src/hooks/index.js +1 -1
  179. package/dist/src/index.js +44 -11
  180. package/dist/src/maintain/pr-builder.js +23 -13
  181. package/dist/src/mcp/auto-setup.js +57 -32
  182. package/dist/src/mcp/client-pool.js +1 -1
  183. package/dist/src/mcp/ee-tools.js +1 -0
  184. package/dist/src/mcp/oauth-callback.js +2 -2
  185. package/dist/src/mcp/research-onboarding.js +8 -7
  186. package/dist/src/mcp/runtime.js +34 -2
  187. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  188. package/dist/src/mcp/setup-guide-text.js +77 -76
  189. package/dist/src/models/catalog-client.d.ts +87 -0
  190. package/dist/src/models/catalog-client.js +105 -38
  191. package/dist/src/models/catalog.json +528 -265
  192. package/dist/src/models/registry.d.ts +22 -7
  193. package/dist/src/models/registry.js +73 -10
  194. package/dist/src/ops/doctor.js +8 -8
  195. package/dist/src/orchestrator/auto-commit.js +1 -1
  196. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  197. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  198. package/dist/src/orchestrator/cache-prefix.js +83 -0
  199. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  200. package/dist/src/orchestrator/compact-request.js +41 -0
  201. package/dist/src/orchestrator/compaction.d.ts +10 -0
  202. package/dist/src/orchestrator/compaction.js +27 -7
  203. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  204. package/dist/src/orchestrator/council-manager.js +65 -24
  205. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  206. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  207. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  208. package/dist/src/orchestrator/error-utils.js +132 -24
  209. package/dist/src/orchestrator/grounding-check.js +39 -1
  210. package/dist/src/orchestrator/message-processor.js +242 -33
  211. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  212. package/dist/src/orchestrator/orchestrator.js +651 -102
  213. package/dist/src/orchestrator/preprocessor.js +1 -1
  214. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  215. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  216. package/dist/src/orchestrator/prompts.js +159 -159
  217. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  218. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  219. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  220. package/dist/src/orchestrator/retry-classifier.js +46 -2
  221. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  222. package/dist/src/orchestrator/safety-intercept.js +55 -0
  223. package/dist/src/orchestrator/scope-reminder.js +1 -1
  224. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  225. package/dist/src/orchestrator/session-experience.js +2 -1
  226. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  227. package/dist/src/orchestrator/should-run-gate.js +18 -0
  228. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  229. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  230. package/dist/src/orchestrator/stream-runner.js +62 -29
  231. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  232. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  233. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  234. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  235. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  236. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  237. package/dist/src/orchestrator/tool-engine.d.ts +26 -0
  238. package/dist/src/orchestrator/tool-engine.js +669 -56
  239. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  240. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  241. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  242. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  243. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  244. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  245. package/dist/src/pil/agent-operating-contract.js +1 -1
  246. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  247. package/dist/src/pil/cheap-model-playbook.js +5 -1
  248. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  249. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  250. package/dist/src/pil/discovery-types.d.ts +1 -0
  251. package/dist/src/pil/discovery.js +16 -11
  252. package/dist/src/pil/layer1-intent.d.ts +18 -6
  253. package/dist/src/pil/layer1-intent.js +66 -757
  254. package/dist/src/pil/layer15-context-scan.js +15 -1
  255. package/dist/src/pil/layer2_5-ponytail.js +8 -8
  256. package/dist/src/pil/layer3-ee-injection.js +23 -8
  257. package/dist/src/pil/layer4-gsd.js +69 -16
  258. package/dist/src/pil/layer5-context.js +7 -3
  259. package/dist/src/pil/layer6-output.d.ts +23 -0
  260. package/dist/src/pil/layer6-output.js +5 -1
  261. package/dist/src/pil/llm-classify.d.ts +33 -2
  262. package/dist/src/pil/llm-classify.js +123 -131
  263. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  264. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  265. package/dist/src/pil/pipeline.js +34 -2
  266. package/dist/src/pil/response-tools.js +5 -3
  267. package/dist/src/pil/schema.d.ts +1 -0
  268. package/dist/src/pil/schema.js +2 -0
  269. package/dist/src/pil/types.d.ts +18 -0
  270. package/dist/src/playbook/directives.d.ts +4 -0
  271. package/dist/src/playbook/directives.js +17 -5
  272. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  273. package/dist/src/product-loop/backlog-builder.js +30 -6
  274. package/dist/src/product-loop/discovery-context-format.js +3 -1
  275. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  276. package/dist/src/product-loop/discovery-interview.js +32 -3
  277. package/dist/src/product-loop/discovery-schema.js +5 -1
  278. package/dist/src/product-loop/done-gate.js +3 -3
  279. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  280. package/dist/src/product-loop/ideal-trace.js +64 -0
  281. package/dist/src/product-loop/index.d.ts +13 -1
  282. package/dist/src/product-loop/index.js +333 -52
  283. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  284. package/dist/src/product-loop/loop-driver.js +327 -116
  285. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  286. package/dist/src/product-loop/phase-plan.js +39 -2
  287. package/dist/src/product-loop/phase-runner.js +9 -1
  288. package/dist/src/product-loop/progress-snapshot.js +4 -4
  289. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  290. package/dist/src/product-loop/sprint-runner.js +559 -16
  291. package/dist/src/product-loop/types.d.ts +36 -5
  292. package/dist/src/providers/adapter.d.ts +1 -1
  293. package/dist/src/providers/adapter.js +3 -4
  294. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  295. package/dist/src/providers/auth/browser-flow.js +1 -1
  296. package/dist/src/providers/auth/openai-oauth.js +1 -1
  297. package/dist/src/providers/auth/registry.js +0 -34
  298. package/dist/src/providers/auth/token-store.js +4 -1
  299. package/dist/src/providers/auth/types.d.ts +1 -1
  300. package/dist/src/providers/auth/types.js +1 -1
  301. package/dist/src/providers/capabilities.d.ts +24 -5
  302. package/dist/src/providers/capabilities.js +42 -24
  303. package/dist/src/providers/endpoints.d.ts +2 -2
  304. package/dist/src/providers/endpoints.js +11 -10
  305. package/dist/src/providers/keychain.d.ts +1 -1
  306. package/dist/src/providers/keychain.js +7 -9
  307. package/dist/src/providers/mcp-vision-bridge.js +82 -172
  308. package/dist/src/providers/openai-compatible.js +8 -1
  309. package/dist/src/providers/pricing.d.ts +2 -2
  310. package/dist/src/providers/pricing.js +3 -13
  311. package/dist/src/providers/runtime.d.ts +27 -2
  312. package/dist/src/providers/runtime.js +78 -15
  313. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  314. package/dist/src/providers/strategies/base.strategy.js +24 -1
  315. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  316. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  317. package/dist/src/providers/strategies/registry.js +4 -4
  318. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  319. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  320. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  321. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  322. package/dist/src/providers/types.d.ts +5 -6
  323. package/dist/src/providers/types.js +2 -2
  324. package/dist/src/providers/vision-backend.d.ts +47 -0
  325. package/dist/src/providers/vision-backend.js +258 -0
  326. package/dist/src/providers/vision-proxy.d.ts +22 -9
  327. package/dist/src/providers/vision-proxy.js +63 -132
  328. package/dist/src/providers/wire-debug.js +95 -0
  329. package/dist/src/reporter/index.js +1 -1
  330. package/dist/src/router/decide.d.ts +13 -0
  331. package/dist/src/router/decide.js +138 -36
  332. package/dist/src/router/peak-hour.d.ts +38 -0
  333. package/dist/src/router/peak-hour.js +107 -0
  334. package/dist/src/router/step-router.js +3 -2
  335. package/dist/src/router/warm.js +4 -5
  336. package/dist/src/scaffold/bb-ecosystem-apply.js +47 -47
  337. package/dist/src/scaffold/bb-quality-gate.js +5 -5
  338. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  339. package/dist/src/scaffold/continuation-prompt.js +86 -60
  340. package/dist/src/scaffold/init-new.js +453 -453
  341. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  342. package/dist/src/scaffold/point-to-existing.js +25 -0
  343. package/dist/src/self-qa/agentic-loop.js +22 -22
  344. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  345. package/dist/src/{ui/state → state}/active-run.js +21 -0
  346. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  347. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  348. package/dist/src/state/turn-trace.d.ts +43 -0
  349. package/dist/src/state/turn-trace.js +32 -0
  350. package/dist/src/storage/db.js +2 -1
  351. package/dist/src/storage/index.d.ts +1 -1
  352. package/dist/src/storage/index.js +1 -1
  353. package/dist/src/storage/interaction-log.d.ts +1 -1
  354. package/dist/src/storage/interaction-log.js +5 -5
  355. package/dist/src/storage/migrations.js +196 -126
  356. package/dist/src/storage/session-experience-store.js +4 -4
  357. package/dist/src/storage/sessions.d.ts +28 -10
  358. package/dist/src/storage/sessions.js +112 -55
  359. package/dist/src/storage/transcript-view.js +1 -1
  360. package/dist/src/storage/transcript.d.ts +51 -0
  361. package/dist/src/storage/transcript.js +383 -112
  362. package/dist/src/storage/usage.js +14 -14
  363. package/dist/src/storage/workspaces.js +12 -12
  364. package/dist/src/tools/file.d.ts +15 -0
  365. package/dist/src/tools/file.js +32 -0
  366. package/dist/src/tools/native-tools.js +5 -0
  367. package/dist/src/tools/registry.d.ts +3 -0
  368. package/dist/src/tools/registry.js +460 -22
  369. package/dist/src/tools/research.d.ts +29 -0
  370. package/dist/src/tools/research.js +233 -0
  371. package/dist/src/types/index.d.ts +118 -3
  372. package/dist/src/ui/app.js +0 -0
  373. package/dist/src/ui/cards/product-status-card.js +1 -1
  374. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  375. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  376. package/dist/src/ui/components/context-rail.d.ts +26 -0
  377. package/dist/src/ui/components/context-rail.js +33 -0
  378. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  379. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  380. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  381. package/dist/src/ui/components/council-debate-pill.js +34 -0
  382. package/dist/src/ui/components/council-info-card.js +2 -2
  383. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  384. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  385. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  386. package/dist/src/ui/components/council-message-bubble.js +16 -15
  387. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  388. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  389. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  390. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  391. package/dist/src/ui/components/council-question-card.js +12 -12
  392. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  393. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  394. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  395. package/dist/src/ui/components/council-round-group.js +88 -0
  396. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  397. package/dist/src/ui/components/council-status-list.js +36 -24
  398. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  399. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  400. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  401. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  402. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  403. package/dist/src/ui/components/prompt-box.js +18 -16
  404. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  405. package/dist/src/ui/components/session-tree-card.js +46 -0
  406. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  407. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  408. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  409. package/dist/src/ui/components/task-list-panel.js +22 -2
  410. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  411. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  412. package/dist/src/ui/mcp-modal.js +2 -4
  413. package/dist/src/ui/modals/api-key-modal.js +1 -1
  414. package/dist/src/ui/modals/connect-modal.js +4 -3
  415. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  416. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  417. package/dist/src/ui/picker-providers.d.ts +1 -1
  418. package/dist/src/ui/picker-providers.js +1 -1
  419. package/dist/src/ui/primitives/index.d.ts +1 -0
  420. package/dist/src/ui/primitives/index.js +2 -0
  421. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  422. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  423. package/dist/src/ui/slash/compact.js +5 -7
  424. package/dist/src/ui/slash/cost.js +1 -1
  425. package/dist/src/ui/slash/council-inspect.js +4 -4
  426. package/dist/src/ui/slash/council.js +19 -1
  427. package/dist/src/ui/slash/debug.d.ts +3 -31
  428. package/dist/src/ui/slash/debug.js +9 -20
  429. package/dist/src/ui/slash/ideal.d.ts +6 -2
  430. package/dist/src/ui/slash/ideal.js +97 -7
  431. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  432. package/dist/src/ui/slash/menu-items.js +12 -18
  433. package/dist/src/ui/slash/registry.d.ts +2 -0
  434. package/dist/src/ui/slash/registry.js +4 -0
  435. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  436. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  437. package/dist/src/ui/status-bar/index.d.ts +1 -1
  438. package/dist/src/ui/status-bar/index.js +7 -3
  439. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  440. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  441. package/dist/src/ui/theme.d.ts +1 -0
  442. package/dist/src/ui/theme.js +2 -0
  443. package/dist/src/ui/types.d.ts +7 -0
  444. package/dist/src/ui/use-app-logic.js +0 -0
  445. package/dist/src/ui/utils/format.d.ts +14 -0
  446. package/dist/src/ui/utils/format.js +23 -3
  447. package/dist/src/usage/downgrade.js +2 -2
  448. package/dist/src/usage/product-ledger.js +2 -2
  449. package/dist/src/utils/clipboard-image.js +23 -23
  450. package/dist/src/utils/install-manager.js +14 -11
  451. package/dist/src/utils/logger.js +2 -2
  452. package/dist/src/utils/permission-mode.js +5 -3
  453. package/dist/src/utils/redactor.js +1 -1
  454. package/dist/src/utils/settings.d.ts +153 -5
  455. package/dist/src/utils/settings.js +233 -29
  456. package/dist/src/utils/side-question.js +2 -2
  457. package/dist/src/utils/skills.js +3 -3
  458. package/dist/src/utils/visible-retry.d.ts +11 -0
  459. package/dist/src/utils/visible-retry.js +10 -1
  460. package/dist/src/verify/entrypoint.d.ts +1 -1
  461. package/dist/src/verify/entrypoint.js +1 -1
  462. package/dist/src/verify/recipes.d.ts +13 -0
  463. package/dist/src/verify/recipes.js +15 -0
  464. package/package.json +135 -132
  465. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  466. package/dist/src/providers/auth/gcloud.js +0 -102
  467. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  468. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  469. package/dist/src/providers/gemini.d.ts +0 -11
  470. package/dist/src/providers/gemini.js +0 -45
  471. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  472. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  473. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  474. package/dist/src/providers/strategies/google.strategy.js +0 -174
  475. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  476. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  477. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -33,11 +33,37 @@ export interface LeaderResolution {
33
33
  /** Set when no configured leader existed and one was picked by tier. */
34
34
  defaulted?: boolean;
35
35
  }
36
+ /** Plan-council leader — always premium-tier within session provider (telemetry: plan-council). */
37
+ export declare function resolvePlanCouncilLeader(sessionModelId: string): Promise<LeaderResolution>;
36
38
  export declare function resolveLeaderModelDetailed(sessionModelId: string): Promise<LeaderResolution>;
37
39
  /** Back-compat sync wrapper. Returns the modelId only; no reachability check. */
38
40
  export declare function resolveLeaderModel(sessionModelId: string): string;
39
41
  export declare function hasMultiProviderConfig(roleModels: Partial<Record<ModelRole, string>>): boolean;
42
+ /**
43
+ * Count debate roles available for auto-council gating.
44
+ * Uses explicit roleModels when ≥2 configured; otherwise catalog council slots.
45
+ */
46
+ export declare function getEffectiveCouncilRoleCount(): number;
40
47
  export declare function resolveParticipants(sessionModelId: string, preferMultiProvider: boolean): Promise<Array<{
41
48
  role: ModelRole;
42
49
  model: string;
43
50
  }>>;
51
+ /** A model the leader may pick for a task-aware debate panel (U3). */
52
+ export interface CouncilCandidate {
53
+ model: string;
54
+ tier?: string;
55
+ provider?: string;
56
+ roles?: string[];
57
+ description: string;
58
+ }
59
+ /**
60
+ * Build the pool of models the leader may choose from when assembling a
61
+ * task-aware panel (U3). Seeded with the default roster (guaranteed reachable),
62
+ * then expanded with other reachable, routable models on the same providers.
63
+ * Capped so the selection prompt stays bounded. Never throws — a provider probe
64
+ * failure simply yields a smaller pool, and the caller falls back to the roster.
65
+ */
66
+ export declare function buildCouncilCandidatePool(defaultRoster: Array<{
67
+ role: ModelRole;
68
+ model: string;
69
+ }>): Promise<CouncilCandidate[]>;
@@ -1,6 +1,8 @@
1
- import { getModelByTier, getModelInfo, getModelsForProvider } from "../models/registry.js";
1
+ import { resolveGsdPremiumModel } from "../gsd/model-tier.js";
2
+ import { getCatalogCouncilRouting, getModelInfo, getModelsForProvider } from "../models/registry.js";
2
3
  import { getConfiguredProviders } from "../providers/keychain.js";
3
4
  import { detectProviderForModel } from "../providers/runtime.js";
5
+ import { getRoutedModelByTier } from "../router/peak-hour.js";
4
6
  import { getRoleModel, getRoleModels, isProviderDisabled } from "../utils/settings.js";
5
7
  const TIER_RANK = { fast: 1, balanced: 2, premium: 3 };
6
8
  function tierOf(modelId) {
@@ -51,7 +53,7 @@ export function pickCouncilTaskModel(task, leaderModelId, costAware) {
51
53
  catch {
52
54
  return leaderModelId;
53
55
  }
54
- const candidate = getModelByTier(targetTier, leaderProvider);
56
+ const candidate = getRoutedModelByTier(targetTier, leaderProvider);
55
57
  // Only accept a candidate that's on the same provider as the leader.
56
58
  // getModelByTier may fall back to "any provider" — reject that to avoid
57
59
  // billing surprises and silent key-misses.
@@ -94,6 +96,29 @@ async function isProviderReachable(provider) {
94
96
  const configured = await getConfiguredProviders();
95
97
  return configured.includes(provider);
96
98
  }
99
+ /** Plan-council leader — always premium-tier within session provider (telemetry: plan-council). */
100
+ export async function resolvePlanCouncilLeader(sessionModelId) {
101
+ const sessionProviderId = detectProviderForModel(sessionModelId);
102
+ const sessionDisabled = isProviderDisabled(sessionProviderId);
103
+ const sessionReachable = !sessionDisabled && (await isProviderReachable(sessionProviderId));
104
+ if (!sessionReachable) {
105
+ return { modelId: getRoleModel("leader") ?? sessionModelId };
106
+ }
107
+ const catalogLeader = getModelsForProvider(sessionProviderId).find((m) => m.roles?.includes("leader"));
108
+ if (catalogLeader) {
109
+ return { modelId: catalogLeader.id };
110
+ }
111
+ const premiumId = resolveGsdPremiumModel(sessionModelId);
112
+ const sessionTier = tierOf(sessionModelId);
113
+ const premiumTier = tierOf(premiumId);
114
+ if (premiumId !== sessionModelId && premiumTier && sessionTier && TIER_RANK[premiumTier] > TIER_RANK[sessionTier]) {
115
+ return { modelId: premiumId, promotedFrom: { modelId: sessionModelId, tier: sessionTier } };
116
+ }
117
+ if (premiumId !== sessionModelId) {
118
+ return { modelId: premiumId, defaulted: true };
119
+ }
120
+ return { modelId: sessionModelId, defaulted: true };
121
+ }
97
122
  export async function resolveLeaderModelDetailed(sessionModelId) {
98
123
  const sessionProviderId = detectProviderForModel(sessionModelId);
99
124
  const configured = getRoleModel("leader");
@@ -104,6 +129,13 @@ export async function resolveLeaderModelDetailed(sessionModelId) {
104
129
  if (!sessionReachable) {
105
130
  return { modelId: configured ?? sessionModelId };
106
131
  }
132
+ // 1. If not manually configured, and session provider has a catalog model with "leader" role, use it!
133
+ if (!configured) {
134
+ const catalogLeader = getModelsForProvider(sessionProviderId).find((m) => m.roles?.includes("leader"));
135
+ if (catalogLeader) {
136
+ return { modelId: catalogLeader.id };
137
+ }
138
+ }
107
139
  // Build candidate set ON THE SESSION PROVIDER ONLY.
108
140
  const candidates = new Map();
109
141
  for (const m of getModelsForProvider(sessionProviderId)) {
@@ -146,11 +178,14 @@ export async function resolveLeaderModelDetailed(sessionModelId) {
146
178
  promotedFrom: { modelId: configured, tier: configuredTier },
147
179
  };
148
180
  }
149
- // No usable configured leader use the session model itself. We intentionally
150
- // do NOT silently promote to the highest-tier model on the provider: the
151
- // user's account/key may not have access to that tier (e.g. SiliconFlow Pro),
152
- // which would cause 401s on every leader call. Tier-upgrade is a deliberate
153
- // choice opt in by setting roleModels.leader in config.
181
+ // Fallback: no configured leader AND the provider tags no model with the
182
+ // "leader" role. Promoting the leader to the provider's highest tier IS the
183
+ // intended design, but only when there's an EXPLICIT signal for it — a catalog
184
+ // model tagged role:"leader" (handled at the top of this function) or a
185
+ // configured roleModels.leader (promoted up to the best tier above). With
186
+ // neither signal we do NOT guess a top-tier model here: an arbitrary *-pro the
187
+ // key isn't entitled to would 401 on every leader call. So we keep the session
188
+ // model itself.
154
189
  return { modelId: sessionModelId, defaulted: true };
155
190
  }
156
191
  /** Back-compat sync wrapper. Returns the modelId only; no reachability check. */
@@ -158,6 +193,10 @@ export function resolveLeaderModel(sessionModelId) {
158
193
  const configured = getRoleModel("leader");
159
194
  if (configured)
160
195
  return configured;
196
+ const sessionProviderId = detectProviderForModel(sessionModelId);
197
+ const catalogLeader = getModelsForProvider(sessionProviderId).find((m) => m.roles?.includes("leader"));
198
+ if (catalogLeader)
199
+ return catalogLeader.id;
161
200
  // See resolveLeaderModelDetailed for why we no longer silently upgrade to
162
201
  // the premium tier on the session provider (user may not have access).
163
202
  return sessionModelId;
@@ -170,6 +209,56 @@ export function hasMultiProviderConfig(roleModels) {
170
209
  }
171
210
  return providers.size >= 2;
172
211
  }
212
+ /**
213
+ * Count debate roles available for auto-council gating.
214
+ * Uses explicit roleModels when ≥2 configured; otherwise catalog council slots.
215
+ */
216
+ export function getEffectiveCouncilRoleCount() {
217
+ const explicit = Object.values(getRoleModels()).filter(Boolean).length;
218
+ if (explicit >= 2)
219
+ return explicit;
220
+ const catalog = getCatalogCouncilRouting();
221
+ if (catalog?.participants?.length && catalog.participants.length >= 2) {
222
+ return catalog.participants.length;
223
+ }
224
+ return explicit;
225
+ }
226
+ async function resolveCatalogCouncilParticipants() {
227
+ const config = getCatalogCouncilRouting();
228
+ if (!config?.participants?.length)
229
+ return [];
230
+ const candidates = [];
231
+ const usedModels = new Set();
232
+ for (const slot of config.participants) {
233
+ const role = slot.role;
234
+ const provider = slot.provider;
235
+ if (isProviderDisabled(provider))
236
+ continue;
237
+ if (!(await isProviderReachable(provider)))
238
+ continue;
239
+ let modelId;
240
+ if (slot.model_id) {
241
+ const info = getModelInfo(slot.model_id);
242
+ if (info?.provider === provider)
243
+ modelId = slot.model_id;
244
+ }
245
+ if (!modelId && slot.tier) {
246
+ const m = getRoutedModelByTier(slot.tier, provider);
247
+ if (m?.provider === provider)
248
+ modelId = m.id;
249
+ }
250
+ if (!modelId) {
251
+ const models = getModelsForProvider(provider);
252
+ const routable = models.find((m) => m.tierRouting !== false);
253
+ modelId = routable?.id ?? models[0]?.id;
254
+ }
255
+ if (!modelId || usedModels.has(modelId))
256
+ continue;
257
+ candidates.push({ role, model: modelId });
258
+ usedModels.add(modelId);
259
+ }
260
+ return candidates.length >= 2 ? candidates : [];
261
+ }
173
262
  export async function resolveParticipants(sessionModelId, preferMultiProvider) {
174
263
  const ALL_ROLES = ["implement", "verify", "research"];
175
264
  const candidates = [];
@@ -190,6 +279,12 @@ export async function resolveParticipants(sessionModelId, preferMultiProvider) {
190
279
  if (candidates.length >= 2)
191
280
  return candidates;
192
281
  }
282
+ // Catalog-defined multi-provider lineup (default for deepseek+zai+opencode-go+xai stack).
283
+ if (preferMultiProvider) {
284
+ const catalogCandidates = await resolveCatalogCouncilParticipants();
285
+ if (catalogCandidates.length >= 2)
286
+ return catalogCandidates;
287
+ }
193
288
  const mainProviderId = detectProviderForModel(sessionModelId);
194
289
  // Skip same-provider resolution if the provider is disabled
195
290
  if (!isProviderDisabled(mainProviderId)) {
@@ -204,6 +299,49 @@ export async function resolveParticipants(sessionModelId, preferMultiProvider) {
204
299
  }
205
300
  return [];
206
301
  }
302
+ /**
303
+ * Build the pool of models the leader may choose from when assembling a
304
+ * task-aware panel (U3). Seeded with the default roster (guaranteed reachable),
305
+ * then expanded with other reachable, routable models on the same providers.
306
+ * Capped so the selection prompt stays bounded. Never throws — a provider probe
307
+ * failure simply yields a smaller pool, and the caller falls back to the roster.
308
+ */
309
+ export async function buildCouncilCandidatePool(defaultRoster) {
310
+ const byId = new Map();
311
+ const add = (modelId) => {
312
+ if (!modelId || byId.has(modelId))
313
+ return;
314
+ const info = getModelInfo(modelId);
315
+ byId.set(modelId, {
316
+ model: modelId,
317
+ tier: info?.tier,
318
+ provider: info?.provider ?? detectProviderForModel(modelId),
319
+ roles: info?.roles,
320
+ description: info?.description ?? "",
321
+ });
322
+ };
323
+ for (const r of defaultRoster)
324
+ add(r.model);
325
+ const providers = new Set();
326
+ for (const r of defaultRoster)
327
+ providers.add(detectProviderForModel(r.model));
328
+ for (const provider of providers) {
329
+ if (byId.size >= 8)
330
+ break;
331
+ if (isProviderDisabled(provider))
332
+ continue;
333
+ if (!(await isProviderReachable(provider)))
334
+ continue;
335
+ for (const m of getModelsForProvider(provider)) {
336
+ if (m.tierRouting === false)
337
+ continue;
338
+ add(m.id);
339
+ if (byId.size >= 8)
340
+ break;
341
+ }
342
+ }
343
+ return [...byId.values()];
344
+ }
207
345
  async function resolveSameProviderCandidates(providerId, sessionModelId, roles) {
208
346
  if (isProviderDisabled(providerId))
209
347
  return [];
@@ -222,8 +360,11 @@ async function resolveSameProviderCandidates(providerId, sessionModelId, roles)
222
360
  const usedModels = new Set();
223
361
  const candidates = [];
224
362
  for (const role of roles) {
225
- const prefs = tierPreference[role] ?? ["balanced", "fast", "premium"];
226
- let picked = providerModels.find((m) => prefs.some((t) => m.tier === t) && !usedModels.has(m.id));
363
+ let picked = providerModels.find((m) => m.roles?.includes(role) && !usedModels.has(m.id));
364
+ if (!picked) {
365
+ const prefs = tierPreference[role] ?? ["balanced", "fast", "premium"];
366
+ picked = providerModels.find((m) => prefs.some((t) => m.tier === t) && !usedModels.has(m.id));
367
+ }
227
368
  if (!picked)
228
369
  picked = providerModels.find((m) => !usedModels.has(m.id));
229
370
  if (!picked)
@@ -1,6 +1,27 @@
1
1
  import type { BashTool } from "../tools/bash.js";
2
2
  import type { AgentMode, CouncilStatusPhase, StreamChunk } from "../types/index.js";
3
3
  import type { CouncilLLM, CouncilStats } from "./types.js";
4
+ /**
5
+ * Record a council LLM call into the `usage_events` table with source="council".
6
+ *
7
+ * This is the SINGLE source of truth for council usage accounting: it fires from
8
+ * inside every council generate/debate/research call so ALL council entry points
9
+ * (the /council slash path, auto-council, and every /ideal phase — clarifier,
10
+ * research, generate, sprint) land in usage_events. Before this existed, only
11
+ * the loop-driver's `runDebate` call site externally wrapped usage recording, so
12
+ * `runCouncilV2` (/council + auto-council) and the non-debate /ideal phases never
13
+ * recorded — their token cost was invisible to session totals, the StatusBar,
14
+ * `usage forensics`, and the cost caps (root cause of session f24c28b6dcb3:
15
+ * council ran but produced 0 source="council" usage_events).
16
+ *
17
+ * Best-effort: a null sessionId (no chat session FK) or a DB failure must never
18
+ * break the council run, but per the No-Silent-Catch rule we log the failure.
19
+ */
20
+ export declare function recordCouncilUsage(sessionId: string | undefined, modelId: string, usage: {
21
+ inputTokens: number;
22
+ outputTokens: number;
23
+ cachedInputTokens: number;
24
+ }): void;
4
25
  declare global {
5
26
  var __muonroiMockLlm: any;
6
27
  }
@@ -24,6 +45,17 @@ interface TracedGenerateArgs {
24
45
  * Returns the generated text via the AsyncGenerator return value.
25
46
  */
26
47
  export declare function tracedGenerate(llm: CouncilLLM, args: TracedGenerateArgs): AsyncGenerator<StreamChunk, string, unknown>;
48
+ /**
49
+ * Run {@link tracedGenerate} across a list of models, returning the first
50
+ * non-empty completion. A model that throws (e.g. a flaky proxy returning
51
+ * "Upstream request failed") or yields only whitespace advances to the next
52
+ * candidate; fallback attempts are labelled so the timeline shows the retry.
53
+ * Returns null when every candidate fails — the caller decides the degraded
54
+ * fallback (e.g. a single-criterion spec). Dedupes the model list in order.
55
+ */
56
+ export declare function tracedGenerateWithFallback(llm: CouncilLLM, args: Omit<TracedGenerateArgs, "modelId"> & {
57
+ models: string[];
58
+ }): AsyncGenerator<StreamChunk, string | null, unknown>;
27
59
  interface TracedAsyncArgs {
28
60
  phase: CouncilStatusPhase;
29
61
  label: string;