reasonix 0.48.0 → 0.49.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 (130) hide show
  1. package/README.md +9 -0
  2. package/dashboard/dist/app.js +123 -16
  3. package/dashboard/dist/app.js.map +1 -1
  4. package/dist/cli/{acp-4ROCGYNH.js → acp-WFQIC6SO.js} +52 -135
  5. package/dist/cli/acp-WFQIC6SO.js.map +1 -0
  6. package/dist/cli/chat-D32JGNVH.js +51 -0
  7. package/dist/cli/{chunk-S2RMQULY.js → chunk-23ZPCIPR.js} +12 -9
  8. package/dist/cli/chunk-23ZPCIPR.js.map +1 -0
  9. package/dist/cli/{chunk-TKVXTQ3T.js → chunk-3ZZXQ3CZ.js} +27 -27
  10. package/dist/cli/chunk-3ZZXQ3CZ.js.map +1 -0
  11. package/dist/cli/{chunk-5OHHAQ4W.js → chunk-7AST3QQ3.js} +2 -2
  12. package/dist/cli/{chunk-MRZG4GBF.js → chunk-7JTKBJ2G.js} +3 -3
  13. package/dist/cli/{chunk-X53B3JIX.js → chunk-7X4JJOO7.js} +2 -61
  14. package/dist/cli/{chunk-X53B3JIX.js.map → chunk-7X4JJOO7.js.map} +1 -1
  15. package/dist/cli/{chunk-MOJYKO2A.js → chunk-ASOLXV67.js} +3 -3
  16. package/dist/cli/{chunk-7M4YYMKW.js → chunk-AWEULQG6.js} +49 -56
  17. package/dist/cli/{chunk-7M4YYMKW.js.map → chunk-AWEULQG6.js.map} +1 -1
  18. package/dist/cli/{chunk-HR5NBKEM.js → chunk-DFX5ZH5L.js} +2 -2
  19. package/dist/cli/{chunk-3WGTGXO4.js → chunk-GNS7BAT2.js} +4 -4
  20. package/dist/cli/chunk-GNS7BAT2.js.map +1 -0
  21. package/dist/cli/{chunk-TE5UIIFL.js → chunk-J2IHQGPQ.js} +12 -6
  22. package/dist/cli/chunk-J2IHQGPQ.js.map +1 -0
  23. package/dist/cli/{chunk-I4M5QJNL.js → chunk-JGTX4RRQ.js} +3 -3
  24. package/dist/cli/{chunk-FY4S7TJZ.js → chunk-JNTMOX7G.js} +10 -2
  25. package/dist/cli/chunk-JNTMOX7G.js.map +1 -0
  26. package/dist/cli/{chunk-OB4BUJBL.js → chunk-MGTBP7GG.js} +5 -2
  27. package/dist/cli/chunk-MGTBP7GG.js.map +1 -0
  28. package/dist/cli/{chunk-OPYALNTT.js → chunk-MQWO32ZD.js} +387 -184
  29. package/dist/cli/chunk-MQWO32ZD.js.map +1 -0
  30. package/dist/cli/{chunk-2QSTA2QV.js → chunk-O5LIHAMP.js} +8 -4
  31. package/dist/cli/chunk-O5LIHAMP.js.map +1 -0
  32. package/dist/cli/{chunk-NMQSUNLB.js → chunk-PB3MAFEI.js} +6 -3
  33. package/dist/cli/chunk-PB3MAFEI.js.map +1 -0
  34. package/dist/cli/{chunk-H4CCXMDD.js → chunk-PEMG6CUB.js} +2 -2
  35. package/dist/cli/{chunk-RUDBUHO4.js → chunk-PXBQ6IZ7.js} +3 -3
  36. package/dist/cli/{chunk-J2TQAWOM.js → chunk-Q46B3Z7H.js} +25 -10
  37. package/dist/cli/{chunk-J2TQAWOM.js.map → chunk-Q46B3Z7H.js.map} +1 -1
  38. package/dist/cli/{chunk-6MZTZO7A.js → chunk-QF32ROX2.js} +2152 -2613
  39. package/dist/cli/chunk-QF32ROX2.js.map +1 -0
  40. package/dist/cli/{chunk-OG5JANQ4.js → chunk-QX5TWXRZ.js} +2 -2
  41. package/dist/cli/{chunk-V4Y732RQ.js → chunk-TAIKVL35.js} +2 -2
  42. package/dist/cli/{chunk-B5CZL2SE.js → chunk-TEDWJKEI.js} +4 -9
  43. package/dist/cli/chunk-TEDWJKEI.js.map +1 -0
  44. package/dist/cli/{chunk-EMMENC4O.js → chunk-U5XQDCK7.js} +5 -5
  45. package/dist/cli/{chunk-DOWEOA6E.js → chunk-W46ZMNKO.js} +3 -3
  46. package/dist/cli/{chunk-CDVSFSAK.js → chunk-WMTMMSXU.js} +184 -8
  47. package/dist/cli/chunk-WMTMMSXU.js.map +1 -0
  48. package/dist/cli/{chunk-YW63N3ZR.js → chunk-YEF7C4XI.js} +270 -96
  49. package/dist/cli/chunk-YEF7C4XI.js.map +1 -0
  50. package/dist/cli/{chunk-JMDE6IO3.js → chunk-ZAEJWKXB.js} +2 -2
  51. package/dist/cli/chunk-ZWHSHFDP.js +6173 -0
  52. package/dist/cli/chunk-ZWHSHFDP.js.map +1 -0
  53. package/dist/cli/{code-PMPJWXEO.js → code-R4IHI7SR.js} +30 -30
  54. package/dist/cli/{commands-QS6TG4G3.js → commands-DRHFCYMO.js} +4 -4
  55. package/dist/cli/{commit-XPRSKUBF.js → commit-AG5KB4YP.js} +3 -3
  56. package/dist/cli/{desktop-562OPWIU.js → desktop-JGL6GORA.js} +60 -23
  57. package/dist/cli/desktop-JGL6GORA.js.map +1 -0
  58. package/dist/cli/{diff-I6W4AUWJ.js → diff-4Z7ETWZO.js} +9 -9
  59. package/dist/cli/{doctor-6XVZKT4U.js → doctor-VA3RHQLB.js} +9 -9
  60. package/dist/cli/index.js +37 -36
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/{mcp-7W7ANO2Y.js → mcp-LZO4HXFA.js} +34 -23
  63. package/dist/cli/mcp-LZO4HXFA.js.map +1 -0
  64. package/dist/cli/{mcp-browse-LA4I4YIZ.js → mcp-browse-C3GXVMYZ.js} +3 -3
  65. package/dist/cli/{mcp-inspect-LWXXU7BY.js → mcp-inspect-ZMYUNFDS.js} +2 -2
  66. package/dist/cli/{prompt-RKZD4X6Y.js → prompt-MC3U5KRP.js} +5 -4
  67. package/dist/cli/{prune-sessions-SEWX7GP6.js → prune-sessions-OEPFH4N6.js} +11 -7
  68. package/dist/cli/prune-sessions-OEPFH4N6.js.map +1 -0
  69. package/dist/cli/{replay-2X7MVXOI.js → replay-4TP7ZUMZ.js} +10 -10
  70. package/dist/cli/{run-TPKXIJ27.js → run-6MXQYBOE.js} +16 -15
  71. package/dist/cli/run-6MXQYBOE.js.map +1 -0
  72. package/dist/cli/{server-NHQ3QXOZ.js → server-Z3IMJNNI.js} +65 -12
  73. package/dist/cli/server-Z3IMJNNI.js.map +1 -0
  74. package/dist/cli/{sessions-2A4DGSHA.js → sessions-NXQ5SAV7.js} +18 -18
  75. package/dist/cli/sessions-NXQ5SAV7.js.map +1 -0
  76. package/dist/cli/{setup-GOLP7J4C.js → setup-LHZELI6I.js} +6 -6
  77. package/dist/cli/{stats-CGDAFDKI.js → stats-SUIJ3QWY.js} +6 -6
  78. package/dist/cli/{version-FIL4ZFOS.js → version-BIFONEUB.js} +13 -13
  79. package/dist/index.d.ts +71 -17
  80. package/dist/index.js +1040 -391
  81. package/dist/index.js.map +1 -1
  82. package/package.json +6 -2
  83. package/dist/cli/acp-4ROCGYNH.js.map +0 -1
  84. package/dist/cli/chat-GZNB5625.js +0 -51
  85. package/dist/cli/chunk-2QSTA2QV.js.map +0 -1
  86. package/dist/cli/chunk-3WGTGXO4.js.map +0 -1
  87. package/dist/cli/chunk-6MZTZO7A.js.map +0 -1
  88. package/dist/cli/chunk-B5CZL2SE.js.map +0 -1
  89. package/dist/cli/chunk-CDVSFSAK.js.map +0 -1
  90. package/dist/cli/chunk-FY4S7TJZ.js.map +0 -1
  91. package/dist/cli/chunk-NMQSUNLB.js.map +0 -1
  92. package/dist/cli/chunk-OB4BUJBL.js.map +0 -1
  93. package/dist/cli/chunk-OPYALNTT.js.map +0 -1
  94. package/dist/cli/chunk-S2RMQULY.js.map +0 -1
  95. package/dist/cli/chunk-TE5UIIFL.js.map +0 -1
  96. package/dist/cli/chunk-TKVXTQ3T.js.map +0 -1
  97. package/dist/cli/chunk-WZGNXR6E.js +0 -2020
  98. package/dist/cli/chunk-WZGNXR6E.js.map +0 -1
  99. package/dist/cli/chunk-YW63N3ZR.js.map +0 -1
  100. package/dist/cli/desktop-562OPWIU.js.map +0 -1
  101. package/dist/cli/mcp-7W7ANO2Y.js.map +0 -1
  102. package/dist/cli/prune-sessions-SEWX7GP6.js.map +0 -1
  103. package/dist/cli/run-TPKXIJ27.js.map +0 -1
  104. package/dist/cli/server-NHQ3QXOZ.js.map +0 -1
  105. package/dist/cli/sessions-2A4DGSHA.js.map +0 -1
  106. /package/dist/cli/{chat-GZNB5625.js.map → chat-D32JGNVH.js.map} +0 -0
  107. /package/dist/cli/{chunk-5OHHAQ4W.js.map → chunk-7AST3QQ3.js.map} +0 -0
  108. /package/dist/cli/{chunk-MRZG4GBF.js.map → chunk-7JTKBJ2G.js.map} +0 -0
  109. /package/dist/cli/{chunk-MOJYKO2A.js.map → chunk-ASOLXV67.js.map} +0 -0
  110. /package/dist/cli/{chunk-HR5NBKEM.js.map → chunk-DFX5ZH5L.js.map} +0 -0
  111. /package/dist/cli/{chunk-I4M5QJNL.js.map → chunk-JGTX4RRQ.js.map} +0 -0
  112. /package/dist/cli/{chunk-H4CCXMDD.js.map → chunk-PEMG6CUB.js.map} +0 -0
  113. /package/dist/cli/{chunk-RUDBUHO4.js.map → chunk-PXBQ6IZ7.js.map} +0 -0
  114. /package/dist/cli/{chunk-OG5JANQ4.js.map → chunk-QX5TWXRZ.js.map} +0 -0
  115. /package/dist/cli/{chunk-V4Y732RQ.js.map → chunk-TAIKVL35.js.map} +0 -0
  116. /package/dist/cli/{chunk-EMMENC4O.js.map → chunk-U5XQDCK7.js.map} +0 -0
  117. /package/dist/cli/{chunk-DOWEOA6E.js.map → chunk-W46ZMNKO.js.map} +0 -0
  118. /package/dist/cli/{chunk-JMDE6IO3.js.map → chunk-ZAEJWKXB.js.map} +0 -0
  119. /package/dist/cli/{code-PMPJWXEO.js.map → code-R4IHI7SR.js.map} +0 -0
  120. /package/dist/cli/{commands-QS6TG4G3.js.map → commands-DRHFCYMO.js.map} +0 -0
  121. /package/dist/cli/{commit-XPRSKUBF.js.map → commit-AG5KB4YP.js.map} +0 -0
  122. /package/dist/cli/{diff-I6W4AUWJ.js.map → diff-4Z7ETWZO.js.map} +0 -0
  123. /package/dist/cli/{doctor-6XVZKT4U.js.map → doctor-VA3RHQLB.js.map} +0 -0
  124. /package/dist/cli/{mcp-browse-LA4I4YIZ.js.map → mcp-browse-C3GXVMYZ.js.map} +0 -0
  125. /package/dist/cli/{mcp-inspect-LWXXU7BY.js.map → mcp-inspect-ZMYUNFDS.js.map} +0 -0
  126. /package/dist/cli/{prompt-RKZD4X6Y.js.map → prompt-MC3U5KRP.js.map} +0 -0
  127. /package/dist/cli/{replay-2X7MVXOI.js.map → replay-4TP7ZUMZ.js.map} +0 -0
  128. /package/dist/cli/{setup-GOLP7J4C.js.map → setup-LHZELI6I.js.map} +0 -0
  129. /package/dist/cli/{stats-CGDAFDKI.js.map → stats-SUIJ3QWY.js.map} +0 -0
  130. /package/dist/cli/{version-FIL4ZFOS.js.map → version-BIFONEUB.js.map} +0 -0
@@ -11,11 +11,14 @@ import {
11
11
  MCP_CATALOG,
12
12
  mcpCommandFor
13
13
  } from "./chunk-PLHAZOLZ.js";
14
+ import {
15
+ t
16
+ } from "./chunk-YEF7C4XI.js";
14
17
  import {
15
18
  defaultConfigPath,
16
19
  readConfig,
17
20
  writeConfig
18
- } from "./chunk-CDVSFSAK.js";
21
+ } from "./chunk-WMTMMSXU.js";
19
22
  import "./chunk-TUK7OWJA.js";
20
23
 
21
24
  // src/cli/commands/mcp.ts
@@ -66,7 +69,7 @@ async function mcpListCommand(opts = {}) {
66
69
  console.log(JSON.stringify(MCP_CATALOG, null, 2));
67
70
  return;
68
71
  }
69
- console.log("Bundled MCP servers (offline catalog):");
72
+ console.log(t("mcpCli.bundledCatalog"));
70
73
  console.log("");
71
74
  for (const entry of MCP_CATALOG) {
72
75
  console.log(` ${pad(entry.name, 12)} ${entry.summary}`);
@@ -107,8 +110,8 @@ async function mcpListCommand(opts = {}) {
107
110
  );
108
111
  return;
109
112
  }
110
- const ageStr = result.fromCache ? `cached, ${fmtAge(Date.now() - result.fetchedAt)}` : "just fetched";
111
- const moreStr = result.hasMore ? "more available" : "all loaded";
113
+ const ageStr = result.fromCache ? t("mcpCli.cachedAge", { age: fmtAge(Date.now() - result.fetchedAt) }) : t("mcpCli.justFetched");
114
+ const moreStr = result.hasMore ? t("mcpCli.moreAvailable") : t("mcpCli.allLoaded");
112
115
  console.log(
113
116
  `MCP servers from ${result.source} registry (${result.entries.length} loaded, ${moreStr}, ${ageStr}):`
114
117
  );
@@ -118,15 +121,13 @@ async function mcpListCommand(opts = {}) {
118
121
  console.log("");
119
122
  for (const e of shown) printEntry(e);
120
123
  if (ranked.length > limit) {
121
- console.log(
122
- ` \u2026 ${ranked.length - limit} more loaded \u2014 use \`reasonix mcp search <query>\` to filter`
123
- );
124
+ console.log(t("mcpCli.moreLoaded", { count: ranked.length - limit }));
124
125
  }
125
126
  if (result.hasMore) {
126
- console.log(" \u25B8 more pages available \u2014 `reasonix mcp list --pages <n>` or --all");
127
+ console.log(t("mcpCli.morePagesAvailable"));
127
128
  }
128
129
  console.log("");
129
- console.log("Install: reasonix mcp install <name>");
130
+ console.log(t("mcpCli.installHint"));
130
131
  }
131
132
  function matchFilter(query) {
132
133
  const q = query.toLowerCase();
@@ -135,7 +136,7 @@ function matchFilter(query) {
135
136
  async function mcpSearchCommand(query, opts = {}) {
136
137
  const q = query.trim();
137
138
  if (!q) {
138
- console.error("usage: reasonix mcp search <query>");
139
+ console.error(t("mcpCli.usageSearch"));
139
140
  process.exit(1);
140
141
  }
141
142
  const handle = await openRegistry({ noCache: opts.refresh, onProgress: progressToStderr });
@@ -171,16 +172,22 @@ async function mcpSearchCommand(query, opts = {}) {
171
172
  }
172
173
  if (shown.length === 0) {
173
174
  console.log(
174
- `No matches for "${q}" across ${result.entries.length} loaded entries (${result.source}${result.hasMore ? ", more pages exist \u2014 try --refresh or `mcp list --all`" : ""}).`
175
+ t("mcpCli.noMatchesFor", { q, count: result.entries.length, source: result.source })
175
176
  );
176
177
  return;
177
178
  }
178
179
  console.log(
179
- `${matches.length} match(es) for "${q}" in ${result.source} registry (${result.entries.length} entries scanned):`
180
+ t("mcpCli.matchCount", {
181
+ count: matches.length,
182
+ q,
183
+ source: result.source,
184
+ loaded: result.entries.length
185
+ })
180
186
  );
181
187
  console.log("");
182
188
  for (const e of shown) printEntry(e);
183
- if (matches.length > limit) console.log(` \u2026 ${matches.length - limit} more matches`);
189
+ if (matches.length > limit)
190
+ console.log(t("mcpCli.moreMatches", { count: matches.length - limit }));
184
191
  }
185
192
  function findEntry(entries, name) {
186
193
  const exact = entries.find((e) => e.name === name);
@@ -195,7 +202,7 @@ function findEntry(entries, name) {
195
202
  async function mcpInstallCommand(name, opts = {}) {
196
203
  const target = name.trim();
197
204
  if (!target) {
198
- console.error("usage: reasonix mcp install <name>");
205
+ console.error(t("mcpCli.usageInstall"));
199
206
  process.exit(1);
200
207
  }
201
208
  const handle = await openRegistry({ noCache: opts.refresh, onProgress: progressToStderr });
@@ -215,10 +222,14 @@ async function mcpInstallCommand(name, opts = {}) {
215
222
  const entry = findEntry(handle.cache.entries, target);
216
223
  if (!entry) {
217
224
  console.error(
218
- `No MCP server named "${target}" found after walking ${handle.cache.pagination.pagesLoaded} page(s) of the ${handle.source} registry.`
225
+ t("mcpCli.noServerFound", {
226
+ target,
227
+ pages: handle.cache.pagination.pagesLoaded,
228
+ source: handle.source
229
+ })
219
230
  );
220
231
  if (handle.cache.pagination.nextCursor !== null) {
221
- console.error(`Try: reasonix mcp install ${target} --max-pages 100`);
232
+ console.error(t("mcpCli.noServerTryMore", { target }));
222
233
  }
223
234
  process.exit(1);
224
235
  }
@@ -229,27 +240,27 @@ async function mcpInstallCommand(name, opts = {}) {
229
240
  if (fetched) entry.install = fetched;
230
241
  }
231
242
  if (!entry.install) {
232
- console.error(
233
- `Could not derive install metadata for "${entry.name}" \u2014 try \`npx -y @smithery/cli install ${entry.name}\` directly.`
234
- );
243
+ console.error(t("mcpCli.noInstallMeta", { name: entry.name }));
235
244
  process.exit(1);
236
245
  }
237
246
  let spec;
238
247
  try {
239
248
  spec = specStringFor(entry.name, entry.install);
240
249
  } catch (err) {
241
- console.error(`Cannot build install spec for ${entry.name}: ${err.message}`);
250
+ console.error(
251
+ t("mcpCli.buildSpecFailed", { name: entry.name, message: err.message })
252
+ );
242
253
  process.exit(1);
243
254
  }
244
255
  const cfg = readConfig();
245
256
  const existing = cfg.mcp ?? [];
246
257
  if (existing.includes(spec)) {
247
- console.log(`Already installed: ${spec}`);
258
+ console.log(t("mcpCli.alreadyInstalled", { spec }));
248
259
  return;
249
260
  }
250
261
  const next = { ...cfg, mcp: [...existing, spec] };
251
262
  writeConfig(next);
252
- console.log(`Installed: ${entry.name}`);
263
+ console.log(t("mcpCli.installed", { spec: entry.name }));
253
264
  console.log(` spec: ${spec}`);
254
265
  const installedName = parseInstalledName(spec);
255
266
  if (entry.install.requiredEnv?.length) {
@@ -274,4 +285,4 @@ export {
274
285
  mcpListCommand,
275
286
  mcpSearchCommand
276
287
  };
277
- //# sourceMappingURL=mcp-7W7ANO2Y.js.map
288
+ //# sourceMappingURL=mcp-LZO4HXFA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/mcp.ts"],"sourcesContent":["import { defaultConfigPath, readConfig, writeConfig } from \"../../config.js\";\nimport { t } from \"../../i18n/index.js\";\nimport { MCP_CATALOG, mcpCommandFor } from \"../../mcp/catalog.js\";\nimport {\n type FetchProgress,\n fetchSmitheryDetail,\n handleToFetchResult,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\n\nconst DEFAULT_LIST_LIMIT = 30;\n/** Soft cap on how far `search` walks the registry on first run. */\nconst SEARCH_PAGE_CAP = 20;\n/** Soft cap on how far `install` walks looking for a name. */\nconst INSTALL_PAGE_CAP = 30;\n\nconst progressToStderr: FetchProgress = ({ source, page, entries }) => {\n if (page === 1 || page % 5 === 0) {\n process.stderr.write(`\\r▸ fetching ${source} registry · page ${page} · ${entries} entries`);\n }\n};\n\nfunction finishProgressLine(): void {\n if (process.stderr.isTTY) process.stderr.write(\"\\r\\x1b[K\");\n else process.stderr.write(\"\\n\");\n}\n\nexport interface McpListOptions {\n json?: boolean;\n /** Skip network — only show the bundled MCP_CATALOG entries. */\n local?: boolean;\n /** Bypass cache TTL. */\n refresh?: boolean;\n /** How many entries to show. Default 30. */\n limit?: number;\n /** Eagerly load this many pages before showing. Default 1. */\n pages?: number;\n /** Walk all pages of the registry (slow on first run). */\n all?: boolean;\n}\n\nexport interface McpSearchOptions {\n json?: boolean;\n refresh?: boolean;\n limit?: number;\n /** Cap how many pages to walk while searching. Default 20. */\n maxPages?: number;\n}\n\nexport interface McpInstallOptions {\n refresh?: boolean;\n /** Cap how many pages to walk while looking for the name. Default 30. */\n maxPages?: number;\n}\n\nfunction rankEntries(entries: RegistryEntry[]): RegistryEntry[] {\n return [...entries].sort((a, b) => {\n const ap = a.popularity ?? -1;\n const bp = b.popularity ?? -1;\n if (ap !== bp) return bp - ap;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction pad(s: string, width: number): string {\n return s.length >= width ? s : s + \" \".repeat(width - s.length);\n}\n\nfunction fmtAge(ms: number): string {\n const sec = Math.floor(ms / 1000);\n if (sec < 60) return `${sec}s ago`;\n if (sec < 3600) return `${Math.floor(sec / 60)}m ago`;\n if (sec < 86400) return `${Math.floor(sec / 3600)}h ago`;\n return `${Math.floor(sec / 86400)}d ago`;\n}\n\nfunction printEntry(e: RegistryEntry, indent = \" \"): void {\n const tag =\n e.source === \"official\" ? \"[official]\" : e.source === \"smithery\" ? \"[smithery]\" : \"[local]\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()} uses` : \"\";\n console.log(`${indent}${pad(e.name, 36)} ${tag}${pop}`);\n if (e.description) console.log(`${indent} ${e.description}`);\n if (e.install?.requiredEnv?.length) {\n console.log(`${indent} needs: ${e.install.requiredEnv.join(\", \")}`);\n } else if (!e.install) {\n console.log(`${indent} (smithery listing — install detail fetched lazily on install)`);\n }\n}\n\nexport async function mcpListCommand(opts: McpListOptions = {}): Promise<void> {\n if (opts.local) {\n if (opts.json) {\n console.log(JSON.stringify(MCP_CATALOG, null, 2));\n return;\n }\n console.log(t(\"mcpCli.bundledCatalog\"));\n console.log(\"\");\n for (const entry of MCP_CATALOG) {\n console.log(` ${pad(entry.name, 12)} ${entry.summary}`);\n console.log(` ${mcpCommandFor(entry)}`);\n if (entry.note) console.log(` · ${entry.note}`);\n console.log(\"\");\n }\n return;\n }\n\n const handle = await openRegistry({ noCache: opts.refresh, onProgress: progressToStderr });\n const wantedPages = opts.all ? Number.POSITIVE_INFINITY : (opts.pages ?? 1);\n const additional = Math.max(0, wantedPages - handle.cache.pagination.pagesLoaded);\n if (additional > 0) {\n await loadMorePages(handle, {\n pages: additional,\n onProgress: progressToStderr,\n });\n }\n finishProgressLine();\n\n const result = handleToFetchResult(handle);\n const ranked = rankEntries(result.entries);\n const limit = opts.limit ?? DEFAULT_LIST_LIMIT;\n const shown = ranked.slice(0, limit);\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n source: result.source,\n fromCache: result.fromCache,\n fetchedAt: result.fetchedAt,\n loaded: result.entries.length,\n hasMore: result.hasMore,\n entries: shown,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const ageStr = result.fromCache\n ? t(\"mcpCli.cachedAge\", { age: fmtAge(Date.now() - result.fetchedAt) })\n : t(\"mcpCli.justFetched\");\n const moreStr = result.hasMore ? t(\"mcpCli.moreAvailable\") : t(\"mcpCli.allLoaded\");\n console.log(\n `MCP servers from ${result.source} registry (${result.entries.length} loaded, ${moreStr}, ${ageStr}):`,\n );\n if (result.errors.length > 0) {\n for (const e of result.errors) console.error(` warn: ${e}`);\n }\n console.log(\"\");\n for (const e of shown) printEntry(e);\n if (ranked.length > limit) {\n console.log(t(\"mcpCli.moreLoaded\", { count: ranked.length - limit }));\n }\n if (result.hasMore) {\n console.log(t(\"mcpCli.morePagesAvailable\"));\n }\n console.log(\"\");\n console.log(t(\"mcpCli.installHint\"));\n}\n\nfunction matchFilter(query: string): (e: RegistryEntry) => boolean {\n const q = query.toLowerCase();\n return (e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q);\n}\n\nexport async function mcpSearchCommand(query: string, opts: McpSearchOptions = {}): Promise<void> {\n const q = query.trim();\n if (!q) {\n console.error(t(\"mcpCli.usageSearch\"));\n process.exit(1);\n }\n const handle = await openRegistry({ noCache: opts.refresh, onProgress: progressToStderr });\n const filter = matchFilter(q);\n const limit = opts.limit ?? DEFAULT_LIST_LIMIT;\n const cap = opts.maxPages ?? SEARCH_PAGE_CAP;\n\n await loadMorePages(handle, {\n pages: Math.max(0, cap - handle.cache.pagination.pagesLoaded),\n matchTarget: limit,\n filter,\n onProgress: progressToStderr,\n });\n finishProgressLine();\n\n const result = handleToFetchResult(handle);\n const matches = rankEntries(result.entries.filter(filter));\n const shown = matches.slice(0, limit);\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n query: q,\n source: result.source,\n loaded: result.entries.length,\n hasMore: result.hasMore,\n matches: matches.length,\n entries: shown,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (shown.length === 0) {\n console.log(\n t(\"mcpCli.noMatchesFor\", { q, count: result.entries.length, source: result.source }),\n );\n return;\n }\n console.log(\n t(\"mcpCli.matchCount\", {\n count: matches.length,\n q,\n source: result.source,\n loaded: result.entries.length,\n }),\n );\n console.log(\"\");\n for (const e of shown) printEntry(e);\n if (matches.length > limit)\n console.log(t(\"mcpCli.moreMatches\", { count: matches.length - limit }));\n}\n\nfunction findEntry(entries: RegistryEntry[], name: string): RegistryEntry | null {\n const exact = entries.find((e) => e.name === name);\n if (exact) return exact;\n const lower = name.toLowerCase();\n const ci = entries.find((e) => e.name.toLowerCase() === lower);\n if (ci) return ci;\n const tail = entries.find((e) => e.name.toLowerCase().endsWith(`/${lower}`));\n if (tail) return tail;\n return null;\n}\n\nexport async function mcpInstallCommand(name: string, opts: McpInstallOptions = {}): Promise<void> {\n const target = name.trim();\n if (!target) {\n console.error(t(\"mcpCli.usageInstall\"));\n process.exit(1);\n }\n\n const handle = await openRegistry({ noCache: opts.refresh, onProgress: progressToStderr });\n const lower = target.toLowerCase();\n const filter = (e: RegistryEntry): boolean => {\n const n = e.name.toLowerCase();\n return n === lower || n.endsWith(`/${lower}`) || n.includes(lower);\n };\n const cap = opts.maxPages ?? INSTALL_PAGE_CAP;\n\n await loadMorePages(handle, {\n pages: Math.max(0, cap - handle.cache.pagination.pagesLoaded),\n matchTarget: 1,\n filter,\n onProgress: progressToStderr,\n });\n finishProgressLine();\n\n const entry = findEntry(handle.cache.entries, target);\n if (!entry) {\n console.error(\n t(\"mcpCli.noServerFound\", {\n target,\n pages: handle.cache.pagination.pagesLoaded,\n source: handle.source,\n }),\n );\n if (handle.cache.pagination.nextCursor !== null) {\n console.error(t(\"mcpCli.noServerTryMore\", { target }));\n }\n process.exit(1);\n }\n\n if (!entry.install && entry.source === \"smithery\") {\n process.stderr.write(`▸ fetching smithery install detail for ${entry.name}…\\n`);\n const fetched = await fetchSmitheryDetail(entry.name);\n if (fetched) entry.install = fetched;\n }\n\n if (!entry.install) {\n console.error(t(\"mcpCli.noInstallMeta\", { name: entry.name }));\n process.exit(1);\n }\n\n let spec: string;\n try {\n spec = specStringFor(entry.name, entry.install);\n } catch (err) {\n console.error(\n t(\"mcpCli.buildSpecFailed\", { name: entry.name, message: (err as Error).message }),\n );\n process.exit(1);\n }\n\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n console.log(t(\"mcpCli.alreadyInstalled\", { spec }));\n return;\n }\n const next = { ...cfg, mcp: [...existing, spec] };\n writeConfig(next);\n\n console.log(t(\"mcpCli.installed\", { spec: entry.name }));\n console.log(` spec: ${spec}`);\n const installedName = parseInstalledName(spec);\n if (entry.install.requiredEnv?.length) {\n console.log(` needs: ${entry.install.requiredEnv.join(\", \")}`);\n console.log(\" Either export these before launching, or add them to config:\");\n console.log(` mcpEnv.${installedName ?? entry.name} = { ... }`);\n console.log(\n ` (edit ${defaultConfigPath()} — values merge over process.env at spawn)`,\n );\n }\n console.log(\"\");\n console.log(\n \"Use it: reasonix chat (or `reasonix code`) — the server will be bridged automatically.\",\n );\n}\n\nfunction parseInstalledName(spec: string): string | null {\n const match = /^([a-zA-Z_][a-zA-Z0-9_-]*)=/.exec(spec);\n return match ? match[1]! : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,qBAAqB;AAE3B,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AAEzB,IAAM,mBAAkC,CAAC,EAAE,QAAQ,MAAM,QAAQ,MAAM;AACrE,MAAI,SAAS,KAAK,OAAO,MAAM,GAAG;AAChC,YAAQ,OAAO,MAAM,qBAAgB,MAAM,uBAAoB,IAAI,SAAM,OAAO,UAAU;AAAA,EAC5F;AACF;AAEA,SAAS,qBAA2B;AAClC,MAAI,QAAQ,OAAO,MAAO,SAAQ,OAAO,MAAM,UAAU;AAAA,MACpD,SAAQ,OAAO,MAAM,IAAI;AAChC;AA8BA,SAAS,YAAY,SAA2C;AAC9D,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,KAAK,EAAE,cAAc;AAC3B,UAAM,KAAK,EAAE,cAAc;AAC3B,QAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,IAAI,GAAW,OAAuB;AAC7C,SAAO,EAAE,UAAU,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,EAAE,MAAM;AAChE;AAEA,SAAS,OAAO,IAAoB;AAClC,QAAM,MAAM,KAAK,MAAM,KAAK,GAAI;AAChC,MAAI,MAAM,GAAI,QAAO,GAAG,GAAG;AAC3B,MAAI,MAAM,KAAM,QAAO,GAAG,KAAK,MAAM,MAAM,EAAE,CAAC;AAC9C,MAAI,MAAM,MAAO,QAAO,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC;AACjD,SAAO,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC;AACnC;AAEA,SAAS,WAAW,GAAkB,SAAS,MAAY;AACzD,QAAM,MACJ,EAAE,WAAW,aAAa,eAAe,EAAE,WAAW,aAAa,eAAe;AACpF,QAAM,MAAM,EAAE,eAAe,SAAY,SAAM,EAAE,WAAW,eAAe,CAAC,UAAU;AACtF,UAAQ,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE;AACtD,MAAI,EAAE,YAAa,SAAQ,IAAI,GAAG,MAAM,OAAO,EAAE,WAAW,EAAE;AAC9D,MAAI,EAAE,SAAS,aAAa,QAAQ;AAClC,YAAQ,IAAI,GAAG,MAAM,cAAc,EAAE,QAAQ,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACvE,WAAW,CAAC,EAAE,SAAS;AACrB,YAAQ,IAAI,GAAG,MAAM,wEAAmE;AAAA,EAC1F;AACF;AAEA,eAAsB,eAAe,OAAuB,CAAC,GAAkB;AAC7E,MAAI,KAAK,OAAO;AACd,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAChD;AAAA,IACF;AACA,YAAQ,IAAI,EAAE,uBAAuB,CAAC;AACtC,YAAQ,IAAI,EAAE;AACd,eAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,KAAK,IAAI,MAAM,MAAM,EAAE,CAAC,IAAI,MAAM,OAAO,EAAE;AACvD,cAAQ,IAAI,kBAAkB,cAAc,KAAK,CAAC,EAAE;AACpD,UAAI,MAAM,KAAM,SAAQ,IAAI,uBAAoB,MAAM,IAAI,EAAE;AAC5D,cAAQ,IAAI,EAAE;AAAA,IAChB;AACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,cAAc,KAAK,MAAM,OAAO,oBAAqB,KAAK,SAAS;AACzE,QAAM,aAAa,KAAK,IAAI,GAAG,cAAc,OAAO,MAAM,WAAW,WAAW;AAChF,MAAI,aAAa,GAAG;AAClB,UAAM,cAAc,QAAQ;AAAA,MAC1B,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,qBAAmB;AAEnB,QAAM,SAAS,oBAAoB,MAAM;AACzC,QAAM,SAAS,YAAY,OAAO,OAAO;AACzC,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;AAEnC,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO,QAAQ;AAAA,UACvB,SAAS,OAAO;AAAA,UAChB,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,YAClB,EAAE,oBAAoB,EAAE,KAAK,OAAO,KAAK,IAAI,IAAI,OAAO,SAAS,EAAE,CAAC,IACpE,EAAE,oBAAoB;AAC1B,QAAM,UAAU,OAAO,UAAU,EAAE,sBAAsB,IAAI,EAAE,kBAAkB;AACjF,UAAQ;AAAA,IACN,oBAAoB,OAAO,MAAM,cAAc,OAAO,QAAQ,MAAM,YAAY,OAAO,KAAK,MAAM;AAAA,EACpG;AACA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,eAAW,KAAK,OAAO,OAAQ,SAAQ,MAAM,WAAW,CAAC,EAAE;AAAA,EAC7D;AACA,UAAQ,IAAI,EAAE;AACd,aAAW,KAAK,MAAO,YAAW,CAAC;AACnC,MAAI,OAAO,SAAS,OAAO;AACzB,YAAQ,IAAI,EAAE,qBAAqB,EAAE,OAAO,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,EACtE;AACA,MAAI,OAAO,SAAS;AAClB,YAAQ,IAAI,EAAE,2BAA2B,CAAC;AAAA,EAC5C;AACA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,EAAE,oBAAoB,CAAC;AACrC;AAEA,SAAS,YAAY,OAA8C;AACjE,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,SAAS,CAAC;AAChF;AAEA,eAAsB,iBAAiB,OAAe,OAAyB,CAAC,GAAkB;AAChG,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,GAAG;AACN,YAAQ,MAAM,EAAE,oBAAoB,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,SAAS,YAAY,CAAC;AAC5B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,MAAM,KAAK,YAAY;AAE7B,QAAM,cAAc,QAAQ;AAAA,IAC1B,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW;AAAA,IAC5D,aAAa;AAAA,IACb;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,qBAAmB;AAEnB,QAAM,SAAS,oBAAoB,MAAM;AACzC,QAAM,UAAU,YAAY,OAAO,QAAQ,OAAO,MAAM,CAAC;AACzD,QAAM,QAAQ,QAAQ,MAAM,GAAG,KAAK;AAEpC,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,OAAO;AAAA,UACP,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO,QAAQ;AAAA,UACvB,SAAS,OAAO;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ;AAAA,MACN,EAAE,uBAAuB,EAAE,GAAG,OAAO,OAAO,QAAQ,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAAA,IACrF;AACA;AAAA,EACF;AACA,UAAQ;AAAA,IACN,EAAE,qBAAqB;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AACA,UAAQ,IAAI,EAAE;AACd,aAAW,KAAK,MAAO,YAAW,CAAC;AACnC,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,EAAE,sBAAsB,EAAE,OAAO,QAAQ,SAAS,MAAM,CAAC,CAAC;AAC1E;AAEA,SAAS,UAAU,SAA0B,MAAoC;AAC/E,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,MAAI,MAAO,QAAO;AAClB,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK;AAC7D,MAAI,GAAI,QAAO;AACf,QAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,EAAE,SAAS,IAAI,KAAK,EAAE,CAAC;AAC3E,MAAI,KAAM,QAAO;AACjB,SAAO;AACT;AAEA,eAAsB,kBAAkB,MAAc,OAA0B,CAAC,GAAkB;AACjG,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,EAAE,qBAAqB,CAAC;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,SAAS,CAAC,MAA8B;AAC5C,UAAM,IAAI,EAAE,KAAK,YAAY;AAC7B,WAAO,MAAM,SAAS,EAAE,SAAS,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,KAAK;AAAA,EACnE;AACA,QAAM,MAAM,KAAK,YAAY;AAE7B,QAAM,cAAc,QAAQ;AAAA,IAC1B,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW;AAAA,IAC5D,aAAa;AAAA,IACb;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,qBAAmB;AAEnB,QAAM,QAAQ,UAAU,OAAO,MAAM,SAAS,MAAM;AACpD,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,EAAE,wBAAwB;AAAA,QACxB;AAAA,QACA,OAAO,OAAO,MAAM,WAAW;AAAA,QAC/B,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AACA,QAAI,OAAO,MAAM,WAAW,eAAe,MAAM;AAC/C,cAAQ,MAAM,EAAE,0BAA0B,EAAE,OAAO,CAAC,CAAC;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,WAAW,MAAM,WAAW,YAAY;AACjD,YAAQ,OAAO,MAAM,+CAA0C,MAAM,IAAI;AAAA,CAAK;AAC9E,UAAM,UAAU,MAAM,oBAAoB,MAAM,IAAI;AACpD,QAAI,QAAS,OAAM,UAAU;AAAA,EAC/B;AAEA,MAAI,CAAC,MAAM,SAAS;AAClB,YAAQ,MAAM,EAAE,wBAAwB,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,cAAc,MAAM,MAAM,MAAM,OAAO;AAAA,EAChD,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN,EAAE,0BAA0B,EAAE,MAAM,MAAM,MAAM,SAAU,IAAc,QAAQ,CAAC;AAAA,IACnF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,WAAW;AACvB,QAAM,WAAW,IAAI,OAAO,CAAC;AAC7B,MAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,YAAQ,IAAI,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC;AAClD;AAAA,EACF;AACA,QAAM,OAAO,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,UAAU,IAAI,EAAE;AAChD,cAAY,IAAI;AAEhB,UAAQ,IAAI,EAAE,oBAAoB,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;AACvD,UAAQ,IAAI,cAAc,IAAI,EAAE;AAChC,QAAM,gBAAgB,mBAAmB,IAAI;AAC7C,MAAI,MAAM,QAAQ,aAAa,QAAQ;AACrC,YAAQ,IAAI,cAAc,MAAM,QAAQ,YAAY,KAAK,IAAI,CAAC,EAAE;AAChE,YAAQ,IAAI,yEAAyE;AACrF,YAAQ,IAAI,uBAAuB,iBAAiB,MAAM,IAAI,YAAY;AAC1E,YAAQ;AAAA,MACN,oBAAoB,kBAAkB,CAAC;AAAA,IACzC;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAA6B;AACvD,QAAM,QAAQ,8BAA8B,KAAK,IAAI;AACrD,SAAO,QAAQ,MAAM,CAAC,IAAK;AAC7B;","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  require_react,
11
11
  use_app_default,
12
12
  use_input_default
13
- } from "./chunk-X53B3JIX.js";
13
+ } from "./chunk-7X4JJOO7.js";
14
14
  import {
15
15
  loadDotenv
16
16
  } from "./chunk-2UQP6H6T.js";
@@ -23,7 +23,7 @@ import "./chunk-PLHAZOLZ.js";
23
23
  import {
24
24
  readConfig,
25
25
  writeConfig
26
- } from "./chunk-CDVSFSAK.js";
26
+ } from "./chunk-WMTMMSXU.js";
27
27
  import {
28
28
  __toESM
29
29
  } from "./chunk-TUK7OWJA.js";
@@ -175,4 +175,4 @@ async function mcpBrowseCommand(_opts = {}) {
175
175
  export {
176
176
  mcpBrowseCommand
177
177
  };
178
- //# sourceMappingURL=mcp-browse-LA4I4YIZ.js.map
178
+ //# sourceMappingURL=mcp-browse-C3GXVMYZ.js.map
@@ -14,7 +14,7 @@ import {
14
14
  overlayMatchedSpec,
15
15
  parseMcpSpec,
16
16
  readConfig
17
- } from "./chunk-CDVSFSAK.js";
17
+ } from "./chunk-WMTMMSXU.js";
18
18
  import "./chunk-XXC2BYTV.js";
19
19
  import "./chunk-TUK7OWJA.js";
20
20
 
@@ -145,4 +145,4 @@ export {
145
145
  formatMcpInspectFailure,
146
146
  mcpInspectCommand
147
147
  };
148
- //# sourceMappingURL=mcp-inspect-LWXXU7BY.js.map
148
+ //# sourceMappingURL=mcp-inspect-ZMYUNFDS.js.map
@@ -4,13 +4,14 @@ import {
4
4
  CODE_SYSTEM_PROMPT,
5
5
  codeSystemBase,
6
6
  codeSystemPrompt
7
- } from "./chunk-2QSTA2QV.js";
8
- import "./chunk-FY4S7TJZ.js";
9
- import "./chunk-CDVSFSAK.js";
7
+ } from "./chunk-O5LIHAMP.js";
8
+ import "./chunk-JNTMOX7G.js";
9
+ import "./chunk-YEF7C4XI.js";
10
+ import "./chunk-WMTMMSXU.js";
10
11
  import "./chunk-TUK7OWJA.js";
11
12
  export {
12
13
  CODE_SYSTEM_PROMPT,
13
14
  codeSystemBase,
14
15
  codeSystemPrompt
15
16
  };
16
- //# sourceMappingURL=prompt-RKZD4X6Y.js.map
17
+ //# sourceMappingURL=prompt-MC3U5KRP.js.map
@@ -4,36 +4,40 @@ import {
4
4
  listSessions,
5
5
  pruneStaleSessions
6
6
  } from "./chunk-RRXUIPWG.js";
7
+ import {
8
+ t
9
+ } from "./chunk-YEF7C4XI.js";
10
+ import "./chunk-WMTMMSXU.js";
7
11
  import "./chunk-TUK7OWJA.js";
8
12
 
9
13
  // src/cli/commands/prune-sessions.ts
10
14
  function pruneSessionsCommand(opts) {
11
15
  const days = opts.days ?? 90;
12
16
  if (!Number.isFinite(days) || days < 1) {
13
- console.error(`--days must be a positive integer (got ${days}).`);
17
+ console.error(t("sessions.daysInvalid", { days }));
14
18
  process.exit(1);
15
19
  }
16
20
  if (opts.dryRun) {
17
21
  const cutoff = Date.now() - days * 24 * 60 * 60 * 1e3;
18
22
  const stale = listSessions().filter((s) => s.mtime.getTime() < cutoff);
19
23
  if (stale.length === 0) {
20
- console.log(`no sessions idle \u2265${days} days. Nothing would be pruned.`);
24
+ console.log(t("sessions.noIdleSessions", { days }));
21
25
  return;
22
26
  }
23
- console.log(`would prune ${stale.length} session(s) idle \u2265${days} days:`);
27
+ console.log(t("sessions.wouldPrune", { count: stale.length, days }));
24
28
  for (const s of stale) {
25
29
  console.log(` ${s.name}`);
26
30
  }
27
31
  console.log("");
28
- console.log("re-run without --dry-run to actually delete.");
32
+ console.log(t("sessions.dryRunHint"));
29
33
  return;
30
34
  }
31
35
  const removed = pruneStaleSessions(days);
32
36
  if (removed.length === 0) {
33
- console.log(`no sessions idle \u2265${days} days. Nothing pruned.`);
37
+ console.log(t("sessions.noIdleSessions", { days }));
34
38
  return;
35
39
  }
36
- console.log(`pruned ${removed.length} session(s) idle \u2265${days} days:`);
40
+ console.log(t("sessions.prunedCount", { count: removed.length, days }));
37
41
  for (const name of removed) {
38
42
  console.log(` ${name}`);
39
43
  }
@@ -41,4 +45,4 @@ function pruneSessionsCommand(opts) {
41
45
  export {
42
46
  pruneSessionsCommand
43
47
  };
44
- //# sourceMappingURL=prune-sessions-SEWX7GP6.js.map
48
+ //# sourceMappingURL=prune-sessions-OEPFH4N6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/prune-sessions.ts"],"sourcesContent":["import { t } from \"../../i18n/index.js\";\nimport { listSessions, pruneStaleSessions } from \"../../memory/session.js\";\n\nexport interface PruneSessionsOptions {\n days?: number;\n dryRun?: boolean;\n}\n\nexport function pruneSessionsCommand(opts: PruneSessionsOptions): void {\n const days = opts.days ?? 90;\n if (!Number.isFinite(days) || days < 1) {\n console.error(t(\"sessions.daysInvalid\", { days }));\n process.exit(1);\n }\n if (opts.dryRun) {\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;\n const stale = listSessions().filter((s) => s.mtime.getTime() < cutoff);\n if (stale.length === 0) {\n console.log(t(\"sessions.noIdleSessions\", { days }));\n return;\n }\n console.log(t(\"sessions.wouldPrune\", { count: stale.length, days }));\n for (const s of stale) {\n console.log(` ${s.name}`);\n }\n console.log(\"\");\n console.log(t(\"sessions.dryRunHint\"));\n return;\n }\n const removed = pruneStaleSessions(days);\n if (removed.length === 0) {\n console.log(t(\"sessions.noIdleSessions\", { days }));\n return;\n }\n console.log(t(\"sessions.prunedCount\", { count: removed.length, days }));\n for (const name of removed) {\n console.log(` ${name}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAQO,SAAS,qBAAqB,MAAkC;AACrE,QAAM,OAAO,KAAK,QAAQ;AAC1B,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG;AACtC,YAAQ,MAAM,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,KAAK;AAClD,UAAM,QAAQ,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,QAAQ,IAAI,MAAM;AACrE,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC;AAClD;AAAA,IACF;AACA,YAAQ,IAAI,EAAE,uBAAuB,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC,CAAC;AACnE,eAAW,KAAK,OAAO;AACrB,cAAQ,IAAI,KAAK,EAAE,IAAI,EAAE;AAAA,IAC3B;AACA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,EAAE,qBAAqB,CAAC;AACpC;AAAA,EACF;AACA,QAAM,UAAU,mBAAmB,IAAI;AACvC,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC;AAClD;AAAA,EACF;AACA,UAAQ,IAAI,EAAE,wBAAwB,EAAE,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC;AACtE,aAAW,QAAQ,SAAS;AAC1B,YAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACzB;AACF;","names":[]}
@@ -2,21 +2,21 @@
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
4
  RecordView
5
- } from "./chunk-I4M5QJNL.js";
5
+ } from "./chunk-JGTX4RRQ.js";
6
6
  import {
7
7
  Bar,
8
8
  ChromeRule,
9
9
  stringWidth
10
- } from "./chunk-TKVXTQ3T.js";
10
+ } from "./chunk-3ZZXQ3CZ.js";
11
11
  import {
12
12
  computeCumulativeStats,
13
13
  groupRecordsByTurn,
14
14
  replayFromFile
15
- } from "./chunk-MRZG4GBF.js";
15
+ } from "./chunk-7JTKBJ2G.js";
16
16
  import {
17
17
  COLOR,
18
18
  GRADIENT
19
- } from "./chunk-RUDBUHO4.js";
19
+ } from "./chunk-PXBQ6IZ7.js";
20
20
  import {
21
21
  Box_default,
22
22
  Static,
@@ -26,17 +26,17 @@ import {
26
26
  use_app_default,
27
27
  use_input_default,
28
28
  use_stdout_default
29
- } from "./chunk-X53B3JIX.js";
30
- import "./chunk-TE5UIIFL.js";
29
+ } from "./chunk-7X4JJOO7.js";
30
+ import "./chunk-J2IHQGPQ.js";
31
31
  import "./chunk-25T6CVUP.js";
32
- import "./chunk-OG5JANQ4.js";
32
+ import "./chunk-QX5TWXRZ.js";
33
33
  import {
34
34
  t
35
- } from "./chunk-YW63N3ZR.js";
35
+ } from "./chunk-YEF7C4XI.js";
36
36
  import {
37
37
  formatBalance,
38
38
  formatCost
39
- } from "./chunk-CDVSFSAK.js";
39
+ } from "./chunk-WMTMMSXU.js";
40
40
  import {
41
41
  __toESM
42
42
  } from "./chunk-TUK7OWJA.js";
@@ -288,4 +288,4 @@ function oneLine(s, max = 200) {
288
288
  export {
289
289
  replayCommand
290
290
  };
291
- //# sourceMappingURL=replay-2X7MVXOI.js.map
291
+ //# sourceMappingURL=replay-4TP7ZUMZ.js.map
@@ -3,7 +3,7 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  formatMcpLifecycleEvent,
5
5
  formatMcpSlowToast
6
- } from "./chunk-3WGTGXO4.js";
6
+ } from "./chunk-GNS7BAT2.js";
7
7
  import {
8
8
  buildTransportFromSpec,
9
9
  preflightStdioSpec
@@ -13,46 +13,47 @@ import {
13
13
  ImmutablePrefix,
14
14
  ToolRegistry,
15
15
  bridgeMcpTools
16
- } from "./chunk-OPYALNTT.js";
17
- import "./chunk-5OHHAQ4W.js";
16
+ } from "./chunk-MQWO32ZD.js";
17
+ import "./chunk-7AST3QQ3.js";
18
18
  import {
19
19
  openTranscriptFile,
20
20
  recordFromLoopEvent,
21
21
  writeRecord
22
- } from "./chunk-MRZG4GBF.js";
22
+ } from "./chunk-7JTKBJ2G.js";
23
23
  import {
24
24
  McpClient
25
25
  } from "./chunk-HIYTRCSW.js";
26
- import "./chunk-2QSTA2QV.js";
26
+ import "./chunk-O5LIHAMP.js";
27
27
  import "./chunk-6OWJV3YW.js";
28
28
  import {
29
29
  DeepSeekClient
30
- } from "./chunk-TE5UIIFL.js";
30
+ } from "./chunk-J2IHQGPQ.js";
31
31
  import "./chunk-25T6CVUP.js";
32
32
  import {
33
33
  loadDotenv
34
34
  } from "./chunk-2UQP6H6T.js";
35
- import "./chunk-WZGNXR6E.js";
36
- import "./chunk-FY4S7TJZ.js";
37
- import "./chunk-NMQSUNLB.js";
35
+ import "./chunk-ZWHSHFDP.js";
36
+ import "./chunk-JNTMOX7G.js";
37
+ import "./chunk-PB3MAFEI.js";
38
38
  import "./chunk-S4XVGLRW.js";
39
39
  import "./chunk-RRXUIPWG.js";
40
40
  import {
41
41
  appendUsage
42
- } from "./chunk-JMDE6IO3.js";
43
- import "./chunk-OG5JANQ4.js";
42
+ } from "./chunk-ZAEJWKXB.js";
43
+ import "./chunk-QX5TWXRZ.js";
44
44
  import {
45
45
  t
46
- } from "./chunk-YW63N3ZR.js";
46
+ } from "./chunk-YEF7C4XI.js";
47
47
  import {
48
48
  defaultConfigPath,
49
49
  isPlausibleKey,
50
50
  loadApiKey,
51
51
  loadBaseUrl,
52
+ loadToolRateLimit,
52
53
  normalizeMcpConfig,
53
54
  readConfig,
54
55
  saveApiKey
55
- } from "./chunk-CDVSFSAK.js";
56
+ } from "./chunk-WMTMMSXU.js";
56
57
  import "./chunk-XXC2BYTV.js";
57
58
  import "./chunk-TUK7OWJA.js";
58
59
 
@@ -101,7 +102,7 @@ async function runCommand(opts) {
101
102
  let tools;
102
103
  let successCount = 0;
103
104
  if (normalizedSpecs.length > 0) {
104
- tools = new ToolRegistry();
105
+ tools = new ToolRegistry({ rateLimit: loadToolRateLimit() });
105
106
  for (const spec of normalizedSpecs) {
106
107
  let label = "anon";
107
108
  let mcp;
@@ -217,4 +218,4 @@ transcript: ${opts.transcript}
217
218
  export {
218
219
  runCommand
219
220
  };
220
- //# sourceMappingURL=run-TPKXIJ27.js.map
221
+ //# sourceMappingURL=run-6MXQYBOE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/run.ts"],"sourcesContent":["import type { WriteStream } from \"node:fs\";\nimport { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n loadBaseUrl,\n loadToolRateLimit,\n normalizeMcpConfig,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { t } from \"../../i18n/index.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { buildTransportFromSpec } from \"../../mcp/transport-from-spec.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n budgetUsd?: number;\n /** JSONL transcript path — lets `reasonix replay` / `diff` audit this run. */\n transcript?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: string;\n}\n\nasync function ensureApiKey(): Promise<string> {\n const existing = loadApiKey();\n if (existing) return existing;\n\n if (!stdin.isTTY) {\n process.stderr.write(t(\"run.missingApiKey\"));\n process.exit(1);\n }\n\n process.stdout.write(\n \"DeepSeek API key not configured.\\nGet one at https://platform.deepseek.com/api_keys\\n\",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n const answer = (await rl.question(\"API key › \")).trim();\n if (!answer) continue;\n if (!isPlausibleKey(answer)) {\n process.stdout.write(\"Key looks too short. Paste the full token (16+ chars, no spaces).\\n\");\n continue;\n }\n saveApiKey(answer);\n process.stdout.write(`Saved to ${defaultConfigPath()}\\n\\n`);\n return answer;\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n loadDotenv();\n const apiKey = await ensureApiKey();\n process.env.DEEPSEEK_API_KEY = apiKey;\n\n // Optional MCP setup — mirrors chat's flow. Must happen before loop\n // construction so the tools make it into the prefix.\n const cfg = readConfig();\n const normalizedSpecs = normalizeMcpConfig(\n cfg,\n opts.mcp && opts.mcp.length > 0 ? opts.mcp : undefined,\n );\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n if (normalizedSpecs.length > 0) {\n tools = new ToolRegistry({ rateLimit: loadToolRateLimit() });\n for (const spec of normalizedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n label = spec.name ?? \"anon\";\n if (spec.disabled) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n continue;\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const prefix = spec.name\n ? `${spec.name}_`\n : normalizedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport = buildTransportFromSpec(spec);\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix: prefix,\n serverName: label,\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n ms: Date.now() - t0,\n })}\\n`,\n );\n clients.push(mcp);\n successCount++;\n } catch (err) {\n // Non-fatal — skip and continue, same as `reasonix chat`. A\n // one-shot `run` invocation with a broken MCP server otherwise\n // fails the whole run over a side-concern tool the task might\n // not even touch.\n await mcp?.close().catch(() => undefined);\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason: (err as Error).message })}\\n ${t(\"mcpLifecycle.failedSetupConfigHint\")}\\n`,\n );\n }\n }\n if (successCount === 0) tools = undefined;\n }\n\n const client = new DeepSeekClient({ baseUrl: loadBaseUrl() });\n const prefix = new ImmutablePrefix({\n system: opts.system,\n toolSpecs: tools?.specs(),\n });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model: opts.model,\n budgetUsd: opts.budgetUsd,\n });\n const prefixHash = prefix.fingerprint;\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix run\",\n model: opts.model,\n startedAt: new Date().toISOString(),\n });\n // Also persist the user turn itself (the loop's event stream starts with\n // assistant output, not the prompt we're about to send).\n writeRecord(transcriptStream, {\n ts: new Date().toISOString(),\n turn: 1,\n role: \"user\",\n content: opts.task,\n });\n }\n\n try {\n for await (const ev of loop.step(opts.task)) {\n if (ev.role === \"assistant_delta\" && ev.content) process.stdout.write(ev.content);\n if (ev.role === \"tool\") process.stdout.write(`\\n[tool ${ev.toolName}] ${ev.content}\\n`);\n if (ev.role === \"error\") process.stderr.write(`\\n[error] ${ev.error}\\n`);\n if (ev.role === \"done\") process.stdout.write(\"\\n\");\n if (ev.role === \"assistant_final\" && ev.stats?.usage) {\n // `reasonix run` is often used in CI / scripting — we want\n // those turns to show up in `reasonix stats` too so the\n // dashboard reflects all DeepSeek spend, not just TUI sessions.\n appendUsage({ session: null, model: ev.stats.model, usage: ev.stats.usage });\n }\n // Persist every non-streaming event — deltas would flood the file and\n // aren't useful for replay (replay renders final content, not keystrokes).\n if (transcriptStream && ev.role !== \"assistant_delta\") {\n writeRecord(transcriptStream, recordFromLoopEvent(ev, { model: opts.model, prefixHash }));\n }\n }\n } finally {\n transcriptStream?.end();\n }\n\n const s = loop.stats.summary();\n process.stdout.write(\n `\\n— turns:${s.turns} cache:${(s.cacheHitRatio * 100).toFixed(1)}% ` +\n `cost:$${s.totalCostUsd.toFixed(6)} save-vs-claude:${s.savingsVsClaudePct.toFixed(1)}%\\n`,\n );\n if (opts.transcript) {\n process.stdout.write(`\\ntranscript: ${opts.transcript}\\n`);\n process.stdout.write(` → npx reasonix replay ${opts.transcript}\\n`);\n }\n\n for (const c of clients) await c.close();\n}\n"],"mappings":"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","names":["prefix"]}