reasonix 0.37.0 → 0.38.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 (74) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dist/cli/{chat-7257YAPG.js → chat-FPEYKTMI.js} +13 -14
  4. package/dist/cli/{chunk-T52GAWPP.js → chunk-3VTV4WAH.js} +2 -2
  5. package/dist/cli/{chunk-MSKUP6PD.js → chunk-4PNXH2MH.js} +910 -659
  6. package/dist/cli/chunk-4PNXH2MH.js.map +1 -0
  7. package/dist/cli/{chunk-YER7WCHF.js → chunk-A63QT566.js} +24 -10
  8. package/dist/cli/chunk-A63QT566.js.map +1 -0
  9. package/dist/cli/{chunk-4Q3GRJIU.js → chunk-AATCLE5N.js} +2 -2
  10. package/dist/cli/{chunk-BHLHOS5Y.js → chunk-BW2HWSYH.js} +315 -5
  11. package/dist/cli/chunk-BW2HWSYH.js.map +1 -0
  12. package/dist/cli/{chunk-ZJR4QLXB.js → chunk-FB46F6H4.js} +2 -2
  13. package/dist/cli/{chunk-GKZJXYMY.js → chunk-FYKZB6TX.js} +415 -11
  14. package/dist/cli/chunk-FYKZB6TX.js.map +1 -0
  15. package/dist/cli/{chunk-XQIFIB3U.js → chunk-JOFZ6AW5.js} +2 -2
  16. package/dist/cli/{chunk-JGZKTAOH.js → chunk-LMNAMITH.js} +2 -2
  17. package/dist/cli/{chunk-S4GF3HPO.js → chunk-LY352GTC.js} +6 -4
  18. package/dist/cli/chunk-LY352GTC.js.map +1 -0
  19. package/dist/cli/{chunk-VF57YX2M.js → chunk-NYP2DDDV.js} +40 -1
  20. package/dist/cli/chunk-NYP2DDDV.js.map +1 -0
  21. package/dist/cli/{chunk-JULZ7JTO.js → chunk-T5U5JO7Q.js} +11 -8
  22. package/dist/cli/chunk-T5U5JO7Q.js.map +1 -0
  23. package/dist/cli/{chunk-SEFXUF24.js → chunk-YJKLNYCP.js} +113 -24
  24. package/dist/cli/chunk-YJKLNYCP.js.map +1 -0
  25. package/dist/cli/{code-64EG5IU2.js → code-GTE65OUT.js} +23 -17
  26. package/dist/cli/{code-64EG5IU2.js.map → code-GTE65OUT.js.map} +1 -1
  27. package/dist/cli/{commands-FE2UDFBC.js → commands-R4JWISND.js} +3 -4
  28. package/dist/cli/{commands-FE2UDFBC.js.map → commands-R4JWISND.js.map} +1 -1
  29. package/dist/cli/{commit-3IAGB22T.js → commit-TQ4DMUNS.js} +2 -3
  30. package/dist/cli/{commit-3IAGB22T.js.map → commit-TQ4DMUNS.js.map} +1 -1
  31. package/dist/cli/{doctor-BW5HSQDW.js → doctor-GGK2JKTA.js} +6 -7
  32. package/dist/cli/index.js +24 -25
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/{mcp-2RDEQST6.js → mcp-M7I23TQ7.js} +2 -3
  35. package/dist/cli/{mcp-2RDEQST6.js.map → mcp-M7I23TQ7.js.map} +1 -1
  36. package/dist/cli/{mcp-browse-VM5GLRBQ.js → mcp-browse-TWO7RYT4.js} +2 -3
  37. package/dist/cli/{mcp-browse-VM5GLRBQ.js.map → mcp-browse-TWO7RYT4.js.map} +1 -1
  38. package/dist/cli/{prompt-KGIUONO3.js → prompt-ODPFOKSH.js} +2 -2
  39. package/dist/cli/{replay-D7RT2DR7.js → replay-R3QRXPI2.js} +13 -9
  40. package/dist/cli/replay-R3QRXPI2.js.map +1 -0
  41. package/dist/cli/{run-RWCOA32G.js → run-WGSPYYOJ.js} +7 -8
  42. package/dist/cli/{run-RWCOA32G.js.map → run-WGSPYYOJ.js.map} +1 -1
  43. package/dist/cli/{server-6ZW4TQUP.js → server-IZPWQYG3.js} +8 -9
  44. package/dist/cli/{server-6ZW4TQUP.js.map → server-IZPWQYG3.js.map} +1 -1
  45. package/dist/cli/{sessions-5ISNWFMU.js → sessions-E4UH5JYL.js} +7 -8
  46. package/dist/cli/{sessions-5ISNWFMU.js.map → sessions-E4UH5JYL.js.map} +1 -1
  47. package/dist/cli/{setup-HJG23NKJ.js → setup-FTZNN3TZ.js} +60 -15
  48. package/dist/cli/setup-FTZNN3TZ.js.map +1 -0
  49. package/dist/cli/{version-BXAN7Q4V.js → version-MDVCFTKA.js} +7 -8
  50. package/dist/cli/{version-BXAN7Q4V.js.map → version-MDVCFTKA.js.map} +1 -1
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.js +568 -40
  53. package/dist/index.js.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/cli/chunk-BHLHOS5Y.js.map +0 -1
  56. package/dist/cli/chunk-GKZJXYMY.js.map +0 -1
  57. package/dist/cli/chunk-JULZ7JTO.js.map +0 -1
  58. package/dist/cli/chunk-MSKUP6PD.js.map +0 -1
  59. package/dist/cli/chunk-S4GF3HPO.js.map +0 -1
  60. package/dist/cli/chunk-SEFXUF24.js.map +0 -1
  61. package/dist/cli/chunk-VF57YX2M.js.map +0 -1
  62. package/dist/cli/chunk-WUI3P4RA.js +0 -319
  63. package/dist/cli/chunk-WUI3P4RA.js.map +0 -1
  64. package/dist/cli/chunk-YER7WCHF.js.map +0 -1
  65. package/dist/cli/replay-D7RT2DR7.js.map +0 -1
  66. package/dist/cli/setup-HJG23NKJ.js.map +0 -1
  67. /package/dist/cli/{chat-7257YAPG.js.map → chat-FPEYKTMI.js.map} +0 -0
  68. /package/dist/cli/{chunk-T52GAWPP.js.map → chunk-3VTV4WAH.js.map} +0 -0
  69. /package/dist/cli/{chunk-4Q3GRJIU.js.map → chunk-AATCLE5N.js.map} +0 -0
  70. /package/dist/cli/{chunk-ZJR4QLXB.js.map → chunk-FB46F6H4.js.map} +0 -0
  71. /package/dist/cli/{chunk-XQIFIB3U.js.map → chunk-JOFZ6AW5.js.map} +0 -0
  72. /package/dist/cli/{chunk-JGZKTAOH.js.map → chunk-LMNAMITH.js.map} +0 -0
  73. /package/dist/cli/{doctor-BW5HSQDW.js.map → doctor-GGK2JKTA.js.map} +0 -0
  74. /package/dist/cli/{prompt-KGIUONO3.js.map → prompt-ODPFOKSH.js.map} +0 -0
package/dist/cli/index.js CHANGED
@@ -2,35 +2,34 @@
2
2
  import {
3
3
  markPhase
4
4
  } from "./chunk-CPOV2O73.js";
5
- import "./chunk-SEFXUF24.js";
5
+ import "./chunk-YJKLNYCP.js";
6
6
  import "./chunk-UNMYFZPZ.js";
7
7
  import "./chunk-XJLZ4HKU.js";
8
8
  import "./chunk-XHQIK7B6.js";
9
9
  import {
10
10
  applyMemoryStack
11
- } from "./chunk-YER7WCHF.js";
11
+ } from "./chunk-A63QT566.js";
12
12
  import {
13
13
  resolvePreset
14
14
  } from "./chunk-MHDNZXJJ.js";
15
15
  import "./chunk-DAEAAVDF.js";
16
16
  import "./chunk-KMWKGPFZ.js";
17
17
  import "./chunk-3Q3C4W66.js";
18
- import "./chunk-S4GF3HPO.js";
18
+ import "./chunk-LY352GTC.js";
19
19
  import {
20
20
  escalationContract
21
21
  } from "./chunk-XOIDSPMQ.js";
22
- import "./chunk-JGZKTAOH.js";
22
+ import "./chunk-LMNAMITH.js";
23
23
  import "./chunk-5X7LZJDE.js";
24
24
  import {
25
25
  listSessions
26
26
  } from "./chunk-6CXT5JRM.js";
27
27
  import {
28
28
  t
29
- } from "./chunk-GKZJXYMY.js";
29
+ } from "./chunk-FYKZB6TX.js";
30
30
  import {
31
31
  readConfig
32
- } from "./chunk-BHLHOS5Y.js";
33
- import "./chunk-WUI3P4RA.js";
32
+ } from "./chunk-BW2HWSYH.js";
34
33
  import "./chunk-ZTLZO42A.js";
35
34
  import "./chunk-ORM6PK57.js";
36
35
  import {
@@ -120,8 +119,8 @@ program.name("reasonix").description(t("cli.description")).version(VERSION).opti
120
119
  program.action(async (opts) => {
121
120
  const cfg = readConfig();
122
121
  if (!cfg.setupCompleted) {
123
- const { setupCommand } = await import("./setup-HJG23NKJ.js");
124
- await setupCommand({});
122
+ const { setupCommand } = await import("./setup-FTZNN3TZ.js");
123
+ await setupCommand({ forceKeyStep: true });
125
124
  return;
126
125
  }
127
126
  const defaults = resolveDefaults({});
@@ -132,7 +131,7 @@ program.action(async (opts) => {
132
131
  (msg) => process.stderr.write(`${msg}
133
132
  `)
134
133
  );
135
- const { chatCommand } = await import("./chat-7257YAPG.js");
134
+ const { chatCommand } = await import("./chat-FPEYKTMI.js");
136
135
  await chatCommand({
137
136
  model: defaults.model,
138
137
  system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),
@@ -142,11 +141,11 @@ program.action(async (opts) => {
142
141
  });
143
142
  });
144
143
  program.command("setup").description(t("cli.setup")).action(async () => {
145
- const { setupCommand } = await import("./setup-HJG23NKJ.js");
146
- await setupCommand({});
144
+ const { setupCommand } = await import("./setup-FTZNN3TZ.js");
145
+ await setupCommand({ forceKeyStep: true });
147
146
  });
148
147
  program.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--no-session", t("ui.noSession")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--no-dashboard", t("ui.noDashboard")).option("--no-alt-screen", "keep chat output in shell scrollback (legacy mode, ghost-prone)").option("--no-mouse", "disable SGR mouse tracking (keeps drag-select 100% native)").option("--system-append <prompt>", t("ui.systemAppendHint")).option("--system-append-file <path>", t("ui.systemAppendFileHint")).action(async (dir, opts) => {
149
- const { codeCommand } = await import("./code-64EG5IU2.js");
148
+ const { codeCommand } = await import("./code-GTE65OUT.js");
150
149
  await codeCommand({
151
150
  dir,
152
151
  model: opts.model,
@@ -182,7 +181,7 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
182
181
  (msg) => process.stderr.write(`${msg}
183
182
  `)
184
183
  );
185
- const { chatCommand } = await import("./chat-7257YAPG.js");
184
+ const { chatCommand } = await import("./chat-FPEYKTMI.js");
186
185
  await chatCommand({
187
186
  model: defaults.model,
188
187
  system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),
@@ -210,7 +209,7 @@ program.command("run <task>").description(t("cli.run")).option("-m, --model <id>
210
209
  preset: opts.preset,
211
210
  noConfig: opts.config === false
212
211
  });
213
- const { runCommand } = await import("./run-RWCOA32G.js");
212
+ const { runCommand } = await import("./run-WGSPYYOJ.js");
214
213
  await runCommand({
215
214
  task,
216
215
  model: defaults.model,
@@ -226,15 +225,15 @@ program.command("stats [transcript]").description(t("cli.stats")).action(async (
226
225
  statsCommand({ transcript });
227
226
  });
228
227
  program.command("doctor").description(t("cli.doctor")).action(async () => {
229
- const { doctorCommand } = await import("./doctor-BW5HSQDW.js");
228
+ const { doctorCommand } = await import("./doctor-GGK2JKTA.js");
230
229
  await doctorCommand();
231
230
  });
232
231
  program.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
233
- const { commitCommand } = await import("./commit-3IAGB22T.js");
232
+ const { commitCommand } = await import("./commit-TQ4DMUNS.js");
234
233
  await commitCommand({ model: opts.model, yes: !!opts.yes });
235
234
  });
236
235
  program.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
237
- const { sessionsCommand } = await import("./sessions-5ISNWFMU.js");
236
+ const { sessionsCommand } = await import("./sessions-E4UH5JYL.js");
238
237
  sessionsCommand({ name, verbose: !!opts.verbose });
239
238
  });
240
239
  program.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
@@ -253,7 +252,7 @@ program.command("events <name>").description(t("cli.events")).option("--type <ty
253
252
  });
254
253
  });
255
254
  program.command("replay <transcript>").description(t("cli.replay")).option("--print", t("ui.printHint")).option("--head <n>", t("ui.headHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.tailHint"), (v) => Number.parseInt(v, 10)).action(async (transcript, opts) => {
256
- const { replayCommand } = await import("./replay-D7RT2DR7.js");
255
+ const { replayCommand } = await import("./replay-R3QRXPI2.js");
257
256
  await replayCommand({
258
257
  path: transcript,
259
258
  print: !!opts.print,
@@ -276,7 +275,7 @@ program.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>",
276
275
  var mcp = program.command("mcp").description(t("cli.mcp"));
277
276
  mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("ui.jsonHintCatalog")).option("--local", t("ui.mcpLocalHint")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--pages <n>", t("ui.mcpPagesHint"), (v) => Number.parseInt(v, 10)).option("--all", t("ui.mcpAllHint")).action(async (opts) => {
278
277
  try {
279
- const { mcpListCommand } = await import("./mcp-2RDEQST6.js");
278
+ const { mcpListCommand } = await import("./mcp-M7I23TQ7.js");
280
279
  await mcpListCommand({
281
280
  json: !!opts.json,
282
281
  local: !!opts.local,
@@ -293,7 +292,7 @@ mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("
293
292
  });
294
293
  mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("--json", t("ui.jsonHintCatalog")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (query, opts) => {
295
294
  try {
296
- const { mcpSearchCommand } = await import("./mcp-2RDEQST6.js");
295
+ const { mcpSearchCommand } = await import("./mcp-M7I23TQ7.js");
297
296
  await mcpSearchCommand(query, {
298
297
  json: !!opts.json,
299
298
  refresh: !!opts.refresh,
@@ -308,7 +307,7 @@ mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("
308
307
  });
309
308
  mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option("--refresh", t("ui.mcpRefreshHint")).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (name, opts) => {
310
309
  try {
311
- const { mcpInstallCommand } = await import("./mcp-2RDEQST6.js");
310
+ const { mcpInstallCommand } = await import("./mcp-M7I23TQ7.js");
312
311
  await mcpInstallCommand(name, {
313
312
  refresh: !!opts.refresh,
314
313
  maxPages: typeof opts.maxPages === "number" && opts.maxPages > 0 ? opts.maxPages : void 0
@@ -321,7 +320,7 @@ mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option(
321
320
  });
322
321
  mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async () => {
323
322
  try {
324
- const { mcpBrowseCommand } = await import("./mcp-browse-VM5GLRBQ.js");
323
+ const { mcpBrowseCommand } = await import("./mcp-browse-TWO7RYT4.js");
325
324
  await mcpBrowseCommand();
326
325
  } catch (err) {
327
326
  process.stderr.write(`mcp browse failed: ${err.message}
@@ -340,7 +339,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
340
339
  }
341
340
  });
342
341
  program.command("version").description(t("cli.version")).action(async () => {
343
- const { versionCommand } = await import("./version-BXAN7Q4V.js");
342
+ const { versionCommand } = await import("./version-MDVCFTKA.js");
344
343
  versionCommand();
345
344
  });
346
345
  program.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
@@ -349,7 +348,7 @@ program.command("update").description(t("cli.update")).option("--dry-run", t("ui
349
348
  });
350
349
  program.command("index").description(t("cli.index")).option("--rebuild", t("ui.rebuildHint")).option("--model <name>", t("ui.embedModelHint")).option("--dir <path>", t("ui.projectDirHint")).option("--ollama-url <url>", t("ui.ollamaUrlHint")).option("-y, --yes", t("ui.skipPromptsHint")).action(
351
350
  async (opts) => {
352
- const { indexCommand } = await import("./commands-FE2UDFBC.js");
351
+ const { indexCommand } = await import("./commands-R4JWISND.js");
353
352
  await indexCommand(opts);
354
353
  }
355
354
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { escalationContract } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nfunction defaultSystemPrompt(modelId: string): string {\n return `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${escalationContract(modelId)}`;\n}\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({});\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\n head: Number.isFinite(opts.head) ? opts.head : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n });\n });\n\nprogram\n .command(\"diff <a> <b>\")\n .description(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/resolve.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readConfig } from \"../config.js\";\nimport { t } from \"../i18n/index.js\";\nimport { VERSION } from \"../index.js\";\nimport { listSessions } from \"../memory/session.js\";\nimport { applyMemoryStack } from \"../memory/user.js\";\nimport { escalationContract } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nfunction defaultSystemPrompt(modelId: string): string {\n return `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.\n\n# Cite or shut up — non-negotiable\n\nEvery factual claim about a codebase must be backed by evidence. Reasonix VALIDATES your citations — broken paths render in **red strikethrough with ❌** in front of the user.\n\n**Positive claims** — append a markdown link:\n- ✅ \\`The MCP client supports listResources [listResources](src/mcp/client.ts:142).\\`\n- ❌ \\`The MCP client supports listResources.\\` ← unverifiable, do not write.\n\n**Negative claims** (\"X is missing\", \"Y isn't implemented\", \"lacks Z\") are the #1 hallucination shape. STOP before writing them. If you have a search tool, call it first; if the search returns nothing, cite the search itself as evidence (\\`No matches for \"foo\" in src/\\`). If you have no tool, qualify hard: \"I haven't verified — this is a guess.\"\n\nAsserting absence without checking is how evaluative answers go wrong. Treat the urge to write \"missing\" as a red flag in your own reasoning.\n\n# Don't invent what changes — search instead\n\nYour training data has a cutoff. When an answer's correctness depends on something that changes over time (the user is asking what's happening, not what's true) and a search tool is available, search first. Inventing currently-correct values from training memory is the most common way these answers go wrong, and the user usually can't tell until much later.\n\nThe signal isn't a topic list — it's: \"if I'm wrong about this, is it because reality moved on?\". If yes, ground the answer in fresh evidence; if no (definitions, mechanisms, well-established APIs), answer from memory.\n\n${escalationContract(modelId)}`;\n}\n\n/** Lenient: malformed → undefined (no cap) so a bad flag doesn't abort launch. */\nfunction parseBudgetFlag(raw: number | undefined): number | undefined {\n if (raw === undefined) return undefined;\n if (!Number.isFinite(raw) || raw <= 0) {\n process.stderr.write(\n `▲ ignoring --budget=${raw} (must be a positive number) — running with no cap\\n`,\n );\n return undefined;\n }\n return raw;\n}\n\nconst program = new Command();\nprogram\n .name(\"reasonix\")\n .description(t(\"cli.description\"))\n .version(VERSION)\n .option(\"-c, --continue\", t(\"cli.continue\"));\n\n// `reasonix` with no subcommand → launch the friendliest flow.\n// First run (no config yet) → interactive setup wizard.\n// Otherwise → chat with saved defaults. This is the \"one command to\n// rule them all\" entry for non-power-users: they don't need to learn\n// `chat` / `setup` / `--mcp` — just type `reasonix`.\nprogram.action(async (opts: { continue?: boolean }) => {\n const cfg = readConfig();\n if (!cfg.setupCompleted) {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({ forceKeyStep: true });\n return;\n }\n const defaults = resolveDefaults({});\n const continueOpts = resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),\n session: continueOpts.session,\n mcp: defaults.mcp,\n forceResume: continueOpts.forceResume,\n });\n});\n\nprogram\n .command(\"setup\")\n .description(t(\"cli.setup\"))\n .action(async () => {\n const { setupCommand } = await import(\"./commands/setup.js\");\n await setupCommand({ forceKeyStep: true });\n });\n\nprogram\n .command(\"code [dir]\")\n .description(t(\"cli.code\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverride\"))\n .option(\"--no-session\", t(\"ui.noSession\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .option(\"--system-append <prompt>\", t(\"ui.systemAppendHint\"))\n .option(\"--system-append-file <path>\", t(\"ui.systemAppendFileHint\"))\n .action(async (dir: string | undefined, opts) => {\n const { codeCommand } = await import(\"./commands/code.js\");\n await codeCommand({\n dir,\n model: opts.model,\n noSession: opts.session === false,\n transcript: opts.transcript,\n forceResume: !!opts.resume,\n forceNew: !!opts.new,\n budgetUsd: parseBudgetFlag(opts.budget),\n noDashboard: opts.dashboard === false,\n systemAppend: opts.systemAppend,\n systemAppendFile: opts.systemAppendFile,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"chat\")\n .description(t(\"cli.chat\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--transcript <path>\", t(\"ui.transcriptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHint\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHint\"), (v) => Number.parseFloat(v))\n .option(\"--session <name>\", t(\"ui.sessionNameHint\"))\n .option(\"--no-session\", t(\"ui.ephemeralHint\"))\n .option(\"-r, --resume\", t(\"ui.resumeHint\"))\n .option(\"-c, --continue\", t(\"cli.continue\"))\n .option(\"-n, --new\", t(\"ui.newHint\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHint\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHint\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .option(\"--no-dashboard\", t(\"ui.noDashboard\"))\n .option(\"--no-alt-screen\", \"keep chat output in shell scrollback (legacy mode, ghost-prone)\")\n .option(\"--no-mouse\", \"disable SGR mouse tracking (keeps drag-select 100% native)\")\n .action(async (opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n session: opts.session,\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n // `-c` is \"newest-touched session\" + auto-resume; `-r` is \"this\n // session's prior messages, even if you also passed --session\".\n // When both are set we prefer the explicit `--session` + `-r`\n // (more specific input wins). `-c` only kicks in if `-r` wasn't.\n const continueOpts = opts.resume\n ? { session: defaults.session, forceResume: true }\n : resolveContinueFlag(\n opts.continue,\n defaults.session,\n () => listSessions()[0],\n (msg) => process.stderr.write(`${msg}\\n`),\n );\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand({\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n transcript: opts.transcript,\n budgetUsd: parseBudgetFlag(opts.budget),\n session: continueOpts.session,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n forceResume: continueOpts.forceResume,\n forceNew: !!opts.new,\n noDashboard: opts.dashboard === false,\n altScreen: opts.altScreen !== false,\n mouse: opts.mouse !== false,\n });\n });\n\nprogram\n .command(\"run <task>\")\n .description(t(\"cli.run\"))\n .option(\"-m, --model <id>\", t(\"ui.modelIdHint\"))\n .option(\"-s, --system <prompt>\", t(\"ui.systemPromptHint\"))\n .option(\"--preset <name>\", t(\"ui.presetHintShort\"))\n .option(\"--budget <usd>\", t(\"ui.budgetHintShort\"), (v) => Number.parseFloat(v))\n .option(\"--transcript <path>\", t(\"ui.transcriptHintShort\"))\n .option(\n \"--mcp <spec>\",\n t(\"ui.mcpSpecHintShort\"),\n (value: string, previous: string[] = []) => [...previous, value],\n [] as string[],\n )\n .option(\"--mcp-prefix <str>\", t(\"ui.mcpPrefixHintShort\"))\n .option(\"--no-config\", t(\"ui.noConfigHint\"))\n .action(async (task: string, opts) => {\n const defaults = resolveDefaults({\n model: opts.model,\n mcp: opts.mcp as string[],\n preset: opts.preset,\n noConfig: opts.config === false,\n });\n const { runCommand } = await import(\"./commands/run.js\");\n await runCommand({\n task,\n model: defaults.model,\n system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),\n budgetUsd: parseBudgetFlag(opts.budget),\n transcript: opts.transcript,\n mcp: defaults.mcp,\n mcpPrefix: opts.mcpPrefix,\n });\n });\n\nprogram\n .command(\"stats [transcript]\")\n .description(t(\"cli.stats\"))\n .action(async (transcript: string | undefined) => {\n const { statsCommand } = await import(\"./commands/stats.js\");\n statsCommand({ transcript });\n });\n\nprogram\n .command(\"doctor\")\n .description(t(\"cli.doctor\"))\n .action(async () => {\n const { doctorCommand } = await import(\"./commands/doctor.js\");\n await doctorCommand();\n });\n\nprogram\n .command(\"commit\")\n .description(t(\"cli.commit\"))\n .option(\"-m, --model <id>\", t(\"ui.modelOverrideFlash\"))\n .option(\"-y, --yes\", t(\"ui.skipConfirmHint\"))\n .action(async (opts) => {\n const { commitCommand } = await import(\"./commands/commit.js\");\n await commitCommand({ model: opts.model, yes: !!opts.yes });\n });\n\nprogram\n .command(\"sessions [name]\")\n .description(t(\"cli.sessions\"))\n .option(\"-v, --verbose\", t(\"ui.verboseHint\"))\n .action(async (name: string | undefined, opts) => {\n const { sessionsCommand } = await import(\"./commands/sessions.js\");\n sessionsCommand({ name, verbose: !!opts.verbose });\n });\n\nprogram\n .command(\"prune-sessions\")\n .description(t(\"cli.pruneSessions\"))\n .option(\"--days <n>\", t(\"ui.pruneDaysHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--dry-run\", t(\"ui.pruneDryRunHint\"))\n .action(async (opts) => {\n const { pruneSessionsCommand } = await import(\"./commands/prune-sessions.js\");\n pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"events <name>\")\n .description(t(\"cli.events\"))\n .option(\"--type <type>\", t(\"ui.eventTypeHint\"))\n .option(\"--since <id>\", t(\"ui.eventSinceHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.eventTailHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--json\", t(\"ui.jsonHint\"))\n .option(\"--projection\", t(\"ui.projectionHint\"))\n .action(async (name: string, opts) => {\n const { eventsCommand } = await import(\"./commands/events.js\");\n eventsCommand({\n name,\n type: opts.type,\n since: Number.isFinite(opts.since) ? opts.since : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n json: !!opts.json,\n projection: !!opts.projection,\n });\n });\n\nprogram\n .command(\"replay <transcript>\")\n .description(t(\"cli.replay\"))\n .option(\"--print\", t(\"ui.printHint\"))\n .option(\"--head <n>\", t(\"ui.headHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--tail <n>\", t(\"ui.tailHint\"), (v) => Number.parseInt(v, 10))\n .action(async (transcript: string, opts) => {\n const { replayCommand } = await import(\"./commands/replay.js\");\n await replayCommand({\n path: transcript,\n print: !!opts.print,\n head: Number.isFinite(opts.head) ? opts.head : undefined,\n tail: Number.isFinite(opts.tail) ? opts.tail : undefined,\n });\n });\n\nprogram\n .command(\"diff <a> <b>\")\n .description(t(\"cli.diff\"))\n .option(\"--md <path>\", t(\"ui.mdReportHint\"))\n .option(\"--print\", t(\"ui.printHintTable\"))\n .option(\"--tui\", t(\"ui.tuiHint\"))\n .option(\"--label-a <label>\", t(\"ui.labelAHint\"))\n .option(\"--label-b <label>\", t(\"ui.labelBHint\"))\n .action(async (a: string, b: string, opts) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand({\n a,\n b,\n mdPath: opts.md,\n labelA: opts.labelA,\n labelB: opts.labelB,\n print: !!opts.print,\n tui: !!opts.tui,\n });\n });\n\nconst mcp = program.command(\"mcp\").description(t(\"cli.mcp\"));\n\nmcp\n .command(\"list\")\n .description(t(\"ui.mcpListDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--local\", t(\"ui.mcpLocalHint\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--pages <n>\", t(\"ui.mcpPagesHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--all\", t(\"ui.mcpAllHint\"))\n .action(async (opts) => {\n try {\n const { mcpListCommand } = await import(\"./commands/mcp.js\");\n await mcpListCommand({\n json: !!opts.json,\n local: !!opts.local,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n pages: typeof opts.pages === \"number\" && opts.pages > 0 ? opts.pages : undefined,\n all: !!opts.all,\n });\n } catch (err) {\n process.stderr.write(`mcp list failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"search <query>\")\n .description(t(\"ui.mcpSearchDescription\"))\n .option(\"--json\", t(\"ui.jsonHintCatalog\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--limit <n>\", t(\"ui.mcpLimitHint\"), (v) => Number.parseInt(v, 10))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (query: string, opts) => {\n try {\n const { mcpSearchCommand } = await import(\"./commands/mcp.js\");\n await mcpSearchCommand(query, {\n json: !!opts.json,\n refresh: !!opts.refresh,\n limit: typeof opts.limit === \"number\" && opts.limit > 0 ? opts.limit : undefined,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp search failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"install <name>\")\n .description(t(\"ui.mcpInstallDescription\"))\n .option(\"--refresh\", t(\"ui.mcpRefreshHint\"))\n .option(\"--max-pages <n>\", t(\"ui.mcpMaxPagesHint\"), (v) => Number.parseInt(v, 10))\n .action(async (name: string, opts) => {\n try {\n const { mcpInstallCommand } = await import(\"./commands/mcp.js\");\n await mcpInstallCommand(name, {\n refresh: !!opts.refresh,\n maxPages:\n typeof opts.maxPages === \"number\" && opts.maxPages > 0 ? opts.maxPages : undefined,\n });\n } catch (err) {\n process.stderr.write(`mcp install failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"browse\")\n .description(t(\"ui.mcpBrowseDescription\"))\n .action(async () => {\n try {\n const { mcpBrowseCommand } = await import(\"./commands/mcp-browse.js\");\n await mcpBrowseCommand();\n } catch (err) {\n process.stderr.write(`mcp browse failed: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n\nmcp\n .command(\"inspect <spec>\")\n .description(t(\"ui.mcpInspectDescription\"))\n .option(\"--json\", t(\"ui.jsonHintReport\"))\n .action(async (spec: string, opts) => {\n const { formatMcpInspectFailure, mcpInspectCommand } = await import(\n \"./commands/mcp-inspect.js\"\n );\n try {\n await mcpInspectCommand({ spec, json: !!opts.json });\n } catch (err) {\n process.stderr.write(`mcp inspect failed: ${formatMcpInspectFailure(err)}\\n`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"version\")\n .description(t(\"cli.version\"))\n .action(async () => {\n const { versionCommand } = await import(\"./commands/version.js\");\n versionCommand();\n });\n\nprogram\n .command(\"update\")\n .description(t(\"cli.update\"))\n .option(\"--dry-run\", t(\"ui.dryRunHint\"))\n .action(async (opts: { dryRun?: boolean }) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand({ dryRun: !!opts.dryRun });\n });\n\nprogram\n .command(\"index\")\n .description(t(\"cli.index\"))\n .option(\"--rebuild\", t(\"ui.rebuildHint\"))\n .option(\"--model <name>\", t(\"ui.embedModelHint\"))\n .option(\"--dir <path>\", t(\"ui.projectDirHint\"))\n .option(\"--ollama-url <url>\", t(\"ui.ollamaUrlHint\"))\n .option(\"-y, --yes\", t(\"ui.skipPromptsHint\"))\n .action(\n async (opts: {\n rebuild?: boolean;\n model?: string;\n dir?: string;\n ollamaUrl?: string;\n yes?: boolean;\n }) => {\n const { indexCommand } = await import(\"./commands/index.js\");\n await indexCommand(opts);\n },\n );\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/** Precedence: per-setting flag > --preset > config.preset > \"auto\" defaults. */\n\nimport { type PresetName, type ReasonixConfig, readConfig } from \"../config.js\";\nimport { resolvePreset } from \"./ui/presets.js\";\n\nexport interface ResolvedDefaults {\n model: string;\n reasoningEffort: \"high\" | \"max\";\n mcp: string[];\n session: string | undefined;\n}\n\nexport interface RawCliFlags {\n model?: string;\n mcp?: string[];\n /** Commander's `--no-session` surfaces as `false`; `--session X` as a string. */\n session?: string | false;\n /** `--preset <name>`. */\n preset?: string;\n /** When true, ignore config entirely (power-user escape hatch). */\n noConfig?: boolean;\n}\n\nexport function resolveDefaults(flags: RawCliFlags): ResolvedDefaults {\n const cfg: ReasonixConfig = flags.noConfig ? {} : readConfig();\n const preset = pickPreset(flags.preset, cfg.preset);\n const presetSettings = resolvePreset(preset);\n\n const model = flags.model ?? presetSettings.model;\n const reasoningEffort = presetSettings.reasoningEffort;\n\n // `--mcp` accumulator is [] when absent. Treat empty from flags as\n // \"user didn't pass\" → fall through to config. Users who explicitly\n // want zero MCP servers can pass `--no-config` or edit the file.\n const mcp = flags.mcp && flags.mcp.length > 0 ? flags.mcp : (cfg.mcp ?? []);\n\n const session = resolveSession(flags.session, cfg.session);\n\n return { model, reasoningEffort, mcp, session };\n}\n\nfunction pickPreset(\n flagPreset: string | undefined,\n configPreset: PresetName | undefined,\n): PresetName {\n if (flagPreset && isPresetName(flagPreset)) return flagPreset;\n if (configPreset) return configPreset;\n return \"auto\";\n}\n\nfunction isPresetName(s: string): s is PresetName {\n return (\n s === \"auto\" ||\n s === \"flash\" ||\n s === \"pro\" ||\n // Legacy names — kept callable so old `--preset smart` invocations\n // and stale config.json entries don't error out.\n s === \"fast\" ||\n s === \"smart\" ||\n s === \"max\"\n );\n}\n\nfunction resolveSession(\n flag: string | false | undefined,\n configSession: string | null | undefined,\n): string | undefined {\n if (flag === false) return undefined; // --no-session\n if (typeof flag === \"string\" && flag.length > 0) return flag;\n if (configSession === null) return undefined; // config opted out\n if (typeof configSession === \"string\" && configSession.length > 0) return configSession;\n return \"default\";\n}\n\nexport function resolveContinueFlag(\n flag: boolean | undefined,\n fallbackSession: string | undefined,\n getLatestSession: () => { name: string } | undefined,\n warn: (msg: string) => void = () => {},\n): { session: string | undefined; forceResume: boolean } {\n if (!flag) return { session: fallbackSession, forceResume: false };\n const latest = getLatestSession();\n if (!latest) {\n warn(\"▸ -c/--continue: no saved sessions yet — starting a fresh one.\");\n return { session: fallbackSession, forceResume: false };\n }\n return { session: latest.name, forceResume: true };\n}\n"],"mappings":"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","names":["mcp"]}
@@ -13,8 +13,7 @@ import {
13
13
  import {
14
14
  readConfig,
15
15
  writeConfig
16
- } from "./chunk-BHLHOS5Y.js";
17
- import "./chunk-WUI3P4RA.js";
16
+ } from "./chunk-BW2HWSYH.js";
18
17
 
19
18
  // src/cli/commands/mcp.ts
20
19
  var DEFAULT_LIST_LIMIT = 30;
@@ -264,4 +263,4 @@ export {
264
263
  mcpListCommand,
265
264
  mcpSearchCommand
266
265
  };
267
- //# sourceMappingURL=mcp-2RDEQST6.js.map
266
+ //# sourceMappingURL=mcp-M7I23TQ7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/mcp.ts"],"sourcesContent":["import { readConfig, writeConfig } from \"../../config.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(\"Bundled MCP servers (offline catalog):\");\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 ? `cached, ${fmtAge(Date.now() - result.fetchedAt)}`\n : \"just fetched\";\n const moreStr = result.hasMore ? \"more available\" : \"all loaded\";\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(\n ` … ${ranked.length - limit} more loaded — use \\`reasonix mcp search <query>\\` to filter`,\n );\n }\n if (result.hasMore) {\n console.log(\" ▸ more pages available — `reasonix mcp list --pages <n>` or --all\");\n }\n console.log(\"\");\n console.log(\"Install: reasonix mcp install <name>\");\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(\"usage: reasonix mcp search <query>\");\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 `No matches for \"${q}\" across ${result.entries.length} loaded entries (${result.source}${\n result.hasMore ? \", more pages exist — try --refresh or `mcp list --all`\" : \"\"\n }).`,\n );\n return;\n }\n console.log(\n `${matches.length} match(es) for \"${q}\" in ${result.source} registry (${result.entries.length} entries scanned):`,\n );\n console.log(\"\");\n for (const e of shown) printEntry(e);\n if (matches.length > limit) console.log(` … ${matches.length - limit} more matches`);\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(\"usage: reasonix mcp install <name>\");\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 `No MCP server named \"${target}\" found after walking ${handle.cache.pagination.pagesLoaded} page(s) of the ${handle.source} registry.`,\n );\n if (handle.cache.pagination.nextCursor !== null) {\n console.error(`Try: reasonix mcp install ${target} --max-pages 100`);\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(\n `Could not derive install metadata for \"${entry.name}\" — try \\`npx -y @smithery/cli install ${entry.name}\\` directly.`,\n );\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(`Cannot build install spec for ${entry.name}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n console.log(`Already installed: ${spec}`);\n return;\n }\n const next = { ...cfg, mcp: [...existing, spec] };\n writeConfig(next);\n\n console.log(`Installed: ${entry.name}`);\n console.log(` spec: ${spec}`);\n if (entry.install.requiredEnv?.length) {\n console.log(\n ` needs: ${entry.install.requiredEnv.join(\", \")} (set these in your env before next chat)`,\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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/mcp.ts"],"sourcesContent":["import { readConfig, writeConfig } from \"../../config.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(\"Bundled MCP servers (offline catalog):\");\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 ? `cached, ${fmtAge(Date.now() - result.fetchedAt)}`\n : \"just fetched\";\n const moreStr = result.hasMore ? \"more available\" : \"all loaded\";\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(\n ` … ${ranked.length - limit} more loaded — use \\`reasonix mcp search <query>\\` to filter`,\n );\n }\n if (result.hasMore) {\n console.log(\" ▸ more pages available — `reasonix mcp list --pages <n>` or --all\");\n }\n console.log(\"\");\n console.log(\"Install: reasonix mcp install <name>\");\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(\"usage: reasonix mcp search <query>\");\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 `No matches for \"${q}\" across ${result.entries.length} loaded entries (${result.source}${\n result.hasMore ? \", more pages exist — try --refresh or `mcp list --all`\" : \"\"\n }).`,\n );\n return;\n }\n console.log(\n `${matches.length} match(es) for \"${q}\" in ${result.source} registry (${result.entries.length} entries scanned):`,\n );\n console.log(\"\");\n for (const e of shown) printEntry(e);\n if (matches.length > limit) console.log(` … ${matches.length - limit} more matches`);\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(\"usage: reasonix mcp install <name>\");\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 `No MCP server named \"${target}\" found after walking ${handle.cache.pagination.pagesLoaded} page(s) of the ${handle.source} registry.`,\n );\n if (handle.cache.pagination.nextCursor !== null) {\n console.error(`Try: reasonix mcp install ${target} --max-pages 100`);\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(\n `Could not derive install metadata for \"${entry.name}\" — try \\`npx -y @smithery/cli install ${entry.name}\\` directly.`,\n );\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(`Cannot build install spec for ${entry.name}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n console.log(`Already installed: ${spec}`);\n return;\n }\n const next = { ...cfg, mcp: [...existing, spec] };\n writeConfig(next);\n\n console.log(`Installed: ${entry.name}`);\n console.log(` spec: ${spec}`);\n if (entry.install.requiredEnv?.length) {\n console.log(\n ` needs: ${entry.install.requiredEnv.join(\", \")} (set these in your env before next chat)`,\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"],"mappings":"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","names":[]}
@@ -11,8 +11,7 @@ import "./chunk-FM57FNPJ.js";
11
11
  import {
12
12
  readConfig,
13
13
  writeConfig
14
- } from "./chunk-BHLHOS5Y.js";
15
- import "./chunk-WUI3P4RA.js";
14
+ } from "./chunk-BW2HWSYH.js";
16
15
 
17
16
  // src/cli/commands/mcp-browse.tsx
18
17
  import { Box, Text, render, useApp, useInput } from "ink";
@@ -161,4 +160,4 @@ async function mcpBrowseCommand(_opts = {}) {
161
160
  export {
162
161
  mcpBrowseCommand
163
162
  };
164
- //# sourceMappingURL=mcp-browse-VM5GLRBQ.js.map
163
+ //# sourceMappingURL=mcp-browse-TWO7RYT4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/mcp-browse.tsx"],"sourcesContent":["/** `reasonix mcp browse` — Ink TUI for the MCP marketplace. Lazy-loads pages on scroll. */\n\nimport { Box, Text, render, useApp, useInput } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { readConfig, writeConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport {\n type RegistryHandle,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\n\nconst VISIBLE_ROWS = 12;\n\ninterface State {\n handle: RegistryHandle | null;\n loading: boolean;\n query: string;\n selected: number;\n status: string;\n}\n\nfunction rankAndFilter(entries: RegistryEntry[], query: string): RegistryEntry[] {\n const q = query.trim().toLowerCase();\n const list = q\n ? entries.filter((e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q))\n : entries;\n return [...list].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 McpBrowseApp() {\n const app = useApp();\n const [state, setState] = useState<State>({\n handle: null,\n loading: true,\n query: \"\",\n selected: 0,\n status: \"opening registry…\",\n });\n\n const setStatus = useCallback((status: string) => {\n setState((s) => ({ ...s, status }));\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const handle = await openRegistry({});\n if (cancelled) return;\n const ageMs = Date.now() - handle.fetchedAt;\n const ageStr =\n ageMs < 60_000 ? `${Math.floor(ageMs / 1000)}s` : `${Math.floor(ageMs / 60_000)}m`;\n setState((s) => ({\n ...s,\n handle,\n loading: false,\n status: `${handle.source} · ${handle.cache.entries.length} entries${\n handle.fromCache ? ` · cached ${ageStr} ago` : \"\"\n }`,\n }));\n } catch (err) {\n if (cancelled) return;\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const filtered = useMemo(() => {\n if (!state.handle) return [];\n return rankAndFilter(state.handle.cache.entries, state.query);\n }, [state.handle, state.query]);\n\n const selected = filtered[state.selected];\n\n const fetchMore = useCallback(async () => {\n if (!state.handle || state.loading) return;\n if (state.handle.cache.pagination.nextCursor === null) {\n setStatus(\"no more pages — registry exhausted\");\n return;\n }\n setState((s) => ({ ...s, loading: true, status: \"loading more…\" }));\n try {\n const r = await loadMorePages(state.handle, { pages: 5 });\n setState((s) => ({\n ...s,\n loading: false,\n status: `+${r.newEntries} entries (${state.handle?.cache.entries.length ?? 0} total)${\n r.exhausted ? \" · exhausted\" : \"\"\n }`,\n }));\n } catch (err) {\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n }, [state.handle, state.loading, setStatus]);\n\n const install = useCallback(\n (entry: RegistryEntry) => {\n if (!entry.install) {\n setStatus(`${entry.name} has no install info (smithery listing)`);\n return;\n }\n try {\n const spec = specStringFor(entry.name, entry.install);\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n setStatus(`already installed: ${spec}`);\n return;\n }\n writeConfig({ ...cfg, mcp: [...existing, spec] });\n setStatus(`installed → ${spec}`);\n } catch (err) {\n setStatus(`install failed: ${(err as Error).message}`);\n }\n },\n [setStatus],\n );\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === \"c\")) {\n app.exit();\n return;\n }\n if (key.upArrow) {\n setState((s) => ({ ...s, selected: Math.max(0, s.selected - 1) }));\n return;\n }\n if (key.downArrow) {\n setState((s) => ({ ...s, selected: Math.min(filtered.length - 1, s.selected + 1) }));\n return;\n }\n if (key.return) {\n if (selected) install(selected);\n return;\n }\n if (key.tab || (key.ctrl && input === \"n\")) {\n void fetchMore();\n return;\n }\n if (key.backspace || key.delete) {\n setState((s) => ({ ...s, query: s.query.slice(0, -1), selected: 0 }));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setState((s) => ({ ...s, query: s.query + input, selected: 0 }));\n }\n });\n\n const start = Math.max(\n 0,\n Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS),\n );\n const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color=\"cyan\">\n ◈ MCP marketplace\n </Text>\n <Text dimColor>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>search: </Text>\n <Text color=\"white\">{state.query || \"(type to filter)\"}</Text>\n <Text dimColor>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dimColor>{state.loading ? \"loading…\" : \"no entries\"}</Text>\n ) : (\n window.map((e, i) => {\n const idx = (start || 0) + i;\n const active = idx === state.selected;\n const tag =\n e.source === \"official\" ? \"[off]\" : e.source === \"smithery\" ? \"[smt]\" : \"[loc]\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()}` : \"\";\n return (\n <Box key={e.name}>\n <Text color={active ? \"cyan\" : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(40).slice(0, 40)}</Text>\n <Text dimColor>{` ${tag}${pop}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\">\n {selected.title}\n </Text>\n {selected.description ? <Text dimColor>{selected.description.slice(0, 160)}</Text> : null}\n {selected.install ? (\n <Text dimColor>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dimColor>(smithery listing — install info not exposed)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>type to filter · ↑↓ pick · enter install · tab load more · esc quit</Text>\n </Box>\n </Box>\n );\n}\n\nexport interface McpBrowseOptions {\n /** Reserved — currently unused, kept for symmetry with other commands. */\n _unused?: never;\n}\n\nexport async function mcpBrowseCommand(_opts: McpBrowseOptions = {}): Promise<void> {\n loadDotenv();\n const { waitUntilExit } = render(<McpBrowseApp />, {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/mcp-browse.tsx"],"sourcesContent":["/** `reasonix mcp browse` — Ink TUI for the MCP marketplace. Lazy-loads pages on scroll. */\n\nimport { Box, Text, render, useApp, useInput } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { readConfig, writeConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport {\n type RegistryHandle,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\n\nconst VISIBLE_ROWS = 12;\n\ninterface State {\n handle: RegistryHandle | null;\n loading: boolean;\n query: string;\n selected: number;\n status: string;\n}\n\nfunction rankAndFilter(entries: RegistryEntry[], query: string): RegistryEntry[] {\n const q = query.trim().toLowerCase();\n const list = q\n ? entries.filter((e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q))\n : entries;\n return [...list].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 McpBrowseApp() {\n const app = useApp();\n const [state, setState] = useState<State>({\n handle: null,\n loading: true,\n query: \"\",\n selected: 0,\n status: \"opening registry…\",\n });\n\n const setStatus = useCallback((status: string) => {\n setState((s) => ({ ...s, status }));\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const handle = await openRegistry({});\n if (cancelled) return;\n const ageMs = Date.now() - handle.fetchedAt;\n const ageStr =\n ageMs < 60_000 ? `${Math.floor(ageMs / 1000)}s` : `${Math.floor(ageMs / 60_000)}m`;\n setState((s) => ({\n ...s,\n handle,\n loading: false,\n status: `${handle.source} · ${handle.cache.entries.length} entries${\n handle.fromCache ? ` · cached ${ageStr} ago` : \"\"\n }`,\n }));\n } catch (err) {\n if (cancelled) return;\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const filtered = useMemo(() => {\n if (!state.handle) return [];\n return rankAndFilter(state.handle.cache.entries, state.query);\n }, [state.handle, state.query]);\n\n const selected = filtered[state.selected];\n\n const fetchMore = useCallback(async () => {\n if (!state.handle || state.loading) return;\n if (state.handle.cache.pagination.nextCursor === null) {\n setStatus(\"no more pages — registry exhausted\");\n return;\n }\n setState((s) => ({ ...s, loading: true, status: \"loading more…\" }));\n try {\n const r = await loadMorePages(state.handle, { pages: 5 });\n setState((s) => ({\n ...s,\n loading: false,\n status: `+${r.newEntries} entries (${state.handle?.cache.entries.length ?? 0} total)${\n r.exhausted ? \" · exhausted\" : \"\"\n }`,\n }));\n } catch (err) {\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n }, [state.handle, state.loading, setStatus]);\n\n const install = useCallback(\n (entry: RegistryEntry) => {\n if (!entry.install) {\n setStatus(`${entry.name} has no install info (smithery listing)`);\n return;\n }\n try {\n const spec = specStringFor(entry.name, entry.install);\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n setStatus(`already installed: ${spec}`);\n return;\n }\n writeConfig({ ...cfg, mcp: [...existing, spec] });\n setStatus(`installed → ${spec}`);\n } catch (err) {\n setStatus(`install failed: ${(err as Error).message}`);\n }\n },\n [setStatus],\n );\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === \"c\")) {\n app.exit();\n return;\n }\n if (key.upArrow) {\n setState((s) => ({ ...s, selected: Math.max(0, s.selected - 1) }));\n return;\n }\n if (key.downArrow) {\n setState((s) => ({ ...s, selected: Math.min(filtered.length - 1, s.selected + 1) }));\n return;\n }\n if (key.return) {\n if (selected) install(selected);\n return;\n }\n if (key.tab || (key.ctrl && input === \"n\")) {\n void fetchMore();\n return;\n }\n if (key.backspace || key.delete) {\n setState((s) => ({ ...s, query: s.query.slice(0, -1), selected: 0 }));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setState((s) => ({ ...s, query: s.query + input, selected: 0 }));\n }\n });\n\n const start = Math.max(\n 0,\n Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS),\n );\n const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color=\"cyan\">\n ◈ MCP marketplace\n </Text>\n <Text dimColor>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>search: </Text>\n <Text color=\"white\">{state.query || \"(type to filter)\"}</Text>\n <Text dimColor>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dimColor>{state.loading ? \"loading…\" : \"no entries\"}</Text>\n ) : (\n window.map((e, i) => {\n const idx = (start || 0) + i;\n const active = idx === state.selected;\n const tag =\n e.source === \"official\" ? \"[off]\" : e.source === \"smithery\" ? \"[smt]\" : \"[loc]\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()}` : \"\";\n return (\n <Box key={e.name}>\n <Text color={active ? \"cyan\" : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(40).slice(0, 40)}</Text>\n <Text dimColor>{` ${tag}${pop}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\">\n {selected.title}\n </Text>\n {selected.description ? <Text dimColor>{selected.description.slice(0, 160)}</Text> : null}\n {selected.install ? (\n <Text dimColor>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dimColor>(smithery listing — install info not exposed)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>type to filter · ↑↓ pick · enter install · tab load more · esc quit</Text>\n </Box>\n </Box>\n );\n}\n\nexport interface McpBrowseOptions {\n /** Reserved — currently unused, kept for symmetry with other commands. */\n _unused?: never;\n}\n\nexport async function mcpBrowseCommand(_opts: McpBrowseOptions = {}): Promise<void> {\n loadDotenv();\n const { waitUntilExit } = render(<McpBrowseApp />, {\n exitOnCtrlC: true,\n patchConsole: false,\n });\n await waitUntilExit();\n}\n"],"mappings":"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","names":[]}
@@ -3,11 +3,11 @@ import {
3
3
  CODE_SYSTEM_PROMPT,
4
4
  codeSystemBase,
5
5
  codeSystemPrompt
6
- } from "./chunk-YER7WCHF.js";
6
+ } from "./chunk-A63QT566.js";
7
7
  import "./chunk-XOIDSPMQ.js";
8
8
  export {
9
9
  CODE_SYSTEM_PROMPT,
10
10
  codeSystemBase,
11
11
  codeSystemPrompt
12
12
  };
13
- //# sourceMappingURL=prompt-KGIUONO3.js.map
13
+ //# sourceMappingURL=prompt-ODPFOKSH.js.map
@@ -14,12 +14,15 @@ import {
14
14
  import {
15
15
  COLOR,
16
16
  GRADIENT
17
- } from "./chunk-ZJR4QLXB.js";
17
+ } from "./chunk-FB46F6H4.js";
18
18
  import "./chunk-KMWKGPFZ.js";
19
+ import {
20
+ t
21
+ } from "./chunk-FYKZB6TX.js";
19
22
  import {
20
23
  formatBalance,
21
24
  formatCost
22
- } from "./chunk-WUI3P4RA.js";
25
+ } from "./chunk-BW2HWSYH.js";
23
26
  import "./chunk-ORM6PK57.js";
24
27
 
25
28
  // src/cli/commands/replay.ts
@@ -78,7 +81,8 @@ function ChromeRow({
78
81
  balance
79
82
  }) {
80
83
  const modePill = pickModePill(planMode, editMode);
81
- const proPill = escalated ? { label: "\u21E7 pro", color: COLOR.err } : proArmed ? { label: "\u21E7 pro", color: COLOR.warn } : null;
84
+ const proLabel = t("statsPanel.pro");
85
+ const proPill = escalated ? { label: proLabel, color: COLOR.err } : proArmed ? { label: proLabel, color: COLOR.warn } : null;
82
86
  const projectName = rootDir ? basename(rootDir) : null;
83
87
  const cachePct = (summary.cacheHitRatio * 100).toFixed(1);
84
88
  const cacheColor = summary.cacheHitRatio >= 0.7 ? COLOR.ok : summary.cacheHitRatio >= 0.4 ? COLOR.warn : COLOR.err;
@@ -127,16 +131,16 @@ function ChromeRow({
127
131
  ), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: coldStart ? void 0 : cacheColor, dimColor: coldStart }, coldStart && summary.turns === 0 ? "\u2014" : `${cachePct}%`), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "]")) : null);
128
132
  }
129
133
  function pickModePill(planMode, editMode) {
130
- if (planMode) return { label: "PLAN", color: COLOR.err };
131
- if (editMode === "yolo") return { label: "yolo", color: COLOR.err };
132
- if (editMode === "auto") return { label: "auto", color: COLOR.primary };
133
- if (editMode === "review") return { label: "review", color: COLOR.info };
134
+ if (planMode) return { label: t("statsPanel.modePlan"), color: COLOR.err };
135
+ if (editMode === "yolo") return { label: t("statsPanel.modeYolo"), color: COLOR.err };
136
+ if (editMode === "auto") return { label: t("statsPanel.modeAuto"), color: COLOR.primary };
137
+ if (editMode === "review") return { label: t("statsPanel.modeReview"), color: COLOR.info };
134
138
  return null;
135
139
  }
136
140
  function BudgetRow({ spent, cap }) {
137
141
  const pct = Math.max(0, spent / cap * 100);
138
142
  const color = pct >= 100 ? "#f87171" : pct >= 80 ? "#fbbf24" : "#94a3b8";
139
- return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " budget "), /* @__PURE__ */ React.createElement(Text, { color }, `$${spent.toFixed(4)} / $${cap.toFixed(2)}`, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, ` (${pct.toFixed(0)}%)`)));
143
+ return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("statsPanel.budget")), /* @__PURE__ */ React.createElement(Text, { color }, `$${spent.toFixed(4)} / $${cap.toFixed(2)}`, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, ` (${pct.toFixed(0)}%)`)));
140
144
  }
141
145
  function sessionCostColor(cost) {
142
146
  if (cost <= 0) return void 0;
@@ -272,4 +276,4 @@ function oneLine(s, max = 200) {
272
276
  export {
273
277
  replayCommand
274
278
  };
275
- //# sourceMappingURL=replay-D7RT2DR7.js.map
279
+ //# sourceMappingURL=replay-R3QRXPI2.js.map