@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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -17
  3. package/config/runners/agents.yaml +14 -1
  4. package/dist/credentials.d.ts +94 -0
  5. package/dist/credentials.js +168 -0
  6. package/dist/credentials.js.map +1 -0
  7. package/dist/http-api.d.ts +1 -7
  8. package/dist/http-api.js +6 -169
  9. package/dist/http-api.js.map +1 -1
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.js +5 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/install.d.ts +57 -0
  14. package/dist/install.js +216 -0
  15. package/dist/install.js.map +1 -0
  16. package/dist/logger.d.ts +2 -0
  17. package/dist/logger.js +21 -1
  18. package/dist/logger.js.map +1 -1
  19. package/dist/profiles/review-profiles.d.ts +32 -0
  20. package/dist/profiles/review-profiles.js +348 -0
  21. package/dist/profiles/review-profiles.js.map +1 -0
  22. package/dist/router.js +18 -3
  23. package/dist/router.js.map +1 -1
  24. package/dist/runners/anthropic.js +2 -3
  25. package/dist/runners/anthropic.js.map +1 -1
  26. package/dist/runners/base.d.ts +8 -0
  27. package/dist/runners/base.js +13 -0
  28. package/dist/runners/base.js.map +1 -1
  29. package/dist/runners/openai.js +2 -3
  30. package/dist/runners/openai.js.map +1 -1
  31. package/dist/runners/registry.d.ts +2 -0
  32. package/dist/runners/registry.js +4 -0
  33. package/dist/runners/registry.js.map +1 -1
  34. package/dist/server.d.ts +1 -6
  35. package/dist/server.js +134 -66
  36. package/dist/server.js.map +1 -1
  37. package/dist/setup.d.ts +65 -0
  38. package/dist/setup.js +411 -0
  39. package/dist/setup.js.map +1 -0
  40. package/dist/tools/dispatch.d.ts +33 -0
  41. package/dist/tools/dispatch.js +222 -0
  42. package/dist/tools/dispatch.js.map +1 -0
  43. package/dist/tools/handlers.d.ts +8 -2
  44. package/dist/tools/handlers.js +119 -27
  45. package/dist/tools/handlers.js.map +1 -1
  46. package/dist/util.d.ts +37 -4
  47. package/dist/util.js +71 -15
  48. package/dist/util.js.map +1 -1
  49. package/package.json +28 -3
  50. package/prompts/code_review.md +26 -20
  51. package/prompts/security_audit.md +109 -0
package/dist/http-api.js CHANGED
@@ -11,49 +11,15 @@ import path from 'node:path';
11
11
  import { fileURLToPath } from 'node:url';
12
12
  import { parseArgs } from 'node:util';
13
13
  import Fastify from 'fastify';
14
- import { BenchmarkEngine } from './benchmark/engine.js';
14
+ import { warnIfNoCredentials } from './credentials.js';
15
15
  import { getLogger } from './logger.js';
16
- import { TaskRouter } from './router.js';
17
- import { RunnerRegistry } from './runners/registry.js';
18
- import { askSubagent, benchmarkRun, createPlan, delegateTask, explainCode, explainFile, generateTests, getActiveModel, listRunners, pluginConfigure, pluginGetLogs, pluginHealthCheck, pluginRemove, pluginStatus, reviewCode, reviewFile, switchModel, testFile, } from './tools/index.js';
16
+ import { dispatchTool, getRegistry } from './tools/dispatch.js';
19
17
  import { describeError, loadDotEnv } from './util.js';
18
+ // Re-exported so existing importers of `http-api` keep resolving after the
19
+ // dispatch logic moved to `tools/dispatch.ts`.
20
+ export { createDispatchContext, dispatchTool, getEngine, getRegistry, getRouter } from './tools/dispatch.js';
20
21
  loadDotEnv();
21
22
  const logger = getLogger('smartrelay.http');
22
- let registryInstance = null;
23
- let engineInstance = null;
24
- let routerInstance = null;
25
- export function getRegistry(configPath) {
26
- if (!registryInstance) {
27
- try {
28
- registryInstance = RunnerRegistry.fromYaml(configPath);
29
- logger.info(`Loaded runners: [${registryInstance.registeredIds().join(', ')}]`);
30
- }
31
- catch (err) {
32
- logger.warning(`Could not initialize registry on startup: ${err}`);
33
- registryInstance = new RunnerRegistry(configPath ?? null);
34
- }
35
- }
36
- else {
37
- registryInstance.reloadIfModified();
38
- }
39
- return registryInstance;
40
- }
41
- export function getEngine() {
42
- const reg = getRegistry();
43
- if (!engineInstance || engineInstance.registry !== reg) {
44
- const rawConcurrency = reg.serverConfig['max_concurrency'];
45
- const maxConcurrency = typeof rawConcurrency === 'number' ? rawConcurrency : 5;
46
- engineInstance = new BenchmarkEngine(reg, maxConcurrency);
47
- }
48
- return engineInstance;
49
- }
50
- export function getRouter() {
51
- const reg = getRegistry();
52
- if (!routerInstance || routerInstance.registry !== reg) {
53
- routerInstance = new TaskRouter(reg);
54
- }
55
- return routerInstance;
56
- }
57
23
  // =========================================================================
58
24
  // AUTHENTICATION HOOK
59
25
  // =========================================================================
@@ -88,135 +54,6 @@ export function verifyApiKey(request, reply) {
88
54
  }
89
55
  }
90
56
  // =========================================================================
91
- // DISPATCH TOOLS
92
- // =========================================================================
93
- export async function dispatchTool(toolName, args = {}) {
94
- const router = getRouter();
95
- const registry = getRegistry();
96
- const engine = getEngine();
97
- // Normalize tool name (handle both smartrelay_* and plain tool names)
98
- const norm = toolName.startsWith('smartrelay_') ? toolName : `smartrelay_${toolName}`;
99
- switch (norm) {
100
- // Plugin lifecycle
101
- case 'smartrelay_configure':
102
- return pluginConfigure(args);
103
- case 'smartrelay_status':
104
- return pluginStatus(registry);
105
- case 'smartrelay_remove':
106
- return pluginRemove();
107
- case 'smartrelay_health_check':
108
- return pluginHealthCheck(registry);
109
- case 'smartrelay_get_logs':
110
- return pluginGetLogs(args);
111
- // Model switching
112
- case 'smartrelay_switch_model': {
113
- const model = typeof args['model'] === 'string' ? args['model'] : 'auto';
114
- return switchModel(router, model);
115
- }
116
- case 'smartrelay_get_active_model':
117
- return getActiveModel(router);
118
- // Delegation tools
119
- case 'smartrelay_create_plan': {
120
- const goal = typeof args['goal'] === 'string' ? args['goal'] : '';
121
- const context = typeof args['context'] === 'string' ? args['context'] : '';
122
- if (!goal)
123
- return { error: 'Missing required argument: goal' };
124
- return createPlan(router, goal, context);
125
- }
126
- case 'smartrelay_review_code': {
127
- const code = typeof args['code'] === 'string' ? args['code'] : '';
128
- const focus = typeof args['focus'] === 'string'
129
- ? args['focus']
130
- : 'bugs, security, clean code, and performance';
131
- if (!code)
132
- return { error: 'Missing required argument: code' };
133
- return reviewCode(router, code, focus);
134
- }
135
- case 'smartrelay_generate_tests': {
136
- const code = typeof args['code'] === 'string' ? args['code'] : '';
137
- const framework = typeof args['framework'] === 'string'
138
- ? args['framework']
139
- : 'standard unit test framework (pytest, flutter_test, etc.)';
140
- if (!code)
141
- return { error: 'Missing required argument: code' };
142
- return generateTests(router, code, framework);
143
- }
144
- case 'smartrelay_ask_subagent': {
145
- const prompt = typeof args['prompt'] === 'string' ? args['prompt'] : '';
146
- const model = typeof args['model'] === 'string' ? args['model'] : 'auto';
147
- if (!prompt)
148
- return { error: 'Missing required argument: prompt' };
149
- return askSubagent(router, prompt, model);
150
- }
151
- case 'smartrelay_review_file': {
152
- const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
153
- const focus = typeof args['focus'] === 'string'
154
- ? args['focus']
155
- : 'bugs, security, clean code, and performance';
156
- if (!filePath)
157
- return { error: 'Missing required argument: file_path' };
158
- return reviewFile(router, filePath, focus);
159
- }
160
- case 'smartrelay_test_file': {
161
- const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
162
- const framework = typeof args['framework'] === 'string'
163
- ? args['framework']
164
- : 'standard unit test framework (pytest, flutter_test, etc.)';
165
- if (!filePath)
166
- return { error: 'Missing required argument: file_path' };
167
- return testFile(router, filePath, framework);
168
- }
169
- case 'smartrelay_explain_code': {
170
- const code = typeof args['code'] === 'string' ? args['code'] : '';
171
- const audience = typeof args['audience'] === 'string' ? args['audience'] : 'mid-level engineer';
172
- const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
173
- if (!code)
174
- return { error: 'Missing required argument: code' };
175
- return explainCode(router, code, audience, language);
176
- }
177
- case 'smartrelay_explain_file': {
178
- const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
179
- const audience = typeof args['audience'] === 'string' ? args['audience'] : 'mid-level engineer';
180
- if (!filePath)
181
- return { error: 'Missing required argument: file_path' };
182
- return explainFile(router, filePath, audience);
183
- }
184
- case 'smartrelay_list_runners':
185
- return listRunners(registry);
186
- case 'smartrelay_delegate_task': {
187
- const task = typeof args['task'] === 'string' ? args['task'] : '';
188
- const runnerId = typeof args['runner_id'] === 'string' ? args['runner_id'] : 'auto';
189
- const params = typeof args['params'] === 'object' && args['params'] !== null
190
- ? args['params']
191
- : undefined;
192
- if (!task)
193
- return { error: 'Missing required argument: task' };
194
- return delegateTask(router, task, runnerId, params);
195
- }
196
- case 'smartrelay_benchmark_run': {
197
- const task = typeof args['task'] === 'string' ? args['task'] : '';
198
- if (!task)
199
- return { error: 'Missing required argument: task' };
200
- return benchmarkRun(registry, engine, {
201
- task,
202
- runner_ids: Array.isArray(args['runner_ids'])
203
- ? args['runner_ids']
204
- : undefined,
205
- params: typeof args['params'] === 'object' && args['params'] !== null
206
- ? args['params']
207
- : undefined,
208
- reference_answer: typeof args['reference_answer'] === 'string' ? args['reference_answer'] : undefined,
209
- judge_runner_id: typeof args['judge_runner_id'] === 'string' ? args['judge_runner_id'] : undefined,
210
- eval_criteria: typeof args['eval_criteria'] === 'object' && args['eval_criteria'] !== null
211
- ? args['eval_criteria']
212
- : undefined,
213
- });
214
- }
215
- default:
216
- throw new Error(`Unknown tool: ${toolName}`);
217
- }
218
- }
219
- // =========================================================================
220
57
  // CREATE FASTIFY SERVER
221
58
  // =========================================================================
222
59
  export function createHttpServer() {
@@ -286,7 +123,7 @@ export async function runHttpServer(options) {
286
123
  const host = options?.host ?? '127.0.0.1';
287
124
  const port = options?.port ?? 8000;
288
125
  const config = options?.config ?? null;
289
- getRegistry(config);
126
+ warnIfNoCredentials(getRegistry(config).getRunnersMetadata(), logger);
290
127
  logger.info(`Configuration loaded. Starting HTTP API server on ${host}:${port}`);
291
128
  const app = createHttpServer();
292
129
  await app.listen({ host, port });
@@ -1 +1 @@
1
- {"version":3,"file":"http-api.js","sourceRoot":"","sources":["../src/http-api.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,OAAyE,MAAM,SAAS,CAAC;AAEhG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD,UAAU,EAAE,CAAC;AAEb,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAE5C,IAAI,gBAAgB,GAA0B,IAAI,CAAC;AACnD,IAAI,cAAc,GAA2B,IAAI,CAAC;AAClD,IAAI,cAAc,GAAsB,IAAI,CAAC;AAE7C,MAAM,UAAU,WAAW,CAAC,UAA0B;IACpD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,oBAAoB,gBAAgB,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;YACnE,gBAAgB,GAAG,IAAI,cAAc,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACvD,MAAM,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,cAAc,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACvD,cAAc,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,4EAA4E;AAC5E,sBAAsB;AACtB,4EAA4E;AAE5E,MAAM,UAAU,YAAY,CAAC,OAAuB,EAAE,KAAmB;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC3C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC/D,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC3C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,MAAM,EAAE,0DAA0D;SACnE,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC3C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,iBAAiB;AACjB,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,IAAI,GAA4B,EAAE;IAElC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,sEAAsE;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC;IAEtF,QAAQ,IAAI,EAAE,CAAC;QACb,mBAAmB;QACnB,KAAK,sBAAsB;YACzB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,mBAAmB;YACtB,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,KAAK,mBAAmB;YACtB,OAAO,YAAY,EAAE,CAAC;QACxB,KAAK,yBAAyB;YAC5B,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrC,KAAK,qBAAqB;YACxB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAE7B,kBAAkB;QAClB,KAAK,yBAAyB,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACzE,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,6BAA6B;YAChC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAEhC,mBAAmB;QACnB,KAAK,wBAAwB,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,wBAAwB,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ;gBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACf,CAAC,CAAC,6CAA6C,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,2BAA2B,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ;gBACnC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;gBACnB,CAAC,CAAC,2DAA2D,CAAC;YAClE,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,yBAAyB,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACzE,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;YACnE,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,wBAAwB,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ;gBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACf,CAAC,CAAC,6CAA6C,CAAC;YACpD,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;YACxE,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,sBAAsB,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ;gBACnC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;gBACnB,CAAC,CAAC,2DAA2D,CAAC;YAClE,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;YACxE,OAAO,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,yBAAyB,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAChG,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAClF,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,yBAAyB,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAChG,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;YACxE,OAAO,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,yBAAyB;YAC5B,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/B,KAAK,0BAA0B,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpF,MAAM,MAAM,GACV,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;gBAC3D,CAAC,CAAE,IAAI,CAAC,QAAQ,CAA6B;gBAC7C,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,0BAA0B,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;YAC/D,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACpC,IAAI;gBACJ,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC3C,CAAC,CAAE,IAAI,CAAC,YAAY,CAAc;oBAClC,CAAC,CAAC,SAAS;gBACb,MAAM,EACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;oBAC3D,CAAC,CAAE,IAAI,CAAC,QAAQ,CAA6B;oBAC7C,CAAC,CAAC,SAAS;gBACf,gBAAgB,EACd,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrF,eAAe,EACb,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnF,aAAa,EACX,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI;oBACzE,CAAC,CAAE,IAAI,CAAC,eAAe,CAA6B;oBACpD,CAAC,CAAC,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,wBAAwB;AACxB,4EAA4E;AAE5E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvC,kBAAkB;IAClB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC7C,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,OAAO;gBAChB,cAAc,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;aAC1B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9C,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,GAAG,CAAC,IAAI,CACN,qBAAqB,EACrB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QAEvB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,GAAG,EAAE,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4EAA4E;AAC5E,iBAAiB;AACjB,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAInC;IACC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;IAEvC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,IAAI,CAAC,qDAAqD,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAEjF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,kDAAkD,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,UAAU,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,oBAAoB,EAAE,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,OAAO,EAAE;YACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACtC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE;YAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;SAC1C;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,aAAa,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;KACrD,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"http-api.js","sourceRoot":"","sources":["../src/http-api.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  /** Main entrypoint for SmartRelay. */
2
2
  export * from './server.js';
3
- export { createHttpServer, runHttpServer, dispatchTool, verifyApiKey } from './http-api.js';
3
+ export { createHttpServer, runHttpServer, verifyApiKey } from './http-api.js';
4
+ export { createDispatchContext, dispatchTool } from './tools/dispatch.js';
5
+ export * from './credentials.js';
4
6
  export * from './router.js';
5
7
  export * from './logger.js';
6
8
  export * from './util.js';
package/dist/index.js CHANGED
@@ -1,6 +1,10 @@
1
1
  /** Main entrypoint for SmartRelay. */
2
2
  export * from './server.js';
3
- export { createHttpServer, runHttpServer, dispatchTool, verifyApiKey } from './http-api.js';
3
+ export { createHttpServer, runHttpServer, verifyApiKey } from './http-api.js';
4
+ // Exported from the module that owns them, not via the two entrypoints that
5
+ // re-export them, so `export *` above cannot make the name ambiguous.
6
+ export { createDispatchContext, dispatchTool } from './tools/dispatch.js';
7
+ export * from './credentials.js';
4
8
  export * from './router.js';
5
9
  export * from './logger.js';
6
10
  export * from './util.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5F,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `smartrelay init` — ask for the API keys, then register the MCP server.
3
+ *
4
+ * One command so a new user never has to learn that a separate configuration
5
+ * step exists. The keys are collected by the terminal wizard in `setup.ts`, where
6
+ * input is hidden and nothing is echoed in full; they are deliberately NOT
7
+ * collected through MCP elicitation, whose schema has no masked field type and
8
+ * would put the secrets into the client's transcript.
9
+ */
10
+ import { type SetupOptions } from './setup.js';
11
+ export interface McpClient {
12
+ id: string;
13
+ label: string;
14
+ /** `cli` shells out to a client's own command; `json` edits a config file. */
15
+ kind: 'cli' | 'json';
16
+ /** Config file for `json` clients; `null` for `cli` ones. */
17
+ configPath: string | null;
18
+ /** Whether this client appears to be installed. */
19
+ detected: boolean;
20
+ /** What to tell the user if automatic registration is declined or fails. */
21
+ manual: string;
22
+ }
23
+ /** Every client SmartRelay knows how to register with, detected ones first. */
24
+ export declare function detectClients(options?: {
25
+ home?: string;
26
+ claudeCli?: boolean;
27
+ }): McpClient[];
28
+ export interface RegisterResult {
29
+ ok: boolean;
30
+ message: string;
31
+ /** Path of the backup taken before a config file was modified. */
32
+ backup?: string;
33
+ }
34
+ /**
35
+ * Merge the SmartRelay entry into a client's JSON config.
36
+ *
37
+ * Read-modify-write, never a template overwrite: these files hold the user's
38
+ * other MCP servers. A file that does not parse is left completely alone —
39
+ * guessing at malformed JSON risks destroying a working setup.
40
+ */
41
+ export declare function registerJsonClient(client: McpClient): RegisterResult;
42
+ /** Register through the `claude` CLI, which owns its own config format. */
43
+ export declare function registerClaudeCode(): RegisterResult;
44
+ export declare function registerClient(client: McpClient): RegisterResult;
45
+ export interface InstallOptions extends SetupOptions {
46
+ /** Client ids to register without asking. Implies no client prompts. */
47
+ clients?: string[];
48
+ /** Skip registration entirely and only print the snippets. */
49
+ printOnly?: boolean;
50
+ /**
51
+ * Home directory used to locate client configs. Distinct from `home`, which
52
+ * overrides `~/.smartrelay` — conflating the two would send client lookups
53
+ * into the credential directory. Tests point this at a temp dir.
54
+ */
55
+ clientHome?: string;
56
+ }
57
+ export declare function runInstall(options?: InstallOptions): Promise<number>;
@@ -0,0 +1,216 @@
1
+ /**
2
+ * `smartrelay init` — ask for the API keys, then register the MCP server.
3
+ *
4
+ * One command so a new user never has to learn that a separate configuration
5
+ * step exists. The keys are collected by the terminal wizard in `setup.ts`, where
6
+ * input is hidden and nothing is echoed in full; they are deliberately NOT
7
+ * collected through MCP elicitation, whose schema has no masked field type and
8
+ * would put the secrets into the client's transcript.
9
+ */
10
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
11
+ import { homedir, platform } from 'node:os';
12
+ import path from 'node:path';
13
+ import { spawnSync } from 'node:child_process';
14
+ import { PACKAGE_NAME } from './credentials.js';
15
+ import { noTerminalMessage, openWizardIo, runSetup } from './setup.js';
16
+ import { describeError } from './util.js';
17
+ /** The MCP server entry every client config ends up holding. */
18
+ const SERVER_KEY = 'smartrelay';
19
+ const SERVER_ENTRY = { command: 'npx', args: ['-y', PACKAGE_NAME] };
20
+ const JSON_SNIPPET = JSON.stringify({ mcpServers: { [SERVER_KEY]: SERVER_ENTRY } }, null, 2);
21
+ /** Config locations per platform, mirroring each client's documented path. */
22
+ function clientConfigPath(id, home) {
23
+ const os = platform();
24
+ switch (id) {
25
+ case 'claude-desktop':
26
+ if (os === 'darwin') {
27
+ return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
28
+ }
29
+ if (os === 'win32') {
30
+ const appData = process.env['APPDATA'];
31
+ return appData ? path.join(appData, 'Claude', 'claude_desktop_config.json') : null;
32
+ }
33
+ return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');
34
+ case 'cursor':
35
+ return path.join(home, '.cursor', 'mcp.json');
36
+ case 'windsurf':
37
+ return path.join(home, '.codeium', 'windsurf', 'mcp_config.json');
38
+ default:
39
+ return null;
40
+ }
41
+ }
42
+ /** Is the `claude` CLI callable? */
43
+ function hasClaudeCli() {
44
+ const probe = spawnSync('claude', ['--version'], { stdio: 'ignore', timeout: 10_000 });
45
+ return probe.status === 0;
46
+ }
47
+ /** Every client SmartRelay knows how to register with, detected ones first. */
48
+ export function detectClients(options) {
49
+ const home = options?.home ?? homedir();
50
+ const clients = [
51
+ {
52
+ id: 'claude-code',
53
+ label: 'Claude Code',
54
+ kind: 'cli',
55
+ configPath: null,
56
+ detected: options?.claudeCli ?? hasClaudeCli(),
57
+ manual: `claude mcp add -s user ${SERVER_KEY} -- npx -y ${PACKAGE_NAME}`,
58
+ },
59
+ ...['claude-desktop', 'cursor', 'windsurf'].map((id) => {
60
+ const configPath = clientConfigPath(id, home);
61
+ return {
62
+ id,
63
+ label: { 'claude-desktop': 'Claude Desktop', cursor: 'Cursor', windsurf: 'Windsurf' }[id],
64
+ kind: 'json',
65
+ configPath,
66
+ // The parent directory is the signal: a client can be installed long
67
+ // before it has ever written an MCP config file.
68
+ detected: Boolean(configPath) && existsSync(path.dirname(configPath)),
69
+ manual: `Add to ${configPath ?? 'your MCP config'}:\n${JSON_SNIPPET}`,
70
+ };
71
+ }),
72
+ ];
73
+ return clients;
74
+ }
75
+ /**
76
+ * Merge the SmartRelay entry into a client's JSON config.
77
+ *
78
+ * Read-modify-write, never a template overwrite: these files hold the user's
79
+ * other MCP servers. A file that does not parse is left completely alone —
80
+ * guessing at malformed JSON risks destroying a working setup.
81
+ */
82
+ export function registerJsonClient(client) {
83
+ const target = client.configPath;
84
+ if (!target)
85
+ return { ok: false, message: 'no config path for this platform' };
86
+ let existing = {};
87
+ let backup;
88
+ if (existsSync(target)) {
89
+ const raw = readFileSync(target, 'utf-8');
90
+ try {
91
+ const parsed = JSON.parse(raw);
92
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
93
+ existing = parsed;
94
+ }
95
+ else {
96
+ return { ok: false, message: `${target} is not a JSON object — left unchanged` };
97
+ }
98
+ }
99
+ catch (err) {
100
+ return { ok: false, message: `${target} is not valid JSON (${describeError(err)}) — left unchanged` };
101
+ }
102
+ backup = `${target}.smartrelay-backup`;
103
+ copyFileSync(target, backup);
104
+ }
105
+ const servers = existing['mcpServers'] && typeof existing['mcpServers'] === 'object' && !Array.isArray(existing['mcpServers'])
106
+ ? existing['mcpServers']
107
+ : {};
108
+ const already = SERVER_KEY in servers;
109
+ const merged = { ...existing, mcpServers: { ...servers, [SERVER_KEY]: SERVER_ENTRY } };
110
+ mkdirSync(path.dirname(target), { recursive: true });
111
+ const tmp = `${target}.tmp-${process.pid}`;
112
+ writeFileSync(tmp, `${JSON.stringify(merged, null, 2)}\n`);
113
+ renameSync(tmp, target);
114
+ return {
115
+ ok: true,
116
+ message: already ? `updated the existing entry in ${target}` : `added to ${target}`,
117
+ ...(backup ? { backup } : {}),
118
+ };
119
+ }
120
+ /** Register through the `claude` CLI, which owns its own config format. */
121
+ export function registerClaudeCode() {
122
+ // `claude mcp add` fails on an existing name, so replace rather than error out.
123
+ spawnSync('claude', ['mcp', 'remove', '-s', 'user', SERVER_KEY], { stdio: 'ignore', timeout: 30_000 });
124
+ const result = spawnSync('claude', ['mcp', 'add', '-s', 'user', SERVER_KEY, '--', 'npx', '-y', PACKAGE_NAME], { encoding: 'utf-8', timeout: 60_000 });
125
+ if (result.status === 0)
126
+ return { ok: true, message: 'registered with the claude CLI' };
127
+ const detail = (result.stderr || result.stdout || '').trim().split('\n')[0] ?? 'unknown error';
128
+ return { ok: false, message: `claude mcp add failed: ${detail}` };
129
+ }
130
+ export function registerClient(client) {
131
+ return client.kind === 'cli' ? registerClaudeCode() : registerJsonClient(client);
132
+ }
133
+ export async function runInstall(options = {}) {
134
+ const out = options.output ?? process.stdout;
135
+ const write = (line = '') => void out.write(`${line}\n`);
136
+ // One session for both rounds of prompts — two readline interfaces on the same
137
+ // stdin would compete for lines.
138
+ let io = null;
139
+ if (!options.nonInteractive) {
140
+ io = openWizardIo(options);
141
+ if (!io) {
142
+ process.stderr.write(noTerminalMessage('init'));
143
+ return 1;
144
+ }
145
+ }
146
+ try {
147
+ const setupCode = await runSetup(options, io ?? undefined);
148
+ if (setupCode !== 0)
149
+ return setupCode;
150
+ const clients = detectClients({ ...(options.clientHome ? { home: options.clientHome } : {}) });
151
+ const chosen = await chooseClients(clients, options, io, write);
152
+ write();
153
+ if (!chosen.length) {
154
+ write('No client registered. Add SmartRelay manually with any of:');
155
+ for (const client of clients) {
156
+ write();
157
+ write(` ${client.label}:`);
158
+ for (const line of client.manual.split('\n'))
159
+ write(` ${line}`);
160
+ }
161
+ return 0;
162
+ }
163
+ write('Registering…');
164
+ let restartNeeded = false;
165
+ for (const client of chosen) {
166
+ const result = registerClient(client);
167
+ write(` ${result.ok ? '✔' : '✖'} ${client.label} — ${result.message}`);
168
+ if (result.backup)
169
+ write(` previous config saved to ${result.backup}`);
170
+ if (result.ok)
171
+ restartNeeded = true;
172
+ else {
173
+ for (const line of client.manual.split('\n'))
174
+ write(` ${line}`);
175
+ }
176
+ }
177
+ if (restartNeeded) {
178
+ write();
179
+ write('Restart the client to load SmartRelay.');
180
+ }
181
+ return 0;
182
+ }
183
+ finally {
184
+ io?.close();
185
+ }
186
+ }
187
+ /** Decide which clients to register: explicit flag, or one y/n prompt each. */
188
+ async function chooseClients(clients, options, io, write) {
189
+ if (options.printOnly)
190
+ return [];
191
+ if (options.clients?.length) {
192
+ const wanted = new Set(options.clients);
193
+ const unknown = options.clients.filter((id) => !clients.some((c) => c.id === id));
194
+ for (const id of unknown)
195
+ write(` unknown client '${id}' — ignored`);
196
+ return clients.filter((c) => wanted.has(c.id));
197
+ }
198
+ // Without a terminal there is nobody to ask; print instructions instead of guessing.
199
+ if (!io)
200
+ return [];
201
+ const detected = clients.filter((c) => c.detected);
202
+ if (!detected.length)
203
+ return [];
204
+ write();
205
+ write('Register SmartRelay as an MCP server');
206
+ write('────────────────────────────────────');
207
+ const chosen = [];
208
+ for (const client of detected) {
209
+ io.write(` Add to ${client.label}? [Y/n]`);
210
+ const answer = (await io.read())?.trim().toLowerCase();
211
+ if (!answer || answer.startsWith('y'))
212
+ chosen.push(client);
213
+ }
214
+ return chosen;
215
+ }
216
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts CHANGED
@@ -18,5 +18,7 @@ export interface Logger {
18
18
  warning(message: string, ...args: unknown[]): void;
19
19
  error(message: string, ...args: unknown[]): void;
20
20
  }
21
+ /** The most recent log lines, newest last, with credentials masked. */
22
+ export declare function recentLogs(limit?: number): string[];
21
23
  export declare function getLogger(name: string): Logger;
22
24
  export {};
package/dist/logger.js CHANGED
@@ -17,12 +17,32 @@ function timestamp() {
17
17
  return (`${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ` +
18
18
  `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())},${pad(now.getMilliseconds(), 3)}`);
19
19
  }
20
+ /** How many recent lines `recentLogs()` can return. */
21
+ const RING_CAPACITY = 200;
22
+ const ring = [];
23
+ /**
24
+ * Anything shaped like a provider key, so a log line that happens to interpolate
25
+ * a credential cannot leak it back out through `smartrelay_get_logs`.
26
+ */
27
+ const SECRET_PATTERN = /\b(?:nvapi-|sk-or-v1-|sk-ant-|sk-proj-|sk-)[A-Za-z0-9_\-]{8,}/g;
28
+ function redact(line) {
29
+ return line.replace(SECRET_PATTERN, (match) => `${match.slice(0, 6)}…[redacted]`);
30
+ }
31
+ /** The most recent log lines, newest last, with credentials masked. */
32
+ export function recentLogs(limit = 50) {
33
+ const bounded = Math.max(0, Math.min(limit, RING_CAPACITY));
34
+ return ring.slice(-bounded);
35
+ }
20
36
  export function getLogger(name) {
21
37
  const emit = (level, message, args) => {
22
38
  if (LEVELS[level] < activeLevel())
23
39
  return;
24
40
  const suffix = args.length ? ` ${args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ')}` : '';
25
- process.stderr.write(`${timestamp()} [${level.toUpperCase()}] ${name}: ${message}${suffix}\n`);
41
+ const line = redact(`${timestamp()} [${level.toUpperCase()}] ${name}: ${message}${suffix}`);
42
+ ring.push(line);
43
+ if (ring.length > RING_CAPACITY)
44
+ ring.shift();
45
+ process.stderr.write(`${line}\n`);
26
46
  };
27
47
  return {
28
48
  debug: (message, ...args) => emit('debug', message, args),
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAW,CAAC;AAIxE,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACjF,OAAO,MAAM,CAAC,UAAsB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,gEAAgE;AAChE,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7E,OAAO,CACL,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG;QACxE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,EAAE,CAC5G,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAAe,EAAQ,EAAE;QACvE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,EAAE;YAAE,OAAO;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC;IACjG,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QACzD,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;QACvD,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;QAC7D,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;KAC1D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}