@appkit/llamacpp-cli 1.12.1 → 1.14.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 (36) hide show
  1. package/README.md +115 -0
  2. package/dist/cli.js +26 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/launch/claude.d.ts +6 -0
  5. package/dist/commands/launch/claude.d.ts.map +1 -0
  6. package/dist/commands/launch/claude.js +282 -0
  7. package/dist/commands/launch/claude.js.map +1 -0
  8. package/dist/lib/anthropic-converter.d.ts +15 -0
  9. package/dist/lib/anthropic-converter.d.ts.map +1 -0
  10. package/dist/lib/anthropic-converter.js +276 -0
  11. package/dist/lib/anthropic-converter.js.map +1 -0
  12. package/dist/lib/anthropic-stream-converter.d.ts +35 -0
  13. package/dist/lib/anthropic-stream-converter.d.ts.map +1 -0
  14. package/dist/lib/anthropic-stream-converter.js +227 -0
  15. package/dist/lib/anthropic-stream-converter.js.map +1 -0
  16. package/dist/lib/integration-checker.d.ts +26 -0
  17. package/dist/lib/integration-checker.d.ts.map +1 -0
  18. package/dist/lib/integration-checker.js +77 -0
  19. package/dist/lib/integration-checker.js.map +1 -0
  20. package/dist/lib/router-manager.d.ts +4 -0
  21. package/dist/lib/router-manager.d.ts.map +1 -1
  22. package/dist/lib/router-manager.js +10 -0
  23. package/dist/lib/router-manager.js.map +1 -1
  24. package/dist/lib/router-server.d.ts +21 -0
  25. package/dist/lib/router-server.d.ts.map +1 -1
  26. package/dist/lib/router-server.js +370 -7
  27. package/dist/lib/router-server.js.map +1 -1
  28. package/dist/types/anthropic-types.d.ts +198 -0
  29. package/dist/types/anthropic-types.d.ts.map +1 -0
  30. package/dist/types/anthropic-types.js +5 -0
  31. package/dist/types/anthropic-types.js.map +1 -0
  32. package/dist/types/integration-config.d.ts +32 -0
  33. package/dist/types/integration-config.d.ts.map +1 -0
  34. package/dist/types/integration-config.js +3 -0
  35. package/dist/types/integration-config.js.map +1 -0
  36. package/package.json +1 -1
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fromMessagesRequest = fromMessagesRequest;
4
+ exports.toMessagesResponse = toMessagesResponse;
5
+ exports.generateMessageId = generateMessageId;
6
+ exports.generateRequestId = generateRequestId;
7
+ exports.estimateInputTokens = estimateInputTokens;
8
+ exports.createAnthropicError = createAnthropicError;
9
+ const crypto_1 = require("crypto");
10
+ // ============================================================================
11
+ // Request Conversion: Anthropic → OpenAI
12
+ // ============================================================================
13
+ function fromMessagesRequest(req) {
14
+ const messages = [];
15
+ // Convert system prompt if present
16
+ if (req.system) {
17
+ const systemContent = typeof req.system === 'string'
18
+ ? req.system
19
+ : extractTextFromContentBlocks(req.system);
20
+ if (systemContent) {
21
+ messages.push({ role: 'system', content: systemContent });
22
+ }
23
+ }
24
+ // Convert messages
25
+ for (const msg of req.messages) {
26
+ const converted = convertAnthropicMessage(msg);
27
+ messages.push(...converted);
28
+ }
29
+ // Convert tools
30
+ const tools = req.tools?.length
31
+ ? req.tools.map(convertAnthropicTool)
32
+ : undefined;
33
+ // Convert tool_choice
34
+ let toolChoice = undefined;
35
+ if (req.tool_choice) {
36
+ if (req.tool_choice.type === 'auto') {
37
+ toolChoice = 'auto';
38
+ }
39
+ else if (req.tool_choice.type === 'none') {
40
+ toolChoice = 'none';
41
+ }
42
+ else if (req.tool_choice.type === 'tool' && req.tool_choice.name) {
43
+ toolChoice = {
44
+ type: 'function',
45
+ function: { name: req.tool_choice.name },
46
+ };
47
+ }
48
+ }
49
+ return {
50
+ model: req.model,
51
+ messages,
52
+ temperature: req.temperature,
53
+ top_p: req.top_p,
54
+ max_tokens: req.max_tokens,
55
+ stop: req.stop_sequences,
56
+ stream: req.stream,
57
+ tools,
58
+ tool_choice: toolChoice,
59
+ };
60
+ }
61
+ function convertAnthropicMessage(msg) {
62
+ const messages = [];
63
+ const role = msg.role.toLowerCase();
64
+ // Simple string content
65
+ if (typeof msg.content === 'string') {
66
+ messages.push({ role, content: msg.content });
67
+ return messages;
68
+ }
69
+ // Complex content blocks
70
+ let textContent = '';
71
+ const toolCalls = [];
72
+ const toolResults = [];
73
+ for (const block of msg.content) {
74
+ switch (block.type) {
75
+ case 'text':
76
+ if (block.text) {
77
+ textContent += block.text;
78
+ }
79
+ break;
80
+ case 'image':
81
+ // OpenAI doesn't support images in the same way
82
+ // Skip for now (would need to convert to base64 data URL)
83
+ break;
84
+ case 'tool_use':
85
+ if (block.id && block.name) {
86
+ toolCalls.push({
87
+ id: block.id,
88
+ type: 'function',
89
+ function: {
90
+ name: block.name,
91
+ arguments: JSON.stringify(block.input || {}),
92
+ },
93
+ });
94
+ }
95
+ break;
96
+ case 'tool_result':
97
+ if (block.tool_use_id) {
98
+ const resultContent = typeof block.content === 'string'
99
+ ? block.content
100
+ : extractTextFromContentBlocks(block.content || []);
101
+ toolResults.push({
102
+ role: 'tool',
103
+ content: resultContent,
104
+ tool_call_id: block.tool_use_id,
105
+ });
106
+ }
107
+ break;
108
+ }
109
+ }
110
+ // Add main message if there's text or tool calls
111
+ if (textContent || toolCalls.length > 0) {
112
+ const message = {
113
+ role,
114
+ content: textContent,
115
+ };
116
+ if (toolCalls.length > 0) {
117
+ message.tool_calls = toolCalls;
118
+ }
119
+ messages.push(message);
120
+ }
121
+ // Add tool result messages
122
+ messages.push(...toolResults);
123
+ return messages;
124
+ }
125
+ function convertAnthropicTool(tool) {
126
+ return {
127
+ type: 'function',
128
+ function: {
129
+ name: tool.name,
130
+ description: tool.description,
131
+ parameters: tool.input_schema,
132
+ },
133
+ };
134
+ }
135
+ function extractTextFromContentBlocks(blocks) {
136
+ return blocks
137
+ .filter(block => block.type === 'text' && block.text)
138
+ .map(block => block.text)
139
+ .join('');
140
+ }
141
+ // ============================================================================
142
+ // Response Conversion: OpenAI → Anthropic
143
+ // ============================================================================
144
+ function toMessagesResponse(openaiRes, messageId) {
145
+ const id = messageId || generateMessageId();
146
+ const choice = openaiRes.choices[0];
147
+ const message = choice.message;
148
+ const content = [];
149
+ // Add text content
150
+ if (message.content) {
151
+ content.push({
152
+ type: 'text',
153
+ text: message.content,
154
+ });
155
+ }
156
+ // Add tool calls
157
+ if (message.tool_calls) {
158
+ for (const tc of message.tool_calls) {
159
+ content.push({
160
+ type: 'tool_use',
161
+ id: tc.id,
162
+ name: tc.function.name,
163
+ input: JSON.parse(tc.function.arguments || '{}'),
164
+ });
165
+ }
166
+ }
167
+ const stopReason = mapStopReason(choice.finish_reason, message.tool_calls?.length ?? 0);
168
+ return {
169
+ id,
170
+ type: 'message',
171
+ role: 'assistant',
172
+ model: openaiRes.model,
173
+ content,
174
+ stop_reason: stopReason,
175
+ usage: {
176
+ input_tokens: openaiRes.usage.prompt_tokens,
177
+ output_tokens: openaiRes.usage.completion_tokens,
178
+ },
179
+ };
180
+ }
181
+ function mapStopReason(finishReason, toolCallsCount) {
182
+ if (toolCallsCount > 0) {
183
+ return 'tool_use';
184
+ }
185
+ switch (finishReason) {
186
+ case 'stop':
187
+ return 'end_turn';
188
+ case 'length':
189
+ return 'max_tokens';
190
+ case 'tool_calls':
191
+ return 'tool_use';
192
+ default:
193
+ return 'end_turn';
194
+ }
195
+ }
196
+ // ============================================================================
197
+ // Utility Functions
198
+ // ============================================================================
199
+ function generateMessageId() {
200
+ const bytes = (0, crypto_1.randomBytes)(12);
201
+ return `msg_${bytes.toString('hex')}`;
202
+ }
203
+ function generateRequestId() {
204
+ const bytes = (0, crypto_1.randomBytes)(12);
205
+ return `req_${bytes.toString('hex')}`;
206
+ }
207
+ function estimateInputTokens(req) {
208
+ let totalLength = 0;
209
+ // Count system prompt
210
+ if (req.system) {
211
+ if (typeof req.system === 'string') {
212
+ totalLength += req.system.length;
213
+ }
214
+ else {
215
+ totalLength += extractTextFromContentBlocks(req.system).length;
216
+ }
217
+ }
218
+ // Count messages
219
+ for (const msg of req.messages) {
220
+ totalLength += msg.role.length;
221
+ if (typeof msg.content === 'string') {
222
+ totalLength += msg.content.length;
223
+ }
224
+ else {
225
+ totalLength += extractTextFromContentBlocks(msg.content).length;
226
+ }
227
+ }
228
+ // Count tools
229
+ if (req.tools) {
230
+ for (const tool of req.tools) {
231
+ totalLength += tool.name.length;
232
+ totalLength += tool.description?.length ?? 0;
233
+ totalLength += JSON.stringify(tool.input_schema || {}).length;
234
+ }
235
+ }
236
+ // Rough estimate: 1 token ≈ 4 characters
237
+ return Math.max(1, Math.floor(totalLength / 4));
238
+ }
239
+ // ============================================================================
240
+ // Error Response Creation
241
+ // ============================================================================
242
+ function createAnthropicError(statusCode, message) {
243
+ let errorType;
244
+ switch (statusCode) {
245
+ case 400:
246
+ errorType = 'invalid_request_error';
247
+ break;
248
+ case 401:
249
+ errorType = 'authentication_error';
250
+ break;
251
+ case 403:
252
+ errorType = 'permission_error';
253
+ break;
254
+ case 404:
255
+ errorType = 'not_found_error';
256
+ break;
257
+ case 429:
258
+ errorType = 'rate_limit_error';
259
+ break;
260
+ case 503:
261
+ case 529:
262
+ errorType = 'overloaded_error';
263
+ break;
264
+ default:
265
+ errorType = 'api_error';
266
+ }
267
+ return {
268
+ type: 'error',
269
+ error: {
270
+ type: errorType,
271
+ message,
272
+ },
273
+ request_id: generateRequestId(),
274
+ };
275
+ }
276
+ //# sourceMappingURL=anthropic-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-converter.js","sourceRoot":"","sources":["../../src/lib/anthropic-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { OpenAIChatStreamChunk, AnthropicStreamEvent } from '../types/anthropic-types.js';
2
+ /**
3
+ * StreamConverter manages state for converting OpenAI streaming responses to Anthropic format.
4
+ *
5
+ * It tracks the current state of content blocks and emits proper Anthropic SSE events.
6
+ */
7
+ export declare class AnthropicStreamConverter {
8
+ private id;
9
+ private model;
10
+ private firstChunk;
11
+ private contentIndex;
12
+ private inputTokens;
13
+ private outputTokens;
14
+ private estimatedInputTokens;
15
+ private textStarted;
16
+ private currentTextContent;
17
+ private toolCallsInProgress;
18
+ private toolCallsSent;
19
+ constructor(id: string, model: string, estimatedInputTokens: number);
20
+ /**
21
+ * Process an OpenAI streaming chunk and return Anthropic events.
22
+ */
23
+ process(chunk: OpenAIChatStreamChunk): AnthropicStreamEvent[];
24
+ private processToolCallDelta;
25
+ private createMessageStartEvent;
26
+ private createContentBlockStartEvent;
27
+ private createToolUseStartEvent;
28
+ private createTextDeltaEvent;
29
+ private createInputJsonDeltaEvent;
30
+ private createContentBlockStopEvent;
31
+ private createMessageDeltaEvent;
32
+ private createMessageStopEvent;
33
+ private mapFinishReason;
34
+ }
35
+ //# sourceMappingURL=anthropic-stream-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-stream-converter.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic-stream-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAOrB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,oBAAoB,CAAS;IAGrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,aAAa,CAAqB;gBAE9B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM;IAOnE;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,oBAAoB,EAAE;IA+D7D,OAAO,CAAC,oBAAoB;IA4D5B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,eAAe;CAkBxB"}
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnthropicStreamConverter = void 0;
4
+ /**
5
+ * StreamConverter manages state for converting OpenAI streaming responses to Anthropic format.
6
+ *
7
+ * It tracks the current state of content blocks and emits proper Anthropic SSE events.
8
+ */
9
+ class AnthropicStreamConverter {
10
+ constructor(id, model, estimatedInputTokens) {
11
+ this.firstChunk = true;
12
+ this.contentIndex = 0;
13
+ this.outputTokens = 0;
14
+ // State tracking
15
+ this.textStarted = false;
16
+ this.currentTextContent = '';
17
+ this.toolCallsInProgress = new Map();
18
+ this.toolCallsSent = new Set();
19
+ this.id = id;
20
+ this.model = model;
21
+ this.estimatedInputTokens = estimatedInputTokens;
22
+ this.inputTokens = estimatedInputTokens;
23
+ }
24
+ /**
25
+ * Process an OpenAI streaming chunk and return Anthropic events.
26
+ */
27
+ process(chunk) {
28
+ const events = [];
29
+ // First chunk: emit message_start
30
+ if (this.firstChunk) {
31
+ this.firstChunk = false;
32
+ events.push(this.createMessageStartEvent());
33
+ }
34
+ const choice = chunk.choices[0];
35
+ if (!choice) {
36
+ return events;
37
+ }
38
+ const delta = choice.delta;
39
+ // Handle text content
40
+ if (delta.content) {
41
+ if (!this.textStarted) {
42
+ this.textStarted = true;
43
+ events.push(this.createContentBlockStartEvent('text'));
44
+ }
45
+ this.currentTextContent += delta.content;
46
+ events.push(this.createTextDeltaEvent(delta.content));
47
+ }
48
+ // Handle tool calls
49
+ if (delta.tool_calls) {
50
+ for (const toolCallDelta of delta.tool_calls) {
51
+ const index = toolCallDelta.index;
52
+ const tcEvents = this.processToolCallDelta(toolCallDelta);
53
+ events.push(...tcEvents);
54
+ }
55
+ }
56
+ // Handle completion
57
+ if (choice.finish_reason) {
58
+ // Close any open content blocks
59
+ if (this.textStarted) {
60
+ events.push(this.createContentBlockStopEvent(this.contentIndex));
61
+ this.contentIndex++;
62
+ }
63
+ // Close any open tool calls
64
+ for (const [index, state] of this.toolCallsInProgress.entries()) {
65
+ if (state.started && !state.completed) {
66
+ events.push(this.createContentBlockStopEvent(state.blockIndex));
67
+ state.completed = true;
68
+ }
69
+ }
70
+ // Emit message_delta with stop reason
71
+ const stopReason = this.mapFinishReason(choice.finish_reason);
72
+ events.push(this.createMessageDeltaEvent(stopReason));
73
+ // Emit message_stop
74
+ events.push(this.createMessageStopEvent());
75
+ }
76
+ return events;
77
+ }
78
+ processToolCallDelta(toolCallDelta) {
79
+ const events = [];
80
+ const index = toolCallDelta.index;
81
+ // Get or create tool call state
82
+ let state = this.toolCallsInProgress.get(index);
83
+ if (!state) {
84
+ state = {
85
+ id: '',
86
+ name: '',
87
+ arguments: '',
88
+ started: false,
89
+ completed: false,
90
+ blockIndex: -1,
91
+ };
92
+ this.toolCallsInProgress.set(index, state);
93
+ }
94
+ // Accumulate tool call data
95
+ if (toolCallDelta.id) {
96
+ state.id = toolCallDelta.id;
97
+ }
98
+ if (toolCallDelta.function?.name) {
99
+ state.name = toolCallDelta.function.name;
100
+ }
101
+ if (toolCallDelta.function?.arguments) {
102
+ state.arguments += toolCallDelta.function.arguments;
103
+ }
104
+ // Start tool call block when we have id and name
105
+ if (!state.started && state.id && state.name) {
106
+ // Close text block if open
107
+ if (this.textStarted) {
108
+ events.push(this.createContentBlockStopEvent(this.contentIndex));
109
+ this.contentIndex++;
110
+ this.textStarted = false;
111
+ }
112
+ state.started = true;
113
+ state.blockIndex = this.contentIndex;
114
+ events.push(this.createToolUseStartEvent(state.id, state.name));
115
+ }
116
+ // Emit input_json_delta if we have arguments
117
+ if (state.started && toolCallDelta.function?.arguments) {
118
+ events.push(this.createInputJsonDeltaEvent(state.blockIndex, toolCallDelta.function.arguments));
119
+ }
120
+ return events;
121
+ }
122
+ // ============================================================================
123
+ // Event Creation Methods
124
+ // ============================================================================
125
+ createMessageStartEvent() {
126
+ return {
127
+ type: 'message_start',
128
+ message: {
129
+ id: this.id,
130
+ type: 'message',
131
+ role: 'assistant',
132
+ model: this.model,
133
+ content: [],
134
+ usage: {
135
+ input_tokens: this.inputTokens,
136
+ output_tokens: 0,
137
+ },
138
+ },
139
+ };
140
+ }
141
+ createContentBlockStartEvent(type) {
142
+ return {
143
+ type: 'content_block_start',
144
+ index: this.contentIndex,
145
+ content_block: {
146
+ type: 'text',
147
+ text: '',
148
+ },
149
+ };
150
+ }
151
+ createToolUseStartEvent(id, name) {
152
+ return {
153
+ type: 'content_block_start',
154
+ index: this.contentIndex,
155
+ content_block: {
156
+ type: 'tool_use',
157
+ id,
158
+ name,
159
+ input: {},
160
+ },
161
+ };
162
+ }
163
+ createTextDeltaEvent(text) {
164
+ return {
165
+ type: 'content_block_delta',
166
+ index: this.contentIndex,
167
+ delta: {
168
+ type: 'text_delta',
169
+ text,
170
+ },
171
+ };
172
+ }
173
+ createInputJsonDeltaEvent(index, partialJson) {
174
+ return {
175
+ type: 'content_block_delta',
176
+ index,
177
+ delta: {
178
+ type: 'input_json_delta',
179
+ partial_json: partialJson,
180
+ },
181
+ };
182
+ }
183
+ createContentBlockStopEvent(index) {
184
+ return {
185
+ type: 'content_block_stop',
186
+ index,
187
+ };
188
+ }
189
+ createMessageDeltaEvent(stopReason) {
190
+ return {
191
+ type: 'message_delta',
192
+ delta: {
193
+ stop_reason: stopReason,
194
+ },
195
+ usage: {
196
+ input_tokens: this.inputTokens,
197
+ output_tokens: this.outputTokens,
198
+ },
199
+ };
200
+ }
201
+ createMessageStopEvent() {
202
+ return {
203
+ type: 'message_stop',
204
+ };
205
+ }
206
+ // ============================================================================
207
+ // Helper Methods
208
+ // ============================================================================
209
+ mapFinishReason(finishReason) {
210
+ const hasToolCalls = this.toolCallsInProgress.size > 0;
211
+ if (hasToolCalls) {
212
+ return 'tool_use';
213
+ }
214
+ switch (finishReason) {
215
+ case 'stop':
216
+ return 'end_turn';
217
+ case 'length':
218
+ return 'max_tokens';
219
+ case 'tool_calls':
220
+ return 'tool_use';
221
+ default:
222
+ return 'end_turn';
223
+ }
224
+ }
225
+ }
226
+ exports.AnthropicStreamConverter = AnthropicStreamConverter;
227
+ //# sourceMappingURL=anthropic-stream-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-stream-converter.js","sourceRoot":"","sources":["../../src/lib/anthropic-stream-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { AvailableModel } from '../types/integration-config';
2
+ /**
3
+ * Check if Claude Code CLI is installed
4
+ */
5
+ export declare function isClaudeCodeInstalled(): Promise<boolean>;
6
+ /**
7
+ * Check if URL is a local router (localhost or 127.0.0.1)
8
+ */
9
+ export declare function isLocalRouter(url: string): boolean;
10
+ /**
11
+ * Check if local router is running
12
+ */
13
+ export declare function isLocalRouterRunning(): Promise<boolean>;
14
+ /**
15
+ * Check if router is reachable (health check)
16
+ */
17
+ export declare function isRouterReachable(url: string): Promise<boolean>;
18
+ /**
19
+ * Get available models from router
20
+ */
21
+ export declare function getAvailableModels(routerUrl: string): Promise<AvailableModel[]>;
22
+ /**
23
+ * Validate model exists in available models
24
+ */
25
+ export declare function validateModel(modelName: string, availableModels: AvailableModel[]): boolean;
26
+ //# sourceMappingURL=integration-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-checker.d.ts","sourceRoot":"","sources":["../../src/lib/integration-checker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAgBrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO,CAE3F"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isClaudeCodeInstalled = isClaudeCodeInstalled;
4
+ exports.isLocalRouter = isLocalRouter;
5
+ exports.isLocalRouterRunning = isLocalRouterRunning;
6
+ exports.isRouterReachable = isRouterReachable;
7
+ exports.getAvailableModels = getAvailableModels;
8
+ exports.validateModel = validateModel;
9
+ const process_utils_1 = require("../utils/process-utils");
10
+ const router_manager_1 = require("./router-manager");
11
+ /**
12
+ * Check if Claude Code CLI is installed
13
+ */
14
+ async function isClaudeCodeInstalled() {
15
+ try {
16
+ await (0, process_utils_1.execAsync)('which claude');
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ /**
24
+ * Check if URL is a local router (localhost or 127.0.0.1)
25
+ */
26
+ function isLocalRouter(url) {
27
+ const urlObj = new URL(url);
28
+ return urlObj.hostname === 'localhost' || urlObj.hostname === '127.0.0.1';
29
+ }
30
+ /**
31
+ * Check if local router is running
32
+ */
33
+ async function isLocalRouterRunning() {
34
+ const status = await router_manager_1.routerManager.getStatus();
35
+ return status?.status.isRunning ?? false;
36
+ }
37
+ /**
38
+ * Check if router is reachable (health check)
39
+ */
40
+ async function isRouterReachable(url) {
41
+ try {
42
+ const response = await fetch(`${url}/health`, {
43
+ method: 'GET',
44
+ signal: AbortSignal.timeout(5000),
45
+ });
46
+ return response.ok;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Get available models from router
54
+ */
55
+ async function getAvailableModels(routerUrl) {
56
+ try {
57
+ const response = await fetch(`${routerUrl}/v1/models`, {
58
+ method: 'GET',
59
+ signal: AbortSignal.timeout(5000),
60
+ });
61
+ if (!response.ok) {
62
+ throw new Error(`Failed to fetch models: ${response.statusText}`);
63
+ }
64
+ const data = await response.json();
65
+ return data.data || [];
66
+ }
67
+ catch (error) {
68
+ throw new Error(`Cannot reach router at ${routerUrl}: ${error.message}`);
69
+ }
70
+ }
71
+ /**
72
+ * Validate model exists in available models
73
+ */
74
+ function validateModel(modelName, availableModels) {
75
+ return availableModels.some(m => m.id === modelName);
76
+ }
77
+ //# sourceMappingURL=integration-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-checker.js","sourceRoot":"","sources":["../../src/lib/integration-checker.ts"],"names":[],"mappings":";;AAOA,sDAOC;AAKD,sCAGC;AAKD,oDAGC;AAKD,8CAUC;AAKD,gDAgBC;AAKD,sCAEC;AAzED,0DAAmD;AACnD,qDAAiD;AAGjD;;GAEG;AACI,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,IAAA,yBAAS,EAAC,cAAc,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC5E,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,8BAAa,CAAC,SAAS,EAAE,CAAC;IAC/C,OAAO,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;AAC3C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,SAAS,EAAE;YAC5C,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,YAAY,EAAE;YACrD,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiC,CAAC;QAClE,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,SAAiB,EAAE,eAAiC;IAChF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AACvD,CAAC"}