@theone1345/smartrelay 0.2.0 → 0.3.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/LICENSE +21 -0
- package/README.md +127 -17
- package/config/runners/agents.yaml +14 -1
- package/dist/credentials.d.ts +94 -0
- package/dist/credentials.js +168 -0
- package/dist/credentials.js.map +1 -0
- package/dist/http-api.d.ts +1 -7
- package/dist/http-api.js +6 -169
- package/dist/http-api.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +57 -0
- package/dist/install.js +216 -0
- package/dist/install.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +21 -1
- package/dist/logger.js.map +1 -1
- package/dist/profiles/review-profiles.d.ts +32 -0
- package/dist/profiles/review-profiles.js +348 -0
- package/dist/profiles/review-profiles.js.map +1 -0
- package/dist/router.js +18 -3
- package/dist/router.js.map +1 -1
- package/dist/runners/anthropic.js +2 -3
- package/dist/runners/anthropic.js.map +1 -1
- package/dist/runners/base.d.ts +8 -0
- package/dist/runners/base.js +13 -0
- package/dist/runners/base.js.map +1 -1
- package/dist/runners/openai.js +2 -3
- package/dist/runners/openai.js.map +1 -1
- package/dist/runners/registry.d.ts +2 -0
- package/dist/runners/registry.js +4 -0
- package/dist/runners/registry.js.map +1 -1
- package/dist/server.d.ts +1 -6
- package/dist/server.js +134 -66
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +65 -0
- package/dist/setup.js +411 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/dispatch.d.ts +33 -0
- package/dist/tools/dispatch.js +222 -0
- package/dist/tools/dispatch.js.map +1 -0
- package/dist/tools/handlers.d.ts +8 -2
- package/dist/tools/handlers.js +119 -27
- package/dist/tools/handlers.js.map +1 -1
- package/dist/util.d.ts +37 -4
- package/dist/util.js +71 -15
- package/dist/util.js.map +1 -1
- package/package.json +28 -3
- package/prompts/code_review.md +26 -20
- package/prompts/security_audit.md +109 -0
package/dist/setup.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Interactive credential setup for SmartRelay.
|
|
4
|
+
*
|
|
5
|
+
* Asks for the provider API keys in the terminal and stores them in
|
|
6
|
+
* `~/.smartrelay/.env` (mode 600), which `loadDotEnv()` reads as its
|
|
7
|
+
* lowest-priority source.
|
|
8
|
+
*
|
|
9
|
+
* This writes prompts to STDOUT, which is only safe because the wizard never
|
|
10
|
+
* runs in a process that connects `StdioServerTransport` — `src/server.ts`
|
|
11
|
+
* dispatches the `setup` subcommand and exits before any transport is created.
|
|
12
|
+
* See the note at the top of `src/logger.ts` for why stdout is otherwise
|
|
13
|
+
* off-limits.
|
|
14
|
+
*/
|
|
15
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import * as readline from 'node:readline/promises';
|
|
18
|
+
import { Writable } from 'node:stream';
|
|
19
|
+
import { fileURLToPath } from 'node:url';
|
|
20
|
+
import { parseArgs } from 'node:util';
|
|
21
|
+
import { formatRunnerStatusLines, maskKey, PROVIDER_KEYS, summarizeCredentials, validateKeyFormat, } from './credentials.js';
|
|
22
|
+
import { RunnerRegistry } from './runners/registry.js';
|
|
23
|
+
import { describeError, globalEnvPath, loadDotEnv, parseEnvText, smartrelayHome } from './util.js';
|
|
24
|
+
/** How many times a required key is re-asked before offering to skip it. */
|
|
25
|
+
const REQUIRED_ATTEMPTS = 3;
|
|
26
|
+
// =========================================================================
|
|
27
|
+
// FILE WRITING
|
|
28
|
+
// =========================================================================
|
|
29
|
+
/** Quote a value only when a bare one would not survive `parseEnvText`. */
|
|
30
|
+
function formatEnvValue(value) {
|
|
31
|
+
return /[\s#]/.test(value) ? `"${value}"` : value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Fold `updates` into existing `.env` text without disturbing anything else.
|
|
35
|
+
*
|
|
36
|
+
* Comments, blank lines, and unrelated keys survive verbatim — the file may hold
|
|
37
|
+
* values a user added by hand (`SMARTRELAY_HTTP_API_KEY`, say) that the wizard
|
|
38
|
+
* knows nothing about and must not drop.
|
|
39
|
+
*/
|
|
40
|
+
export function mergeEnvText(original, updates) {
|
|
41
|
+
const consumed = new Set();
|
|
42
|
+
const kept = [];
|
|
43
|
+
for (const rawLine of original.split(/\r?\n/)) {
|
|
44
|
+
const line = rawLine.trim();
|
|
45
|
+
const splitAt = line.indexOf('=');
|
|
46
|
+
const key = !line || line.startsWith('#') || splitAt < 0 ? null : line.slice(0, splitAt).trim();
|
|
47
|
+
if (key && updates.has(key)) {
|
|
48
|
+
// Replace the first occurrence in place; drop any later duplicate so the
|
|
49
|
+
// key cannot end up defined twice with different values.
|
|
50
|
+
if (!consumed.has(key)) {
|
|
51
|
+
consumed.add(key);
|
|
52
|
+
kept.push(`${key}=${formatEnvValue(updates.get(key))}`);
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
kept.push(rawLine);
|
|
57
|
+
}
|
|
58
|
+
const appended = [...updates].filter(([key]) => !consumed.has(key));
|
|
59
|
+
while (kept.length && kept[kept.length - 1]?.trim() === '')
|
|
60
|
+
kept.pop();
|
|
61
|
+
if (appended.length) {
|
|
62
|
+
if (kept.length)
|
|
63
|
+
kept.push('');
|
|
64
|
+
kept.push(`# Added by smartrelay setup on ${new Date().toISOString().slice(0, 10)}`);
|
|
65
|
+
for (const [key, value] of appended)
|
|
66
|
+
kept.push(`${key}=${formatEnvValue(value)}`);
|
|
67
|
+
}
|
|
68
|
+
return `${kept.join('\n')}\n`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Write the merged credential file.
|
|
72
|
+
*
|
|
73
|
+
* Written to a temp file and renamed so an interrupted run can never leave a
|
|
74
|
+
* half-written credential file behind, and chmod'd explicitly because the mode
|
|
75
|
+
* passed to `mkdir`/`writeFile` is masked by the process umask.
|
|
76
|
+
*/
|
|
77
|
+
export function writeGlobalEnv(updates, homeOverride) {
|
|
78
|
+
const dir = smartrelayHome(homeOverride);
|
|
79
|
+
const target = path.join(dir, '.env');
|
|
80
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
81
|
+
tryChmod(dir, 0o700);
|
|
82
|
+
const original = existsSync(target) ? readFileSync(target, 'utf-8') : '';
|
|
83
|
+
const merged = mergeEnvText(original, updates);
|
|
84
|
+
const tmp = path.join(dir, `.env.tmp-${process.pid}`);
|
|
85
|
+
try {
|
|
86
|
+
writeFileSync(tmp, merged, { mode: 0o600 });
|
|
87
|
+
tryChmod(tmp, 0o600);
|
|
88
|
+
renameSync(tmp, target);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
rmSync(tmp, { force: true });
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
return target;
|
|
95
|
+
}
|
|
96
|
+
/** `chmod` is a no-op on some filesystems and throws on others — never fatal. */
|
|
97
|
+
function tryChmod(target, mode) {
|
|
98
|
+
try {
|
|
99
|
+
chmodSync(target, mode);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Permissions are advisory here; the file is still written.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Render a path with the home directory collapsed back to `~`. */
|
|
106
|
+
function displayPath(filePath) {
|
|
107
|
+
const home = process.env['HOME'] ?? process.env['USERPROFILE'];
|
|
108
|
+
return home && filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;
|
|
109
|
+
}
|
|
110
|
+
// =========================================================================
|
|
111
|
+
// WIZARD
|
|
112
|
+
// =========================================================================
|
|
113
|
+
/**
|
|
114
|
+
* Open a prompt session, or return `null` when there is no terminal to prompt on.
|
|
115
|
+
*
|
|
116
|
+
* Shared by `setup` and `init` so a single run can ask for keys and then for
|
|
117
|
+
* client registration over one readline — two competing interfaces on the same
|
|
118
|
+
* stdin would race for lines.
|
|
119
|
+
*/
|
|
120
|
+
export function openWizardIo(options = {}) {
|
|
121
|
+
const out = options.output ?? process.stdout;
|
|
122
|
+
const input = options.input ?? process.stdin;
|
|
123
|
+
// An explicitly injected stream is always scriptable; otherwise both ends must
|
|
124
|
+
// be a real terminal or the prompts would block forever on a closed stdin.
|
|
125
|
+
const scripted = Boolean(options.input);
|
|
126
|
+
if (!scripted && (!process.stdin.isTTY || !process.stdout.isTTY))
|
|
127
|
+
return null;
|
|
128
|
+
let muted = false;
|
|
129
|
+
const muteable = new Writable({
|
|
130
|
+
write(chunk, _encoding, callback) {
|
|
131
|
+
if (!muted)
|
|
132
|
+
out.write(chunk);
|
|
133
|
+
callback();
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
const rl = readline.createInterface({ input, output: muteable, terminal: !scripted });
|
|
137
|
+
return {
|
|
138
|
+
read: createLineReader(rl),
|
|
139
|
+
write: (line = '') => void out.write(`${line}\n`),
|
|
140
|
+
setMuted: (next) => {
|
|
141
|
+
muted = next;
|
|
142
|
+
},
|
|
143
|
+
close: () => {
|
|
144
|
+
muted = false;
|
|
145
|
+
rl.close();
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** The message shown when there is no terminal and no `--non-interactive`. */
|
|
150
|
+
export function noTerminalMessage(command) {
|
|
151
|
+
return (`smartrelay ${command} needs an interactive terminal.\n` +
|
|
152
|
+
'Run it directly in a shell, or use --non-interactive with ' +
|
|
153
|
+
`${PROVIDER_KEYS.filter((s) => s.required).map((s) => s.env).join(' and ')} exported.\n`);
|
|
154
|
+
}
|
|
155
|
+
export async function runSetup(options = {}, sharedIo) {
|
|
156
|
+
const out = options.output ?? process.stdout;
|
|
157
|
+
const write = (line = '') => void out.write(`${line}\n`);
|
|
158
|
+
const target = globalEnvPath(options.home);
|
|
159
|
+
const fileValues = existsSync(target)
|
|
160
|
+
? parseEnvText(readFileSync(target, 'utf-8'))
|
|
161
|
+
: new Map();
|
|
162
|
+
if (options.nonInteractive) {
|
|
163
|
+
return harvestFromEnvironment(options, write);
|
|
164
|
+
}
|
|
165
|
+
const io = sharedIo ?? openWizardIo(options);
|
|
166
|
+
if (!io) {
|
|
167
|
+
process.stderr.write(noTerminalMessage('setup'));
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
const read = io.read;
|
|
171
|
+
write();
|
|
172
|
+
write('SmartRelay setup');
|
|
173
|
+
write('────────────────');
|
|
174
|
+
write(`Keys are saved to ${displayPath(target)} (readable only by you).`);
|
|
175
|
+
write('Your keystrokes are not shown while you type a key.');
|
|
176
|
+
const updates = new Map();
|
|
177
|
+
try {
|
|
178
|
+
for (const spec of PROVIDER_KEYS) {
|
|
179
|
+
const existing = fileValues.get(spec.env) ?? process.env[spec.env] ?? '';
|
|
180
|
+
const source = fileValues.has(spec.env)
|
|
181
|
+
? displayPath(target)
|
|
182
|
+
: existing
|
|
183
|
+
? 'environment'
|
|
184
|
+
: null;
|
|
185
|
+
write();
|
|
186
|
+
write(`${spec.env} — ${spec.label} [${spec.required ? 'required' : 'optional'}]`);
|
|
187
|
+
write(` Get one at ${spec.consoleUrl}`);
|
|
188
|
+
if (existing) {
|
|
189
|
+
write(` already set: ${maskKey(existing)} (from ${source}) — press Enter to keep`);
|
|
190
|
+
if (source === 'environment') {
|
|
191
|
+
write(` pressing Enter also copies it into ${displayPath(target)}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else if (!spec.required) {
|
|
195
|
+
write(' press Enter to skip');
|
|
196
|
+
}
|
|
197
|
+
const value = await promptForKey(read, spec, existing, io);
|
|
198
|
+
if (value)
|
|
199
|
+
updates.set(spec.env, value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
// Only tear down a session this call created; a shared one outlives it.
|
|
204
|
+
if (!sharedIo)
|
|
205
|
+
io.close();
|
|
206
|
+
}
|
|
207
|
+
if (!updates.size) {
|
|
208
|
+
write();
|
|
209
|
+
write('Nothing to save — no keys entered.');
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
const saved = writeGlobalEnv(updates, options.home);
|
|
213
|
+
for (const [key, value] of updates)
|
|
214
|
+
process.env[key] = value;
|
|
215
|
+
write();
|
|
216
|
+
write(`Saved ${updates.size} key${updates.size === 1 ? '' : 's'} to ${displayPath(saved)} (mode 600)`);
|
|
217
|
+
printReadiness(options.configPath ?? null, write);
|
|
218
|
+
const stillMissing = PROVIDER_KEYS.filter((spec) => spec.required && !process.env[spec.env]);
|
|
219
|
+
if (stillMissing.length) {
|
|
220
|
+
write();
|
|
221
|
+
write(`Still missing: ${stillMissing.map((s) => s.env).join(', ')} — re-run setup to add them.`);
|
|
222
|
+
}
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Buffer readline's `line` events into a queue.
|
|
227
|
+
*
|
|
228
|
+
* `rl.question()` only captures input while a question is pending, so a scripted
|
|
229
|
+
* stream that delivers every line at once loses all but the first — and once the
|
|
230
|
+
* stream ends, any later `question()` rejects with "readline was closed". A queue
|
|
231
|
+
* decouples arrival from consumption and turns end-of-input into a `null` the
|
|
232
|
+
* caller can handle.
|
|
233
|
+
*/
|
|
234
|
+
function createLineReader(rl) {
|
|
235
|
+
const buffered = [];
|
|
236
|
+
const waiting = [];
|
|
237
|
+
let closed = false;
|
|
238
|
+
rl.on('line', (line) => {
|
|
239
|
+
const next = waiting.shift();
|
|
240
|
+
if (next)
|
|
241
|
+
next(line);
|
|
242
|
+
else
|
|
243
|
+
buffered.push(line);
|
|
244
|
+
});
|
|
245
|
+
rl.on('close', () => {
|
|
246
|
+
closed = true;
|
|
247
|
+
while (waiting.length)
|
|
248
|
+
waiting.shift()?.(null);
|
|
249
|
+
});
|
|
250
|
+
return () => {
|
|
251
|
+
if (buffered.length)
|
|
252
|
+
return Promise.resolve(buffered.shift());
|
|
253
|
+
if (closed)
|
|
254
|
+
return Promise.resolve(null);
|
|
255
|
+
return new Promise((resolve) => waiting.push(resolve));
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/** Ask for one provider key, returning the value to persist (or `null` to skip). */
|
|
259
|
+
async function promptForKey(read, spec, existing, io) {
|
|
260
|
+
for (let attempt = 1;; attempt++) {
|
|
261
|
+
const entered = await promptSecret(read, io);
|
|
262
|
+
// Input ended: keep whatever was already configured and stop asking, rather
|
|
263
|
+
// than spinning on the required-key retry loop forever.
|
|
264
|
+
if (entered === null)
|
|
265
|
+
return existing || null;
|
|
266
|
+
if (!entered) {
|
|
267
|
+
// Keeping an existing value still persists it — a key that only lived in
|
|
268
|
+
// the shell environment would otherwise vanish with the session.
|
|
269
|
+
if (existing)
|
|
270
|
+
return existing;
|
|
271
|
+
if (!spec.required)
|
|
272
|
+
return null;
|
|
273
|
+
if (attempt < REQUIRED_ATTEMPTS) {
|
|
274
|
+
io.write(` ${spec.env} is required. Paste the key, or press Enter ${REQUIRED_ATTEMPTS - attempt} more time(s) to skip.`);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const skip = await confirm(read, io, ` Skip ${spec.env}? Runners that use it will fail. [y/N]`, false);
|
|
278
|
+
if (skip)
|
|
279
|
+
return null;
|
|
280
|
+
attempt = 0;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const warning = validateKeyFormat(spec, entered);
|
|
284
|
+
if (warning) {
|
|
285
|
+
io.write(` warning: ${warning}`);
|
|
286
|
+
// Warn, never reject: providers change key formats, and refusing a valid
|
|
287
|
+
// new-style key is worse than storing a typo the user can correct.
|
|
288
|
+
const save = await confirm(read, io, ' Save anyway? [Y/n]', true);
|
|
289
|
+
if (!save)
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
io.write(` stored ${maskKey(entered)}`);
|
|
293
|
+
return entered;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/** Read a line with terminal echo suppressed. `null` means input ended. */
|
|
297
|
+
async function promptSecret(read, io) {
|
|
298
|
+
io.write(' key (input hidden, paste is fine):');
|
|
299
|
+
io.setMuted(true);
|
|
300
|
+
try {
|
|
301
|
+
const line = await read();
|
|
302
|
+
return line === null ? null : line.trim();
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
io.setMuted(false);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async function confirm(read, io, prompt, defaultYes) {
|
|
309
|
+
io.write(prompt);
|
|
310
|
+
const answer = (await read())?.trim().toLowerCase();
|
|
311
|
+
if (!answer)
|
|
312
|
+
return defaultYes;
|
|
313
|
+
return answer.startsWith('y');
|
|
314
|
+
}
|
|
315
|
+
// =========================================================================
|
|
316
|
+
// NON-INTERACTIVE MODE
|
|
317
|
+
// =========================================================================
|
|
318
|
+
/** CI / Dockerfile path: persist whatever is already exported, prompt for nothing. */
|
|
319
|
+
function harvestFromEnvironment(options, write) {
|
|
320
|
+
const updates = new Map();
|
|
321
|
+
for (const spec of PROVIDER_KEYS) {
|
|
322
|
+
const value = process.env[spec.env];
|
|
323
|
+
if (value)
|
|
324
|
+
updates.set(spec.env, value);
|
|
325
|
+
}
|
|
326
|
+
const missing = PROVIDER_KEYS.filter((spec) => spec.required && !process.env[spec.env]);
|
|
327
|
+
if (missing.length) {
|
|
328
|
+
process.stderr.write(`smartrelay setup --non-interactive: ${missing.map((s) => s.env).join(', ')} not set in the environment.\n`);
|
|
329
|
+
return 1;
|
|
330
|
+
}
|
|
331
|
+
const saved = writeGlobalEnv(updates, options.home);
|
|
332
|
+
write(`Saved ${updates.size} key${updates.size === 1 ? '' : 's'} to ${displayPath(saved)} (mode 600)`);
|
|
333
|
+
printReadiness(options.configPath ?? null, write);
|
|
334
|
+
return 0;
|
|
335
|
+
}
|
|
336
|
+
// =========================================================================
|
|
337
|
+
// SUMMARY
|
|
338
|
+
// =========================================================================
|
|
339
|
+
/** Print how many runners the new credentials actually unlocked. */
|
|
340
|
+
function printReadiness(configPath, write) {
|
|
341
|
+
let registry;
|
|
342
|
+
try {
|
|
343
|
+
registry = RunnerRegistry.fromYaml(configPath);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
// Never fail the wizard over this — the keys are already safely written.
|
|
347
|
+
write(`Could not load config.yaml to verify runners: ${describeError(err)}`);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const metadata = registry.getRunnersMetadata();
|
|
351
|
+
const summary = summarizeCredentials(metadata);
|
|
352
|
+
write();
|
|
353
|
+
write(`${summary.ready} of ${summary.total} runners ready.`);
|
|
354
|
+
for (const line of formatRunnerStatusLines(metadata))
|
|
355
|
+
write(line);
|
|
356
|
+
if (summary.missingEnvVars.length) {
|
|
357
|
+
write();
|
|
358
|
+
write(`Not configured: ${summary.missingEnvVars.join(', ')}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// =========================================================================
|
|
362
|
+
// CLI ENTRYPOINT
|
|
363
|
+
// =========================================================================
|
|
364
|
+
const USAGE = `Usage: smartrelay setup [options]
|
|
365
|
+
|
|
366
|
+
Prompts for your provider API keys and saves them to ~/.smartrelay/.env (mode 600).
|
|
367
|
+
|
|
368
|
+
Options:
|
|
369
|
+
-c, --config <path> config.yaml used for the readiness summary
|
|
370
|
+
--non-interactive save keys already present in the environment, no prompts
|
|
371
|
+
-h, --help show this message`;
|
|
372
|
+
function checkDirectExecution() {
|
|
373
|
+
const script = process.argv[1];
|
|
374
|
+
if (!script)
|
|
375
|
+
return false;
|
|
376
|
+
try {
|
|
377
|
+
if (realpathSync(script) === realpathSync(fileURLToPath(import.meta.url)))
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// Fall back to filename checks
|
|
382
|
+
}
|
|
383
|
+
return ['setup', 'smartrelay-setup'].includes(path.basename(script, path.extname(script)));
|
|
384
|
+
}
|
|
385
|
+
if (checkDirectExecution()) {
|
|
386
|
+
loadDotEnv();
|
|
387
|
+
try {
|
|
388
|
+
const { values } = parseArgs({
|
|
389
|
+
options: {
|
|
390
|
+
config: { type: 'string', short: 'c' },
|
|
391
|
+
'non-interactive': { type: 'boolean', default: false },
|
|
392
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
393
|
+
},
|
|
394
|
+
allowPositionals: true,
|
|
395
|
+
});
|
|
396
|
+
if (values.help) {
|
|
397
|
+
process.stdout.write(`${USAGE}\n`);
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
process.exitCode = await runSetup({
|
|
401
|
+
nonInteractive: values['non-interactive'],
|
|
402
|
+
configPath: values.config ?? null,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
process.stderr.write(`${describeError(err)}\n${USAGE}\n`);
|
|
408
|
+
process.exitCode = 2;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport-agnostic tool dispatch.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `http-api.ts` so the HTTP API, the MCPHub plugin, and tests all
|
|
5
|
+
* route through one switch instead of three drifting copies. Adding a tool here
|
|
6
|
+
* reaches every surface at once.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately does NOT call `loadDotEnv()` at module scope — only the two CLI
|
|
9
|
+
* entrypoints (`server.ts`, `http-api.ts`) do. If this module loaded `.env`
|
|
10
|
+
* files, an ambient `.env` sitting in whatever directory the host process
|
|
11
|
+
* happens to run from would silently override credentials the user configured
|
|
12
|
+
* explicitly (for example in the MCPHub settings UI).
|
|
13
|
+
*/
|
|
14
|
+
import { BenchmarkEngine } from '../benchmark/engine.js';
|
|
15
|
+
import { TaskRouter } from '../router.js';
|
|
16
|
+
import { RunnerRegistry } from '../runners/registry.js';
|
|
17
|
+
/** The three collaborators every tool handler needs. */
|
|
18
|
+
export interface DispatchContext {
|
|
19
|
+
registry: RunnerRegistry;
|
|
20
|
+
router: TaskRouter;
|
|
21
|
+
engine: BenchmarkEngine;
|
|
22
|
+
}
|
|
23
|
+
export declare function getRegistry(configPath?: string | null): RunnerRegistry;
|
|
24
|
+
export declare function getEngine(): BenchmarkEngine;
|
|
25
|
+
export declare function getRouter(): TaskRouter;
|
|
26
|
+
/**
|
|
27
|
+
* Build a standalone context that does not share the module-level singletons.
|
|
28
|
+
*
|
|
29
|
+
* Used where the process hosts more than just SmartRelay (the MCPHub plugin) and
|
|
30
|
+
* by tests that need an isolated registry.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createDispatchContext(configPath?: string | null): DispatchContext;
|
|
33
|
+
export declare function dispatchTool(toolName: string, args?: Record<string, unknown>, ctx?: DispatchContext): Promise<unknown>;
|