vite-plugin-opencode-assistant 1.0.44 → 1.0.48
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.
- package/es/client/App.vue.js +27 -4
- package/es/client/components/ChromeWarmupError-sfc.css +1 -1
- package/es/client/components/ChromeWarmupError.vue.d.ts +10 -2
- package/es/client/components/ChromeWarmupError.vue.js +197 -56
- package/es/client/styles.css +1 -1
- package/es/core/api.d.ts +8 -10
- package/es/core/api.js +70 -230
- package/es/core/service.d.ts +6 -1
- package/es/core/service.js +11 -2
- package/es/endpoints/types.d.ts +6 -2
- package/es/endpoints/warmup.js +58 -11
- package/es/index.js +2 -1
- package/lib/client/App.vue.js +27 -4
- package/lib/client/components/ChromeWarmupError-sfc.css +1 -1
- package/lib/client/components/ChromeWarmupError.vue.d.ts +10 -2
- package/lib/client/components/ChromeWarmupError.vue.js +216 -75
- package/lib/client/styles.css +1 -1
- package/lib/client.js +3552 -3394
- package/lib/core/api.d.ts +8 -10
- package/lib/core/api.js +70 -230
- package/lib/core/service.d.ts +6 -1
- package/lib/core/service.js +11 -2
- package/lib/endpoints/types.d.ts +6 -2
- package/lib/endpoints/warmup.js +58 -11
- package/lib/index.js +2 -1
- package/lib/style.css +1 -1
- package/package.json +4 -4
package/lib/core/api.d.ts
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import type { SessionInfo } from "@vite-plugin-opencode-assistant/shared";
|
|
1
|
+
import type { SessionInfo, ModelInfo } from "@vite-plugin-opencode-assistant/shared";
|
|
2
2
|
import { ChromeMcpWarmupError } from "@vite-plugin-opencode-assistant/shared";
|
|
3
3
|
export declare class OpenCodeAPI {
|
|
4
4
|
private hostname;
|
|
5
5
|
private getPort;
|
|
6
6
|
private getProxyPort;
|
|
7
7
|
private warmupChromeMcpConfig;
|
|
8
|
-
private failedFreeModels;
|
|
9
8
|
constructor(hostname: string, getPort: () => number, getProxyPort: () => number, warmupChromeMcpConfig?: boolean);
|
|
10
|
-
markModelAsFailed(providerID: string, modelID: string): void;
|
|
11
|
-
clearFailedModels(): void;
|
|
12
9
|
private createHttpRequest;
|
|
13
10
|
getSessions(projectDir: string, retries?: number): Promise<SessionInfo[]>;
|
|
14
11
|
createSession(projectDir: string, retries?: number, title?: string): Promise<SessionInfo>;
|
|
15
|
-
|
|
16
|
-
providerID: string;
|
|
17
|
-
modelID: string;
|
|
18
|
-
} | null>;
|
|
12
|
+
getAvailableModels(): Promise<ModelInfo[]>;
|
|
19
13
|
deleteSession(sessionId: string, retries?: number): Promise<void>;
|
|
20
14
|
getToolIds(retries?: number): Promise<string[]>;
|
|
15
|
+
private executeWarmupChromeMcp;
|
|
21
16
|
warmupChromeMcp(projectDir: string, viteOrigin?: string): Promise<void>;
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
retryWarmupChromeMcp(projectDir: string, viteOrigin?: string, selectedModel?: {
|
|
18
|
+
providerID: string;
|
|
19
|
+
modelID: string;
|
|
20
|
+
}): Promise<{
|
|
24
21
|
success: boolean;
|
|
25
22
|
error?: ChromeMcpWarmupError;
|
|
26
23
|
}>;
|
|
24
|
+
getOrCreateSession(projectDir: string): Promise<string>;
|
|
27
25
|
}
|
package/lib/core/api.js
CHANGED
|
@@ -77,21 +77,6 @@ class OpenCodeAPI {
|
|
|
77
77
|
__publicField(this, "getPort", getPort);
|
|
78
78
|
__publicField(this, "getProxyPort", getProxyPort);
|
|
79
79
|
__publicField(this, "warmupChromeMcpConfig", warmupChromeMcpConfig);
|
|
80
|
-
__publicField(this, "failedFreeModels", /* @__PURE__ */ new Set());
|
|
81
|
-
}
|
|
82
|
-
markModelAsFailed(providerID, modelID) {
|
|
83
|
-
const key = `${providerID}:${modelID}`;
|
|
84
|
-
this.failedFreeModels.add(key);
|
|
85
|
-
log.debug("Marked model as failed", {
|
|
86
|
-
providerID,
|
|
87
|
-
modelID,
|
|
88
|
-
key,
|
|
89
|
-
failedCount: this.failedFreeModels.size
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
clearFailedModels() {
|
|
93
|
-
this.failedFreeModels.clear();
|
|
94
|
-
log.debug("Cleared failed models cache");
|
|
95
80
|
}
|
|
96
81
|
createHttpRequest(options, body, timeout) {
|
|
97
82
|
const timer = new import_shared.PerformanceTimer("HTTP Request", {
|
|
@@ -205,7 +190,7 @@ class OpenCodeAPI {
|
|
|
205
190
|
throw lastError;
|
|
206
191
|
});
|
|
207
192
|
}
|
|
208
|
-
|
|
193
|
+
getAvailableModels() {
|
|
209
194
|
return __async(this, null, function* () {
|
|
210
195
|
var _a, _b;
|
|
211
196
|
try {
|
|
@@ -218,7 +203,6 @@ class OpenCodeAPI {
|
|
|
218
203
|
const connectedProviders = new Set(response.connected);
|
|
219
204
|
const allModels = [];
|
|
220
205
|
for (const provider of response.all) {
|
|
221
|
-
if (provider.id === "opencode") continue;
|
|
222
206
|
if (!connectedProviders.has(provider.id)) {
|
|
223
207
|
log.debug("Skipping not connected provider", { providerID: provider.id });
|
|
224
208
|
continue;
|
|
@@ -234,34 +218,14 @@ class OpenCodeAPI {
|
|
|
234
218
|
}
|
|
235
219
|
}
|
|
236
220
|
allModels.sort((a, b) => a.inputCost - b.inputCost);
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
);
|
|
240
|
-
if (!availableModel) {
|
|
241
|
-
log.debug("All models have failed", {
|
|
242
|
-
totalModels: allModels.length,
|
|
243
|
-
failedModels: this.failedFreeModels.size,
|
|
244
|
-
connectedProviders: response.connected
|
|
245
|
-
});
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
log.debug("Found cheapest available model for warmup", {
|
|
249
|
-
providerID: availableModel.providerID,
|
|
250
|
-
modelID: availableModel.modelID,
|
|
251
|
-
name: availableModel.name,
|
|
252
|
-
inputCost: availableModel.inputCost,
|
|
253
|
-
releaseDate: availableModel.releaseDate,
|
|
254
|
-
totalModels: allModels.length,
|
|
255
|
-
failedModels: this.failedFreeModels.size,
|
|
221
|
+
log.debug("Found available models for warmup", {
|
|
222
|
+
count: allModels.length,
|
|
256
223
|
connectedProviders: response.connected
|
|
257
224
|
});
|
|
258
|
-
return
|
|
259
|
-
providerID: availableModel.providerID,
|
|
260
|
-
modelID: availableModel.modelID
|
|
261
|
-
};
|
|
225
|
+
return allModels;
|
|
262
226
|
} catch (error) {
|
|
263
|
-
log.warn("Failed to get
|
|
264
|
-
return
|
|
227
|
+
log.warn("Failed to get available models", { error });
|
|
228
|
+
return [];
|
|
265
229
|
}
|
|
266
230
|
});
|
|
267
231
|
}
|
|
@@ -335,12 +299,10 @@ class OpenCodeAPI {
|
|
|
335
299
|
throw lastError;
|
|
336
300
|
});
|
|
337
301
|
}
|
|
338
|
-
|
|
302
|
+
executeWarmupChromeMcp(projectDir, operation, viteOrigin, selectedModel) {
|
|
339
303
|
return __async(this, null, function* () {
|
|
340
|
-
|
|
341
|
-
const timer = log.timer("warmupChromeMcp", { viteOrigin });
|
|
304
|
+
const timer = log.timer(`${operation}WarmupChromeMcp`, { viteOrigin, operation });
|
|
342
305
|
let warmupSessionId = null;
|
|
343
|
-
let freeModel = null;
|
|
344
306
|
const chromeAvailable = yield (0, import_shared.checkChromeDevToolsAvailable)();
|
|
345
307
|
if (!chromeAvailable) {
|
|
346
308
|
const error = new import_shared.ChromeMcpWarmupError(
|
|
@@ -348,14 +310,14 @@ class OpenCodeAPI {
|
|
|
348
310
|
"Chrome DevTools Protocol is not available",
|
|
349
311
|
"Chrome remote debugging is not enabled or not running on port 9222. Please enable Chrome remote debugging first."
|
|
350
312
|
);
|
|
351
|
-
log.warn(
|
|
313
|
+
log.warn(`Chrome DevTools not available for ${operation}`, {
|
|
352
314
|
port: import_shared.CHROME_DEVTOOLS_PORT,
|
|
353
315
|
hint: "Enable Chrome remote debugging at chrome://inspect/#remote-debugging"
|
|
354
316
|
});
|
|
355
|
-
timer.end(
|
|
356
|
-
|
|
317
|
+
timer.end(`Chrome DevTools not available for ${operation}`);
|
|
318
|
+
return { success: false, error };
|
|
357
319
|
}
|
|
358
|
-
log.debug(
|
|
320
|
+
log.debug(`Chrome DevTools is available, proceeding with ${operation} warmup`);
|
|
359
321
|
try {
|
|
360
322
|
const warmupSession = yield this.createSession(
|
|
361
323
|
projectDir,
|
|
@@ -363,14 +325,26 @@ class OpenCodeAPI {
|
|
|
363
325
|
"__chrome_mcp_warmup__"
|
|
364
326
|
);
|
|
365
327
|
warmupSessionId = warmupSession.id;
|
|
366
|
-
|
|
367
|
-
if (
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
328
|
+
let modelToUse = selectedModel;
|
|
329
|
+
if (!modelToUse) {
|
|
330
|
+
const models = yield this.getAvailableModels();
|
|
331
|
+
if (models.length > 0) {
|
|
332
|
+
modelToUse = {
|
|
333
|
+
providerID: models[0].providerID,
|
|
334
|
+
modelID: models[0].modelID
|
|
335
|
+
};
|
|
336
|
+
log.debug(`Using cheapest model for ${operation} warmup`, {
|
|
337
|
+
providerID: modelToUse.providerID,
|
|
338
|
+
modelID: modelToUse.modelID
|
|
339
|
+
});
|
|
340
|
+
} else {
|
|
341
|
+
log.debug(`No model available for ${operation}, using default model`);
|
|
342
|
+
}
|
|
372
343
|
} else {
|
|
373
|
-
log.debug(
|
|
344
|
+
log.debug(`Using selected model for ${operation} warmup`, {
|
|
345
|
+
providerID: modelToUse.providerID,
|
|
346
|
+
modelID: modelToUse.modelID
|
|
347
|
+
});
|
|
374
348
|
}
|
|
375
349
|
const WARMUP_TIMEOUT = 6e4;
|
|
376
350
|
const data = yield this.createHttpRequest(
|
|
@@ -388,10 +362,10 @@ class OpenCodeAPI {
|
|
|
388
362
|
text: "Test if the chrome-devtools_list_pages tool is available. If available, reply with: ready. If not available, explain why."
|
|
389
363
|
}
|
|
390
364
|
]
|
|
391
|
-
},
|
|
365
|
+
}, modelToUse && {
|
|
392
366
|
model: {
|
|
393
|
-
providerID:
|
|
394
|
-
modelID:
|
|
367
|
+
providerID: modelToUse.providerID,
|
|
368
|
+
modelID: modelToUse.modelID
|
|
395
369
|
}
|
|
396
370
|
})),
|
|
397
371
|
WARMUP_TIMEOUT
|
|
@@ -412,56 +386,43 @@ class OpenCodeAPI {
|
|
|
412
386
|
`AI responded with: ${responseText.substring(0, 200)}`
|
|
413
387
|
);
|
|
414
388
|
}
|
|
415
|
-
timer.end(
|
|
389
|
+
timer.end(`Chrome MCP ${operation} warmed up successfully`);
|
|
390
|
+
return { success: true };
|
|
416
391
|
} catch (e) {
|
|
417
392
|
if (e instanceof import_shared.ChromeMcpWarmupError) {
|
|
418
393
|
if (e.type === import_shared.ChromeMcpWarmupErrorType.SESSION_ERROR) {
|
|
419
394
|
timer.end("Session creation failed");
|
|
420
395
|
}
|
|
421
|
-
log.warn(`Chrome MCP warmup failed: ${e.type}`,
|
|
396
|
+
log.warn(`Chrome MCP ${operation} warmup failed: ${e.type}`, {
|
|
422
397
|
message: e.message,
|
|
423
398
|
details: e.details
|
|
424
|
-
}, freeModel && {
|
|
425
|
-
model: `${freeModel.providerID}/${freeModel.modelID}`
|
|
426
|
-
}));
|
|
427
|
-
timer.end(`Chrome MCP warmup failed: ${e.type}`);
|
|
428
|
-
throw e;
|
|
429
|
-
}
|
|
430
|
-
if (freeModel) {
|
|
431
|
-
this.markModelAsFailed(freeModel.providerID, freeModel.modelID);
|
|
432
|
-
log.debug("Marked model as failed due to warmup error", {
|
|
433
|
-
providerID: freeModel.providerID,
|
|
434
|
-
modelID: freeModel.modelID,
|
|
435
|
-
error: e instanceof Error ? e.message : String(e)
|
|
436
399
|
});
|
|
400
|
+
timer.end(`Chrome MCP ${operation} warmup failed: ${e.type}`);
|
|
401
|
+
return { success: false, error: e };
|
|
437
402
|
}
|
|
438
403
|
const errorMessage = e instanceof Error ? e.message : String(e);
|
|
439
404
|
if (errorMessage.includes("timeout") || errorMessage.includes("Timeout")) {
|
|
440
405
|
const error2 = new import_shared.ChromeMcpWarmupError(
|
|
441
406
|
import_shared.ChromeMcpWarmupErrorType.AI_TIMEOUT,
|
|
442
407
|
"AI response timeout",
|
|
443
|
-
"AI did not respond within
|
|
408
|
+
"AI did not respond within 60 seconds. Please check if the OpenCode AI model is properly configured and available."
|
|
444
409
|
);
|
|
445
|
-
log.warn(
|
|
410
|
+
log.warn(`Chrome MCP ${operation} warmup timeout`, {
|
|
446
411
|
error: errorMessage
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
timer.end("Chrome MCP warmup timeout");
|
|
451
|
-
throw error2;
|
|
412
|
+
});
|
|
413
|
+
timer.end(`Chrome MCP ${operation} warmup timeout`);
|
|
414
|
+
return { success: false, error: error2 };
|
|
452
415
|
}
|
|
453
416
|
const error = new import_shared.ChromeMcpWarmupError(
|
|
454
417
|
import_shared.ChromeMcpWarmupErrorType.UNKNOWN,
|
|
455
|
-
|
|
418
|
+
`Unknown error during Chrome MCP ${operation} warmup`,
|
|
456
419
|
errorMessage
|
|
457
420
|
);
|
|
458
|
-
log.warn(
|
|
421
|
+
log.warn(`Chrome MCP ${operation} warmup failed with unknown error`, {
|
|
459
422
|
error: errorMessage
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
timer.end("Chrome MCP warmup failed");
|
|
464
|
-
throw error;
|
|
423
|
+
});
|
|
424
|
+
timer.end(`Chrome MCP ${operation} warmup failed`);
|
|
425
|
+
return { success: false, error };
|
|
465
426
|
} finally {
|
|
466
427
|
if (warmupSessionId) {
|
|
467
428
|
try {
|
|
@@ -476,6 +437,27 @@ class OpenCodeAPI {
|
|
|
476
437
|
}
|
|
477
438
|
});
|
|
478
439
|
}
|
|
440
|
+
warmupChromeMcp(projectDir, viteOrigin) {
|
|
441
|
+
return __async(this, null, function* () {
|
|
442
|
+
if (!this.warmupChromeMcpConfig) return;
|
|
443
|
+
const models = yield this.getAvailableModels();
|
|
444
|
+
const cheapestModel = models[0];
|
|
445
|
+
const result = yield this.executeWarmupChromeMcp(
|
|
446
|
+
projectDir,
|
|
447
|
+
"warmup",
|
|
448
|
+
viteOrigin,
|
|
449
|
+
cheapestModel ? { providerID: cheapestModel.providerID, modelID: cheapestModel.modelID } : void 0
|
|
450
|
+
);
|
|
451
|
+
if (!result.success) {
|
|
452
|
+
throw result.error;
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
retryWarmupChromeMcp(projectDir, viteOrigin, selectedModel) {
|
|
457
|
+
return __async(this, null, function* () {
|
|
458
|
+
return this.executeWarmupChromeMcp(projectDir, "retry", viteOrigin, selectedModel);
|
|
459
|
+
});
|
|
460
|
+
}
|
|
479
461
|
getOrCreateSession(projectDir) {
|
|
480
462
|
return __async(this, null, function* () {
|
|
481
463
|
const timer = log.timer("getOrCreateSession", { projectDir });
|
|
@@ -497,148 +479,6 @@ class OpenCodeAPI {
|
|
|
497
479
|
return url;
|
|
498
480
|
});
|
|
499
481
|
}
|
|
500
|
-
retryWarmupChromeMcp(projectDir, viteOrigin) {
|
|
501
|
-
return __async(this, null, function* () {
|
|
502
|
-
const timer = log.timer("retryWarmupChromeMcp", { viteOrigin });
|
|
503
|
-
let warmupSessionId = null;
|
|
504
|
-
let freeModel = null;
|
|
505
|
-
const chromeAvailable = yield (0, import_shared.checkChromeDevToolsAvailable)();
|
|
506
|
-
if (!chromeAvailable) {
|
|
507
|
-
const error = new import_shared.ChromeMcpWarmupError(
|
|
508
|
-
import_shared.ChromeMcpWarmupErrorType.CHROME_NOT_CONNECTED,
|
|
509
|
-
"Chrome DevTools Protocol is not available",
|
|
510
|
-
"Chrome remote debugging is not enabled or not running on port 9222. Please enable Chrome remote debugging first."
|
|
511
|
-
);
|
|
512
|
-
log.warn("Chrome DevTools not available for retry", {
|
|
513
|
-
port: import_shared.CHROME_DEVTOOLS_PORT,
|
|
514
|
-
hint: "Enable Chrome remote debugging at chrome://inspect/#remote-debugging"
|
|
515
|
-
});
|
|
516
|
-
timer.end("Chrome DevTools not available for retry");
|
|
517
|
-
return { success: false, error };
|
|
518
|
-
}
|
|
519
|
-
log.debug("Chrome DevTools is available, proceeding with retry warmup");
|
|
520
|
-
try {
|
|
521
|
-
const warmupSession = yield this.createSession(
|
|
522
|
-
projectDir,
|
|
523
|
-
import_shared.DEFAULT_RETRIES,
|
|
524
|
-
"__chrome_mcp_warmup__"
|
|
525
|
-
);
|
|
526
|
-
warmupSessionId = warmupSession.id;
|
|
527
|
-
freeModel = yield this.getCheapestModel();
|
|
528
|
-
if (freeModel) {
|
|
529
|
-
log.debug("Using cheapest model for retry warmup", {
|
|
530
|
-
providerID: freeModel.providerID,
|
|
531
|
-
modelID: freeModel.modelID
|
|
532
|
-
});
|
|
533
|
-
} else {
|
|
534
|
-
log.debug("No model available for retry, using default model");
|
|
535
|
-
}
|
|
536
|
-
const WARMUP_TIMEOUT = 6e4;
|
|
537
|
-
const data = yield this.createHttpRequest(
|
|
538
|
-
{
|
|
539
|
-
hostname: this.hostname,
|
|
540
|
-
port: this.getPort(),
|
|
541
|
-
path: `/session/${warmupSessionId}/message`,
|
|
542
|
-
method: "POST",
|
|
543
|
-
headers: { "Content-Type": "application/json" }
|
|
544
|
-
},
|
|
545
|
-
JSON.stringify(__spreadValues({
|
|
546
|
-
parts: [
|
|
547
|
-
{
|
|
548
|
-
type: "text",
|
|
549
|
-
text: "Test if the chrome-devtools_list_pages tool is available. If available, reply with: ready. If not available, explain why."
|
|
550
|
-
}
|
|
551
|
-
]
|
|
552
|
-
}, freeModel && {
|
|
553
|
-
model: {
|
|
554
|
-
providerID: freeModel.providerID,
|
|
555
|
-
modelID: freeModel.modelID
|
|
556
|
-
}
|
|
557
|
-
})),
|
|
558
|
-
WARMUP_TIMEOUT
|
|
559
|
-
);
|
|
560
|
-
log.debug("Chrome MCP warmup response:", { data });
|
|
561
|
-
const responseText = (0, import_shared.extractTextFromResponse)(data);
|
|
562
|
-
if (!responseText) {
|
|
563
|
-
throw new import_shared.ChromeMcpWarmupError(
|
|
564
|
-
import_shared.ChromeMcpWarmupErrorType.AI_RESPONSE_ERROR,
|
|
565
|
-
"AI did not respond to the warmup request",
|
|
566
|
-
"Empty response from AI"
|
|
567
|
-
);
|
|
568
|
-
}
|
|
569
|
-
const lowerResponse = responseText.toLowerCase();
|
|
570
|
-
if (!lowerResponse.includes("ready")) {
|
|
571
|
-
throw new import_shared.ChromeMcpWarmupError(
|
|
572
|
-
import_shared.ChromeMcpWarmupErrorType.AI_RESPONSE_ERROR,
|
|
573
|
-
"AI response does not indicate success",
|
|
574
|
-
`AI responded with: ${responseText.substring(0, 200)}`
|
|
575
|
-
);
|
|
576
|
-
}
|
|
577
|
-
timer.end("Chrome MCP warmed up successfully");
|
|
578
|
-
return { success: true };
|
|
579
|
-
} catch (e) {
|
|
580
|
-
if (e instanceof import_shared.ChromeMcpWarmupError) {
|
|
581
|
-
if (e.type === import_shared.ChromeMcpWarmupErrorType.SESSION_ERROR) {
|
|
582
|
-
timer.end("Session creation failed");
|
|
583
|
-
}
|
|
584
|
-
log.warn(`Chrome MCP warmup retry failed: ${e.type}`, __spreadValues({
|
|
585
|
-
message: e.message,
|
|
586
|
-
details: e.details
|
|
587
|
-
}, freeModel && {
|
|
588
|
-
model: `${freeModel.providerID}/${freeModel.modelID}`
|
|
589
|
-
}));
|
|
590
|
-
timer.end(`Chrome MCP warmup retry failed: ${e.type}`);
|
|
591
|
-
return { success: false, error: e };
|
|
592
|
-
}
|
|
593
|
-
if (freeModel) {
|
|
594
|
-
this.markModelAsFailed(freeModel.providerID, freeModel.modelID);
|
|
595
|
-
log.debug("Marked model as failed due to retry warmup error", {
|
|
596
|
-
providerID: freeModel.providerID,
|
|
597
|
-
modelID: freeModel.modelID,
|
|
598
|
-
error: e instanceof Error ? e.message : String(e)
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
const errorMessage = e instanceof Error ? e.message : String(e);
|
|
602
|
-
if (errorMessage.includes("timeout") || errorMessage.includes("Timeout")) {
|
|
603
|
-
const error2 = new import_shared.ChromeMcpWarmupError(
|
|
604
|
-
import_shared.ChromeMcpWarmupErrorType.AI_TIMEOUT,
|
|
605
|
-
"AI response timeout",
|
|
606
|
-
"AI did not respond within 60 seconds. Please check if the OpenCode AI model is properly configured and available."
|
|
607
|
-
);
|
|
608
|
-
log.warn("Chrome MCP warmup retry timeout", __spreadValues({
|
|
609
|
-
error: errorMessage
|
|
610
|
-
}, freeModel && {
|
|
611
|
-
model: `${freeModel.providerID}/${freeModel.modelID}`
|
|
612
|
-
}));
|
|
613
|
-
timer.end("Chrome MCP warmup retry timeout");
|
|
614
|
-
return { success: false, error: error2 };
|
|
615
|
-
}
|
|
616
|
-
const error = new import_shared.ChromeMcpWarmupError(
|
|
617
|
-
import_shared.ChromeMcpWarmupErrorType.UNKNOWN,
|
|
618
|
-
"Unknown error during Chrome MCP warmup retry",
|
|
619
|
-
errorMessage
|
|
620
|
-
);
|
|
621
|
-
log.warn("Chrome MCP warmup retry failed with unknown error", __spreadValues({
|
|
622
|
-
error: errorMessage
|
|
623
|
-
}, freeModel && {
|
|
624
|
-
model: `${freeModel.providerID}/${freeModel.modelID}`
|
|
625
|
-
}));
|
|
626
|
-
timer.end("Chrome MCP warmup retry failed");
|
|
627
|
-
return { success: false, error };
|
|
628
|
-
} finally {
|
|
629
|
-
if (warmupSessionId) {
|
|
630
|
-
try {
|
|
631
|
-
yield this.deleteSession(warmupSessionId, 5);
|
|
632
|
-
} catch (e) {
|
|
633
|
-
log.warn("Failed to delete warmup session after retries", {
|
|
634
|
-
error: e,
|
|
635
|
-
warmupSessionId
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
482
|
}
|
|
643
483
|
// Annotate the CommonJS export names for ESM import in node:
|
|
644
484
|
0 && (module.exports = {
|
package/lib/core/service.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ResultPromise } from "execa";
|
|
2
2
|
import type http from "http";
|
|
3
|
+
import type { ModelInfo } from "@vite-plugin-opencode-assistant/shared";
|
|
3
4
|
import type { OpenCodeOptions, ServiceStartupTask } from "@vite-plugin-opencode-assistant/shared";
|
|
4
5
|
import { ChromeMcpWarmupErrorType } from "@vite-plugin-opencode-assistant/shared";
|
|
5
6
|
import type { OpenCodeAPI } from "./api.js";
|
|
@@ -26,7 +27,11 @@ export declare class OpenCodeService {
|
|
|
26
27
|
constructor(config: Required<OpenCodeOptions>, api: OpenCodeAPI, sseClients: Set<http.ServerResponse>, onPortAllocated: (port: number) => void, onProxyPortAllocated: (port: number) => void);
|
|
27
28
|
private sendTaskUpdate;
|
|
28
29
|
start(corsOrigins?: string[], contextApiUrl?: string, logsApiUrl?: string, viteOrigin?: string): Promise<void>;
|
|
29
|
-
|
|
30
|
+
getAvailableModels(): Promise<ModelInfo[]>;
|
|
31
|
+
retryWarmupChromeMcp(viteOrigin?: string, selectedModel?: {
|
|
32
|
+
providerID: string;
|
|
33
|
+
modelID: string;
|
|
34
|
+
}): Promise<{
|
|
30
35
|
success: boolean;
|
|
31
36
|
errorType?: string;
|
|
32
37
|
errorMessage?: string;
|
package/lib/core/service.js
CHANGED
|
@@ -270,9 +270,18 @@ Please install OpenCode first:
|
|
|
270
270
|
return this.startPromise;
|
|
271
271
|
});
|
|
272
272
|
}
|
|
273
|
-
|
|
273
|
+
getAvailableModels() {
|
|
274
274
|
return __async(this, null, function* () {
|
|
275
|
-
|
|
275
|
+
return this.api.getAvailableModels();
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
retryWarmupChromeMcp(viteOrigin, selectedModel) {
|
|
279
|
+
return __async(this, null, function* () {
|
|
280
|
+
const result = yield this.api.retryWarmupChromeMcp(
|
|
281
|
+
this.workspaceRoot,
|
|
282
|
+
viteOrigin,
|
|
283
|
+
selectedModel
|
|
284
|
+
);
|
|
276
285
|
if (result.success) {
|
|
277
286
|
this.chromeMcpWarmupFailed = false;
|
|
278
287
|
this.sendTaskUpdate("ready");
|
package/lib/endpoints/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PageContext, SessionInfo, ServiceStartupTask } from "@vite-plugin-opencode-assistant/shared";
|
|
1
|
+
import type { PageContext, SessionInfo, ServiceStartupTask, ModelInfo } from "@vite-plugin-opencode-assistant/shared";
|
|
2
2
|
import type http from "http";
|
|
3
3
|
export interface EndpointContext {
|
|
4
4
|
get webUrl(): string | null;
|
|
@@ -15,7 +15,11 @@ export interface EndpointContext {
|
|
|
15
15
|
deleteSession: (id: string) => Promise<void>;
|
|
16
16
|
resolveWidgetPath: () => string;
|
|
17
17
|
resolveWidgetStylePath: () => string;
|
|
18
|
-
|
|
18
|
+
getAvailableModels: () => Promise<ModelInfo[]>;
|
|
19
|
+
retryWarmupChromeMcp: (selectedModel?: {
|
|
20
|
+
providerID: string;
|
|
21
|
+
modelID: string;
|
|
22
|
+
}) => Promise<{
|
|
19
23
|
success: boolean;
|
|
20
24
|
errorType?: string;
|
|
21
25
|
errorMessage?: string;
|
package/lib/endpoints/warmup.js
CHANGED
|
@@ -2,6 +2,7 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
5
6
|
var __export = (target, all) => {
|
|
6
7
|
for (var name in all)
|
|
7
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -35,6 +36,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35
36
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
36
37
|
});
|
|
37
38
|
};
|
|
39
|
+
var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
|
|
38
40
|
var warmup_exports = {};
|
|
39
41
|
__export(warmup_exports, {
|
|
40
42
|
setupWarmupEndpoint: () => setupWarmupEndpoint
|
|
@@ -44,33 +46,78 @@ var import_shared = require("@vite-plugin-opencode-assistant/shared");
|
|
|
44
46
|
const log = (0, import_shared.createLogger)("Endpoints:Warmup");
|
|
45
47
|
function setupWarmupEndpoint(server, ctx) {
|
|
46
48
|
server.middlewares.use("/__opencode_warmup__", (req, res) => __async(null, null, function* () {
|
|
49
|
+
if (req.method === "GET") {
|
|
50
|
+
try {
|
|
51
|
+
const models = yield ctx.getAvailableModels();
|
|
52
|
+
res.setHeader("Content-Type", "application/json");
|
|
53
|
+
res.writeHead(200);
|
|
54
|
+
res.end(JSON.stringify({ success: true, models }));
|
|
55
|
+
} catch (e) {
|
|
56
|
+
log.error("Failed to get available models", { error: e });
|
|
57
|
+
res.setHeader("Content-Type", "application/json");
|
|
58
|
+
res.writeHead(500);
|
|
59
|
+
res.end(JSON.stringify({ success: false, models: [] }));
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
47
63
|
if (req.method !== "POST") {
|
|
48
64
|
res.writeHead(405);
|
|
49
65
|
res.end("Method not allowed");
|
|
50
66
|
return;
|
|
51
67
|
}
|
|
52
68
|
try {
|
|
53
|
-
|
|
69
|
+
let body = "";
|
|
70
|
+
try {
|
|
71
|
+
for (var iter = __forAwait(req), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
|
|
72
|
+
const chunk = temp.value;
|
|
73
|
+
body += chunk;
|
|
74
|
+
}
|
|
75
|
+
} catch (temp) {
|
|
76
|
+
error = [temp];
|
|
77
|
+
} finally {
|
|
78
|
+
try {
|
|
79
|
+
more && (temp = iter.return) && (yield temp.call(iter));
|
|
80
|
+
} finally {
|
|
81
|
+
if (error)
|
|
82
|
+
throw error[0];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
let selectedModel;
|
|
86
|
+
if (body) {
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(body);
|
|
89
|
+
if (parsed.providerID && parsed.modelID) {
|
|
90
|
+
selectedModel = { providerID: parsed.providerID, modelID: parsed.modelID };
|
|
91
|
+
}
|
|
92
|
+
} catch (e) {
|
|
93
|
+
log.debug("Failed to parse request body, using default model");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const result = yield ctx.retryWarmupChromeMcp(selectedModel);
|
|
54
97
|
res.setHeader("Content-Type", "application/json");
|
|
55
98
|
res.writeHead(200);
|
|
56
99
|
if (result.success) {
|
|
57
100
|
res.end(JSON.stringify({ success: true }));
|
|
58
101
|
} else {
|
|
59
|
-
res.end(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
102
|
+
res.end(
|
|
103
|
+
JSON.stringify({
|
|
104
|
+
success: false,
|
|
105
|
+
errorType: result.errorType,
|
|
106
|
+
error: result.errorMessage
|
|
107
|
+
})
|
|
108
|
+
);
|
|
64
109
|
}
|
|
65
110
|
} catch (e) {
|
|
66
111
|
log.error("Failed to retry warmup", { error: e });
|
|
67
112
|
res.setHeader("Content-Type", "application/json");
|
|
68
113
|
res.writeHead(500);
|
|
69
|
-
res.end(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
114
|
+
res.end(
|
|
115
|
+
JSON.stringify({
|
|
116
|
+
success: false,
|
|
117
|
+
errorType: "UNKNOWN",
|
|
118
|
+
error: String(e)
|
|
119
|
+
})
|
|
120
|
+
);
|
|
74
121
|
}
|
|
75
122
|
}));
|
|
76
123
|
}
|
package/lib/index.js
CHANGED
|
@@ -146,7 +146,8 @@ function createOpenCodePlugin(options = {}) {
|
|
|
146
146
|
deleteSession: (id) => api.deleteSession(id),
|
|
147
147
|
resolveWidgetPath: import_paths.resolveWidgetPath,
|
|
148
148
|
resolveWidgetStylePath: import_paths.resolveWidgetStylePath,
|
|
149
|
-
|
|
149
|
+
getAvailableModels: () => service.getAvailableModels(),
|
|
150
|
+
retryWarmupChromeMcp: (selectedModel) => service.retryWarmupChromeMcp(getViteOrigin(), selectedModel)
|
|
150
151
|
});
|
|
151
152
|
(_a2 = server.httpServer) == null ? void 0 : _a2.on("listening", () => __async(null, null, function* () {
|
|
152
153
|
var _a3;
|