vite-plugin-opencode-assistant 1.0.15 → 1.0.17
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.d.ts +6 -0
- package/es/client/App.vue.js +317 -0
- package/es/client/components/ChromeWarmupError-sfc.css +1 -0
- package/es/client/components/ChromeWarmupError.vue.d.ts +11 -0
- package/es/client/components/ChromeWarmupError.vue.js +196 -0
- package/es/client/components/LoadingContent.vue.d.ts +5 -0
- package/es/client/components/LoadingContent.vue.js +39 -0
- package/es/client/composables/useContext.d.ts +8 -0
- package/es/client/composables/useContext.js +63 -0
- package/es/client/composables/useHotkey.d.ts +12 -0
- package/es/client/composables/useHotkey.js +41 -0
- package/es/client/composables/useSSE.d.ts +20 -0
- package/es/client/composables/useSSE.js +61 -0
- package/es/client/composables/useSelectedElements.d.ts +19 -0
- package/es/client/composables/useSelectedElements.js +43 -0
- package/es/client/composables/useServiceStatus.d.ts +13 -0
- package/es/client/composables/useServiceStatus.js +53 -0
- package/es/client/composables/useSessions.d.ts +26 -0
- package/es/client/composables/useSessions.js +127 -0
- package/es/client/composables/useTheme.d.ts +12 -0
- package/es/client/composables/useTheme.js +42 -0
- package/es/client/index.d.ts +1 -1
- package/es/client/index.js +5 -675
- package/es/client/styles.css +1 -0
- package/es/core/api.d.ts +18 -6
- package/es/core/api.js +345 -89
- package/es/core/proxy-server.js +266 -2
- package/es/core/service.d.ts +9 -2
- package/es/core/service.js +35 -31
- package/es/endpoints/index.js +1 -1
- package/es/endpoints/sse.js +0 -3
- package/es/endpoints/start.d.ts +1 -2
- package/es/endpoints/start.js +2 -2
- package/es/endpoints/types.d.ts +5 -2
- package/es/endpoints/warmup.js +15 -3
- package/es/index.js +8 -12
- package/es/utils/system.d.ts +1 -0
- package/es/utils/system.js +28 -0
- package/lib/client/App.vue.d.ts +6 -0
- package/lib/client/App.vue.js +344 -0
- package/lib/client/components/ChromeWarmupError-sfc.css +1 -0
- package/lib/client/components/ChromeWarmupError.vue.d.ts +11 -0
- package/lib/client/components/ChromeWarmupError.vue.js +215 -0
- package/lib/client/components/LoadingContent.vue.d.ts +5 -0
- package/lib/client/components/LoadingContent.vue.js +58 -0
- package/lib/client/composables/useContext.d.ts +8 -0
- package/lib/client/composables/useContext.js +86 -0
- package/lib/client/composables/useHotkey.d.ts +12 -0
- package/lib/client/composables/useHotkey.js +66 -0
- package/lib/client/composables/useSSE.d.ts +20 -0
- package/lib/client/composables/useSSE.js +84 -0
- package/lib/client/composables/useSelectedElements.d.ts +19 -0
- package/lib/client/composables/useSelectedElements.js +66 -0
- package/lib/client/composables/useServiceStatus.d.ts +13 -0
- package/lib/client/composables/useServiceStatus.js +76 -0
- package/lib/client/composables/useSessions.d.ts +26 -0
- package/lib/client/composables/useSessions.js +148 -0
- package/lib/client/composables/useTheme.d.ts +12 -0
- package/lib/client/composables/useTheme.js +65 -0
- package/lib/client/index.d.ts +1 -1
- package/lib/client/index.js +22 -667
- package/lib/client/styles.css +1 -0
- package/lib/client.js +3280 -3109
- package/lib/core/api.d.ts +18 -6
- package/lib/core/api.js +342 -94
- package/lib/core/proxy-server.js +266 -2
- package/lib/core/service.d.ts +9 -2
- package/lib/core/service.js +31 -30
- package/lib/endpoints/index.js +1 -1
- package/lib/endpoints/sse.js +0 -3
- package/lib/endpoints/start.d.ts +1 -2
- package/lib/endpoints/start.js +2 -2
- package/lib/endpoints/types.d.ts +5 -2
- package/lib/endpoints/warmup.js +15 -3
- package/lib/index.js +8 -12
- package/lib/style.css +1 -1
- package/lib/utils/system.d.ts +1 -0
- package/lib/utils/system.js +29 -0
- package/package.json +4 -4
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WidgetOptions } from "@vite-plugin-opencode-assistant/shared";
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
config: Partial<WidgetOptions>;
|
|
4
|
+
};
|
|
5
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __async = (__this, __arguments, generator) => {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
var fulfilled = (value) => {
|
|
23
|
+
try {
|
|
24
|
+
step(generator.next(value));
|
|
25
|
+
} catch (e) {
|
|
26
|
+
reject(e);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var rejected = (value) => {
|
|
30
|
+
try {
|
|
31
|
+
step(generator.throw(value));
|
|
32
|
+
} catch (e) {
|
|
33
|
+
reject(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
37
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
import { defineComponent as _defineComponent } from "vue";
|
|
41
|
+
import { ref, computed, onMounted } from "vue";
|
|
42
|
+
import { OpenCodeWidget } from "@vite-plugin-opencode-assistant/components";
|
|
43
|
+
import { useHotkey } from "./composables/useHotkey";
|
|
44
|
+
import { useSSE } from "./composables/useSSE";
|
|
45
|
+
import { useSessions } from "./composables/useSessions";
|
|
46
|
+
import { useTheme } from "./composables/useTheme";
|
|
47
|
+
import { useSelectedElements } from "./composables/useSelectedElements";
|
|
48
|
+
import { useServiceStatus } from "./composables/useServiceStatus";
|
|
49
|
+
import { useContext } from "./composables/useContext";
|
|
50
|
+
import LoadingContent from "./components/LoadingContent.vue.js";
|
|
51
|
+
import ChromeWarmupError from "./components/ChromeWarmupError.vue.js";
|
|
52
|
+
const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
53
|
+
__name: "App",
|
|
54
|
+
props: {
|
|
55
|
+
config: { type: Object, required: true }
|
|
56
|
+
},
|
|
57
|
+
setup(__props, { expose: __expose }) {
|
|
58
|
+
__expose();
|
|
59
|
+
const props = __props;
|
|
60
|
+
const open = ref(false);
|
|
61
|
+
const selectMode = ref(false);
|
|
62
|
+
const sessionListCollapsed = ref(true);
|
|
63
|
+
const loading = ref(false);
|
|
64
|
+
const widgetRef = ref(null);
|
|
65
|
+
const retryingWarmup = ref(false);
|
|
66
|
+
const {
|
|
67
|
+
position = "bottom-right",
|
|
68
|
+
theme: initialTheme = "auto",
|
|
69
|
+
open: autoOpen = false,
|
|
70
|
+
hotkey = "ctrl+k"
|
|
71
|
+
} = props.config;
|
|
72
|
+
const widgetPosition = position;
|
|
73
|
+
const widgetTheme = initialTheme;
|
|
74
|
+
const showNotification = (msg, options) => {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
(_b = (_a = widgetRef.value) == null ? void 0 : _a.showNotification) == null ? void 0 : _b.call(_a, msg, options);
|
|
77
|
+
};
|
|
78
|
+
const {
|
|
79
|
+
serviceStatus,
|
|
80
|
+
chromeMcpFailed,
|
|
81
|
+
chromeMcpErrorType,
|
|
82
|
+
chromeMcpErrorMessage,
|
|
83
|
+
thinking,
|
|
84
|
+
loadingText,
|
|
85
|
+
updateStatusFromTask,
|
|
86
|
+
setStarting,
|
|
87
|
+
setThinking
|
|
88
|
+
} = useServiceStatus();
|
|
89
|
+
const {
|
|
90
|
+
selectedElements,
|
|
91
|
+
removeElement,
|
|
92
|
+
clearElements
|
|
93
|
+
} = useSelectedElements();
|
|
94
|
+
const {
|
|
95
|
+
theme,
|
|
96
|
+
sendThemeToIframe
|
|
97
|
+
} = useTheme(widgetTheme, widgetRef);
|
|
98
|
+
const {
|
|
99
|
+
sessions,
|
|
100
|
+
loadingSessionList,
|
|
101
|
+
currentSessionId,
|
|
102
|
+
iframeSrc,
|
|
103
|
+
iframeLoading,
|
|
104
|
+
loadSessions,
|
|
105
|
+
createSession,
|
|
106
|
+
deleteSession,
|
|
107
|
+
selectSession
|
|
108
|
+
} = useSessions(showNotification);
|
|
109
|
+
const { updateContext } = useContext(serviceStatus, selectedElements);
|
|
110
|
+
const showSessionListSkeleton = computed(() => serviceStatus.value === "starting");
|
|
111
|
+
const computedLoading = computed(() => {
|
|
112
|
+
return serviceStatus.value === "starting" || iframeLoading.value;
|
|
113
|
+
});
|
|
114
|
+
const retryWarmup = () => __async(null, null, function* () {
|
|
115
|
+
retryingWarmup.value = true;
|
|
116
|
+
try {
|
|
117
|
+
const res = yield fetch("/__opencode_warmup__", { method: "POST" });
|
|
118
|
+
const data = yield res.json();
|
|
119
|
+
if (data.success) {
|
|
120
|
+
chromeMcpFailed.value = false;
|
|
121
|
+
serviceStatus.value = "ready";
|
|
122
|
+
showNotification("Chrome DevTools MCP \u8FDE\u63A5\u6210\u529F");
|
|
123
|
+
} else {
|
|
124
|
+
if (data.errorType === "AI_TIMEOUT") {
|
|
125
|
+
showNotification("AI \u54CD\u5E94\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5 OpenCode AI \u6A21\u578B\u914D\u7F6E");
|
|
126
|
+
} else if (data.errorType === "AI_RESPONSE_ERROR") {
|
|
127
|
+
showNotification("AI \u54CD\u5E94\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5 OpenCode AI \u6A21\u578B\u914D\u7F6E");
|
|
128
|
+
} else if (data.errorType === "CHROME_NOT_CONNECTED") {
|
|
129
|
+
showNotification("Chrome \u8FDC\u7A0B\u8C03\u8BD5\u672A\u5F00\u542F\uFF0C\u8BF7\u6309\u7167\u63D0\u793A\u64CD\u4F5C");
|
|
130
|
+
} else {
|
|
131
|
+
showNotification(data.error || "\u91CD\u8BD5\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4 Chrome \u8FDC\u7A0B\u8C03\u8BD5\u5DF2\u5F00\u542F");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (e) {
|
|
135
|
+
console.error("[OpenCode] Retry warmup failed:", e);
|
|
136
|
+
showNotification("\u91CD\u8BD5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");
|
|
137
|
+
} finally {
|
|
138
|
+
retryingWarmup.value = false;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const { setupSSE } = useSSE(
|
|
142
|
+
(data) => {
|
|
143
|
+
if (data.isStarted !== void 0 && data.isStarted && serviceStatus.value === "idle") {
|
|
144
|
+
setStarting();
|
|
145
|
+
}
|
|
146
|
+
if (data.task) {
|
|
147
|
+
updateStatusFromTask(data.task, data.errorType, data.errorMessage);
|
|
148
|
+
}
|
|
149
|
+
if (serviceStatus.value !== "idle") {
|
|
150
|
+
loadSessions();
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
(data) => {
|
|
154
|
+
updateStatusFromTask(data.task, data.errorType, data.errorMessage);
|
|
155
|
+
},
|
|
156
|
+
() => clearElements(),
|
|
157
|
+
() => updateContext(true)
|
|
158
|
+
);
|
|
159
|
+
const ensureServicesStarted = () => __async(null, null, function* () {
|
|
160
|
+
if (serviceStatus.value !== "idle") return true;
|
|
161
|
+
try {
|
|
162
|
+
const res = yield fetch("/__opencode_start__");
|
|
163
|
+
const data = yield res.json();
|
|
164
|
+
if (data.success) {
|
|
165
|
+
setStarting();
|
|
166
|
+
setupSSE();
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
} catch (e) {
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
});
|
|
173
|
+
useHotkey(hotkey, (e) => {
|
|
174
|
+
e.preventDefault();
|
|
175
|
+
handleToggle(!open.value);
|
|
176
|
+
});
|
|
177
|
+
useHotkey("ctrl+p", (e) => {
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
const win = window;
|
|
180
|
+
if (win.__VUE_INSPECTOR__) {
|
|
181
|
+
selectMode.value = !selectMode.value;
|
|
182
|
+
} else {
|
|
183
|
+
showNotification("Vue Inspector \u672A\u52A0\u8F7D\uFF0C\u65E0\u6CD5\u4F7F\u7528\u5143\u7D20\u9009\u62E9\u529F\u80FD");
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
onMounted(() => {
|
|
187
|
+
if (serviceStatus.value !== "idle") {
|
|
188
|
+
loadSessions();
|
|
189
|
+
setupSSE();
|
|
190
|
+
updateContext(true);
|
|
191
|
+
}
|
|
192
|
+
if (autoOpen && serviceStatus.value !== "idle") {
|
|
193
|
+
setTimeout(() => {
|
|
194
|
+
open.value = true;
|
|
195
|
+
}, 1e3);
|
|
196
|
+
}
|
|
197
|
+
const handleIframeMessage = (event) => {
|
|
198
|
+
var _a, _b;
|
|
199
|
+
if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_THINKING_STATE") {
|
|
200
|
+
setThinking(event.data.thinking);
|
|
201
|
+
}
|
|
202
|
+
if (((_b = event.data) == null ? void 0 : _b.type) === "OPENCODE_READY") {
|
|
203
|
+
sendThemeToIframe();
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
window.addEventListener("message", handleIframeMessage);
|
|
207
|
+
});
|
|
208
|
+
const handleToggle = (val) => __async(null, null, function* () {
|
|
209
|
+
if (serviceStatus.value === "idle" && val) {
|
|
210
|
+
loading.value = true;
|
|
211
|
+
const started = yield ensureServicesStarted();
|
|
212
|
+
loading.value = false;
|
|
213
|
+
if (!started) {
|
|
214
|
+
showNotification("\u670D\u52A1\u542F\u52A8\u5931\u8D25");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
open.value = val;
|
|
219
|
+
if (val) updateContext();
|
|
220
|
+
if (val) {
|
|
221
|
+
iframeLoading.value = false;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
const handleSelectNode = (element) => {
|
|
225
|
+
var _a;
|
|
226
|
+
const elementWithContext = __spreadProps(__spreadValues({}, element), {
|
|
227
|
+
previewPageUrl: window.location.href,
|
|
228
|
+
previewPageTitle: document.title
|
|
229
|
+
});
|
|
230
|
+
(_a = widgetRef.value) == null ? void 0 : _a.sendMessageToIframe("OPENCODE_INSERT_FILE_PART", { element: elementWithContext });
|
|
231
|
+
showNotification(`\u8282\u70B9\u5DF2\u6DFB\u52A0\u5230\u5BF9\u8BDD\u6846`, { mode: "page" });
|
|
232
|
+
};
|
|
233
|
+
const handleClearSelected = () => {
|
|
234
|
+
clearElements();
|
|
235
|
+
updateContext(true);
|
|
236
|
+
showNotification("\u5DF2\u6E05\u9664\u6240\u6709\u9009\u4E2D\u5143\u7D20");
|
|
237
|
+
};
|
|
238
|
+
const handleSelectModeChange = (val) => {
|
|
239
|
+
selectMode.value = val;
|
|
240
|
+
if (!val && !open.value) {
|
|
241
|
+
open.value = true;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const handleSessionListCollapsedChange = (val) => {
|
|
245
|
+
sessionListCollapsed.value = val;
|
|
246
|
+
};
|
|
247
|
+
const handleThemeChange = (val) => {
|
|
248
|
+
theme.value = val;
|
|
249
|
+
};
|
|
250
|
+
const handleRemoveSelectedNode = ({ index }) => {
|
|
251
|
+
removeElement(index);
|
|
252
|
+
updateContext(true);
|
|
253
|
+
};
|
|
254
|
+
const handleFrameLoaded = () => {
|
|
255
|
+
iframeLoading.value = false;
|
|
256
|
+
};
|
|
257
|
+
const __returned__ = { props, open, selectMode, sessionListCollapsed, loading, widgetRef, retryingWarmup, position, initialTheme, autoOpen, hotkey, widgetPosition, widgetTheme, showNotification, serviceStatus, chromeMcpFailed, chromeMcpErrorType, chromeMcpErrorMessage, thinking, loadingText, updateStatusFromTask, setStarting, setThinking, selectedElements, removeElement, clearElements, theme, sendThemeToIframe, sessions, loadingSessionList, currentSessionId, iframeSrc, iframeLoading, loadSessions, createSession, deleteSession, selectSession, updateContext, showSessionListSkeleton, computedLoading, retryWarmup, setupSSE, ensureServicesStarted, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
|
|
258
|
+
return OpenCodeWidget;
|
|
259
|
+
}, LoadingContent, ChromeWarmupError };
|
|
260
|
+
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
261
|
+
return __returned__;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx } from "vue";
|
|
265
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
266
|
+
return _openBlock(), _createBlock($setup["OpenCodeWidget"], {
|
|
267
|
+
ref: "widgetRef",
|
|
268
|
+
position: $setup.widgetPosition,
|
|
269
|
+
theme: $setup.theme,
|
|
270
|
+
open: $setup.open,
|
|
271
|
+
"select-mode": $setup.selectMode,
|
|
272
|
+
"session-list-collapsed": $setup.sessionListCollapsed,
|
|
273
|
+
"frame-loading": $setup.computedLoading,
|
|
274
|
+
"loading-session-list": $setup.loadingSessionList,
|
|
275
|
+
"show-session-list-skeleton": $setup.showSessionListSkeleton,
|
|
276
|
+
"show-error": $setup.chromeMcpFailed,
|
|
277
|
+
"iframe-src": $setup.iframeSrc,
|
|
278
|
+
"current-session-id": $setup.currentSessionId,
|
|
279
|
+
sessions: $setup.sessions,
|
|
280
|
+
"session-key": "id",
|
|
281
|
+
"hotkey-label": $setup.hotkey,
|
|
282
|
+
thinking: $setup.thinking,
|
|
283
|
+
"onUpdate:open": $setup.handleToggle,
|
|
284
|
+
"onUpdate:selectMode": $setup.handleSelectModeChange,
|
|
285
|
+
"onUpdate:sessionListCollapsed": $setup.handleSessionListCollapsedChange,
|
|
286
|
+
"onUpdate:theme": $setup.handleThemeChange,
|
|
287
|
+
onToggleTheme: $setup.handleThemeChange,
|
|
288
|
+
onCreateSession: $setup.createSession,
|
|
289
|
+
onDeleteSession: $setup.deleteSession,
|
|
290
|
+
onSelectSession: $setup.selectSession,
|
|
291
|
+
onClickSelectedNode: $setup.handleSelectNode,
|
|
292
|
+
onClearSelectedNodes: $setup.handleClearSelected,
|
|
293
|
+
onRemoveSelectedNode: $setup.handleRemoveSelectedNode,
|
|
294
|
+
onEmptyAction: $setup.createSession,
|
|
295
|
+
onFrameLoaded: $setup.handleFrameLoaded
|
|
296
|
+
}, {
|
|
297
|
+
loading: _withCtx(() => [
|
|
298
|
+
_createVNode($setup["LoadingContent"], { "loading-text": $setup.loadingText }, null, 8, ["loading-text"])
|
|
299
|
+
]),
|
|
300
|
+
error: _withCtx(() => [
|
|
301
|
+
$setup.chromeMcpFailed ? (_openBlock(), _createBlock($setup["ChromeWarmupError"], {
|
|
302
|
+
key: 0,
|
|
303
|
+
retrying: $setup.retryingWarmup,
|
|
304
|
+
"error-type": $setup.chromeMcpErrorType,
|
|
305
|
+
"error-message": $setup.chromeMcpErrorMessage,
|
|
306
|
+
onRetry: $setup.retryWarmup
|
|
307
|
+
}, null, 8, ["retrying", "error-type", "error-message"])) : _createCommentVNode("v-if", true)
|
|
308
|
+
]),
|
|
309
|
+
_: 1
|
|
310
|
+
/* STABLE */
|
|
311
|
+
}, 8, ["position", "theme", "open", "select-mode", "session-list-collapsed", "frame-loading", "loading-session-list", "show-session-list-skeleton", "show-error", "iframe-src", "current-session-id", "sessions", "hotkey-label", "thinking", "onCreateSession", "onDeleteSession", "onSelectSession", "onEmptyAction"]);
|
|
312
|
+
}
|
|
313
|
+
__vue_sfc__.render = __vue_render__;
|
|
314
|
+
var App_vue_default = __vue_sfc__;
|
|
315
|
+
export {
|
|
316
|
+
App_vue_default as default
|
|
317
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.opencode-chrome-warmup-error-details[data-v-798041da]{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}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
retrying: boolean;
|
|
3
|
+
errorType?: string;
|
|
4
|
+
errorMessage?: string;
|
|
5
|
+
};
|
|
6
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
retry: () => any;
|
|
8
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
+
onRetry?: (() => any) | undefined;
|
|
10
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import "./ChromeWarmupError-sfc.css";
|
|
2
|
+
import { defineComponent as _defineComponent } from "vue";
|
|
3
|
+
import { ChromeMcpWarmupErrorType } from "@vite-plugin-opencode-assistant/shared";
|
|
4
|
+
const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
5
|
+
__name: "ChromeWarmupError",
|
|
6
|
+
props: {
|
|
7
|
+
retrying: { type: Boolean, required: true },
|
|
8
|
+
errorType: { type: String, required: false },
|
|
9
|
+
errorMessage: { type: String, required: false }
|
|
10
|
+
},
|
|
11
|
+
emits: ["retry"],
|
|
12
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
13
|
+
__expose();
|
|
14
|
+
const emit = __emit;
|
|
15
|
+
const __returned__ = { emit, get ChromeMcpWarmupErrorType() {
|
|
16
|
+
return ChromeMcpWarmupErrorType;
|
|
17
|
+
} };
|
|
18
|
+
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
19
|
+
return __returned__;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
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";
|
|
23
|
+
const _hoisted_1 = { class: "opencode-chrome-warmup-failed" };
|
|
24
|
+
const _hoisted_2 = { class: "opencode-chrome-warmup-failed-text" };
|
|
25
|
+
const _hoisted_3 = { class: "opencode-chrome-warmup-error-details" };
|
|
26
|
+
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"];
|
|
31
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
32
|
+
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
33
|
+
_cache[9] || (_cache[9] = _createElementVNode(
|
|
34
|
+
"div",
|
|
35
|
+
{ class: "opencode-chrome-warmup-failed-icon" },
|
|
36
|
+
[
|
|
37
|
+
_createElementVNode("svg", {
|
|
38
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
39
|
+
fill: "none",
|
|
40
|
+
viewBox: "0 0 24 24",
|
|
41
|
+
width: "48",
|
|
42
|
+
height: "48",
|
|
43
|
+
stroke: "currentColor",
|
|
44
|
+
"stroke-width": "1.5"
|
|
45
|
+
}, [
|
|
46
|
+
_createElementVNode("path", {
|
|
47
|
+
"stroke-linecap": "round",
|
|
48
|
+
"stroke-linejoin": "round",
|
|
49
|
+
d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
|
|
50
|
+
})
|
|
51
|
+
])
|
|
52
|
+
],
|
|
53
|
+
-1
|
|
54
|
+
/* CACHED */
|
|
55
|
+
)),
|
|
56
|
+
_createCommentVNode(" Chrome \u8FDC\u7A0B\u8C03\u8BD5\u672A\u5F00\u542F "),
|
|
57
|
+
$props.errorType === $setup.ChromeMcpWarmupErrorType.CHROME_NOT_CONNECTED ? (_openBlock(), _createElementBlock(
|
|
58
|
+
_Fragment,
|
|
59
|
+
{ key: 0 },
|
|
60
|
+
[
|
|
61
|
+
_cache[1] || (_cache[1] = _createElementVNode(
|
|
62
|
+
"div",
|
|
63
|
+
{ class: "opencode-chrome-warmup-failed-title" },
|
|
64
|
+
"Chrome DevTools MCP \u8FDE\u63A5\u5931\u8D25",
|
|
65
|
+
-1
|
|
66
|
+
/* CACHED */
|
|
67
|
+
)),
|
|
68
|
+
_cache[2] || (_cache[2] = _createElementVNode(
|
|
69
|
+
"div",
|
|
70
|
+
{ class: "opencode-chrome-warmup-failed-text" },
|
|
71
|
+
[
|
|
72
|
+
_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, [
|
|
75
|
+
_createTextVNode(" \u5728 Chrome \u5730\u5740\u680F\u8F93\u5165 "),
|
|
76
|
+
_createElementVNode("code", { class: "opencode-chrome-warmup-code" }, "chrome://inspect/#remote-debugging")
|
|
77
|
+
]),
|
|
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")
|
|
81
|
+
])
|
|
82
|
+
],
|
|
83
|
+
-1
|
|
84
|
+
/* CACHED */
|
|
85
|
+
))
|
|
86
|
+
],
|
|
87
|
+
64
|
|
88
|
+
/* STABLE_FRAGMENT */
|
|
89
|
+
)) : $props.errorType === $setup.ChromeMcpWarmupErrorType.AI_TIMEOUT ? (_openBlock(), _createElementBlock(
|
|
90
|
+
_Fragment,
|
|
91
|
+
{ key: 1 },
|
|
92
|
+
[
|
|
93
|
+
_createCommentVNode(" AI \u54CD\u5E94\u8D85\u65F6 "),
|
|
94
|
+
_cache[3] || (_cache[3] = _createElementVNode(
|
|
95
|
+
"div",
|
|
96
|
+
{ class: "opencode-chrome-warmup-failed-title" },
|
|
97
|
+
"AI \u54CD\u5E94\u8D85\u65F6",
|
|
98
|
+
-1
|
|
99
|
+
/* CACHED */
|
|
100
|
+
)),
|
|
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
|
+
))
|
|
116
|
+
],
|
|
117
|
+
64
|
|
118
|
+
/* STABLE_FRAGMENT */
|
|
119
|
+
)) : $props.errorType === $setup.ChromeMcpWarmupErrorType.AI_RESPONSE_ERROR ? (_openBlock(), _createElementBlock(
|
|
120
|
+
_Fragment,
|
|
121
|
+
{ key: 2 },
|
|
122
|
+
[
|
|
123
|
+
_createCommentVNode(" AI \u54CD\u5E94\u9519\u8BEF "),
|
|
124
|
+
_cache[7] || (_cache[7] = _createElementVNode(
|
|
125
|
+
"div",
|
|
126
|
+
{ class: "opencode-chrome-warmup-failed-title" },
|
|
127
|
+
"AI \u54CD\u5E94\u9519\u8BEF",
|
|
128
|
+
-1
|
|
129
|
+
/* CACHED */
|
|
130
|
+
)),
|
|
131
|
+
_createElementVNode("div", _hoisted_2, [
|
|
132
|
+
_cache[5] || (_cache[5] = _createElementVNode(
|
|
133
|
+
"p",
|
|
134
|
+
null,
|
|
135
|
+
"AI \u6A21\u578B\u8FD4\u56DE\u4E86\u610F\u5916\u7684\u54CD\u5E94\uFF1A",
|
|
136
|
+
-1
|
|
137
|
+
/* CACHED */
|
|
138
|
+
)),
|
|
139
|
+
_createElementVNode(
|
|
140
|
+
"div",
|
|
141
|
+
_hoisted_3,
|
|
142
|
+
_toDisplayString($props.errorMessage || "\u672A\u77E5\u9519\u8BEF"),
|
|
143
|
+
1
|
|
144
|
+
/* TEXT */
|
|
145
|
+
),
|
|
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
|
+
))
|
|
153
|
+
])
|
|
154
|
+
],
|
|
155
|
+
64
|
|
156
|
+
/* STABLE_FRAGMENT */
|
|
157
|
+
)) : (_openBlock(), _createElementBlock(
|
|
158
|
+
_Fragment,
|
|
159
|
+
{ key: 3 },
|
|
160
|
+
[
|
|
161
|
+
_createCommentVNode(" \u5176\u4ED6\u9519\u8BEF "),
|
|
162
|
+
_cache[8] || (_cache[8] = _createElementVNode(
|
|
163
|
+
"div",
|
|
164
|
+
{ class: "opencode-chrome-warmup-failed-title" },
|
|
165
|
+
"Chrome DevTools MCP \u8FDE\u63A5\u5931\u8D25",
|
|
166
|
+
-1
|
|
167
|
+
/* CACHED */
|
|
168
|
+
)),
|
|
169
|
+
_createElementVNode("div", _hoisted_4, [
|
|
170
|
+
$props.errorMessage ? (_openBlock(), _createElementBlock(
|
|
171
|
+
"p",
|
|
172
|
+
_hoisted_5,
|
|
173
|
+
_toDisplayString($props.errorMessage),
|
|
174
|
+
1
|
|
175
|
+
/* TEXT */
|
|
176
|
+
)) : (_openBlock(), _createElementBlock("p", _hoisted_6, "\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"))
|
|
177
|
+
])
|
|
178
|
+
],
|
|
179
|
+
64
|
|
180
|
+
/* STABLE_FRAGMENT */
|
|
181
|
+
)),
|
|
182
|
+
_createElementVNode("div", _hoisted_7, [
|
|
183
|
+
_createElementVNode("button", {
|
|
184
|
+
class: "opencode-chrome-warmup-failed-btn primary",
|
|
185
|
+
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
|
+
])
|
|
189
|
+
]);
|
|
190
|
+
}
|
|
191
|
+
__vue_sfc__.render = __vue_render__;
|
|
192
|
+
__vue_sfc__.__scopeId = "data-v-798041da";
|
|
193
|
+
var ChromeWarmupError_vue_default = __vue_sfc__;
|
|
194
|
+
export {
|
|
195
|
+
ChromeWarmupError_vue_default as default
|
|
196
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
loadingText: string;
|
|
3
|
+
};
|
|
4
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defineComponent as _defineComponent } from "vue";
|
|
2
|
+
const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
3
|
+
__name: "LoadingContent",
|
|
4
|
+
props: {
|
|
5
|
+
loadingText: { type: String, required: true }
|
|
6
|
+
},
|
|
7
|
+
setup(__props, { expose: __expose }) {
|
|
8
|
+
__expose();
|
|
9
|
+
const __returned__ = {};
|
|
10
|
+
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
11
|
+
return __returned__;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue";
|
|
15
|
+
const _hoisted_1 = { class: "opencode-custom-loading" };
|
|
16
|
+
const _hoisted_2 = { class: "opencode-loading-text" };
|
|
17
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
18
|
+
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
19
|
+
_cache[0] || (_cache[0] = _createElementVNode(
|
|
20
|
+
"div",
|
|
21
|
+
{ class: "opencode-loading-spinner" },
|
|
22
|
+
null,
|
|
23
|
+
-1
|
|
24
|
+
/* CACHED */
|
|
25
|
+
)),
|
|
26
|
+
_createElementVNode(
|
|
27
|
+
"div",
|
|
28
|
+
_hoisted_2,
|
|
29
|
+
_toDisplayString($props.loadingText),
|
|
30
|
+
1
|
|
31
|
+
/* TEXT */
|
|
32
|
+
)
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
__vue_sfc__.render = __vue_render__;
|
|
36
|
+
var LoadingContent_vue_default = __vue_sfc__;
|
|
37
|
+
export {
|
|
38
|
+
LoadingContent_vue_default as default
|
|
39
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { OpenCodeSelectedElement, ServiceStatus } from "@vite-plugin-opencode-assistant/shared";
|
|
2
|
+
export declare function useContext(serviceStatus: {
|
|
3
|
+
value: ServiceStatus;
|
|
4
|
+
}, selectedElements: {
|
|
5
|
+
value: OpenCodeSelectedElement[];
|
|
6
|
+
}): {
|
|
7
|
+
updateContext: (force?: boolean) => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { onMounted, onUnmounted } from "vue";
|
|
2
|
+
function useContext(serviceStatus, selectedElements) {
|
|
3
|
+
let currentPageUrl = "";
|
|
4
|
+
let currentPageTitle = "";
|
|
5
|
+
const updateContext = (force = false) => {
|
|
6
|
+
if (serviceStatus.value === "idle") return;
|
|
7
|
+
const newUrl = window.location.href;
|
|
8
|
+
const newTitle = document.title;
|
|
9
|
+
if (force || newUrl !== currentPageUrl || newTitle !== currentPageTitle) {
|
|
10
|
+
currentPageUrl = newUrl;
|
|
11
|
+
currentPageTitle = newTitle;
|
|
12
|
+
fetch("/__opencode_context__", {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: { "Content-Type": "application/json" },
|
|
15
|
+
body: JSON.stringify({
|
|
16
|
+
url: newUrl,
|
|
17
|
+
title: newTitle,
|
|
18
|
+
selectedElements: selectedElements.value
|
|
19
|
+
})
|
|
20
|
+
}).catch(() => {
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const scheduleContextUpdate = () => {
|
|
25
|
+
requestAnimationFrame(() => updateContext());
|
|
26
|
+
};
|
|
27
|
+
let titleObserver = null;
|
|
28
|
+
const originalPushState = history.pushState;
|
|
29
|
+
const originalReplaceState = history.replaceState;
|
|
30
|
+
onMounted(() => {
|
|
31
|
+
history.pushState = function(...args) {
|
|
32
|
+
originalPushState.apply(this, args);
|
|
33
|
+
scheduleContextUpdate();
|
|
34
|
+
};
|
|
35
|
+
history.replaceState = function(...args) {
|
|
36
|
+
originalReplaceState.apply(this, args);
|
|
37
|
+
scheduleContextUpdate();
|
|
38
|
+
};
|
|
39
|
+
window.addEventListener("popstate", scheduleContextUpdate);
|
|
40
|
+
window.addEventListener("hashchange", scheduleContextUpdate);
|
|
41
|
+
titleObserver = new MutationObserver(() => {
|
|
42
|
+
if (document.title !== currentPageTitle) updateContext();
|
|
43
|
+
});
|
|
44
|
+
if (document.head) {
|
|
45
|
+
titleObserver.observe(document.head, { childList: true, subtree: true });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
onUnmounted(() => {
|
|
49
|
+
history.pushState = originalPushState;
|
|
50
|
+
history.replaceState = originalReplaceState;
|
|
51
|
+
window.removeEventListener("popstate", scheduleContextUpdate);
|
|
52
|
+
window.removeEventListener("hashchange", scheduleContextUpdate);
|
|
53
|
+
if (titleObserver) {
|
|
54
|
+
titleObserver.disconnect();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
updateContext
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
useContext
|
|
63
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface HotkeyConfig {
|
|
2
|
+
ctrl: boolean;
|
|
3
|
+
shift: boolean;
|
|
4
|
+
alt: boolean;
|
|
5
|
+
key: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseHotkey(hotkeyStr: string): HotkeyConfig;
|
|
8
|
+
export declare function matchHotkey(e: KeyboardEvent, hotkeyConfig: HotkeyConfig): boolean;
|
|
9
|
+
export declare function useHotkey(hotkeyStr: string, callback: (event: KeyboardEvent) => void): {
|
|
10
|
+
hotkeyConfig: HotkeyConfig;
|
|
11
|
+
};
|
|
12
|
+
export {};
|