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
@@ -1,3 +1,4 @@
1
+ import { execSync } from "node:child_process";
1
2
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  export function detectLanguage(cwd, exists = (p) => existsSync(p)) {
@@ -141,14 +142,27 @@ export async function scanProjectContext(raw, cwd) {
141
142
  catch {
142
143
  /* EE unavailable */
143
144
  }
145
+ let recentModifiedFiles = [];
146
+ try {
147
+ const gitOut = execSync("git status --porcelain", { cwd, encoding: "utf-8", stdio: "pipe" });
148
+ recentModifiedFiles = gitOut
149
+ .split("\n")
150
+ .map((line) => line.slice(3).trim())
151
+ .filter((line) => line.length > 0)
152
+ .slice(0, 10);
153
+ }
154
+ catch {
155
+ // Not a git repo or git not installed
156
+ }
144
157
  return {
145
158
  language,
146
159
  framework,
147
160
  packageManager,
148
- domain: language,
161
+ domain: null,
149
162
  boundedContexts,
150
163
  eePatterns,
151
164
  relevantModules,
165
+ recentModifiedFiles,
152
166
  scannedAt: Date.now(),
153
167
  cwd,
154
168
  };
@@ -1,13 +1,13 @@
1
1
  import { truncateToBudget } from "./budget.js";
2
2
  import { isPonytailModeEnabled } from "./config.js";
3
- const PONYTAIL_INSTRUCTION = `[LAZY SENIOR / PONYTAIL MODE ACTIVE]
4
- "The best code is the code you never wrote." You MUST adhere to the following Decision Ladder:
5
- 1. Standard Library first.
6
- 2. Native platform features next.
7
- 3. 1-line solution next.
8
- 4. YAGNI: Do not write it if not strictly necessary.
9
- 5. Smallest correct change.
10
-
3
+ const PONYTAIL_INSTRUCTION = `[LAZY SENIOR / PONYTAIL MODE ACTIVE]
4
+ "The best code is the code you never wrote." You MUST adhere to the following Decision Ladder:
5
+ 1. Standard Library first.
6
+ 2. Native platform features next.
7
+ 3. 1-line solution next.
8
+ 4. YAGNI: Do not write it if not strictly necessary.
9
+ 5. Smallest correct change.
10
+
11
11
  DOCUMENTATION RULE: If you bypass a complex/scalable pattern in favor of a simple one to adhere to this rule, you MUST add a comment in the code starting exactly with "// Intentional simplification: [Reason]".`;
12
12
  export async function layer2_5Ponytail(ctx) {
13
13
  // If task is not coding/action-related (e.g., chitchat), we might not need it, but pipeline.ts already skips layers if taskType is null.
@@ -19,6 +19,8 @@ import { searchByText } from "../ee/bridge.js";
19
19
  import { updateLastSurfacedState } from "../ee/intercept.js";
20
20
  import { formatPendingReminder, isRecallLedgerEnabled, sessionRecallLedger } from "../ee/recall-ledger.js";
21
21
  import { getRenderSink } from "../ee/render.js";
22
+ import { PLANNING_CHECKPOINT_QUERY } from "../gsd/ee-closure.js";
23
+ import { isGsdNativeEnabled } from "../gsd/flags.js";
22
24
  import { logInteraction } from "../storage/interaction-log.js";
23
25
  import { classifyEeError, logEeFailure, readTimeoutEnv } from "../utils/ee-logger.js";
24
26
  import { truncateToBudget } from "./budget.js";
@@ -138,10 +140,13 @@ async function queryEeBridge(raw, taskType) {
138
140
  // Phase 3 (ee-anti-mu): third arm for compaction checkpoints so PIL can surface
139
141
  // prior "Progress ✔ DONE / elided" without the agent having to ask "task finished?".
140
142
  const signal = AbortSignal.timeout(PIL_SEARCH_TIMEOUT_MS);
143
+ const planningQuery = isGsdNativeEnabled()
144
+ ? `${PLANNING_CHECKPOINT_QUERY} OR compaction checkpoint`
145
+ : 'Context checkpoint summary OR "compaction checkpoint" recent Progress DONE elided OR tool-artifact OR "tool result id="';
141
146
  const [principleRaw, behavioralRaw, checkpointRaw] = await Promise.all([
142
147
  searchByText(queryWithTask, ["experience-principles"], 3, signal),
143
148
  searchByText(queryWithTask, ["experience-behavioral"], 4, signal),
144
- searchByText('Context checkpoint summary OR "compaction checkpoint" recent Progress DONE elided OR tool-artifact OR "tool result id="', ["experience-behavioral"], 3, signal).catch(() => []),
149
+ searchByText(planningQuery, ["experience-behavioral"], 3, signal).catch(() => []),
145
150
  ]);
146
151
  const principlePoints = principleRaw.filter((p) => (p.score ?? 0) >= PIL_PRINCIPLES_FLOOR);
147
152
  const behavioralPoints = behavioralRaw.filter((p) => (p.score ?? 0) >= PIL_SCORE_FLOOR);
@@ -217,10 +222,15 @@ export async function layer3EeInjection(ctx) {
217
222
  ...p,
218
223
  collection: p.collection ?? "experience-behavioral",
219
224
  }));
220
- // Suppress already-fedback entries so they don't re-inject as noise.
225
+ // Suppress (a) already-fed-back entries AND (b) entries already surfaced
226
+ // earlier this session (still pending) — re-injecting the full body of a
227
+ // hint the agent already saw is pure repetition (the "hint lặp"); the hit
228
+ // stays in the feedback nudge (shown once via _surfacedPendingIds) so the
229
+ // rating path is preserved without duplicating content every turn.
221
230
  if (isRecallLedgerEnabled()) {
222
- principleItems = principleItems.filter((p) => !sessionRecallLedger.wasCleared(String(p.id)));
223
- behavioralItems = behavioralItems.filter((p) => !sessionRecallLedger.wasCleared(String(p.id)));
231
+ const alreadyShown = (id) => sessionRecallLedger.wasCleared(id) || sessionRecallLedger.isPending(id);
232
+ principleItems = principleItems.filter((p) => !alreadyShown(String(p.id)));
233
+ behavioralItems = behavioralItems.filter((p) => !alreadyShown(String(p.id)));
224
234
  }
225
235
  // Render the [id:..] handle inline (mirrors formatPrincipleRules/Hints) so the
226
236
  // [id collection] reminder below refers to handles the agent can actually see.
@@ -397,11 +407,16 @@ export async function layer3EeInjection(ctx) {
397
407
  return text.length === 0 || !checkpointMarkerShas.has(payloadSha16(text));
398
408
  })
399
409
  : result.checkpointPoints || [];
400
- // Feedback-cleared suppression: skip points that were already rated via ee_feedback in an earlier turn.
401
- // This prevents already-judged entries from being re-injected as noise.
410
+ // Suppression: skip rateable hints that were already (a) rated via ee_feedback
411
+ // OR (b) surfaced earlier this session (still pending). Re-injecting the full
412
+ // body of a hint the agent already saw is the "hint lặp" repetition; the entry
413
+ // stays in the feedback nudge (shown once) so rating is still prompted.
414
+ // Checkpoints are GSD status context (not rateable) — only cleared-suppressed,
415
+ // they may legitimately re-surface each turn.
402
416
  const ledgerEnabled = isRecallLedgerEnabled();
403
- const clearedFilteredPrinciples = deduplicatedPrinciples.filter((p) => !(ledgerEnabled && sessionRecallLedger.wasCleared(String(p.id))));
404
- const clearedFilteredBehavioral = deduplicatedBehavioral.filter((p) => !(ledgerEnabled && sessionRecallLedger.wasCleared(String(p.id))));
417
+ const alreadyShown = (id) => ledgerEnabled && (sessionRecallLedger.wasCleared(id) || sessionRecallLedger.isPending(id));
418
+ const clearedFilteredPrinciples = deduplicatedPrinciples.filter((p) => !alreadyShown(String(p.id)));
419
+ const clearedFilteredBehavioral = deduplicatedBehavioral.filter((p) => !alreadyShown(String(p.id)));
405
420
  const clearedFilteredCheckpoints = deduplicatedCheckpoints.filter((p) => !(ledgerEnabled && sessionRecallLedger.wasCleared(String(p.id))));
406
421
  const allPoints = [...clearedFilteredPrinciples, ...clearedFilteredBehavioral, ...clearedFilteredCheckpoints];
407
422
  // STALE-01: Register injected point IDs for prompt-stale reconciliation.
@@ -17,10 +17,12 @@
17
17
  * the agent, into the user's language.
18
18
  */
19
19
  import { getWhoAmIProfile, routeTask } from "../ee/bridge.js";
20
+ import { isGsdNativeEnabled } from "../gsd/flags.js";
21
+ import { readState } from "../gsd/workflow-engine.js";
20
22
  import { buildDirective } from "../playbook/directives.js";
21
23
  import { classifyEeError, logEeFailure } from "../utils/ee-logger.js";
22
24
  import { truncateToBudget } from "./budget.js";
23
- import { isImplementationIntent, isMetaAnalysisPrompt, isQuestionLike } from "./layer6-output.js";
25
+ import { isImplementationIntent, isMetaAnalysisPrompt, isQuestionLike, isSprintPlanExecution, } from "./layer6-output.js";
24
26
  function mapRouteToPhase(route) {
25
27
  switch (route) {
26
28
  case "qc-flow":
@@ -66,10 +68,10 @@ export async function layer4Gsd(ctx) {
66
68
  }
67
69
  let phase = ctx.gsdPhase ?? null;
68
70
  let routeSource = "preset";
69
- // Skip brain routeTask when L1's unified call already supplied brain data:
70
- // any phase L1 derived is already on ctx.gsdPhase, and a separate routeTask
71
- // round-trip would duplicate the brain hit the unified endpoint replaces.
72
- if (!phase && !ctx._brainData) {
71
+ // Skip brain routeTask when L1 unified pilContext already supplied gsd_phase
72
+ // (on ctx.gsdPhase) or brain retrieval data (_brainData) a separate routeTask
73
+ // round-trip would duplicate the unified endpoint.
74
+ if (!phase && !ctx._brainData && !ctx.gsdPhase) {
73
75
  const eeRoute = await routeTask(ctx.raw).catch((err) => {
74
76
  logEeFailure("pil.layer4.routeTask", classifyEeError(err), err);
75
77
  return null;
@@ -124,13 +126,23 @@ export async function layer4Gsd(ctx) {
124
126
  // read/summarize/architecture tasks (deliverableKind "report") down the heavy
125
127
  // council + AskUserQuestion path, over-asking on a task that just wanted a
126
128
  // written summary (session 666630479c1a: "Đọc và tóm tắt kiến trúc…" raised 2
127
- // askcards + a council loop). Only when the model emitted no deliverable
128
- // (deliverableKind null → legacy cascade) do we fall back to regex predicates:
129
+ // askcards + a council loop).
130
+ //
131
+ // BUT a "report" deliverable can still be a genuine implementation request the
132
+ // model mis-tagged (e.g. "make a plan to implement OAuth device flow" — the
133
+ // deliverable IS a plan/report, yet the raw prompt asks to implement). Without
134
+ // a guard this never entered GSD. isImplementationIntent re-checks the raw
135
+ // text so a real implementation ask overrides the deliverable-kind shortcut;
136
+ // a genuine summary/read prompt (no implementation keywords) still passes
137
+ // through as informational.
138
+ //
139
+ // Only when the model emitted no deliverable (deliverableKind null → legacy
140
+ // cascade) do we fall back to regex predicates:
129
141
  // 1. isMetaAnalysisPrompt — self/CLI evaluation, prior-turn reflection.
130
142
  // 2. taskType "general" classified as a real task by L1.
131
143
  // 3. question-shaped prompt that is NOT an implementation request.
132
144
  const informational = ctx.deliverableKind
133
- ? ctx.deliverableKind !== "code"
145
+ ? ctx.deliverableKind !== "code" && !isImplementationIntent(ctx.raw)
134
146
  : isMetaAnalysisPrompt(ctx.raw) ||
135
147
  (ctx.taskType === "general" && ctx.intentKind === "task") ||
136
148
  (isQuestionLike(ctx.raw) && !isImplementationIntent(ctx.raw));
@@ -141,17 +153,57 @@ export async function layer4Gsd(ctx) {
141
153
  // language the model detected (the old regex only caught Vietnamese).
142
154
  const ecosystem = ctx.ecosystemScope === true;
143
155
  const replyLanguage = ctx.replyLanguage ?? undefined;
144
- const directive = buildDirective({ tier, phase, informational, ecosystem, replyLanguage });
145
- // truncateToBudget takes a TOKEN budget (×CHARS_PER_TOKEN internally). Floor it
146
- // at DIRECTIVE_MIN_TOKENS so the full directive always survives, even at the
147
- // default tokenBudget=500 where the bare fraction would gut it.
148
- const directiveTokenBudget = Math.max(Math.floor(ctx.tokenBudget * DIRECTIVE_BUDGET_FRACTION), DIRECTIVE_MIN_TOKENS);
149
- const trimmed = truncateToBudget(directive.text, directiveTokenBudget);
156
+ const native = isGsdNativeEnabled();
157
+ const sprintExecution = isSprintPlanExecution(ctx.raw);
158
+ let trimmed;
159
+ let blocking = false;
160
+ let appliedTier = tier;
161
+ if (sprintExecution) {
162
+ // Sprint plan execution: the plan has already been debated and reviewed by
163
+ // the council. The impl turn must APPLY it, not re-enter gsd_plan_review.
164
+ // Override any depth-tier hint that would tell the model to plan first.
165
+ const execDirective = [
166
+ "[sprint-execution] The attached text is an APPROVED sprint plan.",
167
+ "EXECUTE it directly with edit_file/write_file/bash tools.",
168
+ "Do NOT call gsd_discuss, gsd_plan, or gsd_plan_review — the plan is already reviewed.",
169
+ "After edits, run gsd_verify if verification steps are listed, otherwise finish.",
170
+ ].join(" ");
171
+ trimmed = truncateToBudget(execDirective, 200);
172
+ blocking = false;
173
+ appliedTier = "standard";
174
+ }
175
+ else if (native && !informational) {
176
+ const cwd = process.cwd();
177
+ const wf = readState(cwd);
178
+ // Heavy is now a hard MANDATORY sequence (Task 8 wires the runtime mutation
179
+ // gate that actually BLOCKs edit_file/write_file/bash on this depth); standard
180
+ // stays advisory-only — never say BLOCKED for standard, the gate doesn't fire there.
181
+ const heavyLine = tier === "heavy"
182
+ ? " MANDATORY (heavy): gsd_status → gsd_discuss → gsd_plan → gsd_plan_review BEFORE any edit_file/write_file/bash. Mutation tools are BLOCKED until plan-review passes. Start with gsd_status now."
183
+ : "";
184
+ const nativeHint = [
185
+ "[gsd-native] Tools: gsd_status, gsd_discuss, gsd_plan, gsd_plan_review, gsd_execute, gsd_verify, gsd_ship.",
186
+ `Depth=${tier}. standard/heavy: recommend gsd_plan_review before gsd_execute; then gsd_verify → gsd_ship.${heavyLine}`,
187
+ wf.phase ? `phase=${wf.phase}` : "gsd_status bootstraps .planning/",
188
+ wf.planVerified ? "plan-verified=yes" : "plan-verified=pending",
189
+ ].join(" ");
190
+ trimmed = truncateToBudget(nativeHint, 200);
191
+ blocking = tier === "heavy";
192
+ appliedTier = tier;
193
+ }
194
+ else {
195
+ const directive = buildDirective({ tier, phase, informational, ecosystem, replyLanguage, nativeGsd: native });
196
+ const directiveTokenBudget = Math.max(Math.floor(ctx.tokenBudget * DIRECTIVE_BUDGET_FRACTION), DIRECTIVE_MIN_TOKENS);
197
+ trimmed = truncateToBudget(directive.text, directiveTokenBudget);
198
+ blocking = directive.blocking;
199
+ appliedTier = directive.tier;
200
+ }
150
201
  const depthSource = ctx.modelDepthTier ? "model" : "default";
151
202
  return {
152
203
  ...ctx,
153
204
  gsdPhase: phase,
154
205
  complexityTier: tier,
206
+ gsdGateBlocking: blocking,
155
207
  grayAreas,
156
208
  enriched: `${ctx.enriched}\n${trimmed}`,
157
209
  layers: [
@@ -160,11 +212,12 @@ export async function layer4Gsd(ctx) {
160
212
  name: "gsd-workflow-structuring",
161
213
  applied: true,
162
214
  delta: [
163
- `tier=${directive.tier}`,
215
+ `tier=${appliedTier}`,
216
+ `native=${native}`,
164
217
  `depth=${depthSource}`,
165
218
  `phase=${phase ?? "none"}`,
166
219
  `route=${routeSource}`,
167
- `blocking=${directive.blocking}`,
220
+ `blocking=${blocking}`,
168
221
  `chars=${trimmed.length}`,
169
222
  ].join(" "),
170
223
  },
@@ -50,11 +50,15 @@ async function fetchPrinciples(raw, budget) {
50
50
  }
51
51
  async function fetchFlowState(cwd, budget) {
52
52
  try {
53
- const activeRunPath = path.join(cwd, ".muonroi-flow", "active-run");
54
- const runId = (await fs.readFile(activeRunPath, "utf8")).trim();
53
+ // Canonical focus pointer: `state.md` `Active Run` (run-manager). The old
54
+ // `.muonroi-flow/active-run` file had no writer in src and always read stale
55
+ // (F8 follow-up: dropped that dead path in favor of the single source).
56
+ const { getActiveRunId } = await import("../flow/run-manager.js");
57
+ const flowDir = path.join(cwd, ".muonroi-flow");
58
+ const runId = await getActiveRunId(flowDir);
55
59
  if (!runId)
56
60
  return "";
57
- const statePath = path.join(cwd, ".muonroi-flow", "runs", runId, "state.md");
61
+ const statePath = path.join(flowDir, "runs", runId, "state.md");
58
62
  const state = await fs.readFile(statePath, "utf8");
59
63
  const phaseLine = state.match(/phase:\s*(.+)/i)?.[1]?.trim() ?? "unknown";
60
64
  const statusLine = state.match(/status:\s*(.+)/i)?.[1]?.trim() ?? "unknown";
@@ -17,6 +17,29 @@ import type { ProviderId } from "../providers/types.js";
17
17
  import type { PipelineContext } from "./types.js";
18
18
  export declare function isMetaAnalysisPrompt(raw: string): boolean;
19
19
  export declare function applyPilSuffix(systemPrompt: string, ctx: PipelineContext, responseToolsActive?: boolean): string;
20
+ /**
21
+ * Detect an explicit IMPLEMENTATION / edit-the-files intent. When the user asks
22
+ * to implement/edit/refactor (the deliverable is file changes, not a structured
23
+ * report), a terminal `respond_<task>` tool is inappropriate: the model can call
24
+ * it mid-task to "state a plan/answer" and the turn then winds down before the
25
+ * edits are finished. Live (grok session 19fa8895c41c): an "Improve … implement
26
+ * these fixes" prompt was classified `debug`, so `respond_debug` was offered; the
27
+ * model called it after reading the files, made a few edits, then stopped — the
28
+ * HTML was never wired. Dropping the tool just falls through to the markdown
29
+ * OUTPUT RULES (graceful — exactly what code-heavy tasks already do), so a false
30
+ * positive on an analysis turn only forgoes structured JSON, never breaks output.
31
+ *
32
+ * High-signal verbs only (implement/edit/wire/rewrite/rename/scaffold/refactor/
33
+ * improve, "make the change", "apply the fix/patch", VI equivalents incl. "cải
34
+ * thiện"). Bare "fix"/"replace" are excluded — too common in analysis ("explain
35
+ * the fix") — so pure analyze/plan/debug-investigation turns keep their
36
+ * structured output. "improve(ment)" / "cải thiện" added after session
37
+ * 2b7a10219499: "lên plan rồi improvement … cải thiện Compaction" was an
38
+ * implement turn the model mis-classified as a `report`, so a terminal
39
+ * respond_plan ended it on a plan (edits done but uncommitted/unreported).
40
+ */
41
+ export declare const SPRINT_EXECUTION_MARKER = "[SPRINT-PLAN-EXECUTION: locked]";
42
+ export declare function isSprintPlanExecution(raw: string): boolean;
20
43
  export declare function isImplementationIntent(raw: string): boolean;
21
44
  export declare function isQuestionLike(raw: string): boolean;
22
45
  export declare function prefersStructuredReport(raw: string): boolean;
@@ -285,7 +285,11 @@ export function applyPilSuffix(systemPrompt, ctx, responseToolsActive = false) {
285
285
  * implement turn the model mis-classified as a `report`, so a terminal
286
286
  * respond_plan ended it on a plan (edits done but uncommitted/unreported).
287
287
  */
288
- const IMPLEMENTATION_INTENT_RE = /\b(implement|edit|wire(?:\s+up)?|rewrite|rename|scaffold|refactor)\b|\bimprove(?:ment)?\b|\bmake\s+(the\s+)?(change|edit|modification)s?\b|\bapply\s+(the\s+)?(fix|change|patch|edit|diff)\b|(?:^|\s)(triển\s*khai|trien\s*khai|chỉnh\s*sửa|chinh\s*sua|viết\s*lại|viet\s*lai|đổi\s*tên|doi\s*ten|cải\s*thiện|cai\s*thien)\b/i;
288
+ export const SPRINT_EXECUTION_MARKER = "[SPRINT-PLAN-EXECUTION: locked]";
289
+ export function isSprintPlanExecution(raw) {
290
+ return raw.includes(SPRINT_EXECUTION_MARKER) || raw.includes("--- SPRINT PLAN TO IMPLEMENT ---");
291
+ }
292
+ const IMPLEMENTATION_INTENT_RE = /\b(implement|edit|wire(?:\s+up)?|rewrite|rename|scaffold|refactor)\b|\bimprove(?:ment)?\b|\bmake\s+(the\s+)?(change|edit|modification)s?\b|\bapply\s+(the\s+)?(fix|change|patch|edit|diff)\b|(?:^|\s)(triển\s*khai|trien\s*khai|chỉnh\s*sửa|chinh\s*sua|viết\s*lại|viet\s*lai|đổi\s*tên|doi\s*ten|cải\s*thiện|cai\s*thien)\b|\[SPRINT-PLAN-EXECUTION:\s*locked\]/i;
289
293
  export function isImplementationIntent(raw) {
290
294
  return !!raw && IMPLEMENTATION_INTENT_RE.test(raw);
291
295
  }
@@ -49,6 +49,18 @@ export interface LlmClassifyResult {
49
49
  * what the task actually entails, not by which keywords it happens to contain.
50
50
  */
51
51
  depthTier: DepthTier | null;
52
+ /**
53
+ * Model-decided clarity: true when the request is UNDERSPECIFIED — missing
54
+ * information the agent would need to proceed without guessing (an unstated
55
+ * target/scope, a vague "make it better", competing interpretations, or an
56
+ * unresolved design choice). Drives the interview gate: a `standard`-depth
57
+ * task that is underspecified earns a clarify/council pass instead of hot-
58
+ * pathing straight to implementation. `false` = well-specified enough to plan
59
+ * directly. null when the model omitted the word → treated as not-
60
+ * underspecified (the don't-over-ask safe direction). Agent-first replacement
61
+ * for the regex `scoreSufficiency` scorer.
62
+ */
63
+ needsClarification: boolean | null;
52
64
  /**
53
65
  * Model-decided scope: true when the turn is about the Muonroi PLATFORM /
54
66
  * ecosystem (BB/.NET packages, building-block, open-core, rule engine,
@@ -67,7 +79,19 @@ export interface LlmClassifyResult {
67
79
  */
68
80
  replyLanguage: string | null;
69
81
  }
70
- export type LlmClassifyFn = (prompt: string, signal?: AbortSignal) => Promise<LlmClassifyResult | null>;
82
+ /**
83
+ * Options for a classify call. `recentTurns` is a compact digest of the last
84
+ * few conversation turns; when present the classifier uses it ONLY to resolve
85
+ * back-references in the new message (e.g. "từ các phần đó", "làm tiếp", "this")
86
+ * so a terse follow-up that points at heavy prior work is not mis-scored as a
87
+ * trivial one-liner. Without it the classifier sees the bare prompt and is blind
88
+ * to context — the documented "chấm điểm chỉ dựa only prompt" failure.
89
+ */
90
+ export interface LlmClassifyOptions {
91
+ recentTurns?: string | null;
92
+ signal?: AbortSignal;
93
+ }
94
+ export type LlmClassifyFn = (prompt: string, opts?: LlmClassifyOptions) => Promise<LlmClassifyResult | null>;
71
95
  /**
72
96
  * Build a closure the PIL pipeline can call. Reuses the orchestrator's already-
73
97
  * constructed providerFactory + modelId so we don't pay key-loading cost twice.
@@ -82,8 +106,15 @@ export interface SubSessionRouteResult {
82
106
  confidence: number;
83
107
  reason: string;
84
108
  }
85
- export declare function classifySubSessionActionHeuristic(prompt: string): SubSessionRouteResult | null;
86
109
  export declare function classifySubSessionAction(factory: ProviderFactory, modelId: string, prompt: string, contextInfo?: {
87
110
  currentChars: number;
88
111
  threshold: number;
112
+ /**
113
+ * Compact digest of recent conversation turns. The router's system prompt
114
+ * says it decides "based on the conversation history" — without this the
115
+ * history was never actually supplied and the router judged the prompt in
116
+ * isolation, so a follow-up like "ok làm phần đó đi" could not be told apart
117
+ * from a fresh unrelated task. Supplying it makes the claim true.
118
+ */
119
+ recentTurns?: string | null;
89
120
  }, signal?: AbortSignal): Promise<SubSessionRouteResult | null>;