muonroi-cli 1.8.4 → 1.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-tee.d.ts +48 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  6. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  8. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  9. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  10. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  12. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  14. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  16. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  17. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  18. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  19. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  21. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  22. package/dist/src/agent-harness/mock-model.js +63 -1
  23. package/dist/src/agent-harness/test-spawn.js +31 -0
  24. package/dist/src/cli/config/screen-providers.js +1 -1
  25. package/dist/src/cli/cost-forensics.d.ts +10 -0
  26. package/dist/src/cli/cost-forensics.js +18 -3
  27. package/dist/src/cli/keys-bundle.d.ts +1 -1
  28. package/dist/src/cli/keys-bundle.js +1 -1
  29. package/dist/src/cli/keys.d.ts +2 -2
  30. package/dist/src/cli/keys.js +19 -81
  31. package/dist/src/council/clarifier.d.ts +28 -2
  32. package/dist/src/council/clarifier.js +81 -15
  33. package/dist/src/council/context.js +49 -15
  34. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  35. package/dist/src/council/debate-checkpoint.js +176 -0
  36. package/dist/src/council/debate-planner.js +51 -3
  37. package/dist/src/council/debate-summary.d.ts +25 -0
  38. package/dist/src/council/debate-summary.js +85 -0
  39. package/dist/src/council/debate.d.ts +169 -2
  40. package/dist/src/council/debate.js +1210 -134
  41. package/dist/src/council/index.d.ts +85 -1
  42. package/dist/src/council/index.js +634 -196
  43. package/dist/src/council/leader.d.ts +26 -0
  44. package/dist/src/council/leader.js +150 -9
  45. package/dist/src/council/llm.d.ts +32 -0
  46. package/dist/src/council/llm.js +231 -38
  47. package/dist/src/council/panel-select.d.ts +30 -0
  48. package/dist/src/council/panel-select.js +72 -0
  49. package/dist/src/council/planner.js +23 -0
  50. package/dist/src/council/preflight.d.ts +7 -0
  51. package/dist/src/council/preflight.js +14 -2
  52. package/dist/src/council/prompts.d.ts +30 -3
  53. package/dist/src/council/prompts.js +234 -64
  54. package/dist/src/council/stance-recall.d.ts +42 -0
  55. package/dist/src/council/stance-recall.js +57 -0
  56. package/dist/src/council/strip-think.d.ts +17 -0
  57. package/dist/src/council/strip-think.js +33 -0
  58. package/dist/src/council/types.d.ts +128 -0
  59. package/dist/src/ee/artifact-cache.d.ts +16 -0
  60. package/dist/src/ee/artifact-cache.js +32 -0
  61. package/dist/src/ee/auth.d.ts +1 -0
  62. package/dist/src/ee/auth.js +15 -2
  63. package/dist/src/ee/bridge.d.ts +10 -0
  64. package/dist/src/ee/bridge.js +58 -0
  65. package/dist/src/ee/client.js +81 -18
  66. package/dist/src/ee/export-transcripts.d.ts +1 -0
  67. package/dist/src/ee/export-transcripts.js +8 -10
  68. package/dist/src/ee/extract-session.js +29 -0
  69. package/dist/src/ee/extract-style.d.ts +58 -0
  70. package/dist/src/ee/extract-style.js +270 -0
  71. package/dist/src/ee/recall-ledger.d.ts +9 -0
  72. package/dist/src/ee/recall-ledger.js +3 -0
  73. package/dist/src/ee/scope.d.ts +1 -0
  74. package/dist/src/ee/scope.js +26 -1
  75. package/dist/src/ee/search.d.ts +7 -0
  76. package/dist/src/ee/search.js +24 -0
  77. package/dist/src/ee/transcript-emit.js +2 -0
  78. package/dist/src/ee/types.d.ts +22 -0
  79. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  80. package/dist/src/ee/who-am-i-brain.js +220 -0
  81. package/dist/src/ee/who-am-i.d.ts +10 -3
  82. package/dist/src/ee/who-am-i.js +12 -0
  83. package/dist/src/ee/workflow-event.d.ts +48 -0
  84. package/dist/src/ee/workflow-event.js +81 -0
  85. package/dist/src/flow/compaction/compress.d.ts +3 -3
  86. package/dist/src/flow/compaction/compress.js +45 -8
  87. package/dist/src/flow/compaction/extract.d.ts +4 -7
  88. package/dist/src/flow/compaction/extract.js +50 -10
  89. package/dist/src/flow/compaction/index.d.ts +13 -1
  90. package/dist/src/flow/compaction/index.js +70 -3
  91. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  92. package/dist/src/flow/compaction/input-guard.js +43 -0
  93. package/dist/src/flow/fold-planning.d.ts +36 -0
  94. package/dist/src/flow/fold-planning.js +83 -0
  95. package/dist/src/flow/hierarchy.d.ts +146 -0
  96. package/dist/src/flow/hierarchy.js +427 -0
  97. package/dist/src/flow/index.d.ts +1 -0
  98. package/dist/src/flow/index.js +2 -0
  99. package/dist/src/flow/run-artifacts.d.ts +102 -0
  100. package/dist/src/flow/run-artifacts.js +208 -0
  101. package/dist/src/generated/version.d.ts +1 -1
  102. package/dist/src/generated/version.js +1 -1
  103. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  104. package/dist/src/gsd/assessment-schema.js +134 -0
  105. package/dist/src/gsd/capability-registry.d.ts +45 -0
  106. package/dist/src/gsd/capability-registry.js +337 -0
  107. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  108. package/dist/src/gsd/complexity-assessor.js +152 -0
  109. package/dist/src/gsd/config-bridge.d.ts +7 -0
  110. package/dist/src/gsd/config-bridge.js +114 -0
  111. package/dist/src/gsd/config-loader.d.ts +27 -0
  112. package/dist/src/gsd/config-loader.js +50 -0
  113. package/dist/src/gsd/council-context.d.ts +44 -0
  114. package/dist/src/gsd/council-context.js +114 -0
  115. package/dist/src/gsd/ee-closure.d.ts +28 -0
  116. package/dist/src/gsd/ee-closure.js +49 -0
  117. package/dist/src/gsd/flags.d.ts +55 -0
  118. package/dist/src/gsd/flags.js +83 -0
  119. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  120. package/dist/src/gsd/gsd-dispatch.js +131 -0
  121. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  122. package/dist/src/gsd/gsd-runtime.js +37 -0
  123. package/dist/src/gsd/host-adapter.d.ts +11 -0
  124. package/dist/src/gsd/host-adapter.js +29 -0
  125. package/dist/src/gsd/index.d.ts +24 -1
  126. package/dist/src/gsd/index.js +27 -0
  127. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  128. package/dist/src/gsd/loop-host-contract.js +39 -0
  129. package/dist/src/gsd/loop-host.d.ts +69 -0
  130. package/dist/src/gsd/loop-host.js +245 -0
  131. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  132. package/dist/src/gsd/loop-resolver.js +79 -0
  133. package/dist/src/gsd/model-tier.d.ts +13 -0
  134. package/dist/src/gsd/model-tier.js +45 -0
  135. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  136. package/dist/src/gsd/mutation-gate.js +41 -0
  137. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  138. package/dist/src/gsd/native-roadmap.js +343 -0
  139. package/dist/src/gsd/native-state.d.ts +47 -0
  140. package/dist/src/gsd/native-state.js +220 -0
  141. package/dist/src/gsd/paths.d.ts +23 -0
  142. package/dist/src/gsd/paths.js +66 -0
  143. package/dist/src/gsd/phase-dag.d.ts +12 -0
  144. package/dist/src/gsd/phase-dag.js +94 -0
  145. package/dist/src/gsd/phase-sync.d.ts +42 -0
  146. package/dist/src/gsd/phase-sync.js +321 -0
  147. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  148. package/dist/src/gsd/pil-gate-context.js +64 -0
  149. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  150. package/dist/src/gsd/pil-gate-critic.js +74 -0
  151. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  152. package/dist/src/gsd/plan-council-prompts.js +79 -0
  153. package/dist/src/gsd/plan-council.d.ts +44 -0
  154. package/dist/src/gsd/plan-council.js +251 -0
  155. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  157. package/dist/src/gsd/product-workspace.d.ts +13 -0
  158. package/dist/src/gsd/product-workspace.js +124 -0
  159. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  160. package/dist/src/gsd/ship-bridge.js +65 -0
  161. package/dist/src/gsd/state-document.d.ts +40 -0
  162. package/dist/src/gsd/state-document.js +163 -0
  163. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  164. package/dist/src/gsd/verdict-schema.js +144 -0
  165. package/dist/src/gsd/verify-context.d.ts +22 -0
  166. package/dist/src/gsd/verify-context.js +27 -0
  167. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  168. package/dist/src/gsd/verify-council-prompts.js +85 -0
  169. package/dist/src/gsd/verify-council.d.ts +25 -0
  170. package/dist/src/gsd/verify-council.js +119 -0
  171. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  173. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  174. package/dist/src/gsd/workflow-engine.js +207 -0
  175. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  176. package/dist/src/gsd/workflow-tools.js +277 -0
  177. package/dist/src/hooks/index.js +1 -1
  178. package/dist/src/index.js +44 -11
  179. package/dist/src/maintain/pr-builder.js +23 -13
  180. package/dist/src/mcp/auto-setup.js +57 -32
  181. package/dist/src/mcp/client-pool.js +1 -1
  182. package/dist/src/mcp/ee-tools.js +1 -0
  183. package/dist/src/mcp/research-onboarding.js +8 -7
  184. package/dist/src/mcp/runtime.js +34 -2
  185. package/dist/src/models/catalog-client.d.ts +87 -0
  186. package/dist/src/models/catalog-client.js +105 -38
  187. package/dist/src/models/catalog.json +528 -265
  188. package/dist/src/models/registry.d.ts +22 -7
  189. package/dist/src/models/registry.js +73 -10
  190. package/dist/src/ops/doctor.js +1 -1
  191. package/dist/src/orchestrator/auto-commit.js +1 -1
  192. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  193. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  194. package/dist/src/orchestrator/cache-prefix.js +83 -0
  195. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  196. package/dist/src/orchestrator/compact-request.js +41 -0
  197. package/dist/src/orchestrator/compaction.d.ts +10 -0
  198. package/dist/src/orchestrator/compaction.js +27 -7
  199. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  200. package/dist/src/orchestrator/council-manager.js +65 -24
  201. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  202. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  203. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  204. package/dist/src/orchestrator/error-utils.js +132 -24
  205. package/dist/src/orchestrator/grounding-check.js +39 -1
  206. package/dist/src/orchestrator/message-processor.js +242 -33
  207. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  208. package/dist/src/orchestrator/orchestrator.js +651 -102
  209. package/dist/src/orchestrator/preprocessor.js +1 -1
  210. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  211. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  212. package/dist/src/orchestrator/prompts.js +17 -17
  213. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  214. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  215. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  216. package/dist/src/orchestrator/retry-classifier.js +46 -2
  217. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  218. package/dist/src/orchestrator/safety-intercept.js +55 -0
  219. package/dist/src/orchestrator/scope-reminder.js +1 -1
  220. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  221. package/dist/src/orchestrator/session-experience.js +2 -1
  222. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  223. package/dist/src/orchestrator/should-run-gate.js +18 -0
  224. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  225. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  226. package/dist/src/orchestrator/stream-runner.js +62 -29
  227. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  228. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  229. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  230. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  231. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  232. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  233. package/dist/src/orchestrator/tool-engine.d.ts +22 -0
  234. package/dist/src/orchestrator/tool-engine.js +620 -56
  235. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  236. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  237. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  238. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  239. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  240. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  241. package/dist/src/pil/agent-operating-contract.js +1 -1
  242. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  243. package/dist/src/pil/cheap-model-playbook.js +5 -1
  244. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  245. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  246. package/dist/src/pil/discovery-types.d.ts +1 -0
  247. package/dist/src/pil/discovery.js +16 -11
  248. package/dist/src/pil/layer1-intent.d.ts +18 -6
  249. package/dist/src/pil/layer1-intent.js +66 -757
  250. package/dist/src/pil/layer15-context-scan.js +15 -1
  251. package/dist/src/pil/layer3-ee-injection.js +23 -8
  252. package/dist/src/pil/layer4-gsd.js +69 -16
  253. package/dist/src/pil/layer5-context.js +7 -3
  254. package/dist/src/pil/layer6-output.d.ts +23 -0
  255. package/dist/src/pil/layer6-output.js +5 -1
  256. package/dist/src/pil/llm-classify.d.ts +33 -2
  257. package/dist/src/pil/llm-classify.js +123 -131
  258. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  259. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  260. package/dist/src/pil/pipeline.js +34 -2
  261. package/dist/src/pil/response-tools.js +5 -3
  262. package/dist/src/pil/schema.d.ts +1 -0
  263. package/dist/src/pil/schema.js +2 -0
  264. package/dist/src/pil/types.d.ts +18 -0
  265. package/dist/src/playbook/directives.d.ts +4 -0
  266. package/dist/src/playbook/directives.js +17 -5
  267. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  268. package/dist/src/product-loop/backlog-builder.js +30 -6
  269. package/dist/src/product-loop/discovery-context-format.js +3 -1
  270. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  271. package/dist/src/product-loop/discovery-interview.js +32 -3
  272. package/dist/src/product-loop/discovery-schema.js +5 -1
  273. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  274. package/dist/src/product-loop/ideal-trace.js +64 -0
  275. package/dist/src/product-loop/index.d.ts +13 -1
  276. package/dist/src/product-loop/index.js +333 -52
  277. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  278. package/dist/src/product-loop/loop-driver.js +310 -99
  279. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  280. package/dist/src/product-loop/phase-plan.js +39 -2
  281. package/dist/src/product-loop/phase-runner.js +9 -1
  282. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  283. package/dist/src/product-loop/sprint-runner.js +559 -16
  284. package/dist/src/product-loop/types.d.ts +36 -5
  285. package/dist/src/providers/adapter.d.ts +1 -1
  286. package/dist/src/providers/adapter.js +3 -4
  287. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  288. package/dist/src/providers/auth/browser-flow.js +1 -1
  289. package/dist/src/providers/auth/openai-oauth.js +1 -1
  290. package/dist/src/providers/auth/registry.js +0 -34
  291. package/dist/src/providers/auth/token-store.js +4 -1
  292. package/dist/src/providers/auth/types.d.ts +1 -1
  293. package/dist/src/providers/auth/types.js +1 -1
  294. package/dist/src/providers/capabilities.d.ts +24 -5
  295. package/dist/src/providers/capabilities.js +42 -24
  296. package/dist/src/providers/endpoints.d.ts +2 -2
  297. package/dist/src/providers/endpoints.js +11 -10
  298. package/dist/src/providers/keychain.d.ts +1 -1
  299. package/dist/src/providers/keychain.js +7 -9
  300. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  301. package/dist/src/providers/openai-compatible.js +8 -1
  302. package/dist/src/providers/pricing.d.ts +2 -2
  303. package/dist/src/providers/pricing.js +3 -13
  304. package/dist/src/providers/runtime.d.ts +27 -2
  305. package/dist/src/providers/runtime.js +78 -15
  306. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  307. package/dist/src/providers/strategies/base.strategy.js +24 -1
  308. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  309. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  310. package/dist/src/providers/strategies/registry.js +4 -4
  311. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  312. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  313. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  314. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  315. package/dist/src/providers/types.d.ts +5 -6
  316. package/dist/src/providers/types.js +2 -2
  317. package/dist/src/providers/vision-backend.d.ts +47 -0
  318. package/dist/src/providers/vision-backend.js +258 -0
  319. package/dist/src/providers/vision-proxy.d.ts +22 -9
  320. package/dist/src/providers/vision-proxy.js +63 -132
  321. package/dist/src/providers/wire-debug.js +95 -0
  322. package/dist/src/router/decide.d.ts +13 -0
  323. package/dist/src/router/decide.js +138 -36
  324. package/dist/src/router/peak-hour.d.ts +38 -0
  325. package/dist/src/router/peak-hour.js +107 -0
  326. package/dist/src/router/step-router.js +3 -2
  327. package/dist/src/router/warm.js +4 -5
  328. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  329. package/dist/src/scaffold/continuation-prompt.js +26 -0
  330. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  331. package/dist/src/scaffold/point-to-existing.js +25 -0
  332. package/dist/src/self-qa/agentic-loop.js +3 -3
  333. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  334. package/dist/src/{ui/state → state}/active-run.js +21 -0
  335. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  336. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  337. package/dist/src/state/turn-trace.d.ts +43 -0
  338. package/dist/src/state/turn-trace.js +32 -0
  339. package/dist/src/storage/db.js +2 -1
  340. package/dist/src/storage/index.d.ts +1 -1
  341. package/dist/src/storage/index.js +1 -1
  342. package/dist/src/storage/interaction-log.d.ts +1 -1
  343. package/dist/src/storage/migrations.js +71 -1
  344. package/dist/src/storage/sessions.d.ts +28 -10
  345. package/dist/src/storage/sessions.js +78 -21
  346. package/dist/src/storage/transcript-view.js +1 -1
  347. package/dist/src/storage/transcript.d.ts +51 -0
  348. package/dist/src/storage/transcript.js +284 -13
  349. package/dist/src/tools/file.d.ts +15 -0
  350. package/dist/src/tools/file.js +32 -0
  351. package/dist/src/tools/native-tools.js +5 -0
  352. package/dist/src/tools/registry.d.ts +3 -0
  353. package/dist/src/tools/registry.js +460 -22
  354. package/dist/src/tools/research.d.ts +29 -0
  355. package/dist/src/tools/research.js +233 -0
  356. package/dist/src/types/index.d.ts +118 -3
  357. package/dist/src/ui/app.js +0 -0
  358. package/dist/src/ui/cards/product-status-card.js +1 -1
  359. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  360. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  361. package/dist/src/ui/components/context-rail.d.ts +26 -0
  362. package/dist/src/ui/components/context-rail.js +33 -0
  363. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  364. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  365. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  366. package/dist/src/ui/components/council-debate-pill.js +34 -0
  367. package/dist/src/ui/components/council-info-card.js +2 -2
  368. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  369. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  370. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  371. package/dist/src/ui/components/council-message-bubble.js +16 -15
  372. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  373. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  374. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  375. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  376. package/dist/src/ui/components/council-question-card.js +12 -12
  377. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  378. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  379. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  380. package/dist/src/ui/components/council-round-group.js +88 -0
  381. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  382. package/dist/src/ui/components/council-status-list.js +36 -24
  383. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  384. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  385. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  386. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  387. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  388. package/dist/src/ui/components/prompt-box.js +18 -16
  389. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  390. package/dist/src/ui/components/session-tree-card.js +46 -0
  391. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  392. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  393. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  394. package/dist/src/ui/components/task-list-panel.js +22 -2
  395. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  396. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  397. package/dist/src/ui/mcp-modal.js +2 -4
  398. package/dist/src/ui/modals/api-key-modal.js +1 -1
  399. package/dist/src/ui/modals/connect-modal.js +4 -3
  400. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  401. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  402. package/dist/src/ui/picker-providers.d.ts +1 -1
  403. package/dist/src/ui/picker-providers.js +1 -1
  404. package/dist/src/ui/primitives/index.d.ts +1 -0
  405. package/dist/src/ui/primitives/index.js +2 -0
  406. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  407. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  408. package/dist/src/ui/slash/compact.js +5 -7
  409. package/dist/src/ui/slash/cost.js +1 -1
  410. package/dist/src/ui/slash/council.js +19 -1
  411. package/dist/src/ui/slash/debug.d.ts +3 -31
  412. package/dist/src/ui/slash/debug.js +9 -20
  413. package/dist/src/ui/slash/ideal.d.ts +6 -2
  414. package/dist/src/ui/slash/ideal.js +97 -7
  415. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  416. package/dist/src/ui/slash/menu-items.js +12 -18
  417. package/dist/src/ui/slash/registry.d.ts +2 -0
  418. package/dist/src/ui/slash/registry.js +4 -0
  419. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  420. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  421. package/dist/src/ui/status-bar/index.d.ts +1 -1
  422. package/dist/src/ui/status-bar/index.js +7 -3
  423. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  424. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  425. package/dist/src/ui/theme.d.ts +1 -0
  426. package/dist/src/ui/theme.js +2 -0
  427. package/dist/src/ui/types.d.ts +7 -0
  428. package/dist/src/ui/use-app-logic.js +0 -0
  429. package/dist/src/ui/utils/format.d.ts +14 -0
  430. package/dist/src/ui/utils/format.js +23 -3
  431. package/dist/src/usage/downgrade.js +2 -2
  432. package/dist/src/usage/product-ledger.js +2 -2
  433. package/dist/src/utils/install-manager.js +2 -1
  434. package/dist/src/utils/logger.js +2 -2
  435. package/dist/src/utils/permission-mode.js +5 -3
  436. package/dist/src/utils/redactor.js +1 -1
  437. package/dist/src/utils/settings.d.ts +153 -5
  438. package/dist/src/utils/settings.js +233 -29
  439. package/dist/src/utils/visible-retry.d.ts +11 -0
  440. package/dist/src/utils/visible-retry.js +10 -1
  441. package/dist/src/verify/entrypoint.d.ts +1 -1
  442. package/dist/src/verify/entrypoint.js +1 -1
  443. package/dist/src/verify/recipes.d.ts +13 -0
  444. package/dist/src/verify/recipes.js +15 -0
  445. package/package.json +135 -132
  446. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  447. package/dist/src/providers/auth/gcloud.js +0 -102
  448. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  449. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  450. package/dist/src/providers/gemini.d.ts +0 -11
  451. package/dist/src/providers/gemini.js +0 -45
  452. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  453. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  454. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  455. package/dist/src/providers/strategies/google.strategy.js +0 -174
  456. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  457. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  458. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Decide whether a tool-loop halt should be auto-recovered by compacting the
3
+ * history and continuing, instead of stopping and asking the user to /compact.
4
+ *
5
+ * Only STEP-LIMIT halts recover (the agent is making progress but ran out of
6
+ * round budget). PATTERN-loop halts never recover — the agent is stuck in a
7
+ * repeated call and more steps won't help. A cap bounds the number of
8
+ * auto-recoveries per turn so a genuinely runaway turn still terminates.
9
+ */
10
+ /**
11
+ * How many times a single turn may auto-compact-and-continue on a "cap" halt
12
+ * before it stops and returns the best answer. Each auto-recovery resets
13
+ * context to O(N) input (cheap), so a productive long task can sustain many
14
+ * cycles without a cost runaway — genuine loops trip the pattern guard, which
15
+ * is NOT auto-recovered. Default 6 (raised from the historical 2, which
16
+ * stranded long tasks after ~2 compactions). Override with
17
+ * MUONROI_TOOL_LIMIT_AUTO_RECOVER_CAP (clamped to [1, 50]).
18
+ */
19
+ export declare function getToolLimitAutoRecoverCap(): number;
20
+ export declare function shouldAutoRecoverToolLimit(info: {
21
+ kind: "cap" | "pattern";
22
+ }, autoRecoverCount: number, cap: number): boolean;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Decide whether a tool-loop halt should be auto-recovered by compacting the
3
+ * history and continuing, instead of stopping and asking the user to /compact.
4
+ *
5
+ * Only STEP-LIMIT halts recover (the agent is making progress but ran out of
6
+ * round budget). PATTERN-loop halts never recover — the agent is stuck in a
7
+ * repeated call and more steps won't help. A cap bounds the number of
8
+ * auto-recoveries per turn so a genuinely runaway turn still terminates.
9
+ */
10
+ /**
11
+ * How many times a single turn may auto-compact-and-continue on a "cap" halt
12
+ * before it stops and returns the best answer. Each auto-recovery resets
13
+ * context to O(N) input (cheap), so a productive long task can sustain many
14
+ * cycles without a cost runaway — genuine loops trip the pattern guard, which
15
+ * is NOT auto-recovered. Default 6 (raised from the historical 2, which
16
+ * stranded long tasks after ~2 compactions). Override with
17
+ * MUONROI_TOOL_LIMIT_AUTO_RECOVER_CAP (clamped to [1, 50]).
18
+ */
19
+ export function getToolLimitAutoRecoverCap() {
20
+ const raw = Number(process.env.MUONROI_TOOL_LIMIT_AUTO_RECOVER_CAP);
21
+ if (Number.isFinite(raw) && raw >= 1)
22
+ return Math.min(50, Math.floor(raw));
23
+ return 6;
24
+ }
25
+ export function shouldAutoRecoverToolLimit(info, autoRecoverCount, cap) {
26
+ if (info.kind === "pattern")
27
+ return false; // agent stuck — compaction won't help
28
+ return autoRecoverCount < cap; // "cap" = tool-round ceiling → recover while budget remains
29
+ }
30
+ //# sourceMappingURL=tool-limit-auto-recover.js.map
@@ -30,9 +30,28 @@ export interface TurnRunnerDepsBase {
30
30
  getCompactedThisTurn(): boolean;
31
31
  setCompactedThisTurn(v: boolean): void;
32
32
  setLastProviderOptionsShape(shape: string | null): void;
33
+ getCompactionStats(): {
34
+ count: number;
35
+ totalSaved: number;
36
+ };
37
+ /**
38
+ * Report this turn's cumulative tool-output chars (from the top-level cap)
39
+ * so the Agent can reactively escalate the NEXT turn to an isolated
40
+ * sub-session when the load proves heavy. Optional — batch path may omit it.
41
+ * See reactive-delegation.ts.
42
+ */
43
+ reportTurnToolLoad?(chars: number): void;
33
44
  getCompactionSettings(contextWindow?: number): CompactionSettings;
34
45
  compactForContext(provider: LegacyProvider, system: string, contextWindow: number, signal: AbortSignal, settings?: CompactionSettings, overflow?: boolean): Promise<boolean>;
35
46
  postTurnCompact(provider: LegacyProvider, system: string, contextWindow: number, signal: AbortSignal): Promise<void>;
47
+ /**
48
+ * Extend the absolute hard-cap ceiling when the turn is sustained by
49
+ * auto-compaction (a productive long task, not a runaway). Optional — batch
50
+ * path may omit it. Called from the tool-engine auto-recover branch after a
51
+ * successful compaction so long tasks are not stranded by an over-tight hard
52
+ * cap. See Agent.extendHardCeilingForAutoCompaction.
53
+ */
54
+ extendHardCeilingForAutoCompaction?(): void;
36
55
  runTask(request: TaskRequest, signal?: AbortSignal): Promise<ToolResult>;
37
56
  runDelegation(request: TaskRequest, signal?: AbortSignal): Promise<ToolResult>;
38
57
  readDelegation(id: string): Promise<ToolResult>;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * src/orchestrator/turn-watchdog.ts
3
+ *
4
+ * Generic idle + total watchdog for a turn generator.
5
+ *
6
+ * The per-chunk stall watchdog (stall-watchdog.ts) only guards streamText's
7
+ * chunk flow — a dead socket between provider bytes. It does NOT cover a turn
8
+ * that WEDGES inside a tool call (a `task` sub-agent or a `bash` that never
9
+ * returns) or one that keeps emitting heartbeat chunks while making no progress.
10
+ * Session 578b2eae7099 hung exactly there: an (unwanted) implementation turn
11
+ * spawned a sub-agent and the UI froze at "Council working… elapsed 0s" with no
12
+ * rescue.
13
+ *
14
+ * This wrapper races each `gen.next()` against two timers:
15
+ * - `idleMs` — reset on every yielded chunk; catches a fully silent stall.
16
+ * - `totalMs` — armed ONCE at entry, NOT reset by chunks; a hard ceiling that
17
+ * fires even when heartbeat chunks keep the idle guard alive.
18
+ * `timeoutMs <= 0` disables that guard. On fire it throws {@link TurnStallError};
19
+ * the caller decides how to surface it (abort the controller, yield a toast, …).
20
+ *
21
+ * Modelled on sprint-runner's proven `withImplIdleWatchdog`, generalised so any
22
+ * turn generator can be guarded without coupling to the product loop.
23
+ */
24
+ import type { StreamChunk } from "../types/index.js";
25
+ export declare class TurnStallError extends Error {
26
+ readonly kind: "idle" | "total";
27
+ constructor(kind: "idle" | "total", message: string);
28
+ }
29
+ export interface TurnWatchdogOptions {
30
+ /** Reset on every yielded chunk. <= 0 disables. */
31
+ idleMs: number;
32
+ /** Armed once at entry, never reset. <= 0 disables. */
33
+ totalMs: number;
34
+ /** Human label used in the thrown error (e.g. "council continuation turn"). */
35
+ label: string;
36
+ }
37
+ export declare function withTurnWatchdog(gen: AsyncGenerator<StreamChunk, void, unknown>, opts: TurnWatchdogOptions): AsyncGenerator<StreamChunk, void, unknown>;
@@ -0,0 +1,55 @@
1
+ export class TurnStallError extends Error {
2
+ kind;
3
+ constructor(kind, message) {
4
+ super(message);
5
+ this.kind = kind;
6
+ this.name = "TurnStallError";
7
+ }
8
+ }
9
+ export async function* withTurnWatchdog(gen, opts) {
10
+ const { idleMs, totalMs, label } = opts;
11
+ const it = gen[Symbol.asyncIterator]();
12
+ let totalTimer;
13
+ const total = totalMs > 0
14
+ ? new Promise((_, reject) => {
15
+ totalTimer = setTimeout(() => {
16
+ reject(new TurnStallError("total", `${label} exceeded ${Math.round(totalMs / 1000)}s total watchdog — treated as hung`));
17
+ }, totalMs);
18
+ totalTimer.unref?.();
19
+ })
20
+ : null;
21
+ try {
22
+ while (true) {
23
+ let idleTimer;
24
+ const idle = idleMs > 0
25
+ ? new Promise((_, reject) => {
26
+ idleTimer = setTimeout(() => {
27
+ reject(new TurnStallError("idle", `${label} produced no output for ${Math.round(idleMs / 1000)}s — treated as hung`));
28
+ }, idleMs);
29
+ idleTimer.unref?.();
30
+ })
31
+ : null;
32
+ const racers = [it.next()];
33
+ if (idle)
34
+ racers.push(idle);
35
+ if (total)
36
+ racers.push(total);
37
+ let res;
38
+ try {
39
+ res = await Promise.race(racers);
40
+ }
41
+ finally {
42
+ if (idleTimer)
43
+ clearTimeout(idleTimer);
44
+ }
45
+ if (res.done)
46
+ return;
47
+ yield res.value;
48
+ }
49
+ }
50
+ finally {
51
+ if (totalTimer)
52
+ clearTimeout(totalTimer);
53
+ }
54
+ }
55
+ //# sourceMappingURL=turn-watchdog.js.map
@@ -37,7 +37,7 @@
37
37
  * one imperative line targeting that phase's most damaging failure mode. Kept
38
38
  * tight (primacy matters more than detail; tokens are the cost).
39
39
  */
40
- export declare const AGENT_OPERATING_CONTRACT = "[AGENT OPERATING CONTRACT \u2014 read first; applies to every step]\n\n1. BEFORE ACTING: do only what was asked. Never assume scope or facts \u2014 if ambiguous, ask or use defaults; never invent requirements. RESEARCH FIRST: explore code (read/grep) and recall EE brain before editing. RECALL FIRST: ee.query in unfamiliar areas to surface past lessons.\n2. READING: base statements on what you read/ran THIS turn. Do not infer contents of files you did not open.\n3. EXECUTING: smallest correct change; never widen scope or mask failures (no `|| true`, skipped tests, or swallowed catch).\n4. WHEN UNSURE: verify and cross-check BEFORE concluding. Reading code is not proof \u2014 reproduce the bug.\n5. REPORTING: answer ONLY what was asked. Every fact or file:line MUST come from this turn; else label \"unverified\"; do not guess. Synthesize evidence gracefully \u2014 do NOT dump massive verbatim tool outputs into the final answer. Cite concise file:line references. Never claim a build/test ran, or describe edits, you did not actually do this turn; if a check can't run, fix it or say so \u2014 don't imply success.\n\n6. LANGUAGE: Reply in user's detected language for final output. Internal reasoning, tools, and code remain in English.\n\n7. ANTI-M\u00D9 / COMPACTION: On compaction, emit PRESERVE_FULL_CONTEXT (veto) or KEEP_TOOL_IDS (from stub id=) to protect results. Use ee_query with \"tool-artifact id=XXX\" to re-hydrate. Self-check via EE checkpoints. Suggest /compact near tool limits.\n\n8. GIT SAFETY: never push on red \u2014 run the check, await its result in a SEPARATE step, confirm 0 failures, then push. Never `git add -A`/`commit -a`; stage explicitly so secrets (.env, .muonroi-cli/, keys) aren't committed. Never `--no-verify`.\n\n9. VERIFICATION: when finishing a task, ALWAYS self-verify your work. Use the `selfverify_*` native tools (start/status/result) to run the QA harness which drives the live TUI like a real user to catch regressions that unit tests can't.\n\n[END CONTRACT \u2014 instructions follow]";
40
+ export declare const AGENT_OPERATING_CONTRACT = "[AGENT OPERATING CONTRACT \u2014 read first; applies to every step]\n\n1. BEFORE ACTING: do only what was asked. Never assume scope or facts \u2014 if ambiguous, ask or use defaults; never invent requirements. RESEARCH FIRST: explore code (read/grep) and recall EE brain before editing. RECALL FIRST: ee.query in unfamiliar areas to surface past lessons.\n2. READING: base statements on what you read/ran THIS turn. Do not infer contents of files you did not open.\n3. EXECUTING: smallest correct change; never widen scope or mask failures (no `|| true`, skipped tests, or swallowed catch).\n4. WHEN UNSURE: verify and cross-check BEFORE concluding. Reading code is not proof \u2014 reproduce the bug.\n5. REPORTING: answer ONLY what was asked. Every fact or file:line MUST come from this turn; else label \"unverified\"; do not guess. Synthesize evidence gracefully \u2014 do NOT dump massive verbatim tool outputs into the final answer. Cite concise file:line references. Never claim a build/test ran, or describe edits, you did not actually do this turn; if a check can't run, fix it or say so \u2014 don't imply success.\n\n6. LANGUAGE: Reply in user's detected language for final output. Internal reasoning, tools, and code remain in English.\n\n7. ANTI-M\u00D9 / COMPACTION: On compaction, emit PRESERVE_FULL_CONTEXT (veto) or KEEP_TOOL_IDS (from stub id=) to protect results. Use ee_query with \"tool-artifact id=XXX\" to re-hydrate. Self-check via EE checkpoints. Use 'compact' tool near limits.\n\n8. GIT SAFETY: never push on red \u2014 run the check, await its result in a SEPARATE step, confirm 0 failures, then push. Never `git add -A`/`commit -a`; stage explicitly so secrets (.env, .muonroi-cli/, keys) aren't committed. Never `--no-verify`.\n\n9. VERIFICATION: when finishing a task, ALWAYS self-verify your work. Use the `selfverify_*` native tools (start/status/result) to run the QA harness which drives the live TUI like a real user to catch regressions that unit tests can't.\n\n[END CONTRACT \u2014 instructions follow]";
41
41
  export interface ContractSectionOptions {
42
42
  /** Chitchat turns carry no tools and make no factual claims — skip the contract. */
43
43
  chitchat?: boolean;
@@ -47,7 +47,7 @@ export const AGENT_OPERATING_CONTRACT = `[AGENT OPERATING CONTRACT — read firs
47
47
 
48
48
  6. LANGUAGE: Reply in user's detected language for final output. Internal reasoning, tools, and code remain in English.
49
49
 
50
- 7. ANTI-MÙ / COMPACTION: On compaction, emit PRESERVE_FULL_CONTEXT (veto) or KEEP_TOOL_IDS (from stub id=) to protect results. Use ee_query with "tool-artifact id=XXX" to re-hydrate. Self-check via EE checkpoints. Suggest /compact near tool limits.
50
+ 7. ANTI-MÙ / COMPACTION: On compaction, emit PRESERVE_FULL_CONTEXT (veto) or KEEP_TOOL_IDS (from stub id=) to protect results. Use ee_query with "tool-artifact id=XXX" to re-hydrate. Self-check via EE checkpoints. Use 'compact' tool near limits.
51
51
 
52
52
  8. GIT SAFETY: never push on red — run the check, await its result in a SEPARATE step, confirm 0 failures, then push. Never \`git add -A\`/\`commit -a\`; stage explicitly so secrets (.env, .muonroi-cli/, keys) aren't committed. Never \`--no-verify\`.
53
53
 
@@ -27,7 +27,7 @@ import type { ShellKind } from "../utils/shell.js";
27
27
  * Wrapped with the `[CRITICAL TOOL-USE RULES ...]` marker so the model knows
28
28
  * to treat these as overrides to anything that follows.
29
29
  */
30
- export declare const CHEAP_MODEL_PLAYBOOK = "[CRITICAL TOOL-USE RULES \u2014 read before invoking any tool; these override defaults that follow]\n\n1. Bash output is AUTOMATICALLY cached. Every `bash` call returns a `run_id`\n (e.g. `bash-1`) you can re-query via `bash_output_get(run_id, mode=tail|head|grep|lines)`.\n - When you want only the last N lines: do NOT pipe `| tail -N`. Run the\n bare command, then call `bash_output_get(run_id, mode=tail, lines=N)`.\n - Same for `| head`, `| grep PATTERN`, `> file`. Pipes/redirects HIDE\n the full output from the cache; `bash_output_get` reads from the cache\n without re-running.\n - This applies to EVERY bash call, not just retries.\n - To VIEW a file use `read_file` (start_line/end_line) \u2014 never sed/cat a\n file. `bash_output_get` is for COMMAND output, not files.\n\n2. Before reading more than 3 files to understand a topic, delegate to\n `task(agent=\"explore\")`. The sub-agent returns a compressed summary;\n you save reading tokens.\n\n3. Use the `grep` tool (ripgrep) for content search \u2014 NOT `bash` with\n `grep` / `find` piped.\n\n4. When a tool returns `ERROR: ...`, do NOT retry the identical call.\n Pick a different tool, change inputs meaningfully, or stop and report.\n\n5. Fix the ROOT CAUSE, never mask a failure to make it \"pass\"\n (`continue-on-error`, swallowed try/catch, skipped/deleted test, `|| true`).\n If a step fails from a missing secret/config, make it CONDITIONAL (skip when\n absent) so it still runs when present \u2014 do NOT blanket-ignore it.\n\n6. For a build / CI / test failure, read the ACTUAL failure log or stack trace\n BEFORE hypothesizing \u2014 fix the real error, not a guess from source alone.\n\n7. ANTI-M\u00D9 / COMPACTION (for long sessions): On pre-warn or \"[context compacted at step...\", emit PRESERVE_FULL_CONTEXT (full veto) or lighter KEEP_TOOL_IDS: id1,id2 (from stub id=) to protect specific high-value results. read_file/grep/lsp/bash on src/PLAN/error are auto-kept (idea 1). Use ee.query tool with \"tool-artifact id=XXX\" for on-demand full. Self-check \"task finished?\" / \"compacted yet?\". Use EE checkpoints. If you are reaching tool/step limits in a long session, suggest the user run \"/compact\" in the chat to compress this session's history.\n\n[END CRITICAL TOOL-USE RULES \u2014 your regular instructions begin below]\n\n";
30
+ export declare const CHEAP_MODEL_PLAYBOOK = "[CRITICAL TOOL-USE RULES \u2014 read before invoking any tool; these override defaults that follow]\n\n1. Bash output is AUTOMATICALLY cached. Every `bash` call returns a `run_id`\n (e.g. `bash-1`) you can re-query via `bash_output_get(run_id, mode=tail|head|grep|lines)`.\n - When you want only the last N lines: do NOT pipe `| tail -N`. Run the\n bare command, then call `bash_output_get(run_id, mode=tail, lines=N)`.\n - Same for `| head`, `| grep PATTERN`, `> file`. Pipes/redirects HIDE\n the full output from the cache; `bash_output_get` reads from the cache\n without re-running.\n - This applies to EVERY bash call, not just retries.\n - To VIEW a file use `read_file` (start_line/end_line) \u2014 never sed/cat a\n file. `bash_output_get` is for COMMAND output, not files.\n\n2. Before reading more than 3 files to understand a topic, delegate to\n `task(agent=\"explore\")`. The sub-agent returns a compressed summary;\n you save reading tokens.\n\n3. Use the `grep` tool (ripgrep) for content search \u2014 NOT `bash` with\n `grep` / `find` piped.\n\n4. When a tool returns `ERROR: ...`, do NOT retry the identical call.\n Pick a different tool, change inputs meaningfully, or stop and report.\n\n5. Fix the ROOT CAUSE, never mask a failure to make it \"pass\"\n (`continue-on-error`, swallowed try/catch, skipped/deleted test, `|| true`).\n If a step fails from a missing secret/config, make it CONDITIONAL (skip when\n absent) so it still runs when present \u2014 do NOT blanket-ignore it.\n\n6. For a build / CI / test failure, read the ACTUAL failure log or stack trace\n BEFORE hypothesizing \u2014 fix the real error, not a guess from source alone.\n\n7. ANTI-M\u00D9 / COMPACTION (for long sessions): On pre-warn or \"[context compacted at step...\", emit PRESERVE_FULL_CONTEXT (full veto) or lighter KEEP_TOOL_IDS: id1,id2 (from stub id=) to protect specific high-value results. read_file/grep/lsp/bash on src/PLAN/error are auto-kept (idea 1). Use ee.query tool with \"tool-artifact id=XXX\" for on-demand full. Self-check \"task finished?\" / \"compacted yet?\". Use EE checkpoints. On long sessions, call the 'compact' tool to compress history and continue (don't stop).\n\n8. CITATIONS: only write a `file:line` you can SEE in a read_file result\n (`N |` prefix; header `of TOTAL`). Never guess a line or reuse one file's\n numbers for another. Unsure \u2192 re-read or omit the line.\n\n[END CRITICAL TOOL-USE RULES \u2014 your regular instructions begin below]\n\n";
31
31
  /**
32
32
  * Predicate gating playbook injection.
33
33
  *
@@ -56,7 +56,11 @@ export const CHEAP_MODEL_PLAYBOOK = `[CRITICAL TOOL-USE RULES — read before in
56
56
  6. For a build / CI / test failure, read the ACTUAL failure log or stack trace
57
57
  BEFORE hypothesizing — fix the real error, not a guess from source alone.
58
58
 
59
- 7. ANTI-MÙ / COMPACTION (for long sessions): On pre-warn or "[context compacted at step...", emit PRESERVE_FULL_CONTEXT (full veto) or lighter KEEP_TOOL_IDS: id1,id2 (from stub id=) to protect specific high-value results. read_file/grep/lsp/bash on src/PLAN/error are auto-kept (idea 1). Use ee.query tool with "tool-artifact id=XXX" for on-demand full. Self-check "task finished?" / "compacted yet?". Use EE checkpoints. If you are reaching tool/step limits in a long session, suggest the user run "/compact" in the chat to compress this session's history.
59
+ 7. ANTI-MÙ / COMPACTION (for long sessions): On pre-warn or "[context compacted at step...", emit PRESERVE_FULL_CONTEXT (full veto) or lighter KEEP_TOOL_IDS: id1,id2 (from stub id=) to protect specific high-value results. read_file/grep/lsp/bash on src/PLAN/error are auto-kept (idea 1). Use ee.query tool with "tool-artifact id=XXX" for on-demand full. Self-check "task finished?" / "compacted yet?". Use EE checkpoints. On long sessions, call the 'compact' tool to compress history and continue (don't stop).
60
+
61
+ 8. CITATIONS: only write a \`file:line\` you can SEE in a read_file result
62
+ (\`N |\` prefix; header \`of TOTAL\`). Never guess a line or reuse one file's
63
+ numbers for another. Unsure → re-read or omit the line.
60
64
 
61
65
  [END CRITICAL TOOL-USE RULES — your regular instructions begin below]
62
66
 
@@ -25,7 +25,7 @@ import type { TaskType } from "./types.js";
25
25
  * Universal anti-ramble convergence block — applies to every task type.
26
26
  * Kept tight; the per-task addendum below specialises it.
27
27
  */
28
- export declare const CHEAP_MODEL_CONVERGENCE = "[CONVERGENCE \u2014 minimise tool calls; the system prompt + tools are re-sent every call, so each extra step is expensive]\n\n- Plan the FEWEST reads you need, then read the specific file/section directly.\n Do NOT broad-grep, re-read a file you already read, or explore \"just in case\".\n- The moment you have enough to act, STOP investigating and make the change.\n- Make the SMALLEST correct change for the request; do not widen scope.\n- Finish the action before you answer \u2014 never stop mid-step (e.g. \"I'm verifying\u2026\").\n When done, state completion in ONE line (what changed + that it's verified);\n no recap, no next-steps padding.\n- GROUND every claim in what you actually read or ran THIS turn: cite real\n file:line, and never invent counts, line numbers, names, or bugs. If a number\n (test/file count) is not verified by a command you ran, run the check or mark\n it \"unverified\" \u2014 do NOT guess a value or assert a finding you did not observe.\n- ANTI-M\u00D9: After compaction note or pre-warn, emit PRESERVE_FULL_CONTEXT (full) or KEEP_TOOL_IDS: id1,id2 to protect high-value (auto for read_file/grep on src/PLAN/error). Use the ee_query tool with \"tool-artifact id=XXX\" for on-demand full re-hydrate. Recall checkpoints. If you are reaching tool/step limits in a long session, suggest the user run \"/compact\" to compress history. ";
28
+ export declare const CHEAP_MODEL_CONVERGENCE = "[CONVERGENCE \u2014 minimise tool calls; the system prompt + tools are re-sent every call, so each extra step is expensive]\n\n- Plan the FEWEST reads you need, then read the specific file/section directly.\n Do NOT broad-grep, re-read a file you already read, or explore \"just in case\".\n- The moment you have enough to act, STOP investigating and make the change.\n- Make the SMALLEST correct change for the request; do not widen scope.\n- Finish the action before you answer \u2014 never stop mid-step (e.g. \"I'm verifying\u2026\").\n When done, state completion in ONE line (what changed + that it's verified);\n no recap, no next-steps padding.\n- GROUND every claim in what you actually read or ran THIS turn: cite real\n file:line, and never invent counts, line numbers, names, or bugs. If a number\n (test/file count) is not verified by a command you ran, run the check or mark\n it \"unverified\" \u2014 do NOT guess a value or assert a finding you did not observe.\n- ANTI-M\u00D9: After compaction note or pre-warn, emit PRESERVE_FULL_CONTEXT (full) or KEEP_TOOL_IDS: id1,id2 to protect high-value (auto for read_file/grep on src/PLAN/error). Use the ee_query tool with \"tool-artifact id=XXX\" for on-demand full re-hydrate. Recall checkpoints. On long sessions, call the `compact` tool yourself to compress history and keep going (don't stop). ";
29
29
  /**
30
30
  * Map a sub-agent role (agentKey) to the workbook TaskType that best matches
31
31
  * its job. Sub-agents never run PIL Layer 1, so they have no classifier-derived
@@ -36,7 +36,7 @@ export const CHEAP_MODEL_CONVERGENCE = `[CONVERGENCE — minimise tool calls; th
36
36
  file:line, and never invent counts, line numbers, names, or bugs. If a number
37
37
  (test/file count) is not verified by a command you ran, run the check or mark
38
38
  it "unverified" — do NOT guess a value or assert a finding you did not observe.
39
- - ANTI-MÙ: After compaction note or pre-warn, emit PRESERVE_FULL_CONTEXT (full) or KEEP_TOOL_IDS: id1,id2 to protect high-value (auto for read_file/grep on src/PLAN/error). Use the ee_query tool with "tool-artifact id=XXX" for on-demand full re-hydrate. Recall checkpoints. If you are reaching tool/step limits in a long session, suggest the user run "/compact" to compress history. `;
39
+ - ANTI-MÙ: After compaction note or pre-warn, emit PRESERVE_FULL_CONTEXT (full) or KEEP_TOOL_IDS: id1,id2 to protect high-value (auto for read_file/grep on src/PLAN/error). Use the ee_query tool with "tool-artifact id=XXX" for on-demand full re-hydrate. Recall checkpoints. On long sessions, call the \`compact\` tool yourself to compress history and keep going (don't stop). `;
40
40
  /**
41
41
  * Per-task-type addenda. Each is 1–2 tight lines targeting that type's most
42
42
  * common budget-model failure mode. Types not listed fall back to the
@@ -9,6 +9,7 @@ export interface ProjectContext {
9
9
  boundedContexts: BoundedContext[];
10
10
  eePatterns: string[];
11
11
  relevantModules: RelevantModule[];
12
+ recentModifiedFiles?: string[];
12
13
  scannedAt: number;
13
14
  cwd: string;
14
15
  }
@@ -214,6 +214,9 @@ async function proposeModelCards(proposer, raw, l1, projectContext, recentTurnsS
214
214
  ? `Bounded contexts: ${projectContext.boundedContexts.map((b) => `${b.name} (${b.path})`).join(", ")}`
215
215
  : "",
216
216
  projectContext.eePatterns?.length ? `EE patterns: ${projectContext.eePatterns.slice(0, 3).join(" | ")}` : "",
217
+ projectContext.recentModifiedFiles?.length
218
+ ? `User's active/modified files (git status): ${projectContext.recentModifiedFiles.join(", ")}`
219
+ : "",
217
220
  recentTurnsSummary ? `\nRecent Conversation History:\n${recentTurnsSummary}` : "",
218
221
  ]
219
222
  .filter(Boolean)
@@ -256,19 +259,21 @@ ${contextStr}
256
259
  You design question cards shown to the user *before* you start working.
257
260
  Each card is a structured question with selectable options.
258
261
 
259
- Rules:
260
- 1. Ask ONLY what is genuinely blocking. Most well-scoped requests need 0 cards.
261
- 2. If everything you need is inferable from the request + context above, OR the request is a plain question you can simply answer, return [] (empty array).
262
- 3. If this is a follow-up or continuation of recent conversation history, assume context is already established and return [] unless there is a critical new ambiguity.
263
- 4. Consider the provided language/framework/modules/EE patterns never ask what the context already answers.${special}
264
- 5. For each card, design the options however you want:
265
- - Use kind="choice" for clickable buttons (recommendations, accept/adjust/cancel, etc.)
262
+ Rules (ROI-gated — a card is worth showing ONLY when the user's answer changes WHAT you build and you genuinely cannot decide it for them):
263
+ 1. Ask ONLY when the user must chốt a fork you cannot resolve yourself AND getting it wrong is expensive or hard to reverse. High-ROI examples: which implementation direction / architecture to commit to, which of several REAL plan alternatives to pursue, an irreversible or destructive action, an intent so ambiguous that different readings produce materially different deliverables.
264
+ 2. If you already have a recommendation and the fork is low-stakes or reversible, DO NOT ask — proceed with your recommendation. A card that just asks the user to accept/confirm what you already recommend is pure noise: return [] and act on the recommendation.
265
+ 3. Prefer proceeding on a stated assumption over blocking. When you can reasonably assume the answer, state the assumption in your work instead of showing a card.
266
+ 4. If everything you need is inferable from the request + context above, OR the request is a plain question you can simply answer, return [] (empty array).
267
+ 5. If this is a follow-up or continuation of recent conversation history, assume context is already established and return [] unless there is a critical NEW fork.
268
+ 6. Consider the provided language/framework/modules/EE patterns never ask what the context already answers.${special}
269
+ 7. Most well-scoped requests need 0 cards. For each card you DO show, design the options:
270
+ - Use kind="choice" for clickable buttons when there are REAL alternatives the user picks between
266
271
  - Use kind="freetext" when the user should type their own answer
267
272
  - Mark an option with isCancel:true when picking it should cancel the entire request
268
- - Mark an option with isAdjust:true when picking it means the user wants to clarify further
269
- - Set defaultIndex to the option most users would pick (0 = first)
270
- 6. Return ONLY valid JSON array, nothing else.
271
- 7. Max 3 cards.
273
+ - Mark an option with isAdjust:true when picking it means the user wants to refine further
274
+ - Set defaultIndex to your recommended option (0 = first)
275
+ 8. Return ONLY valid JSON array, nothing else.
276
+ 9. Max 3 cards — and only for genuine decision forks.
272
277
 
273
278
  JSON format:
274
279
  [{
@@ -1,13 +1,18 @@
1
1
  /**
2
2
  * src/pil/layer1-intent.ts
3
3
  *
4
- * Layer 1: Intent detection.
5
- * Pass 1 classifier (regex + tree-sitter): maps all 14 possible reason strings to TaskType.
6
- * Pass 2 keyword fallback: catches debug/plan/documentation that classifier misses.
7
- * Pass 3 EE brain fallback via bridge.classifyViaBrain (replaces ollamaClassify).
8
- * Populates taskType, confidence, and domain on PipelineContext.
9
- * outputStyle is always null from Layer 1 Layer 6 handles output style detection via bridge.
4
+ * Layer 1: Intent detection — MODEL-FIRST ONLY.
5
+ * The configured chat model (via opts.llmFallback) classifies taskType / intent
6
+ * / style / depth / clarity / scope / language. The old keyword-regex "Pass 0-4"
7
+ * cascade was DELETED (2026-07-07, no-regex rule) regex no longer decides
8
+ * intent. When no classifier is wired the layer degrades to UNKNOWN (taskType
9
+ * null, keep-tools), never a regex guess. On a classify miss the classifier
10
+ * self-repairs (see createLlmClassifier) before surfacing UNKNOWN.
10
11
  * Fail-open: any error returns ctx unchanged with applied=false.
12
+ *
13
+ * NOTE: scoreComplexity / scoreSufficiency below are retained ONLY because other
14
+ * modules (playbook, discovery, orchestrator) still import them; they no longer
15
+ * run on this layer's classification path.
11
16
  */
12
17
  import type { LlmClassifyFn } from "./llm-classify.js";
13
18
  import type { OutputStyle, PipelineContext } from "./types.js";
@@ -83,6 +88,13 @@ export interface Layer1Options {
83
88
  * Passed in (not read here) to keep layer1 off the EE/profile import path.
84
89
  */
85
90
  profileStyleBaseline?: OutputStyle | null;
91
+ /**
92
+ * Compact digest of the last few conversation turns. Forwarded to the LLM
93
+ * classifier so a terse follow-up that back-references heavy prior work
94
+ * ("từ các phần đó", "làm tiếp") is scored on the real work, not the isolated
95
+ * sentence. null/undefined ⇒ classifier sees the bare prompt (old behaviour).
96
+ */
97
+ recentTurns?: string | null;
86
98
  }
87
99
  /**
88
100
  * True when the prompt is an explicit request to RUN a command / use a shell