@theone1345/smartrelay 0.2.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 (64) hide show
  1. package/README.md +446 -0
  2. package/config/runners/agents.yaml +47 -0
  3. package/config/runners/anthropic.yaml +23 -0
  4. package/config/runners/nvidia.yaml +53 -0
  5. package/config/runners/ollama.yaml +33 -0
  6. package/config/runners/openai.yaml +23 -0
  7. package/config/runners/openrouter.yaml +83 -0
  8. package/config.yaml +16 -0
  9. package/dist/benchmark/engine.d.ts +49 -0
  10. package/dist/benchmark/engine.js +147 -0
  11. package/dist/benchmark/engine.js.map +1 -0
  12. package/dist/benchmark/scorers.d.ts +59 -0
  13. package/dist/benchmark/scorers.js +241 -0
  14. package/dist/benchmark/scorers.js.map +1 -0
  15. package/dist/http-api.d.ts +23 -0
  16. package/dist/http-api.js +329 -0
  17. package/dist/http-api.js.map +1 -0
  18. package/dist/index.d.ts +16 -0
  19. package/dist/index.js +17 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/logger.d.ts +22 -0
  22. package/dist/logger.js +34 -0
  23. package/dist/logger.js.map +1 -0
  24. package/dist/router.d.ts +33 -0
  25. package/dist/router.js +298 -0
  26. package/dist/router.js.map +1 -0
  27. package/dist/runners/anthropic.d.ts +15 -0
  28. package/dist/runners/anthropic.js +116 -0
  29. package/dist/runners/anthropic.js.map +1 -0
  30. package/dist/runners/base.d.ts +90 -0
  31. package/dist/runners/base.js +61 -0
  32. package/dist/runners/base.js.map +1 -0
  33. package/dist/runners/nvidia.d.ts +14 -0
  34. package/dist/runners/nvidia.js +23 -0
  35. package/dist/runners/nvidia.js.map +1 -0
  36. package/dist/runners/ollama.d.ts +8 -0
  37. package/dist/runners/ollama.js +107 -0
  38. package/dist/runners/ollama.js.map +1 -0
  39. package/dist/runners/openai.d.ts +28 -0
  40. package/dist/runners/openai.js +131 -0
  41. package/dist/runners/openai.js.map +1 -0
  42. package/dist/runners/openrouter.d.ts +11 -0
  43. package/dist/runners/openrouter.js +19 -0
  44. package/dist/runners/openrouter.js.map +1 -0
  45. package/dist/runners/registry.d.ts +53 -0
  46. package/dist/runners/registry.js +273 -0
  47. package/dist/runners/registry.js.map +1 -0
  48. package/dist/server.d.ts +16 -0
  49. package/dist/server.js +305 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/tools/handlers.d.ts +49 -0
  52. package/dist/tools/handlers.js +331 -0
  53. package/dist/tools/handlers.js.map +1 -0
  54. package/dist/tools/index.d.ts +1 -0
  55. package/dist/tools/index.js +2 -0
  56. package/dist/tools/index.js.map +1 -0
  57. package/dist/util.d.ts +47 -0
  58. package/dist/util.js +140 -0
  59. package/dist/util.js.map +1 -0
  60. package/package.json +70 -0
  61. package/prompts/code_review.md +99 -0
  62. package/prompts/explain_code.md +79 -0
  63. package/prompts/planner.md +23 -0
  64. package/prompts/test_generator.md +2 -0
@@ -0,0 +1,329 @@
1
+ #!/usr/bin/env node
2
+ /** Fastify HTTP API for SmartRelay MCP delegation server.
3
+ *
4
+ * Provides an authenticated HTTP interface to all MCP tools, allowing external
5
+ * plugins (MCPHub, etc.) to call SmartRelay over HTTP instead of stdio.
6
+ *
7
+ * Transport: HTTP/JSON with Bearer token auth.
8
+ */
9
+ import { realpathSync } from 'node:fs';
10
+ import path from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { parseArgs } from 'node:util';
13
+ import Fastify from 'fastify';
14
+ import { BenchmarkEngine } from './benchmark/engine.js';
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';
19
+ import { describeError, loadDotEnv } from './util.js';
20
+ loadDotEnv();
21
+ 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
+ // =========================================================================
58
+ // AUTHENTICATION HOOK
59
+ // =========================================================================
60
+ export function verifyApiKey(request, reply) {
61
+ const expectedKey = process.env['SMARTRELAY_HTTP_API_KEY'];
62
+ if (!expectedKey) {
63
+ logger.warning('SMARTRELAY_HTTP_API_KEY not set in environment');
64
+ reply.status(500).send({
65
+ detail: 'Server misconfigured: SMARTRELAY_HTTP_API_KEY not set',
66
+ });
67
+ return;
68
+ }
69
+ const authHeader = request.headers['authorization'];
70
+ if (!authHeader) {
71
+ reply.header('WWW-Authenticate', 'Bearer');
72
+ reply.status(401).send({ detail: 'Missing Authorization header' });
73
+ return;
74
+ }
75
+ const parts = authHeader.split(' ');
76
+ if (parts.length !== 2 || parts[0]?.toLowerCase() !== 'bearer') {
77
+ reply.header('WWW-Authenticate', 'Bearer');
78
+ reply.status(401).send({
79
+ detail: 'Invalid Authorization header format. Use: Bearer <token>',
80
+ });
81
+ return;
82
+ }
83
+ const token = parts[1];
84
+ if (token !== expectedKey) {
85
+ reply.header('WWW-Authenticate', 'Bearer');
86
+ reply.status(401).send({ detail: 'Invalid API key' });
87
+ return;
88
+ }
89
+ }
90
+ // =========================================================================
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
+ // CREATE FASTIFY SERVER
221
+ // =========================================================================
222
+ export function createHttpServer() {
223
+ const app = Fastify({ logger: false });
224
+ // Health endpoint
225
+ app.get('/v1/health', async (request, reply) => {
226
+ verifyApiKey(request, reply);
227
+ if (reply.sent)
228
+ return;
229
+ try {
230
+ const registry = getRegistry();
231
+ return {
232
+ status: 'healthy',
233
+ service: 'smartrelay-http',
234
+ version: '0.2.0',
235
+ runners_loaded: registry.registeredIds().length,
236
+ };
237
+ }
238
+ catch (err) {
239
+ return {
240
+ status: 'unhealthy',
241
+ service: 'smartrelay-http',
242
+ error: describeError(err),
243
+ };
244
+ }
245
+ });
246
+ // Runners endpoint
247
+ app.get('/v1/runners', async (request, reply) => {
248
+ verifyApiKey(request, reply);
249
+ if (reply.sent)
250
+ return;
251
+ try {
252
+ const registry = getRegistry();
253
+ return registry.getRunnersMetadata();
254
+ }
255
+ catch (err) {
256
+ reply.status(500).send({ error: `Failed to list runners: ${describeError(err)}` });
257
+ }
258
+ });
259
+ // Tool dispatch endpoint
260
+ app.post('/v1/tools/:toolName', async (request, reply) => {
261
+ verifyApiKey(request, reply);
262
+ if (reply.sent)
263
+ return;
264
+ const { toolName } = request.params;
265
+ const body = request.body ?? {};
266
+ try {
267
+ const result = await dispatchTool(toolName, body);
268
+ return result;
269
+ }
270
+ catch (err) {
271
+ const msg = describeError(err);
272
+ if (msg.includes('Unknown tool')) {
273
+ reply.status(400).send({ error: msg });
274
+ }
275
+ else {
276
+ reply.status(500).send({ error: `Tool execution error: ${msg}` });
277
+ }
278
+ }
279
+ });
280
+ return app;
281
+ }
282
+ // =========================================================================
283
+ // CLI ENTRYPOINT
284
+ // =========================================================================
285
+ export async function runHttpServer(options) {
286
+ const host = options?.host ?? '127.0.0.1';
287
+ const port = options?.port ?? 8000;
288
+ const config = options?.config ?? null;
289
+ getRegistry(config);
290
+ logger.info(`Configuration loaded. Starting HTTP API server on ${host}:${port}`);
291
+ const app = createHttpServer();
292
+ await app.listen({ host, port });
293
+ logger.info(`SmartRelay HTTP API server listening on http://${host}:${port}`);
294
+ }
295
+ function checkDirectExecution() {
296
+ const script = process.argv[1];
297
+ if (!script)
298
+ return false;
299
+ try {
300
+ const realScript = realpathSync(script);
301
+ const thisFile = realpathSync(fileURLToPath(import.meta.url));
302
+ if (realScript === thisFile)
303
+ return true;
304
+ }
305
+ catch {
306
+ // Fall back to filename checks
307
+ }
308
+ const base = path.basename(script, path.extname(script));
309
+ return ['http-api', 'smartrelay-http'].includes(base);
310
+ }
311
+ if (checkDirectExecution()) {
312
+ const { values } = parseArgs({
313
+ options: {
314
+ config: { type: 'string', short: 'c' },
315
+ host: { type: 'string', default: '127.0.0.1' },
316
+ port: { type: 'string', default: '8000' },
317
+ },
318
+ allowPositionals: true,
319
+ });
320
+ runHttpServer({
321
+ config: values.config,
322
+ host: values.host,
323
+ port: values.port ? parseInt(values.port, 10) : 8000,
324
+ }).catch((err) => {
325
+ logger.error('Fatal error starting HTTP API server:', err);
326
+ process.exitCode = 1;
327
+ });
328
+ }
329
+ //# sourceMappingURL=http-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-api.js","sourceRoot":"","sources":["../src/http-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** Main entrypoint for SmartRelay. */
2
+ export * from './server.js';
3
+ export { createHttpServer, runHttpServer, dispatchTool, verifyApiKey } from './http-api.js';
4
+ export * from './router.js';
5
+ export * from './logger.js';
6
+ export * from './util.js';
7
+ export * from './tools/index.js';
8
+ export * from './runners/base.js';
9
+ export * from './runners/registry.js';
10
+ export * from './runners/anthropic.js';
11
+ export * from './runners/openai.js';
12
+ export * from './runners/ollama.js';
13
+ export * from './runners/openrouter.js';
14
+ export * from './runners/nvidia.js';
15
+ export * from './benchmark/engine.js';
16
+ export * from './benchmark/scorers.js';
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ /** Main entrypoint for SmartRelay. */
2
+ export * from './server.js';
3
+ export { createHttpServer, runHttpServer, dispatchTool, verifyApiKey } from './http-api.js';
4
+ export * from './router.js';
5
+ export * from './logger.js';
6
+ export * from './util.js';
7
+ export * from './tools/index.js';
8
+ export * from './runners/base.js';
9
+ export * from './runners/registry.js';
10
+ export * from './runners/anthropic.js';
11
+ export * from './runners/openai.js';
12
+ export * from './runners/ollama.js';
13
+ export * from './runners/openrouter.js';
14
+ export * from './runners/nvidia.js';
15
+ export * from './benchmark/engine.js';
16
+ export * from './benchmark/scorers.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Minimal stderr logger mirroring the Python logging setup.
3
+ *
4
+ * Everything goes to stderr so the stdio transport's JSON-RPC stream on stdout
5
+ * stays clean. Format matches the Python `basicConfig` format string:
6
+ * `%(asctime)s [%(levelname)s] %(name)s: %(message)s`.
7
+ */
8
+ declare const LEVELS: {
9
+ readonly debug: 10;
10
+ readonly info: 20;
11
+ readonly warning: 30;
12
+ readonly error: 40;
13
+ };
14
+ export type LogLevel = keyof typeof LEVELS;
15
+ export interface Logger {
16
+ debug(message: string, ...args: unknown[]): void;
17
+ info(message: string, ...args: unknown[]): void;
18
+ warning(message: string, ...args: unknown[]): void;
19
+ error(message: string, ...args: unknown[]): void;
20
+ }
21
+ export declare function getLogger(name: string): Logger;
22
+ export {};
package/dist/logger.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Minimal stderr logger mirroring the Python logging setup.
3
+ *
4
+ * Everything goes to stderr so the stdio transport's JSON-RPC stream on stdout
5
+ * stays clean. Format matches the Python `basicConfig` format string:
6
+ * `%(asctime)s [%(levelname)s] %(name)s: %(message)s`.
7
+ */
8
+ const LEVELS = { debug: 10, info: 20, warning: 30, error: 40 };
9
+ function activeLevel() {
10
+ const configured = (process.env['SMARTRELAY_LOG_LEVEL'] ?? 'info').toLowerCase();
11
+ return LEVELS[configured] ?? LEVELS.info;
12
+ }
13
+ /** `2026-09-09 16:22:01,123` — the Python `asctime` default. */
14
+ function timestamp() {
15
+ const now = new Date();
16
+ const pad = (value, width = 2) => String(value).padStart(width, '0');
17
+ return (`${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ` +
18
+ `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())},${pad(now.getMilliseconds(), 3)}`);
19
+ }
20
+ export function getLogger(name) {
21
+ const emit = (level, message, args) => {
22
+ if (LEVELS[level] < activeLevel())
23
+ return;
24
+ 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`);
26
+ };
27
+ return {
28
+ debug: (message, ...args) => emit('debug', message, args),
29
+ info: (message, ...args) => emit('info', message, args),
30
+ warning: (message, ...args) => emit('warning', message, args),
31
+ error: (message, ...args) => emit('error', message, args),
32
+ };
33
+ }
34
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +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"}
@@ -0,0 +1,33 @@
1
+ /** Intelligent router that selects a runner from task intent, explicit IDs, or provider shortcuts. */
2
+ import type { BaseRunner } from './runners/base.js';
3
+ import type { RunnerRegistry } from './runners/registry.js';
4
+ /** Information about the currently active runner and routing mode. */
5
+ export interface ActiveRunnerInfo {
6
+ mode: 'auto' | 'pinned';
7
+ active_runner_id: string | null;
8
+ model: string | null;
9
+ description: string;
10
+ }
11
+ /** Routes tasks to the most suitable runner automatically, via shortcuts, or by explicit ID. */
12
+ export declare class TaskRouter {
13
+ readonly registry: RunnerRegistry;
14
+ activeRunnerId: string | null;
15
+ constructor(registry: RunnerRegistry);
16
+ /** Formats a clean interactive menu of available shortcuts and runners. */
17
+ formatMenu(): string;
18
+ /** Resolve a shortcut or provider name (e.g. 'nvidia', 'ollama', 'claude') to a runner. */
19
+ resolveShortcut(target: string): BaseRunner | null;
20
+ /** Switch the active runner. Accepts an exact ID, a provider name, 'auto', or 'direct'. */
21
+ setActiveRunner(target: string): {
22
+ ok: boolean;
23
+ message: string;
24
+ };
25
+ /** Information about the currently active runner and mode. */
26
+ getActiveRunnerInfo(): ActiveRunnerInfo;
27
+ /** The configured default runner, the first available preferred runner, or any runner. */
28
+ getDefaultRunner(): BaseRunner | null;
29
+ /** Pick the best runner for a task: explicit ID, pinned runner, then intent classification. */
30
+ routeTask(task: string, explicitRunnerId?: string | null): BaseRunner | null;
31
+ /** Render the registered ID list the way Python's list repr did, for error messages. */
32
+ private formatAvailable;
33
+ }