reasonix 0.43.0 → 0.44.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 (169) hide show
  1. package/README.md +49 -11
  2. package/README.zh-CN.md +35 -7
  3. package/dashboard/app.css +225 -4
  4. package/dashboard/dist/app.js +6441 -6080
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/data/deepseek-tokenizer.json.gz +0 -0
  7. package/dist/cli/{acp-DAGPCVFZ.js → acp-TYZ2CTDL.js} +28 -30
  8. package/dist/cli/acp-TYZ2CTDL.js.map +1 -0
  9. package/dist/cli/chat-TH7VNNCJ.js +51 -0
  10. package/dist/cli/chunk-2425HK6U.js +0 -0
  11. package/dist/cli/chunk-25T6CVUP.js +0 -0
  12. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  13. package/dist/cli/{chunk-3Z6IBU3D.js → chunk-2V6EAEUW.js} +95 -31
  14. package/dist/cli/chunk-2V6EAEUW.js.map +1 -0
  15. package/dist/cli/{chunk-XCGGEJTI.js → chunk-4CTDEJUF.js} +2 -2
  16. package/dist/cli/chunk-4QUNBQQ2.js +0 -0
  17. package/dist/cli/{chunk-74EX7SUH.js → chunk-5QCB62C4.js} +33 -7
  18. package/dist/cli/{chunk-74EX7SUH.js.map → chunk-5QCB62C4.js.map} +1 -1
  19. package/dist/cli/chunk-6OWJV3YW.js +390 -0
  20. package/dist/cli/chunk-6OWJV3YW.js.map +1 -0
  21. package/dist/cli/chunk-6PBZN4VI.js +0 -0
  22. package/dist/cli/{chunk-7O5ALB4C.js → chunk-7CIGMZT3.js} +2 -2
  23. package/dist/cli/{chunk-H6PS7IUE.js → chunk-7UCMM425.js} +7 -3
  24. package/dist/cli/chunk-7UCMM425.js.map +1 -0
  25. package/dist/cli/{chunk-TJX6BFZZ.js → chunk-AB2RED3C.js} +3 -3
  26. package/dist/cli/{chunk-XPDVG52A.js → chunk-AVFXO2EZ.js} +361 -13
  27. package/dist/cli/chunk-AVFXO2EZ.js.map +1 -0
  28. package/dist/cli/{chunk-FHOGSSCH.js → chunk-C53JQES5.js} +3 -3
  29. package/dist/cli/{chunk-RE4RAVFF.js → chunk-CGDR2ELH.js} +92 -30
  30. package/dist/cli/chunk-CGDR2ELH.js.map +1 -0
  31. package/dist/cli/{chunk-OSZC7C6F.js → chunk-CWZKQ5FE.js} +7 -4
  32. package/dist/cli/chunk-CWZKQ5FE.js.map +1 -0
  33. package/dist/cli/{devtools-YECO25QO.js → chunk-FEZK652I.js} +10 -85
  34. package/dist/cli/chunk-FEZK652I.js.map +1 -0
  35. package/dist/cli/{chunk-45U62RI3.js → chunk-HNXDZGC6.js} +104 -2
  36. package/dist/cli/chunk-HNXDZGC6.js.map +1 -0
  37. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  38. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  39. package/dist/cli/{chunk-5JJRUIPA.js → chunk-JNAQYELD.js} +16 -8
  40. package/dist/cli/{chunk-5JJRUIPA.js.map → chunk-JNAQYELD.js.map} +1 -1
  41. package/dist/cli/{chunk-YFGF5NKA.js → chunk-KGBG6M2X.js} +19 -15
  42. package/dist/cli/chunk-KGBG6M2X.js.map +1 -0
  43. package/dist/cli/{chunk-3BXRZFWS.js → chunk-KLQTAZIY.js} +12 -4
  44. package/dist/cli/chunk-KLQTAZIY.js.map +1 -0
  45. package/dist/cli/{chunk-VK5HG73G.js → chunk-KM465GST.js} +9 -9
  46. package/dist/cli/{chunk-DOYHN4KB.js → chunk-LIR2HBQH.js} +2 -2
  47. package/dist/cli/{chunk-YYQAUTTN.js → chunk-MJ6W5UN3.js} +2 -2
  48. package/dist/cli/{chunk-6PZ3CXBP.js → chunk-MRHHQJAQ.js} +5 -4
  49. package/dist/cli/chunk-MRHHQJAQ.js.map +1 -0
  50. package/dist/cli/{chunk-PQXPXJBJ.js → chunk-NVURFF27.js} +16 -5
  51. package/dist/cli/chunk-NVURFF27.js.map +1 -0
  52. package/dist/cli/{chunk-2R4QCDOZ.js → chunk-OPFUUYHL.js} +540 -287
  53. package/dist/cli/chunk-OPFUUYHL.js.map +1 -0
  54. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  55. package/dist/cli/{chunk-HFEAY5DT.js → chunk-R3CTO2HM.js} +2 -2
  56. package/dist/cli/{chunk-O52OLQL3.js → chunk-RDRC3XDT.js} +136 -38
  57. package/dist/cli/chunk-RDRC3XDT.js.map +1 -0
  58. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  59. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  60. package/dist/cli/{chunk-2K65GZBT.js → chunk-TEUDEGX2.js} +64 -19
  61. package/dist/cli/chunk-TEUDEGX2.js.map +1 -0
  62. package/dist/cli/{chunk-2Z35JOA4.js → chunk-TKVXTQ3T.js} +4 -4
  63. package/dist/cli/{chunk-2Z35JOA4.js.map → chunk-TKVXTQ3T.js.map} +1 -1
  64. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  65. package/dist/cli/{chunk-32TIKD5U.js → chunk-TXJMRPIL.js} +3 -3
  66. package/dist/cli/{chunk-2KDUS647.js → chunk-V26WPN3J.js} +7 -4
  67. package/dist/cli/chunk-V26WPN3J.js.map +1 -0
  68. package/dist/cli/{chunk-F3PXYSNN.js → chunk-WK3UFQY3.js} +2 -2
  69. package/dist/cli/{chunk-6G3CUUFG.js → chunk-X53B3JIX.js} +3 -3
  70. package/dist/cli/{chunk-6G3CUUFG.js.map → chunk-X53B3JIX.js.map} +1 -1
  71. package/dist/cli/chunk-XJXDHAES.js +0 -0
  72. package/dist/cli/{chunk-6AK4EY3D.js → chunk-XSU4QVFW.js} +1 -81
  73. package/dist/cli/chunk-XSU4QVFW.js.map +1 -0
  74. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  75. package/dist/cli/{chunk-P7EKE5ZQ.js → chunk-Z4S7EYXG.js} +4482 -1310
  76. package/dist/cli/chunk-Z4S7EYXG.js.map +1 -0
  77. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  78. package/dist/cli/{chunk-YQ6NTIIE.js → chunk-ZZYBBX5N.js} +13 -5
  79. package/dist/cli/chunk-ZZYBBX5N.js.map +1 -0
  80. package/dist/cli/{code-SMKEW6CD.js → code-PSVJ3KEN.js} +48 -36
  81. package/dist/cli/code-PSVJ3KEN.js.map +1 -0
  82. package/dist/cli/{commands-FVVB5FZF.js → commands-OCU42XG4.js} +4 -4
  83. package/dist/cli/{commit-HE4VSPZ7.js → commit-XCQIQCYG.js} +3 -3
  84. package/dist/cli/{desktop-Q7NDXCON.js → desktop-KWGR4BNE.js} +210 -69
  85. package/dist/cli/desktop-KWGR4BNE.js.map +1 -0
  86. package/dist/cli/devtools-HW3WDT3Q.js +91 -0
  87. package/dist/cli/devtools-HW3WDT3Q.js.map +1 -0
  88. package/dist/cli/{diff-435UTPC5.js → diff-NHANTNC3.js} +9 -9
  89. package/dist/cli/{doctor-OT7KH75K.js → doctor-CC5CLOGG.js} +10 -10
  90. package/dist/cli/events-XEFAD5VX.js +0 -0
  91. package/dist/cli/index.js +132 -94
  92. package/dist/cli/index.js.map +1 -1
  93. package/dist/cli/{mcp-WUL2WO75.js → mcp-MPVGBBJF.js} +2 -2
  94. package/dist/cli/{mcp-browse-RR7R4XET.js → mcp-browse-4XOTC3FJ.js} +3 -3
  95. package/dist/cli/{mcp-inspect-REGLYBWT.js → mcp-inspect-CEMGKKAH.js} +14 -9
  96. package/dist/cli/mcp-inspect-CEMGKKAH.js.map +1 -0
  97. package/dist/cli/{prompt-UW6EFLVR.js → prompt-2D7ID24X.js} +4 -4
  98. package/dist/cli/prune-sessions-3RWUBYRS.js +0 -0
  99. package/dist/cli/{replay-YOURXV4C.js → replay-SR44E6RS.js} +10 -10
  100. package/dist/cli/{run-Q6BUXV66.js → run-MDGL27WL.js} +35 -36
  101. package/dist/cli/run-MDGL27WL.js.map +1 -0
  102. package/dist/cli/{server-XGDBRWMB.js → server-27ARQXIZ.js} +67 -24
  103. package/dist/cli/server-27ARQXIZ.js.map +1 -0
  104. package/dist/cli/{sessions-FH7QVYSY.js → sessions-CKQXCYGP.js} +18 -18
  105. package/dist/cli/sessions-CKQXCYGP.js.map +1 -0
  106. package/dist/cli/{setup-VDS6SVEP.js → setup-TPAGSVXO.js} +6 -6
  107. package/dist/cli/{stats-MQVI2XQH.js → stats-DPUBZNVX.js} +6 -4
  108. package/dist/cli/update-6ITLPRDV.js +0 -0
  109. package/dist/cli/{version-DAHGZY5N.js → version-2X3BHVVK.js} +15 -15
  110. package/dist/index.d.ts +181 -53
  111. package/dist/index.js +1322 -533
  112. package/dist/index.js.map +1 -1
  113. package/package.json +21 -8
  114. package/dist/cli/.-3G6VX5S7.js +0 -327
  115. package/dist/cli/.-6YRPB2C7.js +0 -329
  116. package/dist/cli/.-EYSVINK3.js +0 -317
  117. package/dist/cli/acp-DAGPCVFZ.js.map +0 -1
  118. package/dist/cli/chat-7ES4IBNH.js +0 -50
  119. package/dist/cli/chunk-2K65GZBT.js.map +0 -1
  120. package/dist/cli/chunk-2KDUS647.js.map +0 -1
  121. package/dist/cli/chunk-2R4QCDOZ.js.map +0 -1
  122. package/dist/cli/chunk-3BXRZFWS.js.map +0 -1
  123. package/dist/cli/chunk-3Z6IBU3D.js.map +0 -1
  124. package/dist/cli/chunk-45U62RI3.js.map +0 -1
  125. package/dist/cli/chunk-6AK4EY3D.js.map +0 -1
  126. package/dist/cli/chunk-6PZ3CXBP.js.map +0 -1
  127. package/dist/cli/chunk-H6PS7IUE.js.map +0 -1
  128. package/dist/cli/chunk-O52OLQL3.js.map +0 -1
  129. package/dist/cli/chunk-OSZC7C6F.js.map +0 -1
  130. package/dist/cli/chunk-P7EKE5ZQ.js.map +0 -1
  131. package/dist/cli/chunk-PQXPXJBJ.js.map +0 -1
  132. package/dist/cli/chunk-PV55UMTO.js +0 -200
  133. package/dist/cli/chunk-PV55UMTO.js.map +0 -1
  134. package/dist/cli/chunk-RE4RAVFF.js.map +0 -1
  135. package/dist/cli/chunk-XPDVG52A.js.map +0 -1
  136. package/dist/cli/chunk-YFGF5NKA.js.map +0 -1
  137. package/dist/cli/chunk-YQ6NTIIE.js.map +0 -1
  138. package/dist/cli/code-SMKEW6CD.js.map +0 -1
  139. package/dist/cli/desktop-Q7NDXCON.js.map +0 -1
  140. package/dist/cli/devtools-YECO25QO.js.map +0 -1
  141. package/dist/cli/doctor-OT7KH75K.js.map +0 -1
  142. package/dist/cli/mcp-inspect-REGLYBWT.js.map +0 -1
  143. package/dist/cli/prompt-UW6EFLVR.js.map +0 -1
  144. package/dist/cli/run-Q6BUXV66.js.map +0 -1
  145. package/dist/cli/server-XGDBRWMB.js.map +0 -1
  146. package/dist/cli/sessions-FH7QVYSY.js.map +0 -1
  147. package/dist/cli/stats-MQVI2XQH.js.map +0 -1
  148. /package/dist/cli/{.-3G6VX5S7.js.map → chat-TH7VNNCJ.js.map} +0 -0
  149. /package/dist/cli/{chunk-XCGGEJTI.js.map → chunk-4CTDEJUF.js.map} +0 -0
  150. /package/dist/cli/{chunk-7O5ALB4C.js.map → chunk-7CIGMZT3.js.map} +0 -0
  151. /package/dist/cli/{chunk-TJX6BFZZ.js.map → chunk-AB2RED3C.js.map} +0 -0
  152. /package/dist/cli/{chunk-FHOGSSCH.js.map → chunk-C53JQES5.js.map} +0 -0
  153. /package/dist/cli/{chunk-VK5HG73G.js.map → chunk-KM465GST.js.map} +0 -0
  154. /package/dist/cli/{chunk-DOYHN4KB.js.map → chunk-LIR2HBQH.js.map} +0 -0
  155. /package/dist/cli/{chunk-YYQAUTTN.js.map → chunk-MJ6W5UN3.js.map} +0 -0
  156. /package/dist/cli/{chunk-HFEAY5DT.js.map → chunk-R3CTO2HM.js.map} +0 -0
  157. /package/dist/cli/{chunk-32TIKD5U.js.map → chunk-TXJMRPIL.js.map} +0 -0
  158. /package/dist/cli/{chunk-F3PXYSNN.js.map → chunk-WK3UFQY3.js.map} +0 -0
  159. /package/dist/cli/{commands-FVVB5FZF.js.map → commands-OCU42XG4.js.map} +0 -0
  160. /package/dist/cli/{commit-HE4VSPZ7.js.map → commit-XCQIQCYG.js.map} +0 -0
  161. /package/dist/cli/{diff-435UTPC5.js.map → diff-NHANTNC3.js.map} +0 -0
  162. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-CC5CLOGG.js.map} +0 -0
  163. /package/dist/cli/{mcp-WUL2WO75.js.map → mcp-MPVGBBJF.js.map} +0 -0
  164. /package/dist/cli/{mcp-browse-RR7R4XET.js.map → mcp-browse-4XOTC3FJ.js.map} +0 -0
  165. /package/dist/cli/{.-EYSVINK3.js.map → prompt-2D7ID24X.js.map} +0 -0
  166. /package/dist/cli/{replay-YOURXV4C.js.map → replay-SR44E6RS.js.map} +0 -0
  167. /package/dist/cli/{setup-VDS6SVEP.js.map → setup-TPAGSVXO.js.map} +0 -0
  168. /package/dist/cli/{chat-7ES4IBNH.js.map → stats-DPUBZNVX.js.map} +0 -0
  169. /package/dist/cli/{version-DAHGZY5N.js.map → version-2X3BHVVK.js.map} +0 -0
package/dist/cli/index.js CHANGED
@@ -5,40 +5,42 @@ import {
5
5
  startCpuProfile,
6
6
  stopAndSaveCpuProfile
7
7
  } from "./chunk-ZZM6QJ4W.js";
8
- import "./chunk-2R4QCDOZ.js";
9
- import "./chunk-F3PXYSNN.js";
10
- import "./chunk-FHOGSSCH.js";
11
- import "./chunk-6AK4EY3D.js";
8
+ import "./chunk-OPFUUYHL.js";
9
+ import "./chunk-WK3UFQY3.js";
10
+ import "./chunk-C53JQES5.js";
11
+ import "./chunk-XSU4QVFW.js";
12
12
  import {
13
13
  applyMemoryStack
14
- } from "./chunk-5JJRUIPA.js";
14
+ } from "./chunk-JNAQYELD.js";
15
15
  import {
16
16
  resolvePreset
17
17
  } from "./chunk-2425HK6U.js";
18
18
  import {
19
19
  installProxyIfConfigured
20
- } from "./chunk-74EX7SUH.js";
21
- import "./chunk-PV55UMTO.js";
22
- import "./chunk-2KDUS647.js";
20
+ } from "./chunk-5QCB62C4.js";
21
+ import "./chunk-6OWJV3YW.js";
22
+ import "./chunk-V26WPN3J.js";
23
23
  import "./chunk-25T6CVUP.js";
24
24
  import "./chunk-2UQP6H6T.js";
25
- import "./chunk-O52OLQL3.js";
25
+ import "./chunk-RDRC3XDT.js";
26
26
  import {
27
27
  escalationContract
28
- } from "./chunk-2K65GZBT.js";
29
- import "./chunk-7O5ALB4C.js";
28
+ } from "./chunk-TEUDEGX2.js";
29
+ import "./chunk-7CIGMZT3.js";
30
30
  import "./chunk-S4XVGLRW.js";
31
31
  import {
32
32
  listSessions
33
33
  } from "./chunk-6PBZN4VI.js";
34
+ import "./chunk-R3CTO2HM.js";
35
+ import "./chunk-ZZYBBX5N.js";
34
36
  import {
35
37
  t
36
- } from "./chunk-RE4RAVFF.js";
38
+ } from "./chunk-CGDR2ELH.js";
37
39
  import {
38
- readConfig
39
- } from "./chunk-XPDVG52A.js";
40
- import "./chunk-HFEAY5DT.js";
41
- import "./chunk-YQ6NTIIE.js";
40
+ normalizeMcpConfig,
41
+ readConfig,
42
+ specToRaw
43
+ } from "./chunk-AVFXO2EZ.js";
42
44
  import {
43
45
  VERSION
44
46
  } from "./chunk-XXC2BYTV.js";
@@ -1470,9 +1472,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
1470
1472
  * @param {string} invalidArgumentMessage
1471
1473
  * @private
1472
1474
  */
1473
- _callParseArg(target, value, previous, invalidArgumentMessage) {
1475
+ _callParseArg(target2, value, previous, invalidArgumentMessage) {
1474
1476
  try {
1475
- return target.parseArg(value, previous);
1477
+ return target2.parseArg(value, previous);
1476
1478
  } catch (err) {
1477
1479
  if (err.code === "commander.invalidArgument") {
1478
1480
  const message = `${invalidArgumentMessage} ${err.message}`;
@@ -2586,10 +2588,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
2586
2588
  const optionKey = option2.attributeName();
2587
2589
  const optionValue = this.getOptionValue(optionKey);
2588
2590
  const negativeOption = this.options.find(
2589
- (target) => target.negate && optionKey === target.attributeName()
2591
+ (target2) => target2.negate && optionKey === target2.attributeName()
2590
2592
  );
2591
2593
  const positiveOption = this.options.find(
2592
- (target) => !target.negate && optionKey === target.attributeName()
2594
+ (target2) => !target2.negate && optionKey === target2.attributeName()
2593
2595
  );
2594
2596
  if (negativeOption && (negativeOption.presetArg === void 0 && optionValue === false || negativeOption.presetArg !== void 0 && optionValue === negativeOption.presetArg)) {
2595
2597
  return negativeOption;
@@ -3048,6 +3050,45 @@ var require_commander = __commonJS({
3048
3050
  }
3049
3051
  });
3050
3052
 
3053
+ // src/cli/heap-limit-launch.ts
3054
+ import { spawnSync } from "child_process";
3055
+ import { totalmem } from "os";
3056
+ import { getHeapStatistics } from "v8";
3057
+
3058
+ // src/cli/heap-limit.ts
3059
+ var TARGET_HEAP_MB_CEILING = 4096;
3060
+ var TARGET_HEAP_MB_FLOOR = 2048;
3061
+ var HEAP_HEADROOM_MB = 64;
3062
+ var RX_HEAP_REEXEC_ENV = "REASONIX_HEAP_REEXEC";
3063
+ function decideHeapTargetMb(inputs) {
3064
+ if (inputs.alreadyReexec) return null;
3065
+ if (/--max[-_]old[-_]space[-_]size/.test(inputs.nodeOptions)) return null;
3066
+ if (inputs.execArgv.some((a) => /max[-_]old[-_]space[-_]size/.test(a))) return null;
3067
+ const halfSystem = Math.floor(inputs.totalMemMb / 2);
3068
+ const target2 = Math.min(TARGET_HEAP_MB_CEILING, Math.max(TARGET_HEAP_MB_FLOOR, halfSystem));
3069
+ if (inputs.currentLimitMb >= target2 - HEAP_HEADROOM_MB) return null;
3070
+ return target2;
3071
+ }
3072
+
3073
+ // src/cli/heap-limit-launch.ts
3074
+ var target = decideHeapTargetMb({
3075
+ currentLimitMb: Math.floor(getHeapStatistics().heap_size_limit / 1024 / 1024),
3076
+ totalMemMb: Math.floor(totalmem() / 1024 / 1024),
3077
+ nodeOptions: process.env.NODE_OPTIONS ?? "",
3078
+ execArgv: process.execArgv,
3079
+ alreadyReexec: process.env[RX_HEAP_REEXEC_ENV] === "1"
3080
+ });
3081
+ if (target !== null) {
3082
+ const existing = process.env.NODE_OPTIONS ?? "";
3083
+ const nextOptions = `${existing} --max-old-space-size=${target}`.trim();
3084
+ const childEnv = { ...process.env, NODE_OPTIONS: nextOptions, [RX_HEAP_REEXEC_ENV]: "1" };
3085
+ const result = spawnSync(process.execPath, process.argv.slice(1), {
3086
+ env: childEnv,
3087
+ stdio: "inherit"
3088
+ });
3089
+ process.exit(result.status ?? 0);
3090
+ }
3091
+
3051
3092
  // node_modules/commander/esm.mjs
3052
3093
  var import_index = __toESM(require_commander(), 1);
3053
3094
  var {
@@ -3066,15 +3107,17 @@ var {
3066
3107
  } = import_index.default;
3067
3108
 
3068
3109
  // src/cli/resolve.ts
3069
- import { existsSync } from "fs";
3070
- import { resolve } from "path";
3071
3110
  function resolveDefaults(flags) {
3072
3111
  const cfg = flags.noConfig ? {} : readConfig();
3073
3112
  const preset = pickPreset(flags.preset, cfg.preset);
3074
3113
  const presetSettings = resolvePreset(preset);
3075
3114
  const model = flags.model ?? presetSettings.model;
3076
3115
  const reasoningEffort = presetSettings.reasoningEffort;
3077
- const mcp2 = flags.mcp && flags.mcp.length > 0 ? flags.mcp : cfg.mcp ?? [];
3116
+ const normalizedMcp = normalizeMcpConfig(
3117
+ cfg,
3118
+ flags.mcp && flags.mcp.length > 0 ? flags.mcp : void 0
3119
+ );
3120
+ const mcp2 = normalizedMcp.map(specToRaw);
3078
3121
  const session = resolveSession(flags.session, cfg.session);
3079
3122
  return { model, reasoningEffort, mcp: mcp2, session };
3080
3123
  }
@@ -3105,24 +3148,9 @@ function resolveContinueFlag(flag, fallbackSession, getLatestSession, warn = ()
3105
3148
  }
3106
3149
  return { session: latest.name, forceResume: true };
3107
3150
  }
3108
- var PROJECT_MARKERS = [
3109
- ".git",
3110
- "package.json",
3111
- "pyproject.toml",
3112
- "Cargo.toml",
3113
- "go.mod",
3114
- "pom.xml",
3115
- "build.gradle",
3116
- "CMakeLists.txt"
3117
- ];
3118
- function looksLikeProjectDir(cwd, recentWorkspaces = []) {
3119
- const root = resolve(cwd);
3120
- if (recentWorkspaces.some((workspace) => resolve(workspace) === root)) return true;
3121
- return PROJECT_MARKERS.some((marker) => existsSync(resolve(root, marker)));
3122
- }
3123
- function resolveBareCommandMode(cwd, cfg) {
3151
+ function resolveBareCommandMode(cfg) {
3124
3152
  if (!cfg.setupCompleted) return "setup";
3125
- return looksLikeProjectDir(cwd, cfg.recentWorkspaces) ? "code" : "chat";
3153
+ return "code";
3126
3154
  }
3127
3155
 
3128
3156
  // src/cli/index.ts
@@ -3208,60 +3236,62 @@ function resolveDashboardPort(flagValue, noConfig) {
3208
3236
  const fromCfg = readConfig().dashboard?.port;
3209
3237
  return typeof fromCfg === "number" && Number.isInteger(fromCfg) && fromCfg >= 1 && fromCfg <= 65535 ? fromCfg : void 0;
3210
3238
  }
3239
+ function resolveDashboardHost(flagValue, noConfig) {
3240
+ const fromFlag = flagValue?.trim();
3241
+ if (fromFlag) return fromFlag;
3242
+ const fromEnv = process.env.REASONIX_DASHBOARD_HOST?.trim();
3243
+ if (fromEnv) return fromEnv;
3244
+ if (noConfig) return void 0;
3245
+ const fromCfg = readConfig().dashboard?.host;
3246
+ return typeof fromCfg === "string" && fromCfg.trim() ? fromCfg.trim() : void 0;
3247
+ }
3248
+ function resolveDashboardToken(noConfig) {
3249
+ const fromEnv = process.env.REASONIX_DASHBOARD_TOKEN?.trim();
3250
+ const fromCfg = noConfig ? void 0 : readConfig().dashboard?.token?.trim();
3251
+ const candidate = fromEnv || fromCfg;
3252
+ if (!candidate) return void 0;
3253
+ if (candidate.length < 16) {
3254
+ process.stderr.write(
3255
+ `\u25B2 ignoring dashboard token (${candidate.length} chars; min 16) \u2014 using ephemeral per-boot token instead
3256
+ `
3257
+ );
3258
+ return void 0;
3259
+ }
3260
+ return candidate;
3261
+ }
3211
3262
  var program2 = new Command();
3212
3263
  program2.name("reasonix").description(t("cli.description")).version(VERSION).option("-c, --continue", t("cli.continue"));
3213
- program2.action(async (opts) => {
3264
+ program2.option("--node", "use the legacy Node/Ink TUI (default is the Rust renderer)").action(async (opts) => {
3265
+ if (opts.node) process.env.REASONIX_RENDERER = "node";
3214
3266
  const cfg = readConfig();
3215
- const cwd = process.cwd();
3216
- const mode = resolveBareCommandMode(cwd, cfg);
3267
+ const mode = resolveBareCommandMode(cfg);
3217
3268
  if (mode === "setup") {
3218
- const { setupCommand } = await import("./setup-VDS6SVEP.js");
3269
+ const { setupCommand } = await import("./setup-TPAGSVXO.js");
3219
3270
  await setupCommand({ forceKeyStep: true });
3220
3271
  return;
3221
3272
  }
3222
- if (mode === "code") {
3223
- const { codeCommand } = await import("./code-SMKEW6CD.js");
3224
- await codeCommand({ dir: cwd });
3225
- return;
3226
- }
3227
- const defaults = resolveDefaults({});
3228
- const continueOpts = resolveContinueFlag(
3229
- opts.continue,
3230
- defaults.session,
3231
- () => listSessions()[0],
3232
- (msg) => process.stderr.write(`${msg}
3233
- `)
3234
- );
3235
- process.stderr.write(
3236
- "\u2139 chat mode (no filesystem tools). Run `reasonix code` to work on files in this folder.\n"
3237
- );
3238
- const { chatCommand } = await import("./chat-7ES4IBNH.js");
3239
- const defaultBase = defaultSystemPrompt(defaults.model);
3240
- const defaultRebuildSystem = () => applyMemoryStack(defaultBase, cwd);
3241
- await chatCommand({
3242
- model: defaults.model,
3243
- system: defaultRebuildSystem(),
3244
- rebuildSystem: defaultRebuildSystem,
3245
- session: continueOpts.session,
3246
- mcp: defaults.mcp,
3247
- forceResume: continueOpts.forceResume
3248
- });
3273
+ const { codeCommand } = await import("./code-PSVJ3KEN.js");
3274
+ await codeCommand({ dir: process.cwd(), forceResume: !!opts.continue });
3249
3275
  });
3250
3276
  program2.command("setup").description(t("cli.setup")).action(async () => {
3251
- const { setupCommand } = await import("./setup-VDS6SVEP.js");
3277
+ const { setupCommand } = await import("./setup-TPAGSVXO.js");
3252
3278
  await setupCommand({ forceKeyStep: true });
3253
3279
  });
3254
3280
  program2.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--no-session", t("ui.noSession")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option(
3255
3281
  "--escalate-after <n>",
3256
3282
  "repair-signal count before flash\u2192pro escalation (default 3)",
3257
3283
  (v) => Number.parseInt(v, 10)
3258
- ).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option("--system-append <prompt>", t("ui.systemAppendHint")).option("--system-append-file <path>", t("ui.systemAppendFileHint")).option(
3284
+ ).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option(
3285
+ "--dashboard-host <host>",
3286
+ "bind address for the dashboard (default 127.0.0.1; use 0.0.0.0 for LAN access \u2014 the URL token is then the only auth)"
3287
+ ).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option("--system-append <prompt>", t("ui.systemAppendHint")).option("--system-append-file <path>", t("ui.systemAppendFileHint")).option(
3259
3288
  "--profile [path]",
3260
3289
  "record a V8 CPU profile; saved on exit. Send the .cpuprofile back if you're reporting a perf bug."
3261
- ).action(async (dir, opts) => {
3290
+ ).option("--node", "use the legacy Node/Ink TUI (default is the Rust renderer)").action(async (dir, opts) => {
3291
+ if (opts.node) process.env.REASONIX_RENDERER = "node";
3262
3292
  const profiling = await maybeStartCpuProfile(opts.profile);
3263
3293
  try {
3264
- const { codeCommand } = await import("./code-SMKEW6CD.js");
3294
+ const { codeCommand } = await import("./code-PSVJ3KEN.js");
3265
3295
  await codeCommand({
3266
3296
  dir,
3267
3297
  model: opts.model,
@@ -3277,6 +3307,8 @@ program2.command("code [dir]").description(t("cli.code")).option("-m, --model <i
3277
3307
  noDashboard: opts.dashboard === false,
3278
3308
  openDashboard: opts.openDashboard === true,
3279
3309
  dashboardPort: resolveDashboardPort(parseDashboardPortFlag(opts.dashboardPort), false),
3310
+ dashboardHost: resolveDashboardHost(opts.dashboardHost, false),
3311
+ dashboardToken: resolveDashboardToken(false),
3280
3312
  systemAppend: opts.systemAppend,
3281
3313
  systemAppendFile: opts.systemAppendFile,
3282
3314
  altScreen: opts.altScreen !== false,
@@ -3295,10 +3327,14 @@ program2.command("chat").description(t("cli.chat")).option("-m, --model <id>", t
3295
3327
  t("ui.mcpSpecHint"),
3296
3328
  (value, previous = []) => [...previous, value],
3297
3329
  []
3298
- ).option("--mcp-prefix <str>", t("ui.mcpPrefixHint")).option("--no-config", t("ui.noConfigHint")).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option(
3330
+ ).option("--mcp-prefix <str>", t("ui.mcpPrefixHint")).option("--no-config", t("ui.noConfigHint")).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option(
3331
+ "--dashboard-host <host>",
3332
+ "bind address for the dashboard (default 127.0.0.1; use 0.0.0.0 for LAN access \u2014 the URL token is then the only auth)"
3333
+ ).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option(
3299
3334
  "--profile [path]",
3300
3335
  "record a V8 CPU profile; saved on exit. Send the .cpuprofile back if you're reporting a perf bug."
3301
- ).action(async (opts) => {
3336
+ ).option("--node", "use the legacy Node/Ink TUI (default is the Rust renderer)").action(async (opts) => {
3337
+ if (opts.node) process.env.REASONIX_RENDERER = "node";
3302
3338
  const profiling = await maybeStartCpuProfile(opts.profile);
3303
3339
  try {
3304
3340
  const defaults = resolveDefaults({
@@ -3315,7 +3351,7 @@ program2.command("chat").description(t("cli.chat")).option("-m, --model <id>", t
3315
3351
  (msg) => process.stderr.write(`${msg}
3316
3352
  `)
3317
3353
  );
3318
- const { chatCommand } = await import("./chat-7ES4IBNH.js");
3354
+ const { chatCommand } = await import("./chat-TH7VNNCJ.js");
3319
3355
  const chatBase = opts.system ?? defaultSystemPrompt(defaults.model);
3320
3356
  const chatCwd = process.cwd();
3321
3357
  const chatRebuildSystem = () => applyMemoryStack(chatBase, chatCwd);
@@ -3340,6 +3376,8 @@ program2.command("chat").description(t("cli.chat")).option("-m, --model <id>", t
3340
3376
  parseDashboardPortFlag(opts.dashboardPort),
3341
3377
  opts.config === false
3342
3378
  ),
3379
+ dashboardHost: resolveDashboardHost(opts.dashboardHost, opts.config === false),
3380
+ dashboardToken: resolveDashboardToken(opts.config === false),
3343
3381
  altScreen: opts.altScreen !== false,
3344
3382
  mouse: opts.mouse !== false
3345
3383
  });
@@ -3363,7 +3401,7 @@ program2.command("run <task>").description(t("cli.run")).option("-m, --model <id
3363
3401
  preset: opts.preset,
3364
3402
  noConfig: opts.config === false
3365
3403
  });
3366
- const { runCommand } = await import("./run-Q6BUXV66.js");
3404
+ const { runCommand } = await import("./run-MDGL27WL.js");
3367
3405
  await runCommand({
3368
3406
  task,
3369
3407
  model: defaults.model,
@@ -3390,7 +3428,7 @@ program2.command("acp").description("run reasonix as an Agent Client Protocol (A
3390
3428
  preset: opts.preset,
3391
3429
  noConfig: false
3392
3430
  });
3393
- const { acpCommand } = await import("./acp-DAGPCVFZ.js");
3431
+ const { acpCommand } = await import("./acp-TYZ2CTDL.js");
3394
3432
  await acpCommand({
3395
3433
  model: defaults.model,
3396
3434
  budgetUsd: parseBudgetFlag(opts.budget),
@@ -3408,7 +3446,7 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
3408
3446
  preset: opts.preset,
3409
3447
  noConfig: false
3410
3448
  });
3411
- const { desktopCommand } = await import("./desktop-Q7NDXCON.js");
3449
+ const { desktopCommand } = await import("./desktop-KWGR4BNE.js");
3412
3450
  await desktopCommand({
3413
3451
  model: defaults.model,
3414
3452
  budgetUsd: parseBudgetFlag(opts.budget),
@@ -3416,19 +3454,19 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
3416
3454
  });
3417
3455
  });
3418
3456
  program2.command("stats [transcript]").description(t("cli.stats")).action(async (transcript) => {
3419
- const { statsCommand } = await import("./stats-MQVI2XQH.js");
3457
+ const { statsCommand } = await import("./stats-DPUBZNVX.js");
3420
3458
  statsCommand({ transcript });
3421
3459
  });
3422
3460
  program2.command("doctor").description(t("cli.doctor")).option("--json", t("ui.jsonHint")).action(async (opts) => {
3423
- const { doctorCommand } = await import("./doctor-OT7KH75K.js");
3461
+ const { doctorCommand } = await import("./doctor-CC5CLOGG.js");
3424
3462
  await doctorCommand({ json: !!opts.json });
3425
3463
  });
3426
3464
  program2.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
3427
- const { commitCommand } = await import("./commit-HE4VSPZ7.js");
3465
+ const { commitCommand } = await import("./commit-XCQIQCYG.js");
3428
3466
  await commitCommand({ model: opts.model, yes: !!opts.yes });
3429
3467
  });
3430
3468
  program2.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
3431
- const { sessionsCommand } = await import("./sessions-FH7QVYSY.js");
3469
+ const { sessionsCommand } = await import("./sessions-CKQXCYGP.js");
3432
3470
  sessionsCommand({ name, verbose: !!opts.verbose });
3433
3471
  });
3434
3472
  program2.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
@@ -3447,7 +3485,7 @@ program2.command("events <name>").description(t("cli.events")).option("--type <t
3447
3485
  });
3448
3486
  });
3449
3487
  program2.command("replay <transcript>").description(t("cli.replay")).option("--print", t("ui.printHint")).option("--head <n>", t("ui.headHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.tailHint"), (v) => Number.parseInt(v, 10)).action(async (transcript, opts) => {
3450
- const { replayCommand } = await import("./replay-YOURXV4C.js");
3488
+ const { replayCommand } = await import("./replay-SR44E6RS.js");
3451
3489
  await replayCommand({
3452
3490
  path: transcript,
3453
3491
  print: !!opts.print,
@@ -3456,7 +3494,7 @@ program2.command("replay <transcript>").description(t("cli.replay")).option("--p
3456
3494
  });
3457
3495
  });
3458
3496
  program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>", t("ui.mdReportHint")).option("--print", t("ui.printHintTable")).option("--tui", t("ui.tuiHint")).option("--label-a <label>", t("ui.labelAHint")).option("--label-b <label>", t("ui.labelBHint")).action(async (a, b, opts) => {
3459
- const { diffCommand } = await import("./diff-435UTPC5.js");
3497
+ const { diffCommand } = await import("./diff-NHANTNC3.js");
3460
3498
  await diffCommand({
3461
3499
  a,
3462
3500
  b,
@@ -3470,7 +3508,7 @@ program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>"
3470
3508
  var mcp = program2.command("mcp").description(t("cli.mcp"));
3471
3509
  mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("ui.jsonHintCatalog")).option("--local", t("ui.mcpLocalHint")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--pages <n>", t("ui.mcpPagesHint"), (v) => Number.parseInt(v, 10)).option("--all", t("ui.mcpAllHint")).action(async (opts) => {
3472
3510
  try {
3473
- const { mcpListCommand } = await import("./mcp-WUL2WO75.js");
3511
+ const { mcpListCommand } = await import("./mcp-MPVGBBJF.js");
3474
3512
  await mcpListCommand({
3475
3513
  json: !!opts.json,
3476
3514
  local: !!opts.local,
@@ -3487,7 +3525,7 @@ mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("
3487
3525
  });
3488
3526
  mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("--json", t("ui.jsonHintCatalog")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (query, opts) => {
3489
3527
  try {
3490
- const { mcpSearchCommand } = await import("./mcp-WUL2WO75.js");
3528
+ const { mcpSearchCommand } = await import("./mcp-MPVGBBJF.js");
3491
3529
  await mcpSearchCommand(query, {
3492
3530
  json: !!opts.json,
3493
3531
  refresh: !!opts.refresh,
@@ -3502,7 +3540,7 @@ mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("
3502
3540
  });
3503
3541
  mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option("--refresh", t("ui.mcpRefreshHint")).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (name, opts) => {
3504
3542
  try {
3505
- const { mcpInstallCommand } = await import("./mcp-WUL2WO75.js");
3543
+ const { mcpInstallCommand } = await import("./mcp-MPVGBBJF.js");
3506
3544
  await mcpInstallCommand(name, {
3507
3545
  refresh: !!opts.refresh,
3508
3546
  maxPages: typeof opts.maxPages === "number" && opts.maxPages > 0 ? opts.maxPages : void 0
@@ -3515,7 +3553,7 @@ mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option(
3515
3553
  });
3516
3554
  mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async () => {
3517
3555
  try {
3518
- const { mcpBrowseCommand } = await import("./mcp-browse-RR7R4XET.js");
3556
+ const { mcpBrowseCommand } = await import("./mcp-browse-4XOTC3FJ.js");
3519
3557
  await mcpBrowseCommand();
3520
3558
  } catch (err) {
3521
3559
  process.stderr.write(`mcp browse failed: ${err.message}
@@ -3524,7 +3562,7 @@ mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async ()
3524
3562
  }
3525
3563
  });
3526
3564
  mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option("--json", t("ui.jsonHintReport")).action(async (spec, opts) => {
3527
- const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-REGLYBWT.js");
3565
+ const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-CEMGKKAH.js");
3528
3566
  try {
3529
3567
  await mcpInspectCommand({ spec, json: !!opts.json });
3530
3568
  } catch (err) {
@@ -3534,7 +3572,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
3534
3572
  }
3535
3573
  });
3536
3574
  program2.command("version").description(t("cli.version")).action(async () => {
3537
- const { versionCommand } = await import("./version-DAHGZY5N.js");
3575
+ const { versionCommand } = await import("./version-2X3BHVVK.js");
3538
3576
  versionCommand();
3539
3577
  });
3540
3578
  program2.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
@@ -3543,7 +3581,7 @@ program2.command("update").description(t("cli.update")).option("--dry-run", t("u
3543
3581
  });
3544
3582
  program2.command("index").description(t("cli.index")).option("--rebuild", t("ui.rebuildHint")).option("--model <name>", t("ui.embedModelHint")).option("--dir <path>", t("ui.projectDirHint")).option("--ollama-url <url>", t("ui.ollamaUrlHint")).option("-y, --yes", t("ui.skipPromptsHint")).action(
3545
3583
  async (opts) => {
3546
- const { indexCommand } = await import("./commands-FVVB5FZF.js");
3584
+ const { indexCommand } = await import("./commands-OCU42XG4.js");
3547
3585
  await indexCommand(opts);
3548
3586
  }
3549
3587
  );