vite-plugin-opencode-assistant 1.0.47 → 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 +6 -9
- package/es/core/api.js +45 -85
- 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 +6 -9
- package/lib/core/api.js +45 -85
- 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/es/client/App.vue.js
CHANGED
|
@@ -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__", {
|
|
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-
|
|
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: (
|
|
9
|
+
retry: (selectedModel?: {
|
|
10
|
+
providerID: string;
|
|
11
|
+
modelID: string;
|
|
12
|
+
} | undefined) => any;
|
|
8
13
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
-
onRetry?: ((
|
|
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
|
|
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,
|
|
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 = {
|
|
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 = {
|
|
28
|
-
const _hoisted_6 = {
|
|
29
|
-
|
|
30
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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("
|
|
74
|
-
_createElementVNode("
|
|
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("
|
|
79
|
-
_createElementVNode("
|
|
80
|
-
_createElementVNode("
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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",
|
|
132
|
-
_cache[
|
|
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
|
-
|
|
225
|
+
_hoisted_5,
|
|
142
226
|
_toDisplayString($props.errorMessage || "\u672A\u77E5\u9519\u8BEF"),
|
|
143
227
|
1
|
|
144
228
|
/* TEXT */
|
|
145
229
|
),
|
|
146
|
-
|
|
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
|
-
|
|
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",
|
|
246
|
+
_createElementVNode("div", _hoisted_7, [
|
|
170
247
|
$props.errorMessage ? (_openBlock(), _createElementBlock(
|
|
171
248
|
"p",
|
|
172
|
-
|
|
249
|
+
_hoisted_8,
|
|
173
250
|
_toDisplayString($props.errorMessage),
|
|
174
251
|
1
|
|
175
252
|
/* TEXT */
|
|
176
|
-
)) : (_openBlock(), _createElementBlock("p",
|
|
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
|
-
|
|
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[
|
|
187
|
-
}, _toDisplayString($props.retrying ? "\u8FDE\u63A5\u4E2D..." : "\u91CD\u8BD5\u8FDE\u63A5"), 9,
|
|
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-
|
|
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
|
package/es/client/styles.css
CHANGED
|
@@ -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;
|
|
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,26 +1,23 @@
|
|
|
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[]>;
|
|
21
15
|
private executeWarmupChromeMcp;
|
|
22
16
|
warmupChromeMcp(projectDir: string, viteOrigin?: string): Promise<void>;
|
|
23
|
-
retryWarmupChromeMcp(projectDir: string, viteOrigin?: string
|
|
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
|
}>;
|