vite-plugin-opencode-assistant 1.0.36 → 1.0.38

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/README.md CHANGED
@@ -4,14 +4,16 @@
4
4
 
5
5
  ## 它能做什么
6
6
 
7
- - **悬浮 AI 面板** - 在页面右下角注入悬浮按钮,点击展开 OpenCode 对话界面
7
+ - **悬浮 AI 面板** - 在页面右下角注入悬浮按钮,支持拖拽定位和边缘磁吸
8
8
  - **自动启动服务** - 自动启动本地 OpenCode Web 服务,无需手动操作
9
- - **智能会话管理** - 自动复用当前项目的会话,或创建新会话
9
+ - **智能会话管理** - 自动复用当前项目的会话,支持创建、切换、删除会话
10
+ - **实时状态显示** - 会话列表显示思考状态指示器,了解 AI 当前工作状态
10
11
  - **页面上下文同步** - 自动同步当前页面 URL、标题给 AI,SPA 路由切换时实时更新
11
12
  - **元素选择器** - 通过快捷键在页面上点选元素,将组件源码位置信息传给 AI
12
13
  - **主题同步** - 挂件主题与 OpenCode Web 主题实时同步
13
14
  - **代理服务** - 内置代理服务器解决 iframe 跨域限制,确保 OpenCode Web 功能完整
14
15
  - **Chrome DevTools 预热** - 启动时自动预热浏览器工具链,减少首次使用等待
16
+ - **日志查看** - 提供日志接口,方便 Agent 获取开发服务器输出
15
17
 
16
18
  ## 效果演示
17
19
 
@@ -77,10 +79,8 @@ export default defineConfig({
77
79
  webPort: 5097, // OpenCode Web 服务端口
78
80
  proxyPort: 6097, // 代理服务端口
79
81
  hostname: "127.0.0.1", // 服务绑定地址
80
- position: "bottom-right", // 悬浮按钮位置
81
82
  theme: "auto", // 主题: light | dark | auto
82
83
  open: false, // 是否自动展开面板
83
- autoReload: true, // 是否启用自动重载提示
84
84
  verbose: false, // 是否输出详细日志
85
85
  hotkey: "ctrl+k", // 切换面板的快捷键
86
86
  warmupChromeMcp: true, // 是否预热 Chrome DevTools MCP
@@ -111,21 +111,19 @@ npm run dev
111
111
 
112
112
  ## 配置项
113
113
 
114
- | 配置项 | 类型 | 默认值 | 说明 |
115
- | ----------------- | --------- | ---------------- | -------------------------------------------------------------------------- |
116
- | `enabled` | `boolean` | `true` | 是否启用插件 |
117
- | `webPort` | `number` | `5097` | OpenCode Web 服务端口,被占用时自动向后寻找可用端口 |
118
- | `proxyPort` | `number` | `6097` | 代理服务端口,用于解决 iframe 跨域限制 |
119
- | `hostname` | `string` | `"127.0.0.1"` | 服务绑定地址 |
120
- | `position` | `string` | `"bottom-right"` | 悬浮按钮位置:`bottom-right` \| `bottom-left` \| `top-right` \| `top-left` |
121
- | `theme` | `string` | `"auto"` | 挂件主题:`light` \| `dark` \| `auto`(跟随系统) |
122
- | `open` | `boolean` | `false` | 页面加载后是否自动展开面板 |
123
- | `autoReload` | `boolean` | `true` | 是否显示自动重载提示 |
124
- | `verbose` | `boolean` | `false` | 是否输出详细调试日志 |
125
- | `hotkey` | `string` | `"ctrl+k"` | 切换面板的快捷键,macOS 支持 `cmd+k` |
126
- | `warmupChromeMcp` | `boolean` | `true` | 启动后是否预热 Chrome DevTools MCP |
127
- | `language` | `string` | - | OpenCode 界面语言,如 `zh`、`en`、`ja` 等 |
128
- | `settings` | `object` | - | OpenCode 内部设置,详见下方说明 |
114
+ | 配置项 | 类型 | 默认值 | 说明 |
115
+ | ----------------- | --------- | ------------- | --------------------------------------------------- |
116
+ | `enabled` | `boolean` | `true` | 是否启用插件 |
117
+ | `webPort` | `number` | `5097` | OpenCode Web 服务端口,被占用时自动向后寻找可用端口 |
118
+ | `proxyPort` | `number` | `6097` | 代理服务端口,用于解决 iframe 跨域限制 |
119
+ | `hostname` | `string` | `"127.0.0.1"` | 服务绑定地址 |
120
+ | `theme` | `string` | `"auto"` | 挂件主题:`light` \| `dark` \| `auto`(跟随系统) |
121
+ | `open` | `boolean` | `false` | 页面加载后是否自动展开面板 |
122
+ | `verbose` | `boolean` | `false` | 是否输出详细调试日志 |
123
+ | `hotkey` | `string` | `"ctrl+k"` | 切换面板的快捷键,macOS 支持 `cmd+k` |
124
+ | `warmupChromeMcp` | `boolean` | `true` | 启动后是否预热 Chrome DevTools MCP |
125
+ | `language` | `string` | - | OpenCode 界面语言,如 `zh`、`en`、`ja`|
126
+ | `settings` | `object` | - | OpenCode 内部设置,详见下方说明 |
129
127
 
130
128
  ### OpenCode 设置
131
129
 
@@ -205,38 +203,18 @@ npm run dev
205
203
 
206
204
  **注意**:元素选择依赖 Vue Inspector,如果页面中没有可用的 Inspector,会提示无法使用该功能。
207
205
 
208
- ## 浏览器端 API
209
-
210
- 挂件在全局暴露 `window.OpenCodeWidget` 对象:
211
-
212
- ```js
213
- // 打开面板
214
- window.OpenCodeWidget.open();
215
-
216
- // 关闭面板
217
- window.OpenCodeWidget.close();
218
-
219
- // 切换面板
220
- window.OpenCodeWidget.toggle();
221
-
222
- // 显示通知
223
- window.OpenCodeWidget.showNotification("代码已更新!");
224
-
225
- // 手动同步上下文
226
- window.OpenCodeWidget.updateContext();
227
- ```
228
-
229
206
  ## 内部接口
230
207
 
231
208
  插件在 Vite 开发服务器上注册以下内部接口:
232
209
 
233
- | 路径 | 说明 |
234
- | ------------------------- | ---------------------------------- |
235
- | `/__opencode_widget__.js` | 浏览器端挂件脚本 |
236
- | `/__opencode_start__` | 服务启动状态与会话地址 |
237
- | `/__opencode_context__` | 页面上下文读写 |
238
- | `/__opencode_sessions__` | 会话查询、创建、删除 |
239
- | `/__opencode_events__` | SSE 事件流(会话就绪、节点清空等) |
210
+ | 路径 | 说明 |
211
+ | ------------------------- | ------------------------------------------ |
212
+ | `/__opencode_widget__.js` | 浏览器端挂件脚本 |
213
+ | `/__opencode_start__` | 服务启动状态与会话地址 |
214
+ | `/__opencode_context__` | 页面上下文读写 |
215
+ | `/__opencode_sessions__` | 会话查询、创建、删除 |
216
+ | `/__opencode_events__` | SSE 事件流(会话就绪、节点清空等) |
217
+ | `/__opencode_logs__` | 日志查询(OpenCode 进程输出、Vite 日志等) |
240
218
 
241
219
  ## 常见问题
242
220
 
@@ -56,6 +56,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
56
56
  config: { type: Object, required: true }
57
57
  },
58
58
  setup(__props, { expose: __expose }) {
59
+ var _a;
59
60
  __expose();
60
61
  const props = __props;
61
62
  const open = ref(false);
@@ -69,15 +70,18 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
69
70
  open: autoOpen = false,
70
71
  hotkey = "ctrl+k",
71
72
  proxyPort = 4098,
72
- proxyHost = "localhost"
73
+ proxyHost = "localhost",
74
+ displayMode = "bubble",
75
+ splitMode
73
76
  } = props.config;
74
77
  const widgetTheme = initialTheme;
78
+ const splitPanelWidth = ref((_a = splitMode == null ? void 0 : splitMode.width) != null ? _a : 500);
75
79
  const proxyBaseUrl = computed(() => {
76
80
  return `http://${proxyHost}:${proxyPort}`;
77
81
  });
78
82
  const showNotification = (msg, options) => {
79
- var _a, _b;
80
- (_b = (_a = widgetRef.value) == null ? void 0 : _a.showNotification) == null ? void 0 : _b.call(_a, msg, options);
83
+ var _a2, _b;
84
+ (_b = (_a2 = widgetRef.value) == null ? void 0 : _a2.showNotification) == null ? void 0 : _b.call(_a2, msg, options);
81
85
  };
82
86
  const {
83
87
  serviceStatus,
@@ -216,8 +220,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
216
220
  }, 1e3);
217
221
  }
218
222
  const handleIframeMessage = (event) => {
219
- var _a;
220
- if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") {
223
+ var _a2;
224
+ if (((_a2 = event.data) == null ? void 0 : _a2.type) === "OPENCODE_READY") {
221
225
  sendThemeToIframe();
222
226
  }
223
227
  };
@@ -240,12 +244,12 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
240
244
  }
241
245
  });
242
246
  const handleSelectNode = (element) => {
243
- var _a;
247
+ var _a2;
244
248
  const elementWithContext = __spreadProps(__spreadValues({}, element), {
245
249
  previewPageUrl: window.location.href,
246
250
  previewPageTitle: document.title
247
251
  });
248
- (_a = widgetRef.value) == null ? void 0 : _a.sendMessageToIframe("OPENCODE_INSERT_FILE_PART", {
252
+ (_a2 = widgetRef.value) == null ? void 0 : _a2.sendMessageToIframe("OPENCODE_INSERT_FILE_PART", {
249
253
  element: elementWithContext
250
254
  });
251
255
  showNotification(`\u8282\u70B9\u5DF2\u6DFB\u52A0\u5230\u5BF9\u8BDD\u6846`, { mode: "page" });
@@ -267,6 +271,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
267
271
  const handleThemeChange = (val) => {
268
272
  theme.value = val;
269
273
  };
274
+ const handleSplitPanelWidthChange = (val) => {
275
+ splitPanelWidth.value = val;
276
+ };
270
277
  const handleRemoveSelectedNode = ({ index }) => {
271
278
  removeElement(index);
272
279
  updateContext(true);
@@ -274,7 +281,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
274
281
  const handleFrameLoaded = () => {
275
282
  iframeLoading.value = false;
276
283
  };
277
- const __returned__ = { props, open, selectMode, sessionListCollapsed, loading, widgetRef, retryingWarmup, initialTheme, autoOpen, hotkey, proxyPort, proxyHost, widgetTheme, 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, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
284
+ 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, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleSplitPanelWidthChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
278
285
  return OpenCodeWidget;
279
286
  }, LoadingContent, ChromeWarmupError };
280
287
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
@@ -300,10 +307,14 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
300
307
  "session-key": "id",
301
308
  "hotkey-label": $setup.hotkey,
302
309
  thinking: $setup.thinking,
310
+ "display-mode": $setup.displayMode,
311
+ "split-mode": $setup.splitMode,
312
+ "split-panel-width": $setup.splitPanelWidth,
303
313
  "onUpdate:open": $setup.handleToggle,
304
314
  "onUpdate:selectMode": $setup.handleSelectModeChange,
305
315
  "onUpdate:sessionListCollapsed": $setup.handleSessionListCollapsedChange,
306
316
  "onUpdate:theme": $setup.handleThemeChange,
317
+ "onUpdate:splitPanelWidth": $setup.handleSplitPanelWidthChange,
307
318
  onToggleTheme: $setup.handleThemeChange,
308
319
  onCreateSession: $setup.createSession,
309
320
  onDeleteSession: $setup.deleteSession,
@@ -328,7 +339,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
328
339
  ]),
329
340
  _: 1
330
341
  /* STABLE */
331
- }, 8, ["theme", "open", "select-mode", "session-list-collapsed", "frame-loading", "loading-session-list", "show-session-list-skeleton", "show-error", "iframe-src", "current-session-id", "sessions", "session-states", "hotkey-label", "thinking", "onCreateSession", "onDeleteSession", "onSelectSession", "onEmptyAction"]);
342
+ }, 8, ["theme", "open", "select-mode", "session-list-collapsed", "frame-loading", "loading-session-list", "show-session-list-skeleton", "show-error", "iframe-src", "current-session-id", "sessions", "session-states", "hotkey-label", "thinking", "display-mode", "split-mode", "split-panel-width", "onCreateSession", "onDeleteSession", "onSelectSession", "onEmptyAction"]);
332
343
  }
333
344
  __vue_sfc__.render = __vue_render__;
334
345
  var App_vue_default = __vue_sfc__;
package/es/core/api.js CHANGED
@@ -119,10 +119,7 @@ class OpenCodeAPI {
119
119
  const sessions = yield this.createHttpRequest({
120
120
  hostname: this.hostname,
121
121
  port: this.getPort(),
122
- path: "/session",
123
- headers: {
124
- "x-opencode-directory": encodeURIComponent(projectDir)
125
- }
122
+ path: `/session?directory=${encodeURIComponent(projectDir)}`
126
123
  });
127
124
  const sessionsWithUrl = sessions.map((s) => __spreadProps(__spreadValues({}, s), {
128
125
  url: `http://${this.hostname}:${this.getProxyPort()}/${base64Encode(s.directory)}/session/${s.id}`
@@ -164,9 +161,7 @@ class OpenCodeAPI {
164
161
  port: this.getPort(),
165
162
  path: "/session",
166
163
  method: "POST",
167
- headers: __spreadProps(__spreadValues({}, requestBody ? { "Content-Type": "application/json" } : {}), {
168
- "x-opencode-directory": encodeURIComponent(projectDir)
169
- })
164
+ headers: __spreadValues({}, requestBody ? { "Content-Type": "application/json" } : {})
170
165
  },
171
166
  requestBody
172
167
  );
package/es/index.js CHANGED
@@ -181,7 +181,9 @@ function createOpenCodePlugin(options = {}) {
181
181
  open: config.open,
182
182
  hotkey: config.hotkey,
183
183
  proxyPort: actualProxyPort,
184
- proxyHost: config.hostname
184
+ proxyHost: config.hostname,
185
+ displayMode: config.displayMode,
186
+ splitMode: config.splitMode
185
187
  });
186
188
  timer.end();
187
189
  return html.replace("</body>", `${widget}</body>`);
@@ -87,6 +87,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
87
87
  config: { type: Object, required: true }
88
88
  },
89
89
  setup(__props, { expose: __expose }) {
90
+ var _a;
90
91
  __expose();
91
92
  const props = __props;
92
93
  const open = (0, import_vue2.ref)(false);
@@ -100,15 +101,18 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
100
101
  open: autoOpen = false,
101
102
  hotkey = "ctrl+k",
102
103
  proxyPort = 4098,
103
- proxyHost = "localhost"
104
+ proxyHost = "localhost",
105
+ displayMode = "bubble",
106
+ splitMode
104
107
  } = props.config;
105
108
  const widgetTheme = initialTheme;
109
+ const splitPanelWidth = (0, import_vue2.ref)((_a = splitMode == null ? void 0 : splitMode.width) != null ? _a : 500);
106
110
  const proxyBaseUrl = (0, import_vue2.computed)(() => {
107
111
  return `http://${proxyHost}:${proxyPort}`;
108
112
  });
109
113
  const showNotification = (msg, options) => {
110
- var _a, _b;
111
- (_b = (_a = widgetRef.value) == null ? void 0 : _a.showNotification) == null ? void 0 : _b.call(_a, msg, options);
114
+ var _a2, _b;
115
+ (_b = (_a2 = widgetRef.value) == null ? void 0 : _a2.showNotification) == null ? void 0 : _b.call(_a2, msg, options);
112
116
  };
113
117
  const {
114
118
  serviceStatus,
@@ -247,8 +251,8 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
247
251
  }, 1e3);
248
252
  }
249
253
  const handleIframeMessage = (event) => {
250
- var _a;
251
- if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") {
254
+ var _a2;
255
+ if (((_a2 = event.data) == null ? void 0 : _a2.type) === "OPENCODE_READY") {
252
256
  sendThemeToIframe();
253
257
  }
254
258
  };
@@ -271,12 +275,12 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
271
275
  }
272
276
  });
273
277
  const handleSelectNode = (element) => {
274
- var _a;
278
+ var _a2;
275
279
  const elementWithContext = __spreadProps(__spreadValues({}, element), {
276
280
  previewPageUrl: window.location.href,
277
281
  previewPageTitle: document.title
278
282
  });
279
- (_a = widgetRef.value) == null ? void 0 : _a.sendMessageToIframe("OPENCODE_INSERT_FILE_PART", {
283
+ (_a2 = widgetRef.value) == null ? void 0 : _a2.sendMessageToIframe("OPENCODE_INSERT_FILE_PART", {
280
284
  element: elementWithContext
281
285
  });
282
286
  showNotification(`\u8282\u70B9\u5DF2\u6DFB\u52A0\u5230\u5BF9\u8BDD\u6846`, { mode: "page" });
@@ -298,6 +302,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
298
302
  const handleThemeChange = (val) => {
299
303
  theme.value = val;
300
304
  };
305
+ const handleSplitPanelWidthChange = (val) => {
306
+ splitPanelWidth.value = val;
307
+ };
301
308
  const handleRemoveSelectedNode = ({ index }) => {
302
309
  removeElement(index);
303
310
  updateContext(true);
@@ -305,7 +312,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
305
312
  const handleFrameLoaded = () => {
306
313
  iframeLoading.value = false;
307
314
  };
308
- const __returned__ = { props, open, selectMode, sessionListCollapsed, loading, widgetRef, retryingWarmup, initialTheme, autoOpen, hotkey, proxyPort, proxyHost, widgetTheme, 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, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
315
+ 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, handleToggle, handleSelectNode, handleClearSelected, handleSelectModeChange, handleSessionListCollapsedChange, handleThemeChange, handleSplitPanelWidthChange, handleRemoveSelectedNode, handleFrameLoaded, get OpenCodeWidget() {
309
316
  return import_components.OpenCodeWidget;
310
317
  }, LoadingContent: import_LoadingContent_vue.default, ChromeWarmupError: import_ChromeWarmupError_vue.default };
311
318
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
@@ -330,10 +337,14 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
330
337
  "session-key": "id",
331
338
  "hotkey-label": $setup.hotkey,
332
339
  thinking: $setup.thinking,
340
+ "display-mode": $setup.displayMode,
341
+ "split-mode": $setup.splitMode,
342
+ "split-panel-width": $setup.splitPanelWidth,
333
343
  "onUpdate:open": $setup.handleToggle,
334
344
  "onUpdate:selectMode": $setup.handleSelectModeChange,
335
345
  "onUpdate:sessionListCollapsed": $setup.handleSessionListCollapsedChange,
336
346
  "onUpdate:theme": $setup.handleThemeChange,
347
+ "onUpdate:splitPanelWidth": $setup.handleSplitPanelWidthChange,
337
348
  onToggleTheme: $setup.handleThemeChange,
338
349
  onCreateSession: $setup.createSession,
339
350
  onDeleteSession: $setup.deleteSession,
@@ -358,7 +369,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
358
369
  ]),
359
370
  _: 1
360
371
  /* STABLE */
361
- }, 8, ["theme", "open", "select-mode", "session-list-collapsed", "frame-loading", "loading-session-list", "show-session-list-skeleton", "show-error", "iframe-src", "current-session-id", "sessions", "session-states", "hotkey-label", "thinking", "onCreateSession", "onDeleteSession", "onSelectSession", "onEmptyAction"]);
372
+ }, 8, ["theme", "open", "select-mode", "session-list-collapsed", "frame-loading", "loading-session-list", "show-session-list-skeleton", "show-error", "iframe-src", "current-session-id", "sessions", "session-states", "hotkey-label", "thinking", "display-mode", "split-mode", "split-panel-width", "onCreateSession", "onDeleteSession", "onSelectSession", "onEmptyAction"]);
362
373
  }
363
374
  __vue_sfc__.render = __vue_render__;
364
375
  var App_vue_default = __vue_sfc__;