reasonix 0.46.0 → 0.47.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 (159) hide show
  1. package/README.md +64 -12
  2. package/README.zh-CN.md +54 -9
  3. package/dashboard/dist/app.js +293 -66
  4. package/dashboard/dist/app.js.map +1 -1
  5. package/dist/cli/{acp-LGBLHBKY.js → acp-QK3DMC53.js} +22 -22
  6. package/dist/cli/chat-VV5UWY4V.js +51 -0
  7. package/dist/cli/{chunk-AVFXO2EZ.js → chunk-24A7FHGJ.js} +148 -16
  8. package/dist/cli/chunk-24A7FHGJ.js.map +1 -0
  9. package/dist/cli/chunk-25T6CVUP.js +0 -0
  10. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  11. package/dist/cli/chunk-5QCB62C4.js +0 -0
  12. package/dist/cli/{chunk-YY227BIQ.js → chunk-6J6BSUCR.js} +2 -2
  13. package/dist/cli/chunk-6OWJV3YW.js +0 -0
  14. package/dist/cli/{chunk-A3TSSDS2.js → chunk-BWYVFFKR.js} +2 -2
  15. package/dist/cli/{chunk-C53JQES5.js → chunk-BYYVYJDX.js} +3 -3
  16. package/dist/cli/{chunk-HNXDZGC6.js → chunk-CI2PF5QX.js} +2 -2
  17. package/dist/cli/{chunk-GTZTQNX5.js → chunk-COWPEX54.js} +19 -9
  18. package/dist/cli/chunk-COWPEX54.js.map +1 -0
  19. package/dist/cli/{chunk-QJDDIK3Z.js → chunk-E5WCLUIU.js} +2 -2
  20. package/dist/cli/{chunk-NVURFF27.js → chunk-EQATK2L2.js} +2 -2
  21. package/dist/cli/{chunk-HKWSPKMU.js → chunk-FDKOUJKZ.js} +8 -8
  22. package/dist/cli/chunk-FEZK652I.js +0 -0
  23. package/dist/cli/{chunk-TEUDEGX2.js → chunk-FY4S7TJZ.js} +19 -5
  24. package/dist/cli/chunk-FY4S7TJZ.js.map +1 -0
  25. package/dist/cli/{chunk-RDRC3XDT.js → chunk-GDKB2PPK.js} +2 -2
  26. package/dist/cli/{chunk-XSU4QVFW.js → chunk-HIYTRCSW.js} +27 -14
  27. package/dist/cli/chunk-HIYTRCSW.js.map +1 -0
  28. package/dist/cli/{chunk-WL6SNQ5T.js → chunk-ICAFSZHS.js} +307 -114
  29. package/dist/cli/chunk-ICAFSZHS.js.map +1 -0
  30. package/dist/cli/{chunk-KQU2TYIL.js → chunk-ICSYGIPN.js} +1916 -1098
  31. package/dist/cli/chunk-ICSYGIPN.js.map +1 -0
  32. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  33. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  34. package/dist/cli/{chunk-MJ6W5UN3.js → chunk-K6GUKSXH.js} +3 -2
  35. package/dist/cli/chunk-K6GUKSXH.js.map +1 -0
  36. package/dist/cli/{chunk-IJ7JA32V.js → chunk-KDRUEXII.js} +189 -26
  37. package/dist/cli/chunk-KDRUEXII.js.map +1 -0
  38. package/dist/cli/{chunk-4HCP2UQW.js → chunk-LBLR4CUZ.js} +2 -2
  39. package/dist/cli/{chunk-2425HK6U.js → chunk-LGEKVMMV.js} +7 -2
  40. package/dist/cli/{chunk-2425HK6U.js.map → chunk-LGEKVMMV.js.map} +1 -1
  41. package/dist/cli/{chunk-I4L2GTSE.js → chunk-OJVITDGB.js} +2 -2
  42. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  43. package/dist/cli/{chunk-W7YGWUWU.js → chunk-QVDWH2A2.js} +3 -3
  44. package/dist/cli/{chunk-R3CTO2HM.js → chunk-QVUFWDD2.js} +2 -2
  45. package/dist/cli/{chunk-HVUZWNSP.js → chunk-R6GQKKBW.js} +2 -2
  46. package/dist/cli/{chunk-5ACMUK4Q.js → chunk-RRXUIPWG.js} +20 -18
  47. package/dist/cli/chunk-RRXUIPWG.js.map +1 -0
  48. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  49. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  50. package/dist/cli/{chunk-CXVWUPA3.js → chunk-TKVXTQ3T.js} +26 -26
  51. package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
  52. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  53. package/dist/cli/{chunk-JNAQYELD.js → chunk-UDVFBEXC.js} +3 -3
  54. package/dist/cli/{chunk-CBIQWMS6.js → chunk-VC2CQA5D.js} +9 -9
  55. package/dist/cli/{chunk-ZZYBBX5N.js → chunk-VJMBISEI.js} +23 -9
  56. package/dist/cli/chunk-VJMBISEI.js.map +1 -0
  57. package/dist/cli/{chunk-WK3UFQY3.js → chunk-VKYSZKH2.js} +2 -2
  58. package/dist/cli/{chunk-LIR2HBQH.js → chunk-VMUUFWFF.js} +2 -2
  59. package/dist/cli/{chunk-V26WPN3J.js → chunk-VNQGCA3Q.js} +28 -1
  60. package/dist/cli/chunk-VNQGCA3Q.js.map +1 -0
  61. package/dist/cli/{chunk-5I2C4JEO.js → chunk-WF7TPVZM.js} +6 -6
  62. package/dist/cli/{chunk-5I2C4JEO.js.map → chunk-WF7TPVZM.js.map} +1 -1
  63. package/dist/cli/chunk-X53B3JIX.js +0 -0
  64. package/dist/cli/chunk-XJXDHAES.js +0 -0
  65. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  66. package/dist/cli/{chunk-4CTDEJUF.js → chunk-YDPLF7XR.js} +26 -14
  67. package/dist/cli/chunk-YDPLF7XR.js.map +1 -0
  68. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  69. package/dist/cli/{code-DFHSASJ4.js → code-C24TUAE5.js} +39 -35
  70. package/dist/cli/code-C24TUAE5.js.map +1 -0
  71. package/dist/cli/{commands-OCU42XG4.js → commands-RR3GIYOK.js} +4 -4
  72. package/dist/cli/{commit-XCQIQCYG.js → commit-FSHPIINM.js} +3 -3
  73. package/dist/cli/{desktop-ZCUG7LMF.js → desktop-7NCHPEFB.js} +263 -36
  74. package/dist/cli/desktop-7NCHPEFB.js.map +1 -0
  75. package/dist/cli/devtools-HW3WDT3Q.js +0 -0
  76. package/dist/cli/{diff-66B2KWOJ.js → diff-RAAHHLHV.js} +8 -8
  77. package/dist/cli/{doctor-Y73CPPRZ.js → doctor-PKVQIXRT.js} +9 -9
  78. package/dist/cli/{events-NGZ2OJYH.js → events-VRYXOSKI.js} +3 -3
  79. package/dist/cli/index.js +84 -92
  80. package/dist/cli/index.js.map +1 -1
  81. package/dist/cli/{mcp-MPVGBBJF.js → mcp-CRJ26PP4.js} +2 -2
  82. package/dist/cli/{mcp-browse-4XOTC3FJ.js → mcp-browse-QPAOWZOP.js} +2 -2
  83. package/dist/cli/{mcp-inspect-CEMGKKAH.js → mcp-inspect-CVCLABRS.js} +4 -4
  84. package/dist/cli/{prompt-2D7ID24X.js → prompt-SKYXERSI.js} +4 -4
  85. package/dist/cli/{prune-sessions-OJEYYLHY.js → prune-sessions-SEWX7GP6.js} +2 -2
  86. package/dist/cli/{replay-AKYQNAQJ.js → replay-KPDW2ZMJ.js} +9 -9
  87. package/dist/cli/{run-5DPQFSP6.js → run-WIKDIXTG.js} +18 -19
  88. package/dist/cli/run-WIKDIXTG.js.map +1 -0
  89. package/dist/cli/{server-TQ2IHYQJ.js → server-P6V2G3P6.js} +82 -34
  90. package/dist/cli/server-P6V2G3P6.js.map +1 -0
  91. package/dist/cli/{sessions-KY54NG45.js → sessions-2NULRMSA.js} +29 -15
  92. package/dist/cli/sessions-2NULRMSA.js.map +1 -0
  93. package/dist/cli/{setup-XPIOZWS7.js → setup-Y5WDBQFL.js} +8 -8
  94. package/dist/cli/setup-Y5WDBQFL.js.map +1 -0
  95. package/dist/cli/{stats-X2VTWKNS.js → stats-T7BL2YOR.js} +6 -6
  96. package/dist/cli/update-6ITLPRDV.js +0 -0
  97. package/dist/cli/{version-7O6A5T7Q.js → version-3KWDNWLN.js} +15 -15
  98. package/dist/index.d.ts +54 -23
  99. package/dist/index.js +1613 -1152
  100. package/dist/index.js.map +1 -1
  101. package/package.json +1 -1
  102. package/dist/cli/.-3G6VX5S7.js +0 -327
  103. package/dist/cli/.-6YRPB2C7.js +0 -329
  104. package/dist/cli/.-EYSVINK3.js +0 -317
  105. package/dist/cli/chat-ECK5ZGMV.js +0 -51
  106. package/dist/cli/chunk-4CTDEJUF.js.map +0 -1
  107. package/dist/cli/chunk-5ACMUK4Q.js.map +0 -1
  108. package/dist/cli/chunk-AVFXO2EZ.js.map +0 -1
  109. package/dist/cli/chunk-CXVWUPA3.js.map +0 -1
  110. package/dist/cli/chunk-GTZTQNX5.js.map +0 -1
  111. package/dist/cli/chunk-IJ7JA32V.js.map +0 -1
  112. package/dist/cli/chunk-KQU2TYIL.js.map +0 -1
  113. package/dist/cli/chunk-MJ6W5UN3.js.map +0 -1
  114. package/dist/cli/chunk-TEUDEGX2.js.map +0 -1
  115. package/dist/cli/chunk-V26WPN3J.js.map +0 -1
  116. package/dist/cli/chunk-WL6SNQ5T.js.map +0 -1
  117. package/dist/cli/chunk-XSU4QVFW.js.map +0 -1
  118. package/dist/cli/chunk-ZZYBBX5N.js.map +0 -1
  119. package/dist/cli/code-DFHSASJ4.js.map +0 -1
  120. package/dist/cli/desktop-ZCUG7LMF.js.map +0 -1
  121. package/dist/cli/doctor-Y73CPPRZ.js.map +0 -1
  122. package/dist/cli/prompt-2D7ID24X.js.map +0 -1
  123. package/dist/cli/run-5DPQFSP6.js.map +0 -1
  124. package/dist/cli/server-TQ2IHYQJ.js.map +0 -1
  125. package/dist/cli/sessions-KY54NG45.js.map +0 -1
  126. package/dist/cli/setup-XPIOZWS7.js.map +0 -1
  127. package/dist/cli/stats-X2VTWKNS.js.map +0 -1
  128. /package/dist/cli/{acp-LGBLHBKY.js.map → acp-QK3DMC53.js.map} +0 -0
  129. /package/dist/cli/{.-3G6VX5S7.js.map → chat-VV5UWY4V.js.map} +0 -0
  130. /package/dist/cli/{chunk-YY227BIQ.js.map → chunk-6J6BSUCR.js.map} +0 -0
  131. /package/dist/cli/{chunk-A3TSSDS2.js.map → chunk-BWYVFFKR.js.map} +0 -0
  132. /package/dist/cli/{chunk-C53JQES5.js.map → chunk-BYYVYJDX.js.map} +0 -0
  133. /package/dist/cli/{chunk-HNXDZGC6.js.map → chunk-CI2PF5QX.js.map} +0 -0
  134. /package/dist/cli/{chunk-QJDDIK3Z.js.map → chunk-E5WCLUIU.js.map} +0 -0
  135. /package/dist/cli/{chunk-NVURFF27.js.map → chunk-EQATK2L2.js.map} +0 -0
  136. /package/dist/cli/{chunk-HKWSPKMU.js.map → chunk-FDKOUJKZ.js.map} +0 -0
  137. /package/dist/cli/{chunk-RDRC3XDT.js.map → chunk-GDKB2PPK.js.map} +0 -0
  138. /package/dist/cli/{chunk-4HCP2UQW.js.map → chunk-LBLR4CUZ.js.map} +0 -0
  139. /package/dist/cli/{chunk-I4L2GTSE.js.map → chunk-OJVITDGB.js.map} +0 -0
  140. /package/dist/cli/{chunk-W7YGWUWU.js.map → chunk-QVDWH2A2.js.map} +0 -0
  141. /package/dist/cli/{chunk-R3CTO2HM.js.map → chunk-QVUFWDD2.js.map} +0 -0
  142. /package/dist/cli/{chunk-HVUZWNSP.js.map → chunk-R6GQKKBW.js.map} +0 -0
  143. /package/dist/cli/{chunk-JNAQYELD.js.map → chunk-UDVFBEXC.js.map} +0 -0
  144. /package/dist/cli/{chunk-CBIQWMS6.js.map → chunk-VC2CQA5D.js.map} +0 -0
  145. /package/dist/cli/{chunk-WK3UFQY3.js.map → chunk-VKYSZKH2.js.map} +0 -0
  146. /package/dist/cli/{chunk-LIR2HBQH.js.map → chunk-VMUUFWFF.js.map} +0 -0
  147. /package/dist/cli/{commands-OCU42XG4.js.map → commands-RR3GIYOK.js.map} +0 -0
  148. /package/dist/cli/{commit-XCQIQCYG.js.map → commit-FSHPIINM.js.map} +0 -0
  149. /package/dist/cli/{diff-66B2KWOJ.js.map → diff-RAAHHLHV.js.map} +0 -0
  150. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-PKVQIXRT.js.map} +0 -0
  151. /package/dist/cli/{events-NGZ2OJYH.js.map → events-VRYXOSKI.js.map} +0 -0
  152. /package/dist/cli/{mcp-MPVGBBJF.js.map → mcp-CRJ26PP4.js.map} +0 -0
  153. /package/dist/cli/{mcp-browse-4XOTC3FJ.js.map → mcp-browse-QPAOWZOP.js.map} +0 -0
  154. /package/dist/cli/{mcp-inspect-CEMGKKAH.js.map → mcp-inspect-CVCLABRS.js.map} +0 -0
  155. /package/dist/cli/{.-EYSVINK3.js.map → prompt-SKYXERSI.js.map} +0 -0
  156. /package/dist/cli/{prune-sessions-OJEYYLHY.js.map → prune-sessions-SEWX7GP6.js.map} +0 -0
  157. /package/dist/cli/{replay-AKYQNAQJ.js.map → replay-KPDW2ZMJ.js.map} +0 -0
  158. /package/dist/cli/{chat-ECK5ZGMV.js.map → stats-T7BL2YOR.js.map} +0 -0
  159. /package/dist/cli/{version-7O6A5T7Q.js.map → version-3KWDNWLN.js.map} +0 -0
@@ -15,7 +15,7 @@ import {
15
15
  defaultConfigPath,
16
16
  readConfig,
17
17
  writeConfig
18
- } from "./chunk-AVFXO2EZ.js";
18
+ } from "./chunk-24A7FHGJ.js";
19
19
  import "./chunk-TUK7OWJA.js";
20
20
 
21
21
  // src/cli/commands/mcp.ts
@@ -274,4 +274,4 @@ export {
274
274
  mcpListCommand,
275
275
  mcpSearchCommand
276
276
  };
277
- //# sourceMappingURL=mcp-MPVGBBJF.js.map
277
+ //# sourceMappingURL=mcp-CRJ26PP4.js.map
@@ -23,7 +23,7 @@ import "./chunk-PLHAZOLZ.js";
23
23
  import {
24
24
  readConfig,
25
25
  writeConfig
26
- } from "./chunk-AVFXO2EZ.js";
26
+ } from "./chunk-24A7FHGJ.js";
27
27
  import {
28
28
  __toESM
29
29
  } from "./chunk-TUK7OWJA.js";
@@ -175,4 +175,4 @@ async function mcpBrowseCommand(_opts = {}) {
175
175
  export {
176
176
  mcpBrowseCommand
177
177
  };
178
- //# sourceMappingURL=mcp-browse-4XOTC3FJ.js.map
178
+ //# sourceMappingURL=mcp-browse-QPAOWZOP.js.map
@@ -3,18 +3,18 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  buildTransportFromSpec,
5
5
  preflightStdioSpec
6
- } from "./chunk-NVURFF27.js";
6
+ } from "./chunk-EQATK2L2.js";
7
7
  import {
8
8
  McpClient,
9
9
  inspectMcpServer
10
- } from "./chunk-XSU4QVFW.js";
10
+ } from "./chunk-HIYTRCSW.js";
11
11
  import "./chunk-25T6CVUP.js";
12
12
  import {
13
13
  normalizeMcpConfig,
14
14
  overlayMatchedSpec,
15
15
  parseMcpSpec,
16
16
  readConfig
17
- } from "./chunk-AVFXO2EZ.js";
17
+ } from "./chunk-24A7FHGJ.js";
18
18
  import "./chunk-XXC2BYTV.js";
19
19
  import "./chunk-TUK7OWJA.js";
20
20
 
@@ -145,4 +145,4 @@ export {
145
145
  formatMcpInspectFailure,
146
146
  mcpInspectCommand
147
147
  };
148
- //# sourceMappingURL=mcp-inspect-CEMGKKAH.js.map
148
+ //# sourceMappingURL=mcp-inspect-CVCLABRS.js.map
@@ -4,13 +4,13 @@ import {
4
4
  CODE_SYSTEM_PROMPT,
5
5
  codeSystemBase,
6
6
  codeSystemPrompt
7
- } from "./chunk-JNAQYELD.js";
8
- import "./chunk-TEUDEGX2.js";
9
- import "./chunk-AVFXO2EZ.js";
7
+ } from "./chunk-UDVFBEXC.js";
8
+ import "./chunk-FY4S7TJZ.js";
9
+ import "./chunk-24A7FHGJ.js";
10
10
  import "./chunk-TUK7OWJA.js";
11
11
  export {
12
12
  CODE_SYSTEM_PROMPT,
13
13
  codeSystemBase,
14
14
  codeSystemPrompt
15
15
  };
16
- //# sourceMappingURL=prompt-2D7ID24X.js.map
16
+ //# sourceMappingURL=prompt-SKYXERSI.js.map
@@ -3,7 +3,7 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  listSessions,
5
5
  pruneStaleSessions
6
- } from "./chunk-5ACMUK4Q.js";
6
+ } from "./chunk-RRXUIPWG.js";
7
7
  import "./chunk-TUK7OWJA.js";
8
8
 
9
9
  // src/cli/commands/prune-sessions.ts
@@ -41,4 +41,4 @@ function pruneSessionsCommand(opts) {
41
41
  export {
42
42
  pruneSessionsCommand
43
43
  };
44
- //# sourceMappingURL=prune-sessions-OJEYYLHY.js.map
44
+ //# sourceMappingURL=prune-sessions-SEWX7GP6.js.map
@@ -2,21 +2,21 @@
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
4
  RecordView
5
- } from "./chunk-HVUZWNSP.js";
5
+ } from "./chunk-R6GQKKBW.js";
6
6
  import {
7
7
  Bar,
8
8
  ChromeRule,
9
9
  stringWidth
10
- } from "./chunk-CXVWUPA3.js";
10
+ } from "./chunk-TKVXTQ3T.js";
11
11
  import {
12
12
  computeCumulativeStats,
13
13
  groupRecordsByTurn,
14
14
  replayFromFile
15
- } from "./chunk-C53JQES5.js";
15
+ } from "./chunk-BYYVYJDX.js";
16
16
  import {
17
17
  COLOR,
18
18
  GRADIENT
19
- } from "./chunk-I4L2GTSE.js";
19
+ } from "./chunk-OJVITDGB.js";
20
20
  import {
21
21
  Box_default,
22
22
  Static,
@@ -27,16 +27,16 @@ import {
27
27
  use_input_default,
28
28
  use_stdout_default
29
29
  } from "./chunk-X53B3JIX.js";
30
- import "./chunk-V26WPN3J.js";
30
+ import "./chunk-VNQGCA3Q.js";
31
31
  import "./chunk-25T6CVUP.js";
32
- import "./chunk-ZZYBBX5N.js";
32
+ import "./chunk-VJMBISEI.js";
33
33
  import {
34
34
  t
35
- } from "./chunk-IJ7JA32V.js";
35
+ } from "./chunk-KDRUEXII.js";
36
36
  import {
37
37
  formatBalance,
38
38
  formatCost
39
- } from "./chunk-AVFXO2EZ.js";
39
+ } from "./chunk-24A7FHGJ.js";
40
40
  import {
41
41
  __toESM
42
42
  } from "./chunk-TUK7OWJA.js";
@@ -288,4 +288,4 @@ function oneLine(s, max = 200) {
288
288
  export {
289
289
  replayCommand
290
290
  };
291
- //# sourceMappingURL=replay-AKYQNAQJ.js.map
291
+ //# sourceMappingURL=replay-KPDW2ZMJ.js.map
@@ -3,47 +3,47 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  formatMcpLifecycleEvent,
5
5
  formatMcpSlowToast
6
- } from "./chunk-4HCP2UQW.js";
6
+ } from "./chunk-LBLR4CUZ.js";
7
7
  import {
8
8
  buildTransportFromSpec,
9
9
  preflightStdioSpec
10
- } from "./chunk-NVURFF27.js";
10
+ } from "./chunk-EQATK2L2.js";
11
11
  import {
12
12
  CacheFirstLoop,
13
13
  ImmutablePrefix,
14
14
  ToolRegistry,
15
15
  bridgeMcpTools
16
- } from "./chunk-WL6SNQ5T.js";
17
- import "./chunk-WK3UFQY3.js";
16
+ } from "./chunk-ICAFSZHS.js";
17
+ import "./chunk-VKYSZKH2.js";
18
18
  import {
19
19
  openTranscriptFile,
20
20
  recordFromLoopEvent,
21
21
  writeRecord
22
- } from "./chunk-C53JQES5.js";
22
+ } from "./chunk-BYYVYJDX.js";
23
23
  import {
24
24
  McpClient
25
- } from "./chunk-XSU4QVFW.js";
26
- import "./chunk-JNAQYELD.js";
25
+ } from "./chunk-HIYTRCSW.js";
26
+ import "./chunk-UDVFBEXC.js";
27
27
  import "./chunk-6OWJV3YW.js";
28
28
  import {
29
29
  DeepSeekClient
30
- } from "./chunk-V26WPN3J.js";
30
+ } from "./chunk-VNQGCA3Q.js";
31
31
  import "./chunk-25T6CVUP.js";
32
32
  import {
33
33
  loadDotenv
34
34
  } from "./chunk-2UQP6H6T.js";
35
- import "./chunk-RDRC3XDT.js";
36
- import "./chunk-TEUDEGX2.js";
37
- import "./chunk-A3TSSDS2.js";
35
+ import "./chunk-GDKB2PPK.js";
36
+ import "./chunk-FY4S7TJZ.js";
37
+ import "./chunk-BWYVFFKR.js";
38
38
  import "./chunk-S4XVGLRW.js";
39
- import "./chunk-5ACMUK4Q.js";
39
+ import "./chunk-RRXUIPWG.js";
40
40
  import {
41
41
  appendUsage
42
- } from "./chunk-R3CTO2HM.js";
43
- import "./chunk-ZZYBBX5N.js";
42
+ } from "./chunk-QVUFWDD2.js";
43
+ import "./chunk-VJMBISEI.js";
44
44
  import {
45
45
  t
46
- } from "./chunk-IJ7JA32V.js";
46
+ } from "./chunk-KDRUEXII.js";
47
47
  import {
48
48
  defaultConfigPath,
49
49
  isPlausibleKey,
@@ -52,7 +52,7 @@ import {
52
52
  normalizeMcpConfig,
53
53
  readConfig,
54
54
  saveApiKey
55
- } from "./chunk-AVFXO2EZ.js";
55
+ } from "./chunk-24A7FHGJ.js";
56
56
  import "./chunk-XXC2BYTV.js";
57
57
  import "./chunk-TUK7OWJA.js";
58
58
 
@@ -161,8 +161,7 @@ async function runCommand(opts) {
161
161
  prefix,
162
162
  tools,
163
163
  model: opts.model,
164
- budgetUsd: opts.budgetUsd,
165
- failureThreshold: opts.failureThreshold
164
+ budgetUsd: opts.budgetUsd
166
165
  });
167
166
  const prefixHash = prefix.fingerprint;
168
167
  let transcriptStream = null;
@@ -218,4 +217,4 @@ transcript: ${opts.transcript}
218
217
  export {
219
218
  runCommand
220
219
  };
221
- //# sourceMappingURL=run-5DPQFSP6.js.map
220
+ //# sourceMappingURL=run-WIKDIXTG.js.map
@@ -0,0 +1 @@
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 normalizeMcpConfig,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { t } from \"../../i18n/index.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 { 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 /** 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(t(\"run.missingApiKey\"));\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 cfg = readConfig();\n const normalizedSpecs = normalizeMcpConfig(\n cfg,\n opts.mcp && opts.mcp.length > 0 ? opts.mcp : undefined,\n );\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n if (normalizedSpecs.length > 0) {\n tools = new ToolRegistry();\n for (const spec of normalizedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n label = spec.name ?? \"anon\";\n if (spec.disabled) {\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 : normalizedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport = buildTransportFromSpec(spec);\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 ${t(\"mcpLifecycle.failedSetupConfigHint\")}\\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 });\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"]}
@@ -13,8 +13,8 @@ import {
13
13
  listCheckpoints,
14
14
  loadCheckpoint,
15
15
  restoreCheckpoint
16
- } from "./chunk-5I2C4JEO.js";
17
- import "./chunk-QJDDIK3Z.js";
16
+ } from "./chunk-WF7TPVZM.js";
17
+ import "./chunk-E5WCLUIU.js";
18
18
  import {
19
19
  fetchSmitheryDetail,
20
20
  handleToFetchResult,
@@ -24,11 +24,11 @@ import {
24
24
  } from "./chunk-XJXDHAES.js";
25
25
  import {
26
26
  registerSemanticSearchTool
27
- } from "./chunk-MJ6W5UN3.js";
27
+ } from "./chunk-K6GUKSXH.js";
28
28
  import {
29
29
  BUILTIN_ALLOWLIST,
30
30
  lineDiff
31
- } from "./chunk-RDRC3XDT.js";
31
+ } from "./chunk-GDKB2PPK.js";
32
32
  import {
33
33
  PROJECT_MEMORY_FILE,
34
34
  SKILLS_DIRNAME,
@@ -38,13 +38,13 @@ import {
38
38
  parseFrontmatter,
39
39
  resolveProjectMemoryWritePath,
40
40
  validateSkillFrontmatter
41
- } from "./chunk-TEUDEGX2.js";
41
+ } from "./chunk-FY4S7TJZ.js";
42
42
  import "./chunk-PLHAZOLZ.js";
43
43
  import {
44
44
  checkOllamaStatus,
45
45
  pullOllamaModel,
46
46
  startOllamaDaemon
47
- } from "./chunk-LIR2HBQH.js";
47
+ } from "./chunk-VMUUFWFF.js";
48
48
  import {
49
49
  INDEX_DIR_NAME,
50
50
  buildIndex,
@@ -53,34 +53,35 @@ import {
53
53
  querySemantic,
54
54
  readIndexMeta,
55
55
  walkChunks
56
- } from "./chunk-4CTDEJUF.js";
56
+ } from "./chunk-YDPLF7XR.js";
57
57
  import {
58
58
  HOOK_EVENTS,
59
59
  globalSettingsPath,
60
60
  loadHooks,
61
61
  projectSettingsPath
62
- } from "./chunk-A3TSSDS2.js";
62
+ } from "./chunk-BWYVFFKR.js";
63
63
  import "./chunk-S4XVGLRW.js";
64
64
  import {
65
+ deleteSession,
65
66
  listSessions,
66
67
  sessionPath,
67
68
  sessionsDir
68
- } from "./chunk-5ACMUK4Q.js";
69
+ } from "./chunk-RRXUIPWG.js";
69
70
  import {
70
71
  aggregateUsage,
71
72
  bucketCacheHitRatio,
72
73
  formatLogSize,
73
74
  readUsageLog
74
- } from "./chunk-R3CTO2HM.js";
75
+ } from "./chunk-QVUFWDD2.js";
75
76
  import {
76
77
  DEEPSEEK_PRICING,
77
78
  cacheSavingsUsd
78
- } from "./chunk-ZZYBBX5N.js";
79
+ } from "./chunk-VJMBISEI.js";
79
80
  import {
80
81
  getLanguage,
81
82
  getSupportedLanguages,
82
83
  setLanguage
83
- } from "./chunk-IJ7JA32V.js";
84
+ } from "./chunk-KDRUEXII.js";
84
85
  import {
85
86
  DEFAULT_INDEX_EXCLUDES,
86
87
  DEFAULT_MAX_FILE_BYTES,
@@ -103,7 +104,7 @@ import {
103
104
  resolveSemanticEmbeddingConfig,
104
105
  saveSemanticEmbeddingConfig,
105
106
  writeConfig
106
- } from "./chunk-AVFXO2EZ.js";
107
+ } from "./chunk-24A7FHGJ.js";
107
108
  import {
108
109
  VERSION
109
110
  } from "./chunk-XXC2BYTV.js";
@@ -1196,7 +1197,10 @@ async function handleMcp(method, rest, body, ctx, query = new URLSearchParams())
1196
1197
  }
1197
1198
  if (method === "GET" && rest[0] === "specs") {
1198
1199
  const cfg = readConfig(ctx.configPath);
1199
- return { status: 200, body: { specs: cfg.mcp ?? [] } };
1200
+ return {
1201
+ status: 200,
1202
+ body: { specs: cfg.mcp ?? [], failures: ctx.getMcpFailures?.() ?? [] }
1203
+ };
1200
1204
  }
1201
1205
  if (method === "POST" && rest[0] === "specs") {
1202
1206
  const { spec } = parseBody5(body);
@@ -2582,7 +2586,8 @@ function saveSemanticConfigApi(rawBody, ctx) {
2582
2586
  baseUrl: typeof parsed.openaiCompat?.baseUrl === "string" ? parsed.openaiCompat.baseUrl : existing.openaiCompat?.baseUrl,
2583
2587
  apiKey: typeof parsed.openaiCompat?.apiKey === "string" ? parsed.openaiCompat.apiKey.trim() || existing.openaiCompat?.apiKey : existing.openaiCompat?.apiKey,
2584
2588
  model: typeof parsed.openaiCompat?.model === "string" ? parsed.openaiCompat.model : existing.openaiCompat?.model,
2585
- extraBody: parsed.openaiCompat?.extraBody === void 0 ? existing.openaiCompat?.extraBody : parsed.openaiCompat.extraBody
2589
+ extraBody: parsed.openaiCompat?.extraBody === void 0 ? existing.openaiCompat?.extraBody : parsed.openaiCompat.extraBody,
2590
+ batchSize: parsed.openaiCompat?.batchSize === void 0 ? existing.openaiCompat?.batchSize : Number.isInteger(parsed.openaiCompat.batchSize) && parsed.openaiCompat.batchSize > 0 ? parsed.openaiCompat.batchSize : void 0
2586
2591
  }
2587
2592
  };
2588
2593
  try {
@@ -2619,7 +2624,8 @@ async function getProviderStatusFromConfig(config) {
2619
2624
  baseUrl: config.openaiCompat.baseUrl,
2620
2625
  apiKeySet: config.openaiCompat.apiKeySet,
2621
2626
  model: config.openaiCompat.model,
2622
- extraBodyKeys: Object.keys(config.openaiCompat.extraBody)
2627
+ extraBodyKeys: Object.keys(config.openaiCompat.extraBody),
2628
+ batchSize: config.openaiCompat.batchSize
2623
2629
  };
2624
2630
  }
2625
2631
  const ollama = await checkOllamaStatus(config.ollama.model, config.ollama.baseUrl).catch(
@@ -2674,12 +2680,10 @@ function parseTranscript(path, maxBytes = 4 * 1024 * 1024) {
2674
2680
  }
2675
2681
  return out;
2676
2682
  }
2677
- async function handleSessions(method, rest, _body, _ctx) {
2678
- if (method !== "GET") {
2679
- return { status: 405, body: { error: "GET only" } };
2680
- }
2681
- if (rest.length === 0) {
2683
+ async function handleSessions(method, rest, _body, ctx) {
2684
+ if (method === "GET" && rest.length === 0) {
2682
2685
  const sessions = listSessions();
2686
+ const currentName2 = ctx.getSessionName?.() ?? null;
2683
2687
  return {
2684
2688
  status: 200,
2685
2689
  body: {
@@ -2689,25 +2693,69 @@ async function handleSessions(method, rest, _body, _ctx) {
2689
2693
  size: s.size,
2690
2694
  messageCount: s.messageCount,
2691
2695
  mtime: s.mtime.getTime()
2692
- }))
2696
+ })),
2697
+ currentSession: currentName2,
2698
+ canSwitch: Boolean(ctx.switchSession)
2693
2699
  }
2694
2700
  };
2695
2701
  }
2702
+ if (method === "POST" && rest.length === 1 && rest[0] === "new") {
2703
+ if (!ctx.switchSession) {
2704
+ return {
2705
+ status: 503,
2706
+ body: { error: "live session swap requires an attached CLI session." }
2707
+ };
2708
+ }
2709
+ const result = ctx.switchSession(void 0);
2710
+ if (!result.ok) return { status: 500, body: { error: result.reason } };
2711
+ return { status: 200, body: { ok: true } };
2712
+ }
2713
+ if (rest.length === 0) {
2714
+ return { status: 405, body: { error: `method ${method} not supported on /sessions` } };
2715
+ }
2696
2716
  const name = decodeURIComponent(rest[0]);
2697
2717
  const path = sessionPath(name);
2698
- if (!existsSync8(path)) {
2699
- return { status: 404, body: { error: `no such session: ${name}` } };
2718
+ const currentName = ctx.getSessionName?.() ?? null;
2719
+ if (method === "POST" && rest[1] === "switch") {
2720
+ if (!ctx.switchSession) {
2721
+ return {
2722
+ status: 503,
2723
+ body: { error: "live session swap requires an attached CLI session." }
2724
+ };
2725
+ }
2726
+ if (!existsSync8(path)) return { status: 404, body: { error: `no such session: ${name}` } };
2727
+ const result = ctx.switchSession(name);
2728
+ if (!result.ok) return { status: 500, body: { error: result.reason } };
2729
+ return { status: 200, body: { ok: true } };
2700
2730
  }
2701
- const messages = parseTranscript(path);
2702
- return {
2703
- status: 200,
2704
- body: {
2705
- name,
2706
- path,
2707
- messages,
2708
- messageCount: messages.length
2731
+ if (method === "DELETE") {
2732
+ if (rest.length !== 1) {
2733
+ return { status: 405, body: { error: `method ${method} not supported on this path` } };
2709
2734
  }
2710
- };
2735
+ if (currentName && name === currentName) {
2736
+ return {
2737
+ status: 409,
2738
+ body: { error: "cannot delete the currently-active session \u2014 switch away first." }
2739
+ };
2740
+ }
2741
+ if (!existsSync8(path)) return { status: 404, body: { error: `no such session: ${name}` } };
2742
+ const removed = deleteSession(name);
2743
+ if (!removed) return { status: 500, body: { error: `failed to delete ${name}` } };
2744
+ ctx.audit?.({ ts: Date.now(), action: "delete-session", payload: { name } });
2745
+ return { status: 200, body: { ok: true, deleted: name } };
2746
+ }
2747
+ if (method === "GET") {
2748
+ if (rest.length !== 1) {
2749
+ return { status: 405, body: { error: `method ${method} not supported on this path` } };
2750
+ }
2751
+ if (!existsSync8(path)) return { status: 404, body: { error: `no such session: ${name}` } };
2752
+ const messages = parseTranscript(path);
2753
+ return {
2754
+ status: 200,
2755
+ body: { name, path, messages, messageCount: messages.length }
2756
+ };
2757
+ }
2758
+ return { status: 405, body: { error: `method ${method} not supported on this path` } };
2711
2759
  }
2712
2760
 
2713
2761
  // src/server/api/settings.ts
@@ -3500,4 +3548,4 @@ export {
3500
3548
  readBody,
3501
3549
  startDashboardServer
3502
3550
  };
3503
- //# sourceMappingURL=server-TQ2IHYQJ.js.map
3551
+ //# sourceMappingURL=server-P6V2G3P6.js.map