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,331 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Tool for Converting Requests
4
+ *
5
+ * Convert between Universal IR requests and various provider formats.
6
+ *
7
+ * Usage:
8
+ * ai-matey convert-request --from openai --to ir --input request.json
9
+ * ai-matey convert-request --from ir --to anthropic --input request.json
10
+ *
11
+ * @module
12
+ */
13
+ import { readFile } from 'node:fs/promises';
14
+ import { stdin } from 'node:process';
15
+ import { toOpenAIRequest, toAnthropicRequest, toGeminiRequest, toOllamaRequest, toMistralRequest, toMultipleRequestFormats, } from './converters/request-converters.js';
16
+ function parseArgs(args) {
17
+ const parsed = {
18
+ from: 'ir',
19
+ to: 'openai',
20
+ pretty: true,
21
+ };
22
+ for (let i = 0; i < args.length; i++) {
23
+ const arg = args[i];
24
+ switch (arg) {
25
+ case '--from':
26
+ case '-f':
27
+ parsed.from = args[++i] || 'ir';
28
+ break;
29
+ case '--to':
30
+ case '-t':
31
+ parsed.to = args[++i] || 'openai';
32
+ break;
33
+ case '--input':
34
+ case '-i':
35
+ parsed.input = args[++i];
36
+ break;
37
+ case '--output':
38
+ case '-o':
39
+ parsed.output = args[++i];
40
+ break;
41
+ case '--no-pretty':
42
+ parsed.pretty = false;
43
+ break;
44
+ case '--help':
45
+ case '-h':
46
+ parsed.help = true;
47
+ break;
48
+ }
49
+ }
50
+ return parsed;
51
+ }
52
+ // ============================================================================
53
+ // Help Text
54
+ // ============================================================================
55
+ const SUPPORTED_FORMATS = ['ir', 'openai', 'anthropic', 'gemini', 'ollama', 'mistral'];
56
+ function printHelp() {
57
+ console.log(`
58
+ AI.Matey Request Converter
59
+ Convert between Universal IR requests and provider formats
60
+
61
+ USAGE:
62
+ ai-matey convert-request [OPTIONS]
63
+
64
+ OPTIONS:
65
+ -f, --from <format> Source format (${SUPPORTED_FORMATS.join(', ')}, or 'all')
66
+ -t, --to <format> Target format (${SUPPORTED_FORMATS.join(', ')}, or 'all')
67
+ -i, --input <file> Input file (JSON). If omitted, reads from stdin
68
+ -o, --output <file> Output file. If omitted, writes to stdout
69
+ --no-pretty Disable pretty-printing
70
+ -h, --help Show this help message
71
+
72
+ FORMATS:
73
+ ir - Universal Intermediate Representation
74
+ ${SUPPORTED_FORMATS.filter((f) => f !== 'ir')
75
+ .map((f) => ` ${f.padEnd(12)} - ${f.charAt(0).toUpperCase() + f.slice(1)} format`)
76
+ .join('\n ')}
77
+ all - Convert to all formats (for debugging)
78
+
79
+ EXAMPLES:
80
+ # Convert IR to OpenAI format
81
+ ai-matey convert-request --from ir --to openai --input ir-request.json
82
+
83
+ # Convert OpenAI to IR (useful for migration)
84
+ ai-matey convert-request --from openai --to ir --input openai-request.json
85
+
86
+ # Convert from stdin
87
+ cat request.json | ai-matey convert-request --from ir --to anthropic
88
+
89
+ # Save to file
90
+ ai-matey convert-request -f ir -t gemini -i request.json -o gemini-request.json
91
+
92
+ # Convert IR to all formats for comparison
93
+ ai-matey convert-request -f ir -t all -i request.json
94
+ `);
95
+ }
96
+ // ============================================================================
97
+ // Input/Output Functions
98
+ // ============================================================================
99
+ async function readInput(inputFile) {
100
+ let content;
101
+ if (inputFile) {
102
+ // Read from file
103
+ content = await readFile(inputFile, 'utf-8');
104
+ }
105
+ else {
106
+ // Read from stdin
107
+ const chunks = [];
108
+ for await (const chunk of stdin) {
109
+ chunks.push(chunk);
110
+ }
111
+ content = Buffer.concat(chunks).toString('utf-8');
112
+ }
113
+ try {
114
+ return JSON.parse(content);
115
+ }
116
+ catch (error) {
117
+ throw new Error(`Invalid JSON input: ${error instanceof Error ? error.message : String(error)}`);
118
+ }
119
+ }
120
+ function formatOutput(data, pretty) {
121
+ return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
122
+ }
123
+ // ============================================================================
124
+ // Conversion Functions
125
+ // ============================================================================
126
+ /**
127
+ * Convert from provider format to IR.
128
+ * This is a basic implementation that handles common cases.
129
+ */
130
+ function toIRRequest(data, sourceFormat) {
131
+ // For now, we'll do basic conversion
132
+ // This can be enhanced with proper type-safe converters later
133
+ switch (sourceFormat) {
134
+ case 'openai':
135
+ return {
136
+ messages: data.messages || [],
137
+ parameters: {
138
+ model: data.model,
139
+ temperature: data.temperature,
140
+ maxTokens: data.max_tokens,
141
+ topP: data.top_p,
142
+ frequencyPenalty: data.frequency_penalty,
143
+ presencePenalty: data.presence_penalty,
144
+ stopSequences: Array.isArray(data.stop) ? data.stop : data.stop ? [data.stop] : undefined,
145
+ },
146
+ stream: data.stream,
147
+ metadata: {
148
+ requestId: crypto.randomUUID(),
149
+ timestamp: Date.now(),
150
+ provenance: { frontend: 'openai' },
151
+ },
152
+ };
153
+ case 'anthropic':
154
+ return {
155
+ messages: data.messages || [],
156
+ parameters: {
157
+ model: data.model,
158
+ temperature: data.temperature,
159
+ maxTokens: data.max_tokens,
160
+ topP: data.top_p,
161
+ topK: data.top_k,
162
+ stopSequences: data.stop_sequences,
163
+ },
164
+ stream: data.stream,
165
+ metadata: {
166
+ requestId: crypto.randomUUID(),
167
+ timestamp: Date.now(),
168
+ provenance: { frontend: 'anthropic' },
169
+ },
170
+ };
171
+ case 'gemini':
172
+ // Gemini has different structure - contents instead of messages
173
+ const messages = (data.contents || []).map((content) => ({
174
+ role: content.role === 'model' ? 'assistant' : content.role,
175
+ content: content.parts?.map((p) => p.text).join('') || '',
176
+ }));
177
+ return {
178
+ messages,
179
+ parameters: {
180
+ model: data.model,
181
+ temperature: data.generationConfig?.temperature,
182
+ maxTokens: data.generationConfig?.maxOutputTokens,
183
+ topP: data.generationConfig?.topP,
184
+ topK: data.generationConfig?.topK,
185
+ stopSequences: data.generationConfig?.stopSequences,
186
+ },
187
+ metadata: {
188
+ requestId: crypto.randomUUID(),
189
+ timestamp: Date.now(),
190
+ provenance: { frontend: 'gemini' },
191
+ },
192
+ };
193
+ case 'ollama':
194
+ return {
195
+ messages: data.messages || [],
196
+ parameters: {
197
+ model: data.model,
198
+ temperature: data.options?.temperature,
199
+ topP: data.options?.top_p,
200
+ topK: data.options?.top_k,
201
+ },
202
+ stream: data.stream,
203
+ metadata: {
204
+ requestId: crypto.randomUUID(),
205
+ timestamp: Date.now(),
206
+ provenance: { frontend: 'ollama' },
207
+ },
208
+ };
209
+ case 'mistral':
210
+ return {
211
+ messages: data.messages || [],
212
+ parameters: {
213
+ model: data.model,
214
+ temperature: data.temperature,
215
+ maxTokens: data.max_tokens,
216
+ topP: data.top_p,
217
+ },
218
+ stream: data.stream,
219
+ metadata: {
220
+ requestId: crypto.randomUUID(),
221
+ timestamp: Date.now(),
222
+ provenance: { frontend: 'mistral' },
223
+ },
224
+ };
225
+ default:
226
+ throw new Error(`Unsupported source format: ${sourceFormat}`);
227
+ }
228
+ }
229
+ // ============================================================================
230
+ // Main Function
231
+ // ============================================================================
232
+ async function main() {
233
+ const args = parseArgs(process.argv.slice(2));
234
+ if (args.help) {
235
+ printHelp();
236
+ process.exit(0);
237
+ }
238
+ try {
239
+ // Read input
240
+ const input = await readInput(args.input);
241
+ // Convert
242
+ let result;
243
+ if (args.from === 'ir') {
244
+ // Convert FROM IR TO provider format
245
+ const irRequest = input;
246
+ if (args.to === 'all') {
247
+ // Convert to all formats
248
+ result = toMultipleRequestFormats(irRequest, [
249
+ 'openai',
250
+ 'anthropic',
251
+ 'gemini',
252
+ 'ollama',
253
+ 'mistral',
254
+ ]);
255
+ }
256
+ else {
257
+ // Convert to specific format
258
+ switch (args.to) {
259
+ case 'ir':
260
+ result = irRequest; // No conversion needed
261
+ break;
262
+ case 'openai':
263
+ result = toOpenAIRequest(irRequest);
264
+ break;
265
+ case 'anthropic':
266
+ result = toAnthropicRequest(irRequest);
267
+ break;
268
+ case 'gemini':
269
+ result = toGeminiRequest(irRequest);
270
+ break;
271
+ case 'ollama':
272
+ result = toOllamaRequest(irRequest);
273
+ break;
274
+ case 'mistral':
275
+ result = toMistralRequest(irRequest);
276
+ break;
277
+ default:
278
+ throw new Error(`Unsupported target format: ${args.to}. Use --help to see available formats.`);
279
+ }
280
+ }
281
+ }
282
+ else if (args.to === 'ir') {
283
+ // Convert FROM provider format TO IR
284
+ result = toIRRequest(input, args.from);
285
+ }
286
+ else {
287
+ // Convert FROM provider TO provider (via IR)
288
+ const irRequest = toIRRequest(input, args.from);
289
+ switch (args.to) {
290
+ case 'openai':
291
+ result = toOpenAIRequest(irRequest);
292
+ break;
293
+ case 'anthropic':
294
+ result = toAnthropicRequest(irRequest);
295
+ break;
296
+ case 'gemini':
297
+ result = toGeminiRequest(irRequest);
298
+ break;
299
+ case 'ollama':
300
+ result = toOllamaRequest(irRequest);
301
+ break;
302
+ case 'mistral':
303
+ result = toMistralRequest(irRequest);
304
+ break;
305
+ default:
306
+ throw new Error(`Unsupported target format: ${args.to}`);
307
+ }
308
+ }
309
+ // Format and output
310
+ const output = formatOutput(result, args.pretty ?? true);
311
+ if (args.output) {
312
+ // Write to file
313
+ const { writeFile } = await import('node:fs/promises');
314
+ await writeFile(args.output, output, 'utf-8');
315
+ console.error(`✓ Converted from ${args.from} to ${args.to}: ${args.output}`);
316
+ }
317
+ else {
318
+ // Write to stdout
319
+ console.log(output);
320
+ }
321
+ process.exit(0);
322
+ }
323
+ catch (error) {
324
+ console.error('Error:', error instanceof Error ? error.message : String(error));
325
+ console.error('\nRun with --help for usage information');
326
+ process.exit(1);
327
+ }
328
+ }
329
+ // Export for use as module or subcommand
330
+ export { main };
331
+ //# sourceMappingURL=convert-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-request.js","sourceRoot":"","sources":["../../src/convert-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Tool for Converting IR Responses
4
+ *
5
+ * Convert Universal IR responses to various frontend formats for debugging.
6
+ *
7
+ * Usage:
8
+ * npx ai-matey convert-response --format openai --input response.json
9
+ * npx ai-matey convert-response --format all --input response.json
10
+ * cat response.json | npx ai-matey convert-response --format anthropic
11
+ *
12
+ * @module
13
+ */
14
+ import { readFile } from 'node:fs/promises';
15
+ import { stdin } from 'node:process';
16
+ import { toOpenAI, toAnthropic, toGemini, toOllama, toMistral, toMultipleFormats, } from './converters/response-converters.js';
17
+ function parseArgs(args) {
18
+ const parsed = {
19
+ format: 'openai',
20
+ pretty: true,
21
+ };
22
+ for (let i = 0; i < args.length; i++) {
23
+ const arg = args[i];
24
+ switch (arg) {
25
+ case '--format':
26
+ case '-f':
27
+ parsed.format = args[++i] || 'openai';
28
+ break;
29
+ case '--input':
30
+ case '-i':
31
+ parsed.input = args[++i];
32
+ break;
33
+ case '--output':
34
+ case '-o':
35
+ parsed.output = args[++i];
36
+ break;
37
+ case '--no-pretty':
38
+ parsed.pretty = false;
39
+ break;
40
+ case '--help':
41
+ case '-h':
42
+ parsed.help = true;
43
+ break;
44
+ }
45
+ }
46
+ return parsed;
47
+ }
48
+ // ============================================================================
49
+ // Help Text
50
+ // ============================================================================
51
+ const SUPPORTED_FORMATS = ['openai', 'anthropic', 'gemini', 'ollama', 'mistral'];
52
+ function printHelp() {
53
+ console.log(`
54
+ AI.Matey Response Converter
55
+ Convert Universal IR responses to various frontend formats
56
+
57
+ USAGE:
58
+ npx ai-matey convert-response [OPTIONS]
59
+
60
+ OPTIONS:
61
+ -f, --format <format> Target format (${SUPPORTED_FORMATS.join(', ')}, or 'all')
62
+ -i, --input <file> Input file (JSON). If omitted, reads from stdin
63
+ -o, --output <file> Output file. If omitted, writes to stdout
64
+ --no-pretty Disable pretty-printing
65
+ -h, --help Show this help message
66
+
67
+ FORMATS:
68
+ ${SUPPORTED_FORMATS.map((f) => ` ${f.padEnd(12)} - ${f.charAt(0).toUpperCase() + f.slice(1)} format`).join('\n ')}
69
+ all - Convert to all formats (for debugging)
70
+
71
+ EXAMPLES:
72
+ # Convert from file
73
+ npx ai-matey convert-response --format openai --input response.json
74
+
75
+ # Convert from stdin
76
+ cat response.json | npx ai-matey convert-response --format anthropic
77
+
78
+ # Save to file
79
+ npx ai-matey convert-response -f gemini -i response.json -o gemini-format.json
80
+
81
+ # Convert to all formats for debugging
82
+ npx ai-matey convert-response -f all -i response.json
83
+
84
+ # Compact output (no pretty-printing)
85
+ npx ai-matey convert-response -f openai -i response.json --no-pretty
86
+ `);
87
+ }
88
+ // ============================================================================
89
+ // Input/Output Functions
90
+ // ============================================================================
91
+ async function readInput(inputFile) {
92
+ let content;
93
+ if (inputFile) {
94
+ // Read from file
95
+ content = await readFile(inputFile, 'utf-8');
96
+ }
97
+ else {
98
+ // Read from stdin
99
+ const chunks = [];
100
+ for await (const chunk of stdin) {
101
+ chunks.push(chunk);
102
+ }
103
+ content = Buffer.concat(chunks).toString('utf-8');
104
+ }
105
+ try {
106
+ return JSON.parse(content);
107
+ }
108
+ catch (error) {
109
+ throw new Error(`Invalid JSON input: ${error instanceof Error ? error.message : String(error)}`);
110
+ }
111
+ }
112
+ function formatOutput(data, pretty) {
113
+ return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
114
+ }
115
+ // ============================================================================
116
+ // Main Function
117
+ // ============================================================================
118
+ async function main() {
119
+ const args = parseArgs(process.argv.slice(2));
120
+ if (args.help) {
121
+ printHelp();
122
+ process.exit(0);
123
+ }
124
+ try {
125
+ // Read input
126
+ const irResponse = await readInput(args.input);
127
+ // Convert to target format(s)
128
+ let result;
129
+ if (args.format === 'all') {
130
+ // Convert to all formats
131
+ result = await toMultipleFormats(irResponse, SUPPORTED_FORMATS);
132
+ }
133
+ else {
134
+ // Convert to specific format
135
+ switch (args.format) {
136
+ case 'openai':
137
+ result = await toOpenAI(irResponse);
138
+ break;
139
+ case 'anthropic':
140
+ result = await toAnthropic(irResponse);
141
+ break;
142
+ case 'gemini':
143
+ result = await toGemini(irResponse);
144
+ break;
145
+ case 'ollama':
146
+ result = await toOllama(irResponse);
147
+ break;
148
+ case 'mistral':
149
+ result = await toMistral(irResponse);
150
+ break;
151
+ default:
152
+ throw new Error(`Unsupported format: ${args.format}. Use --help to see available formats.`);
153
+ }
154
+ }
155
+ // Format and output
156
+ const output = formatOutput(result, args.pretty ?? true);
157
+ if (args.output) {
158
+ // Write to file
159
+ const { writeFile } = await import('node:fs/promises');
160
+ await writeFile(args.output, output, 'utf-8');
161
+ console.error(`✓ Converted to ${args.format} format: ${args.output}`);
162
+ }
163
+ else {
164
+ // Write to stdout
165
+ console.log(output);
166
+ }
167
+ process.exit(0);
168
+ }
169
+ catch (error) {
170
+ console.error('Error:', error instanceof Error ? error.message : String(error));
171
+ console.error('\nRun with --help for usage information');
172
+ process.exit(1);
173
+ }
174
+ }
175
+ // Export for use as module or subcommand
176
+ export { main };
177
+ //# sourceMappingURL=convert-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-response.js","sourceRoot":"","sources":["../../src/convert-response.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAc7C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAY;QACtB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC;gBACtC,MAAM;YACR,KAAK,SAAS,CAAC;YACf,KAAK,IAAI;gBACP,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACnB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEjF,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;4CAQ8B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;IAOpE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;CAkB5H,CAAC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,KAAK,UAAU,SAAS,CAAC,SAAkB;IACzC,IAAI,OAAe,CAAC;IAEpB,IAAI,SAAS,EAAE,CAAC;QACd,iBAAiB;QACjB,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,kBAAkB;QAClB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAa,EAAE,MAAe;IAClD,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,aAAa;QACb,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/C,8BAA8B;QAC9B,IAAI,MAAe,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,yBAAyB;YACzB,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,iBAAwB,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,QAAQ;oBACX,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,WAAW;oBACd,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;oBACvC,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;oBACrC,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,MAAM,wCAAwC,CAC3E,CAAC;YACN,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QAEzD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,gBAAgB;YAChB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,OAAO,EAAE,IAAI,EAAE,CAAC"}