ai.matey.cli 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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/convert-request.js +365 -0
  3. package/dist/cjs/convert-request.js.map +1 -0
  4. package/dist/cjs/convert-response.js +211 -0
  5. package/dist/cjs/convert-response.js.map +1 -0
  6. package/dist/cjs/converters/request-converters.js +183 -0
  7. package/dist/cjs/converters/request-converters.js.map +1 -0
  8. package/dist/cjs/converters/response-converters.js +203 -0
  9. package/dist/cjs/converters/response-converters.js.map +1 -0
  10. package/dist/cjs/create-backend.js +569 -0
  11. package/dist/cjs/create-backend.js.map +1 -0
  12. package/dist/cjs/index.js +31 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/main.js +181 -0
  15. package/dist/cjs/main.js.map +1 -0
  16. package/dist/cjs/ollama/commands/list.js +70 -0
  17. package/dist/cjs/ollama/commands/list.js.map +1 -0
  18. package/dist/cjs/ollama/commands/ps.js +80 -0
  19. package/dist/cjs/ollama/commands/ps.js.map +1 -0
  20. package/dist/cjs/ollama/commands/pull.js +198 -0
  21. package/dist/cjs/ollama/commands/pull.js.map +1 -0
  22. package/dist/cjs/ollama/commands/run.js +279 -0
  23. package/dist/cjs/ollama/commands/run.js.map +1 -0
  24. package/dist/cjs/ollama/commands/show.js +138 -0
  25. package/dist/cjs/ollama/commands/show.js.map +1 -0
  26. package/dist/cjs/ollama/index.js +238 -0
  27. package/dist/cjs/ollama/index.js.map +1 -0
  28. package/dist/cjs/ollama/types.js +10 -0
  29. package/dist/cjs/ollama/types.js.map +1 -0
  30. package/dist/cjs/proxy.js +406 -0
  31. package/dist/cjs/proxy.js.map +1 -0
  32. package/dist/cjs/utils/backend-loader.js +112 -0
  33. package/dist/cjs/utils/backend-loader.js.map +1 -0
  34. package/dist/cjs/utils/index.js +29 -0
  35. package/dist/cjs/utils/index.js.map +1 -0
  36. package/dist/cjs/utils/model-translation.js +138 -0
  37. package/dist/cjs/utils/model-translation.js.map +1 -0
  38. package/dist/cjs/utils/output-formatter.js +241 -0
  39. package/dist/cjs/utils/output-formatter.js.map +1 -0
  40. package/dist/cjs/utils/pipeline-inspector.js +90 -0
  41. package/dist/cjs/utils/pipeline-inspector.js.map +1 -0
  42. package/dist/cjs/utils/state-manager.js +114 -0
  43. package/dist/cjs/utils/state-manager.js.map +1 -0
  44. package/dist/esm/convert-request.js +331 -0
  45. package/dist/esm/convert-request.js.map +1 -0
  46. package/dist/esm/convert-response.js +177 -0
  47. package/dist/esm/convert-response.js.map +1 -0
  48. package/dist/esm/converters/request-converters.js +175 -0
  49. package/dist/esm/converters/request-converters.js.map +1 -0
  50. package/dist/esm/converters/response-converters.js +191 -0
  51. package/dist/esm/converters/response-converters.js.map +1 -0
  52. package/dist/esm/create-backend.js +533 -0
  53. package/dist/esm/create-backend.js.map +1 -0
  54. package/dist/esm/index.js +15 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/main.js +149 -0
  57. package/dist/esm/main.js.map +1 -0
  58. package/dist/esm/ollama/commands/list.js +67 -0
  59. package/dist/esm/ollama/commands/list.js.map +1 -0
  60. package/dist/esm/ollama/commands/ps.js +77 -0
  61. package/dist/esm/ollama/commands/ps.js.map +1 -0
  62. package/dist/esm/ollama/commands/pull.js +195 -0
  63. package/dist/esm/ollama/commands/pull.js.map +1 -0
  64. package/dist/esm/ollama/commands/run.js +243 -0
  65. package/dist/esm/ollama/commands/run.js.map +1 -0
  66. package/dist/esm/ollama/commands/show.js +135 -0
  67. package/dist/esm/ollama/commands/show.js.map +1 -0
  68. package/dist/esm/ollama/index.js +235 -0
  69. package/dist/esm/ollama/index.js.map +1 -0
  70. package/dist/esm/ollama/types.js +9 -0
  71. package/dist/esm/ollama/types.js.map +1 -0
  72. package/dist/esm/proxy.js +403 -0
  73. package/dist/esm/proxy.js.map +1 -0
  74. package/dist/esm/utils/backend-loader.js +74 -0
  75. package/dist/esm/utils/backend-loader.js.map +1 -0
  76. package/dist/esm/utils/index.js +13 -0
  77. package/dist/esm/utils/index.js.map +1 -0
  78. package/dist/esm/utils/model-translation.js +99 -0
  79. package/dist/esm/utils/model-translation.js.map +1 -0
  80. package/dist/esm/utils/output-formatter.js +224 -0
  81. package/dist/esm/utils/output-formatter.js.map +1 -0
  82. package/dist/esm/utils/pipeline-inspector.js +84 -0
  83. package/dist/esm/utils/pipeline-inspector.js.map +1 -0
  84. package/dist/esm/utils/state-manager.js +111 -0
  85. package/dist/esm/utils/state-manager.js.map +1 -0
  86. package/dist/types/convert-request.d.ts +15 -0
  87. package/dist/types/convert-request.d.ts.map +1 -0
  88. package/dist/types/convert-response.d.ts +16 -0
  89. package/dist/types/convert-response.d.ts.map +1 -0
  90. package/dist/types/converters/request-converters.d.ts +139 -0
  91. package/dist/types/converters/request-converters.d.ts.map +1 -0
  92. package/dist/types/converters/response-converters.d.ts +134 -0
  93. package/dist/types/converters/response-converters.d.ts.map +1 -0
  94. package/dist/types/create-backend.d.ts +20 -0
  95. package/dist/types/create-backend.d.ts.map +1 -0
  96. package/dist/types/index.d.ts +13 -0
  97. package/dist/types/index.d.ts.map +1 -0
  98. package/dist/types/main.d.ts +19 -0
  99. package/dist/types/main.d.ts.map +1 -0
  100. package/dist/types/ollama/commands/list.d.ts +32 -0
  101. package/dist/types/ollama/commands/list.d.ts.map +1 -0
  102. package/dist/types/ollama/commands/ps.d.ts +27 -0
  103. package/dist/types/ollama/commands/ps.d.ts.map +1 -0
  104. package/dist/types/ollama/commands/pull.d.ts +21 -0
  105. package/dist/types/ollama/commands/pull.d.ts.map +1 -0
  106. package/dist/types/ollama/commands/run.d.ts +48 -0
  107. package/dist/types/ollama/commands/run.d.ts.map +1 -0
  108. package/dist/types/ollama/commands/show.d.ts +36 -0
  109. package/dist/types/ollama/commands/show.d.ts.map +1 -0
  110. package/dist/types/ollama/index.d.ts +12 -0
  111. package/dist/types/ollama/index.d.ts.map +1 -0
  112. package/dist/types/ollama/types.d.ts +58 -0
  113. package/dist/types/ollama/types.d.ts.map +1 -0
  114. package/dist/types/proxy.d.ts +16 -0
  115. package/dist/types/proxy.d.ts.map +1 -0
  116. package/dist/types/utils/backend-loader.d.ts +55 -0
  117. package/dist/types/utils/backend-loader.d.ts.map +1 -0
  118. package/dist/types/utils/index.d.ts +13 -0
  119. package/dist/types/utils/index.d.ts.map +1 -0
  120. package/dist/types/utils/model-translation.d.ts +64 -0
  121. package/dist/types/utils/model-translation.d.ts.map +1 -0
  122. package/dist/types/utils/output-formatter.d.ts +113 -0
  123. package/dist/types/utils/output-formatter.d.ts.map +1 -0
  124. package/dist/types/utils/pipeline-inspector.d.ts +50 -0
  125. package/dist/types/utils/pipeline-inspector.d.ts.map +1 -0
  126. package/dist/types/utils/state-manager.d.ts +91 -0
  127. package/dist/types/utils/state-manager.d.ts.map +1 -0
  128. package/package.json +75 -0
  129. package/readme.md +32 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ollama/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Ollama CLI Types
4
+ *
5
+ * Shared types for Ollama CLI interface.
6
+ *
7
+ * @module cli/ollama/types
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ollama/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -0,0 +1,406 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * AI.Matey Proxy Server
5
+ *
6
+ * HTTP proxy server that accepts provider-format requests (e.g., OpenAI)
7
+ * and routes them through any ai-matey backend adapter.
8
+ *
9
+ * Usage:
10
+ * ai-matey proxy --backend ./backend.mjs --port 3000 --format openai
11
+ *
12
+ * This allows you to use ANY backend as a drop-in replacement for OpenAI/Anthropic/etc!
13
+ *
14
+ * @module cli/proxy
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.main = main;
18
+ const node_http_1 = require("node:http");
19
+ const backend_loader_js_1 = require("./utils/backend-loader.js");
20
+ const output_formatter_js_1 = require("./utils/output-formatter.js");
21
+ const response_converters_js_1 = require("./converters/response-converters.js");
22
+ // ============================================================================
23
+ // Request Parsing
24
+ // ============================================================================
25
+ /**
26
+ * Read request body as JSON.
27
+ */
28
+ async function readBody(req) {
29
+ const chunks = [];
30
+ for await (const chunk of req) {
31
+ chunks.push(chunk);
32
+ }
33
+ const body = Buffer.concat(chunks).toString('utf-8');
34
+ return JSON.parse(body);
35
+ }
36
+ /**
37
+ * Convert provider request to IR.
38
+ */
39
+ function providerRequestToIR(data, format) {
40
+ switch (format) {
41
+ case 'openai':
42
+ return {
43
+ messages: data.messages || [],
44
+ parameters: {
45
+ model: data.model,
46
+ temperature: data.temperature,
47
+ maxTokens: data.max_tokens,
48
+ topP: data.top_p,
49
+ frequencyPenalty: data.frequency_penalty,
50
+ presencePenalty: data.presence_penalty,
51
+ stopSequences: Array.isArray(data.stop) ? data.stop : data.stop ? [data.stop] : undefined,
52
+ seed: data.seed,
53
+ user: data.user,
54
+ },
55
+ stream: data.stream,
56
+ metadata: {
57
+ requestId: crypto.randomUUID(),
58
+ timestamp: Date.now(),
59
+ provenance: { frontend: 'openai' },
60
+ },
61
+ };
62
+ case 'anthropic':
63
+ // Add system message if present
64
+ const messages = data.messages || [];
65
+ if (data.system) {
66
+ messages.unshift({ role: 'system', content: data.system });
67
+ }
68
+ return {
69
+ messages,
70
+ parameters: {
71
+ model: data.model,
72
+ temperature: data.temperature,
73
+ maxTokens: data.max_tokens,
74
+ topP: data.top_p,
75
+ topK: data.top_k,
76
+ stopSequences: data.stop_sequences,
77
+ },
78
+ stream: data.stream,
79
+ metadata: {
80
+ requestId: crypto.randomUUID(),
81
+ timestamp: Date.now(),
82
+ provenance: { frontend: 'anthropic' },
83
+ },
84
+ };
85
+ case 'gemini':
86
+ const geminiMessages = (data.contents || []).map((content) => ({
87
+ role: content.role === 'model' ? 'assistant' : content.role,
88
+ content: content.parts?.map((p) => p.text).join('') || '',
89
+ }));
90
+ return {
91
+ messages: geminiMessages,
92
+ parameters: {
93
+ model: data.model,
94
+ temperature: data.generationConfig?.temperature,
95
+ maxTokens: data.generationConfig?.maxOutputTokens,
96
+ topP: data.generationConfig?.topP,
97
+ topK: data.generationConfig?.topK,
98
+ stopSequences: data.generationConfig?.stopSequences,
99
+ },
100
+ metadata: {
101
+ requestId: crypto.randomUUID(),
102
+ timestamp: Date.now(),
103
+ provenance: { frontend: 'gemini' },
104
+ },
105
+ };
106
+ case 'ollama':
107
+ return {
108
+ messages: data.messages || [],
109
+ parameters: {
110
+ model: data.model,
111
+ temperature: data.options?.temperature,
112
+ topP: data.options?.top_p,
113
+ topK: data.options?.top_k,
114
+ },
115
+ stream: data.stream,
116
+ metadata: {
117
+ requestId: crypto.randomUUID(),
118
+ timestamp: Date.now(),
119
+ provenance: { frontend: 'ollama' },
120
+ },
121
+ };
122
+ case 'mistral':
123
+ return {
124
+ messages: data.messages || [],
125
+ parameters: {
126
+ model: data.model,
127
+ temperature: data.temperature,
128
+ maxTokens: data.max_tokens,
129
+ topP: data.top_p,
130
+ },
131
+ stream: data.stream,
132
+ metadata: {
133
+ requestId: crypto.randomUUID(),
134
+ timestamp: Date.now(),
135
+ provenance: { frontend: 'mistral' },
136
+ },
137
+ };
138
+ default:
139
+ throw new Error(`Unsupported format: ${format}`);
140
+ }
141
+ }
142
+ // ============================================================================
143
+ // Request Handler
144
+ // ============================================================================
145
+ /**
146
+ * Create request handler for the proxy server.
147
+ */
148
+ function createHandler(backend, format, verbose) {
149
+ return async (req, res) => {
150
+ // CORS headers
151
+ res.setHeader('Access-Control-Allow-Origin', '*');
152
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
153
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
154
+ // Handle OPTIONS
155
+ if (req.method === 'OPTIONS') {
156
+ res.writeHead(200);
157
+ res.end();
158
+ return;
159
+ }
160
+ // Only handle POST
161
+ if (req.method !== 'POST') {
162
+ res.writeHead(405, { 'Content-Type': 'application/json' });
163
+ res.end(JSON.stringify({ error: 'Method not allowed' }));
164
+ return;
165
+ }
166
+ try {
167
+ // Read and parse request body
168
+ const requestBody = await readBody(req);
169
+ if (verbose) {
170
+ console.log(`[${new Date().toISOString()}] Request:`, JSON.stringify(requestBody, null, 2));
171
+ }
172
+ // Convert to IR
173
+ const irRequest = providerRequestToIR(requestBody, format);
174
+ // Check if streaming
175
+ if (irRequest.stream) {
176
+ // Handle streaming
177
+ res.writeHead(200, {
178
+ 'Content-Type': 'text/event-stream',
179
+ 'Cache-Control': 'no-cache',
180
+ Connection: 'keep-alive',
181
+ });
182
+ // Execute streaming request
183
+ const stream = backend.executeStream(irRequest);
184
+ for await (const chunk of stream) {
185
+ if (chunk.type === 'content') {
186
+ // Format as SSE
187
+ const data = {
188
+ id: chunk.sequence.toString(),
189
+ object: 'chat.completion.chunk',
190
+ created: Math.floor(Date.now() / 1000),
191
+ model: irRequest.parameters?.model || 'unknown',
192
+ choices: [
193
+ {
194
+ index: 0,
195
+ delta: { content: chunk.delta },
196
+ finish_reason: null,
197
+ },
198
+ ],
199
+ };
200
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
201
+ }
202
+ else if (chunk.type === 'done') {
203
+ // Send final chunk
204
+ const data = {
205
+ id: chunk.sequence.toString(),
206
+ object: 'chat.completion.chunk',
207
+ created: Math.floor(Date.now() / 1000),
208
+ model: irRequest.parameters?.model || 'unknown',
209
+ choices: [
210
+ {
211
+ index: 0,
212
+ delta: {},
213
+ finish_reason: chunk.finishReason || 'stop',
214
+ },
215
+ ],
216
+ };
217
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
218
+ res.write('data: [DONE]\n\n');
219
+ res.end();
220
+ }
221
+ else if (chunk.type === 'error') {
222
+ res.write(`data: ${JSON.stringify({ error: chunk.error })}\n\n`);
223
+ res.end();
224
+ }
225
+ }
226
+ }
227
+ else {
228
+ // Handle non-streaming
229
+ const irResponse = await backend.execute(irRequest);
230
+ // Convert response back to provider format
231
+ let providerResponse;
232
+ switch (format) {
233
+ case 'openai':
234
+ providerResponse = await (0, response_converters_js_1.toOpenAI)(irResponse);
235
+ break;
236
+ case 'anthropic':
237
+ providerResponse = await (0, response_converters_js_1.toAnthropic)(irResponse);
238
+ break;
239
+ case 'gemini':
240
+ providerResponse = await (0, response_converters_js_1.toGemini)(irResponse);
241
+ break;
242
+ case 'ollama':
243
+ providerResponse = await (0, response_converters_js_1.toOllama)(irResponse);
244
+ break;
245
+ case 'mistral':
246
+ providerResponse = await (0, response_converters_js_1.toMistral)(irResponse);
247
+ break;
248
+ default:
249
+ throw new Error(`Unsupported format: ${format}`);
250
+ }
251
+ if (verbose) {
252
+ console.log(`[${new Date().toISOString()}] Response:`, JSON.stringify(providerResponse, null, 2));
253
+ }
254
+ // Send response
255
+ res.writeHead(200, { 'Content-Type': 'application/json' });
256
+ res.end(JSON.stringify(providerResponse));
257
+ }
258
+ }
259
+ catch (err) {
260
+ console.error('Request error:', err);
261
+ res.writeHead(500, { 'Content-Type': 'application/json' });
262
+ res.end(JSON.stringify({
263
+ error: {
264
+ message: err instanceof Error ? err.message : String(err),
265
+ type: 'internal_error',
266
+ },
267
+ }));
268
+ }
269
+ };
270
+ }
271
+ // ============================================================================
272
+ // CLI
273
+ // ============================================================================
274
+ function showHelp() {
275
+ console.log(`
276
+ AI.Matey Proxy Server
277
+
278
+ Start an HTTP proxy server that accepts provider-format requests
279
+ and routes them through any ai-matey backend adapter.
280
+
281
+ Usage:
282
+ ai-matey proxy --backend <path> [options]
283
+
284
+ Options:
285
+ --backend <path> Backend module to load (required)
286
+ --port <number> Port to listen on (default: 3000)
287
+ --host <host> Host to bind to (default: localhost)
288
+ --format <format> Provider format to emulate (default: openai)
289
+ Supported: openai, anthropic, gemini, ollama, mistral
290
+ --verbose, -v Verbose logging
291
+ --help, -h Show this help
292
+
293
+ Examples:
294
+ # Start OpenAI-compatible proxy on port 3000
295
+ ai-matey proxy --backend ./groq-backend.mjs --port 3000
296
+
297
+ # Start Anthropic-compatible proxy
298
+ ai-matey proxy --backend ./backend.mjs --format anthropic --port 3001
299
+
300
+ # Use with OpenAI client library
301
+ ai-matey proxy --backend ./backend.mjs --port 3000
302
+ # Then in your code:
303
+ # const openai = new OpenAI({ baseURL: 'http://localhost:3000' })
304
+
305
+ How It Works:
306
+ 1. Accepts HTTP requests in the specified provider format (e.g., OpenAI)
307
+ 2. Converts the request to Universal IR format
308
+ 3. Routes through your backend adapter
309
+ 4. Converts the response back to the provider format
310
+ 5. Returns to client
311
+
312
+ This allows you to use ANY backend as a drop-in replacement for OpenAI,
313
+ Anthropic, or other providers!
314
+ `);
315
+ }
316
+ function parseArgs(args) {
317
+ const options = {
318
+ backend: '',
319
+ port: 3000,
320
+ host: 'localhost',
321
+ format: 'openai',
322
+ verbose: false,
323
+ };
324
+ for (let i = 0; i < args.length; i++) {
325
+ const arg = args[i];
326
+ switch (arg) {
327
+ case '--backend':
328
+ options.backend = args[++i] || '';
329
+ break;
330
+ case '--port':
331
+ options.port = parseInt(args[++i] || '3000', 10);
332
+ break;
333
+ case '--host':
334
+ options.host = args[++i] || 'localhost';
335
+ break;
336
+ case '--format':
337
+ options.format = args[++i] || 'openai';
338
+ break;
339
+ case '--verbose':
340
+ case '-v':
341
+ options.verbose = true;
342
+ break;
343
+ case '--help':
344
+ case '-h':
345
+ options.help = true;
346
+ break;
347
+ }
348
+ }
349
+ return options;
350
+ }
351
+ async function main(argv = process.argv.slice(2)) {
352
+ const options = parseArgs(argv);
353
+ if (options.help) {
354
+ showHelp();
355
+ return;
356
+ }
357
+ if (!options.backend) {
358
+ (0, output_formatter_js_1.error)('Missing required option: --backend <path>');
359
+ console.log('\nRun with --help for usage information');
360
+ process.exit(1);
361
+ }
362
+ try {
363
+ // Load backend
364
+ (0, output_formatter_js_1.info)(`Loading backend from ${options.backend}...`);
365
+ const backend = await (0, backend_loader_js_1.loadBackend)({ path: options.backend });
366
+ (0, output_formatter_js_1.success)(`✓ Backend loaded: ${backend.metadata.name} (${backend.metadata.provider})`);
367
+ // Create server
368
+ const handler = createHandler(backend, options.format || 'openai', options.verbose || false);
369
+ const server = (0, node_http_1.createServer)(handler);
370
+ // Start listening
371
+ server.listen(options.port, options.host, () => {
372
+ console.log('');
373
+ (0, output_formatter_js_1.success)(`🚀 Proxy server started!`);
374
+ console.log('');
375
+ console.log(` Format: ${options.format}`);
376
+ console.log(` URL: http://${options.host}:${options.port}`);
377
+ console.log(` Backend: ${backend.metadata.name}`);
378
+ console.log('');
379
+ console.log(' Press Ctrl+C to stop');
380
+ console.log('');
381
+ if (options.format === 'openai') {
382
+ console.log(' Example usage with OpenAI client:');
383
+ console.log(' ┌────────────────────────────────────────────┐');
384
+ console.log(` │ const openai = new OpenAI({ │`);
385
+ console.log(` │ baseURL: 'http://${options.host}:${options.port}', │`);
386
+ console.log(` │ apiKey: 'any-value' │`);
387
+ console.log(` │ }) │`);
388
+ console.log(' └────────────────────────────────────────────┘');
389
+ console.log('');
390
+ }
391
+ });
392
+ // Handle shutdown
393
+ process.on('SIGINT', () => {
394
+ console.log('\n\nShutting down...');
395
+ server.close(() => {
396
+ console.log('Server closed');
397
+ process.exit(0);
398
+ });
399
+ });
400
+ }
401
+ catch (err) {
402
+ (0, output_formatter_js_1.error)(err instanceof Error ? err.message : String(err));
403
+ process.exit(1);
404
+ }
405
+ }
406
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * Backend Loader Utility
4
+ *
5
+ * Dynamically loads backend modules from file paths.
6
+ * Node.js only - uses dynamic import.
7
+ *
8
+ * @module cli/utils/backend-loader
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.loadBackend = loadBackend;
45
+ exports.isModelRunner = isModelRunner;
46
+ exports.getBackendCapabilities = getBackendCapabilities;
47
+ const node_path_1 = require("node:path");
48
+ /**
49
+ * Load a backend from a module file.
50
+ *
51
+ * @param options - Load options
52
+ * @returns Loaded backend adapter
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const backend = await loadBackend({ path: './my-backend.mjs' });
57
+ * const response = await backend.execute(request);
58
+ * ```
59
+ */
60
+ async function loadBackend(options) {
61
+ const { path, cwd = process.cwd() } = options;
62
+ try {
63
+ // Resolve path
64
+ const resolvedPath = path.startsWith('/') ? path : (0, node_path_1.resolve)(cwd, path);
65
+ // Convert to file URL for import
66
+ const fileUrl = `file://${resolvedPath}`;
67
+ // Dynamic import
68
+ const module = (await Promise.resolve(`${fileUrl}`).then(s => __importStar(require(s))));
69
+ if (!module.default) {
70
+ throw new Error(`Backend module ${path} does not have a default export`);
71
+ }
72
+ const backend = module.default;
73
+ // Validate backend
74
+ if (typeof backend.execute !== 'function') {
75
+ throw new Error(`Backend module ${path} does not implement BackendAdapter interface (missing execute method)`);
76
+ }
77
+ return backend;
78
+ }
79
+ catch (error) {
80
+ if (error instanceof Error) {
81
+ // Re-throw with better error message
82
+ throw new Error(`Failed to load backend from ${path}: ${error.message}`, { cause: error });
83
+ }
84
+ throw error;
85
+ }
86
+ }
87
+ /**
88
+ * Check if a backend is a model runner (has lifecycle methods).
89
+ *
90
+ * @param backend - Backend to check
91
+ * @returns True if backend is a model runner
92
+ */
93
+ function isModelRunner(backend) {
94
+ return (typeof backend.start === 'function' &&
95
+ typeof backend.stop === 'function' &&
96
+ typeof backend.getStats === 'function');
97
+ }
98
+ /**
99
+ * Get backend capabilities.
100
+ *
101
+ * @param backend - Backend to inspect
102
+ * @returns Capability flags
103
+ */
104
+ function getBackendCapabilities(backend) {
105
+ return {
106
+ hasLifecycle: isModelRunner(backend),
107
+ hasModelList: typeof backend.listModels === 'function',
108
+ hasStats: typeof backend.getStats === 'function',
109
+ metadata: backend.metadata,
110
+ };
111
+ }
112
+ //# sourceMappingURL=backend-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-loader.js","sourceRoot":"","sources":["../../../src/utils/backend-loader.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCH,kCAkCC;AAQD,sCAMC;AAQD,wDAOC;AA9FD,yCAAoC;AAmBpC;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAE9C,IAAI,CAAC;QACH,eAAe;QACf,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEtE,iCAAiC;QACjC,MAAM,OAAO,GAAG,UAAU,YAAY,EAAE,CAAC;QAEzC,iBAAiB;QACjB,MAAM,MAAM,GAAG,CAAC,yBAAa,OAAO,uCAAC,CAAkB,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,iCAAiC,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,mBAAmB;QACnB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,uEAAuE,CAC9F,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,qCAAqC;YACrC,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAuB;IACnD,OAAO,CACL,OAAQ,OAAe,CAAC,KAAK,KAAK,UAAU;QAC5C,OAAQ,OAAe,CAAC,IAAI,KAAK,UAAU;QAC3C,OAAQ,OAAe,CAAC,QAAQ,KAAK,UAAU,CAChD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,OAAO;QACL,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC;QACpC,YAAY,EAAE,OAAQ,OAAe,CAAC,UAAU,KAAK,UAAU;QAC/D,QAAQ,EAAE,OAAQ,OAAe,CAAC,QAAQ,KAAK,UAAU;QACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * CLI Utilities
4
+ *
5
+ * Common utilities for CLI implementation.
6
+ * Node.js only - not browser-compatible.
7
+ *
8
+ * @module cli/utils
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ __exportStar(require("./backend-loader.js"), exports);
26
+ __exportStar(require("./model-translation.js"), exports);
27
+ __exportStar(require("./output-formatter.js"), exports);
28
+ __exportStar(require("./state-manager.js"), exports);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;AAEH,sDAAoC;AACpC,yDAAuC;AACvC,wDAAsC;AACtC,qDAAmC"}