reasonix 0.41.0 → 0.44.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +73 -12
  2. package/README.zh-CN.md +35 -7
  3. package/dashboard/app.css +225 -4
  4. package/dashboard/dist/app.js +6538 -6082
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/data/deepseek-tokenizer.json.gz +0 -0
  7. package/dist/cli/{acp-64VQZLDJ.js → acp-TYZ2CTDL.js} +40 -37
  8. package/dist/cli/acp-TYZ2CTDL.js.map +1 -0
  9. package/dist/cli/chat-TH7VNNCJ.js +51 -0
  10. package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
  11. package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
  12. package/dist/cli/chunk-25T6CVUP.js +172 -0
  13. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  14. package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
  15. package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
  16. package/dist/cli/{chunk-SXLJBFIV.js → chunk-2V6EAEUW.js} +99 -31
  17. package/dist/cli/chunk-2V6EAEUW.js.map +1 -0
  18. package/dist/cli/{chunk-4H3ZRJ2U.js → chunk-4CTDEJUF.js} +4 -3
  19. package/dist/cli/{chunk-4H3ZRJ2U.js.map → chunk-4CTDEJUF.js.map} +1 -1
  20. package/dist/cli/{chunk-7VFNPMKG.js → chunk-4QUNBQQ2.js} +3 -2
  21. package/dist/cli/{chunk-7VFNPMKG.js.map → chunk-4QUNBQQ2.js.map} +1 -1
  22. package/dist/cli/chunk-5QCB62C4.js +25319 -0
  23. package/dist/cli/chunk-5QCB62C4.js.map +1 -0
  24. package/dist/cli/chunk-6OWJV3YW.js +390 -0
  25. package/dist/cli/chunk-6OWJV3YW.js.map +1 -0
  26. package/dist/cli/{chunk-YJFKFTAL.js → chunk-6PBZN4VI.js} +15 -3
  27. package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
  28. package/dist/cli/{chunk-WE3YZULK.js → chunk-7CIGMZT3.js} +3 -2
  29. package/dist/cli/{chunk-WE3YZULK.js.map → chunk-7CIGMZT3.js.map} +1 -1
  30. package/dist/cli/{chunk-LTXADNCO.js → chunk-7UCMM425.js} +8 -3
  31. package/dist/cli/chunk-7UCMM425.js.map +1 -0
  32. package/dist/cli/{chunk-UV7XJUJH.js → chunk-AB2RED3C.js} +16 -9
  33. package/dist/cli/{chunk-UV7XJUJH.js.map → chunk-AB2RED3C.js.map} +1 -1
  34. package/dist/cli/chunk-AVFXO2EZ.js +2996 -0
  35. package/dist/cli/chunk-AVFXO2EZ.js.map +1 -0
  36. package/dist/cli/{chunk-7SPOFTMT.js → chunk-C53JQES5.js} +4 -3
  37. package/dist/cli/{chunk-7SPOFTMT.js.map → chunk-C53JQES5.js.map} +1 -1
  38. package/dist/cli/{chunk-MHGPBJ2T.js → chunk-CGDR2ELH.js} +131 -34
  39. package/dist/cli/chunk-CGDR2ELH.js.map +1 -0
  40. package/dist/cli/{chunk-4DCHFFEY.js → chunk-CWZKQ5FE.js} +8 -4
  41. package/dist/cli/chunk-CWZKQ5FE.js.map +1 -0
  42. package/dist/cli/chunk-FEZK652I.js +3644 -0
  43. package/dist/cli/chunk-FEZK652I.js.map +1 -0
  44. package/dist/cli/{chunk-A7VHMMDE.js → chunk-HNXDZGC6.js} +114 -5
  45. package/dist/cli/chunk-HNXDZGC6.js.map +1 -0
  46. package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
  47. package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
  48. package/dist/cli/{chunk-Y5XNV3NX.js → chunk-JMBMLOBP.js} +2 -1
  49. package/dist/cli/{chunk-Y5XNV3NX.js.map → chunk-JMBMLOBP.js.map} +1 -1
  50. package/dist/cli/{chunk-ARF3N2SY.js → chunk-JNAQYELD.js} +17 -8
  51. package/dist/cli/{chunk-ARF3N2SY.js.map → chunk-JNAQYELD.js.map} +1 -1
  52. package/dist/cli/{chunk-AT6GGIBV.js → chunk-KGBG6M2X.js} +25 -18
  53. package/dist/cli/chunk-KGBG6M2X.js.map +1 -0
  54. package/dist/cli/{chunk-A3LL4XDV.js → chunk-KLQTAZIY.js} +69 -5
  55. package/dist/cli/chunk-KLQTAZIY.js.map +1 -0
  56. package/dist/cli/{chunk-KZYLMMU5.js → chunk-KM465GST.js} +13 -12
  57. package/dist/cli/{chunk-KZYLMMU5.js.map → chunk-KM465GST.js.map} +1 -1
  58. package/dist/cli/{chunk-2CXPDAWX.js → chunk-LIR2HBQH.js} +3 -2
  59. package/dist/cli/{chunk-2CXPDAWX.js.map → chunk-LIR2HBQH.js.map} +1 -1
  60. package/dist/cli/{chunk-RAUPWSYA.js → chunk-MJ6W5UN3.js} +3 -2
  61. package/dist/cli/{chunk-RAUPWSYA.js.map → chunk-MJ6W5UN3.js.map} +1 -1
  62. package/dist/cli/{chunk-4W2CICFQ.js → chunk-MRHHQJAQ.js} +72 -60
  63. package/dist/cli/chunk-MRHHQJAQ.js.map +1 -0
  64. package/dist/cli/{chunk-BOFL3T45.js → chunk-NVURFF27.js} +23 -11
  65. package/dist/cli/chunk-NVURFF27.js.map +1 -0
  66. package/dist/cli/chunk-OPFUUYHL.js +11645 -0
  67. package/dist/cli/chunk-OPFUUYHL.js.map +1 -0
  68. package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
  69. package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
  70. package/dist/cli/{chunk-ZTLZO42A.js → chunk-R3CTO2HM.js} +3 -2
  71. package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-R3CTO2HM.js.map} +1 -1
  72. package/dist/cli/{chunk-BYZGO3BX.js → chunk-RDRC3XDT.js} +145 -39
  73. package/dist/cli/chunk-RDRC3XDT.js.map +1 -0
  74. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  75. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  76. package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
  77. package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
  78. package/dist/cli/{chunk-CD4SCQL4.js → chunk-TEUDEGX2.js} +64 -10
  79. package/dist/cli/chunk-TEUDEGX2.js.map +1 -0
  80. package/dist/cli/chunk-TKVXTQ3T.js +96 -0
  81. package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
  82. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  83. package/dist/cli/chunk-TXJMRPIL.js +54 -0
  84. package/dist/cli/{chunk-L7W3HJZQ.js.map → chunk-TXJMRPIL.js.map} +1 -1
  85. package/dist/cli/{chunk-H4OLWRSX.js → chunk-V26WPN3J.js} +11 -7
  86. package/dist/cli/chunk-V26WPN3J.js.map +1 -0
  87. package/dist/cli/{chunk-VFG4GIT3.js → chunk-WK3UFQY3.js} +3 -2
  88. package/dist/cli/{chunk-VFG4GIT3.js.map → chunk-WK3UFQY3.js.map} +1 -1
  89. package/dist/cli/chunk-X53B3JIX.js +34320 -0
  90. package/dist/cli/chunk-X53B3JIX.js.map +1 -0
  91. package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
  92. package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
  93. package/dist/cli/{chunk-CFY2XLY6.js → chunk-XSU4QVFW.js} +7 -85
  94. package/dist/cli/chunk-XSU4QVFW.js.map +1 -0
  95. package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
  96. package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
  97. package/dist/cli/chunk-Z4S7EYXG.js +63813 -0
  98. package/dist/cli/chunk-Z4S7EYXG.js.map +1 -0
  99. package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
  100. package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
  101. package/dist/cli/{chunk-ORM6PK57.js → chunk-ZZYBBX5N.js} +14 -5
  102. package/dist/cli/chunk-ZZYBBX5N.js.map +1 -0
  103. package/dist/cli/code-PSVJ3KEN.js +166 -0
  104. package/dist/cli/code-PSVJ3KEN.js.map +1 -0
  105. package/dist/cli/{commands-QY7MSQG7.js → commands-OCU42XG4.js} +7 -5
  106. package/dist/cli/{commands-QY7MSQG7.js.map → commands-OCU42XG4.js.map} +1 -1
  107. package/dist/cli/{commit-BRCQ3OQO.js → commit-XCQIQCYG.js} +7 -4
  108. package/dist/cli/{commit-BRCQ3OQO.js.map → commit-XCQIQCYG.js.map} +1 -1
  109. package/dist/cli/{desktop-ZTMHQR2Y.js → desktop-KWGR4BNE.js} +327 -98
  110. package/dist/cli/desktop-KWGR4BNE.js.map +1 -0
  111. package/dist/cli/devtools-HW3WDT3Q.js +91 -0
  112. package/dist/cli/devtools-HW3WDT3Q.js.map +1 -0
  113. package/dist/cli/diff-NHANTNC3.js +165 -0
  114. package/dist/cli/{diff-YASCB7PU.js.map → diff-NHANTNC3.js.map} +1 -1
  115. package/dist/cli/doctor-CC5CLOGG.js +27 -0
  116. package/dist/cli/{events-2AJTXR7I.js → events-XEFAD5VX.js} +6 -4
  117. package/dist/cli/{events-2AJTXR7I.js.map → events-XEFAD5VX.js.map} +1 -1
  118. package/dist/cli/index.js +3266 -152
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/cli/{mcp-YMWBLRR7.js → mcp-MPVGBBJF.js} +6 -4
  121. package/dist/cli/{mcp-YMWBLRR7.js.map → mcp-MPVGBBJF.js.map} +1 -1
  122. package/dist/cli/{mcp-browse-XLDUE6SB.js → mcp-browse-4XOTC3FJ.js} +32 -21
  123. package/dist/cli/{mcp-browse-XLDUE6SB.js.map → mcp-browse-4XOTC3FJ.js.map} +1 -1
  124. package/dist/cli/{mcp-inspect-H4D2HSJP.js → mcp-inspect-CEMGKKAH.js} +18 -10
  125. package/dist/cli/mcp-inspect-CEMGKKAH.js.map +1 -0
  126. package/dist/cli/package.json +3 -0
  127. package/dist/cli/prompt-2D7ID24X.js +16 -0
  128. package/dist/cli/{prune-sessions-4N3BVST2.js → prune-sessions-3RWUBYRS.js} +4 -2
  129. package/dist/cli/{prune-sessions-4N3BVST2.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
  130. package/dist/cli/{replay-3GTWM75X.js → replay-SR44E6RS.js} +42 -30
  131. package/dist/cli/{replay-3GTWM75X.js.map → replay-SR44E6RS.js.map} +1 -1
  132. package/dist/cli/{run-BLZPTRDX.js → run-MDGL27WL.js} +42 -40
  133. package/dist/cli/run-MDGL27WL.js.map +1 -0
  134. package/dist/cli/{server-DRFPXXSH.js → server-27ARQXIZ.js} +95 -55
  135. package/dist/cli/server-27ARQXIZ.js.map +1 -0
  136. package/dist/cli/{sessions-BOWFPTXT.js → sessions-CKQXCYGP.js} +25 -22
  137. package/dist/cli/sessions-CKQXCYGP.js.map +1 -0
  138. package/dist/cli/setup-TPAGSVXO.js +618 -0
  139. package/dist/cli/setup-TPAGSVXO.js.map +1 -0
  140. package/dist/cli/stats-DPUBZNVX.js +16 -0
  141. package/dist/cli/update-6ITLPRDV.js +15 -0
  142. package/dist/cli/version-2X3BHVVK.js +33 -0
  143. package/dist/cli/{version-XQXYSJ5L.js.map → version-2X3BHVVK.js.map} +1 -1
  144. package/dist/index.d.ts +182 -45
  145. package/dist/index.js +1420 -546
  146. package/dist/index.js.map +1 -1
  147. package/package.json +21 -8
  148. package/dist/cli/.-3G6VX5S7.js +0 -327
  149. package/dist/cli/.-6YRPB2C7.js +0 -329
  150. package/dist/cli/.-EYSVINK3.js +0 -317
  151. package/dist/cli/acp-64VQZLDJ.js.map +0 -1
  152. package/dist/cli/chat-ZAGX52RV.js +0 -46
  153. package/dist/cli/chunk-4DCHFFEY.js.map +0 -1
  154. package/dist/cli/chunk-4W2CICFQ.js.map +0 -1
  155. package/dist/cli/chunk-5X7LZJDE.js +0 -36
  156. package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
  157. package/dist/cli/chunk-65Q5HQ26.js +0 -892
  158. package/dist/cli/chunk-65Q5HQ26.js.map +0 -1
  159. package/dist/cli/chunk-A3LL4XDV.js.map +0 -1
  160. package/dist/cli/chunk-A7VHMMDE.js.map +0 -1
  161. package/dist/cli/chunk-AFFZF3MW.js +0 -36
  162. package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
  163. package/dist/cli/chunk-AT6GGIBV.js.map +0 -1
  164. package/dist/cli/chunk-BOFL3T45.js.map +0 -1
  165. package/dist/cli/chunk-BYZGO3BX.js.map +0 -1
  166. package/dist/cli/chunk-CD4SCQL4.js.map +0 -1
  167. package/dist/cli/chunk-CFY2XLY6.js.map +0 -1
  168. package/dist/cli/chunk-CPOV2O73.js +0 -39
  169. package/dist/cli/chunk-CPOV2O73.js.map +0 -1
  170. package/dist/cli/chunk-DAEAAVDF.js +0 -199
  171. package/dist/cli/chunk-DAEAAVDF.js.map +0 -1
  172. package/dist/cli/chunk-F2AV2QDK.js +0 -16514
  173. package/dist/cli/chunk-F2AV2QDK.js.map +0 -1
  174. package/dist/cli/chunk-H4OLWRSX.js.map +0 -1
  175. package/dist/cli/chunk-IEA6JOIP.js +0 -5430
  176. package/dist/cli/chunk-IEA6JOIP.js.map +0 -1
  177. package/dist/cli/chunk-L7W3HJZQ.js +0 -46
  178. package/dist/cli/chunk-LN27AKV3.js +0 -26
  179. package/dist/cli/chunk-LN27AKV3.js.map +0 -1
  180. package/dist/cli/chunk-LTXADNCO.js.map +0 -1
  181. package/dist/cli/chunk-MHGPBJ2T.js.map +0 -1
  182. package/dist/cli/chunk-ORM6PK57.js.map +0 -1
  183. package/dist/cli/chunk-SXLJBFIV.js.map +0 -1
  184. package/dist/cli/chunk-YJFKFTAL.js.map +0 -1
  185. package/dist/cli/code-X3M6ENTQ.js +0 -150
  186. package/dist/cli/code-X3M6ENTQ.js.map +0 -1
  187. package/dist/cli/desktop-ZTMHQR2Y.js.map +0 -1
  188. package/dist/cli/diff-YASCB7PU.js +0 -153
  189. package/dist/cli/doctor-XCN5ETVP.js +0 -24
  190. package/dist/cli/mcp-inspect-H4D2HSJP.js.map +0 -1
  191. package/dist/cli/prompt-RSIHN62V.js +0 -14
  192. package/dist/cli/run-BLZPTRDX.js.map +0 -1
  193. package/dist/cli/server-DRFPXXSH.js.map +0 -1
  194. package/dist/cli/sessions-BOWFPTXT.js.map +0 -1
  195. package/dist/cli/setup-FQL2JJC2.js +0 -516
  196. package/dist/cli/setup-FQL2JJC2.js.map +0 -1
  197. package/dist/cli/stats-5RJCATCE.js +0 -12
  198. package/dist/cli/stats-5RJCATCE.js.map +0 -1
  199. package/dist/cli/update-GUCWB4UN.js +0 -13
  200. package/dist/cli/update-GUCWB4UN.js.map +0 -1
  201. package/dist/cli/version-XQXYSJ5L.js +0 -30
  202. /package/dist/cli/{.-3G6VX5S7.js.map → chat-TH7VNNCJ.js.map} +0 -0
  203. /package/dist/cli/{.-6YRPB2C7.js.map → chunk-TUK7OWJA.js.map} +0 -0
  204. /package/dist/cli/{.-EYSVINK3.js.map → doctor-CC5CLOGG.js.map} +0 -0
  205. /package/dist/cli/{chat-ZAGX52RV.js.map → prompt-2D7ID24X.js.map} +0 -0
  206. /package/dist/cli/{doctor-XCN5ETVP.js.map → stats-DPUBZNVX.js.map} +0 -0
  207. /package/dist/cli/{prompt-RSIHN62V.js.map → update-6ITLPRDV.js.map} +0 -0
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- CODE_SYSTEM_PROMPT,
4
- codeSystemBase,
5
- codeSystemPrompt
6
- } from "./chunk-ARF3N2SY.js";
7
- import "./chunk-CD4SCQL4.js";
8
- import "./chunk-65Q5HQ26.js";
9
- export {
10
- CODE_SYSTEM_PROMPT,
11
- codeSystemBase,
12
- codeSystemPrompt
13
- };
14
- //# sourceMappingURL=prompt-RSIHN62V.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/run.ts"],"sourcesContent":["import type { WriteStream } from \"node:fs\";\nimport { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n loadBaseUrl,\n mcpEnvFor,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport { buildTransportFromSpec } from \"../../mcp/transport-from-spec.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n budgetUsd?: number;\n /** Per-turn repair-signal count required to escalate flash→pro. Undefined → loop default (3). */\n failureThreshold?: number;\n /** JSONL transcript path — lets `reasonix replay` / `diff` audit this run. */\n transcript?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: string;\n}\n\nasync function ensureApiKey(): Promise<string> {\n const existing = loadApiKey();\n if (existing) return existing;\n\n if (!stdin.isTTY) {\n process.stderr.write(\n \"DEEPSEEK_API_KEY is not set and stdin is not a TTY (cannot prompt).\\n\" +\n \"Set the env var, or run `reasonix chat` once interactively to save a key.\\n\",\n );\n process.exit(1);\n }\n\n process.stdout.write(\n \"DeepSeek API key not configured.\\nGet one at https://platform.deepseek.com/api_keys\\n\",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n const answer = (await rl.question(\"API key › \")).trim();\n if (!answer) continue;\n if (!isPlausibleKey(answer)) {\n process.stdout.write(\"Key looks too short. Paste the full token (16+ chars, no spaces).\\n\");\n continue;\n }\n saveApiKey(answer);\n process.stdout.write(`Saved to ${defaultConfigPath()}\\n\\n`);\n return answer;\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n loadDotenv();\n const apiKey = await ensureApiKey();\n process.env.DEEPSEEK_API_KEY = apiKey;\n\n // Optional MCP setup — mirrors chat's flow. Must happen before loop\n // construction so the tools make it into the prefix.\n const requestedSpecs = opts.mcp ?? [];\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n const disabledNames = new Set(readConfig().mcpDisabled ?? []);\n if (requestedSpecs.length > 0) {\n tools = new ToolRegistry();\n for (const raw of requestedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n const spec = parseMcpSpec(raw);\n label = spec.name ?? \"anon\";\n if (spec.name && disabledNames.has(spec.name)) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n continue;\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const prefix = spec.name\n ? `${spec.name}_`\n : requestedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport = buildTransportFromSpec(spec, {\n env: mcpEnvFor(spec.name, readConfig()),\n });\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix: prefix,\n serverName: label,\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n ms: Date.now() - t0,\n })}\\n`,\n );\n clients.push(mcp);\n successCount++;\n } catch (err) {\n // Non-fatal — skip and continue, same as `reasonix chat`. A\n // one-shot `run` invocation with a broken MCP server otherwise\n // fails the whole run over a side-concern tool the task might\n // not even touch.\n await mcp?.close().catch(() => undefined);\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason: (err as Error).message })}\\n → run \\`reasonix setup\\` to remove broken entries from your saved config.\\n`,\n );\n }\n }\n if (successCount === 0) tools = undefined;\n }\n\n const client = new DeepSeekClient({ baseUrl: loadBaseUrl() });\n const prefix = new ImmutablePrefix({\n system: opts.system,\n toolSpecs: tools?.specs(),\n });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model: opts.model,\n budgetUsd: opts.budgetUsd,\n failureThreshold: opts.failureThreshold,\n });\n const prefixHash = prefix.fingerprint;\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix run\",\n model: opts.model,\n startedAt: new Date().toISOString(),\n });\n // Also persist the user turn itself (the loop's event stream starts with\n // assistant output, not the prompt we're about to send).\n writeRecord(transcriptStream, {\n ts: new Date().toISOString(),\n turn: 1,\n role: \"user\",\n content: opts.task,\n });\n }\n\n try {\n for await (const ev of loop.step(opts.task)) {\n if (ev.role === \"assistant_delta\" && ev.content) process.stdout.write(ev.content);\n if (ev.role === \"tool\") process.stdout.write(`\\n[tool ${ev.toolName}] ${ev.content}\\n`);\n if (ev.role === \"error\") process.stderr.write(`\\n[error] ${ev.error}\\n`);\n if (ev.role === \"done\") process.stdout.write(\"\\n\");\n if (ev.role === \"assistant_final\" && ev.stats?.usage) {\n // `reasonix run` is often used in CI / scripting — we want\n // those turns to show up in `reasonix stats` too so the\n // dashboard reflects all DeepSeek spend, not just TUI sessions.\n appendUsage({ session: null, model: ev.stats.model, usage: ev.stats.usage });\n }\n // Persist every non-streaming event — deltas would flood the file and\n // aren't useful for replay (replay renders final content, not keystrokes).\n if (transcriptStream && ev.role !== \"assistant_delta\") {\n writeRecord(transcriptStream, recordFromLoopEvent(ev, { model: opts.model, prefixHash }));\n }\n }\n } finally {\n transcriptStream?.end();\n }\n\n const s = loop.stats.summary();\n process.stdout.write(\n `\\n— turns:${s.turns} cache:${(s.cacheHitRatio * 100).toFixed(1)}% ` +\n `cost:$${s.totalCostUsd.toFixed(6)} save-vs-claude:${s.savingsVsClaudePct.toFixed(1)}%\\n`,\n );\n if (opts.transcript) {\n process.stdout.write(`\\ntranscript: ${opts.transcript}\\n`);\n process.stdout.write(` → npx reasonix replay ${opts.transcript}\\n`);\n }\n\n for (const c of clients) await c.close();\n}\n"],"mappings":"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","names":["prefix"]}