@vite-plugin-opencode-assistant/components 1.0.37 → 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.
Files changed (47) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.js +1 -1
  3. package/es/open-code-widget/composables/use-persist-state.d.ts +2 -0
  4. package/es/open-code-widget/composables/use-persist-state.js +24 -9
  5. package/es/open-code-widget/composables/use-split.d.ts +24 -0
  6. package/es/open-code-widget/composables/use-split.js +90 -0
  7. package/es/open-code-widget/src/components/ChatPanel-sfc.css +1 -0
  8. package/es/open-code-widget/src/components/ChatPanel.vue.d.ts +180 -0
  9. package/es/open-code-widget/src/components/ChatPanel.vue.js +288 -0
  10. package/es/open-code-widget/src/components/Header.vue.js +13 -8
  11. package/es/open-code-widget/src/components/ResizeHandle-sfc.css +1 -0
  12. package/es/open-code-widget/src/components/ResizeHandle.vue.d.ts +19 -0
  13. package/es/open-code-widget/src/components/ResizeHandle.vue.js +91 -0
  14. package/es/open-code-widget/src/components/SplitTrigger-sfc.css +1 -0
  15. package/es/open-code-widget/src/components/SplitTrigger.vue.d.ts +17 -0
  16. package/es/open-code-widget/src/components/SplitTrigger.vue.js +130 -0
  17. package/es/open-code-widget/src/context.d.ts +1 -0
  18. package/es/open-code-widget/src/index-sfc.css +1 -1
  19. package/es/open-code-widget/src/index.vue.d.ts +16 -53
  20. package/es/open-code-widget/src/index.vue.js +150 -140
  21. package/es/open-code-widget/src/types.d.ts +1 -1
  22. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +806 -248
  23. package/lib/@vite-plugin-opencode-assistant/components.es.js +802 -244
  24. package/lib/components.css +5 -3
  25. package/lib/index.d.ts +1 -1
  26. package/lib/index.js +1 -1
  27. package/lib/open-code-widget/composables/use-persist-state.d.ts +2 -0
  28. package/lib/open-code-widget/composables/use-persist-state.js +24 -9
  29. package/lib/open-code-widget/composables/use-split.d.ts +24 -0
  30. package/lib/open-code-widget/composables/use-split.js +109 -0
  31. package/lib/open-code-widget/src/components/ChatPanel-sfc.css +1 -0
  32. package/lib/open-code-widget/src/components/ChatPanel.vue.d.ts +180 -0
  33. package/lib/open-code-widget/src/components/ChatPanel.vue.js +315 -0
  34. package/lib/open-code-widget/src/components/Header.vue.js +12 -7
  35. package/lib/open-code-widget/src/components/ResizeHandle-sfc.css +1 -0
  36. package/lib/open-code-widget/src/components/ResizeHandle.vue.d.ts +19 -0
  37. package/lib/open-code-widget/src/components/ResizeHandle.vue.js +108 -0
  38. package/lib/open-code-widget/src/components/SplitTrigger-sfc.css +1 -0
  39. package/lib/open-code-widget/src/components/SplitTrigger.vue.d.ts +17 -0
  40. package/lib/open-code-widget/src/components/SplitTrigger.vue.js +147 -0
  41. package/lib/open-code-widget/src/context.d.ts +1 -0
  42. package/lib/open-code-widget/src/index-sfc.css +1 -1
  43. package/lib/open-code-widget/src/index.vue.d.ts +16 -53
  44. package/lib/open-code-widget/src/index.vue.js +149 -139
  45. package/lib/open-code-widget/src/types.d.ts +1 -1
  46. package/lib/web-types.json +1 -1
  47. package/package.json +2 -2
@@ -4,22 +4,22 @@ Object.defineProperties(exports, {
4
4
  });
5
5
  //#region \0rolldown/runtime.js
6
6
  var __create = Object.create;
7
- var __defProp$3 = Object.defineProperty;
7
+ var __defProp$5 = Object.defineProperty;
8
8
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
9
  var __getOwnPropNames = Object.getOwnPropertyNames;
10
10
  var __getProtoOf = Object.getPrototypeOf;
11
- var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
11
+ var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
12
12
  var __copyProps = (to, from, except, desc) => {
13
13
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
14
14
  key = keys[i];
15
- if (!__hasOwnProp$3.call(to, key) && key !== except) __defProp$3(to, key, {
15
+ if (!__hasOwnProp$5.call(to, key) && key !== except) __defProp$5(to, key, {
16
16
  get: ((k) => from[k]).bind(null, key),
17
17
  enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
18
  });
19
19
  }
20
20
  return to;
21
21
  };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp$3(target, "default", {
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp$5(target, "default", {
23
23
  value: mod,
24
24
  enumerable: true
25
25
  }) : target, mod));
@@ -40,24 +40,24 @@ function useOpenCodeWidgetContext() {
40
40
  }
41
41
  //#endregion
42
42
  //#region es/open-code-widget/src/components/Frame.vue.js
43
- var __defProp$2 = Object.defineProperty;
44
- var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
45
- var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
46
- var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
47
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, {
43
+ var __defProp$4 = Object.defineProperty;
44
+ var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
45
+ var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
46
+ var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
47
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, {
48
48
  enumerable: true,
49
49
  configurable: true,
50
50
  writable: true,
51
51
  value
52
52
  }) : obj[key] = value;
53
- var __spreadValues$2 = (a, b) => {
54
- for (var prop in b || (b = {})) if (__hasOwnProp$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]);
55
- if (__getOwnPropSymbols$2) {
56
- for (var prop of __getOwnPropSymbols$2(b)) if (__propIsEnum$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]);
53
+ var __spreadValues$4 = (a, b) => {
54
+ for (var prop in b || (b = {})) if (__hasOwnProp$4.call(b, prop)) __defNormalProp$4(a, prop, b[prop]);
55
+ if (__getOwnPropSymbols$4) {
56
+ for (var prop of __getOwnPropSymbols$4(b)) if (__propIsEnum$4.call(b, prop)) __defNormalProp$4(a, prop, b[prop]);
57
57
  }
58
58
  return a;
59
59
  };
60
- var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
60
+ var __vue_sfc__$9 = /* @__PURE__ */ (0, vue.defineComponent)({
61
61
  __name: "Frame",
62
62
  setup(__props, { expose: __expose }) {
63
63
  const iframeRef = (0, vue.ref)(null);
@@ -65,7 +65,7 @@ var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
65
65
  function sendMessageToIframe(type, data) {
66
66
  var _a;
67
67
  if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
68
- iframeRef.value.contentWindow.postMessage(__spreadValues$2({ type }, data), "*");
68
+ iframeRef.value.contentWindow.postMessage(__spreadValues$4({ type }, data), "*");
69
69
  }
70
70
  (0, vue.onMounted)(() => {
71
71
  if (iframeRef.value) iframeRef.value.addEventListener("load", () => {
@@ -92,11 +92,11 @@ var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
92
92
  return __returned__;
93
93
  }
94
94
  });
95
- var _hoisted_1$6 = { class: "opencode-iframe-container" };
96
- var _hoisted_2$4 = { class: "opencode-empty-state-text" };
97
- var _hoisted_3$4 = ["src"];
98
- function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
99
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$6, [
95
+ var _hoisted_1$7 = { class: "opencode-iframe-container" };
96
+ var _hoisted_2$5 = { class: "opencode-empty-state-text" };
97
+ var _hoisted_3$5 = ["src"];
98
+ function __vue_render__$9(_ctx, _cache, $props, $setup, $data, $options) {
99
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$7, [
100
100
  (0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["opencode-empty-state-overlay", { visible: $setup.showEmptyState }]) }, [(0, vue.renderSlot)(_ctx.$slots, "empty-state", {}, () => [
101
101
  _cache[1] || (_cache[1] = (0, vue.createElementVNode)("div", { class: "opencode-empty-state-icon" }, [(0, vue.createElementVNode)("svg", {
102
102
  viewBox: "0 0 24 24",
@@ -111,7 +111,7 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
111
111
  "stroke-linejoin": "round",
112
112
  d: "M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 0 1-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"
113
113
  })])], -1)),
114
- (0, vue.createElementVNode)("div", _hoisted_2$4, (0, vue.toDisplayString)($setup.emptyStateText), 1),
114
+ (0, vue.createElementVNode)("div", _hoisted_2$5, (0, vue.toDisplayString)($setup.emptyStateText), 1),
115
115
  (0, vue.createElementVNode)("button", {
116
116
  class: "opencode-empty-state-btn",
117
117
  type: "button",
@@ -126,18 +126,18 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
126
126
  src: $setup.iframeSrc,
127
127
  allow: "clipboard-write; clipboard-read",
128
128
  referrerpolicy: "origin"
129
- }, null, 8, _hoisted_3$4)])
129
+ }, null, 8, _hoisted_3$5)])
130
130
  ]);
131
131
  }
132
- __vue_sfc__$7.render = __vue_render__$7;
133
- var Frame_vue_default = __vue_sfc__$7;
132
+ __vue_sfc__$9.render = __vue_render__$9;
133
+ var Frame_vue_default = __vue_sfc__$9;
134
134
  //#endregion
135
135
  //#region es/open-code-widget/src/components/Header.vue.js
136
- var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
136
+ var __vue_sfc__$8 = /* @__PURE__ */ (0, vue.defineComponent)({
137
137
  __name: "Header",
138
138
  setup(__props, { expose: __expose }) {
139
139
  __expose();
140
- const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock } = useOpenCodeWidgetContext();
140
+ const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock } = useOpenCodeWidgetContext();
141
141
  const __returned__ = {
142
142
  title,
143
143
  sessionListTitle,
@@ -148,12 +148,14 @@ var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
148
148
  resolvedTheme,
149
149
  minimized,
150
150
  promptDockVisible,
151
+ mode,
151
152
  handleToggleSessionList,
152
153
  handleToggleSelectMode,
153
154
  handleToggleTheme,
154
155
  handleClose,
155
156
  handleToggleMinimize,
156
157
  handleTogglePromptDock,
158
+ isSplitMode: (0, vue.computed)(() => mode.value === "split"),
157
159
  themeIconTitle: (0, vue.computed)(() => {
158
160
  return `\u4E3B\u9898: ${{
159
161
  auto: "自动",
@@ -176,16 +178,16 @@ var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
176
178
  return __returned__;
177
179
  }
178
180
  });
179
- var _hoisted_1$5 = { class: "opencode-chat-header" };
180
- var _hoisted_2$3 = { class: "opencode-chat-header-left" };
181
- var _hoisted_3$3 = [
181
+ var _hoisted_1$6 = { class: "opencode-chat-header" };
182
+ var _hoisted_2$4 = { class: "opencode-chat-header-left" };
183
+ var _hoisted_3$4 = [
182
184
  "title",
183
185
  "aria-label",
184
186
  "aria-expanded"
185
187
  ];
186
- var _hoisted_4$3 = ["aria-pressed", "disabled"];
187
- var _hoisted_5$3 = ["title", "aria-label"];
188
- var _hoisted_6$3 = {
188
+ var _hoisted_4$4 = ["aria-pressed", "disabled"];
189
+ var _hoisted_5$4 = ["title", "aria-label"];
190
+ var _hoisted_6$4 = {
189
191
  key: 0,
190
192
  viewBox: "0 0 24 24",
191
193
  width: "16",
@@ -205,7 +207,7 @@ var _hoisted_7$2 = {
205
207
  "stroke-width": "2",
206
208
  "aria-hidden": "true"
207
209
  };
208
- var _hoisted_8$2 = {
210
+ var _hoisted_8$1 = {
209
211
  key: 2,
210
212
  viewBox: "0 0 24 24",
211
213
  width: "16",
@@ -215,7 +217,7 @@ var _hoisted_8$2 = {
215
217
  "stroke-width": "2",
216
218
  "aria-hidden": "true"
217
219
  };
218
- var _hoisted_9$2 = { class: "opencode-chat-header-title" };
220
+ var _hoisted_9$1 = { class: "opencode-chat-header-title" };
219
221
  var _hoisted_10$1 = { class: "opencode-chat-header-actions" };
220
222
  var _hoisted_11 = [
221
223
  "title",
@@ -247,9 +249,9 @@ var _hoisted_14 = {
247
249
  "stroke-width": "2",
248
250
  "aria-hidden": "true"
249
251
  };
250
- function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
251
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [
252
- (0, vue.createElementVNode)("div", _hoisted_2$3, [
252
+ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
253
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$6, [
254
+ (0, vue.createElementVNode)("div", _hoisted_2$4, [
253
255
  (0, vue.createElementVNode)("button", {
254
256
  class: (0, vue.normalizeClass)(["opencode-header-btn session-toggle", { active: !$setup.sessionListCollapsed }]),
255
257
  type: "button",
@@ -268,7 +270,7 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
268
270
  }, [(0, vue.createElementVNode)("path", {
269
271
  d: "M4 6h16M4 12h16M4 18h16",
270
272
  "stroke-linecap": "round"
271
- })], -1))])], 10, _hoisted_3$3),
273
+ })], -1))])], 10, _hoisted_3$4),
272
274
  (0, vue.createElementVNode)("button", {
273
275
  class: (0, vue.normalizeClass)(["opencode-header-btn select-btn", { active: $setup.selectMode }]),
274
276
  type: "button",
@@ -288,18 +290,19 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
288
290
  }), (0, vue.createElementVNode)("path", {
289
291
  fill: "currentColor",
290
292
  d: "M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32"
291
- })], -1))])], 10, _hoisted_4$3),
293
+ })], -1))])], 10, _hoisted_4$4),
292
294
  (0, vue.createElementVNode)("button", {
293
295
  class: "opencode-header-btn theme-btn",
294
296
  type: "button",
295
297
  title: $setup.themeIconTitle,
296
298
  "aria-label": $setup.themeIconLabel,
297
299
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
298
- }, [(0, vue.renderSlot)(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_6$3, [..._cache[8] || (_cache[8] = [(0, vue.createStaticVNode)("<circle cx=\"12\" cy=\"12\" r=\"5\"></circle><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>", 9)])])) : $setup.theme === "dark" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_7$2, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_8$2, [..._cache[10] || (_cache[10] = [(0, vue.createStaticVNode)("<rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line><circle cx=\"12\" cy=\"10\" r=\"3\"></circle><path d=\"M7 7l2 2M17 7l-2 2M7 13l2-2M17 13l-2-2\"></path>", 5)])]))])], 8, _hoisted_5$3)
300
+ }, [(0, vue.renderSlot)(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_6$4, [..._cache[8] || (_cache[8] = [(0, vue.createStaticVNode)("<circle cx=\"12\" cy=\"12\" r=\"5\"></circle><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>", 9)])])) : $setup.theme === "dark" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_7$2, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_8$1, [..._cache[10] || (_cache[10] = [(0, vue.createStaticVNode)("<rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line><circle cx=\"12\" cy=\"10\" r=\"3\"></circle><path d=\"M7 7l2 2M17 7l-2 2M7 13l2-2M17 13l-2-2\"></path>", 5)])]))])], 8, _hoisted_5$4)
299
301
  ]),
300
- (0, vue.createElementVNode)("span", _hoisted_9$2, (0, vue.toDisplayString)($setup.title), 1),
302
+ (0, vue.createElementVNode)("span", _hoisted_9$1, (0, vue.toDisplayString)($setup.title), 1),
301
303
  (0, vue.createElementVNode)("div", _hoisted_10$1, [
302
- (0, vue.createElementVNode)("button", {
304
+ !$setup.isSplitMode ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
305
+ key: 0,
303
306
  class: "opencode-header-btn prompt-dock",
304
307
  type: "button",
305
308
  title: $setup.promptDockVisible ? "隐藏对话框" : "显示对话框",
@@ -314,16 +317,18 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
314
317
  stroke: "currentColor",
315
318
  "stroke-width": "2",
316
319
  "aria-hidden": "true"
317
- }, [(0, vue.createElementVNode)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })], -1))])], 8, _hoisted_11),
318
- (0, vue.createElementVNode)("button", {
320
+ }, [(0, vue.createElementVNode)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })], -1))])], 8, _hoisted_11)) : (0, vue.createCommentVNode)("v-if", true),
321
+ !$setup.isSplitMode ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
322
+ key: 1,
319
323
  class: "opencode-header-btn minimize",
320
324
  type: "button",
321
325
  title: $setup.minimized ? "展开" : "最小化",
322
326
  "aria-label": $setup.minimized ? "展开面板" : "最小化面板",
323
327
  "aria-pressed": $setup.minimized,
324
328
  onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
325
- }, [(0, vue.renderSlot)(_ctx.$slots, "minimize-icon", {}, () => [$setup.minimized ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_13, [..._cache[12] || (_cache[12] = [(0, vue.createElementVNode)("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_14, [..._cache[13] || (_cache[13] = [(0, vue.createElementVNode)("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])]))])], 8, _hoisted_12),
326
- (0, vue.createElementVNode)("button", {
329
+ }, [(0, vue.renderSlot)(_ctx.$slots, "minimize-icon", {}, () => [$setup.minimized ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_13, [..._cache[12] || (_cache[12] = [(0, vue.createElementVNode)("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_14, [..._cache[13] || (_cache[13] = [(0, vue.createElementVNode)("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])]))])], 8, _hoisted_12)) : (0, vue.createCommentVNode)("v-if", true),
330
+ !$setup.isSplitMode ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
331
+ key: 2,
327
332
  class: "opencode-header-btn close",
328
333
  type: "button",
329
334
  title: "关闭",
@@ -337,101 +342,15 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
337
342
  stroke: "currentColor",
338
343
  "stroke-width": "2",
339
344
  "aria-hidden": "true"
340
- }, [(0, vue.createElementVNode)("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])
345
+ }, [(0, vue.createElementVNode)("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])) : (0, vue.createCommentVNode)("v-if", true)
341
346
  ])
342
347
  ]);
343
348
  }
344
- __vue_sfc__$6.render = __vue_render__$6;
345
- var Header_vue_default = __vue_sfc__$6;
346
- //#endregion
347
- //#region es/open-code-widget/src/components/SelectHint.vue.js
348
- var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
349
- __name: "SelectHint",
350
- setup(__props, { expose: __expose }) {
351
- __expose();
352
- const { selectMode: visible, selectShortcutLabel: shortcutLabel } = useOpenCodeWidgetContext();
353
- const __returned__ = {
354
- visible,
355
- shortcutLabel
356
- };
357
- Object.defineProperty(__returned__, "__isScriptSetup", {
358
- enumerable: false,
359
- value: true
360
- });
361
- return __returned__;
362
- }
363
- });
364
- var _hoisted_1$4 = { class: "opencode-hint-shortcut" };
365
- function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
366
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), (0, vue.createElementVNode)("span", _hoisted_1$4, (0, vue.toDisplayString)($setup.shortcutLabel), 1)], 2);
367
- }
368
- __vue_sfc__$5.render = __vue_render__$5;
369
- var SelectHint_vue_default = __vue_sfc__$5;
370
- //#endregion
371
- //#region es/open-code-widget/src/components/SelectedNodes.vue.js
372
- var __vue_sfc__$4 = /* @__PURE__ */ (0, vue.defineComponent)({
373
- __name: "SelectedNodes",
374
- setup(__props, { expose: __expose }) {
375
- __expose();
376
- const { selectedElementItems: items, showClearAll, handleClickSelectedNode, handleRemoveSelectedNode, handleClearSelectedNodes } = useOpenCodeWidgetContext();
377
- const __returned__ = {
378
- items,
379
- showClearAll,
380
- handleClickSelectedNode,
381
- handleRemoveSelectedNode,
382
- handleClearSelectedNodes
383
- };
384
- Object.defineProperty(__returned__, "__isScriptSetup", {
385
- enumerable: false,
386
- value: true
387
- });
388
- return __returned__;
389
- }
390
- });
391
- var _hoisted_1$3 = {
392
- class: "opencode-selected-nodes",
393
- role: "list",
394
- "aria-label": "已选元素列表"
395
- };
396
- var _hoisted_2$2 = ["onClick"];
397
- var _hoisted_3$2 = { class: "opencode-node-content" };
398
- var _hoisted_4$2 = { class: "opencode-node-text" };
399
- var _hoisted_5$2 = { class: "opencode-node-file" };
400
- var _hoisted_6$2 = ["aria-label", "onClick"];
401
- function __vue_render__$4(_ctx, _cache, $props, $setup, $data, $options) {
402
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-right-toolbar", { collapsed: $setup.items.length === 0 }]) }, [
403
- _cache[1] || (_cache[1] = (0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-header" }, [(0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-title" }, "已选节点"), (0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-desc" }, "选中的节点会在对话时一起发送给助手")], -1)),
404
- (0, vue.createElementVNode)("div", _hoisted_1$3, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)($setup.items, (item, index) => {
405
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
406
- key: item.key,
407
- class: "opencode-selected-node",
408
- role: "listitem",
409
- onClick: ($event) => $setup.handleClickSelectedNode(item)
410
- }, [(0, vue.createElementVNode)("div", _hoisted_3$2, [(0, vue.createElementVNode)("span", _hoisted_4$2, (0, vue.toDisplayString)(item.description), 1), (0, vue.createElementVNode)("span", _hoisted_5$2, (0, vue.toDisplayString)(item.panelFileText), 1)]), (0, vue.createElementVNode)("button", {
411
- class: "opencode-node-remove",
412
- type: "button",
413
- "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
414
- onClick: (0, vue.withModifiers)(($event) => $setup.handleRemoveSelectedNode({
415
- item,
416
- index,
417
- source: "panel"
418
- }), ["stop"])
419
- }, " × ", 8, _hoisted_6$2)], 8, _hoisted_2$2);
420
- }), 128))]),
421
- $setup.showClearAll && $setup.items.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
422
- key: 0,
423
- class: "opencode-clear-all-btn",
424
- type: "button",
425
- "aria-label": "清空所有已选节点",
426
- onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleClearSelectedNodes && $setup.handleClearSelectedNodes(...args))
427
- }, " 一键清空 ")) : (0, vue.createCommentVNode)("v-if", true)
428
- ], 2);
429
- }
430
- __vue_sfc__$4.render = __vue_render__$4;
431
- var SelectedNodes_vue_default = __vue_sfc__$4;
349
+ __vue_sfc__$8.render = __vue_render__$8;
350
+ var Header_vue_default = __vue_sfc__$8;
432
351
  //#endregion
433
352
  //#region es/open-code-widget/src/components/SessionList.vue.js
434
- var __vue_sfc__$3 = /* @__PURE__ */ (0, vue.defineComponent)({
353
+ var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
435
354
  __name: "SessionList",
436
355
  setup(__props, { expose: __expose }) {
437
356
  __expose();
@@ -482,36 +401,36 @@ var __vue_sfc__$3 = /* @__PURE__ */ (0, vue.defineComponent)({
482
401
  return __returned__;
483
402
  }
484
403
  });
485
- var _hoisted_1$2 = {
404
+ var _hoisted_1$5 = {
486
405
  key: 0,
487
406
  class: "opencode-session-list-header"
488
407
  };
489
- var _hoisted_2$1 = {
408
+ var _hoisted_2$3 = {
490
409
  key: 2,
491
410
  class: "opencode-session-skeleton visible"
492
411
  };
493
- var _hoisted_3$1 = {
412
+ var _hoisted_3$3 = {
494
413
  class: "opencode-session-list-content",
495
414
  role: "listbox",
496
415
  "aria-labelledby": "opencode-session-list-title"
497
416
  };
498
- var _hoisted_4$1 = {
417
+ var _hoisted_4$3 = {
499
418
  key: 0,
500
419
  class: "opencode-session-list-loading-overlay"
501
420
  };
502
- var _hoisted_5$1 = ["aria-selected", "onClick"];
503
- var _hoisted_6$1 = { class: "opencode-session-header" };
421
+ var _hoisted_5$3 = ["aria-selected", "onClick"];
422
+ var _hoisted_6$3 = { class: "opencode-session-header" };
504
423
  var _hoisted_7$1 = { class: "opencode-session-title" };
505
- var _hoisted_8$1 = {
424
+ var _hoisted_8 = {
506
425
  key: 0,
507
426
  class: "opencode-thinking-loading"
508
427
  };
509
- var _hoisted_9$1 = ["aria-label", "onClick"];
428
+ var _hoisted_9 = ["aria-label", "onClick"];
510
429
  var _hoisted_10 = { class: "opencode-session-meta" };
511
- function __vue_render__$3(_ctx, _cache, $props, $setup, $data, $options) {
430
+ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
512
431
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-session-list", { collapsed: $setup.collapsed }]) }, [
513
432
  (0, vue.createCommentVNode)(" Header "),
514
- !$setup.showSkeleton ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$2, [_cache[1] || (_cache[1] = (0, vue.createElementVNode)("span", { id: "opencode-session-list-title" }, "会话列表", -1)), (0, vue.createElementVNode)("button", {
433
+ !$setup.showSkeleton ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [_cache[1] || (_cache[1] = (0, vue.createElementVNode)("span", { id: "opencode-session-list-title" }, "会话列表", -1)), (0, vue.createElementVNode)("button", {
515
434
  class: "opencode-new-session-btn",
516
435
  type: "button",
517
436
  title: "新建会话",
@@ -519,12 +438,12 @@ function __vue_render__$3(_ctx, _cache, $props, $setup, $data, $options) {
519
438
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleCreateSession && $setup.handleCreateSession(...args))
520
439
  }, " + ")])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createCommentVNode)(" Header Skeleton "), _cache[2] || (_cache[2] = (0, vue.createElementVNode)("div", { class: "opencode-session-header-skeleton visible" }, [(0, vue.createElementVNode)("div", { class: "opencode-skeleton-header-title" }), (0, vue.createElementVNode)("div", { class: "opencode-skeleton-header-btn" })], -1))], 2112)),
521
440
  (0, vue.createCommentVNode)(" Content Skeleton "),
522
- $setup.showSkeleton ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$1, [((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(5, (i) => {
441
+ $setup.showSkeleton ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2$3, [((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(5, (i) => {
523
442
  return (0, vue.createElementVNode)("div", {
524
443
  key: `skeleton-${i}`,
525
444
  class: "opencode-skeleton-item"
526
445
  }, [..._cache[3] || (_cache[3] = [(0, vue.createElementVNode)("div", { class: "opencode-skeleton-title" }, null, -1), (0, vue.createElementVNode)("div", { class: "opencode-skeleton-meta" }, null, -1)])]);
527
- }), 64))])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 3 }, [(0, vue.createCommentVNode)(" Content "), (0, vue.createElementVNode)("div", _hoisted_3$1, [$setup.loadingSessionList ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$1, [..._cache[4] || (_cache[4] = [(0, vue.createElementVNode)("div", { class: "opencode-loading-spinner small" }, null, -1)])])) : (0, vue.createCommentVNode)("v-if", true), $setup.sessions.length > 0 ? ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, (0, vue.renderList)($setup.sessions, (item) => {
446
+ }), 64))])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 3 }, [(0, vue.createCommentVNode)(" Content "), (0, vue.createElementVNode)("div", _hoisted_3$3, [$setup.loadingSessionList ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$3, [..._cache[4] || (_cache[4] = [(0, vue.createElementVNode)("div", { class: "opencode-loading-spinner small" }, null, -1)])])) : (0, vue.createCommentVNode)("v-if", true), $setup.sessions.length > 0 ? ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, (0, vue.renderList)($setup.sessions, (item) => {
528
447
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
529
448
  key: item[$setup.sessionKey],
530
449
  class: (0, vue.normalizeClass)(["opencode-session-item", {
@@ -534,17 +453,503 @@ function __vue_render__$3(_ctx, _cache, $props, $setup, $data, $options) {
534
453
  role: "option",
535
454
  "aria-selected": item.active,
536
455
  onClick: ($event) => $setup.handleSelectSession(item)
537
- }, [(0, vue.createElementVNode)("div", _hoisted_6$1, [(0, vue.createElementVNode)("div", _hoisted_7$1, [$setup.isSessionThinking(item.id) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$1)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(item.title), 1)]), (0, vue.createElementVNode)("button", {
456
+ }, [(0, vue.createElementVNode)("div", _hoisted_6$3, [(0, vue.createElementVNode)("div", _hoisted_7$1, [$setup.isSessionThinking(item.id) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8)) : (0, vue.createCommentVNode)("v-if", true), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)(item.title), 1)]), (0, vue.createElementVNode)("button", {
538
457
  class: "opencode-session-delete-btn",
539
458
  type: "button",
540
459
  "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
541
460
  onClick: (0, vue.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
542
- }, " × ", 8, _hoisted_9$1)]), (0, vue.createElementVNode)("div", _hoisted_10, (0, vue.toDisplayString)(item.meta), 1)], 10, _hoisted_5$1);
461
+ }, " × ", 8, _hoisted_9)]), (0, vue.createElementVNode)("div", _hoisted_10, (0, vue.toDisplayString)(item.meta), 1)], 10, _hoisted_5$3);
543
462
  }), 128)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, [(0, vue.createCommentVNode)(" Empty State "), (0, vue.renderSlot)(_ctx.$slots, "empty")], 64))])], 2112))
544
463
  ], 2);
545
464
  }
465
+ __vue_sfc__$7.render = __vue_render__$7;
466
+ var SessionList_vue_default = __vue_sfc__$7;
467
+ //#endregion
468
+ //#region es/open-code-widget/src/components/SelectedNodes.vue.js
469
+ var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
470
+ __name: "SelectedNodes",
471
+ setup(__props, { expose: __expose }) {
472
+ __expose();
473
+ const { selectedElementItems: items, showClearAll, handleClickSelectedNode, handleRemoveSelectedNode, handleClearSelectedNodes } = useOpenCodeWidgetContext();
474
+ const __returned__ = {
475
+ items,
476
+ showClearAll,
477
+ handleClickSelectedNode,
478
+ handleRemoveSelectedNode,
479
+ handleClearSelectedNodes
480
+ };
481
+ Object.defineProperty(__returned__, "__isScriptSetup", {
482
+ enumerable: false,
483
+ value: true
484
+ });
485
+ return __returned__;
486
+ }
487
+ });
488
+ var _hoisted_1$4 = {
489
+ class: "opencode-selected-nodes",
490
+ role: "list",
491
+ "aria-label": "已选元素列表"
492
+ };
493
+ var _hoisted_2$2 = ["onClick"];
494
+ var _hoisted_3$2 = { class: "opencode-node-content" };
495
+ var _hoisted_4$2 = { class: "opencode-node-text" };
496
+ var _hoisted_5$2 = { class: "opencode-node-file" };
497
+ var _hoisted_6$2 = ["aria-label", "onClick"];
498
+ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
499
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-right-toolbar", { collapsed: $setup.items.length === 0 }]) }, [
500
+ _cache[1] || (_cache[1] = (0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-header" }, [(0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-title" }, "已选节点"), (0, vue.createElementVNode)("div", { class: "opencode-selected-nodes-desc" }, "选中的节点会在对话时一起发送给助手")], -1)),
501
+ (0, vue.createElementVNode)("div", _hoisted_1$4, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)($setup.items, (item, index) => {
502
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
503
+ key: item.key,
504
+ class: "opencode-selected-node",
505
+ role: "listitem",
506
+ onClick: ($event) => $setup.handleClickSelectedNode(item)
507
+ }, [(0, vue.createElementVNode)("div", _hoisted_3$2, [(0, vue.createElementVNode)("span", _hoisted_4$2, (0, vue.toDisplayString)(item.description), 1), (0, vue.createElementVNode)("span", _hoisted_5$2, (0, vue.toDisplayString)(item.panelFileText), 1)]), (0, vue.createElementVNode)("button", {
508
+ class: "opencode-node-remove",
509
+ type: "button",
510
+ "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
511
+ onClick: (0, vue.withModifiers)(($event) => $setup.handleRemoveSelectedNode({
512
+ item,
513
+ index,
514
+ source: "panel"
515
+ }), ["stop"])
516
+ }, " × ", 8, _hoisted_6$2)], 8, _hoisted_2$2);
517
+ }), 128))]),
518
+ $setup.showClearAll && $setup.items.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
519
+ key: 0,
520
+ class: "opencode-clear-all-btn",
521
+ type: "button",
522
+ "aria-label": "清空所有已选节点",
523
+ onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleClearSelectedNodes && $setup.handleClearSelectedNodes(...args))
524
+ }, " 一键清空 ")) : (0, vue.createCommentVNode)("v-if", true)
525
+ ], 2);
526
+ }
527
+ __vue_sfc__$6.render = __vue_render__$6;
528
+ var SelectedNodes_vue_default = __vue_sfc__$6;
529
+ //#endregion
530
+ //#region es/open-code-widget/src/components/ResizeHandle.vue.js
531
+ var __defProp$3 = Object.defineProperty;
532
+ var __defProps$3 = Object.defineProperties;
533
+ var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
534
+ var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
535
+ var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
536
+ var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
537
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, {
538
+ enumerable: true,
539
+ configurable: true,
540
+ writable: true,
541
+ value
542
+ }) : obj[key] = value;
543
+ var __spreadValues$3 = (a, b) => {
544
+ for (var prop in b || (b = {})) if (__hasOwnProp$3.call(b, prop)) __defNormalProp$3(a, prop, b[prop]);
545
+ if (__getOwnPropSymbols$3) {
546
+ for (var prop of __getOwnPropSymbols$3(b)) if (__propIsEnum$3.call(b, prop)) __defNormalProp$3(a, prop, b[prop]);
547
+ }
548
+ return a;
549
+ };
550
+ var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
551
+ var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$3(__spreadValues$3({}, { name: "ResizeHandle" }), {
552
+ __name: "ResizeHandle",
553
+ props: {
554
+ width: {
555
+ type: Number,
556
+ required: true,
557
+ default: 500
558
+ },
559
+ minWidth: {
560
+ type: Number,
561
+ required: false,
562
+ default: 400
563
+ },
564
+ maxWidth: {
565
+ type: Number,
566
+ required: false,
567
+ default: 800
568
+ }
569
+ },
570
+ emits: [
571
+ "resize",
572
+ "resize-start",
573
+ "resize-end"
574
+ ],
575
+ setup(__props, { expose: __expose, emit: __emit }) {
576
+ __expose();
577
+ const props = __props;
578
+ const emit = __emit;
579
+ const isResizing = (0, vue.ref)(false);
580
+ const startX = (0, vue.ref)(0);
581
+ const startWidth = (0, vue.ref)(0);
582
+ const handleMouseDown = (e) => {
583
+ e.preventDefault();
584
+ isResizing.value = true;
585
+ startX.value = e.clientX;
586
+ startWidth.value = props.width;
587
+ emit("resize-start");
588
+ document.addEventListener("mousemove", handleMouseMove);
589
+ document.addEventListener("mouseup", handleMouseUp);
590
+ };
591
+ const handleMouseMove = (e) => {
592
+ if (!isResizing.value) return;
593
+ const deltaX = startX.value - e.clientX;
594
+ emit("resize", Math.max(props.minWidth, Math.min(props.maxWidth, startWidth.value + deltaX)));
595
+ };
596
+ const handleMouseUp = () => {
597
+ isResizing.value = false;
598
+ emit("resize-end");
599
+ document.removeEventListener("mousemove", handleMouseMove);
600
+ document.removeEventListener("mouseup", handleMouseUp);
601
+ };
602
+ const handleDoubleClick = () => {
603
+ emit("resize", 500);
604
+ };
605
+ (0, vue.onUnmounted)(() => {
606
+ document.removeEventListener("mousemove", handleMouseMove);
607
+ document.removeEventListener("mouseup", handleMouseUp);
608
+ });
609
+ const __returned__ = {
610
+ props,
611
+ emit,
612
+ isResizing,
613
+ startX,
614
+ startWidth,
615
+ handleMouseDown,
616
+ handleMouseMove,
617
+ handleMouseUp,
618
+ handleDoubleClick
619
+ };
620
+ Object.defineProperty(__returned__, "__isScriptSetup", {
621
+ enumerable: false,
622
+ value: true
623
+ });
624
+ return __returned__;
625
+ }
626
+ }));
627
+ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
628
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
629
+ class: (0, vue.normalizeClass)(["opencode-resize-handle", { resizing: $setup.isResizing }]),
630
+ onMousedown: $setup.handleMouseDown,
631
+ onDblclick: $setup.handleDoubleClick
632
+ }, null, 34);
633
+ }
634
+ __vue_sfc__$5.render = __vue_render__$5;
635
+ var ResizeHandle_vue_default = __vue_sfc__$5;
636
+ //#endregion
637
+ //#region es/open-code-widget/src/components/ChatPanel.vue.js
638
+ var __defProp$2 = Object.defineProperty;
639
+ var __defProps$2 = Object.defineProperties;
640
+ var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
641
+ var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
642
+ var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
643
+ var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
644
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, {
645
+ enumerable: true,
646
+ configurable: true,
647
+ writable: true,
648
+ value
649
+ }) : obj[key] = value;
650
+ var __spreadValues$2 = (a, b) => {
651
+ for (var prop in b || (b = {})) if (__hasOwnProp$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]);
652
+ if (__getOwnPropSymbols$2) {
653
+ for (var prop of __getOwnPropSymbols$2(b)) if (__propIsEnum$2.call(b, prop)) __defNormalProp$2(a, prop, b[prop]);
654
+ }
655
+ return a;
656
+ };
657
+ var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
658
+ var __vue_sfc__$4 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$2(__spreadValues$2({}, { name: "ChatPanel" }), {
659
+ __name: "ChatPanel",
660
+ props: {
661
+ mode: {
662
+ type: String,
663
+ required: false,
664
+ default: "bubble"
665
+ },
666
+ open: {
667
+ type: Boolean,
668
+ required: false,
669
+ default: false
670
+ },
671
+ minimized: {
672
+ type: Boolean,
673
+ required: false,
674
+ default: false
675
+ },
676
+ positionStyle: {
677
+ type: Object,
678
+ required: false,
679
+ default: () => ({})
680
+ },
681
+ animationOrigin: {
682
+ type: Object,
683
+ required: false,
684
+ default: () => ({
685
+ x: "20px",
686
+ y: "20px"
687
+ })
688
+ },
689
+ panelWidth: {
690
+ type: Number,
691
+ required: false,
692
+ default: 500
693
+ },
694
+ resizable: {
695
+ type: Boolean,
696
+ required: false,
697
+ default: true
698
+ },
699
+ minWidth: {
700
+ type: Number,
701
+ required: false,
702
+ default: 400
703
+ },
704
+ maxWidth: {
705
+ type: Number,
706
+ required: false,
707
+ default: 800
708
+ },
709
+ noTransition: {
710
+ type: Boolean,
711
+ required: false,
712
+ default: false
713
+ },
714
+ dragging: {
715
+ type: Boolean,
716
+ required: false,
717
+ default: false
718
+ },
719
+ notificationVisible: {
720
+ type: Boolean,
721
+ required: false,
722
+ default: false
723
+ },
724
+ notificationMessage: {
725
+ type: String,
726
+ required: false,
727
+ default: ""
728
+ },
729
+ notificationMode: {
730
+ type: String,
731
+ required: false,
732
+ default: "widget"
733
+ },
734
+ thinking: {
735
+ type: Boolean,
736
+ required: false,
737
+ default: false
738
+ },
739
+ resolvedTheme: {
740
+ type: String,
741
+ required: false,
742
+ default: "light"
743
+ }
744
+ },
745
+ emits: [
746
+ "resize",
747
+ "resize-start",
748
+ "resize-end",
749
+ "toggle"
750
+ ],
751
+ setup(__props, { expose: __expose, emit: __emit }) {
752
+ (0, vue.useCssVars)((_ctx) => ({
753
+ "-animationOrigin.x": _ctx.animationOrigin.x,
754
+ "-animationOrigin.y": _ctx.animationOrigin.y
755
+ }));
756
+ const props = __props;
757
+ const emit = __emit;
758
+ const slots = (0, vue.useSlots)();
759
+ const frameRef = (0, vue.ref)(null);
760
+ const sendMessageToIframe = (type, data) => {
761
+ var _a;
762
+ (_a = frameRef.value) == null || _a.sendMessageToIframe(type, data);
763
+ };
764
+ __expose({
765
+ sendMessageToIframe,
766
+ frameRef
767
+ });
768
+ const handleResizeStart = () => {
769
+ emit("resize-start");
770
+ };
771
+ const handleResize = (width) => {
772
+ emit("resize", width);
773
+ };
774
+ const handleResizeEnd = () => {
775
+ emit("resize-end");
776
+ };
777
+ const handleToggle = () => {
778
+ emit("toggle");
779
+ };
780
+ const __returned__ = {
781
+ props,
782
+ emit,
783
+ slots,
784
+ frameRef,
785
+ sendMessageToIframe,
786
+ handleResizeStart,
787
+ handleResize,
788
+ handleResizeEnd,
789
+ handleToggle,
790
+ panelStyle: (0, vue.computed)(() => {
791
+ if (props.mode === "split") return { width: `${props.panelWidth}px` };
792
+ return props.positionStyle;
793
+ }),
794
+ panelClasses: (0, vue.computed)(() => ["opencode-chat", {
795
+ open: props.open,
796
+ minimized: props.minimized,
797
+ dragging: props.dragging,
798
+ "no-transition": props.noTransition,
799
+ "split-mode": props.mode === "split"
800
+ }]),
801
+ Frame: Frame_vue_default,
802
+ Header: Header_vue_default,
803
+ SessionList: SessionList_vue_default,
804
+ SelectedNodes: SelectedNodes_vue_default,
805
+ ResizeHandle: ResizeHandle_vue_default
806
+ };
807
+ Object.defineProperty(__returned__, "__isScriptSetup", {
808
+ enumerable: false,
809
+ value: true
810
+ });
811
+ return __returned__;
812
+ }
813
+ }));
814
+ var _hoisted_1$3 = ["aria-expanded"];
815
+ var _hoisted_2$1 = { class: "opencode-split-toggle-icon" };
816
+ var _hoisted_3$1 = {
817
+ key: 0,
818
+ viewBox: "0 0 24 24",
819
+ width: "16",
820
+ height: "16",
821
+ fill: "none",
822
+ stroke: "currentColor",
823
+ "stroke-width": "2"
824
+ };
825
+ var _hoisted_4$1 = {
826
+ key: 1,
827
+ viewBox: "0 0 24 24",
828
+ width: "16",
829
+ height: "16",
830
+ fill: "none",
831
+ stroke: "currentColor",
832
+ "stroke-width": "2"
833
+ };
834
+ var _hoisted_5$1 = {
835
+ key: 2,
836
+ class: "opencode-notification",
837
+ role: "alert"
838
+ };
839
+ var _hoisted_6$1 = { class: "opencode-chat-content" };
840
+ function __vue_render__$4(_ctx, _cache, $props, $setup, $data, $options) {
841
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
842
+ class: (0, vue.normalizeClass)($setup.panelClasses),
843
+ style: (0, vue.normalizeStyle)($setup.panelStyle)
844
+ }, [
845
+ $props.mode === "split" && $props.resizable && $props.open ? ((0, vue.openBlock)(), (0, vue.createBlock)($setup["ResizeHandle"], {
846
+ key: 0,
847
+ width: $props.panelWidth,
848
+ "min-width": $props.minWidth,
849
+ "max-width": $props.maxWidth,
850
+ onResize: $setup.handleResize,
851
+ onResizeStart: $setup.handleResizeStart,
852
+ onResizeEnd: $setup.handleResizeEnd
853
+ }, null, 8, [
854
+ "width",
855
+ "min-width",
856
+ "max-width"
857
+ ])) : (0, vue.createCommentVNode)("v-if", true),
858
+ $props.mode === "split" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
859
+ key: 1,
860
+ type: "button",
861
+ class: (0, vue.normalizeClass)(["opencode-split-toggle-btn", {
862
+ open: $setup.props.open,
863
+ thinking: $setup.props.thinking,
864
+ "opencode-theme-dark": $props.resolvedTheme === "dark"
865
+ }]),
866
+ "aria-expanded": $props.open,
867
+ "aria-label": "切换面板",
868
+ onClick: $setup.handleToggle
869
+ }, [(0, vue.createElementVNode)("span", _hoisted_2$1, [$props.open ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_3$1, [..._cache[0] || (_cache[0] = [(0, vue.createElementVNode)("path", {
870
+ d: "M9 18l6-6-6-6",
871
+ "stroke-linecap": "round",
872
+ "stroke-linejoin": "round"
873
+ }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_4$1, [..._cache[1] || (_cache[1] = [(0, vue.createElementVNode)("path", {
874
+ d: "M15 18l-6-6 6-6",
875
+ "stroke-linecap": "round",
876
+ "stroke-linejoin": "round"
877
+ }, null, -1)])]))])], 10, _hoisted_1$3)) : (0, vue.createCommentVNode)("v-if", true),
878
+ (0, vue.createVNode)($setup["Header"], null, (0, vue.createSlots)({ _: 2 }, [
879
+ $setup.slots["session-toggle-icon"] ? {
880
+ name: "session-toggle-icon",
881
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "session-toggle-icon")]),
882
+ key: "0"
883
+ } : void 0,
884
+ $setup.slots["select-icon"] ? {
885
+ name: "select-icon",
886
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "select-icon")]),
887
+ key: "1"
888
+ } : void 0,
889
+ $setup.slots["close-icon"] ? {
890
+ name: "close-icon",
891
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "close-icon")]),
892
+ key: "2"
893
+ } : void 0
894
+ ]), 1024),
895
+ $props.notificationVisible && $props.notificationMode === "widget" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5$1, (0, vue.toDisplayString)($props.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true),
896
+ (0, vue.createElementVNode)("div", _hoisted_6$1, [
897
+ (0, vue.createVNode)($setup["SessionList"], null, {
898
+ empty: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [_cache[2] || (_cache[2] = (0, vue.createElementVNode)("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
899
+ _: 3
900
+ }),
901
+ (0, vue.createVNode)($setup["Frame"], { ref: "frameRef" }, (0, vue.createSlots)({ _: 2 }, [
902
+ $setup.slots["empty-state"] ? {
903
+ name: "empty-state",
904
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "empty-state")]),
905
+ key: "0"
906
+ } : void 0,
907
+ $setup.slots.loading ? {
908
+ name: "loading",
909
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "loading")]),
910
+ key: "1"
911
+ } : void 0,
912
+ $setup.slots.error ? {
913
+ name: "error",
914
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "error")]),
915
+ key: "2"
916
+ } : void 0,
917
+ $setup.slots.content ? {
918
+ name: "content",
919
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "content")]),
920
+ key: "3"
921
+ } : void 0
922
+ ]), 1536),
923
+ (0, vue.createVNode)($setup["SelectedNodes"])
924
+ ])
925
+ ], 6);
926
+ }
927
+ __vue_sfc__$4.render = __vue_render__$4;
928
+ var ChatPanel_vue_default = __vue_sfc__$4;
929
+ //#endregion
930
+ //#region es/open-code-widget/src/components/SelectHint.vue.js
931
+ var __vue_sfc__$3 = /* @__PURE__ */ (0, vue.defineComponent)({
932
+ __name: "SelectHint",
933
+ setup(__props, { expose: __expose }) {
934
+ __expose();
935
+ const { selectMode: visible, selectShortcutLabel: shortcutLabel } = useOpenCodeWidgetContext();
936
+ const __returned__ = {
937
+ visible,
938
+ shortcutLabel
939
+ };
940
+ Object.defineProperty(__returned__, "__isScriptSetup", {
941
+ enumerable: false,
942
+ value: true
943
+ });
944
+ return __returned__;
945
+ }
946
+ });
947
+ var _hoisted_1$2 = { class: "opencode-hint-shortcut" };
948
+ function __vue_render__$3(_ctx, _cache, $props, $setup, $data, $options) {
949
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), (0, vue.createElementVNode)("span", _hoisted_1$2, (0, vue.toDisplayString)($setup.shortcutLabel), 1)], 2);
950
+ }
546
951
  __vue_sfc__$3.render = __vue_render__$3;
547
- var SessionList_vue_default = __vue_sfc__$3;
952
+ var SelectHint_vue_default = __vue_sfc__$3;
548
953
  //#endregion
549
954
  //#region es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js
550
955
  var __defProp$1 = Object.defineProperty;
@@ -1579,27 +1984,33 @@ function usePersistState(options) {
1579
1984
  if (options.onRestore) options.onRestore(saved || {});
1580
1985
  return saved;
1581
1986
  };
1582
- const getCurrentState = () => ({
1583
- open: options.open.value,
1584
- minimized: options.minimized.value,
1585
- promptDockVisible: options.promptDockVisible.value,
1586
- bubbleOffset: options.bubbleOffset.value,
1587
- theme: options.theme.value,
1588
- sessionListCollapsed: options.sessionListCollapsed.value
1589
- });
1987
+ const getCurrentState = () => {
1988
+ var _a;
1989
+ return {
1990
+ open: options.open.value,
1991
+ minimized: options.minimized.value,
1992
+ promptDockVisible: options.promptDockVisible.value,
1993
+ bubbleOffset: options.bubbleOffset.value,
1994
+ theme: options.theme.value,
1995
+ sessionListCollapsed: options.sessionListCollapsed.value,
1996
+ splitPanelWidth: (_a = options.splitPanelWidth) == null ? void 0 : _a.value
1997
+ };
1998
+ };
1590
1999
  const persistState = () => {
1591
2000
  saveState(getCurrentState());
1592
2001
  };
2002
+ const watchers = [
2003
+ options.open,
2004
+ options.minimized,
2005
+ options.promptDockVisible,
2006
+ options.bubbleOffset,
2007
+ options.theme,
2008
+ options.sessionListCollapsed
2009
+ ];
2010
+ if (options.splitPanelWidth) watchers.push(options.splitPanelWidth);
1593
2011
  (0, vue.onMounted)(() => {
1594
2012
  restoreState();
1595
- (0, vue.watch)([
1596
- options.open,
1597
- options.minimized,
1598
- options.promptDockVisible,
1599
- options.bubbleOffset,
1600
- options.theme,
1601
- options.sessionListCollapsed
1602
- ], () => {
2013
+ (0, vue.watch)(watchers, () => {
1603
2014
  persistState();
1604
2015
  }, { deep: true });
1605
2016
  });
@@ -1609,6 +2020,85 @@ function usePersistState(options) {
1609
2020
  };
1610
2021
  }
1611
2022
  //#endregion
2023
+ //#region es/open-code-widget/composables/use-split.js
2024
+ var AUTO_MODE_THRESHOLD = 1440;
2025
+ function useSplitMode(options) {
2026
+ const windowWidth = (0, vue.ref)(typeof window !== "undefined" ? window.innerWidth : 0);
2027
+ const splitConfig = (0, vue.computed)(() => {
2028
+ var _a, _b, _c, _d, _e, _f;
2029
+ const config = options.splitMode.value || {};
2030
+ return {
2031
+ width: (_a = config.width) != null ? _a : 500,
2032
+ minWidth: (_b = config.minWidth) != null ? _b : 400,
2033
+ maxWidth: (_c = config.maxWidth) != null ? _c : 800,
2034
+ resizable: (_d = config.resizable) != null ? _d : true,
2035
+ shrinkPage: (_e = config.shrinkPage) != null ? _e : true,
2036
+ defaultOpen: (_f = config.defaultOpen) != null ? _f : true
2037
+ };
2038
+ });
2039
+ const panelWidth = (0, vue.ref)(splitConfig.value.width);
2040
+ const effectiveMode = (0, vue.computed)(() => {
2041
+ if (options.displayMode.value === "bubble") return "bubble";
2042
+ if (options.displayMode.value === "split") return "split";
2043
+ return windowWidth.value >= AUTO_MODE_THRESHOLD ? "split" : "bubble";
2044
+ });
2045
+ const isSplitMode = (0, vue.computed)(() => effectiveMode.value === "split");
2046
+ const handleResize = (width) => {
2047
+ var _a;
2048
+ panelWidth.value = width;
2049
+ (_a = options.onWidthChange) == null || _a.call(options, width);
2050
+ };
2051
+ const handleToggle = () => {
2052
+ var _a;
2053
+ const nextOpen = !options.open.value;
2054
+ (_a = options.onOpenChange) == null || _a.call(options, nextOpen);
2055
+ };
2056
+ const handleWindowResize = () => {
2057
+ if (typeof window !== "undefined") windowWidth.value = window.innerWidth;
2058
+ };
2059
+ const updateBodyClass = () => {
2060
+ if (typeof document === "undefined") return;
2061
+ if (isSplitMode.value && options.open.value && splitConfig.value.shrinkPage) {
2062
+ document.body.classList.add("has-opencode-split");
2063
+ document.body.style.setProperty("--opencode-split-width", `${panelWidth.value}px`);
2064
+ } else {
2065
+ document.body.classList.remove("has-opencode-split");
2066
+ document.body.style.removeProperty("--opencode-split-width");
2067
+ }
2068
+ };
2069
+ (0, vue.watch)([
2070
+ isSplitMode,
2071
+ options.open,
2072
+ panelWidth
2073
+ ], updateBodyClass, { immediate: true });
2074
+ (0, vue.watch)(splitConfig, (config) => {
2075
+ if (panelWidth.value < config.minWidth) panelWidth.value = config.minWidth;
2076
+ if (panelWidth.value > config.maxWidth) panelWidth.value = config.maxWidth;
2077
+ });
2078
+ (0, vue.onMounted)(() => {
2079
+ var _a;
2080
+ if (typeof window !== "undefined") {
2081
+ window.addEventListener("resize", handleWindowResize);
2082
+ if (isSplitMode.value && splitConfig.value.defaultOpen && !options.open.value) (_a = options.onOpenChange) == null || _a.call(options, true);
2083
+ }
2084
+ });
2085
+ (0, vue.onUnmounted)(() => {
2086
+ if (typeof window !== "undefined") {
2087
+ window.removeEventListener("resize", handleWindowResize);
2088
+ document.body.classList.remove("has-opencode-split");
2089
+ document.body.style.removeProperty("--opencode-split-width");
2090
+ }
2091
+ });
2092
+ return {
2093
+ effectiveMode,
2094
+ isSplitMode,
2095
+ panelWidth,
2096
+ splitConfig,
2097
+ handleResize,
2098
+ handleToggle
2099
+ };
2100
+ }
2101
+ //#endregion
1612
2102
  //#region es/open-code-widget/src/index.vue.js
1613
2103
  var __defProp = Object.defineProperty;
1614
2104
  var __defProps = Object.defineProperties;
@@ -1745,6 +2235,21 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1745
2235
  sessionStates: {
1746
2236
  type: Object,
1747
2237
  required: false
2238
+ },
2239
+ displayMode: {
2240
+ type: String,
2241
+ required: false,
2242
+ default: "bubble"
2243
+ },
2244
+ splitMode: {
2245
+ type: Object,
2246
+ required: false,
2247
+ default: void 0
2248
+ },
2249
+ splitPanelWidth: {
2250
+ type: Number,
2251
+ required: false,
2252
+ default: 500
1748
2253
  }
1749
2254
  },
1750
2255
  emits: [
@@ -1755,6 +2260,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1755
2260
  "update:selectedElements",
1756
2261
  "update:theme",
1757
2262
  "update:thinking",
2263
+ "update:splitPanelWidth",
1758
2264
  "toggle",
1759
2265
  "close",
1760
2266
  "toggle-session-list",
@@ -1768,7 +2274,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1768
2274
  "clear-selected-nodes",
1769
2275
  "empty-action",
1770
2276
  "frame-loaded",
1771
- "thinking-change"
2277
+ "thinking-change",
2278
+ "split-panel-width-change"
1772
2279
  ],
1773
2280
  setup(__props, { expose: __expose, emit: __emit }) {
1774
2281
  (0, vue.useCssVars)((_ctx) => ({
@@ -1821,6 +2328,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1821
2328
  const promptDockVisible = (0, vue.ref)(true);
1822
2329
  const isRestoring = (0, vue.ref)(true);
1823
2330
  const iframeLoaded = (0, vue.ref)(false);
2331
+ const splitPanelWidth = (0, vue.ref)(props.splitPanelWidth);
1824
2332
  const syncStateToIframe = () => {
1825
2333
  if (!iframeLoaded.value) return;
1826
2334
  sendMessageToIframe("prompt-dock-visibility-change", { visible: promptDockVisible.value });
@@ -1839,6 +2347,9 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1839
2347
  (0, vue.watch)(() => props.sessionListCollapsed, (val) => {
1840
2348
  localSessionListCollapsed.value = val;
1841
2349
  });
2350
+ (0, vue.watch)(() => props.splitPanelWidth, (val) => {
2351
+ splitPanelWidth.value = val;
2352
+ });
1842
2353
  const { buttonActive, containerClasses, iframeSource, sessionListTitle, resolvedTheme, handleClose, handleEmptyAction, handleToggle, handleToggleSessionList, handleToggleTheme } = useWidget({
1843
2354
  theme: (0, vue.toRef)(props, "theme"),
1844
2355
  open: (0, vue.toRef)(props, "open"),
@@ -1911,6 +2422,20 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1911
2422
  }
1912
2423
  });
1913
2424
  const bubbleOffset = (0, vue.ref)(void 0);
2425
+ const { effectiveMode, isSplitMode, panelWidth, splitConfig, handleResize, handleToggle: handleSplitToggle } = useSplitMode({
2426
+ displayMode: (0, vue.toRef)(props, "displayMode"),
2427
+ splitMode: (0, vue.toRef)(props, "splitMode"),
2428
+ open: (0, vue.toRef)(props, "open"),
2429
+ onOpenChange: (nextOpen) => {
2430
+ emit("update:open", nextOpen);
2431
+ emit("toggle", nextOpen);
2432
+ },
2433
+ onWidthChange: (width) => {
2434
+ splitPanelWidth.value = width;
2435
+ emit("update:splitPanelWidth", width);
2436
+ emit("split-panel-width-change", width);
2437
+ }
2438
+ });
1914
2439
  usePersistState({
1915
2440
  open: (0, vue.toRef)(props, "open"),
1916
2441
  minimized,
@@ -1918,6 +2443,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1918
2443
  bubbleOffset,
1919
2444
  theme: (0, vue.toRef)(props, "theme"),
1920
2445
  sessionListCollapsed: localSessionListCollapsed,
2446
+ splitPanelWidth,
1921
2447
  onRestore: (state) => {
1922
2448
  if (state.open !== void 0 && state.open !== props.open) {
1923
2449
  emit("update:open", state.open);
@@ -2034,6 +2560,12 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2034
2560
  const handleBubbleOffsetChange = (offset) => {
2035
2561
  bubbleOffset.value = offset;
2036
2562
  };
2563
+ const handleResizeStart = () => {
2564
+ isDragging.value = true;
2565
+ };
2566
+ const handleResizeEnd = () => {
2567
+ isDragging.value = false;
2568
+ };
2037
2569
  const chatAnimationOrigin = (0, vue.computed)(() => {
2038
2570
  switch (bubbleQuadrant.value) {
2039
2571
  case "top-left": return {
@@ -2088,6 +2620,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2088
2620
  minimized,
2089
2621
  promptDockVisible,
2090
2622
  bubbleOffset,
2623
+ mode: effectiveMode,
2091
2624
  sessionStates: (0, vue.computed)(() => {
2092
2625
  var _a;
2093
2626
  return (_a = props.sessionStates) != null ? _a : {};
@@ -2149,6 +2682,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2149
2682
  promptDockVisible,
2150
2683
  isRestoring,
2151
2684
  iframeLoaded,
2685
+ splitPanelWidth,
2152
2686
  syncStateToIframe,
2153
2687
  handleFrameLoaded,
2154
2688
  buttonActive,
@@ -2178,6 +2712,12 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2178
2712
  tooltipStyle,
2179
2713
  tooltipContent,
2180
2714
  bubbleOffset,
2715
+ effectiveMode,
2716
+ isSplitMode,
2717
+ panelWidth,
2718
+ splitConfig,
2719
+ handleResize,
2720
+ handleSplitToggle,
2181
2721
  handleToggleMinimize,
2182
2722
  handleTogglePromptDock,
2183
2723
  windowWidth,
@@ -2187,6 +2727,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2187
2727
  isBubbleOnRightSide,
2188
2728
  chatPositionStyle,
2189
2729
  handleBubbleOffsetChange,
2730
+ handleResizeStart,
2731
+ handleResizeEnd,
2190
2732
  chatAnimationOrigin,
2191
2733
  isDragging,
2192
2734
  get wasOpenBeforeDrag() {
@@ -2197,11 +2739,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2197
2739
  },
2198
2740
  handleDragStart,
2199
2741
  handleDragEnd,
2200
- Frame: Frame_vue_default,
2201
- Header: Header_vue_default,
2742
+ ChatPanel: ChatPanel_vue_default,
2202
2743
  SelectHint: SelectHint_vue_default,
2203
- SelectedNodes: SelectedNodes_vue_default,
2204
- SessionList: SessionList_vue_default,
2205
2744
  Trigger: Trigger_vue_default
2206
2745
  };
2207
2746
  Object.defineProperty(__returned__, "__isScriptSetup", {
@@ -2211,33 +2750,28 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
2211
2750
  return __returned__;
2212
2751
  }
2213
2752
  }));
2214
- var _hoisted_1 = {
2215
- key: 0,
2216
- class: "opencode-notification",
2217
- role: "alert"
2218
- };
2219
- var _hoisted_2 = { class: "opencode-chat-content" };
2220
- var _hoisted_3 = { class: "opencode-tooltip-tag" };
2221
- var _hoisted_4 = { class: "opencode-tooltip-file" };
2222
- var _hoisted_5 = {
2223
- key: 0,
2753
+ var _hoisted_1 = { class: "opencode-tooltip-tag" };
2754
+ var _hoisted_2 = { class: "opencode-tooltip-file" };
2755
+ var _hoisted_3 = {
2756
+ key: 1,
2224
2757
  class: "opencode-dialog-overlay"
2225
2758
  };
2226
- var _hoisted_6 = {
2759
+ var _hoisted_4 = {
2227
2760
  class: "opencode-dialog",
2228
2761
  role: "alertdialog",
2229
2762
  "aria-modal": "true"
2230
2763
  };
2231
- var _hoisted_7 = { class: "opencode-dialog-content" };
2232
- var _hoisted_8 = { class: "opencode-dialog-message" };
2233
- var _hoisted_9 = {
2764
+ var _hoisted_5 = { class: "opencode-dialog-content" };
2765
+ var _hoisted_6 = { class: "opencode-dialog-message" };
2766
+ var _hoisted_7 = {
2234
2767
  key: 0,
2235
2768
  class: "opencode-page-notification",
2236
2769
  role: "alert"
2237
2770
  };
2238
2771
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
2239
2772
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)($setup.containerClasses) }, [
2240
- (0, vue.createVNode)($setup["Trigger"], {
2773
+ !$setup.isSplitMode ? ((0, vue.openBlock)(), (0, vue.createBlock)($setup["Trigger"], {
2774
+ key: 0,
2241
2775
  ref: "triggerRef",
2242
2776
  onDragStart: $setup.handleDragStart,
2243
2777
  onDragEnd: $setup.handleDragEnd
@@ -2245,64 +2779,88 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
2245
2779
  name: "default",
2246
2780
  fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "button-icon")]),
2247
2781
  key: "0"
2248
- } : void 0]), 1536),
2249
- (0, vue.withDirectives)((0, vue.createElementVNode)("div", {
2250
- class: (0, vue.normalizeClass)(["opencode-chat", {
2251
- open: $props.open,
2252
- minimized: $setup.minimized,
2253
- dragging: $setup.isDragging,
2254
- "no-transition": $setup.isRestoring
2255
- }]),
2256
- style: (0, vue.normalizeStyle)($setup.chatPositionStyle)
2782
+ } : void 0]), 1536)) : (0, vue.createCommentVNode)("v-if", true),
2783
+ (0, vue.createVNode)($setup["ChatPanel"], {
2784
+ ref: "frameRef",
2785
+ mode: $setup.effectiveMode,
2786
+ open: $props.open,
2787
+ minimized: $setup.minimized,
2788
+ "position-style": $setup.chatPositionStyle,
2789
+ "animation-origin": $setup.chatAnimationOrigin,
2790
+ "panel-width": $setup.panelWidth,
2791
+ resizable: $setup.splitConfig.resizable,
2792
+ "min-width": $setup.splitConfig.minWidth,
2793
+ "max-width": $setup.splitConfig.maxWidth,
2794
+ "no-transition": $setup.isRestoring,
2795
+ dragging: $setup.isDragging,
2796
+ "notification-visible": $setup.notificationVisible,
2797
+ "notification-message": $setup.notificationMessage,
2798
+ "notification-mode": $setup.notificationMode,
2799
+ thinking: $props.thinking,
2800
+ "resolved-theme": $setup.resolvedTheme,
2801
+ onResize: $setup.handleResize,
2802
+ onResizeStart: $setup.handleResizeStart,
2803
+ onResizeEnd: $setup.handleResizeEnd,
2804
+ onToggle: $setup.handleSplitToggle
2805
+ }, (0, vue.createSlots)({
2806
+ "sessions-empty": (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
2807
+ _: 2
2257
2808
  }, [
2258
- (0, vue.createVNode)($setup["Header"], null, (0, vue.createSlots)({ _: 2 }, [
2259
- $setup.slots["session-toggle-icon"] ? {
2260
- name: "session-toggle-icon",
2261
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "session-toggle-icon")]),
2262
- key: "0"
2263
- } : void 0,
2264
- $setup.slots["select-icon"] ? {
2265
- name: "select-icon",
2266
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "select-icon")]),
2267
- key: "1"
2268
- } : void 0,
2269
- $setup.slots["close-icon"] ? {
2270
- name: "close-icon",
2271
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "close-icon")]),
2272
- key: "2"
2273
- } : void 0
2274
- ]), 1024),
2275
- $setup.notificationVisible && $setup.notificationMode === "widget" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true),
2276
- (0, vue.createElementVNode)("div", _hoisted_2, [
2277
- (0, vue.createVNode)($setup["SessionList"], null, {
2278
- empty: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
2279
- _: 3
2280
- }),
2281
- (0, vue.createVNode)($setup["Frame"], { ref: "frameRef" }, (0, vue.createSlots)({ _: 2 }, [
2282
- $setup.slots["empty-state"] ? {
2283
- name: "empty-state",
2284
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "empty-state")]),
2285
- key: "0"
2286
- } : void 0,
2287
- $setup.slots.loading ? {
2288
- name: "loading",
2289
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "loading")]),
2290
- key: "1"
2291
- } : void 0,
2292
- $setup.slots.error ? {
2293
- name: "error",
2294
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "error")]),
2295
- key: "2"
2296
- } : void 0,
2297
- $setup.slots.content ? {
2298
- name: "content",
2299
- fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "content")]),
2300
- key: "3"
2301
- } : void 0
2302
- ]), 1536),
2303
- (0, vue.createVNode)($setup["SelectedNodes"])
2304
- ])
2305
- ], 6), [[vue.vShow, !$props.selectMode]]),
2809
+ $setup.slots["session-toggle-icon"] ? {
2810
+ name: "session-toggle-icon",
2811
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "session-toggle-icon")]),
2812
+ key: "0"
2813
+ } : void 0,
2814
+ $setup.slots["select-icon"] ? {
2815
+ name: "select-icon",
2816
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "select-icon")]),
2817
+ key: "1"
2818
+ } : void 0,
2819
+ $setup.slots["close-icon"] ? {
2820
+ name: "close-icon",
2821
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "close-icon")]),
2822
+ key: "2"
2823
+ } : void 0,
2824
+ $setup.slots["empty-state"] ? {
2825
+ name: "empty-state",
2826
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "empty-state")]),
2827
+ key: "3"
2828
+ } : void 0,
2829
+ $setup.slots.loading ? {
2830
+ name: "loading",
2831
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "loading")]),
2832
+ key: "4"
2833
+ } : void 0,
2834
+ $setup.slots.error ? {
2835
+ name: "error",
2836
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "error")]),
2837
+ key: "5"
2838
+ } : void 0,
2839
+ $setup.slots.content ? {
2840
+ name: "content",
2841
+ fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "content")]),
2842
+ key: "6"
2843
+ } : void 0
2844
+ ]), 1032, [
2845
+ "mode",
2846
+ "open",
2847
+ "minimized",
2848
+ "position-style",
2849
+ "animation-origin",
2850
+ "panel-width",
2851
+ "resizable",
2852
+ "min-width",
2853
+ "max-width",
2854
+ "no-transition",
2855
+ "dragging",
2856
+ "notification-visible",
2857
+ "notification-message",
2858
+ "notification-mode",
2859
+ "thinking",
2860
+ "resolved-theme",
2861
+ "onResize",
2862
+ "onToggle"
2863
+ ]),
2306
2864
  (0, vue.createVNode)($setup["SelectHint"]),
2307
2865
  (0, vue.withDirectives)((0, vue.createElementVNode)("div", {
2308
2866
  class: "opencode-element-highlight",
@@ -2311,15 +2869,15 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
2311
2869
  (0, vue.withDirectives)((0, vue.createElementVNode)("div", {
2312
2870
  class: "opencode-element-tooltip",
2313
2871
  style: (0, vue.normalizeStyle)($setup.tooltipStyle)
2314
- }, [(0, vue.createElementVNode)("div", _hoisted_3, (0, vue.toDisplayString)($setup.tooltipContent.description), 1), (0, vue.createElementVNode)("div", _hoisted_4, (0, vue.toDisplayString)($setup.tooltipContent.fileInfo), 1)], 4), [[vue.vShow, $setup.tooltipVisible]]),
2315
- $setup.dialogVisible ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_5, [(0, vue.createElementVNode)("div", _hoisted_6, [(0, vue.createElementVNode)("div", _hoisted_7, [(0, vue.createElementVNode)("div", _hoisted_8, (0, vue.toDisplayString)($setup.dialogMessage), 1)]), (0, vue.createElementVNode)("div", { class: "opencode-dialog-actions" }, [(0, vue.createElementVNode)("button", {
2872
+ }, [(0, vue.createElementVNode)("div", _hoisted_1, (0, vue.toDisplayString)($setup.tooltipContent.description), 1), (0, vue.createElementVNode)("div", _hoisted_2, (0, vue.toDisplayString)($setup.tooltipContent.fileInfo), 1)], 4), [[vue.vShow, $setup.tooltipVisible]]),
2873
+ $setup.dialogVisible ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3, [(0, vue.createElementVNode)("div", _hoisted_4, [(0, vue.createElementVNode)("div", _hoisted_5, [(0, vue.createElementVNode)("div", _hoisted_6, (0, vue.toDisplayString)($setup.dialogMessage), 1)]), (0, vue.createElementVNode)("div", { class: "opencode-dialog-actions" }, [(0, vue.createElementVNode)("button", {
2316
2874
  class: "opencode-dialog-btn cancel",
2317
2875
  onClick: $setup.handleDialogCancel
2318
2876
  }, "取消"), (0, vue.createElementVNode)("button", {
2319
2877
  class: "opencode-dialog-btn confirm",
2320
2878
  onClick: $setup.handleDialogConfirm
2321
2879
  }, "确认")])])])) : (0, vue.createCommentVNode)("v-if", true),
2322
- ((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, { to: "body" }, [$setup.notificationVisible && $setup.notificationMode === "page" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_9, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true)]))
2880
+ ((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, { to: "body" }, [$setup.notificationVisible && $setup.notificationMode === "page" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_7, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true)]))
2323
2881
  ], 2);
2324
2882
  }
2325
2883
  __vue_sfc__.render = __vue_render__;
@@ -2328,7 +2886,7 @@ __vue_sfc__.render = __vue_render__;
2328
2886
  var open_code_widget_default = __vue_sfc__;
2329
2887
  //#endregion
2330
2888
  //#region es/index.js
2331
- var version = "1.0.37";
2889
+ var version = "1.0.38";
2332
2890
  function install(app, options) {
2333
2891
  [open_code_widget_default].forEach((item) => {
2334
2892
  if (item.install) app.use(item, options);