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
@@ -1,6 +1,29 @@
1
+ import * as os from "node:os";
1
2
  import { classifyEeError, logEeFailure } from "../utils/ee-logger.js";
3
+ import { redactor } from "../utils/redactor.js";
2
4
  import { drainQueue, enqueue } from "./offline-queue.js";
3
5
  const DEFAULT_BASE = "http://localhost:8082";
6
+ function relativizePath(p) {
7
+ if (!p)
8
+ return p;
9
+ let normalized = p.replace(/\\/g, "/");
10
+ const home = os.homedir().replace(/\\/g, "/");
11
+ const normalizedHome = home.endsWith("/") ? home.slice(0, -1) : home;
12
+ if (normalized.startsWith(normalizedHome)) {
13
+ normalized = "~" + normalized.slice(normalizedHome.length);
14
+ }
15
+ return normalized;
16
+ }
17
+ function redactPayload(payload) {
18
+ if (!payload)
19
+ return payload;
20
+ try {
21
+ return JSON.parse(redactor.redact(JSON.stringify(payload)));
22
+ }
23
+ catch {
24
+ return payload;
25
+ }
26
+ }
4
27
  /**
5
28
  * Intercept timeout budget.
6
29
  * Local: 100ms (localhost p99 is <10ms, 100ms catches wedged server).
@@ -184,19 +207,33 @@ export function createEEClient(opts = {}) {
184
207
  }
185
208
  return {
186
209
  async health() {
210
+ const startedAt = Date.now();
187
211
  try {
188
212
  const resp = await f(`${baseUrl}/health`, {
189
213
  signal: AbortSignal.timeout(DEFAULT_HEALTH_TIMEOUT_MS),
190
214
  });
191
215
  return { ok: resp.ok, status: resp.status };
192
216
  }
193
- catch {
217
+ catch (err) {
218
+ // status:0 means "no response" and says nothing about WHY. Timeout, DNS,
219
+ // refused connection and TLS failure all degrade to the same shape, so a
220
+ // bare catch here leaves an agent with an unfalsifiable symptom — exactly
221
+ // what happened on 2026-07-17, when status:0 was really the server
222
+ // blocking its event loop.
223
+ logEeFailure("client.health", classifyEeError(err), err, {
224
+ elapsedMs: Date.now() - startedAt,
225
+ budgetMs: DEFAULT_HEALTH_TIMEOUT_MS,
226
+ });
194
227
  return { ok: false, status: 0 };
195
228
  }
196
229
  },
197
230
  async intercept(req) {
231
+ const redactedReq = {
232
+ ...req,
233
+ cwd: relativizePath(req.cwd),
234
+ };
198
235
  // 1. Cache hit — skip network entirely
199
- const cached = getCached(req);
236
+ const cached = getCached(redactedReq);
200
237
  if (cached)
201
238
  return cached;
202
239
  // 2. Circuit breaker — skip if open
@@ -207,7 +244,7 @@ export function createEEClient(opts = {}) {
207
244
  const resp = await f(`${baseUrl}/api/intercept`, {
208
245
  method: "POST",
209
246
  headers: headers(),
210
- body: JSON.stringify({ ...req, skipRoute: true }),
247
+ body: JSON.stringify(redactPayload({ ...redactedReq, skipRoute: true })),
211
248
  signal: AbortSignal.timeout(interceptTimeoutMs),
212
249
  });
213
250
  if (!resp.ok) {
@@ -221,7 +258,7 @@ export function createEEClient(opts = {}) {
221
258
  const raw = (await resp.json());
222
259
  const result = normalizeInterceptResponse(raw);
223
260
  recordCircuitSuccess({ fetchImpl: f, headers: headers(), baseUrl });
224
- setCached(req, result);
261
+ setCached(redactedReq, result);
225
262
  return result;
226
263
  }
227
264
  catch (err) {
@@ -231,10 +268,14 @@ export function createEEClient(opts = {}) {
231
268
  }
232
269
  },
233
270
  async posttool(payload) {
271
+ const redactedPayload = {
272
+ ...payload,
273
+ cwd: relativizePath(payload.cwd),
274
+ };
234
275
  await f(`${baseUrl}/api/posttool`, {
235
276
  method: "POST",
236
277
  headers: headers(),
237
- body: JSON.stringify(payload),
278
+ body: JSON.stringify(redactPayload(redactedPayload)),
238
279
  signal: AbortSignal.timeout(postToolTimeoutMs),
239
280
  }).catch((err) => {
240
281
  logEeFailure("client.posttool", classifyEeError(err), err);
@@ -243,6 +284,10 @@ export function createEEClient(opts = {}) {
243
284
  },
244
285
  async routeModel(req, signal) {
245
286
  try {
287
+ const redactedReq = {
288
+ ...req,
289
+ cwd: relativizePath(req.cwd),
290
+ };
246
291
  const ctrl = new AbortController();
247
292
  const t = setTimeout(() => ctrl.abort(), 250);
248
293
  if (signal)
@@ -250,7 +295,7 @@ export function createEEClient(opts = {}) {
250
295
  const resp = await f(`${baseUrl}/api/route-model`, {
251
296
  method: "POST",
252
297
  headers: headers(),
253
- body: JSON.stringify(req),
298
+ body: JSON.stringify(redactPayload(redactedReq)),
254
299
  signal: ctrl.signal,
255
300
  });
256
301
  clearTimeout(t);
@@ -264,6 +309,10 @@ export function createEEClient(opts = {}) {
264
309
  },
265
310
  async coldRoute(req, signal) {
266
311
  try {
312
+ const redactedReq = {
313
+ ...req,
314
+ cwd: relativizePath(req.cwd),
315
+ };
267
316
  const ctrl = new AbortController();
268
317
  const t = setTimeout(() => ctrl.abort(), 1000);
269
318
  if (signal)
@@ -271,7 +320,7 @@ export function createEEClient(opts = {}) {
271
320
  const resp = await f(`${baseUrl}/api/cold-route`, {
272
321
  method: "POST",
273
322
  headers: headers(),
274
- body: JSON.stringify(req),
323
+ body: JSON.stringify(redactPayload(redactedReq)),
275
324
  signal: ctrl.signal,
276
325
  });
277
326
  clearTimeout(t);
@@ -284,13 +333,14 @@ export function createEEClient(opts = {}) {
284
333
  }
285
334
  },
286
335
  feedback(payload) {
336
+ const redactedPayload = redactPayload(payload);
287
337
  f(`${baseUrl}/api/feedback`, {
288
338
  method: "POST",
289
339
  headers: headers(),
290
- body: JSON.stringify(payload),
340
+ body: JSON.stringify(redactedPayload),
291
341
  }).catch((err) => {
292
342
  logEeFailure("client.feedback", classifyEeError(err), err);
293
- void enqueue({ endpoint: "/api/feedback", body: payload, enqueuedAt: Date.now() });
343
+ void enqueue({ endpoint: "/api/feedback", body: redactedPayload, enqueuedAt: Date.now() });
294
344
  });
295
345
  },
296
346
  /**
@@ -300,7 +350,7 @@ export function createEEClient(opts = {}) {
300
350
  * stale_rule). Fire-and-forget; queued offline like standard feedback.
301
351
  */
302
352
  noiseFeedback(payload) {
303
- const body = { ...payload, verdict: "IRRELEVANT" };
353
+ const body = redactPayload({ ...payload, verdict: "IRRELEVANT" });
304
354
  f(`${baseUrl}/api/feedback`, {
305
355
  method: "POST",
306
356
  headers: headers(),
@@ -322,10 +372,11 @@ export function createEEClient(opts = {}) {
322
372
  },
323
373
  // ─── P0: Route feedback (fire-and-forget) ─────────────────────────────────
324
374
  routeFeedback(payload) {
375
+ const redactedPayload = redactPayload(payload);
325
376
  f(`${baseUrl}/api/route-feedback`, {
326
377
  method: "POST",
327
378
  headers: headers(),
328
- body: JSON.stringify(payload),
379
+ body: JSON.stringify(redactedPayload),
329
380
  }).catch((err) => {
330
381
  logEeFailure("client.routeFeedback", classifyEeError(err), err);
331
382
  /* fire-and-forget */
@@ -333,41 +384,54 @@ export function createEEClient(opts = {}) {
333
384
  },
334
385
  // ─── P1: Prompt-stale reconciliation ──────────────────────────────────────
335
386
  async promptStale(req) {
387
+ const redactedReq = redactPayload({
388
+ ...req,
389
+ nextPromptMeta: req.nextPromptMeta
390
+ ? {
391
+ ...req.nextPromptMeta,
392
+ cwd: req.nextPromptMeta.cwd ? relativizePath(req.nextPromptMeta.cwd) : undefined,
393
+ }
394
+ : undefined,
395
+ });
336
396
  try {
337
397
  const resp = await f(`${baseUrl}/api/prompt-stale`, {
338
398
  method: "POST",
339
399
  headers: headers(),
340
- body: JSON.stringify(req),
400
+ body: JSON.stringify(redactedReq),
341
401
  signal: AbortSignal.timeout(2000),
342
402
  });
343
403
  if (!resp.ok) {
344
- void enqueue({ endpoint: "/api/prompt-stale", body: req, enqueuedAt: Date.now() });
404
+ void enqueue({ endpoint: "/api/prompt-stale", body: redactedReq, enqueuedAt: Date.now() });
345
405
  return null;
346
406
  }
347
407
  return (await resp.json());
348
408
  }
349
409
  catch {
350
- void enqueue({ endpoint: "/api/prompt-stale", body: req, enqueuedAt: Date.now() });
410
+ void enqueue({ endpoint: "/api/prompt-stale", body: redactedReq, enqueuedAt: Date.now() });
351
411
  return null;
352
412
  }
353
413
  },
354
414
  // ─── P1: Session extract ──────────────────────────────────────────────────
355
415
  async extract(req, signal) {
416
+ const redactedReq = redactPayload({
417
+ ...req,
418
+ projectPath: relativizePath(req.projectPath),
419
+ });
356
420
  try {
357
421
  const resp = await f(`${baseUrl}/api/extract`, {
358
422
  method: "POST",
359
423
  headers: headers(),
360
- body: JSON.stringify(req),
424
+ body: JSON.stringify(redactedReq),
361
425
  signal: signal ?? AbortSignal.timeout(10_000),
362
426
  });
363
427
  if (!resp.ok) {
364
- void enqueue({ endpoint: "/api/extract", body: req, enqueuedAt: Date.now() });
428
+ void enqueue({ endpoint: "/api/extract", body: redactedReq, enqueuedAt: Date.now() });
365
429
  return null;
366
430
  }
367
431
  return (await resp.json());
368
432
  }
369
433
  catch {
370
- void enqueue({ endpoint: "/api/extract", body: req, enqueuedAt: Date.now() });
434
+ void enqueue({ endpoint: "/api/extract", body: redactedReq, enqueuedAt: Date.now() });
371
435
  return null;
372
436
  }
373
437
  },
@@ -527,29 +591,51 @@ export function createEEClient(opts = {}) {
527
591
  async recall(query, opts = {}) {
528
592
  const body = { query };
529
593
  if (opts.cwd)
530
- body.cwd = opts.cwd;
594
+ body.cwd = relativizePath(opts.cwd);
531
595
  if (opts.project)
532
596
  body.project_slug = opts.project;
533
597
  if (opts.sourceSession)
534
598
  body.sourceSession = opts.sourceSession;
599
+ // Per-stance recall weighting (item 3): forward the council stance/role so
600
+ // the server weights recall collections toward what this stance cares about.
601
+ if (opts.stance)
602
+ body.stance = opts.stance;
603
+ if (opts.role)
604
+ body.role = opts.role;
605
+ const redactedBody = redactPayload(body);
535
606
  // Server bounds the recall pipeline at ~8s internally (handleRecall's
536
607
  // AbortSignal.timeout(8000)); embedding + 3-leg search + network push real
537
608
  // wall-time past that (measured ~9.3s on a warm VPS). An 8s client ceiling
538
609
  // races the server and loses → spurious ee_unavailable. 15s gives margin
539
610
  // so a slow-but-valid recall still lands rather than being dropped.
540
611
  const timeoutMs = opts.timeoutMs ?? 15000;
612
+ const startedAt = Date.now();
541
613
  try {
542
614
  const resp = await f(`${baseUrl}/api/recall`, {
543
615
  method: "POST",
544
616
  headers: headers(),
545
- body: JSON.stringify(body),
617
+ body: JSON.stringify(redactedBody),
546
618
  signal: opts.signal ?? AbortSignal.timeout(timeoutMs),
547
619
  });
548
- if (!resp.ok)
620
+ if (!resp.ok) {
621
+ // Keep returning null — callers map it to "EE unavailable" — but never
622
+ // discard the status. Collapsing 429/401/500 into the same null a
623
+ // timeout produces is what made the 2026-07-17 incident unfalsifiable
624
+ // from the client: "is the server rate-limiting us?" could not be
625
+ // answered without reading the server's source.
626
+ logEeFailure("client.recall", "error", new Error(`HTTP ${resp.status}`), {
627
+ status: resp.status,
628
+ elapsedMs: Date.now() - startedAt,
629
+ });
549
630
  return null;
631
+ }
550
632
  return (await resp.json());
551
633
  }
552
- catch {
634
+ catch (err) {
635
+ logEeFailure("client.recall", classifyEeError(err), err, {
636
+ elapsedMs: Date.now() - startedAt,
637
+ budgetMs: timeoutMs,
638
+ });
553
639
  return null;
554
640
  }
555
641
  },
@@ -588,6 +674,8 @@ export function createEEClient(opts = {}) {
588
674
  body.maxTokens = options.maxTokens;
589
675
  if (options.provider)
590
676
  body.provider = options.provider;
677
+ if (options.useExtractModel)
678
+ body.useExtractModel = true;
591
679
  }
592
680
  const resp = await f(`${baseUrl}/api/brain`, {
593
681
  method: "POST",
@@ -8,27 +8,7 @@
8
8
  * health probe is reported, not hidden, and never blocks setup.
9
9
  */
10
10
  import { createInterface } from "node:readline";
11
- import { writeExperienceConfig } from "./auth.js";
12
- /** Best-effort reachability probe — returns true/false, never throws. */
13
- async function probeHealth(baseUrl, token) {
14
- try {
15
- const ac = new AbortController();
16
- const timer = setTimeout(() => ac.abort(), 4000);
17
- try {
18
- const res = await fetch(`${baseUrl}/health`, {
19
- signal: ac.signal,
20
- headers: token ? { authorization: `Bearer ${token}` } : undefined,
21
- });
22
- return res.ok;
23
- }
24
- finally {
25
- clearTimeout(timer);
26
- }
27
- }
28
- catch {
29
- return false;
30
- }
31
- }
11
+ import { probeEEHealth, writeExperienceConfig } from "./auth.js";
32
12
  /**
33
13
  * Returns true when a config was written (so the caller can reload EE auth).
34
14
  * Returns false when skipped or invalid.
@@ -38,8 +18,8 @@ export async function firstRunEESetup() {
38
18
  const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a)));
39
19
  try {
40
20
  process.stderr.write("\nExperience Engine (optional) — a shared brain that recalls past decisions, gotchas,\n" +
41
- "and recipes so the agent works like a senior on your stack. You can set this up later\n" +
42
- "by editing ~/.experience/config.json or setting MUONROI_EE_BASE_URL.\n\n");
21
+ "and recipes so the agent works like a senior on your stack. Skipping is fine: you can\n" +
22
+ "connect one at any time with `/ee config <url> [token]`.\n\n");
43
23
  const url = (await ask("EE server URL (blank to skip): ")).trim();
44
24
  if (!url) {
45
25
  process.stderr.write("Skipped Experience Engine setup.\n");
@@ -59,10 +39,10 @@ export async function firstRunEESetup() {
59
39
  ...(token ? { serverAuthToken: token } : {}),
60
40
  });
61
41
  process.stderr.write(`Wrote Experience Engine config → ~/.experience/config.json (serverBaseUrl=${normalized}).\n`);
62
- const reachable = await probeHealth(normalized, token || undefined);
63
- process.stderr.write(reachable
42
+ const health = await probeEEHealth(normalized, token || undefined);
43
+ process.stderr.write(health.ok
64
44
  ? " ✓ EE server reachable.\n"
65
- : " ⚠ Could not reach the EE server right now (saved anyway run 'muonroi-cli doctor' to recheck).\n");
45
+ : ` ⚠ Could not reach the EE server right now — ${health.detail} (saved anyway; recheck with '/ee config').\n`);
66
46
  return true;
67
47
  }
68
48
  catch (err) {
@@ -15,6 +15,7 @@ export interface ExportOptions {
15
15
  dryRun?: boolean;
16
16
  /** Minimum messages per session to bother emitting (default 4 — skip noise). */
17
17
  minMessages?: number;
18
+ dbOverride?: any;
18
19
  }
19
20
  export interface ExportResult {
20
21
  totalSessions: number;
@@ -10,9 +10,7 @@
10
10
  * recover lessons from sessions that pre-date the transcript-emit feature.
11
11
  * Idempotent: re-running overwrites the same per-session JSONL.
12
12
  */
13
- import fs from "node:fs";
14
- import os from "node:os";
15
- import path from "node:path";
13
+ import { getDatabase } from "../storage/db.js";
16
14
  import { emitTranscriptToDisk, getEmitRoot } from "./transcript-emit.js";
17
15
  async function openDb(dbPath) {
18
16
  // Prefer better-sqlite3 (sync), fall back to bun:sqlite when running under Bun.
@@ -52,17 +50,15 @@ export async function exportTranscripts(opts = {}) {
52
50
  const maxAgeDays = opts.maxAgeDays ?? 30;
53
51
  const minMessages = opts.minMessages ?? 4;
54
52
  const dryRun = opts.dryRun ?? false;
55
- const dbPath = path.join(os.homedir(), ".muonroi-cli", "muonroi.db");
56
- if (!fs.existsSync(dbPath)) {
57
- throw new Error(`muonroi.db not found at ${dbPath}`);
58
- }
59
- const db = await openDb(dbPath);
53
+ const db = opts.dbOverride ?? getDatabase();
60
54
  try {
61
55
  const cutoff = Date.now() - maxAgeDays * 86400_000;
62
56
  const cutoffIso = new Date(cutoff).toISOString();
63
57
  // Pull sessions touched in window. cwd_last is the cwd at session-end —
64
58
  // critical for EE scope detection so framework/lang resolve correctly.
65
- const sessions = db.all(`SELECT id, updated_at, cwd_last FROM sessions WHERE updated_at >= '${cutoffIso}' ORDER BY updated_at DESC`);
59
+ const sessions = db
60
+ .prepare(`SELECT id, updated_at, cwd_last FROM sessions WHERE updated_at >= '${cutoffIso}' ORDER BY updated_at DESC`)
61
+ .all();
66
62
  const out = {
67
63
  totalSessions: sessions.length,
68
64
  written: 0,
@@ -71,7 +67,9 @@ export async function exportTranscripts(opts = {}) {
71
67
  outputRoot: getEmitRoot(),
72
68
  };
73
69
  for (const s of sessions) {
74
- const rows = db.all(`SELECT session_id, seq, role, message_json FROM messages WHERE session_id = '${s.id.replace(/'/g, "''")}' ORDER BY seq ASC`);
70
+ const rows = db
71
+ .prepare(`SELECT session_id, seq, role, message_json FROM messages WHERE session_id = '${s.id.replace(/'/g, "''")}' ORDER BY seq ASC`)
72
+ .all();
75
73
  if (rows.length === 0) {
76
74
  out.skippedEmpty++;
77
75
  continue;
@@ -47,9 +47,38 @@ export async function extractSession(messages, projectPath, source, sessionId) {
47
47
  getDefaultEEClient()
48
48
  .evolve("post-extract")
49
49
  .catch(() => { });
50
+ // WRITE arm of the who-am-i loop — fire-and-forget. Mine the user's working style from
51
+ // this transcript and persist it to experience-behavioral, which who-am-i-brain reads
52
+ // back next session (READ arm). Deliberately NOT awaited: the classify is a ~9s brain
53
+ // call and must not block cli-exit (same rationale as the async extract). It completes on
54
+ // cli-clear (process stays alive) and is best-effort on cli-exit — style converges over
55
+ // sessions, so a missed teardown is harmless. Fail-open, gated behind its own flag.
56
+ void writeStyleSignalsFireAndForget(transcript);
50
57
  }
51
58
  catch {
52
59
  // D-05: swallow all errors silently
53
60
  }
54
61
  }
62
+ /**
63
+ * Fire-and-forget bridge from extractSession into the style WRITE arm. Kept separate so the
64
+ * bridge/search imports stay lazy (only paid when a real session ends) and so every failure
65
+ * mode — flag off, EE unreachable, classifier null, write error — degrades to a no-op.
66
+ */
67
+ async function writeStyleSignalsFireAndForget(transcript) {
68
+ try {
69
+ const { isStyleExtractEnabled, writeStyleSignals } = await import("./extract-style.js");
70
+ if (!isStyleExtractEnabled())
71
+ return;
72
+ const { classifyViaBrain } = await import("./bridge.js");
73
+ const { writeExperienceEE } = await import("./search.js");
74
+ // No projectSlug: working style is a cross-repo property of the user, so style rules are
75
+ // written GLOBAL (unscoped) — who-am-i-brain searches experience-behavioral broadly and a
76
+ // repo-scoped style rule would be needlessly narrow. (Contrast the technical-lesson extract,
77
+ // which IS repo-scoped because a bug fix is repo-specific.)
78
+ await writeStyleSignals({ classifyViaBrain, writeExperience: writeExperienceEE }, transcript);
79
+ }
80
+ catch {
81
+ // swallow — style extraction is strictly best-effort
82
+ }
83
+ }
55
84
  //# sourceMappingURL=extract-session.js.map
@@ -0,0 +1,58 @@
1
+ import type { WriteExperienceResult } from "./search.js";
2
+ /** Feature flag — default ON, opt out with MUONROI_STYLE_EXTRACT=0. */
3
+ export declare function isStyleExtractEnabled(): boolean;
4
+ /**
5
+ * PURE: build the style-mining prompt. Asks the brain to emit 0..N natural-language style
6
+ * rules about the USER (never the task), each standalone and reusable as future guidance,
7
+ * with a self-reported confidence. Emitting NOTHING when the transcript shows no clear style
8
+ * is explicitly the right answer — we would rather miss a session than pollute the brain.
9
+ */
10
+ export declare function buildStyleExtractPrompt(transcript: string): string;
11
+ export interface StyleRule {
12
+ rule: string;
13
+ confidence: number;
14
+ }
15
+ /**
16
+ * PURE: coerce a brain reply (JSON string, fenced block, or already-parsed object) into a
17
+ * gated list of style rules. Applies the confidence floor, length bounds, dedup by normalized
18
+ * text, and the per-session cap. Returns [] when nothing usable survives (fail-open).
19
+ */
20
+ export declare function parseStyleRules(raw: unknown): StyleRule[];
21
+ /**
22
+ * PURE: a stable title for a style rule so repeated sessions MERGE server-side instead of
23
+ * accreting near-duplicates. Derived deterministically from the rule text (lowercased, first
24
+ * few significant words) — same recurring preference → same title → storeImportedExperience
25
+ * can collapse them. Marked with a "user-style:" prefix so the entries are identifiable and
26
+ * prunable as a class.
27
+ */
28
+ export declare function styleRuleTitle(rule: string): string;
29
+ export interface StyleExtractDeps {
30
+ classifyViaBrain: (prompt: string, timeoutMs?: number, options?: {
31
+ systemPrompt?: string;
32
+ responseFormat?: {
33
+ type: string;
34
+ };
35
+ maxTokens?: number;
36
+ useExtractModel?: boolean;
37
+ }) => Promise<string | null>;
38
+ writeExperience: (lesson: string, opts: {
39
+ collection?: string;
40
+ title?: string;
41
+ projectSlug?: string;
42
+ confidence?: number;
43
+ }) => Promise<WriteExperienceResult>;
44
+ }
45
+ /**
46
+ * Classify the transcript into gated style rules. Fail-open []: a degraded brain must never
47
+ * break session teardown.
48
+ */
49
+ export declare function extractStyleSignals(deps: StyleExtractDeps, transcript: string): Promise<StyleRule[]>;
50
+ /**
51
+ * End-to-end WRITE arm: mine style rules from the transcript and persist each to
52
+ * experience-behavioral. Returns the number written. Fire-and-forget from extractSession —
53
+ * fail-open, never throws. `projectSlug` scopes the rule; confidence carries through so the
54
+ * brain can weight it.
55
+ */
56
+ export declare function writeStyleSignals(deps: StyleExtractDeps, transcript: string, opts?: {
57
+ projectSlug?: string;
58
+ }): Promise<number>;