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/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
- getCheapestModel(): Promise<{
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
- getOrCreateSession(projectDir: string): Promise<string>;
23
- retryWarmupChromeMcp(projectDir: string, viteOrigin?: string): Promise<{
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
- getCheapestModel() {
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
- const availableModel = allModels.find(
238
- (model) => !this.failedFreeModels.has(`${model.providerID}:${model.modelID}`)
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 cheapest model", { error });
264
- return null;
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
- warmupChromeMcp(projectDir, viteOrigin) {
302
+ executeWarmupChromeMcp(projectDir, operation, viteOrigin, selectedModel) {
339
303
  return __async(this, null, function* () {
340
- if (!this.warmupChromeMcpConfig) return;
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("Chrome DevTools not available", {
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("Chrome DevTools not available");
356
- throw error;
317
+ timer.end(`Chrome DevTools not available for ${operation}`);
318
+ return { success: false, error };
357
319
  }
358
- log.debug("Chrome DevTools is available, proceeding with warmup");
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
- freeModel = yield this.getCheapestModel();
367
- if (freeModel) {
368
- log.debug("Using cheapest model for warmup", {
369
- providerID: freeModel.providerID,
370
- modelID: freeModel.modelID
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("No model available, using default model");
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
- }, freeModel && {
365
+ }, modelToUse && {
392
366
  model: {
393
- providerID: freeModel.providerID,
394
- modelID: freeModel.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("Chrome MCP warmed up");
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}`, __spreadValues({
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 30 seconds. Please check if the OpenCode AI model is properly configured and available."
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("Chrome MCP warmup timeout", __spreadValues({
410
+ log.warn(`Chrome MCP ${operation} warmup timeout`, {
446
411
  error: errorMessage
447
- }, freeModel && {
448
- model: `${freeModel.providerID}/${freeModel.modelID}`
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
- "Unknown error during Chrome MCP warmup",
418
+ `Unknown error during Chrome MCP ${operation} warmup`,
456
419
  errorMessage
457
420
  );
458
- log.warn("Chrome MCP warmup failed with unknown error", __spreadValues({
421
+ log.warn(`Chrome MCP ${operation} warmup failed with unknown error`, {
459
422
  error: errorMessage
460
- }, freeModel && {
461
- model: `${freeModel.providerID}/${freeModel.modelID}`
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 = {
@@ -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
- retryWarmupChromeMcp(viteOrigin?: string): Promise<{
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;
@@ -270,9 +270,18 @@ Please install OpenCode first:
270
270
  return this.startPromise;
271
271
  });
272
272
  }
273
- retryWarmupChromeMcp(viteOrigin) {
273
+ getAvailableModels() {
274
274
  return __async(this, null, function* () {
275
- const result = yield this.api.retryWarmupChromeMcp(this.workspaceRoot, viteOrigin);
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");
@@ -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
- retryWarmupChromeMcp: () => Promise<{
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;
@@ -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
- const result = yield ctx.retryWarmupChromeMcp();
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(JSON.stringify({
60
- success: false,
61
- errorType: result.errorType,
62
- error: result.errorMessage
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(JSON.stringify({
70
- success: false,
71
- errorType: "UNKNOWN",
72
- error: String(e)
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
- retryWarmupChromeMcp: () => service.retryWarmupChromeMcp(getViteOrigin())
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;