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.
@@ -65,6 +65,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
65
65
  const loading = ref(false);
66
66
  const widgetRef = ref(null);
67
67
  const retryingWarmup = ref(false);
68
+ const availableModels = ref([]);
68
69
  const {
69
70
  theme: initialTheme = "auto",
70
71
  open: autoOpen = false,
@@ -144,10 +145,14 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
144
145
  }
145
146
  return "\u52A0\u8F7D\u4F1A\u8BDD...";
146
147
  });
147
- const retryWarmup = () => __async(null, null, function* () {
148
+ const retryWarmup = (selectedModel) => __async(null, null, function* () {
148
149
  retryingWarmup.value = true;
149
150
  try {
150
- const res = yield fetch("/__opencode_warmup__", { method: "POST" });
151
+ const res = yield fetch("/__opencode_warmup__", {
152
+ method: "POST",
153
+ headers: { "Content-Type": "application/json" },
154
+ body: selectedModel ? JSON.stringify(selectedModel) : ""
155
+ });
151
156
  const data = yield res.json();
152
157
  if (data.success) {
153
158
  chromeMcpFailed.value = false;
@@ -175,6 +180,18 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
175
180
  retryingWarmup.value = false;
176
181
  }
177
182
  });
183
+ const fetchAvailableModels = () => __async(null, null, function* () {
184
+ try {
185
+ const res = yield fetch("/__opencode_warmup__", { method: "GET" });
186
+ const data = yield res.json();
187
+ if (data.success && data.models) {
188
+ availableModels.value = data.models;
189
+ }
190
+ } catch (e) {
191
+ console.error("[OpenCode] Failed to fetch available models:", e);
192
+ availableModels.value = [];
193
+ }
194
+ });
178
195
  const ensureServicesStarted = () => __async(null, null, function* () {
179
196
  if (serviceStatus.value !== "idle") return true;
180
197
  try {
@@ -214,6 +231,11 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
214
231
  loadSessions();
215
232
  }
216
233
  });
234
+ watch(chromeMcpFailed, (failed) => {
235
+ if (failed) {
236
+ fetchAvailableModels();
237
+ }
238
+ });
217
239
  onMounted(() => {
218
240
  if (serviceStatus.value === "ready") {
219
241
  loadSessions();
@@ -301,7 +323,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
301
323
  const handleFrameLoaded = () => {
302
324
  iframeLoading.value = false;
303
325
  };
304
- const __returned__ = { props, open, selectMode, sessionListCollapsed, loading, widgetRef, retryingWarmup, initialTheme, autoOpen, hotkey, proxyPort, proxyHost, displayMode, splitMode, widgetTheme, splitPanelWidth, proxyBaseUrl, showNotification, serviceStatus, chromeMcpFailed, chromeMcpErrorType, chromeMcpErrorMessage, loadingText, updateStatusFromTask, setStarting, selectedElements, removeElement, clearElements, theme, sendThemeToIframe, sessions, loadingSessionList, currentSessionId, iframeSrc, iframeLoading, loadSessions, createSession, deleteSession, selectSession, updateSessionInfo, updateContext, serverSSE, opencodeSSE, thinking, sessionStates, showSessionListSkeleton, computedLoading, displayLoadingText, retryWarmup, ensureServicesStarted, toggleSelectMode, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleSplitPanelWidthChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
326
+ const __returned__ = { props, open, selectMode, sessionListCollapsed, loading, widgetRef, retryingWarmup, availableModels, initialTheme, autoOpen, hotkey, proxyPort, proxyHost, displayMode, splitMode, widgetTheme, splitPanelWidth, proxyBaseUrl, showNotification, serviceStatus, chromeMcpFailed, chromeMcpErrorType, chromeMcpErrorMessage, loadingText, updateStatusFromTask, setStarting, selectedElements, removeElement, clearElements, theme, sendThemeToIframe, sessions, loadingSessionList, currentSessionId, iframeSrc, iframeLoading, loadSessions, createSession, deleteSession, selectSession, updateSessionInfo, updateContext, serverSSE, opencodeSSE, thinking, sessionStates, showSessionListSkeleton, computedLoading, displayLoadingText, retryWarmup, fetchAvailableModels, ensureServicesStarted, toggleSelectMode, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleSplitPanelWidthChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
305
327
  return OpenCodeWidget;
306
328
  }, LoadingContent, ChromeWarmupError };
307
329
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
@@ -354,8 +376,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
354
376
  retrying: $setup.retryingWarmup,
355
377
  "error-type": $setup.chromeMcpErrorType,
356
378
  "error-message": $setup.chromeMcpErrorMessage,
379
+ models: $setup.availableModels,
357
380
  onRetry: $setup.retryWarmup
358
- }, null, 8, ["retrying", "error-type", "error-message"])) : _createCommentVNode("v-if", true)
381
+ }, null, 8, ["retrying", "error-type", "error-message", "models"])) : _createCommentVNode("v-if", true)
359
382
  ]),
360
383
  _: 1
361
384
  /* STABLE */
@@ -1 +1 @@
1
- .opencode-chrome-warmup-error-details[data-v-13778a4c]{margin-top:8px;padding:12px;background:var(--oc-bg-tertiary);border-radius:6px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:12px;color:var(--oc-text-secondary);max-height:120px;overflow-y:auto;word-break:break-word}
1
+ .opencode-chrome-warmup-error-details[data-v-06c8b833]{margin-top:8px;padding:12px;background:var(--oc-bg-tertiary);border-radius:6px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:12px;color:var(--oc-text-secondary);max-height:120px;overflow-y:auto;word-break:break-word}.opencode-model-selector[data-v-06c8b833]{display:flex;flex-direction:column;gap:12px;max-width:400px}.select-wrapper[data-v-06c8b833]{position:relative;width:100%}.native-select[data-v-06c8b833]{width:100%;padding:10px 36px 10px 12px;border-radius:8px;border:1px solid var(--oc-border-primary);background:var(--oc-bg-primary);color:var(--oc-text-primary);font-size:14px;cursor:pointer;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;transition:border-color .15s ease,background-color .15s ease,box-shadow .15s ease}.native-select[data-v-06c8b833]:hover:not(:disabled){border-color:var(--oc-border-hover);background:var(--oc-bg-secondary)}.native-select[data-v-06c8b833]:focus{border-color:var(--oc-primary);box-shadow:0 0 0 2px rgba(var(--oc-primary-rgb, 59, 130, 246),.2)}.native-select[data-v-06c8b833]:disabled{opacity:.6;cursor:not-allowed}.native-select option[data-v-06c8b833]{background:var(--oc-bg-primary);color:var(--oc-text-primary);padding:8px}.native-select optgroup[data-v-06c8b833]{color:var(--oc-text-secondary);font-weight:600;font-size:12px}.select-arrow[data-v-06c8b833]{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--oc-text-secondary);display:flex;align-items:center}.native-select:disabled+.select-arrow[data-v-06c8b833]{opacity:.6}.retry-btn[data-v-06c8b833]{width:100%;padding:10px 20px;border-radius:8px;border:none;background:var(--oc-primary);color:#fff;font-size:14px;cursor:pointer;transition:background-color .15s ease}.retry-btn[data-v-06c8b833]:hover:not(:disabled){background:var(--oc-primary-hover)}.retry-btn[data-v-06c8b833]:disabled{opacity:.6;cursor:not-allowed}.opencode-chrome-warmup-failed-actions[data-v-06c8b833]{margin-top:16px;display:flex;justify-content:center}.opencode-chrome-warmup-failed-btn[data-v-06c8b833]{padding:10px 20px;border-radius:8px;border:none;font-size:14px;cursor:pointer;transition:background-color .15s ease}.opencode-chrome-warmup-failed-btn.primary[data-v-06c8b833]{background:var(--oc-primary);color:#fff}.opencode-chrome-warmup-failed-btn.primary[data-v-06c8b833]:hover:not(:disabled){background:var(--oc-primary-hover)}.opencode-chrome-warmup-failed-btn[data-v-06c8b833]:disabled{opacity:.6;cursor:not-allowed}
@@ -1,11 +1,19 @@
1
+ import { type ModelInfo } from "@vite-plugin-opencode-assistant/shared";
1
2
  type __VLS_Props = {
2
3
  retrying: boolean;
3
4
  errorType?: string;
4
5
  errorMessage?: string;
6
+ models?: ModelInfo[];
5
7
  };
6
8
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
7
- retry: () => any;
9
+ retry: (selectedModel?: {
10
+ providerID: string;
11
+ modelID: string;
12
+ } | undefined) => any;
8
13
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
9
- onRetry?: (() => any) | undefined;
14
+ onRetry?: ((selectedModel?: {
15
+ providerID: string;
16
+ modelID: string;
17
+ } | undefined) => any) | undefined;
10
18
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
19
  export default _default;
@@ -1,36 +1,117 @@
1
1
  import "./ChromeWarmupError-sfc.css";
2
2
  import { defineComponent as _defineComponent } from "vue";
3
+ import { ref, computed, watch } from "vue";
3
4
  import { ChromeMcpWarmupErrorType } from "@vite-plugin-opencode-assistant/shared";
4
5
  const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
6
  __name: "ChromeWarmupError",
6
7
  props: {
7
8
  retrying: { type: Boolean, required: true },
8
9
  errorType: { type: String, required: false },
9
- errorMessage: { type: String, required: false }
10
+ errorMessage: { type: String, required: false },
11
+ models: { type: Array, required: false }
10
12
  },
11
13
  emits: ["retry"],
12
14
  setup(__props, { expose: __expose, emit: __emit }) {
13
15
  __expose();
16
+ const props = __props;
14
17
  const emit = __emit;
15
- const __returned__ = { emit, get ChromeMcpWarmupErrorType() {
18
+ const selectedModelValue = ref("");
19
+ watch(
20
+ () => props.models,
21
+ (models) => {
22
+ if (models && models.length > 0 && !selectedModelValue.value) {
23
+ selectedModelValue.value = `${models[0].providerID}:${models[0].modelID}`;
24
+ }
25
+ },
26
+ { immediate: true }
27
+ );
28
+ const shouldShowModelSelector = computed(() => {
29
+ return props.errorType === ChromeMcpWarmupErrorType.AI_TIMEOUT || props.errorType === ChromeMcpWarmupErrorType.AI_RESPONSE_ERROR || props.errorType === ChromeMcpWarmupErrorType.UNKNOWN;
30
+ });
31
+ const hasModels = computed(() => props.models && props.models.length > 0);
32
+ const groupedModels = computed(() => {
33
+ if (!props.models) return {};
34
+ const groups = {};
35
+ for (const model of props.models) {
36
+ if (!groups[model.providerID]) {
37
+ groups[model.providerID] = [];
38
+ }
39
+ groups[model.providerID].push(model);
40
+ }
41
+ return groups;
42
+ });
43
+ const selectedModel = computed(() => {
44
+ var _a;
45
+ if (!selectedModelValue.value || !props.models) return ((_a = props.models) == null ? void 0 : _a[0]) || null;
46
+ const [providerID, modelID] = selectedModelValue.value.split(":");
47
+ return props.models.find((m) => m.providerID === providerID && m.modelID === modelID) || null;
48
+ });
49
+ const getProviderDisplayName = (providerID) => {
50
+ const knownProviders = {
51
+ anthropic: "Anthropic",
52
+ openai: "OpenAI",
53
+ google: "Google",
54
+ xai: "xAI",
55
+ opencode: "OpenCode",
56
+ opencode_go: "OpenCode Go"
57
+ };
58
+ return knownProviders[providerID] || providerID;
59
+ };
60
+ const getModelKey = (model) => `${model.providerID}:${model.modelID}`;
61
+ const handleRetry = () => {
62
+ if (shouldShowModelSelector.value && hasModels.value && selectedModel.value) {
63
+ emit("retry", {
64
+ providerID: selectedModel.value.providerID,
65
+ modelID: selectedModel.value.modelID
66
+ });
67
+ } else {
68
+ emit("retry");
69
+ }
70
+ };
71
+ const __returned__ = { props, emit, selectedModelValue, shouldShowModelSelector, hasModels, groupedModels, selectedModel, getProviderDisplayName, getModelKey, handleRetry, get ChromeMcpWarmupErrorType() {
16
72
  return ChromeMcpWarmupErrorType;
17
73
  } };
18
74
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
19
75
  return __returned__;
20
76
  }
21
77
  });
22
- import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, Fragment as _Fragment, toDisplayString as _toDisplayString } from "vue";
78
+ import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, Fragment as _Fragment, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, vModelSelect as _vModelSelect, withDirectives as _withDirectives } from "vue";
23
79
  const _hoisted_1 = { class: "opencode-chrome-warmup-failed" };
24
80
  const _hoisted_2 = { class: "opencode-chrome-warmup-failed-text" };
25
- const _hoisted_3 = { class: "opencode-chrome-warmup-error-details" };
81
+ const _hoisted_3 = {
82
+ key: 0,
83
+ style: { "margin-top": "12px", "font-weight": "500" }
84
+ };
26
85
  const _hoisted_4 = { class: "opencode-chrome-warmup-failed-text" };
27
- const _hoisted_5 = { key: 0 };
28
- const _hoisted_6 = { key: 1 };
29
- const _hoisted_7 = { class: "opencode-chrome-warmup-failed-actions" };
30
- const _hoisted_8 = ["disabled"];
86
+ const _hoisted_5 = { class: "opencode-chrome-warmup-error-details" };
87
+ const _hoisted_6 = {
88
+ key: 0,
89
+ style: { "margin-top": "12px" }
90
+ };
91
+ const _hoisted_7 = { class: "opencode-chrome-warmup-failed-text" };
92
+ const _hoisted_8 = { key: 0 };
93
+ const _hoisted_9 = { key: 1 };
94
+ const _hoisted_10 = {
95
+ key: 2,
96
+ style: { "margin-top": "12px" }
97
+ };
98
+ const _hoisted_11 = {
99
+ key: 4,
100
+ class: "opencode-model-selector"
101
+ };
102
+ const _hoisted_12 = { class: "select-wrapper" };
103
+ const _hoisted_13 = ["disabled"];
104
+ const _hoisted_14 = ["label"];
105
+ const _hoisted_15 = ["value"];
106
+ const _hoisted_16 = ["disabled"];
107
+ const _hoisted_17 = {
108
+ key: 5,
109
+ class: "opencode-chrome-warmup-failed-actions"
110
+ };
111
+ const _hoisted_18 = ["disabled"];
31
112
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
32
113
  return _openBlock(), _createElementBlock("div", _hoisted_1, [
33
- _cache[9] || (_cache[9] = _createElementVNode(
114
+ _cache[11] || (_cache[11] = _createElementVNode(
34
115
  "div",
35
116
  { class: "opencode-chrome-warmup-failed-icon" },
36
117
  [
@@ -53,31 +134,30 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
53
134
  -1
54
135
  /* CACHED */
55
136
  )),
56
- _createCommentVNode(" Chrome \u8FDC\u7A0B\u8C03\u8BD5\u672A\u5F00\u542F "),
57
137
  $props.errorType === $setup.ChromeMcpWarmupErrorType.CHROME_NOT_CONNECTED ? (_openBlock(), _createElementBlock(
58
138
  _Fragment,
59
139
  { key: 0 },
60
140
  [
61
- _cache[1] || (_cache[1] = _createElementVNode(
141
+ _cache[2] || (_cache[2] = _createElementVNode(
62
142
  "div",
63
143
  { class: "opencode-chrome-warmup-failed-title" },
64
144
  "Chrome DevTools MCP \u8FDE\u63A5\u5931\u8D25",
65
145
  -1
66
146
  /* CACHED */
67
147
  )),
68
- _cache[2] || (_cache[2] = _createElementVNode(
148
+ _cache[3] || (_cache[3] = _createElementVNode(
69
149
  "div",
70
150
  { class: "opencode-chrome-warmup-failed-text" },
71
151
  [
72
152
  _createElementVNode("p", null, "\u8BF7\u6309\u4EE5\u4E0B\u6B65\u9AA4\u5F00\u542F Chrome \u8FDC\u7A0B\u8C03\u8BD5\uFF1A"),
73
- _createElementVNode("ol", { class: "opencode-chrome-warmup-steps" }, [
74
- _createElementVNode("li", null, [
153
+ _createElementVNode("div", { class: "opencode-chrome-warmup-steps" }, [
154
+ _createElementVNode("div", null, [
75
155
  _createTextVNode(" \u5728 Chrome \u5730\u5740\u680F\u8F93\u5165 "),
76
156
  _createElementVNode("code", { class: "opencode-chrome-warmup-code" }, "chrome://inspect/#remote-debugging")
77
157
  ]),
78
- _createElementVNode("li", null, "\u52FE\u9009 'Allow remote debugging for this browser instance' \u9009\u9879"),
79
- _createElementVNode("li", null, "\u91CD\u65B0\u542F\u52A8\u6D4F\u89C8\u5668"),
80
- _createElementVNode("li", null, "\u5B8C\u6210\u540E\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u91CD\u8BD5")
158
+ _createElementVNode("div", null, "\u52FE\u9009 'Allow remote debugging for this browser instance' \u9009\u9879"),
159
+ _createElementVNode("div", null, "\u91CD\u65B0\u542F\u52A8\u6D4F\u89C8\u5668"),
160
+ _createElementVNode("div", null, "\u5B8C\u6210\u540E\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u91CD\u8BD5")
81
161
  ])
82
162
  ],
83
163
  -1
@@ -90,29 +170,34 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
90
170
  _Fragment,
91
171
  { key: 1 },
92
172
  [
93
- _createCommentVNode(" AI \u54CD\u5E94\u8D85\u65F6 "),
94
- _cache[3] || (_cache[3] = _createElementVNode(
173
+ _cache[6] || (_cache[6] = _createElementVNode(
95
174
  "div",
96
175
  { class: "opencode-chrome-warmup-failed-title" },
97
176
  "AI \u54CD\u5E94\u8D85\u65F6",
98
177
  -1
99
178
  /* CACHED */
100
179
  )),
101
- _cache[4] || (_cache[4] = _createElementVNode(
102
- "div",
103
- { class: "opencode-chrome-warmup-failed-text" },
104
- [
105
- _createElementVNode("p", null, "AI \u6A21\u578B\u54CD\u5E94\u8D85\u65F6\uFF0C\u53EF\u80FD\u7684\u539F\u56E0\uFF1A"),
106
- _createElementVNode("ol", { class: "opencode-chrome-warmup-steps" }, [
107
- _createElementVNode("li", null, "OpenCode AI \u6A21\u578B\u672A\u6B63\u786E\u914D\u7F6E"),
108
- _createElementVNode("li", null, "AI \u6A21\u578B\u670D\u52A1\u4E0D\u53EF\u7528\u6216\u54CD\u5E94\u7F13\u6162"),
109
- _createElementVNode("li", null, "\u7F51\u7EDC\u8FDE\u63A5\u95EE\u9898")
110
- ]),
111
- _createElementVNode("p", { style: { "margin-top": "12px", "font-weight": "500" } }, "\u8BF7\u68C0\u67E5 OpenCode \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 AI \u6A21\u578B\u8BBE\u7F6E")
112
- ],
113
- -1
114
- /* CACHED */
115
- ))
180
+ _createElementVNode("div", _hoisted_2, [
181
+ _cache[4] || (_cache[4] = _createElementVNode(
182
+ "p",
183
+ null,
184
+ "AI \u6A21\u578B\u54CD\u5E94\u8D85\u65F6\uFF0C\u53EF\u80FD\u7684\u539F\u56E0\uFF1A",
185
+ -1
186
+ /* CACHED */
187
+ )),
188
+ _cache[5] || (_cache[5] = _createElementVNode(
189
+ "div",
190
+ { class: "opencode-chrome-warmup-steps" },
191
+ [
192
+ _createElementVNode("div", null, "\u5F53\u524D\u9009\u62E9\u7684 AI \u6A21\u578B\u670D\u52A1\u4E0D\u53EF\u7528\u6216\u54CD\u5E94\u7F13\u6162"),
193
+ _createElementVNode("div", null, "\u7F51\u7EDC\u8FDE\u63A5\u95EE\u9898"),
194
+ _createElementVNode("div", null, "\u6A21\u578B\u914D\u7F6E\u4E0D\u6B63\u786E")
195
+ ],
196
+ -1
197
+ /* CACHED */
198
+ )),
199
+ $setup.hasModels ? (_openBlock(), _createElementBlock("p", _hoisted_3, "\u53EF\u9009\u62E9\u5176\u4ED6\u6A21\u578B\u91CD\u8BD5\uFF1A")) : _createCommentVNode("v-if", true)
200
+ ])
116
201
  ],
117
202
  64
118
203
  /* STABLE_FRAGMENT */
@@ -120,16 +205,15 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
120
205
  _Fragment,
121
206
  { key: 2 },
122
207
  [
123
- _createCommentVNode(" AI \u54CD\u5E94\u9519\u8BEF "),
124
- _cache[7] || (_cache[7] = _createElementVNode(
208
+ _cache[8] || (_cache[8] = _createElementVNode(
125
209
  "div",
126
210
  { class: "opencode-chrome-warmup-failed-title" },
127
211
  "AI \u54CD\u5E94\u9519\u8BEF",
128
212
  -1
129
213
  /* CACHED */
130
214
  )),
131
- _createElementVNode("div", _hoisted_2, [
132
- _cache[5] || (_cache[5] = _createElementVNode(
215
+ _createElementVNode("div", _hoisted_4, [
216
+ _cache[7] || (_cache[7] = _createElementVNode(
133
217
  "p",
134
218
  null,
135
219
  "AI \u6A21\u578B\u8FD4\u56DE\u4E86\u610F\u5916\u7684\u54CD\u5E94\uFF1A",
@@ -138,18 +222,12 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
138
222
  )),
139
223
  _createElementVNode(
140
224
  "div",
141
- _hoisted_3,
225
+ _hoisted_5,
142
226
  _toDisplayString($props.errorMessage || "\u672A\u77E5\u9519\u8BEF"),
143
227
  1
144
228
  /* TEXT */
145
229
  ),
146
- _cache[6] || (_cache[6] = _createElementVNode(
147
- "p",
148
- { style: { "margin-top": "12px" } },
149
- "\u8BF7\u68C0\u67E5 OpenCode AI \u6A21\u578B\u914D\u7F6E\u662F\u5426\u6B63\u786E",
150
- -1
151
- /* CACHED */
152
- ))
230
+ $setup.hasModels ? (_openBlock(), _createElementBlock("p", _hoisted_6, "\u53EF\u9009\u62E9\u5176\u4ED6\u6A21\u578B\u91CD\u8BD5\uFF1A")) : _createCommentVNode("v-if", true)
153
231
  ])
154
232
  ],
155
233
  64
@@ -158,38 +236,101 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
158
236
  _Fragment,
159
237
  { key: 3 },
160
238
  [
161
- _createCommentVNode(" \u5176\u4ED6\u9519\u8BEF "),
162
- _cache[8] || (_cache[8] = _createElementVNode(
239
+ _cache[9] || (_cache[9] = _createElementVNode(
163
240
  "div",
164
241
  { class: "opencode-chrome-warmup-failed-title" },
165
242
  "Chrome DevTools MCP \u8FDE\u63A5\u5931\u8D25",
166
243
  -1
167
244
  /* CACHED */
168
245
  )),
169
- _createElementVNode("div", _hoisted_4, [
246
+ _createElementVNode("div", _hoisted_7, [
170
247
  $props.errorMessage ? (_openBlock(), _createElementBlock(
171
248
  "p",
172
- _hoisted_5,
249
+ _hoisted_8,
173
250
  _toDisplayString($props.errorMessage),
174
251
  1
175
252
  /* TEXT */
176
- )) : (_openBlock(), _createElementBlock("p", _hoisted_6, "\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"))
253
+ )) : (_openBlock(), _createElementBlock("p", _hoisted_9, "\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5")),
254
+ $setup.hasModels ? (_openBlock(), _createElementBlock("p", _hoisted_10, "\u53EF\u9009\u62E9\u6A21\u578B\u91CD\u8BD5\uFF1A")) : _createCommentVNode("v-if", true)
177
255
  ])
178
256
  ],
179
257
  64
180
258
  /* STABLE_FRAGMENT */
181
259
  )),
182
- _createElementVNode("div", _hoisted_7, [
260
+ $setup.shouldShowModelSelector && $setup.hasModels ? (_openBlock(), _createElementBlock("div", _hoisted_11, [
261
+ _createElementVNode("div", _hoisted_12, [
262
+ _withDirectives(_createElementVNode("select", {
263
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.selectedModelValue = $event),
264
+ class: "native-select",
265
+ disabled: $props.retrying
266
+ }, [
267
+ (_openBlock(true), _createElementBlock(
268
+ _Fragment,
269
+ null,
270
+ _renderList($setup.groupedModels, (providerModels, provider) => {
271
+ return _openBlock(), _createElementBlock("optgroup", {
272
+ key: provider,
273
+ label: $setup.getProviderDisplayName(provider)
274
+ }, [
275
+ (_openBlock(true), _createElementBlock(
276
+ _Fragment,
277
+ null,
278
+ _renderList(providerModels, (model) => {
279
+ return _openBlock(), _createElementBlock("option", {
280
+ key: $setup.getModelKey(model),
281
+ value: $setup.getModelKey(model)
282
+ }, _toDisplayString(model.name || model.modelID), 9, _hoisted_15);
283
+ }),
284
+ 128
285
+ /* KEYED_FRAGMENT */
286
+ ))
287
+ ], 8, _hoisted_14);
288
+ }),
289
+ 128
290
+ /* KEYED_FRAGMENT */
291
+ ))
292
+ ], 8, _hoisted_13), [
293
+ [_vModelSelect, $setup.selectedModelValue]
294
+ ]),
295
+ _cache[10] || (_cache[10] = _createElementVNode(
296
+ "span",
297
+ { class: "select-arrow" },
298
+ [
299
+ _createElementVNode("svg", {
300
+ viewBox: "0 0 24 24",
301
+ width: "16",
302
+ height: "16",
303
+ fill: "none",
304
+ stroke: "currentColor",
305
+ "stroke-width": "2"
306
+ }, [
307
+ _createElementVNode("path", {
308
+ d: "M6 9l6 6 6-6",
309
+ "stroke-linecap": "round",
310
+ "stroke-linejoin": "round"
311
+ })
312
+ ])
313
+ ],
314
+ -1
315
+ /* CACHED */
316
+ ))
317
+ ]),
318
+ _createElementVNode("button", {
319
+ class: "retry-btn",
320
+ disabled: $props.retrying,
321
+ onClick: $setup.handleRetry
322
+ }, _toDisplayString($props.retrying ? "\u8FDE\u63A5\u4E2D..." : "\u91CD\u8BD5\u8FDE\u63A5"), 9, _hoisted_16)
323
+ ])) : (_openBlock(), _createElementBlock("div", _hoisted_17, [
183
324
  _createElementVNode("button", {
184
325
  class: "opencode-chrome-warmup-failed-btn primary",
185
326
  disabled: $props.retrying,
186
- onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("retry"))
187
- }, _toDisplayString($props.retrying ? "\u8FDE\u63A5\u4E2D..." : "\u91CD\u8BD5\u8FDE\u63A5"), 9, _hoisted_8)
188
- ])
327
+ onClick: _cache[1] || (_cache[1] = ($event) => $setup.handleRetry())
328
+ }, _toDisplayString($props.retrying ? "\u8FDE\u63A5\u4E2D..." : "\u91CD\u8BD5\u8FDE\u63A5"), 9, _hoisted_18)
329
+ ]))
189
330
  ]);
190
331
  }
191
332
  __vue_sfc__.render = __vue_render__;
192
- __vue_sfc__.__scopeId = "data-v-13778a4c";
333
+ __vue_sfc__.__scopeId = "data-v-06c8b833";
193
334
  var ChromeWarmupError_vue_default = __vue_sfc__;
194
335
  export {
195
336
  ChromeWarmupError_vue_default as default
@@ -1 +1 @@
1
- .opencode-custom-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px}.opencode-loading-spinner{width:32px;height:32px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:opencode-spin .8s linear infinite}@keyframes opencode-spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;color:var(--oc-text-secondary);font-size:14px}.opencode-chrome-warmup-failed{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-bg-secondary);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:15}.opencode-chrome-warmup-failed-icon{color:var(--oc-warning, #f59e0b);margin-bottom:16px}.opencode-chrome-warmup-failed-title{color:var(--oc-text-primary);font-size:18px;font-weight:600;margin-bottom:8px}.opencode-chrome-warmup-failed-text{color:var(--oc-text-secondary);font-size:14px;margin-bottom:24px;text-align:left;max-width:400px;line-height:1.6;text-align:center}.opencode-chrome-warmup-failed-text p{margin:0 0 12px;font-weight:500;color:var(--oc-text-primary)}.opencode-chrome-warmup-steps{margin:0;padding-left:20px}.opencode-chrome-warmup-steps li{margin-bottom:8px;color:var(--oc-text-secondary);font-size:13px;line-height:1.5}.opencode-chrome-warmup-steps li:last-child{margin-bottom:0}.opencode-chrome-warmup-code{display:inline-block;background:var(--oc-bg-tertiary);color:var(--oc-primary);padding:2px 6px;border-radius:4px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:12px;font-weight:500;word-break:break-all;margin:0 2px}.opencode-chrome-warmup-failed-actions{display:flex;gap:12px}.opencode-chrome-warmup-failed-btn{padding:10px 24px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-chrome-warmup-failed-btn.primary{background:var(--oc-primary);color:#fff;box-shadow:var(--oc-shadow-primary)}.opencode-chrome-warmup-failed-btn.primary:hover:not(:disabled){background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-chrome-warmup-failed-btn.primary:active:not(:disabled){transform:translateY(0)}.opencode-chrome-warmup-failed-btn.primary:disabled{opacity:.6;cursor:not-allowed}
1
+ .opencode-custom-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px}.opencode-loading-spinner{width:32px;height:32px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:opencode-spin .8s linear infinite}@keyframes opencode-spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;color:var(--oc-text-secondary);font-size:14px}.opencode-chrome-warmup-failed{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-bg-secondary);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:15}.opencode-chrome-warmup-failed-icon{color:var(--oc-warning, #f59e0b);margin-bottom:16px}.opencode-chrome-warmup-failed-title{color:var(--oc-text-primary);font-size:18px;font-weight:600;margin-bottom:8px}.opencode-chrome-warmup-failed-text{color:var(--oc-text-secondary);font-size:14px;text-align:left;max-width:400px;line-height:1.6;text-align:center}.opencode-chrome-warmup-failed-text p{margin:0 0 12px;font-weight:500;color:var(--oc-text-primary)}.opencode-chrome-warmup-steps{margin:0}.opencode-chrome-warmup-steps div{margin-bottom:8px;color:var(--oc-text-secondary);font-size:13px;line-height:1.5}.opencode-chrome-warmup-steps div:last-child{margin-bottom:0}.opencode-chrome-warmup-code{display:inline-block;background:var(--oc-bg-tertiary);color:var(--oc-primary);padding:2px 6px;border-radius:4px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:12px;font-weight:500;word-break:break-all;margin:0 2px}.opencode-chrome-warmup-failed-actions{display:flex;gap:12px}.opencode-chrome-warmup-failed-btn{padding:10px 24px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-chrome-warmup-failed-btn.primary{background:var(--oc-primary);color:#fff;box-shadow:var(--oc-shadow-primary)}.opencode-chrome-warmup-failed-btn.primary:hover:not(:disabled){background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-chrome-warmup-failed-btn.primary:active:not(:disabled){transform:translateY(0)}.opencode-chrome-warmup-failed-btn.primary:disabled{opacity:.6;cursor:not-allowed}
package/es/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
  }