reasonix 0.36.2 → 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.
- package/README.md +48 -75
- package/README.zh-CN.md +48 -32
- package/dist/cli/{chat-QSM6JKUA.js → chat-FPEYKTMI.js} +16 -17
- package/dist/cli/{chunk-T52GAWPP.js → chunk-3VTV4WAH.js} +2 -2
- package/dist/cli/{chunk-NHV5YGTB.js → chunk-4PNXH2MH.js} +1860 -1249
- package/dist/cli/chunk-4PNXH2MH.js.map +1 -0
- package/dist/cli/{chunk-DFP4YSVM.js → chunk-6CXT5JRM.js} +17 -2
- package/dist/cli/{chunk-DFP4YSVM.js.map → chunk-6CXT5JRM.js.map} +1 -1
- package/dist/cli/{chunk-G3XNWSFN.js → chunk-6NMWJSES.js} +2 -2
- package/dist/cli/{chunk-4D6TT2IB.js → chunk-A63QT566.js} +36 -15
- package/dist/cli/chunk-A63QT566.js.map +1 -0
- package/dist/cli/{chunk-4Q3GRJIU.js → chunk-AATCLE5N.js} +2 -2
- package/dist/cli/{chunk-BHLHOS5Y.js → chunk-BW2HWSYH.js} +315 -5
- package/dist/cli/chunk-BW2HWSYH.js.map +1 -0
- package/dist/cli/{chunk-ZJR4QLXB.js → chunk-FB46F6H4.js} +2 -2
- package/dist/cli/{chunk-MLXUGPJE.js → chunk-FYKZB6TX.js} +490 -8
- package/dist/cli/chunk-FYKZB6TX.js.map +1 -0
- package/dist/cli/{chunk-XQIFIB3U.js → chunk-JOFZ6AW5.js} +2 -2
- package/dist/cli/{chunk-IPCPEZWQ.js → chunk-LMNAMITH.js} +2 -2
- package/dist/cli/{chunk-S4GF3HPO.js → chunk-LY352GTC.js} +6 -4
- package/dist/cli/chunk-LY352GTC.js.map +1 -0
- package/dist/cli/{chunk-C5543CRX.js → chunk-NYP2DDDV.js} +41 -2
- package/dist/cli/chunk-NYP2DDDV.js.map +1 -0
- package/dist/cli/{chunk-BJ376EN3.js → chunk-T5U5JO7Q.js} +12 -9
- package/dist/cli/chunk-T5U5JO7Q.js.map +1 -0
- package/dist/cli/{chunk-K6W64QVE.js → chunk-XOIDSPMQ.js} +27 -7
- package/dist/cli/chunk-XOIDSPMQ.js.map +1 -0
- package/dist/cli/{chunk-RNSZYYGB.js → chunk-YJKLNYCP.js} +122 -33
- package/dist/cli/chunk-YJKLNYCP.js.map +1 -0
- package/dist/cli/{code-6C5A2CY3.js → code-GTE65OUT.js} +28 -21
- package/dist/cli/code-GTE65OUT.js.map +1 -0
- package/dist/cli/{commands-FE2UDFBC.js → commands-R4JWISND.js} +3 -4
- package/dist/cli/{commands-FE2UDFBC.js.map → commands-R4JWISND.js.map} +1 -1
- package/dist/cli/{commit-3IAGB22T.js → commit-TQ4DMUNS.js} +2 -3
- package/dist/cli/{commit-3IAGB22T.js.map → commit-TQ4DMUNS.js.map} +1 -1
- package/dist/cli/{doctor-DKD34EFD.js → doctor-GGK2JKTA.js} +7 -8
- package/dist/cli/{events-P27CX7LN.js → events-SQXPVV7B.js} +3 -3
- package/dist/cli/index.js +38 -37
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-2RDEQST6.js → mcp-M7I23TQ7.js} +2 -3
- package/dist/cli/{mcp-2RDEQST6.js.map → mcp-M7I23TQ7.js.map} +1 -1
- package/dist/cli/{mcp-browse-VM5GLRBQ.js → mcp-browse-TWO7RYT4.js} +2 -3
- package/dist/cli/{mcp-browse-VM5GLRBQ.js.map → mcp-browse-TWO7RYT4.js.map} +1 -1
- package/dist/cli/prompt-ODPFOKSH.js +13 -0
- package/dist/cli/{prune-sessions-ERL6B4G5.js → prune-sessions-FCFOYCBP.js} +2 -2
- package/dist/cli/{replay-D7RT2DR7.js → replay-R3QRXPI2.js} +13 -9
- package/dist/cli/replay-R3QRXPI2.js.map +1 -0
- package/dist/cli/{run-AG4Y45X7.js → run-WGSPYYOJ.js} +9 -10
- package/dist/cli/{run-AG4Y45X7.js.map → run-WGSPYYOJ.js.map} +1 -1
- package/dist/cli/{server-GNHR5K3N.js → server-IZPWQYG3.js} +98 -53
- package/dist/cli/{server-GNHR5K3N.js.map → server-IZPWQYG3.js.map} +1 -1
- package/dist/cli/{sessions-MHRF3GU4.js → sessions-E4UH5JYL.js} +9 -10
- package/dist/cli/{sessions-MHRF3GU4.js.map → sessions-E4UH5JYL.js.map} +1 -1
- package/dist/cli/{setup-IIAJXHP4.js → setup-FTZNN3TZ.js} +60 -15
- package/dist/cli/setup-FTZNN3TZ.js.map +1 -0
- package/dist/cli/{version-7AL4JZ63.js → version-MDVCFTKA.js} +9 -10
- package/dist/cli/{version-7AL4JZ63.js.map → version-MDVCFTKA.js.map} +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.js +714 -54
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/chunk-4D6TT2IB.js.map +0 -1
- package/dist/cli/chunk-BHLHOS5Y.js.map +0 -1
- package/dist/cli/chunk-BJ376EN3.js.map +0 -1
- package/dist/cli/chunk-C5543CRX.js.map +0 -1
- package/dist/cli/chunk-K6W64QVE.js.map +0 -1
- package/dist/cli/chunk-MLXUGPJE.js.map +0 -1
- package/dist/cli/chunk-NHV5YGTB.js.map +0 -1
- package/dist/cli/chunk-RNSZYYGB.js.map +0 -1
- package/dist/cli/chunk-S4GF3HPO.js.map +0 -1
- package/dist/cli/chunk-WUI3P4RA.js +0 -319
- package/dist/cli/chunk-WUI3P4RA.js.map +0 -1
- package/dist/cli/code-6C5A2CY3.js.map +0 -1
- package/dist/cli/prompt-QSEB7HNQ.js +0 -11
- package/dist/cli/replay-D7RT2DR7.js.map +0 -1
- package/dist/cli/setup-IIAJXHP4.js.map +0 -1
- /package/dist/cli/{chat-QSM6JKUA.js.map → chat-FPEYKTMI.js.map} +0 -0
- /package/dist/cli/{chunk-T52GAWPP.js.map → chunk-3VTV4WAH.js.map} +0 -0
- /package/dist/cli/{chunk-G3XNWSFN.js.map → chunk-6NMWJSES.js.map} +0 -0
- /package/dist/cli/{chunk-4Q3GRJIU.js.map → chunk-AATCLE5N.js.map} +0 -0
- /package/dist/cli/{chunk-ZJR4QLXB.js.map → chunk-FB46F6H4.js.map} +0 -0
- /package/dist/cli/{chunk-XQIFIB3U.js.map → chunk-JOFZ6AW5.js.map} +0 -0
- /package/dist/cli/{chunk-IPCPEZWQ.js.map → chunk-LMNAMITH.js.map} +0 -0
- /package/dist/cli/{doctor-DKD34EFD.js.map → doctor-GGK2JKTA.js.map} +0 -0
- /package/dist/cli/{events-P27CX7LN.js.map → events-SQXPVV7B.js.map} +0 -0
- /package/dist/cli/{prompt-QSEB7HNQ.js.map → prompt-ODPFOKSH.js.map} +0 -0
- /package/dist/cli/{prune-sessions-ERL6B4G5.js.map → prune-sessions-FCFOYCBP.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-
|
|
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-
|
|
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-
|
|
18
|
+
import "./chunk-LY352GTC.js";
|
|
19
19
|
import {
|
|
20
|
-
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import "./chunk-
|
|
20
|
+
escalationContract
|
|
21
|
+
} from "./chunk-XOIDSPMQ.js";
|
|
22
|
+
import "./chunk-LMNAMITH.js";
|
|
23
23
|
import "./chunk-5X7LZJDE.js";
|
|
24
24
|
import {
|
|
25
25
|
listSessions
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-6CXT5JRM.js";
|
|
27
27
|
import {
|
|
28
28
|
t
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-FYKZB6TX.js";
|
|
30
30
|
import {
|
|
31
31
|
readConfig
|
|
32
|
-
} from "./chunk-
|
|
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 {
|
|
@@ -81,7 +80,8 @@ function resolveContinueFlag(flag, fallbackSession, getLatestSession, warn = ()
|
|
|
81
80
|
|
|
82
81
|
// src/cli/index.ts
|
|
83
82
|
markPhase("cli_module_loaded");
|
|
84
|
-
|
|
83
|
+
function defaultSystemPrompt(modelId) {
|
|
84
|
+
return `You are Reasonix, a helpful DeepSeek-powered assistant. Be concise and accurate. Use tools when available.
|
|
85
85
|
|
|
86
86
|
# Cite or shut up \u2014 non-negotiable
|
|
87
87
|
|
|
@@ -101,7 +101,8 @@ Your training data has a cutoff. When an answer's correctness depends on somethi
|
|
|
101
101
|
|
|
102
102
|
The signal isn't a topic list \u2014 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.
|
|
103
103
|
|
|
104
|
-
${
|
|
104
|
+
${escalationContract(modelId)}`;
|
|
105
|
+
}
|
|
105
106
|
function parseBudgetFlag(raw) {
|
|
106
107
|
if (raw === void 0) return void 0;
|
|
107
108
|
if (!Number.isFinite(raw) || raw <= 0) {
|
|
@@ -118,8 +119,8 @@ program.name("reasonix").description(t("cli.description")).version(VERSION).opti
|
|
|
118
119
|
program.action(async (opts) => {
|
|
119
120
|
const cfg = readConfig();
|
|
120
121
|
if (!cfg.setupCompleted) {
|
|
121
|
-
const { setupCommand } = await import("./setup-
|
|
122
|
-
await setupCommand({});
|
|
122
|
+
const { setupCommand } = await import("./setup-FTZNN3TZ.js");
|
|
123
|
+
await setupCommand({ forceKeyStep: true });
|
|
123
124
|
return;
|
|
124
125
|
}
|
|
125
126
|
const defaults = resolveDefaults({});
|
|
@@ -130,21 +131,21 @@ program.action(async (opts) => {
|
|
|
130
131
|
(msg) => process.stderr.write(`${msg}
|
|
131
132
|
`)
|
|
132
133
|
);
|
|
133
|
-
const { chatCommand } = await import("./chat-
|
|
134
|
+
const { chatCommand } = await import("./chat-FPEYKTMI.js");
|
|
134
135
|
await chatCommand({
|
|
135
136
|
model: defaults.model,
|
|
136
|
-
system: applyMemoryStack(
|
|
137
|
+
system: applyMemoryStack(defaultSystemPrompt(defaults.model), process.cwd()),
|
|
137
138
|
session: continueOpts.session,
|
|
138
139
|
mcp: defaults.mcp,
|
|
139
140
|
forceResume: continueOpts.forceResume
|
|
140
141
|
});
|
|
141
142
|
});
|
|
142
143
|
program.command("setup").description(t("cli.setup")).action(async () => {
|
|
143
|
-
const { setupCommand } = await import("./setup-
|
|
144
|
-
await setupCommand({});
|
|
144
|
+
const { setupCommand } = await import("./setup-FTZNN3TZ.js");
|
|
145
|
+
await setupCommand({ forceKeyStep: true });
|
|
145
146
|
});
|
|
146
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) => {
|
|
147
|
-
const { codeCommand } = await import("./code-
|
|
148
|
+
const { codeCommand } = await import("./code-GTE65OUT.js");
|
|
148
149
|
await codeCommand({
|
|
149
150
|
dir,
|
|
150
151
|
model: opts.model,
|
|
@@ -160,7 +161,7 @@ program.command("code [dir]").description(t("cli.code")).option("-m, --model <id
|
|
|
160
161
|
mouse: opts.mouse !== false
|
|
161
162
|
});
|
|
162
163
|
});
|
|
163
|
-
program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")
|
|
164
|
+
program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--preset <name>", t("ui.presetHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--session <name>", t("ui.sessionNameHint")).option("--no-session", t("ui.ephemeralHint")).option("-r, --resume", t("ui.resumeHint")).option("-c, --continue", t("cli.continue")).option("-n, --new", t("ui.newHint")).option(
|
|
164
165
|
"--mcp <spec>",
|
|
165
166
|
t("ui.mcpSpecHint"),
|
|
166
167
|
(value, previous = []) => [...previous, value],
|
|
@@ -180,10 +181,10 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
|
|
|
180
181
|
(msg) => process.stderr.write(`${msg}
|
|
181
182
|
`)
|
|
182
183
|
);
|
|
183
|
-
const { chatCommand } = await import("./chat-
|
|
184
|
+
const { chatCommand } = await import("./chat-FPEYKTMI.js");
|
|
184
185
|
await chatCommand({
|
|
185
186
|
model: defaults.model,
|
|
186
|
-
system: applyMemoryStack(opts.system, process.cwd()),
|
|
187
|
+
system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),
|
|
187
188
|
transcript: opts.transcript,
|
|
188
189
|
budgetUsd: parseBudgetFlag(opts.budget),
|
|
189
190
|
session: continueOpts.session,
|
|
@@ -196,7 +197,7 @@ program.command("chat").description(t("cli.chat")).option("-m, --model <id>", t(
|
|
|
196
197
|
mouse: opts.mouse !== false
|
|
197
198
|
});
|
|
198
199
|
});
|
|
199
|
-
program.command("run <task>").description(t("cli.run")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")
|
|
200
|
+
program.command("run <task>").description(t("cli.run")).option("-m, --model <id>", t("ui.modelIdHint")).option("-s, --system <prompt>", t("ui.systemPromptHint")).option("--preset <name>", t("ui.presetHintShort")).option("--budget <usd>", t("ui.budgetHintShort"), (v) => Number.parseFloat(v)).option("--transcript <path>", t("ui.transcriptHintShort")).option(
|
|
200
201
|
"--mcp <spec>",
|
|
201
202
|
t("ui.mcpSpecHintShort"),
|
|
202
203
|
(value, previous = []) => [...previous, value],
|
|
@@ -208,11 +209,11 @@ program.command("run <task>").description(t("cli.run")).option("-m, --model <id>
|
|
|
208
209
|
preset: opts.preset,
|
|
209
210
|
noConfig: opts.config === false
|
|
210
211
|
});
|
|
211
|
-
const { runCommand } = await import("./run-
|
|
212
|
+
const { runCommand } = await import("./run-WGSPYYOJ.js");
|
|
212
213
|
await runCommand({
|
|
213
214
|
task,
|
|
214
215
|
model: defaults.model,
|
|
215
|
-
system: applyMemoryStack(opts.system, process.cwd()),
|
|
216
|
+
system: applyMemoryStack(opts.system ?? defaultSystemPrompt(defaults.model), process.cwd()),
|
|
216
217
|
budgetUsd: parseBudgetFlag(opts.budget),
|
|
217
218
|
transcript: opts.transcript,
|
|
218
219
|
mcp: defaults.mcp,
|
|
@@ -224,23 +225,23 @@ program.command("stats [transcript]").description(t("cli.stats")).action(async (
|
|
|
224
225
|
statsCommand({ transcript });
|
|
225
226
|
});
|
|
226
227
|
program.command("doctor").description(t("cli.doctor")).action(async () => {
|
|
227
|
-
const { doctorCommand } = await import("./doctor-
|
|
228
|
+
const { doctorCommand } = await import("./doctor-GGK2JKTA.js");
|
|
228
229
|
await doctorCommand();
|
|
229
230
|
});
|
|
230
231
|
program.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
|
|
231
|
-
const { commitCommand } = await import("./commit-
|
|
232
|
+
const { commitCommand } = await import("./commit-TQ4DMUNS.js");
|
|
232
233
|
await commitCommand({ model: opts.model, yes: !!opts.yes });
|
|
233
234
|
});
|
|
234
235
|
program.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
|
|
235
|
-
const { sessionsCommand } = await import("./sessions-
|
|
236
|
+
const { sessionsCommand } = await import("./sessions-E4UH5JYL.js");
|
|
236
237
|
sessionsCommand({ name, verbose: !!opts.verbose });
|
|
237
238
|
});
|
|
238
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) => {
|
|
239
|
-
const { pruneSessionsCommand } = await import("./prune-sessions-
|
|
240
|
+
const { pruneSessionsCommand } = await import("./prune-sessions-FCFOYCBP.js");
|
|
240
241
|
pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });
|
|
241
242
|
});
|
|
242
243
|
program.command("events <name>").description(t("cli.events")).option("--type <type>", t("ui.eventTypeHint")).option("--since <id>", t("ui.eventSinceHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.eventTailHint"), (v) => Number.parseInt(v, 10)).option("--json", t("ui.jsonHint")).option("--projection", t("ui.projectionHint")).action(async (name, opts) => {
|
|
243
|
-
const { eventsCommand } = await import("./events-
|
|
244
|
+
const { eventsCommand } = await import("./events-SQXPVV7B.js");
|
|
244
245
|
eventsCommand({
|
|
245
246
|
name,
|
|
246
247
|
type: opts.type,
|
|
@@ -251,7 +252,7 @@ program.command("events <name>").description(t("cli.events")).option("--type <ty
|
|
|
251
252
|
});
|
|
252
253
|
});
|
|
253
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) => {
|
|
254
|
-
const { replayCommand } = await import("./replay-
|
|
255
|
+
const { replayCommand } = await import("./replay-R3QRXPI2.js");
|
|
255
256
|
await replayCommand({
|
|
256
257
|
path: transcript,
|
|
257
258
|
print: !!opts.print,
|
|
@@ -274,7 +275,7 @@ program.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>",
|
|
|
274
275
|
var mcp = program.command("mcp").description(t("cli.mcp"));
|
|
275
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) => {
|
|
276
277
|
try {
|
|
277
|
-
const { mcpListCommand } = await import("./mcp-
|
|
278
|
+
const { mcpListCommand } = await import("./mcp-M7I23TQ7.js");
|
|
278
279
|
await mcpListCommand({
|
|
279
280
|
json: !!opts.json,
|
|
280
281
|
local: !!opts.local,
|
|
@@ -291,7 +292,7 @@ mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("
|
|
|
291
292
|
});
|
|
292
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) => {
|
|
293
294
|
try {
|
|
294
|
-
const { mcpSearchCommand } = await import("./mcp-
|
|
295
|
+
const { mcpSearchCommand } = await import("./mcp-M7I23TQ7.js");
|
|
295
296
|
await mcpSearchCommand(query, {
|
|
296
297
|
json: !!opts.json,
|
|
297
298
|
refresh: !!opts.refresh,
|
|
@@ -306,7 +307,7 @@ mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("
|
|
|
306
307
|
});
|
|
307
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) => {
|
|
308
309
|
try {
|
|
309
|
-
const { mcpInstallCommand } = await import("./mcp-
|
|
310
|
+
const { mcpInstallCommand } = await import("./mcp-M7I23TQ7.js");
|
|
310
311
|
await mcpInstallCommand(name, {
|
|
311
312
|
refresh: !!opts.refresh,
|
|
312
313
|
maxPages: typeof opts.maxPages === "number" && opts.maxPages > 0 ? opts.maxPages : void 0
|
|
@@ -319,7 +320,7 @@ mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option(
|
|
|
319
320
|
});
|
|
320
321
|
mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async () => {
|
|
321
322
|
try {
|
|
322
|
-
const { mcpBrowseCommand } = await import("./mcp-browse-
|
|
323
|
+
const { mcpBrowseCommand } = await import("./mcp-browse-TWO7RYT4.js");
|
|
323
324
|
await mcpBrowseCommand();
|
|
324
325
|
} catch (err) {
|
|
325
326
|
process.stderr.write(`mcp browse failed: ${err.message}
|
|
@@ -338,7 +339,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
|
|
|
338
339
|
}
|
|
339
340
|
});
|
|
340
341
|
program.command("version").description(t("cli.version")).action(async () => {
|
|
341
|
-
const { versionCommand } = await import("./version-
|
|
342
|
+
const { versionCommand } = await import("./version-MDVCFTKA.js");
|
|
342
343
|
versionCommand();
|
|
343
344
|
});
|
|
344
345
|
program.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
|
|
@@ -347,7 +348,7 @@ program.command("update").description(t("cli.update")).option("--dry-run", t("ui
|
|
|
347
348
|
});
|
|
348
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(
|
|
349
350
|
async (opts) => {
|
|
350
|
-
const { indexCommand } = await import("./commands-
|
|
351
|
+
const { indexCommand } = await import("./commands-R4JWISND.js");
|
|
351
352
|
await indexCommand(opts);
|
|
352
353
|
}
|
|
353
354
|
);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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 { ESCALATION_CONTRACT } from \"../prompt-fragments.js\";\nimport { resolveContinueFlag, resolveDefaults } from \"./resolve.js\";\nimport { markPhase } from \"./startup-profile.js\";\n\nmarkPhase(\"cli_module_loaded\");\n\nconst DEFAULT_SYSTEM = `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${ESCALATION_CONTRACT}`;\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(DEFAULT_SYSTEM, 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\"), DEFAULT_SYSTEM)\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, 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\"), DEFAULT_SYSTEM)\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, 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-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;AAYA,IAAM,qBAAqB;AAE3B,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AAEzB,IAAM,mBAAkC,CAAC,EAAE,QAAQ,MAAM,QAAQ,MAAM;AACrE,MAAI,SAAS,KAAK,OAAO,MAAM,GAAG;AAChC,YAAQ,OAAO,MAAM,qBAAgB,MAAM,uBAAoB,IAAI,SAAM,OAAO,UAAU;AAAA,EAC5F;AACF;AAEA,SAAS,qBAA2B;AAClC,MAAI,QAAQ,OAAO,MAAO,SAAQ,OAAO,MAAM,UAAU;AAAA,MACpD,SAAQ,OAAO,MAAM,IAAI;AAChC;AA8BA,SAAS,YAAY,SAA2C;AAC9D,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,KAAK,EAAE,cAAc;AAC3B,UAAM,KAAK,EAAE,cAAc;AAC3B,QAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,IAAI,GAAW,OAAuB;AAC7C,SAAO,EAAE,UAAU,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,EAAE,MAAM;AAChE;AAEA,SAAS,OAAO,IAAoB;AAClC,QAAM,MAAM,KAAK,MAAM,KAAK,GAAI;AAChC,MAAI,MAAM,GAAI,QAAO,GAAG,GAAG;AAC3B,MAAI,MAAM,KAAM,QAAO,GAAG,KAAK,MAAM,MAAM,EAAE,CAAC;AAC9C,MAAI,MAAM,MAAO,QAAO,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC;AACjD,SAAO,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC;AACnC;AAEA,SAAS,WAAW,GAAkB,SAAS,MAAY;AACzD,QAAM,MACJ,EAAE,WAAW,aAAa,eAAe,EAAE,WAAW,aAAa,eAAe;AACpF,QAAM,MAAM,EAAE,eAAe,SAAY,SAAM,EAAE,WAAW,eAAe,CAAC,UAAU;AACtF,UAAQ,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE;AACtD,MAAI,EAAE,YAAa,SAAQ,IAAI,GAAG,MAAM,OAAO,EAAE,WAAW,EAAE;AAC9D,MAAI,EAAE,SAAS,aAAa,QAAQ;AAClC,YAAQ,IAAI,GAAG,MAAM,cAAc,EAAE,QAAQ,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACvE,WAAW,CAAC,EAAE,SAAS;AACrB,YAAQ,IAAI,GAAG,MAAM,wEAAmE;AAAA,EAC1F;AACF;AAEA,eAAsB,eAAe,OAAuB,CAAC,GAAkB;AAC7E,MAAI,KAAK,OAAO;AACd,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAChD;AAAA,IACF;AACA,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,EAAE;AACd,eAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,KAAK,IAAI,MAAM,MAAM,EAAE,CAAC,IAAI,MAAM,OAAO,EAAE;AACvD,cAAQ,IAAI,kBAAkB,cAAc,KAAK,CAAC,EAAE;AACpD,UAAI,MAAM,KAAM,SAAQ,IAAI,uBAAoB,MAAM,IAAI,EAAE;AAC5D,cAAQ,IAAI,EAAE;AAAA,IAChB;AACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,cAAc,KAAK,MAAM,OAAO,oBAAqB,KAAK,SAAS;AACzE,QAAM,aAAa,KAAK,IAAI,GAAG,cAAc,OAAO,MAAM,WAAW,WAAW;AAChF,MAAI,aAAa,GAAG;AAClB,UAAM,cAAc,QAAQ;AAAA,MAC1B,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,qBAAmB;AAEnB,QAAM,SAAS,oBAAoB,MAAM;AACzC,QAAM,SAAS,YAAY,OAAO,OAAO;AACzC,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;AAEnC,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO,QAAQ;AAAA,UACvB,SAAS,OAAO;AAAA,UAChB,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,YAClB,WAAW,OAAO,KAAK,IAAI,IAAI,OAAO,SAAS,CAAC,KAChD;AACJ,QAAM,UAAU,OAAO,UAAU,mBAAmB;AACpD,UAAQ;AAAA,IACN,oBAAoB,OAAO,MAAM,cAAc,OAAO,QAAQ,MAAM,YAAY,OAAO,KAAK,MAAM;AAAA,EACpG;AACA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,eAAW,KAAK,OAAO,OAAQ,SAAQ,MAAM,WAAW,CAAC,EAAE;AAAA,EAC7D;AACA,UAAQ,IAAI,EAAE;AACd,aAAW,KAAK,MAAO,YAAW,CAAC;AACnC,MAAI,OAAO,SAAS,OAAO;AACzB,YAAQ;AAAA,MACN,YAAO,OAAO,SAAS,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,OAAO,SAAS;AAClB,YAAQ,IAAI,+EAAqE;AAAA,EACnF;AACA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,uCAAuC;AACrD;AAEA,SAAS,YAAY,OAA8C;AACjE,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,SAAS,CAAC;AAChF;AAEA,eAAsB,iBAAiB,OAAe,OAAyB,CAAC,GAAkB;AAChG,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,GAAG;AACN,YAAQ,MAAM,oCAAoC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,SAAS,YAAY,CAAC;AAC5B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,MAAM,KAAK,YAAY;AAE7B,QAAM,cAAc,QAAQ;AAAA,IAC1B,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW;AAAA,IAC5D,aAAa;AAAA,IACb;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,qBAAmB;AAEnB,QAAM,SAAS,oBAAoB,MAAM;AACzC,QAAM,UAAU,YAAY,OAAO,QAAQ,OAAO,MAAM,CAAC;AACzD,QAAM,QAAQ,QAAQ,MAAM,GAAG,KAAK;AAEpC,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,OAAO;AAAA,UACP,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO,QAAQ;AAAA,UACvB,SAAS,OAAO;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,SAAS;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ;AAAA,MACN,mBAAmB,CAAC,YAAY,OAAO,QAAQ,MAAM,oBAAoB,OAAO,MAAM,GACpF,OAAO,UAAU,gEAA2D,EAC9E;AAAA,IACF;AACA;AAAA,EACF;AACA,UAAQ;AAAA,IACN,GAAG,QAAQ,MAAM,mBAAmB,CAAC,QAAQ,OAAO,MAAM,cAAc,OAAO,QAAQ,MAAM;AAAA,EAC/F;AACA,UAAQ,IAAI,EAAE;AACd,aAAW,KAAK,MAAO,YAAW,CAAC;AACnC,MAAI,QAAQ,SAAS,MAAO,SAAQ,IAAI,YAAO,QAAQ,SAAS,KAAK,eAAe;AACtF;AAEA,SAAS,UAAU,SAA0B,MAAoC;AAC/E,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,MAAI,MAAO,QAAO;AAClB,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK;AAC7D,MAAI,GAAI,QAAO;AACf,QAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,EAAE,SAAS,IAAI,KAAK,EAAE,CAAC;AAC3E,MAAI,KAAM,QAAO;AACjB,SAAO;AACT;AAEA,eAAsB,kBAAkB,MAAc,OAA0B,CAAC,GAAkB;AACjG,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,oCAAoC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,aAAa,EAAE,SAAS,KAAK,SAAS,YAAY,iBAAiB,CAAC;AACzF,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,SAAS,CAAC,MAA8B;AAC5C,UAAM,IAAI,EAAE,KAAK,YAAY;AAC7B,WAAO,MAAM,SAAS,EAAE,SAAS,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,KAAK;AAAA,EACnE;AACA,QAAM,MAAM,KAAK,YAAY;AAE7B,QAAM,cAAc,QAAQ;AAAA,IAC1B,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW;AAAA,IAC5D,aAAa;AAAA,IACb;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,qBAAmB;AAEnB,QAAM,QAAQ,UAAU,OAAO,MAAM,SAAS,MAAM;AACpD,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,wBAAwB,MAAM,yBAAyB,OAAO,MAAM,WAAW,WAAW,mBAAmB,OAAO,MAAM;AAAA,IAC5H;AACA,QAAI,OAAO,MAAM,WAAW,eAAe,MAAM;AAC/C,cAAQ,MAAM,6BAA6B,MAAM,kBAAkB;AAAA,IACrE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,WAAW,MAAM,WAAW,YAAY;AACjD,YAAQ,OAAO,MAAM,+CAA0C,MAAM,IAAI;AAAA,CAAK;AAC9E,UAAM,UAAU,MAAM,oBAAoB,MAAM,IAAI;AACpD,QAAI,QAAS,OAAM,UAAU;AAAA,EAC/B;AAEA,MAAI,CAAC,MAAM,SAAS;AAClB,YAAQ;AAAA,MACN,0CAA0C,MAAM,IAAI,+CAA0C,MAAM,IAAI;AAAA,IAC1G;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,cAAc,MAAM,MAAM,MAAM,OAAO;AAAA,EAChD,SAAS,KAAK;AACZ,YAAQ,MAAM,iCAAiC,MAAM,IAAI,KAAM,IAAc,OAAO,EAAE;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,WAAW;AACvB,QAAM,WAAW,IAAI,OAAO,CAAC;AAC7B,MAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,YAAQ,IAAI,sBAAsB,IAAI,EAAE;AACxC;AAAA,EACF;AACA,QAAM,OAAO,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,UAAU,IAAI,EAAE;AAChD,cAAY,IAAI;AAEhB,UAAQ,IAAI,cAAc,MAAM,IAAI,EAAE;AACtC,UAAQ,IAAI,cAAc,IAAI,EAAE;AAChC,MAAI,MAAM,QAAQ,aAAa,QAAQ;AACrC,YAAQ;AAAA,MACN,cAAc,MAAM,QAAQ,YAAY,KAAK,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN;AAAA,EACF;AACF;","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-
|
|
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-
|
|
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":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
CODE_SYSTEM_PROMPT,
|
|
4
|
+
codeSystemBase,
|
|
5
|
+
codeSystemPrompt
|
|
6
|
+
} from "./chunk-A63QT566.js";
|
|
7
|
+
import "./chunk-XOIDSPMQ.js";
|
|
8
|
+
export {
|
|
9
|
+
CODE_SYSTEM_PROMPT,
|
|
10
|
+
codeSystemBase,
|
|
11
|
+
codeSystemPrompt
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=prompt-ODPFOKSH.js.map
|