muonroi-cli 1.8.4 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
  5. package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
  7. package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
  9. package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
  10. package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
  11. package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
  12. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  13. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  14. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  15. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  16. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  17. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  18. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  19. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  20. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  21. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  22. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  23. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  24. package/dist/src/agent-harness/mock-model.d.ts +38 -0
  25. package/dist/src/agent-harness/mock-model.js +69 -3
  26. package/dist/src/agent-harness/test-spawn.js +31 -0
  27. package/dist/src/chat/chat-keychain.d.ts +7 -12
  28. package/dist/src/chat/chat-keychain.js +19 -86
  29. package/dist/src/cli/config/screen-providers.js +1 -1
  30. package/dist/src/cli/cost-forensics.d.ts +10 -0
  31. package/dist/src/cli/cost-forensics.js +18 -3
  32. package/dist/src/cli/keys-bundle.d.ts +1 -1
  33. package/dist/src/cli/keys-bundle.js +1 -1
  34. package/dist/src/cli/keys.d.ts +10 -47
  35. package/dist/src/cli/keys.js +31 -399
  36. package/dist/src/council/clarifier.d.ts +31 -3
  37. package/dist/src/council/clarifier.js +220 -32
  38. package/dist/src/council/context.js +49 -15
  39. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  40. package/dist/src/council/debate-checkpoint.js +176 -0
  41. package/dist/src/council/debate-planner.js +54 -5
  42. package/dist/src/council/debate-summary.d.ts +25 -0
  43. package/dist/src/council/debate-summary.js +85 -0
  44. package/dist/src/council/debate.d.ts +169 -2
  45. package/dist/src/council/debate.js +1265 -135
  46. package/dist/src/council/index.d.ts +108 -1
  47. package/dist/src/council/index.js +670 -197
  48. package/dist/src/council/leader.d.ts +26 -0
  49. package/dist/src/council/leader.js +150 -9
  50. package/dist/src/council/llm.d.ts +94 -0
  51. package/dist/src/council/llm.js +348 -55
  52. package/dist/src/council/panel-select.d.ts +30 -0
  53. package/dist/src/council/panel-select.js +82 -0
  54. package/dist/src/council/planner.js +40 -0
  55. package/dist/src/council/preflight.d.ts +17 -0
  56. package/dist/src/council/preflight.js +50 -2
  57. package/dist/src/council/prompts.d.ts +39 -4
  58. package/dist/src/council/prompts.js +256 -69
  59. package/dist/src/council/stance-recall.d.ts +42 -0
  60. package/dist/src/council/stance-recall.js +57 -0
  61. package/dist/src/council/strip-think.d.ts +17 -0
  62. package/dist/src/council/strip-think.js +33 -0
  63. package/dist/src/council/types.d.ts +138 -0
  64. package/dist/src/ee/artifact-cache.d.ts +16 -0
  65. package/dist/src/ee/artifact-cache.js +32 -0
  66. package/dist/src/ee/auth.d.ts +20 -0
  67. package/dist/src/ee/auth.js +54 -2
  68. package/dist/src/ee/bridge.d.ts +10 -0
  69. package/dist/src/ee/bridge.js +58 -0
  70. package/dist/src/ee/client.js +109 -21
  71. package/dist/src/ee/ee-onboarding.js +6 -26
  72. package/dist/src/ee/export-transcripts.d.ts +1 -0
  73. package/dist/src/ee/export-transcripts.js +8 -10
  74. package/dist/src/ee/extract-session.js +29 -0
  75. package/dist/src/ee/extract-style.d.ts +58 -0
  76. package/dist/src/ee/extract-style.js +270 -0
  77. package/dist/src/ee/recall-ledger.d.ts +9 -0
  78. package/dist/src/ee/recall-ledger.js +3 -0
  79. package/dist/src/ee/scope.d.ts +1 -0
  80. package/dist/src/ee/scope.js +26 -1
  81. package/dist/src/ee/search.d.ts +7 -0
  82. package/dist/src/ee/search.js +24 -0
  83. package/dist/src/ee/transcript-emit.js +2 -0
  84. package/dist/src/ee/types.d.ts +22 -0
  85. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  86. package/dist/src/ee/who-am-i-brain.js +220 -0
  87. package/dist/src/ee/who-am-i.d.ts +10 -3
  88. package/dist/src/ee/who-am-i.js +12 -0
  89. package/dist/src/ee/workflow-event.d.ts +48 -0
  90. package/dist/src/ee/workflow-event.js +81 -0
  91. package/dist/src/flow/compaction/compress.d.ts +3 -3
  92. package/dist/src/flow/compaction/compress.js +58 -8
  93. package/dist/src/flow/compaction/extract.d.ts +4 -7
  94. package/dist/src/flow/compaction/extract.js +50 -10
  95. package/dist/src/flow/compaction/index.d.ts +14 -1
  96. package/dist/src/flow/compaction/index.js +96 -3
  97. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  98. package/dist/src/flow/compaction/input-guard.js +43 -0
  99. package/dist/src/flow/compaction/progress.d.ts +35 -0
  100. package/dist/src/flow/compaction/progress.js +35 -0
  101. package/dist/src/flow/fold-planning.d.ts +36 -0
  102. package/dist/src/flow/fold-planning.js +83 -0
  103. package/dist/src/flow/hierarchy.d.ts +146 -0
  104. package/dist/src/flow/hierarchy.js +427 -0
  105. package/dist/src/flow/index.d.ts +1 -0
  106. package/dist/src/flow/index.js +2 -0
  107. package/dist/src/flow/run-artifacts.d.ts +102 -0
  108. package/dist/src/flow/run-artifacts.js +208 -0
  109. package/dist/src/generated/version.d.ts +1 -1
  110. package/dist/src/generated/version.js +1 -1
  111. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  112. package/dist/src/gsd/assessment-schema.js +134 -0
  113. package/dist/src/gsd/capability-registry.d.ts +45 -0
  114. package/dist/src/gsd/capability-registry.js +337 -0
  115. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  116. package/dist/src/gsd/complexity-assessor.js +152 -0
  117. package/dist/src/gsd/config-bridge.d.ts +7 -0
  118. package/dist/src/gsd/config-bridge.js +114 -0
  119. package/dist/src/gsd/config-loader.d.ts +27 -0
  120. package/dist/src/gsd/config-loader.js +50 -0
  121. package/dist/src/gsd/council-context.d.ts +44 -0
  122. package/dist/src/gsd/council-context.js +114 -0
  123. package/dist/src/gsd/ee-closure.d.ts +28 -0
  124. package/dist/src/gsd/ee-closure.js +49 -0
  125. package/dist/src/gsd/flags.d.ts +66 -0
  126. package/dist/src/gsd/flags.js +102 -0
  127. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  128. package/dist/src/gsd/gsd-dispatch.js +131 -0
  129. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  130. package/dist/src/gsd/gsd-runtime.js +37 -0
  131. package/dist/src/gsd/host-adapter.d.ts +11 -0
  132. package/dist/src/gsd/host-adapter.js +29 -0
  133. package/dist/src/gsd/index.d.ts +24 -1
  134. package/dist/src/gsd/index.js +27 -0
  135. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  136. package/dist/src/gsd/loop-host-contract.js +39 -0
  137. package/dist/src/gsd/loop-host.d.ts +69 -0
  138. package/dist/src/gsd/loop-host.js +245 -0
  139. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  140. package/dist/src/gsd/loop-resolver.js +79 -0
  141. package/dist/src/gsd/model-tier.d.ts +13 -0
  142. package/dist/src/gsd/model-tier.js +45 -0
  143. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  144. package/dist/src/gsd/mutation-gate.js +41 -0
  145. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  146. package/dist/src/gsd/native-roadmap.js +343 -0
  147. package/dist/src/gsd/native-state.d.ts +47 -0
  148. package/dist/src/gsd/native-state.js +220 -0
  149. package/dist/src/gsd/paths.d.ts +23 -0
  150. package/dist/src/gsd/paths.js +66 -0
  151. package/dist/src/gsd/phase-dag.d.ts +12 -0
  152. package/dist/src/gsd/phase-dag.js +94 -0
  153. package/dist/src/gsd/phase-sync.d.ts +42 -0
  154. package/dist/src/gsd/phase-sync.js +321 -0
  155. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  156. package/dist/src/gsd/pil-gate-context.js +64 -0
  157. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  158. package/dist/src/gsd/pil-gate-critic.js +74 -0
  159. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  160. package/dist/src/gsd/plan-council-prompts.js +79 -0
  161. package/dist/src/gsd/plan-council.d.ts +44 -0
  162. package/dist/src/gsd/plan-council.js +283 -0
  163. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  164. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  165. package/dist/src/gsd/product-workspace.d.ts +13 -0
  166. package/dist/src/gsd/product-workspace.js +124 -0
  167. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  168. package/dist/src/gsd/ship-bridge.js +65 -0
  169. package/dist/src/gsd/state-document.d.ts +40 -0
  170. package/dist/src/gsd/state-document.js +163 -0
  171. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  172. package/dist/src/gsd/verdict-schema.js +144 -0
  173. package/dist/src/gsd/verify-context.d.ts +22 -0
  174. package/dist/src/gsd/verify-context.js +27 -0
  175. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  176. package/dist/src/gsd/verify-council-prompts.js +85 -0
  177. package/dist/src/gsd/verify-council.d.ts +25 -0
  178. package/dist/src/gsd/verify-council.js +119 -0
  179. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  180. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  181. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  182. package/dist/src/gsd/workflow-engine.js +207 -0
  183. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  184. package/dist/src/gsd/workflow-tools.js +277 -0
  185. package/dist/src/headless/council-answers.js +4 -0
  186. package/dist/src/hooks/index.js +1 -1
  187. package/dist/src/index.js +172 -270
  188. package/dist/src/lsp/builtins.js +3 -1
  189. package/dist/src/lsp/manager.d.ts +5 -1
  190. package/dist/src/lsp/manager.js +249 -3
  191. package/dist/src/lsp/npm-cache.d.ts +11 -1
  192. package/dist/src/lsp/npm-cache.js +17 -1
  193. package/dist/src/lsp/runtime.d.ts +6 -1
  194. package/dist/src/lsp/runtime.js +17 -1
  195. package/dist/src/lsp/types.d.ts +83 -1
  196. package/dist/src/lsp/types.js +10 -0
  197. package/dist/src/maintain/pr-builder.js +23 -13
  198. package/dist/src/mcp/auto-setup.js +57 -32
  199. package/dist/src/mcp/client-pool.js +44 -16
  200. package/dist/src/mcp/lsp-tools.d.ts +5 -1
  201. package/dist/src/mcp/lsp-tools.js +93 -2
  202. package/dist/src/mcp/mcp-keychain.d.ts +3 -5
  203. package/dist/src/mcp/mcp-keychain.js +9 -49
  204. package/dist/src/mcp/research-onboarding.js +8 -7
  205. package/dist/src/mcp/runtime.js +34 -2
  206. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  207. package/dist/src/mcp/setup-guide-text.js +22 -2
  208. package/dist/src/mcp/tools-server.d.ts +10 -0
  209. package/dist/src/mcp/tools-server.js +10 -2
  210. package/dist/src/models/catalog-client.d.ts +87 -0
  211. package/dist/src/models/catalog-client.js +105 -38
  212. package/dist/src/models/catalog.json +528 -265
  213. package/dist/src/models/registry.d.ts +22 -7
  214. package/dist/src/models/registry.js +73 -10
  215. package/dist/src/ops/doctor.js +1 -1
  216. package/dist/src/orchestrator/ask-user.d.ts +61 -0
  217. package/dist/src/orchestrator/ask-user.js +65 -0
  218. package/dist/src/orchestrator/auto-commit.js +1 -1
  219. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  220. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  221. package/dist/src/orchestrator/cache-prefix.js +83 -0
  222. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  223. package/dist/src/orchestrator/compact-request.js +41 -0
  224. package/dist/src/orchestrator/compaction.d.ts +12 -3
  225. package/dist/src/orchestrator/compaction.js +35 -15
  226. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  227. package/dist/src/orchestrator/council-manager.js +74 -32
  228. package/dist/src/orchestrator/council-request.d.ts +49 -0
  229. package/dist/src/orchestrator/council-request.js +62 -0
  230. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  231. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  232. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  233. package/dist/src/orchestrator/error-utils.js +132 -24
  234. package/dist/src/orchestrator/grounding-check.js +39 -1
  235. package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
  236. package/dist/src/orchestrator/interactive-pause.js +36 -0
  237. package/dist/src/orchestrator/message-processor.d.ts +4 -0
  238. package/dist/src/orchestrator/message-processor.js +268 -41
  239. package/dist/src/orchestrator/orchestrator.d.ts +64 -3
  240. package/dist/src/orchestrator/orchestrator.js +823 -120
  241. package/dist/src/orchestrator/preprocessor.js +3 -3
  242. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  243. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  244. package/dist/src/orchestrator/prompts.js +17 -17
  245. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  246. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  247. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  248. package/dist/src/orchestrator/retry-classifier.js +46 -2
  249. package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
  250. package/dist/src/orchestrator/safety-askcard.js +5 -2
  251. package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
  252. package/dist/src/orchestrator/safety-intercept.js +62 -0
  253. package/dist/src/orchestrator/scope-reminder.js +1 -1
  254. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  255. package/dist/src/orchestrator/session-experience.js +2 -1
  256. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  257. package/dist/src/orchestrator/should-run-gate.js +18 -0
  258. package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
  259. package/dist/src/orchestrator/stall-watchdog.js +65 -10
  260. package/dist/src/orchestrator/stream-runner.d.ts +13 -3
  261. package/dist/src/orchestrator/stream-runner.js +115 -49
  262. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  263. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  264. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  265. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  266. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  267. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  268. package/dist/src/orchestrator/tool-engine.d.ts +41 -0
  269. package/dist/src/orchestrator/tool-engine.js +846 -66
  270. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  271. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  272. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  273. package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
  274. package/dist/src/orchestrator/turn-watchdog.js +84 -0
  275. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  276. package/dist/src/pil/agent-operating-contract.js +6 -4
  277. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  278. package/dist/src/pil/cheap-model-playbook.js +5 -1
  279. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  280. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  281. package/dist/src/pil/discovery-types.d.ts +1 -0
  282. package/dist/src/pil/discovery.d.ts +1 -1
  283. package/dist/src/pil/discovery.js +18 -13
  284. package/dist/src/pil/layer1-intent.d.ts +18 -6
  285. package/dist/src/pil/layer1-intent.js +66 -757
  286. package/dist/src/pil/layer15-context-scan.js +15 -1
  287. package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
  288. package/dist/src/pil/layer1_5-complexity-size.js +31 -5
  289. package/dist/src/pil/layer3-ee-injection.js +23 -8
  290. package/dist/src/pil/layer4-gsd.js +69 -16
  291. package/dist/src/pil/layer5-context.js +7 -3
  292. package/dist/src/pil/layer6-output.d.ts +23 -0
  293. package/dist/src/pil/layer6-output.js +5 -1
  294. package/dist/src/pil/llm-classify.d.ts +111 -5
  295. package/dist/src/pil/llm-classify.js +421 -189
  296. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  297. package/dist/src/pil/native-capabilities-workbook.js +8 -0
  298. package/dist/src/pil/pipeline.js +36 -2
  299. package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
  300. package/dist/src/pil/repo-grounding-probe.js +136 -0
  301. package/dist/src/pil/repo-structure-hints.d.ts +7 -0
  302. package/dist/src/pil/repo-structure-hints.js +45 -0
  303. package/dist/src/pil/response-tools.js +5 -3
  304. package/dist/src/pil/schema.d.ts +1 -0
  305. package/dist/src/pil/schema.js +2 -0
  306. package/dist/src/pil/types.d.ts +18 -0
  307. package/dist/src/playbook/directives.d.ts +4 -0
  308. package/dist/src/playbook/directives.js +17 -5
  309. package/dist/src/product-loop/artifact-io.js +4 -0
  310. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  311. package/dist/src/product-loop/backlog-builder.js +30 -6
  312. package/dist/src/product-loop/criteria-seed.d.ts +51 -0
  313. package/dist/src/product-loop/criteria-seed.js +200 -0
  314. package/dist/src/product-loop/discovery-context-format.js +3 -1
  315. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  316. package/dist/src/product-loop/discovery-interview.d.ts +9 -0
  317. package/dist/src/product-loop/discovery-interview.js +60 -12
  318. package/dist/src/product-loop/discovery-recommender.js +2 -1
  319. package/dist/src/product-loop/discovery-schema.js +19 -2
  320. package/dist/src/product-loop/discovery-triage.d.ts +23 -0
  321. package/dist/src/product-loop/discovery-triage.js +109 -0
  322. package/dist/src/product-loop/gather.js +150 -2
  323. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  324. package/dist/src/product-loop/ideal-trace.js +64 -0
  325. package/dist/src/product-loop/index.d.ts +13 -1
  326. package/dist/src/product-loop/index.js +340 -52
  327. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  328. package/dist/src/product-loop/loop-driver.js +330 -106
  329. package/dist/src/product-loop/phase-plan.d.ts +21 -0
  330. package/dist/src/product-loop/phase-plan.js +81 -6
  331. package/dist/src/product-loop/phase-rituals.d.ts +3 -0
  332. package/dist/src/product-loop/phase-rituals.js +8 -3
  333. package/dist/src/product-loop/phase-runner.js +39 -12
  334. package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
  335. package/dist/src/product-loop/plan-adherence-review.js +144 -0
  336. package/dist/src/product-loop/sprint-runner.d.ts +173 -0
  337. package/dist/src/product-loop/sprint-runner.js +863 -19
  338. package/dist/src/product-loop/types.d.ts +61 -5
  339. package/dist/src/providers/adapter.d.ts +1 -1
  340. package/dist/src/providers/adapter.js +3 -4
  341. package/dist/src/providers/anthropic.d.ts +9 -8
  342. package/dist/src/providers/anthropic.js +13 -47
  343. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  344. package/dist/src/providers/auth/browser-flow.js +1 -1
  345. package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
  346. package/dist/src/providers/auth/grok-oauth.js +30 -5
  347. package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
  348. package/dist/src/providers/auth/openai-oauth.js +15 -1
  349. package/dist/src/providers/auth/registry.js +0 -34
  350. package/dist/src/providers/auth/token-store.d.ts +9 -9
  351. package/dist/src/providers/auth/token-store.js +8 -67
  352. package/dist/src/providers/auth/types.d.ts +9 -1
  353. package/dist/src/providers/auth/types.js +1 -1
  354. package/dist/src/providers/capabilities.d.ts +24 -5
  355. package/dist/src/providers/capabilities.js +42 -24
  356. package/dist/src/providers/endpoints.d.ts +2 -2
  357. package/dist/src/providers/endpoints.js +11 -10
  358. package/dist/src/providers/env-store.d.ts +17 -0
  359. package/dist/src/providers/env-store.js +228 -0
  360. package/dist/src/providers/keychain.d.ts +22 -18
  361. package/dist/src/providers/keychain.js +127 -140
  362. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  363. package/dist/src/providers/openai-compatible.js +8 -1
  364. package/dist/src/providers/pricing.d.ts +2 -2
  365. package/dist/src/providers/pricing.js +3 -13
  366. package/dist/src/providers/runtime.d.ts +43 -3
  367. package/dist/src/providers/runtime.js +88 -14
  368. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  369. package/dist/src/providers/strategies/base.strategy.js +24 -1
  370. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  371. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  372. package/dist/src/providers/strategies/registry.js +4 -4
  373. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  374. package/dist/src/providers/strategies/thinking-mode.js +288 -1
  375. package/dist/src/providers/strategies/xai.strategy.js +27 -0
  376. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  377. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  378. package/dist/src/providers/types.d.ts +5 -6
  379. package/dist/src/providers/types.js +2 -2
  380. package/dist/src/providers/vision-backend.d.ts +47 -0
  381. package/dist/src/providers/vision-backend.js +258 -0
  382. package/dist/src/providers/vision-proxy.d.ts +22 -9
  383. package/dist/src/providers/vision-proxy.js +63 -132
  384. package/dist/src/providers/warm.d.ts +65 -0
  385. package/dist/src/providers/warm.js +145 -0
  386. package/dist/src/providers/wire-debug.js +95 -0
  387. package/dist/src/router/decide.d.ts +13 -0
  388. package/dist/src/router/decide.js +138 -36
  389. package/dist/src/router/peak-hour.d.ts +38 -0
  390. package/dist/src/router/peak-hour.js +107 -0
  391. package/dist/src/router/step-router.js +3 -2
  392. package/dist/src/router/warm.js +4 -5
  393. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  394. package/dist/src/scaffold/continuation-prompt.js +26 -0
  395. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  396. package/dist/src/scaffold/point-to-existing.js +25 -0
  397. package/dist/src/self-qa/agentic-loop.js +6 -5
  398. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  399. package/dist/src/{ui/state → state}/active-run.js +21 -0
  400. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  401. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  402. package/dist/src/state/turn-trace.d.ts +43 -0
  403. package/dist/src/state/turn-trace.js +32 -0
  404. package/dist/src/storage/db.js +2 -1
  405. package/dist/src/storage/index.d.ts +1 -1
  406. package/dist/src/storage/index.js +1 -1
  407. package/dist/src/storage/interaction-log.d.ts +1 -1
  408. package/dist/src/storage/migrations.js +71 -1
  409. package/dist/src/storage/sessions.d.ts +28 -10
  410. package/dist/src/storage/sessions.js +78 -21
  411. package/dist/src/storage/transcript-view.js +1 -1
  412. package/dist/src/storage/transcript.d.ts +51 -0
  413. package/dist/src/storage/transcript.js +340 -15
  414. package/dist/src/tools/file.d.ts +15 -0
  415. package/dist/src/tools/file.js +32 -0
  416. package/dist/src/tools/git-safety.d.ts +19 -0
  417. package/dist/src/tools/git-safety.js +168 -0
  418. package/dist/src/tools/native-tools.d.ts +1 -1
  419. package/dist/src/tools/native-tools.js +81 -1
  420. package/dist/src/tools/registry.d.ts +20 -0
  421. package/dist/src/tools/registry.js +576 -23
  422. package/dist/src/tools/research.d.ts +29 -0
  423. package/dist/src/tools/research.js +233 -0
  424. package/dist/src/types/index.d.ts +147 -4
  425. package/dist/src/ui/app.js +0 -0
  426. package/dist/src/ui/cards/product-status-card.js +1 -1
  427. package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
  428. package/dist/src/ui/components/agent-rail-activities.js +47 -0
  429. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  430. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  431. package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
  432. package/dist/src/ui/components/compact-progress-card.js +42 -0
  433. package/dist/src/ui/components/context-rail.d.ts +26 -0
  434. package/dist/src/ui/components/context-rail.js +33 -0
  435. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  436. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  437. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  438. package/dist/src/ui/components/council-debate-pill.js +34 -0
  439. package/dist/src/ui/components/council-info-card.js +2 -2
  440. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  441. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  442. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  443. package/dist/src/ui/components/council-message-bubble.js +16 -15
  444. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  445. package/dist/src/ui/components/council-phase-timeline.js +66 -17
  446. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  447. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  448. package/dist/src/ui/components/council-question-card.js +13 -12
  449. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  450. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  451. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  452. package/dist/src/ui/components/council-round-group.js +88 -0
  453. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  454. package/dist/src/ui/components/council-status-list.js +36 -24
  455. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  456. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  457. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  458. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  459. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  460. package/dist/src/ui/components/message-view.d.ts +15 -0
  461. package/dist/src/ui/components/message-view.js +50 -1
  462. package/dist/src/ui/components/prompt-box.js +18 -16
  463. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  464. package/dist/src/ui/components/session-tree-card.js +46 -0
  465. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  466. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  467. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  468. package/dist/src/ui/components/task-list-panel.js +22 -2
  469. package/dist/src/ui/components/tool-group.d.ts +15 -3
  470. package/dist/src/ui/components/tool-group.js +69 -11
  471. package/dist/src/ui/containers/modals-layer.d.ts +4 -2
  472. package/dist/src/ui/containers/modals-layer.js +2 -2
  473. package/dist/src/ui/council-harness-event.d.ts +57 -0
  474. package/dist/src/ui/council-harness-event.js +46 -0
  475. package/dist/src/ui/heartbeat-debug.d.ts +29 -0
  476. package/dist/src/ui/heartbeat-debug.js +45 -0
  477. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  478. package/dist/src/ui/mcp-modal.js +2 -4
  479. package/dist/src/ui/modals/api-key-modal.js +1 -1
  480. package/dist/src/ui/modals/connect-modal.js +4 -3
  481. package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
  482. package/dist/src/ui/modals/model-picker-modal.js +8 -10
  483. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  484. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  485. package/dist/src/ui/picker-providers.d.ts +1 -1
  486. package/dist/src/ui/picker-providers.js +1 -1
  487. package/dist/src/ui/primitives/index.d.ts +1 -0
  488. package/dist/src/ui/primitives/index.js +2 -0
  489. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  490. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  491. package/dist/src/ui/slash/compact.js +5 -7
  492. package/dist/src/ui/slash/cost.js +1 -1
  493. package/dist/src/ui/slash/council.js +19 -1
  494. package/dist/src/ui/slash/debug.d.ts +3 -31
  495. package/dist/src/ui/slash/debug.js +9 -20
  496. package/dist/src/ui/slash/ee.js +81 -0
  497. package/dist/src/ui/slash/ideal.d.ts +6 -2
  498. package/dist/src/ui/slash/ideal.js +97 -7
  499. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  500. package/dist/src/ui/slash/menu-items.js +23 -20
  501. package/dist/src/ui/slash/registry.d.ts +2 -0
  502. package/dist/src/ui/slash/registry.js +4 -0
  503. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  504. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  505. package/dist/src/ui/status-bar/index.d.ts +1 -1
  506. package/dist/src/ui/status-bar/index.js +7 -3
  507. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  508. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  509. package/dist/src/ui/theme.d.ts +1 -0
  510. package/dist/src/ui/theme.js +2 -0
  511. package/dist/src/ui/types.d.ts +7 -0
  512. package/dist/src/ui/use-app-logic.js +0 -0
  513. package/dist/src/ui/utils/agent-activities.d.ts +39 -0
  514. package/dist/src/ui/utils/agent-activities.js +96 -0
  515. package/dist/src/ui/utils/format.d.ts +14 -0
  516. package/dist/src/ui/utils/format.js +23 -3
  517. package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
  518. package/dist/src/ui/utils/group-tool-entries.js +111 -0
  519. package/dist/src/ui/utils/tool-summary.d.ts +21 -0
  520. package/dist/src/ui/utils/tool-summary.js +91 -0
  521. package/dist/src/usage/downgrade.js +2 -2
  522. package/dist/src/usage/product-ledger.js +2 -2
  523. package/dist/src/utils/event-loop-monitor.d.ts +85 -0
  524. package/dist/src/utils/event-loop-monitor.js +107 -0
  525. package/dist/src/utils/install-manager.js +2 -1
  526. package/dist/src/utils/llm-deadline.d.ts +14 -0
  527. package/dist/src/utils/llm-deadline.js +19 -0
  528. package/dist/src/utils/logger.js +2 -2
  529. package/dist/src/utils/loop-profiler.d.ts +102 -0
  530. package/dist/src/utils/loop-profiler.js +202 -0
  531. package/dist/src/utils/permission-mode.js +5 -3
  532. package/dist/src/utils/redactor.js +1 -1
  533. package/dist/src/utils/settings.d.ts +180 -5
  534. package/dist/src/utils/settings.js +271 -31
  535. package/dist/src/utils/side-question.d.ts +1 -2
  536. package/dist/src/utils/side-question.js +2 -2
  537. package/dist/src/utils/visible-retry.d.ts +11 -0
  538. package/dist/src/utils/visible-retry.js +10 -1
  539. package/dist/src/verify/entrypoint.d.ts +1 -1
  540. package/dist/src/verify/entrypoint.js +52 -17
  541. package/dist/src/verify/orchestrator.d.ts +1 -1
  542. package/dist/src/verify/orchestrator.js +20 -3
  543. package/dist/src/verify/recipes.d.ts +13 -0
  544. package/dist/src/verify/recipes.js +15 -0
  545. package/package.json +134 -132
  546. package/dist/src/cli/bw-vault.d.ts +0 -55
  547. package/dist/src/cli/bw-vault.js +0 -133
  548. package/dist/src/mcp/ee-tools.d.ts +0 -46
  549. package/dist/src/mcp/ee-tools.js +0 -193
  550. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  551. package/dist/src/providers/auth/gcloud.js +0 -102
  552. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  553. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  554. package/dist/src/providers/gemini.d.ts +0 -11
  555. package/dist/src/providers/gemini.js +0 -45
  556. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  557. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  558. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  559. package/dist/src/providers/strategies/google.strategy.js +0 -174
  560. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  561. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  562. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -7,11 +7,75 @@
7
7
  */
8
8
  import { promises as fs } from "node:fs";
9
9
  import * as path from "node:path";
10
+ import { recordArtifact } from "../../ee/artifact-cache.js";
11
+ import { getDefaultEEClient } from "../../ee/intercept.js";
10
12
  import { estimateConversationTokens, serializeConversation } from "../../orchestrator/compaction.js";
11
13
  import { atomicWriteText } from "../../storage/atomic-io.js";
14
+ import { logger } from "../../utils/logger.js";
12
15
  import { readArtifact, writeArtifact } from "../artifact-io.js";
13
16
  import { compressChat } from "./compress.js";
14
17
  import { extractDecisions } from "./extract.js";
18
+ import { stageProgress } from "./progress.js";
19
+ /**
20
+ * Anti-mù for the deliberate (/compact) path — parity with the auto/tool-loop
21
+ * compaction which persists every elided tool output via persistArtifact.
22
+ *
23
+ * deliberateCompact rewrites the whole history into a prose summary, so without
24
+ * this the model loses the ability to `ee_query "tool-artifact id=<id>"` a
25
+ * specific tool result after /compact. We record each tool result into the
26
+ * in-process + disk artifact cache (the tier ee_query reads FIRST, before EE),
27
+ * and fire a best-effort EE extract so cross-session rehydrate also survives.
28
+ * Fail-open: a cache/EE hiccup never blocks the compaction.
29
+ */
30
+ export function recordToolArtifactsForRehydrate(messages, projectPath) {
31
+ let recorded = 0;
32
+ for (const msg of messages) {
33
+ if (msg.role !== "tool" || !Array.isArray(msg.content))
34
+ continue;
35
+ for (const part of msg.content) {
36
+ if (part?.type !== "tool-result")
37
+ continue;
38
+ const toolCallId = typeof part.toolCallId === "string" ? part.toolCallId : "";
39
+ if (!toolCallId)
40
+ continue;
41
+ const toolName = typeof part.toolName === "string" ? part.toolName : "";
42
+ // AI SDK v5 tool-result payloads live under `output` (typed) or `result`.
43
+ const payload = part.output ?? part.result;
44
+ const content = typeof payload === "string"
45
+ ? payload
46
+ : payload == null
47
+ ? ""
48
+ : (() => {
49
+ try {
50
+ return JSON.stringify(payload);
51
+ }
52
+ catch {
53
+ return String(payload);
54
+ }
55
+ })();
56
+ if (!content)
57
+ continue;
58
+ try {
59
+ recordArtifact(toolCallId, toolName, content);
60
+ recorded++;
61
+ getDefaultEEClient()
62
+ .extract({
63
+ transcript: content.slice(0, 8000),
64
+ projectPath,
65
+ meta: { source: "tool-artifact", toolCallId, toolName, reason: "deliberate-compact" },
66
+ }, AbortSignal.timeout(700))
67
+ .catch(() => { });
68
+ }
69
+ catch (err) {
70
+ logger.error("orchestrator", "deliberate-compact artifact record failed", {
71
+ toolCallId,
72
+ message: err?.message,
73
+ });
74
+ }
75
+ }
76
+ }
77
+ return recorded;
78
+ }
15
79
  /**
16
80
  * Orchestrate two-pass deliberate compaction.
17
81
  *
@@ -20,9 +84,35 @@ import { extractDecisions } from "./extract.js";
20
84
  * 3. Pass 2: compressChat -> compressed output
21
85
  * 4. Return metrics
22
86
  */
23
- export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBudget, provider, modelId) {
87
+ export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBudget, modelId, customInstructions, onProgress) {
88
+ // Callers reach this through @ts-nocheck UI code, so an argument-order drift
89
+ // is invisible to tsc. It is NOT invisible at runtime: a non-string modelId
90
+ // makes resolveModelRuntime throw, compressChat catches it, and /compact
91
+ // silently degrades to truncation — which is how commit e2100fb7 shipped a
92
+ // broken /compact. Fail loudly instead of summarizing nothing.
93
+ if (modelId !== undefined && typeof modelId !== "string") {
94
+ throw new TypeError(`deliberateCompact: modelId must be a model id string, got ${typeof modelId}. ` +
95
+ `Check the argument order at the call site.`);
96
+ }
97
+ const report = (stage, fraction) => {
98
+ if (!onProgress)
99
+ return;
100
+ try {
101
+ onProgress(stageProgress(stage, fraction));
102
+ }
103
+ catch (err) {
104
+ // A broken progress sink must never fail the compaction it is reporting.
105
+ logger.error("orchestrator", "compact progress callback threw", { stage, message: err?.message });
106
+ }
107
+ };
108
+ report("artifacts");
109
+ // Anti-mù parity: persist every tool result to the artifact cache (+ EE)
110
+ // BEFORE we summarize the history away, so the model can still rehydrate a
111
+ // specific tool output via ee_query "tool-artifact id=<id>" after /compact.
112
+ recordToolArtifactsForRehydrate(messages, flowDir);
24
113
  // Pass 1: Extract decisions/facts/constraints
25
- const extracted = extractDecisions(messages);
114
+ report("extract");
115
+ const extracted = await extractDecisions(messages, modelId, customInstructions);
26
116
  const totalExtracted = extracted.decisions.length + extracted.facts.length + extracted.constraints.length;
27
117
  // Append to decisions.md
28
118
  if (totalExtracted > 0) {
@@ -43,6 +133,7 @@ export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBu
43
133
  await writeArtifact(flowDir, "decisions.md", existing, ["Decisions", "Facts", "Constraints"]);
44
134
  }
45
135
  // Snapshot full chat to history/
136
+ report("snapshot");
46
137
  const historyDir = path.join(flowDir, "history");
47
138
  await fs.mkdir(historyDir, { recursive: true });
48
139
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
@@ -55,7 +146,9 @@ export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBu
55
146
  // Token estimation before
56
147
  const tokensBefore = estimateConversationTokens(systemPrompt, messages);
57
148
  // Pass 2: Compress
58
- const compressed = await compressChat(messages, systemPrompt, tokenBudget, provider, modelId);
149
+ report("compress");
150
+ const compressed = await compressChat(messages, systemPrompt, tokenBudget, modelId, customInstructions, (f) => report("compress", f));
151
+ report("done");
59
152
  return {
60
153
  decisionsExtracted: totalExtracted,
61
154
  tokensBeforeCompress: tokensBefore,
@@ -0,0 +1,24 @@
1
+ /**
2
+ * src/flow/compaction/input-guard.ts
3
+ *
4
+ * Guard the INPUT of the deliberate-compaction LLM calls (extractDecisions +
5
+ * compressChat) against context-window overflow.
6
+ *
7
+ * Compaction fires precisely when a conversation has grown large — which is
8
+ * exactly when the full serialized history can EXCEED the compaction model's
9
+ * own context window. Both passes previously sent the whole serialized text as
10
+ * a single prompt with no bound, so on a very long session the summarizing call
11
+ * would fail (or the provider would hard-truncate the tail, dropping the most
12
+ * recent — most relevant — context) and fall back to a dumb truncation.
13
+ *
14
+ * This keeps the HEAD (task setup / early decisions) and the TAIL (most recent
15
+ * work) and elides the middle, so the summarizer always gets a coherent,
16
+ * in-window view of both ends. Pure + dependency-free.
17
+ */
18
+ /**
19
+ * Cap `text` to a safe char budget derived from the compaction model's context
20
+ * window. Returns the text unchanged when it already fits (or the window is
21
+ * unknown and the text is under the floor). Otherwise keeps head+tail and marks
22
+ * the elided middle.
23
+ */
24
+ export declare function capCompactionInput(text: string, contextWindowTokens: number): string;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * src/flow/compaction/input-guard.ts
3
+ *
4
+ * Guard the INPUT of the deliberate-compaction LLM calls (extractDecisions +
5
+ * compressChat) against context-window overflow.
6
+ *
7
+ * Compaction fires precisely when a conversation has grown large — which is
8
+ * exactly when the full serialized history can EXCEED the compaction model's
9
+ * own context window. Both passes previously sent the whole serialized text as
10
+ * a single prompt with no bound, so on a very long session the summarizing call
11
+ * would fail (or the provider would hard-truncate the tail, dropping the most
12
+ * recent — most relevant — context) and fall back to a dumb truncation.
13
+ *
14
+ * This keeps the HEAD (task setup / early decisions) and the TAIL (most recent
15
+ * work) and elides the middle, so the summarizer always gets a coherent,
16
+ * in-window view of both ends. Pure + dependency-free.
17
+ */
18
+ /** Fraction of the model window we allow the compaction INPUT to occupy. */
19
+ const INPUT_WINDOW_FRACTION = 0.55;
20
+ /** Chars-per-token estimate (matches the rest of the compaction code). */
21
+ const CHARS_PER_TOKEN = 4;
22
+ /** Absolute floor so a tiny/unknown window never collapses the input to nothing. */
23
+ const MIN_INPUT_CHARS = 24_000;
24
+ /**
25
+ * Cap `text` to a safe char budget derived from the compaction model's context
26
+ * window. Returns the text unchanged when it already fits (or the window is
27
+ * unknown and the text is under the floor). Otherwise keeps head+tail and marks
28
+ * the elided middle.
29
+ */
30
+ export function capCompactionInput(text, contextWindowTokens) {
31
+ const windowBudget = contextWindowTokens > 0 ? Math.floor(contextWindowTokens * CHARS_PER_TOKEN * INPUT_WINDOW_FRACTION) : 0;
32
+ const budget = Math.max(MIN_INPUT_CHARS, windowBudget);
33
+ if (text.length <= budget)
34
+ return text;
35
+ // Split the budget between head and tail, reserving room for the marker.
36
+ const headChars = Math.floor(budget * 0.5);
37
+ const tailChars = budget - headChars;
38
+ const head = text.slice(0, headChars);
39
+ const tail = text.slice(text.length - tailChars);
40
+ const elided = text.length - headChars - tailChars;
41
+ return `${head}\n\n[... ${elided} characters of the middle of the conversation elided to fit the compaction model's context window; the head (task setup) and tail (most recent work) are preserved ...]\n\n${tail}`;
42
+ }
43
+ //# sourceMappingURL=input-guard.js.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * src/flow/compaction/progress.ts
3
+ *
4
+ * Progress model for deliberate (/compact) compaction.
5
+ *
6
+ * A compaction is a fixed pipeline of stages (see index.ts), so the percentage
7
+ * is stage-weighted rather than invented: each stage owns a span of the bar and
8
+ * only advances when that stage really advances. The two LLM passes dominate the
9
+ * wall-clock, which is why they own most of the span; the compress pass streams,
10
+ * so it reports a genuine within-stage fraction instead of freezing.
11
+ *
12
+ * Weights are ordered spans covering 0..100 with no gaps — asserted in tests so
13
+ * a new stage can't silently make the bar jump or stall.
14
+ */
15
+ export type CompactStage = "artifacts" | "extract" | "snapshot" | "compress" | "done";
16
+ export interface CompactProgress {
17
+ stage: CompactStage;
18
+ /** 0..100, monotonic across the run. */
19
+ percent: number;
20
+ /** Human-readable current step, e.g. "Compressing history…". */
21
+ label: string;
22
+ }
23
+ export type CompactProgressFn = (progress: CompactProgress) => void;
24
+ interface StageSpan {
25
+ from: number;
26
+ to: number;
27
+ label: string;
28
+ }
29
+ export declare const COMPACT_STAGE_SPANS: Record<CompactStage, StageSpan>;
30
+ /**
31
+ * Percent for a stage at `fraction` (0..1) of its own work. Callers that cannot
32
+ * measure within-stage progress pass 0 and land on the stage's start.
33
+ */
34
+ export declare function stageProgress(stage: CompactStage, fraction?: number): CompactProgress;
35
+ export {};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * src/flow/compaction/progress.ts
3
+ *
4
+ * Progress model for deliberate (/compact) compaction.
5
+ *
6
+ * A compaction is a fixed pipeline of stages (see index.ts), so the percentage
7
+ * is stage-weighted rather than invented: each stage owns a span of the bar and
8
+ * only advances when that stage really advances. The two LLM passes dominate the
9
+ * wall-clock, which is why they own most of the span; the compress pass streams,
10
+ * so it reports a genuine within-stage fraction instead of freezing.
11
+ *
12
+ * Weights are ordered spans covering 0..100 with no gaps — asserted in tests so
13
+ * a new stage can't silently make the bar jump or stall.
14
+ */
15
+ export const COMPACT_STAGE_SPANS = {
16
+ artifacts: { from: 0, to: 5, label: "Preserving tool artifacts…" },
17
+ extract: { from: 5, to: 40, label: "Extracting decisions…" },
18
+ snapshot: { from: 40, to: 50, label: "Snapshotting history…" },
19
+ compress: { from: 50, to: 100, label: "Compressing history…" },
20
+ done: { from: 100, to: 100, label: "Compacted" },
21
+ };
22
+ /**
23
+ * Percent for a stage at `fraction` (0..1) of its own work. Callers that cannot
24
+ * measure within-stage progress pass 0 and land on the stage's start.
25
+ */
26
+ export function stageProgress(stage, fraction = 0) {
27
+ const span = COMPACT_STAGE_SPANS[stage];
28
+ const clamped = Math.max(0, Math.min(1, Number.isFinite(fraction) ? fraction : 0));
29
+ return {
30
+ stage,
31
+ percent: Math.round(span.from + (span.to - span.from) * clamped),
32
+ label: span.label,
33
+ };
34
+ }
35
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Fold `.planning/` into `.muonroi-flow/planning/` — net-new, non-destructive
3
+ * consolidation migration (Sprint-2 Part A, staged per REV-3 Kill B).
4
+ *
5
+ * WHY staged / copy-only:
6
+ * GSD phases are still CREATED by the external `gsd-tools.cjs` subprocess,
7
+ * which writes to `.planning/` (hardcoded). Until that writer is removed
8
+ * (Part B — deferred), `.planning/` must remain the live tree. So this
9
+ * migration COPIES `.planning/` into the consolidated location and NEVER
10
+ * deletes the original — the read layer (`paths.ts::planningRoot`) keeps
11
+ * preferring `.planning/` while it exists, so there is zero desync risk.
12
+ * Once Part B stops writing `.planning/`, the folded tree becomes the live
13
+ * source transparently via the same read fallback.
14
+ *
15
+ * Guarantees:
16
+ * - Idempotent: guarded by a `.migrated` marker (NOT by directory existence —
17
+ * an empty `.muonroi-flow/planning/` must not make the fold skip forever;
18
+ * see REV-2 Kill #2).
19
+ * - Non-destructive: source `.planning/` is left untouched.
20
+ * - Byte-preserving: every copied file is asserted equal in size to its source.
21
+ */
22
+ export interface FoldResult {
23
+ /** True when a fold copy was performed this call. */
24
+ migrated: boolean;
25
+ /** Reason a fold was skipped (marker present / no source). */
26
+ skipReason?: "already-migrated" | "no-source";
27
+ /** Number of files copied. */
28
+ filesCopied: number;
29
+ /** Absolute path to the folded planning root. */
30
+ foldedRoot: string;
31
+ }
32
+ /**
33
+ * Perform the fold. Safe to call repeatedly; returns `{migrated:false}` when the
34
+ * marker is already present or there is no `.planning/` to fold.
35
+ */
36
+ export declare function foldPlanningIntoFlow(cwd: string): Promise<FoldResult>;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Fold `.planning/` into `.muonroi-flow/planning/` — net-new, non-destructive
3
+ * consolidation migration (Sprint-2 Part A, staged per REV-3 Kill B).
4
+ *
5
+ * WHY staged / copy-only:
6
+ * GSD phases are still CREATED by the external `gsd-tools.cjs` subprocess,
7
+ * which writes to `.planning/` (hardcoded). Until that writer is removed
8
+ * (Part B — deferred), `.planning/` must remain the live tree. So this
9
+ * migration COPIES `.planning/` into the consolidated location and NEVER
10
+ * deletes the original — the read layer (`paths.ts::planningRoot`) keeps
11
+ * preferring `.planning/` while it exists, so there is zero desync risk.
12
+ * Once Part B stops writing `.planning/`, the folded tree becomes the live
13
+ * source transparently via the same read fallback.
14
+ *
15
+ * Guarantees:
16
+ * - Idempotent: guarded by a `.migrated` marker (NOT by directory existence —
17
+ * an empty `.muonroi-flow/planning/` must not make the fold skip forever;
18
+ * see REV-2 Kill #2).
19
+ * - Non-destructive: source `.planning/` is left untouched.
20
+ * - Byte-preserving: every copied file is asserted equal in size to its source.
21
+ */
22
+ import { promises as fs } from "node:fs";
23
+ import * as path from "node:path";
24
+ const FLOW_DIR = ".muonroi-flow";
25
+ const PLANNING_DIR = ".planning";
26
+ const FOLDED_SUBDIR = "planning";
27
+ const MARKER = ".migrated";
28
+ /** Recursively copy a directory, asserting byte-size preservation per file. */
29
+ async function copyTreePreserving(src, dest) {
30
+ let copied = 0;
31
+ const entries = await fs.readdir(src, { withFileTypes: true });
32
+ await fs.mkdir(dest, { recursive: true });
33
+ for (const entry of entries) {
34
+ const from = path.join(src, entry.name);
35
+ const to = path.join(dest, entry.name);
36
+ if (entry.isDirectory()) {
37
+ copied += await copyTreePreserving(from, to);
38
+ }
39
+ else if (entry.isFile()) {
40
+ await fs.copyFile(from, to);
41
+ const [srcStat, destStat] = await Promise.all([fs.stat(from), fs.stat(to)]);
42
+ if (srcStat.size !== destStat.size) {
43
+ throw new Error(`fold-planning: byte mismatch copying ${from} (${srcStat.size} != ${destStat.size})`);
44
+ }
45
+ copied += 1;
46
+ }
47
+ // Symlinks / other node types are intentionally skipped — .planning holds
48
+ // only regular files and dirs; a stray symlink is not worth following.
49
+ }
50
+ return copied;
51
+ }
52
+ /**
53
+ * Perform the fold. Safe to call repeatedly; returns `{migrated:false}` when the
54
+ * marker is already present or there is no `.planning/` to fold.
55
+ */
56
+ export async function foldPlanningIntoFlow(cwd) {
57
+ const foldedRoot = path.join(cwd, FLOW_DIR, FOLDED_SUBDIR);
58
+ const markerPath = path.join(foldedRoot, MARKER);
59
+ // Marker guard — idempotent regardless of whether the folded dir is empty.
60
+ try {
61
+ await fs.access(markerPath);
62
+ return { migrated: false, skipReason: "already-migrated", filesCopied: 0, foldedRoot };
63
+ }
64
+ catch {
65
+ /* marker absent → proceed */
66
+ }
67
+ const source = path.join(cwd, PLANNING_DIR);
68
+ try {
69
+ const st = await fs.stat(source);
70
+ if (!st.isDirectory()) {
71
+ return { migrated: false, skipReason: "no-source", filesCopied: 0, foldedRoot };
72
+ }
73
+ }
74
+ catch {
75
+ return { migrated: false, skipReason: "no-source", filesCopied: 0, foldedRoot };
76
+ }
77
+ const filesCopied = await copyTreePreserving(source, foldedRoot);
78
+ // Stamp the marker LAST so a crash mid-copy leaves no false "migrated" flag —
79
+ // the next call re-copies (copyFile overwrites, byte-assert still holds).
80
+ await fs.writeFile(markerPath, JSON.stringify({ migratedFrom: PLANNING_DIR, filesCopied, note: "copy-only; original left in place" }, null, 2), "utf8");
81
+ return { migrated: true, filesCopied, foldedRoot };
82
+ }
83
+ //# sourceMappingURL=fold-planning.js.map
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Milestone → Phase → Run hierarchy for the Product Ideal Loop.
3
+ *
4
+ * Sprint-2 Part A (full plan, item 2 of the deferred list). Built as an ADDITIVE
5
+ * INDEX LAYER on top of `runs/<runId>/` (per REV-3 Kill B / REV-2 Kill #7): it
6
+ * groups runs under phases under milestones for navigation and cross-run memory,
7
+ * but does NOT reroute the numeric ROADMAP phases that phase-sync depends on. A
8
+ * phase here simply *references* the run IDs executed under it; the run
9
+ * artifacts remain the source of truth for sprint/verify state.
10
+ *
11
+ * .muonroi-flow/milestones/<mid>/milestone.json ← canonical record (read)
12
+ * .muonroi-flow/milestones/<mid>/milestone.md ← human-reviewable render
13
+ * .muonroi-flow/milestones/<mid>/phases/<pid>/phase.json
14
+ * .muonroi-flow/milestones/<mid>/phases/<pid>/phase.md
15
+ *
16
+ * The active milestone/phase pointers live in the top-level `state.md`
17
+ * ("Active Milestone" / "Active Phase" sections), alongside "Active Run".
18
+ *
19
+ * Records are JSON for reliable machine reads; the paired `.md` is a rendered
20
+ * summary only (never parsed back). Writes are atomic. Reads are tolerant: a
21
+ * missing/corrupt record returns null, never throws.
22
+ */
23
+ export interface MilestoneRecord {
24
+ /** Sortable slug id, e.g. "m01-native-state". */
25
+ id: string;
26
+ /** Human title. */
27
+ title: string;
28
+ /** One-line goal / outcome the milestone delivers. */
29
+ goal: string;
30
+ /** Ordinal (1-based) — mirrors the numeric prefix in the id for stable sort. */
31
+ ordinal: number;
32
+ /** lifecycle status. */
33
+ status: "active" | "done" | "archived";
34
+ /** ISO creation timestamp. */
35
+ createdAt: string;
36
+ /** ISO last-update timestamp. */
37
+ updatedAt: string;
38
+ }
39
+ export interface PhaseRecord {
40
+ /** Sortable slug id, e.g. "p01-scoping". */
41
+ id: string;
42
+ /** Parent milestone id. */
43
+ milestoneId: string;
44
+ /** Human title. */
45
+ title: string;
46
+ /** One-line goal. */
47
+ goal: string;
48
+ /** Ordinal (1-based) within the milestone. */
49
+ ordinal: number;
50
+ /** lifecycle status. */
51
+ status: "active" | "done" | "archived";
52
+ /** Run IDs executed under this phase (the index link; runs stay canonical). */
53
+ runIds: string[];
54
+ /** ISO creation timestamp. */
55
+ createdAt: string;
56
+ /** ISO last-update timestamp. */
57
+ updatedAt: string;
58
+ }
59
+ export declare const MILESTONES_DIR = "milestones";
60
+ /** List all milestones, sorted by ordinal ascending. */
61
+ export declare function listMilestones(flowDir: string): Promise<MilestoneRecord[]>;
62
+ export declare function loadMilestone(flowDir: string, milestoneId: string): Promise<MilestoneRecord | null>;
63
+ /**
64
+ * Create a milestone. `nowIso` is injected (never Date.now here) so callers
65
+ * control the clock and tests stay deterministic. Ordinal is next-highest+1.
66
+ */
67
+ export declare function createMilestone(flowDir: string, input: {
68
+ title: string;
69
+ goal?: string;
70
+ }, nowIso: string): Promise<MilestoneRecord>;
71
+ export declare function updateMilestone(flowDir: string, milestoneId: string, patch: Partial<Pick<MilestoneRecord, "title" | "goal" | "status">>, nowIso: string): Promise<MilestoneRecord | null>;
72
+ /** List phases under a milestone, sorted by ordinal ascending. */
73
+ export declare function listPhases(flowDir: string, milestoneId: string): Promise<PhaseRecord[]>;
74
+ export declare function loadPhase(flowDir: string, milestoneId: string, phaseId: string): Promise<PhaseRecord | null>;
75
+ export declare function createPhase(flowDir: string, milestoneId: string, input: {
76
+ title: string;
77
+ goal?: string;
78
+ runId?: string;
79
+ }, nowIso: string): Promise<PhaseRecord>;
80
+ export declare function updatePhase(flowDir: string, milestoneId: string, phaseId: string, patch: Partial<Pick<PhaseRecord, "title" | "goal" | "status">>, nowIso: string): Promise<PhaseRecord | null>;
81
+ /** Link a run to a phase (idempotent — no duplicate run ids). */
82
+ export declare function attachRunToPhase(flowDir: string, milestoneId: string, phaseId: string, runId: string, nowIso: string): Promise<PhaseRecord | null>;
83
+ /**
84
+ * Find the milestone+phase a run is already indexed under, scanning every
85
+ * milestone. Returns null when the run is not yet linked anywhere. Used to keep
86
+ * scoping wiring idempotent across `/ideal resume` (the scoping stage re-runs).
87
+ */
88
+ export declare function findPhaseForRun(flowDir: string, runId: string): Promise<{
89
+ milestoneId: string;
90
+ phaseId: string;
91
+ } | null>;
92
+ /**
93
+ * Idempotently place a run in the hierarchy and mark it active. First call for a
94
+ * run creates (or reuses the active) milestone, opens a phase for the run, links
95
+ * it, and points the active-milestone/active-phase pointers at it. Subsequent
96
+ * calls (resume) are no-ops that just re-assert the pointers.
97
+ *
98
+ * The milestone groups an idea/product; the phase is one scoped iteration under
99
+ * it. This is purely an INDEX over `runs/<runId>/` — it never moves or rewrites
100
+ * run artifacts, and the numeric ROADMAP phases that phase-sync reads are
101
+ * untouched.
102
+ */
103
+ export declare function ensureRunScoped(flowDir: string, input: {
104
+ runId: string;
105
+ milestoneTitle: string;
106
+ milestoneGoal?: string;
107
+ phaseTitle: string;
108
+ phaseGoal?: string;
109
+ }, nowIso: string): Promise<{
110
+ milestoneId: string;
111
+ phaseId: string;
112
+ }>;
113
+ /**
114
+ * One-time backfill: index any `runs/<id>/` not yet linked to a phase under a
115
+ * synthetic `m00-legacy` milestone (one phase per orphan run). Idempotent — runs
116
+ * already indexed are skipped, and re-running adds only newly-orphaned runs.
117
+ * Returns the number of runs newly indexed.
118
+ *
119
+ * `m00` (ordinal 0) sorts before any real milestone so legacy work stays visible
120
+ * but out of the way. The clock is injected for deterministic tests.
121
+ */
122
+ export declare function migrateLegacyRuns(flowDir: string, nowIso: string): Promise<number>;
123
+ export interface ActivePointer {
124
+ milestoneId: string | null;
125
+ phaseId: string | null;
126
+ }
127
+ /**
128
+ * F8 — the active milestone/phase are DERIVED from the single canonical focus,
129
+ * the active run, via the hierarchy index; they are NOT separately persisted.
130
+ *
131
+ * Previously `state.md` carried independent `Active Run` (set for chat-runs) and
132
+ * `Active Milestone`/`Active Phase` (set by `ensureRunScoped` for product-runs)
133
+ * pointers that routinely drifted out of sync — `/ideal` never updated `Active
134
+ * Run`, so it pointed at a stale skeleton run while the milestone/phase pointed
135
+ * at the product run. Council decision (5/5): collapse to one truth. Whatever run
136
+ * is active, its phase (and that phase's milestone) is the active one; a
137
+ * chat/skeleton run that was never indexed resolves to nulls.
138
+ */
139
+ export declare function getActivePointer(flowDir: string): Promise<ActivePointer>;
140
+ /**
141
+ * Blank the legacy `Active Milestone`/`Active Phase` sections if an old
142
+ * `state.md` still carries them, so a stale value can never be mistaken for the
143
+ * (now derived) truth. One-time, idempotent; no-op when the sections are absent
144
+ * or already empty. Legacy files are otherwise read-as-junk — never migrated.
145
+ */
146
+ export declare function clearLegacyActivePointerSections(flowDir: string): Promise<void>;