reasonix 0.52.0 → 0.53.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 (143) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dashboard/dist/app.css +1 -1
  4. package/dashboard/dist/app.js +13 -13
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/dist/cli/{acp-NEUYWGUU.js → acp-ABNDGEYC.js} +63 -30
  7. package/dist/cli/acp-ABNDGEYC.js.map +1 -0
  8. package/dist/cli/chat-377YZV56.js +49 -0
  9. package/dist/cli/{chunk-FY5UERSG.js → chunk-2WZT27GR.js} +9 -9
  10. package/dist/cli/{chunk-B4MOGWHW.js → chunk-4EHRIP5U.js} +7 -7
  11. package/dist/cli/chunk-4EHRIP5U.js.map +1 -0
  12. package/dist/cli/{chunk-RCC73DWQ.js → chunk-4SBXAHR6.js} +4 -4
  13. package/dist/cli/{chunk-5YLEKX2V.js → chunk-4V4TKQMB.js} +4 -4
  14. package/dist/cli/{chunk-5YLEKX2V.js.map → chunk-4V4TKQMB.js.map} +1 -1
  15. package/dist/cli/chunk-7ZO6H6ZK.js +54 -0
  16. package/dist/cli/chunk-7ZO6H6ZK.js.map +1 -0
  17. package/dist/cli/{chunk-3OXD5CBM.js → chunk-A6GSOADP.js} +17870 -16070
  18. package/dist/cli/chunk-A6GSOADP.js.map +1 -0
  19. package/dist/cli/{chunk-Z663GVUB.js → chunk-APOSDBAU.js} +3 -3
  20. package/dist/cli/{chunk-CTRM32BP.js → chunk-B5JISV5I.js} +2 -2
  21. package/dist/cli/{chunk-HNZ4727T.js → chunk-DFHI2MRB.js} +412 -152
  22. package/dist/cli/chunk-DFHI2MRB.js.map +1 -0
  23. package/dist/cli/{chunk-CGVW5W7N.js → chunk-EPIHGOM3.js} +14 -14
  24. package/dist/cli/{chunk-CGVW5W7N.js.map → chunk-EPIHGOM3.js.map} +1 -1
  25. package/dist/cli/{chunk-77JIQ7SL.js → chunk-EQFZIHKJ.js} +8 -8
  26. package/dist/cli/chunk-EQFZIHKJ.js.map +1 -0
  27. package/dist/cli/{chunk-XNMXVL6C.js → chunk-FB27YXPX.js} +2 -2
  28. package/dist/cli/{chunk-ARBGTNHM.js → chunk-FK7NXDRP.js} +2 -2
  29. package/dist/cli/{chunk-AOYUW3HR.js → chunk-GCNBIWK7.js} +22 -2
  30. package/dist/cli/chunk-GCNBIWK7.js.map +1 -0
  31. package/dist/cli/{chunk-XBYHNZ5Z.js → chunk-GMQVINZK.js} +13 -5
  32. package/dist/cli/chunk-GMQVINZK.js.map +1 -0
  33. package/dist/cli/{chunk-MVLPXZAA.js → chunk-GOASYYZ4.js} +43 -11
  34. package/dist/cli/{chunk-MVLPXZAA.js.map → chunk-GOASYYZ4.js.map} +1 -1
  35. package/dist/cli/{chunk-WPY7AFS6.js → chunk-I4SH5Z7S.js} +2 -2
  36. package/dist/cli/{chunk-MW64SQUE.js → chunk-J26XOB2T.js} +2 -2
  37. package/dist/cli/{chunk-DLTE4GBY.js → chunk-J4MYMBJ7.js} +3 -3
  38. package/dist/cli/{chunk-CFJY64UA.js → chunk-LRO63VNK.js} +2 -2
  39. package/dist/cli/{chunk-XUZHBQSM.js → chunk-MQJR7YQ2.js} +2 -2
  40. package/dist/cli/{chunk-CPCUMMSR.js → chunk-NVI4XPOQ.js} +3 -3
  41. package/dist/cli/{chunk-RHQOGG43.js → chunk-OHSVEXFF.js} +3 -3
  42. package/dist/cli/chunk-OHSVEXFF.js.map +1 -0
  43. package/dist/cli/{chunk-AMSK3ZLB.js → chunk-P5SUHDUQ.js} +2 -2
  44. package/dist/cli/{chunk-GFJJEW3Z.js → chunk-QSKDP3OS.js} +55 -5
  45. package/dist/cli/chunk-QSKDP3OS.js.map +1 -0
  46. package/dist/cli/{chunk-D6WRFR6V.js → chunk-R7JMQMLD.js} +6 -5
  47. package/dist/cli/chunk-R7JMQMLD.js.map +1 -0
  48. package/dist/cli/{chunk-VVPV5HU6.js → chunk-RRZIIMAF.js} +2 -2
  49. package/dist/cli/{chunk-GNRKXRRE.js → chunk-S3QII236.js} +369 -359
  50. package/dist/cli/{chunk-GNRKXRRE.js.map → chunk-S3QII236.js.map} +1 -1
  51. package/dist/cli/{chunk-HI6THNAZ.js → chunk-TGP7JGHN.js} +32 -14
  52. package/dist/cli/chunk-TGP7JGHN.js.map +1 -0
  53. package/dist/cli/{chunk-CLHMV6OL.js → chunk-U7G72DHQ.js} +83 -42
  54. package/dist/cli/chunk-U7G72DHQ.js.map +1 -0
  55. package/dist/cli/{chunk-OMNRXZNA.js → chunk-URAI4YRL.js} +2 -2
  56. package/dist/cli/{chunk-6QBUXA73.js → chunk-V4AXMN4X.js} +2 -2
  57. package/dist/cli/{chunk-2W4F3RIZ.js → chunk-XHP6NYOT.js} +3 -2
  58. package/dist/cli/{chunk-2W4F3RIZ.js.map → chunk-XHP6NYOT.js.map} +1 -1
  59. package/dist/cli/{code-WN6D4VZO.js → code-JPFZJYVW.js} +34 -34
  60. package/dist/cli/{commands-DHETOY7O.js → commands-IUL2CLKH.js} +4 -4
  61. package/dist/cli/{commit-BBUYAKZV.js → commit-JT7LYBTL.js} +3 -3
  62. package/dist/cli/{config-KV7VV5LG.js → config-T4RWI5NG.js} +6 -2
  63. package/dist/cli/{desktop-LJVXWXNF.js → desktop-AUBW2SLL.js} +122 -38
  64. package/dist/cli/desktop-AUBW2SLL.js.map +1 -0
  65. package/dist/cli/devtools-O5HOMAGZ.js +3 -0
  66. package/dist/cli/diff-NINZHUJR.js +165 -0
  67. package/dist/cli/diff-NINZHUJR.js.map +1 -0
  68. package/dist/cli/{doctor-GI5LOEZL.js → doctor-OMAYGY4F.js} +10 -10
  69. package/dist/cli/{events-LBKMLFM4.js → events-5IVFJ4H3.js} +5 -5
  70. package/dist/cli/index.js +38 -38
  71. package/dist/cli/{mcp-DKEJK5ND.js → mcp-ECGJACAP.js} +3 -3
  72. package/dist/cli/{mcp-browse-V7KWDY32.js → mcp-browse-NGEOHVJB.js} +15 -15
  73. package/dist/cli/mcp-browse-NGEOHVJB.js.map +1 -0
  74. package/dist/cli/{mcp-inspect-MTABNHVM.js → mcp-inspect-ZIMNRG7G.js} +5 -5
  75. package/dist/cli/{prompt-ATI7DKHF.js → prompt-JCC3A7AA.js} +5 -5
  76. package/dist/cli/{prune-sessions-YQQSZTZS.js → prune-sessions-TE4BJYO2.js} +4 -4
  77. package/dist/cli/{replay-ZJQ4I4CJ.js → replay-2UUTCRTG.js} +29 -29
  78. package/dist/cli/replay-2UUTCRTG.js.map +1 -0
  79. package/dist/cli/{run-HFPRNWJY.js → run-ABQYOPVM.js} +22 -22
  80. package/dist/cli/{server-UHKO2VVM.js → server-MPCXIW2O.js} +27 -25
  81. package/dist/cli/{server-UHKO2VVM.js.map → server-MPCXIW2O.js.map} +1 -1
  82. package/dist/cli/{sessions-IQEWWUH3.js → sessions-YBPRGIAF.js} +16 -16
  83. package/dist/cli/{setup-5BYKCL62.js → setup-A34LF2QE.js} +42 -42
  84. package/dist/cli/setup-A34LF2QE.js.map +1 -0
  85. package/dist/cli/{stats-OFCGOQMZ.js → stats-GKG5JZQX.js} +6 -6
  86. package/dist/cli/stats-GKG5JZQX.js.map +1 -0
  87. package/dist/cli/{version-EODUFAAI.js → version-JD6QSM4X.js} +16 -16
  88. package/dist/index.d.ts +36 -5
  89. package/dist/index.js +443 -73
  90. package/dist/index.js.map +1 -1
  91. package/package.json +7 -2
  92. package/dist/cli/acp-NEUYWGUU.js.map +0 -1
  93. package/dist/cli/chat-QA6IVFJD.js +0 -49
  94. package/dist/cli/chunk-3OXD5CBM.js.map +0 -1
  95. package/dist/cli/chunk-77JIQ7SL.js.map +0 -1
  96. package/dist/cli/chunk-AOYUW3HR.js.map +0 -1
  97. package/dist/cli/chunk-B4MOGWHW.js.map +0 -1
  98. package/dist/cli/chunk-CLHMV6OL.js.map +0 -1
  99. package/dist/cli/chunk-D6WRFR6V.js.map +0 -1
  100. package/dist/cli/chunk-GFJJEW3Z.js.map +0 -1
  101. package/dist/cli/chunk-HI6THNAZ.js.map +0 -1
  102. package/dist/cli/chunk-HNZ4727T.js.map +0 -1
  103. package/dist/cli/chunk-I3NE5S63.js +0 -54
  104. package/dist/cli/chunk-I3NE5S63.js.map +0 -1
  105. package/dist/cli/chunk-RHQOGG43.js.map +0 -1
  106. package/dist/cli/chunk-XBYHNZ5Z.js.map +0 -1
  107. package/dist/cli/desktop-LJVXWXNF.js.map +0 -1
  108. package/dist/cli/diff-2JHMQAHI.js +0 -165
  109. package/dist/cli/diff-2JHMQAHI.js.map +0 -1
  110. package/dist/cli/mcp-browse-V7KWDY32.js.map +0 -1
  111. package/dist/cli/replay-ZJQ4I4CJ.js.map +0 -1
  112. package/dist/cli/setup-5BYKCL62.js.map +0 -1
  113. /package/dist/cli/{chat-QA6IVFJD.js.map → chat-377YZV56.js.map} +0 -0
  114. /package/dist/cli/{chunk-FY5UERSG.js.map → chunk-2WZT27GR.js.map} +0 -0
  115. /package/dist/cli/{chunk-RCC73DWQ.js.map → chunk-4SBXAHR6.js.map} +0 -0
  116. /package/dist/cli/{chunk-Z663GVUB.js.map → chunk-APOSDBAU.js.map} +0 -0
  117. /package/dist/cli/{chunk-CTRM32BP.js.map → chunk-B5JISV5I.js.map} +0 -0
  118. /package/dist/cli/{chunk-XNMXVL6C.js.map → chunk-FB27YXPX.js.map} +0 -0
  119. /package/dist/cli/{chunk-ARBGTNHM.js.map → chunk-FK7NXDRP.js.map} +0 -0
  120. /package/dist/cli/{chunk-WPY7AFS6.js.map → chunk-I4SH5Z7S.js.map} +0 -0
  121. /package/dist/cli/{chunk-MW64SQUE.js.map → chunk-J26XOB2T.js.map} +0 -0
  122. /package/dist/cli/{chunk-DLTE4GBY.js.map → chunk-J4MYMBJ7.js.map} +0 -0
  123. /package/dist/cli/{chunk-CFJY64UA.js.map → chunk-LRO63VNK.js.map} +0 -0
  124. /package/dist/cli/{chunk-XUZHBQSM.js.map → chunk-MQJR7YQ2.js.map} +0 -0
  125. /package/dist/cli/{chunk-CPCUMMSR.js.map → chunk-NVI4XPOQ.js.map} +0 -0
  126. /package/dist/cli/{chunk-AMSK3ZLB.js.map → chunk-P5SUHDUQ.js.map} +0 -0
  127. /package/dist/cli/{chunk-VVPV5HU6.js.map → chunk-RRZIIMAF.js.map} +0 -0
  128. /package/dist/cli/{chunk-OMNRXZNA.js.map → chunk-URAI4YRL.js.map} +0 -0
  129. /package/dist/cli/{chunk-6QBUXA73.js.map → chunk-V4AXMN4X.js.map} +0 -0
  130. /package/dist/cli/{code-WN6D4VZO.js.map → code-JPFZJYVW.js.map} +0 -0
  131. /package/dist/cli/{commands-DHETOY7O.js.map → commands-IUL2CLKH.js.map} +0 -0
  132. /package/dist/cli/{commit-BBUYAKZV.js.map → commit-JT7LYBTL.js.map} +0 -0
  133. /package/dist/cli/{config-KV7VV5LG.js.map → config-T4RWI5NG.js.map} +0 -0
  134. /package/dist/cli/{doctor-GI5LOEZL.js.map → devtools-O5HOMAGZ.js.map} +0 -0
  135. /package/dist/cli/{prompt-ATI7DKHF.js.map → doctor-OMAYGY4F.js.map} +0 -0
  136. /package/dist/cli/{events-LBKMLFM4.js.map → events-5IVFJ4H3.js.map} +0 -0
  137. /package/dist/cli/{mcp-DKEJK5ND.js.map → mcp-ECGJACAP.js.map} +0 -0
  138. /package/dist/cli/{mcp-inspect-MTABNHVM.js.map → mcp-inspect-ZIMNRG7G.js.map} +0 -0
  139. /package/dist/cli/{stats-OFCGOQMZ.js.map → prompt-JCC3A7AA.js.map} +0 -0
  140. /package/dist/cli/{prune-sessions-YQQSZTZS.js.map → prune-sessions-TE4BJYO2.js.map} +0 -0
  141. /package/dist/cli/{run-HFPRNWJY.js.map → run-ABQYOPVM.js.map} +0 -0
  142. /package/dist/cli/{sessions-IQEWWUH3.js.map → sessions-YBPRGIAF.js.map} +0 -0
  143. /package/dist/cli/{version-EODUFAAI.js.map → version-JD6QSM4X.js.map} +0 -0
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
- import "./chunk-HNZ4727T.js";
4
- import "./chunk-MW64SQUE.js";
5
- import "./chunk-D6WRFR6V.js";
6
- import "./chunk-RCC73DWQ.js";
7
- import "./chunk-5YLEKX2V.js";
8
- import "./chunk-2W4F3RIZ.js";
9
- import "./chunk-DLTE4GBY.js";
3
+ import "./chunk-DFHI2MRB.js";
4
+ import "./chunk-4SBXAHR6.js";
5
+ import "./chunk-J26XOB2T.js";
6
+ import "./chunk-R7JMQMLD.js";
7
+ import "./chunk-4V4TKQMB.js";
8
+ import "./chunk-FK7NXDRP.js";
9
+ import "./chunk-V4AXMN4X.js";
10
+ import "./chunk-XHP6NYOT.js";
11
+ import "./chunk-J4MYMBJ7.js";
10
12
  import "./chunk-BOWSNGQC.js";
11
- import "./chunk-CPCUMMSR.js";
13
+ import "./chunk-QSKDP3OS.js";
14
+ import "./chunk-25T6CVUP.js";
15
+ import "./chunk-NVI4XPOQ.js";
12
16
  import "./chunk-6UNHNVJR.js";
13
17
  import {
14
18
  listSessions,
15
19
  loadSessionMessages,
16
20
  sessionPath
17
- } from "./chunk-AMSK3ZLB.js";
21
+ } from "./chunk-P5SUHDUQ.js";
18
22
  import "./chunk-XXC2BYTV.js";
19
- import "./chunk-GFJJEW3Z.js";
20
- import "./chunk-25T6CVUP.js";
21
23
  import "./chunk-2UQP6H6T.js";
22
- import "./chunk-ARBGTNHM.js";
23
- import "./chunk-6QBUXA73.js";
24
24
  import {
25
25
  t
26
- } from "./chunk-CLHMV6OL.js";
27
- import "./chunk-AOYUW3HR.js";
26
+ } from "./chunk-U7G72DHQ.js";
27
+ import "./chunk-GCNBIWK7.js";
28
28
  import "./chunk-TUK7OWJA.js";
29
29
 
30
30
  // src/cli/commands/sessions.ts
@@ -117,4 +117,4 @@ function truncate(s, max) {
117
117
  export {
118
118
  sessionsCommand
119
119
  };
120
- //# sourceMappingURL=sessions-IQEWWUH3.js.map
120
+ //# sourceMappingURL=sessions-YBPRGIAF.js.map
@@ -3,20 +3,20 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  MultiSelect,
5
5
  SingleSelect
6
- } from "./chunk-CGVW5W7N.js";
6
+ } from "./chunk-EPIHGOM3.js";
7
7
  import {
8
8
  ThemeProvider,
9
9
  useTheme
10
- } from "./chunk-RHQOGG43.js";
10
+ } from "./chunk-OHSVEXFF.js";
11
11
  import {
12
- Br,
13
- L,
14
- W,
15
- Wo,
16
- Zs,
17
- fc,
18
- require_react
19
- } from "./chunk-3OXD5CBM.js";
12
+ Box_default,
13
+ Text,
14
+ TextInput,
15
+ renderSync,
16
+ require_react,
17
+ use_app_default,
18
+ use_input_default
19
+ } from "./chunk-A6GSOADP.js";
20
20
  import {
21
21
  MCP_CATALOG
22
22
  } from "./chunk-PLHAZOLZ.js";
@@ -31,7 +31,7 @@ import {
31
31
  onLanguageChange,
32
32
  setLanguage,
33
33
  t
34
- } from "./chunk-CLHMV6OL.js";
34
+ } from "./chunk-U7G72DHQ.js";
35
35
  import {
36
36
  defaultConfigPath,
37
37
  isPlausibleKey,
@@ -43,7 +43,7 @@ import {
43
43
  redactKey,
44
44
  resolveThemePreference,
45
45
  writeConfig
46
- } from "./chunk-AOYUW3HR.js";
46
+ } from "./chunk-GCNBIWK7.js";
47
47
  import {
48
48
  __toESM
49
49
  } from "./chunk-TUK7OWJA.js";
@@ -69,7 +69,7 @@ function Wizard({
69
69
  validateApiKey = validateDeepSeekApiKey,
70
70
  initial
71
71
  }) {
72
- const { exit } = fc();
72
+ const { exit } = use_app_default();
73
73
  const [, setLanguageVersion] = (0, import_react.useState)(0);
74
74
  (0, import_react.useEffect)(() => onLanguageChange(() => setLanguageVersion((v) => v + 1)), []);
75
75
  const [previewTheme, setPreviewTheme] = (0, import_react.useState)(
@@ -84,7 +84,7 @@ function Wizard({
84
84
  catalogArgs: {}
85
85
  }));
86
86
  const [error, setError] = (0, import_react.useState)(null);
87
- Br((_input, key) => {
87
+ use_input_default((_input, key) => {
88
88
  if (key.escape && step !== "saved" && onCancel) onCancel();
89
89
  });
90
90
  const content = (() => {
@@ -175,7 +175,7 @@ function Wizard({
175
175
  }
176
176
  if (step === "review") {
177
177
  const specs = data.selectedCatalog.map((name) => buildSpec(name, data.catalogArgs));
178
- return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.reviewTitle"), step: 2, total: 2 }, /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(
178
+ return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.reviewTitle"), step: 2, total: 2 }, /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(
179
179
  SummaryLine,
180
180
  {
181
181
  label: t("wizard.reviewLabelLanguage"),
@@ -189,8 +189,8 @@ function Wizard({
189
189
  }
190
190
  ), specs.map((spec, i) => (
191
191
  // biome-ignore lint/suspicious/noArrayIndexKey: review-only render, order fixed
192
- /* @__PURE__ */ import_react.default.createElement(W, { key: i, paddingLeft: 14 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, "\xB7 ", spec))
193
- )), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, null, t("wizard.reviewSavesTo", { path: defaultConfigPath() }))), error ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: "red" }, error)) : null, /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.reviewFooter")))), /* @__PURE__ */ import_react.default.createElement(
192
+ /* @__PURE__ */ import_react.default.createElement(Box_default, { key: i, paddingLeft: 14 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, "\xB7 ", spec))
193
+ )), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, null, t("wizard.reviewSavesTo", { path: defaultConfigPath() }))), error ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:red" }, error)) : null, /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.reviewFooter")))), /* @__PURE__ */ import_react.default.createElement(
194
194
  ReviewConfirm,
195
195
  {
196
196
  onConfirm: () => {
@@ -216,7 +216,7 @@ function Wizard({
216
216
  }
217
217
  ));
218
218
  }
219
- return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "green" }, t("wizard.savedTitle")), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, null, t("ui.welcome"))), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.savedShellHint"))), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.savedFooter"))), /* @__PURE__ */ import_react.default.createElement(ExitOnEnter, { onExit: exit }));
219
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: "ansi:green", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:green" }, t("wizard.savedTitle")), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, null, t("ui.welcome"))), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.savedShellHint"))), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.savedFooter"))), /* @__PURE__ */ import_react.default.createElement(ExitOnEnter, { onExit: exit }));
220
220
  })();
221
221
  return /* @__PURE__ */ import_react.default.createElement(ThemeProvider, { name: previewTheme }, content);
222
222
  }
@@ -229,7 +229,7 @@ function ThemeStep({
229
229
  const initialIndex = Math.max(0, THEME_NAMES.indexOf(initialValue));
230
230
  const [index, setIndex] = (0, import_react.useState)(initialIndex);
231
231
  const theme = useTheme();
232
- Br((_input, key) => {
232
+ use_input_default((_input, key) => {
233
233
  if (key.upArrow) {
234
234
  const next = (index - 1 + THEME_NAMES.length) % THEME_NAMES.length;
235
235
  setIndex(next);
@@ -242,8 +242,8 @@ function ThemeStep({
242
242
  onSubmit(THEME_NAMES[index]);
243
243
  }
244
244
  });
245
- return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", borderStyle: "round", borderColor: theme.tone.brand, paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: theme.tone.brand }, t("wizard.themeTitle")), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.themeSubtitle"))), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1, flexDirection: "column" }, THEME_NAMES.map((name, i) => /* @__PURE__ */ import_react.default.createElement(W, { key: name }, /* @__PURE__ */ import_react.default.createElement(L, { color: i === index ? theme.tone.brand : void 0 }, i === index ? "\u25B8 " : " "), /* @__PURE__ */ import_react.default.createElement(L, { bold: i === index, color: i === index ? theme.fg.strong : theme.fg.body }, name), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.meta }, " \u2014 "), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.meta }, t(`wizard.themeCaption.${name}`))))), /* @__PURE__ */ import_react.default.createElement(
246
- W,
245
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: theme.tone.brand, paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: theme.tone.brand }, t("wizard.themeTitle")), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.themeSubtitle"))), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, THEME_NAMES.map((name, i) => /* @__PURE__ */ import_react.default.createElement(Box_default, { key: name }, /* @__PURE__ */ import_react.default.createElement(Text, { color: i === index ? theme.tone.brand : void 0 }, i === index ? "\u25B8 " : " "), /* @__PURE__ */ import_react.default.createElement(Text, { bold: i === index, color: i === index ? theme.fg.strong : theme.fg.body }, name), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.meta }, " \u2014 "), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.meta }, t(`wizard.themeCaption.${name}`))))), /* @__PURE__ */ import_react.default.createElement(
246
+ Box_default,
247
247
  {
248
248
  marginTop: 1,
249
249
  flexDirection: "column",
@@ -251,12 +251,12 @@ function ThemeStep({
251
251
  borderColor: theme.fg.faint,
252
252
  paddingX: 1
253
253
  },
254
- /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.meta }, t("wizard.themeSampleHeading")),
255
- /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.accent }, "\u25C6 "), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.accent }, t("wizard.themeSampleReasoning"))),
256
- /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.info }, "\u25A3 "), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.body }, "fs.readFile("), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.ok }, '"main.ts"'), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.body }, ")")),
257
- /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.meta }, "~/project/main.ts:42")),
258
- /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.ok }, "ok"), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.warn }, "warn"), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ import_react.default.createElement(L, { color: theme.tone.err }, "err"))
259
- ), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.themeFooter"))));
254
+ /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.meta }, t("wizard.themeSampleHeading")),
255
+ /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.accent }, "\u25C6 "), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.accent }, t("wizard.themeSampleReasoning"))),
256
+ /* @__PURE__ */ import_react.default.createElement(Box_default, null, /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.info }, "\u25A3 "), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.body }, "fs.readFile("), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.ok }, '"main.ts"'), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.body }, ")")),
257
+ /* @__PURE__ */ import_react.default.createElement(Box_default, null, /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.meta }, "~/project/main.ts:42")),
258
+ /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.ok }, "ok"), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.warn }, "warn"), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ import_react.default.createElement(Text, { color: theme.tone.err }, "err"))
259
+ ), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.themeFooter"))));
260
260
  }
261
261
  function LanguageStep({
262
262
  initialValue,
@@ -267,7 +267,7 @@ function LanguageStep({
267
267
  label: LANGUAGE_LABELS[code],
268
268
  hint: code === detectSystemLanguage() ? "(detected)" : void 0
269
269
  }));
270
- return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, t("wizard.languageTitle")), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.languageSubtitle"))), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(
270
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: "ansi:cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, t("wizard.languageTitle")), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.languageSubtitle"))), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(
271
271
  SingleSelect,
272
272
  {
273
273
  items,
@@ -286,8 +286,8 @@ function ApiKeyStep({
286
286
  }) {
287
287
  const [value, setValue] = (0, import_react.useState)("");
288
288
  const [checking, setChecking] = (0, import_react.useState)(false);
289
- return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, t("wizard.welcomeTitle")), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, null, t("wizard.apiKeyPrompt"))), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.apiKeyGetOne")), /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.apiKeySavedLocally", { path: defaultConfigPath() })), initialValue ? /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.apiKeyPreview", { redacted: redactKey(initialValue) })) : null, /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, t("wizard.apiKeyInputLabel")), /* @__PURE__ */ import_react.default.createElement(
290
- Zs,
289
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: "ansi:cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, t("wizard.welcomeTitle")), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, null, t("wizard.apiKeyPrompt"))), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.apiKeyGetOne")), /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.apiKeySavedLocally", { path: defaultConfigPath() })), initialValue ? /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.apiKeyPreview", { redacted: redactKey(initialValue) })) : null, /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, t("wizard.apiKeyInputLabel")), /* @__PURE__ */ import_react.default.createElement(
290
+ TextInput,
291
291
  {
292
292
  value,
293
293
  onChange: setValue,
@@ -315,7 +315,7 @@ function ApiKeyStep({
315
315
  mask: "\u2022",
316
316
  placeholder: "sk-..."
317
317
  }
318
- )), checking ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: "yellow" }, t("wizard.apiKeyChecking"))) : error ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: "red" }, error)) : value ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.apiKeyPreview", { redacted: redactKey(value) }))) : null);
318
+ )), checking ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:yellow" }, t("wizard.apiKeyChecking"))) : error ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:red" }, error)) : value ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.apiKeyPreview", { redacted: redactKey(value) }))) : null);
319
319
  }
320
320
  async function validateDeepSeekApiKey(apiKey, opts = {}) {
321
321
  const fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);
@@ -346,7 +346,7 @@ function McpArgsStep({
346
346
  }) {
347
347
  const [value, setValue] = (0, import_react.useState)("");
348
348
  const [pendingCreate, setPendingCreate] = (0, import_react.useState)(null);
349
- Br((input, key) => {
349
+ use_input_default((input, key) => {
350
350
  if (!pendingCreate) return;
351
351
  const ch = input.toLowerCase();
352
352
  if (ch === "y" || key.return) {
@@ -372,10 +372,10 @@ function McpArgsStep({
372
372
  }
373
373
  });
374
374
  if (pendingCreate) {
375
- return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.mcpArgsTitle", { name: entry.name }), step: 2, total: 3 }, /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(L, null, t("wizard.mcpArgsDirMissing", { path: pendingCreate })), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.mcpArgsDirCreateHint"))), error ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: "red" }, error)) : null));
375
+ return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.mcpArgsTitle", { name: entry.name }), step: 2, total: 3 }, /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(Text, null, t("wizard.mcpArgsDirMissing", { path: pendingCreate })), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.mcpArgsDirCreateHint"))), error ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:red" }, error)) : null));
376
376
  }
377
- return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.mcpArgsTitle", { name: entry.name }), step: 2, total: 3 }, /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(L, null, entry.summary), entry.note ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, entry.note)) : null, /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, null, t("wizard.mcpArgsRequiredParam")), /* @__PURE__ */ import_react.default.createElement(L, { bold: true }, entry.userArgs)), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, entry.userArgs, " \u203A "), /* @__PURE__ */ import_react.default.createElement(
378
- Zs,
377
+ return /* @__PURE__ */ import_react.default.createElement(StepFrame, { title: t("wizard.mcpArgsTitle", { name: entry.name }), step: 2, total: 3 }, /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react.default.createElement(Text, null, entry.summary), entry.note ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, entry.note)) : null, /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, null, t("wizard.mcpArgsRequiredParam")), /* @__PURE__ */ import_react.default.createElement(Text, { bold: true }, entry.userArgs)), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, entry.userArgs, " \u203A "), /* @__PURE__ */ import_react.default.createElement(
378
+ TextInput,
379
379
  {
380
380
  value,
381
381
  onChange: setValue,
@@ -401,7 +401,7 @@ function McpArgsStep({
401
401
  },
402
402
  placeholder: placeholderFor(entry)
403
403
  }
404
- )), error ? /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(L, { color: "red" }, error)) : null));
404
+ )), error ? /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react.default.createElement(Text, { color: "ansi:red" }, error)) : null));
405
405
  }
406
406
  function checkFilesystemPath(p) {
407
407
  try {
@@ -411,13 +411,13 @@ function checkFilesystemPath(p) {
411
411
  }
412
412
  }
413
413
  function ReviewConfirm({ onConfirm }) {
414
- Br((_i, key) => {
414
+ use_input_default((_i, key) => {
415
415
  if (key.return) onConfirm();
416
416
  });
417
417
  return null;
418
418
  }
419
419
  function ExitOnEnter({ onExit }) {
420
- Br((_i, key) => {
420
+ use_input_default((_i, key) => {
421
421
  if (key.return) onExit();
422
422
  });
423
423
  return null;
@@ -428,10 +428,10 @@ function StepFrame({
428
428
  total,
429
429
  children
430
430
  }) {
431
- return /* @__PURE__ */ import_react.default.createElement(W, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, { dimColor: true }, t("wizard.stepCounter", { step, total })), /* @__PURE__ */ import_react.default.createElement(L, { bold: true, color: "cyan" }, title)), /* @__PURE__ */ import_react.default.createElement(W, { marginTop: 1, flexDirection: "column" }, children));
431
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, { flexDirection: "column", borderStyle: "round", borderColor: "ansi:cyan", paddingX: 1 }, /* @__PURE__ */ import_react.default.createElement(Box_default, null, /* @__PURE__ */ import_react.default.createElement(Text, { dim: true }, t("wizard.stepCounter", { step, total })), /* @__PURE__ */ import_react.default.createElement(Text, { bold: true, color: "ansi:cyan" }, title)), /* @__PURE__ */ import_react.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, children));
432
432
  }
433
433
  function SummaryLine({ label, value }) {
434
- return /* @__PURE__ */ import_react.default.createElement(W, null, /* @__PURE__ */ import_react.default.createElement(L, null, label.padEnd(12)), /* @__PURE__ */ import_react.default.createElement(L, { bold: true }, value));
434
+ return /* @__PURE__ */ import_react.default.createElement(Box_default, null, /* @__PURE__ */ import_react.default.createElement(Text, null, label.padEnd(12)), /* @__PURE__ */ import_react.default.createElement(Text, { bold: true }, value));
435
435
  }
436
436
  function mcpItems() {
437
437
  return MCP_CATALOG.map((entry) => {
@@ -479,7 +479,7 @@ async function setupCommand(opts = {}) {
479
479
  loadDotenv();
480
480
  const existingKey = loadApiKey();
481
481
  const existing = readConfig();
482
- const { waitUntilExit, unmount } = Wo(
482
+ const { waitUntilExit, unmount } = renderSync(
483
483
  /* @__PURE__ */ import_react2.default.createElement(
484
484
  Wizard,
485
485
  {
@@ -499,4 +499,4 @@ async function setupCommand(opts = {}) {
499
499
  export {
500
500
  setupCommand
501
501
  };
502
- //# sourceMappingURL=setup-5BYKCL62.js.map
502
+ //# sourceMappingURL=setup-A34LF2QE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/setup.tsx","../../src/cli/ui/Wizard.tsx"],"sourcesContent":["/** `reasonix setup` — re-mount the first-run wizard. */\n\nimport { render } from \"ink\";\nimport React from \"react\";\nimport { loadApiKey, readConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { Wizard } from \"../ui/Wizard.js\";\n\nexport interface SetupOptions {\n /** Test-only — skip the API-key step. */\n skipKeyStep?: boolean;\n /** Show the API-key step even when a saved/env key already exists. */\n forceKeyStep?: boolean;\n}\n\nexport async function setupCommand(opts: SetupOptions = {}): Promise<void> {\n loadDotenv();\n const existingKey = loadApiKey();\n const existing = readConfig();\n\n const { waitUntilExit, unmount } = render(\n <Wizard\n existingApiKey={existingKey}\n initial={{ mcp: existing.mcp, theme: existing.theme }}\n forceApiKeyStep={opts.forceKeyStep}\n onComplete={() => undefined}\n onCancel={() => {\n unmount();\n }}\n />,\n { exitOnCtrlC: true, patchConsole: false },\n );\n await waitUntilExit();\n}\n","/** First-run / re-configure wizard — saves to `~/.reasonix/config.json`. */\n\nimport { mkdirSync, statSync } from \"node:fs\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { TextInput } from \"ink\";\n// biome-ignore lint/style/useImportType: JSX (jsx: \"react\") needs React as a value at runtime\nimport React, { useEffect, useState } from \"react\";\nimport {\n type ReasonixConfig,\n defaultConfigPath,\n isPlausibleKey,\n loadBaseUrl,\n loadTheme,\n readConfig,\n redactKey,\n resolveThemePreference,\n writeConfig,\n} from \"../../config.js\";\nimport {\n detectSystemLanguage,\n getLanguage,\n getSupportedLanguages,\n notifyLanguageChange,\n onLanguageChange,\n setLanguage,\n t,\n} from \"../../i18n/index.js\";\nimport type { LanguageCode } from \"../../i18n/types.js\";\nimport { type CatalogEntry, MCP_CATALOG } from \"../../mcp/catalog.js\";\nimport { MultiSelect, type SelectItem, SingleSelect } from \"./Select.js\";\nimport { ThemeProvider, useTheme } from \"./theme/context.js\";\nimport { type ThemeName, listThemeNames } from \"./theme/tokens.js\";\n\nexport interface WizardProps {\n /** Called once the config has been saved. */\n onComplete: (cfg: ReasonixConfig) => void;\n /** Called if the user presses Esc to abort. */\n onCancel?: () => void;\n /** Skip the API-key step if a key already exists (env or config). */\n existingApiKey?: string;\n /** Force the API-key step so `reasonix setup` can replace a saved key. */\n forceApiKeyStep?: boolean;\n /** Verifies the submitted key before the wizard can continue. */\n validateApiKey?: (apiKey: string) => Promise<ApiKeyValidationResult>;\n /** Pre-fill selections when re-running (reconfigure flow). */\n initial?: {\n mcp?: string[];\n theme?: ThemeName | \"auto\";\n };\n}\n\nexport type ApiKeyValidationResult =\n | { ok: true }\n | { ok: false; reason: \"rejected\" | \"failed\"; message?: string };\n\ntype Step = \"language\" | \"theme\" | \"apiKey\" | \"mcp\" | \"mcpArgs\" | \"review\" | \"saved\";\n\ninterface WizardData {\n language: LanguageCode;\n theme: ThemeName;\n apiKey: string;\n selectedCatalog: string[];\n catalogArgs: Record<string, string>;\n}\n\nconst CATALOG_BY_NAME = new Map(MCP_CATALOG.map((e) => [e.name, e]));\n\nconst LANGUAGE_LABELS: Record<LanguageCode, string> = {\n EN: \"English\",\n \"zh-CN\": \"简体中文\",\n de: \"Deutsch\",\n ru: \"Русский\",\n};\n\nexport function Wizard({\n onComplete,\n onCancel,\n existingApiKey,\n forceApiKeyStep = false,\n validateApiKey = validateDeepSeekApiKey,\n initial,\n}: WizardProps) {\n const { exit } = useApp();\n const [, setLanguageVersion] = useState(0);\n useEffect(() => onLanguageChange(() => setLanguageVersion((v) => v + 1)), []);\n\n const [previewTheme, setPreviewTheme] = useState<ThemeName>(() =>\n resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME),\n );\n\n const [step, setStep] = useState<Step>(\"language\");\n const [data, setData] = useState<WizardData>(() => ({\n language: getLanguage(),\n theme: resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME),\n apiKey: existingApiKey ?? \"\",\n selectedCatalog: deriveInitialCatalog(initial?.mcp ?? []),\n catalogArgs: {},\n }));\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape && step !== \"saved\" && onCancel) onCancel();\n });\n\n const content = (() => {\n if (step === \"language\") {\n return (\n <LanguageStep\n initialValue={data.language}\n onSubmit={(lang) => {\n setLanguage(lang);\n notifyLanguageChange();\n setData((d) => ({ ...d, language: lang }));\n setStep(\"theme\");\n }}\n />\n );\n }\n\n if (step === \"theme\") {\n return (\n <ThemeStep\n initialValue={data.theme}\n onPreview={setPreviewTheme}\n onSubmit={(theme) => {\n setData((d) => ({ ...d, theme }));\n setStep(existingApiKey && !forceApiKeyStep ? \"mcp\" : \"apiKey\");\n }}\n />\n );\n }\n\n if (step === \"apiKey\") {\n return (\n <ApiKeyStep\n initialValue={data.apiKey}\n validateApiKey={validateApiKey}\n onSubmit={(key) => {\n setData((d) => ({ ...d, apiKey: key }));\n setError(null);\n setStep(\"mcp\");\n }}\n error={error}\n onError={setError}\n />\n );\n }\n\n if (step === \"mcp\") {\n return (\n <StepFrame title={t(\"wizard.mcpTitle\")} step={1} total={2}>\n <MultiSelect\n items={mcpItems()}\n initialSelected={data.selectedCatalog}\n onSubmit={(selected) => {\n setData((d) => ({ ...d, selectedCatalog: selected }));\n const needsArgs = selected.some((name) => CATALOG_BY_NAME.get(name)?.userArgs);\n setStep(needsArgs ? \"mcpArgs\" : \"review\");\n }}\n footer={t(\"wizard.mcpFooterMulti\")}\n />\n </StepFrame>\n );\n }\n\n if (step === \"mcpArgs\") {\n const pending = data.selectedCatalog.filter((name) => {\n const entry = CATALOG_BY_NAME.get(name);\n return entry?.userArgs && !data.catalogArgs[name];\n });\n if (pending.length === 0) {\n setStep(\"review\");\n return null;\n }\n const currentName = pending[0]!;\n const entry = CATALOG_BY_NAME.get(currentName)!;\n return (\n <McpArgsStep\n entry={entry}\n error={error}\n onSubmit={(value) => {\n setData((d) => ({\n ...d,\n catalogArgs: { ...d.catalogArgs, [currentName]: value },\n }));\n setError(null);\n }}\n onError={setError}\n />\n );\n }\n\n if (step === \"review\") {\n const specs = data.selectedCatalog.map((name) => buildSpec(name, data.catalogArgs));\n return (\n <StepFrame title={t(\"wizard.reviewTitle\")} step={2} total={2}>\n <Box flexDirection=\"column\">\n <SummaryLine\n label={t(\"wizard.reviewLabelLanguage\")}\n value={LANGUAGE_LABELS[data.language]}\n />\n <SummaryLine label={t(\"wizard.reviewLabelApiKey\")} value={redactKey(data.apiKey)} />\n <SummaryLine label={t(\"wizard.reviewLabelTheme\")} value={data.theme} />\n <SummaryLine\n label={t(\"wizard.reviewLabelMcp\")}\n value={\n specs.length === 0\n ? t(\"wizard.reviewMcpNone\")\n : t(\"wizard.reviewMcpServers\", { count: specs.length })\n }\n />\n {specs.map((spec, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: review-only render, order fixed\n <Box key={i} paddingLeft={14}>\n <Text dim>· {spec}</Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text>{t(\"wizard.reviewSavesTo\", { path: defaultConfigPath() })}</Text>\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"ansi:red\">{error}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.reviewFooter\")}</Text>\n </Box>\n </Box>\n <ReviewConfirm\n onConfirm={() => {\n try {\n const specsNow = data.selectedCatalog.map((name) =>\n buildSpec(name, data.catalogArgs),\n );\n const prev = readConfig();\n const next: ReasonixConfig = {\n ...prev,\n apiKey: data.apiKey,\n theme: data.theme,\n mcp: specsNow,\n setupCompleted: true,\n };\n writeConfig(next);\n setStep(\"saved\");\n onComplete(next);\n } catch (e) {\n setError(t(\"wizard.reviewSaveError\", { message: (e as Error).message }));\n }\n }}\n />\n </StepFrame>\n );\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"ansi:green\" paddingX={1}>\n <Text bold color=\"ansi:green\">\n {t(\"wizard.savedTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text>{t(\"ui.welcome\")}</Text>\n </Box>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.savedShellHint\")}</Text>\n </Box>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.savedFooter\")}</Text>\n </Box>\n <ExitOnEnter onExit={exit} />\n </Box>\n );\n })();\n\n return <ThemeProvider name={previewTheme}>{content}</ThemeProvider>;\n}\n\nconst THEME_NAMES = listThemeNames();\n\nfunction ThemeStep({\n initialValue,\n onPreview,\n onSubmit,\n}: {\n initialValue: ThemeName;\n onPreview: (theme: ThemeName) => void;\n onSubmit: (theme: ThemeName) => void;\n}) {\n const initialIndex = Math.max(0, THEME_NAMES.indexOf(initialValue));\n const [index, setIndex] = useState(initialIndex);\n const theme = useTheme();\n\n useInput((_input, key) => {\n if (key.upArrow) {\n const next = (index - 1 + THEME_NAMES.length) % THEME_NAMES.length;\n setIndex(next);\n onPreview(THEME_NAMES[next]!);\n } else if (key.downArrow) {\n const next = (index + 1) % THEME_NAMES.length;\n setIndex(next);\n onPreview(THEME_NAMES[next]!);\n } else if (key.return) {\n onSubmit(THEME_NAMES[index]!);\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.tone.brand} paddingX={1}>\n <Text bold color={theme.tone.brand}>\n {t(\"wizard.themeTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.themeSubtitle\")}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {THEME_NAMES.map((name, i) => (\n <Box key={name}>\n <Text color={i === index ? theme.tone.brand : undefined}>\n {i === index ? \"▸ \" : \" \"}\n </Text>\n <Text bold={i === index} color={i === index ? theme.fg.strong : theme.fg.body}>\n {name}\n </Text>\n <Text color={theme.fg.meta}>{\" — \"}</Text>\n <Text color={theme.fg.meta}>{t(`wizard.themeCaption.${name}`)}</Text>\n </Box>\n ))}\n </Box>\n <Box\n marginTop={1}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.fg.faint}\n paddingX={1}\n >\n <Text color={theme.fg.meta}>{t(\"wizard.themeSampleHeading\")}</Text>\n <Box marginTop={1}>\n <Text color={theme.tone.accent}>{\"◆ \"}</Text>\n <Text color={theme.tone.accent}>{t(\"wizard.themeSampleReasoning\")}</Text>\n </Box>\n <Box>\n <Text color={theme.tone.info}>{\"▣ \"}</Text>\n <Text color={theme.fg.body}>{\"fs.readFile(\"}</Text>\n <Text color={theme.tone.ok}>{'\"main.ts\"'}</Text>\n <Text color={theme.fg.body}>{\")\"}</Text>\n </Box>\n <Box>\n <Text color={theme.fg.meta}>~/project/main.ts:42</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.tone.ok}>ok</Text>\n <Text color={theme.fg.faint}>{\" · \"}</Text>\n <Text color={theme.tone.warn}>warn</Text>\n <Text color={theme.fg.faint}>{\" · \"}</Text>\n <Text color={theme.tone.err}>err</Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.themeFooter\")}</Text>\n </Box>\n </Box>\n );\n}\n\n// ---------- step components ----------\n\nfunction LanguageStep({\n initialValue,\n onSubmit,\n}: {\n initialValue: LanguageCode;\n onSubmit: (lang: LanguageCode) => void;\n}) {\n const items: SelectItem<LanguageCode>[] = getSupportedLanguages().map((code) => ({\n value: code,\n label: LANGUAGE_LABELS[code],\n hint: code === detectSystemLanguage() ? \"(detected)\" : undefined,\n }));\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"ansi:cyan\" paddingX={1}>\n <Text bold color=\"ansi:cyan\">\n {t(\"wizard.languageTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.languageSubtitle\")}</Text>\n </Box>\n <Box marginTop={1}>\n <SingleSelect<LanguageCode>\n items={items}\n initialValue={initialValue}\n onSubmit={onSubmit}\n footer={t(\"wizard.selectFooter\")}\n />\n </Box>\n </Box>\n );\n}\n\nfunction ApiKeyStep({\n initialValue,\n validateApiKey,\n onSubmit,\n error,\n onError,\n}: {\n initialValue?: string;\n validateApiKey: (apiKey: string) => Promise<ApiKeyValidationResult>;\n onSubmit: (key: string) => void;\n error: string | null;\n onError: (e: string | null) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const [checking, setChecking] = useState(false);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"ansi:cyan\" paddingX={1}>\n <Text bold color=\"ansi:cyan\">\n {t(\"wizard.welcomeTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text>{t(\"wizard.apiKeyPrompt\")}</Text>\n </Box>\n <Text dim>{t(\"wizard.apiKeyGetOne\")}</Text>\n <Text dim>{t(\"wizard.apiKeySavedLocally\", { path: defaultConfigPath() })}</Text>\n {initialValue ? (\n <Text dim>{t(\"wizard.apiKeyPreview\", { redacted: redactKey(initialValue) })}</Text>\n ) : null}\n <Box marginTop={1}>\n <Text bold color=\"ansi:cyan\">\n {t(\"wizard.apiKeyInputLabel\")}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(raw) => {\n const trimmed = raw.trim() || initialValue?.trim() || \"\";\n if (!isPlausibleKey(trimmed)) {\n onError(t(\"wizard.apiKeyInvalid\"));\n setValue(\"\");\n return;\n }\n setChecking(true);\n onError(null);\n void validateApiKey(trimmed).then((result) => {\n setChecking(false);\n if (!result.ok) {\n onError(\n result.reason === \"rejected\"\n ? t(\"wizard.apiKeyRejected\")\n : t(\"wizard.apiKeyCheckFailed\", { message: result.message ?? \"unknown\" }),\n );\n setValue(\"\");\n return;\n }\n onSubmit(trimmed);\n });\n }}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {checking ? (\n <Box marginTop={1}>\n <Text color=\"ansi:yellow\">{t(\"wizard.apiKeyChecking\")}</Text>\n </Box>\n ) : error ? (\n <Box marginTop={1}>\n <Text color=\"ansi:red\">{error}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.apiKeyPreview\", { redacted: redactKey(value) })}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\n// Hit `/models` instead of DeepSeek's `/user/balance`: the OpenAI-compat\n// listing endpoint exists on every provider that pretends to be OpenAI\n// (DeepSeek, DashScope/Tongyi, Moonshot, Zhipu, …), and 401/403 there\n// still means \"key bad\" the same way.\nexport async function validateDeepSeekApiKey(\n apiKey: string,\n opts: {\n baseUrl?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n } = {},\n): Promise<ApiKeyValidationResult> {\n const fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n let baseUrl = opts.baseUrl ?? loadBaseUrl() ?? \"https://api.deepseek.com\";\n while (baseUrl.endsWith(\"/\")) baseUrl = baseUrl.slice(0, -1);\n\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 10_000);\n try {\n const resp = await fetchImpl(`${baseUrl}/models`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: ctrl.signal,\n });\n if (resp.ok) return { ok: true };\n if (resp.status === 401 || resp.status === 403) return { ok: false, reason: \"rejected\" };\n return { ok: false, reason: \"failed\", message: `HTTP ${resp.status}` };\n } catch (e) {\n return { ok: false, reason: \"failed\", message: (e as Error).message };\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction McpArgsStep({\n entry,\n error,\n onSubmit,\n onError,\n}: {\n entry: CatalogEntry;\n error: string | null;\n onSubmit: (value: string) => void;\n onError: (e: string | null) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const [pendingCreate, setPendingCreate] = useState<string | null>(null);\n\n useInput((input, key) => {\n if (!pendingCreate) return;\n const ch = input.toLowerCase();\n if (ch === \"y\" || key.return) {\n try {\n mkdirSync(pendingCreate, { recursive: true });\n const created = pendingCreate;\n setPendingCreate(null);\n setValue(\"\");\n onError(null);\n onSubmit(created);\n } catch (e) {\n onError(\n t(\"wizard.mcpArgsDirCreateFailed\", {\n path: pendingCreate,\n message: (e as Error).message,\n }),\n );\n setPendingCreate(null);\n }\n } else if (ch === \"n\" || key.escape) {\n setPendingCreate(null);\n onError(null);\n }\n });\n\n if (pendingCreate) {\n return (\n <StepFrame title={t(\"wizard.mcpArgsTitle\", { name: entry.name })} step={2} total={3}>\n <Box flexDirection=\"column\">\n <Text>{t(\"wizard.mcpArgsDirMissing\", { path: pendingCreate })}</Text>\n <Box marginTop={1}>\n <Text dim>{t(\"wizard.mcpArgsDirCreateHint\")}</Text>\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"ansi:red\">{error}</Text>\n </Box>\n ) : null}\n </Box>\n </StepFrame>\n );\n }\n\n return (\n <StepFrame title={t(\"wizard.mcpArgsTitle\", { name: entry.name })} step={2} total={3}>\n <Box flexDirection=\"column\">\n <Text>{entry.summary}</Text>\n {entry.note ? (\n <Box marginTop={1}>\n <Text dim>{entry.note}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text>{t(\"wizard.mcpArgsRequiredParam\")}</Text>\n <Text bold>{entry.userArgs}</Text>\n </Box>\n <Box marginTop={1}>\n <Text bold color=\"ansi:cyan\">\n {entry.userArgs}\n {\" › \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(raw) => {\n const trimmed = raw.trim();\n if (!trimmed) {\n onError(t(\"wizard.mcpArgsEmpty\", { name: entry.name }));\n return;\n }\n if (entry.name === \"filesystem\") {\n const check = checkFilesystemPath(trimmed);\n if (check.kind === \"missing\") {\n setPendingCreate(trimmed);\n return;\n }\n if (check.kind === \"not-a-dir\") {\n onError(t(\"wizard.mcpArgsNotADir\", { path: trimmed }));\n return;\n }\n }\n onSubmit(trimmed);\n setValue(\"\");\n }}\n placeholder={placeholderFor(entry)}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"ansi:red\">{error}</Text>\n </Box>\n ) : null}\n </Box>\n </StepFrame>\n );\n}\n\nfunction checkFilesystemPath(p: string): { kind: \"ok\" | \"missing\" | \"not-a-dir\" } {\n try {\n return { kind: statSync(p).isDirectory() ? \"ok\" : \"not-a-dir\" };\n } catch {\n return { kind: \"missing\" };\n }\n}\n\nfunction ReviewConfirm({ onConfirm }: { onConfirm: () => void }) {\n useInput((_i, key) => {\n if (key.return) onConfirm();\n });\n return null;\n}\n\nfunction ExitOnEnter({ onExit }: { onExit: () => void }) {\n useInput((_i, key) => {\n if (key.return) onExit();\n });\n return null;\n}\n\nfunction StepFrame({\n title,\n step,\n total,\n children,\n}: {\n title: string;\n step: number;\n total: number;\n children: React.ReactNode;\n}) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"ansi:cyan\" paddingX={1}>\n <Box>\n <Text dim>{t(\"wizard.stepCounter\", { step, total })}</Text>\n <Text bold color=\"ansi:cyan\">\n {title}\n </Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {children}\n </Box>\n </Box>\n );\n}\n\nfunction SummaryLine({ label, value }: { label: string; value: string }) {\n return (\n <Box>\n <Text>{label.padEnd(12)}</Text>\n <Text bold>{value}</Text>\n </Box>\n );\n}\n\nfunction mcpItems(): SelectItem<string>[] {\n return MCP_CATALOG.map((entry) => {\n const hintParts: string[] = [entry.summary];\n if (entry.userArgs) hintParts.push(t(\"wizard.mcpUserArgsHint\", { arg: entry.userArgs }));\n if (entry.note) hintParts.push(entry.note);\n return {\n value: entry.name,\n label: entry.name,\n hint: hintParts.join(\" · \"),\n };\n });\n}\n\nfunction placeholderFor(entry: CatalogEntry): string {\n if (entry.name === \"filesystem\") return \"e.g. /tmp/reasonix-sandbox\";\n if (entry.name === \"sqlite\") return \"e.g. ./notes.sqlite\";\n return entry.userArgs ?? \"\";\n}\n\nfunction deriveInitialCatalog(existingSpecs: string[]): string[] {\n const packageToName = new Map(MCP_CATALOG.map((e) => [e.package, e.name]));\n const out: string[] = [];\n for (const spec of existingSpecs) {\n for (const [pkg, name] of packageToName) {\n if (spec.includes(pkg)) {\n out.push(name);\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Build the `--mcp` spec string for a catalog entry. Same format\n * `mcpCommandFor` produces for `reasonix mcp list`, minus the leading\n * `--mcp \"...\"` wrapper — we store the inner spec directly.\n */\nexport function buildSpec(name: string, argsByName: Record<string, string>): string {\n const entry = CATALOG_BY_NAME.get(name);\n if (!entry) return name;\n const userArg = entry.userArgs ? argsByName[name] : undefined;\n const tail = userArg ? ` ${quoteIfNeeded(userArg)}` : \"\";\n return `${entry.name}=npx -y ${entry.package}${tail}`;\n}\n\nfunction quoteIfNeeded(s: string): string {\n // Escape backslashes BEFORE quotes — otherwise a trailing `\\` in the\n // input would consume the closing quote when a downstream parser\n // un-escapes the output (CodeQL js/incomplete-sanitization).\n return /\\s|\"/.test(s) ? `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"` : s;\n}\n"],"mappings":"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","names":["import_react","React","entry","React"]}
@@ -3,14 +3,14 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  renderDashboard,
5
5
  statsCommand
6
- } from "./chunk-Z663GVUB.js";
7
- import "./chunk-ARBGTNHM.js";
8
- import "./chunk-6QBUXA73.js";
9
- import "./chunk-CLHMV6OL.js";
10
- import "./chunk-AOYUW3HR.js";
6
+ } from "./chunk-APOSDBAU.js";
7
+ import "./chunk-FK7NXDRP.js";
8
+ import "./chunk-V4AXMN4X.js";
9
+ import "./chunk-U7G72DHQ.js";
10
+ import "./chunk-GCNBIWK7.js";
11
11
  import "./chunk-TUK7OWJA.js";
12
12
  export {
13
13
  renderDashboard,
14
14
  statsCommand
15
15
  };
16
- //# sourceMappingURL=stats-OFCGOQMZ.js.map
16
+ //# sourceMappingURL=stats-GKG5JZQX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,26 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
- import "./chunk-HNZ4727T.js";
4
- import "./chunk-MW64SQUE.js";
5
- import "./chunk-D6WRFR6V.js";
6
- import "./chunk-RCC73DWQ.js";
7
- import "./chunk-5YLEKX2V.js";
8
- import "./chunk-2W4F3RIZ.js";
9
- import "./chunk-DLTE4GBY.js";
3
+ import "./chunk-DFHI2MRB.js";
4
+ import "./chunk-4SBXAHR6.js";
5
+ import "./chunk-J26XOB2T.js";
6
+ import "./chunk-R7JMQMLD.js";
7
+ import "./chunk-4V4TKQMB.js";
8
+ import "./chunk-FK7NXDRP.js";
9
+ import "./chunk-V4AXMN4X.js";
10
+ import "./chunk-XHP6NYOT.js";
11
+ import "./chunk-J4MYMBJ7.js";
10
12
  import "./chunk-BOWSNGQC.js";
11
- import "./chunk-CPCUMMSR.js";
13
+ import "./chunk-QSKDP3OS.js";
14
+ import "./chunk-25T6CVUP.js";
15
+ import "./chunk-NVI4XPOQ.js";
12
16
  import "./chunk-6UNHNVJR.js";
13
- import "./chunk-AMSK3ZLB.js";
17
+ import "./chunk-P5SUHDUQ.js";
14
18
  import {
15
19
  VERSION
16
20
  } from "./chunk-XXC2BYTV.js";
17
- import "./chunk-GFJJEW3Z.js";
18
- import "./chunk-25T6CVUP.js";
19
21
  import "./chunk-2UQP6H6T.js";
20
- import "./chunk-ARBGTNHM.js";
21
- import "./chunk-6QBUXA73.js";
22
- import "./chunk-CLHMV6OL.js";
23
- import "./chunk-AOYUW3HR.js";
22
+ import "./chunk-U7G72DHQ.js";
23
+ import "./chunk-GCNBIWK7.js";
24
24
  import "./chunk-TUK7OWJA.js";
25
25
 
26
26
  // src/cli/commands/version.ts
@@ -30,4 +30,4 @@ function versionCommand() {
30
30
  export {
31
31
  versionCommand
32
32
  };
33
- //# sourceMappingURL=version-EODUFAAI.js.map
33
+ //# sourceMappingURL=version-JD6QSM4X.js.map
package/dist/index.d.ts CHANGED
@@ -178,8 +178,8 @@ interface ReasonixConfig {
178
178
  session?: string | null;
179
179
  setupCompleted?: boolean;
180
180
  search?: boolean;
181
- /** Web search engine backend: "bing" (default, scrapes cn.bing.com), "searxng" (self-hosted SearXNG), "metaso" (Metaso API), "tavily" (LLM-friendly API, free tier), "perplexity" (Perplexity AI), or "exa" (Exa API). */
182
- webSearchEngine?: "bing" | "searxng" | "metaso" | "tavily" | "perplexity" | "exa";
181
+ /** Web search engine backend: "bing" (default, scrapes cn.bing.com), "searxng" (self-hosted SearXNG), "metaso" (Metaso API), "tavily" (LLM-friendly API, free tier), "perplexity" (Perplexity AI), "exa" (Exa API), "brave" (Brave Search API), or "ollama" (Ollama cloud web search). */
182
+ webSearchEngine?: "bing" | "searxng" | "metaso" | "tavily" | "perplexity" | "exa" | "brave" | "ollama";
183
183
  /** Base URL for SearXNG instance (default http://localhost:8080). */
184
184
  webSearchEndpoint?: string;
185
185
  /** Metaso API key. Falls back to METASO_API_KEY env var. */
@@ -190,6 +190,10 @@ interface ReasonixConfig {
190
190
  perplexityApiKey?: string;
191
191
  /** Exa API key. Falls back to EXA_API_KEY env var. Free 1000/mo signup at https://exa.ai */
192
192
  exaApiKey?: string;
193
+ /** Ollama cloud API key. Falls back to OLLAMA_API_KEY env var. Used for Ollama web_search/web_fetch. */
194
+ ollamaApiKey?: string;
195
+ /** Brave Search API key. Falls back to BRAVE_SEARCH_API_KEY env var. Free 2000/mo signup at https://brave.com/search/api/ */
196
+ braveApiKey?: string;
193
197
  /** TUI mouse-wheel scrolling via SGR mouse tracking. Default true. Set false to fall back to native terminal drag-select for copy (then wheel is terminal-dependent — most terminals translate wheel→arrow in alt-screen, some don't). */
194
198
  mouseTracking?: boolean;
195
199
  /** Rows scrolled per single SGR mouse-wheel report. Default 1 — most terminals emit 2-5 reports per physical notch, so 1 already produces 2-5 rows per notch (#1419). Bump to 3-5 only if your terminal emits one report per notch and scrolling feels slow (#1494). Clamped to [1, 10]. */
@@ -282,6 +286,10 @@ declare function loadMetasoApiKey(path?: string): string | undefined;
282
286
  declare function loadPerplexityApiKey(path?: string): string | undefined;
283
287
  /** Exa API key — env > config > undefined. Free 1000/mo signup at https://exa.ai */
284
288
  declare function loadExaApiKey(path?: string): string | undefined;
289
+ /** Ollama cloud API key — env > config > undefined. */
290
+ declare function loadOllamaApiKey(path?: string): string | undefined;
291
+ /** Brave Search API key — env > config > undefined. Free 2000/mo signup at https://brave.com/search/api/ */
292
+ declare function loadBraveApiKey(path?: string): string | undefined;
285
293
  declare function defaultConfigPath(): string;
286
294
  declare function readConfig(path?: string): ReasonixConfig;
287
295
  declare function writeConfig(cfg: ReasonixConfig, path?: string): void;
@@ -908,6 +916,14 @@ interface LoopEvent {
908
916
  stats?: TurnStats;
909
917
  repair?: RepairReport;
910
918
  error?: string;
919
+ errorDetail?: {
920
+ name: string;
921
+ message: string;
922
+ code?: string;
923
+ phase?: string;
924
+ retryable: boolean;
925
+ recoverable: boolean;
926
+ };
911
927
  /** Display-only — code-mode applier MUST skip SEARCH/REPLACE in forced-summary text. */
912
928
  forcedSummary?: boolean;
913
929
  }
@@ -1828,13 +1844,17 @@ interface WebFetchOptions {
1828
1844
  maxChars?: number;
1829
1845
  /** Timeout in ms. Defaults to 15_000. */
1830
1846
  timeoutMs?: number;
1847
+ /** Config path for provider-specific keys. Defaults to ~/.reasonix/config.json. */
1848
+ configPath?: string;
1831
1849
  signal?: AbortSignal;
1832
1850
  }
1833
1851
  interface WebSearchOptions {
1834
1852
  topK?: number;
1835
1853
  signal?: AbortSignal;
1836
- /** Backend engine: "bing" (scrapes cn.bing.com HTML default, works from CN without proxy), "searxng" (self-hosted SearXNG), "metaso" (Metaso API), "tavily" (LLM-friendly JSON API), "perplexity" (Perplexity AI), or "exa" (Exa API). */
1837
- engine?: "bing" | "searxng" | "metaso" | "tavily" | "perplexity" | "exa";
1854
+ /** Config path for provider-specific keys. Defaults to ~/.reasonix/config.json. */
1855
+ configPath?: string;
1856
+ /** Backend engine: "bing" (scrapes cn.bing.com HTML — default, works from CN without proxy), "searxng" (self-hosted SearXNG), "metaso" (Metaso API), "tavily" (LLM-friendly JSON API), "perplexity" (Perplexity AI), "exa" (Exa API), "brave" (Brave Search API), or "ollama" (Ollama cloud web search). */
1857
+ engine?: "bing" | "searxng" | "metaso" | "tavily" | "perplexity" | "exa" | "brave" | "ollama";
1838
1858
  /** Base URL for SearXNG. Default http://localhost:8080. */
1839
1859
  endpoint?: string;
1840
1860
  }
@@ -1851,6 +1871,8 @@ interface WebToolsOptions {
1851
1871
  defaultTopK?: number;
1852
1872
  /** Byte cap for `web_fetch` extracted text. */
1853
1873
  maxFetchChars?: number;
1874
+ /** Config path to read at tool-call time. Defaults to ~/.reasonix/config.json. */
1875
+ configPath?: string;
1854
1876
  }
1855
1877
  declare function registerWebTools(registry: ToolRegistry, opts?: WebToolsOptions): ToolRegistry;
1856
1878
  declare function formatSearchResults(query: string, results: SearchResult[]): string;
@@ -1928,6 +1950,15 @@ interface TranscriptRecord {
1928
1950
  prefixHash?: string;
1929
1951
  /** Optional error message (role === "error"). */
1930
1952
  error?: string;
1953
+ /** Structured error detail (role === "error"). */
1954
+ errorDetail?: {
1955
+ name: string;
1956
+ message: string;
1957
+ code?: string;
1958
+ phase?: string;
1959
+ retryable: boolean;
1960
+ recoverable: boolean;
1961
+ };
1931
1962
  }
1932
1963
  interface TranscriptMeta {
1933
1964
  version: 1;
@@ -2668,4 +2699,4 @@ declare function aggregateUsage(records: UsageRecord[], opts?: AggregateOptions)
2668
2699
  /** File-size helper for the stats header — "1.2 MB" etc. Returns "" if missing. */
2669
2700
  declare function formatLogSize(path?: string): string;
2670
2701
 
2671
- export { AT_MENTION_PATTERN, AT_PICKER_PREFIX, type AggregateOptions, AppendOnlyLog, type AppendUsageInput, type ApplyResult, type ApplyStatus, type AtMentionExpansion, type AtMentionOptions, type BridgeOptions, type BridgeResult, CODE_SYSTEM_PROMPT, CacheFirstLoop, type CacheFirstLoopOptions, type CallToolResult, type ChatMessage, type ChatResponse, type ChoiceOption, ChoiceRequestedError, type ChoiceToolOptions, type CodeSystemPromptOptions, DEFAULT_AT_DIR_MAX_ENTRIES, DEFAULT_AT_MENTION_MAX_BYTES, DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RESULT_TOKENS, DEFAULT_PICKER_IGNORE_DIRS, DEFAULT_SPAWN_STORM_THRESHOLD, DeepSeekClient, type DeepSeekClientOptions, type RenderOptions as DiffRenderOptions, type DiffReport, type DiffSide, type DirEntry, type EditBlock, type EditSnapshot, type EventRole, type FileWithStats, type FilesystemToolsOptions, type FlattenDecision, type FlattenOptions, type GetLatestVersionOptions, type GetPromptResult, HOOK_EVENTS, HOOK_SETTINGS_DIRNAME, HOOK_SETTINGS_FILENAME, type HookConfig, type HookEvent, type HookOutcome, type HookPayload, type HookReport, type HookScope, type HookSettings, type HookSpawnInput, type HookSpawnResult, type HookSpawner, ImmutablePrefix, type ImmutablePrefixOptions, type InitializeResult, type InspectionReport, type InstallSource, type JSONSchema, type JsonRpcMessage, type JsonRpcRequest, type JsonRpcResponse, LATEST_CACHE_TTL_MS, LATEST_FETCH_TIMEOUT_MS, type ListDirectoryOptions, type ListFilesOptions, type ListPromptsResult, type ListResourcesResult, type ListToolsResult, type LoadHookSettingsOptions, type LoopAbortOptions, type LoopEvent, MCP_PROTOCOL_VERSION, MEMORY_INDEX_FILE, MEMORY_INDEX_MAX_CHARS, McpClient, type McpClientOptions, type McpContentBlock, type McpProgressHandler, type McpProgressInfo, type McpPrompt, type McpPromptArgument, type McpPromptMessage, type McpPromptResourceBlock, type McpResource, type McpResourceContents, type McpResourceContentsBlob, type McpResourceContentsText, type McpSpec, type McpTool, type McpToolSchema, type McpTransport, type MemoryEntry, type MemoryScope, MemoryStore, type MemoryStoreOptions, type MemoryToolsOptions, type MemoryType, type WriteInput as MemoryWriteInput, NeedsConfirmationError, PROJECT_MEMORY_FILE, PROJECT_MEMORY_FILES, PROJECT_MEMORY_MAX_CHARS, type PageContent, type ParsedAtQuery, type PickerCandidate, PlanProposedError, PlanRevisionProposedError, type PlanStep, type PlanStepRisk, type PlanToolOptions, type ProgressNotificationParams, type ProjectMemory, type RankPickerOptions, type ReadResourceResult, type ReadTranscriptResult, type ReasonixConfig, type ReconfigurableOptions, type RepairReport, type ReplayStats, type ResolvedHook, type RetryInfo, type RetryOptions, type Role, type RunCommandResult, type RunHooksOptions, type ScavengeOptions, type ScavengeResult, type SearchResult, type SectionResult, type SessionInfo, SessionStats, type SessionSummary, type ShellToolsOptions, type SpawnDistillation, type SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentResult, type SubagentResultLike, type SubagentSessionSummary, type SubagentSink, SubagentTelemetry, type SubagentToolOptions, type TodoItem, type TodoStatus, type TodoToolOptions, type ToolCall, type ToolCallContext, ToolCallRepair, type ToolCallRepairOptions, type ToolDefinition, type ToolFunctionSpec, ToolRegistry, type ToolSpec, type TranscriptMeta, type TranscriptRecord, type TruncationRepairResult, type TurnPair, type TurnStats, USER_MEMORY_DIR, Usage, type UsageAggregate, type UsageBucket, type UsageRecord, VERSION, VolatileScratch, type WebFetchOptions, type WebSearchOptions, type WebToolsOptions, aggregateUsage, analyzeSchema, appendSessionMessage, appendUsage, applyEditBlock, applyEditBlocks, applyMemoryStack, applyProjectMemory, applyUserMemory, bridgeMcpTools, bucketCacheHitRatio, bucketSavingsFraction, claudeEquivalentCost, codeSystemPrompt, compareVersions, computeReplayStats, computeSpawnDistillation, costUsd, countSpawnStorms, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectInstallSource, detectNpmInstallPrefix, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, findProjectMemoryPath, fixToolCallPairing, flattenMcpResult, flattenSchema, forkRegistryExcluding, formatCommandResult, formatHookOutcomeMessage, formatLogSize, formatLoopError, formatSearchResults, getLatestVersion, globalSettingsPath, healLoadedMessages, healLoadedMessagesByTokens, htmlToText, injectPowerShellUtf8, inputCostUsd, inspectMcpServer, isAllowed, isJsonRpcError, isNpxInstall, isPlausibleKey, listDirectory, listFilesSync, listFilesWithStatsAsync, listFilesWithStatsSync, listSessions, loadApiKey, loadBaseUrl, loadDotenv, loadExaApiKey, loadHooks, loadMetasoApiKey, loadPerplexityApiKey, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseBingResults, parseEditBlocks, parseMcpSpec, parseSearxngHtmlResults, parseTranscript, prepareSpawn, projectHash, projectSettingsPath, quoteForCmdExe, rankPickerCandidates, readConfig, readProjectMemory, readTranscript, readUsageLog, recordFromLoopEvent, redactKey, registerChoiceTool, registerFilesystemTools, registerMemoryTools, registerPlanTool, registerShellTools, registerSubagentTool, registerTodoTool, registerWebTools, renderMarkdown as renderDiffMarkdown, renderSummaryTable as renderDiffSummary, repairTruncatedJson, replayFromFile, resolveExecutable, resolveProjectMemoryWritePath, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, saveBaseUrl, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, summarizeSubagentSession, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };
2702
+ export { AT_MENTION_PATTERN, AT_PICKER_PREFIX, type AggregateOptions, AppendOnlyLog, type AppendUsageInput, type ApplyResult, type ApplyStatus, type AtMentionExpansion, type AtMentionOptions, type BridgeOptions, type BridgeResult, CODE_SYSTEM_PROMPT, CacheFirstLoop, type CacheFirstLoopOptions, type CallToolResult, type ChatMessage, type ChatResponse, type ChoiceOption, ChoiceRequestedError, type ChoiceToolOptions, type CodeSystemPromptOptions, DEFAULT_AT_DIR_MAX_ENTRIES, DEFAULT_AT_MENTION_MAX_BYTES, DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RESULT_TOKENS, DEFAULT_PICKER_IGNORE_DIRS, DEFAULT_SPAWN_STORM_THRESHOLD, DeepSeekClient, type DeepSeekClientOptions, type RenderOptions as DiffRenderOptions, type DiffReport, type DiffSide, type DirEntry, type EditBlock, type EditSnapshot, type EventRole, type FileWithStats, type FilesystemToolsOptions, type FlattenDecision, type FlattenOptions, type GetLatestVersionOptions, type GetPromptResult, HOOK_EVENTS, HOOK_SETTINGS_DIRNAME, HOOK_SETTINGS_FILENAME, type HookConfig, type HookEvent, type HookOutcome, type HookPayload, type HookReport, type HookScope, type HookSettings, type HookSpawnInput, type HookSpawnResult, type HookSpawner, ImmutablePrefix, type ImmutablePrefixOptions, type InitializeResult, type InspectionReport, type InstallSource, type JSONSchema, type JsonRpcMessage, type JsonRpcRequest, type JsonRpcResponse, LATEST_CACHE_TTL_MS, LATEST_FETCH_TIMEOUT_MS, type ListDirectoryOptions, type ListFilesOptions, type ListPromptsResult, type ListResourcesResult, type ListToolsResult, type LoadHookSettingsOptions, type LoopAbortOptions, type LoopEvent, MCP_PROTOCOL_VERSION, MEMORY_INDEX_FILE, MEMORY_INDEX_MAX_CHARS, McpClient, type McpClientOptions, type McpContentBlock, type McpProgressHandler, type McpProgressInfo, type McpPrompt, type McpPromptArgument, type McpPromptMessage, type McpPromptResourceBlock, type McpResource, type McpResourceContents, type McpResourceContentsBlob, type McpResourceContentsText, type McpSpec, type McpTool, type McpToolSchema, type McpTransport, type MemoryEntry, type MemoryScope, MemoryStore, type MemoryStoreOptions, type MemoryToolsOptions, type MemoryType, type WriteInput as MemoryWriteInput, NeedsConfirmationError, PROJECT_MEMORY_FILE, PROJECT_MEMORY_FILES, PROJECT_MEMORY_MAX_CHARS, type PageContent, type ParsedAtQuery, type PickerCandidate, PlanProposedError, PlanRevisionProposedError, type PlanStep, type PlanStepRisk, type PlanToolOptions, type ProgressNotificationParams, type ProjectMemory, type RankPickerOptions, type ReadResourceResult, type ReadTranscriptResult, type ReasonixConfig, type ReconfigurableOptions, type RepairReport, type ReplayStats, type ResolvedHook, type RetryInfo, type RetryOptions, type Role, type RunCommandResult, type RunHooksOptions, type ScavengeOptions, type ScavengeResult, type SearchResult, type SectionResult, type SessionInfo, SessionStats, type SessionSummary, type ShellToolsOptions, type SpawnDistillation, type SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentResult, type SubagentResultLike, type SubagentSessionSummary, type SubagentSink, SubagentTelemetry, type SubagentToolOptions, type TodoItem, type TodoStatus, type TodoToolOptions, type ToolCall, type ToolCallContext, ToolCallRepair, type ToolCallRepairOptions, type ToolDefinition, type ToolFunctionSpec, ToolRegistry, type ToolSpec, type TranscriptMeta, type TranscriptRecord, type TruncationRepairResult, type TurnPair, type TurnStats, USER_MEMORY_DIR, Usage, type UsageAggregate, type UsageBucket, type UsageRecord, VERSION, VolatileScratch, type WebFetchOptions, type WebSearchOptions, type WebToolsOptions, aggregateUsage, analyzeSchema, appendSessionMessage, appendUsage, applyEditBlock, applyEditBlocks, applyMemoryStack, applyProjectMemory, applyUserMemory, bridgeMcpTools, bucketCacheHitRatio, bucketSavingsFraction, claudeEquivalentCost, codeSystemPrompt, compareVersions, computeReplayStats, computeSpawnDistillation, costUsd, countSpawnStorms, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectInstallSource, detectNpmInstallPrefix, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, findProjectMemoryPath, fixToolCallPairing, flattenMcpResult, flattenSchema, forkRegistryExcluding, formatCommandResult, formatHookOutcomeMessage, formatLogSize, formatLoopError, formatSearchResults, getLatestVersion, globalSettingsPath, healLoadedMessages, healLoadedMessagesByTokens, htmlToText, injectPowerShellUtf8, inputCostUsd, inspectMcpServer, isAllowed, isJsonRpcError, isNpxInstall, isPlausibleKey, listDirectory, listFilesSync, listFilesWithStatsAsync, listFilesWithStatsSync, listSessions, loadApiKey, loadBaseUrl, loadBraveApiKey, loadDotenv, loadExaApiKey, loadHooks, loadMetasoApiKey, loadOllamaApiKey, loadPerplexityApiKey, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseBingResults, parseEditBlocks, parseMcpSpec, parseSearxngHtmlResults, parseTranscript, prepareSpawn, projectHash, projectSettingsPath, quoteForCmdExe, rankPickerCandidates, readConfig, readProjectMemory, readTranscript, readUsageLog, recordFromLoopEvent, redactKey, registerChoiceTool, registerFilesystemTools, registerMemoryTools, registerPlanTool, registerShellTools, registerSubagentTool, registerTodoTool, registerWebTools, renderMarkdown as renderDiffMarkdown, renderSummaryTable as renderDiffSummary, repairTruncatedJson, replayFromFile, resolveExecutable, resolveProjectMemoryWritePath, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, saveBaseUrl, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, summarizeSubagentSession, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };