reasonix 0.35.0 → 0.36.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 (80) hide show
  1. package/dashboard/dist/app.js +42 -3
  2. package/dashboard/dist/app.js.map +1 -1
  3. package/dist/cli/{chat-AB5D7I3V.js → chat-RGMYAOY2.js} +16 -15
  4. package/dist/cli/{chunk-RJ5GUVS2.js → chunk-2MCYGFLK.js} +10 -10
  5. package/dist/cli/chunk-2MCYGFLK.js.map +1 -0
  6. package/dist/cli/{chunk-SW3CCXEV.js → chunk-4Q3GRJIU.js} +2 -2
  7. package/dist/cli/{chunk-5JXXEPDM.js → chunk-BHLHOS5Y.js} +8 -2
  8. package/dist/cli/chunk-BHLHOS5Y.js.map +1 -0
  9. package/dist/cli/{chunk-IDP65VCC.js → chunk-BJ376EN3.js} +9 -8
  10. package/dist/cli/chunk-BJ376EN3.js.map +1 -0
  11. package/dist/cli/{chunk-2AWTGJ2C.js → chunk-CRPQUBP6.js} +26 -9
  12. package/dist/cli/{chunk-2AWTGJ2C.js.map → chunk-CRPQUBP6.js.map} +1 -1
  13. package/dist/cli/{chunk-GPHBJWCV.js → chunk-EN4LAZW5.js} +297 -171
  14. package/dist/cli/chunk-EN4LAZW5.js.map +1 -0
  15. package/dist/cli/{chunk-JJTOZPM3.js → chunk-IPCPEZWQ.js} +2 -2
  16. package/dist/cli/{chunk-SN7YH6FC.js → chunk-MLXUGPJE.js} +168 -35
  17. package/dist/cli/chunk-MLXUGPJE.js.map +1 -0
  18. package/dist/cli/{chunk-SX6L4HZZ.js → chunk-QPNZWUZF.js} +53 -6
  19. package/dist/cli/chunk-QPNZWUZF.js.map +1 -0
  20. package/dist/cli/{chunk-N2IC4XDL.js → chunk-QRUQ2BFT.js} +13 -8
  21. package/dist/cli/{chunk-N2IC4XDL.js.map → chunk-QRUQ2BFT.js.map} +1 -1
  22. package/dist/cli/{chunk-KZHMKOJH.js → chunk-T52GAWPP.js} +25 -3
  23. package/dist/cli/chunk-T52GAWPP.js.map +1 -0
  24. package/dist/cli/{chunk-I6YIAK6C.js → chunk-UNMYFZPZ.js} +2 -2
  25. package/dist/cli/{update-4TJWRUIN.js → chunk-WJ3YX4PZ.js} +51 -12
  26. package/dist/cli/chunk-WJ3YX4PZ.js.map +1 -0
  27. package/dist/cli/{chunk-RXGEGA7K.js → chunk-XQIFIB3U.js} +18 -7
  28. package/dist/cli/{chunk-RXGEGA7K.js.map → chunk-XQIFIB3U.js.map} +1 -1
  29. package/dist/cli/{chunk-2EBODRRO.js → chunk-ZJR4QLXB.js} +5 -1
  30. package/dist/cli/{chunk-2EBODRRO.js.map → chunk-ZJR4QLXB.js.map} +1 -1
  31. package/dist/cli/{code-XBEFHXVM.js → code-KJB3WDU6.js} +19 -17
  32. package/dist/cli/code-KJB3WDU6.js.map +1 -0
  33. package/dist/cli/{commands-MEZPSEHV.js → commands-FE2UDFBC.js} +3 -3
  34. package/dist/cli/{commit-CE4EFTUQ.js → commit-3IAGB22T.js} +5 -4
  35. package/dist/cli/commit-3IAGB22T.js.map +1 -0
  36. package/dist/cli/{doctor-A565GMWD.js → doctor-DKD34EFD.js} +7 -7
  37. package/dist/cli/index.js +33 -31
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/{mcp-LDFK5QJI.js → mcp-2RDEQST6.js} +2 -2
  40. package/dist/cli/{mcp-browse-FYHEITCM.js → mcp-browse-VM5GLRBQ.js} +2 -2
  41. package/dist/cli/{mcp-inspect-T2HBR22P.js → mcp-inspect-CWSVCZUQ.js} +3 -3
  42. package/dist/cli/{replay-P2WC5N5X.js → replay-D7RT2DR7.js} +2 -2
  43. package/dist/cli/{run-QBWJETS3.js → run-FK5UBIIM.js} +11 -10
  44. package/dist/cli/run-FK5UBIIM.js.map +1 -0
  45. package/dist/cli/{server-SMLVXIW4.js → server-W4XJK4GX.js} +16 -16
  46. package/dist/cli/{server-SMLVXIW4.js.map → server-W4XJK4GX.js.map} +1 -1
  47. package/dist/cli/{sessions-55RIZVWG.js → sessions-YZXWMIWW.js} +8 -8
  48. package/dist/cli/{setup-QXMONZ4P.js → setup-IIAJXHP4.js} +196 -130
  49. package/dist/cli/setup-IIAJXHP4.js.map +1 -0
  50. package/dist/cli/update-GUCWB4UN.js +13 -0
  51. package/dist/cli/update-GUCWB4UN.js.map +1 -0
  52. package/dist/cli/{version-Q2HA3AAC.js → version-DWD6RLIU.js} +10 -10
  53. package/dist/index.d.ts +14 -2
  54. package/dist/index.js +270 -47
  55. package/dist/index.js.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/cli/chunk-5JXXEPDM.js.map +0 -1
  58. package/dist/cli/chunk-GPHBJWCV.js.map +0 -1
  59. package/dist/cli/chunk-IDP65VCC.js.map +0 -1
  60. package/dist/cli/chunk-KZHMKOJH.js.map +0 -1
  61. package/dist/cli/chunk-RJ5GUVS2.js.map +0 -1
  62. package/dist/cli/chunk-SN7YH6FC.js.map +0 -1
  63. package/dist/cli/chunk-SX6L4HZZ.js.map +0 -1
  64. package/dist/cli/code-XBEFHXVM.js.map +0 -1
  65. package/dist/cli/commit-CE4EFTUQ.js.map +0 -1
  66. package/dist/cli/run-QBWJETS3.js.map +0 -1
  67. package/dist/cli/setup-QXMONZ4P.js.map +0 -1
  68. package/dist/cli/update-4TJWRUIN.js.map +0 -1
  69. /package/dist/cli/{chat-AB5D7I3V.js.map → chat-RGMYAOY2.js.map} +0 -0
  70. /package/dist/cli/{chunk-SW3CCXEV.js.map → chunk-4Q3GRJIU.js.map} +0 -0
  71. /package/dist/cli/{chunk-JJTOZPM3.js.map → chunk-IPCPEZWQ.js.map} +0 -0
  72. /package/dist/cli/{chunk-I6YIAK6C.js.map → chunk-UNMYFZPZ.js.map} +0 -0
  73. /package/dist/cli/{commands-MEZPSEHV.js.map → commands-FE2UDFBC.js.map} +0 -0
  74. /package/dist/cli/{doctor-A565GMWD.js.map → doctor-DKD34EFD.js.map} +0 -0
  75. /package/dist/cli/{mcp-LDFK5QJI.js.map → mcp-2RDEQST6.js.map} +0 -0
  76. /package/dist/cli/{mcp-browse-FYHEITCM.js.map → mcp-browse-VM5GLRBQ.js.map} +0 -0
  77. /package/dist/cli/{mcp-inspect-T2HBR22P.js.map → mcp-inspect-CWSVCZUQ.js.map} +0 -0
  78. /package/dist/cli/{replay-P2WC5N5X.js.map → replay-D7RT2DR7.js.map} +0 -0
  79. /package/dist/cli/{sessions-55RIZVWG.js.map → sessions-YZXWMIWW.js.map} +0 -0
  80. /package/dist/cli/{version-Q2HA3AAC.js.map → version-DWD6RLIU.js.map} +0 -0
@@ -1,27 +1,27 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-N2IC4XDL.js";
3
- import "./chunk-I6YIAK6C.js";
2
+ import "./chunk-QRUQ2BFT.js";
3
+ import "./chunk-UNMYFZPZ.js";
4
4
  import "./chunk-XJLZ4HKU.js";
5
5
  import "./chunk-XHQIK7B6.js";
6
6
  import "./chunk-ZU45XW3P.js";
7
7
  import "./chunk-DAEAAVDF.js";
8
8
  import "./chunk-KMWKGPFZ.js";
9
9
  import "./chunk-3Q3C4W66.js";
10
- import "./chunk-SX6L4HZZ.js";
10
+ import "./chunk-QPNZWUZF.js";
11
11
  import "./chunk-KJQIA4US.js";
12
- import "./chunk-JJTOZPM3.js";
13
- import "./chunk-2AWTGJ2C.js";
12
+ import "./chunk-IPCPEZWQ.js";
14
13
  import "./chunk-5X7LZJDE.js";
15
14
  import {
16
15
  listSessions,
17
16
  loadSessionMessages,
18
17
  sessionPath
19
18
  } from "./chunk-DFP4YSVM.js";
20
- import "./chunk-SN7YH6FC.js";
21
- import "./chunk-5JXXEPDM.js";
19
+ import "./chunk-MLXUGPJE.js";
20
+ import "./chunk-BHLHOS5Y.js";
22
21
  import "./chunk-WUI3P4RA.js";
23
22
  import "./chunk-ZTLZO42A.js";
24
23
  import "./chunk-ORM6PK57.js";
24
+ import "./chunk-CRPQUBP6.js";
25
25
 
26
26
  // src/cli/commands/sessions.ts
27
27
  function sessionsCommand(opts) {
@@ -101,4 +101,4 @@ function truncate(s, max) {
101
101
  export {
102
102
  sessionsCommand
103
103
  };
104
- //# sourceMappingURL=sessions-55RIZVWG.js.map
104
+ //# sourceMappingURL=sessions-YZXWMIWW.js.map
@@ -2,8 +2,11 @@
2
2
  import {
3
3
  MultiSelect,
4
4
  SingleSelect
5
- } from "./chunk-KZHMKOJH.js";
6
- import "./chunk-2EBODRRO.js";
5
+ } from "./chunk-T52GAWPP.js";
6
+ import {
7
+ ThemeProvider,
8
+ useTheme
9
+ } from "./chunk-ZJR4QLXB.js";
7
10
  import {
8
11
  PRESET_DESCRIPTIONS
9
12
  } from "./chunk-MHDNZXJJ.js";
@@ -21,16 +24,20 @@ import {
21
24
  onLanguageChange,
22
25
  setLanguage,
23
26
  t
24
- } from "./chunk-SN7YH6FC.js";
27
+ } from "./chunk-MLXUGPJE.js";
25
28
  import {
26
29
  defaultConfigPath,
27
30
  isPlausibleKey,
28
31
  loadApiKey,
32
+ loadTheme,
29
33
  readConfig,
30
34
  redactKey,
35
+ resolveThemePreference,
31
36
  writeConfig
32
- } from "./chunk-5JXXEPDM.js";
33
- import "./chunk-WUI3P4RA.js";
37
+ } from "./chunk-BHLHOS5Y.js";
38
+ import {
39
+ listThemeNames
40
+ } from "./chunk-WUI3P4RA.js";
34
41
 
35
42
  // src/cli/commands/setup.tsx
36
43
  import { render } from "ink";
@@ -50,145 +57,204 @@ function Wizard({ onComplete, onCancel, existingApiKey, initial }) {
50
57
  const { exit } = useApp();
51
58
  const [, setLanguageVersion] = useState(0);
52
59
  useEffect(() => onLanguageChange(() => setLanguageVersion((v) => v + 1)), []);
60
+ const [previewTheme, setPreviewTheme] = useState(
61
+ () => resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME)
62
+ );
53
63
  const [step, setStep] = useState("language");
54
- const [data, setData] = useState({
64
+ const [data, setData] = useState(() => ({
55
65
  language: getLanguage(),
66
+ theme: resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME),
56
67
  apiKey: existingApiKey ?? "",
57
68
  preset: initial?.preset ?? "auto",
58
69
  selectedCatalog: deriveInitialCatalog(initial?.mcp ?? []),
59
70
  catalogArgs: {}
60
- });
71
+ }));
61
72
  const [error, setError] = useState(null);
62
73
  useInput((_input, key) => {
63
74
  if (key.escape && step !== "saved" && onCancel) onCancel();
64
75
  });
65
- if (step === "language") {
66
- return /* @__PURE__ */ React.createElement(
67
- LanguageStep,
68
- {
69
- initialValue: data.language,
70
- onSubmit: (lang) => {
71
- setLanguage(lang);
72
- notifyLanguageChange();
73
- setData((d) => ({ ...d, language: lang }));
74
- setStep(existingApiKey ? "preset" : "apiKey");
76
+ const content = (() => {
77
+ if (step === "language") {
78
+ return /* @__PURE__ */ React.createElement(
79
+ LanguageStep,
80
+ {
81
+ initialValue: data.language,
82
+ onSubmit: (lang) => {
83
+ setLanguage(lang);
84
+ notifyLanguageChange();
85
+ setData((d) => ({ ...d, language: lang }));
86
+ setStep("theme");
87
+ }
75
88
  }
76
- }
77
- );
78
- }
79
- if (step === "apiKey") {
80
- return /* @__PURE__ */ React.createElement(
81
- ApiKeyStep,
82
- {
83
- onSubmit: (key) => {
84
- setData((d) => ({ ...d, apiKey: key }));
85
- setError(null);
86
- setStep("preset");
87
- },
88
- error,
89
- onError: setError
90
- }
91
- );
92
- }
93
- if (step === "preset") {
94
- return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.presetTitle"), step: 1, total: 3 }, /* @__PURE__ */ React.createElement(
95
- SingleSelect,
96
- {
97
- items: presetItems(),
98
- initialValue: data.preset,
99
- onSubmit: (preset) => {
100
- setData((d) => ({ ...d, preset }));
101
- setStep("mcp");
89
+ );
90
+ }
91
+ if (step === "theme") {
92
+ return /* @__PURE__ */ React.createElement(
93
+ ThemeStep,
94
+ {
95
+ initialValue: data.theme,
96
+ onPreview: setPreviewTheme,
97
+ onSubmit: (theme) => {
98
+ setData((d) => ({ ...d, theme }));
99
+ setStep(existingApiKey ? "preset" : "apiKey");
100
+ }
102
101
  }
103
- }
104
- ), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.selectFooter"))));
105
- }
106
- if (step === "mcp") {
107
- return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.mcpTitle"), step: 2, total: 3 }, /* @__PURE__ */ React.createElement(
108
- MultiSelect,
109
- {
110
- items: mcpItems(),
111
- initialSelected: data.selectedCatalog,
112
- onSubmit: (selected) => {
113
- setData((d) => ({ ...d, selectedCatalog: selected }));
114
- const needsArgs = selected.some((name) => CATALOG_BY_NAME.get(name)?.userArgs);
115
- setStep(needsArgs ? "mcpArgs" : "review");
116
- },
117
- footer: t("wizard.mcpFooterMulti")
118
- }
119
- ));
120
- }
121
- if (step === "mcpArgs") {
122
- const pending = data.selectedCatalog.filter((name) => {
123
- const entry2 = CATALOG_BY_NAME.get(name);
124
- return entry2?.userArgs && !data.catalogArgs[name];
125
- });
126
- if (pending.length === 0) {
127
- setStep("review");
128
- return null;
102
+ );
129
103
  }
130
- const currentName = pending[0];
131
- const entry = CATALOG_BY_NAME.get(currentName);
132
- return /* @__PURE__ */ React.createElement(
133
- McpArgsStep,
134
- {
135
- entry,
136
- error,
137
- onSubmit: (value) => {
138
- setData((d) => ({
139
- ...d,
140
- catalogArgs: { ...d.catalogArgs, [currentName]: value }
141
- }));
142
- setError(null);
143
- },
144
- onError: setError
145
- }
146
- );
147
- }
148
- if (step === "review") {
149
- const specs = data.selectedCatalog.map((name) => buildSpec(name, data.catalogArgs));
150
- return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.reviewTitle"), step: 3, total: 3 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(
151
- SummaryLine,
152
- {
153
- label: t("wizard.reviewLabelLanguage"),
154
- value: LANGUAGE_LABELS[data.language]
155
- }
156
- ), /* @__PURE__ */ React.createElement(SummaryLine, { label: t("wizard.reviewLabelApiKey"), value: redactKey(data.apiKey) }), /* @__PURE__ */ React.createElement(SummaryLine, { label: t("wizard.reviewLabelPreset"), value: data.preset }), /* @__PURE__ */ React.createElement(
157
- SummaryLine,
158
- {
159
- label: t("wizard.reviewLabelMcp"),
160
- value: specs.length === 0 ? t("wizard.reviewMcpNone") : t("wizard.reviewMcpServers", { count: specs.length })
161
- }
162
- ), specs.map((spec, i) => (
163
- // biome-ignore lint/suspicious/noArrayIndexKey: review-only render, order fixed
164
- /* @__PURE__ */ React.createElement(Box, { key: i, paddingLeft: 14 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\xB7 ", spec))
165
- )), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("wizard.reviewSavesTo", { path: defaultConfigPath() }))), error ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, error)) : null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.reviewFooter")))), /* @__PURE__ */ React.createElement(
166
- ReviewConfirm,
167
- {
168
- onConfirm: () => {
169
- try {
170
- const specsNow = data.selectedCatalog.map(
171
- (name) => buildSpec(name, data.catalogArgs)
172
- );
173
- const prev = readConfig();
174
- const next = {
175
- ...prev,
176
- apiKey: data.apiKey,
177
- preset: data.preset,
178
- mcp: specsNow,
179
- setupCompleted: true
180
- };
181
- writeConfig(next);
182
- setStep("saved");
183
- onComplete(next);
184
- } catch (e) {
185
- setError(t("wizard.reviewSaveError", { message: e.message }));
104
+ if (step === "apiKey") {
105
+ return /* @__PURE__ */ React.createElement(
106
+ ApiKeyStep,
107
+ {
108
+ onSubmit: (key) => {
109
+ setData((d) => ({ ...d, apiKey: key }));
110
+ setError(null);
111
+ setStep("preset");
112
+ },
113
+ error,
114
+ onError: setError
115
+ }
116
+ );
117
+ }
118
+ if (step === "preset") {
119
+ return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.presetTitle"), step: 1, total: 3 }, /* @__PURE__ */ React.createElement(
120
+ SingleSelect,
121
+ {
122
+ items: presetItems(),
123
+ initialValue: data.preset,
124
+ onSubmit: (preset) => {
125
+ setData((d) => ({ ...d, preset }));
126
+ setStep("mcp");
186
127
  }
187
128
  }
129
+ ), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.selectFooter"))));
130
+ }
131
+ if (step === "mcp") {
132
+ return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.mcpTitle"), step: 2, total: 3 }, /* @__PURE__ */ React.createElement(
133
+ MultiSelect,
134
+ {
135
+ items: mcpItems(),
136
+ initialSelected: data.selectedCatalog,
137
+ onSubmit: (selected) => {
138
+ setData((d) => ({ ...d, selectedCatalog: selected }));
139
+ const needsArgs = selected.some((name) => CATALOG_BY_NAME.get(name)?.userArgs);
140
+ setStep(needsArgs ? "mcpArgs" : "review");
141
+ },
142
+ footer: t("wizard.mcpFooterMulti")
143
+ }
144
+ ));
145
+ }
146
+ if (step === "mcpArgs") {
147
+ const pending = data.selectedCatalog.filter((name) => {
148
+ const entry2 = CATALOG_BY_NAME.get(name);
149
+ return entry2?.userArgs && !data.catalogArgs[name];
150
+ });
151
+ if (pending.length === 0) {
152
+ setStep("review");
153
+ return null;
188
154
  }
189
- ));
190
- }
191
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "green" }, t("wizard.savedTitle")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("ui.welcome"))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.savedFooter"))), /* @__PURE__ */ React.createElement(ExitOnEnter, { onExit: exit }));
155
+ const currentName = pending[0];
156
+ const entry = CATALOG_BY_NAME.get(currentName);
157
+ return /* @__PURE__ */ React.createElement(
158
+ McpArgsStep,
159
+ {
160
+ entry,
161
+ error,
162
+ onSubmit: (value) => {
163
+ setData((d) => ({
164
+ ...d,
165
+ catalogArgs: { ...d.catalogArgs, [currentName]: value }
166
+ }));
167
+ setError(null);
168
+ },
169
+ onError: setError
170
+ }
171
+ );
172
+ }
173
+ if (step === "review") {
174
+ const specs = data.selectedCatalog.map((name) => buildSpec(name, data.catalogArgs));
175
+ return /* @__PURE__ */ React.createElement(StepFrame, { title: t("wizard.reviewTitle"), step: 3, total: 3 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(
176
+ SummaryLine,
177
+ {
178
+ label: t("wizard.reviewLabelLanguage"),
179
+ value: LANGUAGE_LABELS[data.language]
180
+ }
181
+ ), /* @__PURE__ */ React.createElement(SummaryLine, { label: t("wizard.reviewLabelApiKey"), value: redactKey(data.apiKey) }), /* @__PURE__ */ React.createElement(SummaryLine, { label: t("wizard.reviewLabelTheme"), value: data.theme }), /* @__PURE__ */ React.createElement(SummaryLine, { label: t("wizard.reviewLabelPreset"), value: data.preset }), /* @__PURE__ */ React.createElement(
182
+ SummaryLine,
183
+ {
184
+ label: t("wizard.reviewLabelMcp"),
185
+ value: specs.length === 0 ? t("wizard.reviewMcpNone") : t("wizard.reviewMcpServers", { count: specs.length })
186
+ }
187
+ ), specs.map((spec, i) => (
188
+ // biome-ignore lint/suspicious/noArrayIndexKey: review-only render, order fixed
189
+ /* @__PURE__ */ React.createElement(Box, { key: i, paddingLeft: 14 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\xB7 ", spec))
190
+ )), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("wizard.reviewSavesTo", { path: defaultConfigPath() }))), error ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, error)) : null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.reviewFooter")))), /* @__PURE__ */ React.createElement(
191
+ ReviewConfirm,
192
+ {
193
+ onConfirm: () => {
194
+ try {
195
+ const specsNow = data.selectedCatalog.map(
196
+ (name) => buildSpec(name, data.catalogArgs)
197
+ );
198
+ const prev = readConfig();
199
+ const next = {
200
+ ...prev,
201
+ apiKey: data.apiKey,
202
+ preset: data.preset,
203
+ theme: data.theme,
204
+ mcp: specsNow,
205
+ setupCompleted: true
206
+ };
207
+ writeConfig(next);
208
+ setStep("saved");
209
+ onComplete(next);
210
+ } catch (e) {
211
+ setError(t("wizard.reviewSaveError", { message: e.message }));
212
+ }
213
+ }
214
+ }
215
+ ));
216
+ }
217
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "green" }, t("wizard.savedTitle")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, t("ui.welcome"))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.savedFooter"))), /* @__PURE__ */ React.createElement(ExitOnEnter, { onExit: exit }));
218
+ })();
219
+ return /* @__PURE__ */ React.createElement(ThemeProvider, { name: previewTheme }, content);
220
+ }
221
+ var THEME_NAMES = listThemeNames();
222
+ function ThemeStep({
223
+ initialValue,
224
+ onPreview,
225
+ onSubmit
226
+ }) {
227
+ const initialIndex = Math.max(0, THEME_NAMES.indexOf(initialValue));
228
+ const [index, setIndex] = useState(initialIndex);
229
+ const theme = useTheme();
230
+ useInput((_input, key) => {
231
+ if (key.upArrow) {
232
+ const next = (index - 1 + THEME_NAMES.length) % THEME_NAMES.length;
233
+ setIndex(next);
234
+ onPreview(THEME_NAMES[next]);
235
+ } else if (key.downArrow) {
236
+ const next = (index + 1) % THEME_NAMES.length;
237
+ setIndex(next);
238
+ onPreview(THEME_NAMES[next]);
239
+ } else if (key.return) {
240
+ onSubmit(THEME_NAMES[index]);
241
+ }
242
+ });
243
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.tone.brand, paddingX: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.tone.brand }, t("wizard.themeTitle")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.themeSubtitle"))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, THEME_NAMES.map((name, i) => /* @__PURE__ */ React.createElement(Box, { key: name }, /* @__PURE__ */ React.createElement(Text, { color: i === index ? theme.tone.brand : void 0 }, i === index ? "\u25B8 " : " "), /* @__PURE__ */ React.createElement(Text, { bold: i === index, color: i === index ? theme.fg.strong : theme.fg.body }, name), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.meta }, " \u2014 "), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.meta }, t(`wizard.themeCaption.${name}`))))), /* @__PURE__ */ React.createElement(
244
+ Box,
245
+ {
246
+ marginTop: 1,
247
+ flexDirection: "column",
248
+ borderStyle: "round",
249
+ borderColor: theme.fg.faint,
250
+ paddingX: 1
251
+ },
252
+ /* @__PURE__ */ React.createElement(Text, { color: theme.fg.meta }, t("wizard.themeSampleHeading")),
253
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.tone.accent }, "\u25C6 "), /* @__PURE__ */ React.createElement(Text, { color: theme.tone.accent }, "Reasoning")),
254
+ /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.tone.info }, "\u25A3 "), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.body }, "fs.readFile("), /* @__PURE__ */ React.createElement(Text, { color: theme.tone.ok }, '"main.ts"'), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.body }, ")")),
255
+ /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: theme.fg.meta }, "~/project/main.ts:42")),
256
+ /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.tone.ok }, "ok"), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.tone.warn }, "warn"), /* @__PURE__ */ React.createElement(Text, { color: theme.fg.faint }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.tone.err }, "err"))
257
+ ), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("wizard.themeFooter"))));
192
258
  }
193
259
  function LanguageStep({
194
260
  initialValue,
@@ -387,7 +453,7 @@ async function setupCommand(_opts = {}) {
387
453
  Wizard,
388
454
  {
389
455
  existingApiKey: existingKey,
390
- initial: { preset: existing.preset, mcp: existing.mcp },
456
+ initial: { preset: existing.preset, mcp: existing.mcp, theme: existing.theme },
391
457
  onComplete: () => {
392
458
  },
393
459
  onCancel: () => {
@@ -402,4 +468,4 @@ async function setupCommand(_opts = {}) {
402
468
  export {
403
469
  setupCommand
404
470
  };
405
- //# sourceMappingURL=setup-QXMONZ4P.js.map
471
+ //# sourceMappingURL=setup-IIAJXHP4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/setup.tsx","../../src/cli/ui/Wizard.tsx"],"sourcesContent":["/**\n * `reasonix setup` — re-mount the first-run wizard on demand so users\n * can reconfigure (add/remove MCP servers, switch preset) without\n * editing JSON by hand.\n *\n * Invoked both explicitly (`reasonix setup`) and implicitly (the no-args\n * entry point when `setupCompleted` is false).\n */\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 /**\n * When true, bypass the API-key step even if no key is saved — useful\n * from test harnesses. Normal CLI use always pushes through the key\n * step when missing.\n */\n skipKeyStep?: 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={{ preset: existing.preset, mcp: existing.mcp, theme: existing.theme }}\n onComplete={() => {\n // Ink handles its own enter-to-exit inside the \"saved\" step; we\n // just wait for the app to exit naturally.\n }}\n onCancel={() => {\n unmount();\n }}\n />,\n { exitOnCtrlC: true, patchConsole: false },\n );\n await waitUntilExit();\n}\n","/**\n * First-run / re-configure wizard.\n *\n * Walks a new user through: language → theme → API key → preset pick → MCP\n * server pick → per-server args → save. Saved output lives in\n * `~/.reasonix/config.json` so the next `reasonix chat` starts with\n * everything already wired.\n */\n\nimport { mkdirSync, statSync } from \"node:fs\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\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 PresetName,\n type ReasonixConfig,\n defaultConfigPath,\n isPlausibleKey,\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 { PRESET_DESCRIPTIONS } from \"./presets.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 /** Pre-fill selections when re-running (reconfigure flow). */\n initial?: {\n preset?: PresetName;\n mcp?: string[];\n theme?: ThemeName | \"auto\";\n };\n}\n\ntype Step = \"language\" | \"theme\" | \"apiKey\" | \"preset\" | \"mcp\" | \"mcpArgs\" | \"review\" | \"saved\";\n\ninterface WizardData {\n language: LanguageCode;\n theme: ThemeName;\n apiKey: string;\n preset: PresetName;\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};\n\nexport function Wizard({ onComplete, onCancel, existingApiKey, initial }: 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 preset: initial?.preset ?? \"auto\",\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 ? \"preset\" : \"apiKey\");\n }}\n />\n );\n }\n\n if (step === \"apiKey\") {\n return (\n <ApiKeyStep\n onSubmit={(key) => {\n setData((d) => ({ ...d, apiKey: key }));\n setError(null);\n setStep(\"preset\");\n }}\n error={error}\n onError={setError}\n />\n );\n }\n\n if (step === \"preset\") {\n return (\n <StepFrame title={t(\"wizard.presetTitle\")} step={1} total={3}>\n <SingleSelect<PresetName>\n items={presetItems()}\n initialValue={data.preset}\n onSubmit={(preset) => {\n setData((d) => ({ ...d, preset }));\n setStep(\"mcp\");\n }}\n />\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.selectFooter\")}</Text>\n </Box>\n </StepFrame>\n );\n }\n\n if (step === \"mcp\") {\n return (\n <StepFrame title={t(\"wizard.mcpTitle\")} step={2} total={3}>\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={3} total={3}>\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 label={t(\"wizard.reviewLabelPreset\")} value={data.preset} />\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 dimColor>· {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=\"red\">{error}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>{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 preset: data.preset,\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=\"green\" paddingX={1}>\n <Text bold color=\"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 dimColor>{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 dimColor>{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}>Reasoning</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 dimColor>{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=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.languageTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{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 onSubmit,\n error,\n onError,\n}: {\n onSubmit: (key: string) => void;\n error: string | null;\n onError: (e: string | null) => void;\n}) {\n const [value, setValue] = useState(\"\");\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.welcomeTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text>{t(\"wizard.apiKeyPrompt\")}</Text>\n </Box>\n <Text dimColor>{t(\"wizard.apiKeyGetOne\")}</Text>\n <Text dimColor>{t(\"wizard.apiKeySavedLocally\", { path: defaultConfigPath() })}</Text>\n <Box marginTop={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.apiKeyInputLabel\")}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(raw) => {\n const trimmed = raw.trim();\n if (!isPlausibleKey(trimmed)) {\n onError(t(\"wizard.apiKeyInvalid\"));\n setValue(\"\");\n return;\n }\n onSubmit(trimmed);\n }}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.apiKeyPreview\", { redacted: redactKey(value) })}</Text>\n </Box>\n ) : null}\n </Box>\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 dimColor>{t(\"wizard.mcpArgsDirCreateHint\")}</Text>\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"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 dimColor>{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=\"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=\"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=\"cyan\" paddingX={1}>\n <Box>\n <Text dimColor>{t(\"wizard.stepCounter\", { step, total })}</Text>\n <Text bold color=\"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 presetItems(): SelectItem<PresetName>[] {\n return ([\"auto\", \"flash\", \"pro\"] as const).map((name) => ({\n value: name as PresetName,\n label: `${name} — ${PRESET_DESCRIPTIONS[name].headline}`,\n hint: PRESET_DESCRIPTIONS[name].cost,\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":["React","entry","React"]}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ MANUAL_UPDATE_COMMANDS,
4
+ planUpdate,
5
+ updateCommand
6
+ } from "./chunk-WJ3YX4PZ.js";
7
+ import "./chunk-CRPQUBP6.js";
8
+ export {
9
+ MANUAL_UPDATE_COMMANDS,
10
+ planUpdate,
11
+ updateCommand
12
+ };
13
+ //# sourceMappingURL=update-GUCWB4UN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-N2IC4XDL.js";
3
- import "./chunk-I6YIAK6C.js";
2
+ import "./chunk-QRUQ2BFT.js";
3
+ import "./chunk-UNMYFZPZ.js";
4
4
  import "./chunk-XJLZ4HKU.js";
5
5
  import "./chunk-XHQIK7B6.js";
6
6
  import "./chunk-ZU45XW3P.js";
7
7
  import "./chunk-DAEAAVDF.js";
8
8
  import "./chunk-KMWKGPFZ.js";
9
9
  import "./chunk-3Q3C4W66.js";
10
- import "./chunk-SX6L4HZZ.js";
10
+ import "./chunk-QPNZWUZF.js";
11
11
  import "./chunk-KJQIA4US.js";
12
- import "./chunk-JJTOZPM3.js";
13
- import {
14
- VERSION
15
- } from "./chunk-2AWTGJ2C.js";
12
+ import "./chunk-IPCPEZWQ.js";
16
13
  import "./chunk-5X7LZJDE.js";
17
14
  import "./chunk-DFP4YSVM.js";
18
- import "./chunk-SN7YH6FC.js";
19
- import "./chunk-5JXXEPDM.js";
15
+ import "./chunk-MLXUGPJE.js";
16
+ import "./chunk-BHLHOS5Y.js";
20
17
  import "./chunk-WUI3P4RA.js";
21
18
  import "./chunk-ZTLZO42A.js";
22
19
  import "./chunk-ORM6PK57.js";
20
+ import {
21
+ VERSION
22
+ } from "./chunk-CRPQUBP6.js";
23
23
 
24
24
  // src/cli/commands/version.ts
25
25
  function versionCommand() {
@@ -28,4 +28,4 @@ function versionCommand() {
28
28
  export {
29
29
  versionCommand
30
30
  };
31
- //# sourceMappingURL=version-Q2HA3AAC.js.map
31
+ //# sourceMappingURL=version-DWD6RLIU.js.map
package/dist/index.d.ts CHANGED
@@ -171,10 +171,13 @@ type ConfirmationChoice = {
171
171
  };
172
172
  type PlanVerdict = {
173
173
  type: "approve";
174
+ feedback?: string;
174
175
  } | {
175
176
  type: "refine";
177
+ feedback?: string;
176
178
  } | {
177
179
  type: "cancel";
180
+ feedback?: string;
178
181
  };
179
182
  type CheckpointVerdict = {
180
183
  type: "continue";
@@ -2071,7 +2074,11 @@ declare function readConfig(path?: string): ReasonixConfig;
2071
2074
  declare function writeConfig(cfg: ReasonixConfig, path?: string): void;
2072
2075
  /** Resolve the API key from env var first, then the config file. */
2073
2076
  declare function loadApiKey(path?: string): string | undefined;
2077
+ /** env > config > undefined. Client falls back to api.deepseek.com when undefined. */
2078
+ declare function loadBaseUrl(path?: string): string | undefined;
2079
+ declare function saveBaseUrl(url: string, path?: string): void;
2074
2080
  declare function saveApiKey(key: string, path?: string): void;
2081
+ /** Self-hosted DeepSeek-compatible endpoints may issue any token shape, so we only typo-guard here — the real auth check is the first API call against `baseUrl`. */
2075
2082
  declare function isPlausibleKey(key: string): boolean;
2076
2083
  /** Mask a key for display: `sk-abcd...wxyz`. */
2077
2084
  declare function redactKey(key: string): string;
@@ -2102,8 +2109,13 @@ interface GetLatestVersionOptions {
2102
2109
  declare function getLatestVersion(opts?: GetLatestVersionOptions): Promise<string | null>;
2103
2110
  /** Pre-release with same core sorts BELOW the bare version — matches npm `latest` dist-tag semantics. */
2104
2111
  declare function compareVersions(a: string, b: string): number;
2105
- /** False negatives are safe `npm i -g` works for npx users too. */
2112
+ type InstallSource = "npm" | "bun" | "pnpm" | "yarn" | "npx" | "unknown";
2113
+ /** Each manager owns a unique global path segment, so argv[1] tells us who installed us. */
2114
+ declare function detectInstallSource(bin?: string): InstallSource;
2115
+ /** Returns null when no path is given. Callers must check installSource first. */
2106
2116
  declare function isNpxInstall(): boolean;
2117
+ /** Pin npm to the install location via --prefix so `nvm use` doesn't redirect the install elsewhere. */
2118
+ declare function detectNpmInstallPrefix(bin?: string): string | null;
2107
2119
 
2108
2120
  /** Append-only JSONL of per-turn tokens + cost; best-effort writes, never blocks the turn. No prompts/completions logged. */
2109
2121
 
@@ -2215,4 +2227,4 @@ declare function aggregateUsage(records: UsageRecord[], opts?: AggregateOptions)
2215
2227
  /** File-size helper for the stats header — "1.2 MB" etc. Returns "" if missing. */
2216
2228
  declare function formatLogSize(path?: string): string;
2217
2229
 
2218
- 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, 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 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 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_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 SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentSink, 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, costUsd, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, 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, loadDotenv, loadHooks, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseEditBlocks, parseMcpSpec, parseMojeekResults, 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, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };
2230
+ 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, 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 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_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 SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentSink, 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, costUsd, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectInstallSource, detectNpmInstallPrefix, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, 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, loadHooks, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseEditBlocks, parseMcpSpec, parseMojeekResults, 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, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, saveBaseUrl, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };