@aipanel/ui 1.2.10 → 1.2.12

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 (51) hide show
  1. package/es/AI-panel-widget/composables/use-inspector.mjs +4 -4
  2. package/es/AI-panel-widget/composables/use-selection.mjs +4 -4
  3. package/es/AI-panel-widget/composables/use-session.mjs +16 -5
  4. package/es/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -1
  5. package/es/AI-panel-widget/src/components/ChatPanel.vue.d.ts +3 -0
  6. package/es/AI-panel-widget/src/components/ChatPanel.vue.mjs +13 -4
  7. package/es/AI-panel-widget/src/components/Frame-sfc.css +1 -1
  8. package/es/AI-panel-widget/src/components/Header-sfc.css +1 -1
  9. package/es/AI-panel-widget/src/components/Header.vue.mjs +14 -5
  10. package/es/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -1
  11. package/es/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -1
  12. package/es/AI-panel-widget/src/components/SelectedBubbles.vue.mjs +1 -1
  13. package/es/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -1
  14. package/es/AI-panel-widget/src/components/SessionList-sfc.css +1 -1
  15. package/es/AI-panel-widget/src/components/SessionList.vue.mjs +135 -37
  16. package/es/AI-panel-widget/src/context.d.ts +5 -1
  17. package/es/AI-panel-widget/src/index-sfc.css +1 -1
  18. package/es/AI-panel-widget/src/index.vue.d.ts +3 -1
  19. package/es/AI-panel-widget/src/index.vue.mjs +43 -9
  20. package/es/AI-panel-widget/src/types.d.ts +1 -1
  21. package/es/index.d.ts +1 -1
  22. package/es/index.mjs +1 -1
  23. package/lib/AI-panel-widget/composables/use-inspector.cjs +4 -4
  24. package/lib/AI-panel-widget/composables/use-selection.cjs +4 -4
  25. package/lib/AI-panel-widget/composables/use-session.cjs +16 -5
  26. package/lib/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -1
  27. package/lib/AI-panel-widget/src/components/ChatPanel.vue.cjs +13 -4
  28. package/lib/AI-panel-widget/src/components/ChatPanel.vue.d.ts +3 -0
  29. package/lib/AI-panel-widget/src/components/Frame-sfc.css +1 -1
  30. package/lib/AI-panel-widget/src/components/Header-sfc.css +1 -1
  31. package/lib/AI-panel-widget/src/components/Header.vue.cjs +14 -5
  32. package/lib/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -1
  33. package/lib/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -1
  34. package/lib/AI-panel-widget/src/components/SelectedBubbles.vue.cjs +1 -1
  35. package/lib/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -1
  36. package/lib/AI-panel-widget/src/components/SessionList-sfc.css +1 -1
  37. package/lib/AI-panel-widget/src/components/SessionList.vue.cjs +134 -36
  38. package/lib/AI-panel-widget/src/context.d.ts +5 -1
  39. package/lib/AI-panel-widget/src/index-sfc.css +1 -1
  40. package/lib/AI-panel-widget/src/index.vue.cjs +43 -9
  41. package/lib/AI-panel-widget/src/index.vue.d.ts +3 -1
  42. package/lib/AI-panel-widget/src/types.d.ts +1 -1
  43. package/lib/index.cjs +1 -1
  44. package/lib/index.d.ts +1 -1
  45. package/package.json +2 -2
  46. package/es/AI-panel-widget/src/components/SplitTrigger-sfc.css +0 -1
  47. package/es/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +0 -18
  48. package/es/AI-panel-widget/src/components/SplitTrigger.vue.mjs +0 -112
  49. package/lib/AI-panel-widget/src/components/SplitTrigger-sfc.css +0 -1
  50. package/lib/AI-panel-widget/src/components/SplitTrigger.vue.cjs +0 -131
  51. package/lib/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +0 -18
@@ -54,15 +54,56 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
54
54
  if (showSessionListSkeleton.value) return true;
55
55
  return false;
56
56
  });
57
- function isSessionThinking(sessionId) {
58
- if (!sessionStates?.value || !sessionId) return false;
59
- return sessionStates.value[sessionId]?.thinking ?? false;
57
+ const ONGOING_CELLS = [
58
+ { x: 0, y: 0, delay: "-1000ms" },
59
+ { x: 4, y: 0, delay: "-875ms" },
60
+ { x: 8, y: 0, delay: "-750ms" },
61
+ { x: 8, y: 4, delay: "-625ms" },
62
+ { x: 8, y: 8, delay: "-500ms" },
63
+ { x: 4, y: 8, delay: "-375ms" },
64
+ { x: 0, y: 8, delay: "-250ms" },
65
+ { x: 0, y: 4, delay: "-125ms" }
66
+ ];
67
+ const PENDING_LABELS = {
68
+ approval: "\u7B49\u5F85\u5BA1\u6279",
69
+ "plan-review": "\u7B49\u5F85\u8BA1\u5212\u786E\u8BA4",
70
+ question: "\u7B49\u5F85\u56DE\u590D"
71
+ };
72
+ function runningLabel(sessionId) {
73
+ const n = sessionStates?.value?.[sessionId]?.subagentsRunning ?? 0;
74
+ return n > 0 ? "\u5B50\u4EE3\u7406\u8FD0\u884C\u4E2D (" + n + ")" : "\u8FD0\u884C\u4E2D";
75
+ }
76
+ function sessionRowStatus(sessionId) {
77
+ const state = sessionStates?.value?.[sessionId];
78
+ if (!state) return "idle";
79
+ if (state.hasPending) return "pending";
80
+ const subagentsRunning = (state.subagentsRunning ?? 0) > 0;
81
+ if (subagentsRunning) return "running";
82
+ if (state.thinking) return "thinking";
83
+ const running = state.statusType === "running" || state.statusType === "streaming";
84
+ if (running) return "running";
85
+ if (state.completed) return "completed";
86
+ return "idle";
87
+ }
88
+ function pendingLabel(sessionId) {
89
+ const kind = sessionStates?.value?.[sessionId]?.pendingKind;
90
+ return kind && PENDING_LABELS[kind] || "\u7B49\u5F85\u7528\u6237";
91
+ }
92
+ function isSessionActive(sessionId) {
93
+ const status = sessionRowStatus(sessionId);
94
+ return status === "thinking" || status === "running";
95
+ }
96
+ function isSessionPending(sessionId) {
97
+ return sessionRowStatus(sessionId) === "pending";
98
+ }
99
+ function isSessionCompleted(sessionId) {
100
+ return sessionRowStatus(sessionId) === "completed";
60
101
  }
61
102
  const __returned__ = { collapsed, sessions, loadingSessionList, showSessionListSkeleton, handleCreateSession, handleSelectSession, handleDeleteSession, sessionKey, sessionStates, isAnimating, get animTimer() {
62
103
  return animTimer;
63
104
  }, set animTimer(v) {
64
105
  animTimer = v;
65
- }, showSkeleton, isSessionThinking };
106
+ }, showSkeleton, ONGOING_CELLS, PENDING_LABELS, runningLabel, sessionRowStatus, pendingLabel, isSessionActive, isSessionPending, isSessionCompleted };
66
107
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
67
108
  return __returned__;
68
109
  }
@@ -85,14 +126,20 @@ const _hoisted_4 = {
85
126
  class: "aipanel-session-list-loading-overlay"
86
127
  };
87
128
  const _hoisted_5 = ["aria-selected", "onClick"];
88
- const _hoisted_6 = { class: "aipanel-session-header" };
89
- const _hoisted_7 = { class: "aipanel-session-title" };
90
- const _hoisted_8 = {
91
- key: 0,
92
- class: "aipanel-thinking-loading"
129
+ const _hoisted_6 = ["title"];
130
+ const _hoisted_7 = ["title"];
131
+ const _hoisted_8 = ["x", "y"];
132
+ const _hoisted_9 = {
133
+ key: 2,
134
+ class: "aipanel-session-state aipanel-session-state-completed",
135
+ title: "\u5DF2\u5B8C\u6210"
93
136
  };
94
- const _hoisted_9 = ["aria-label", "onClick"];
95
- const _hoisted_10 = { class: "aipanel-session-meta" };
137
+ const _hoisted_10 = { class: "aipanel-session-title-text" };
138
+ const _hoisted_11 = {
139
+ key: 3,
140
+ class: "aipanel-session-meta"
141
+ };
142
+ const _hoisted_12 = ["aria-label", "onClick"];
96
143
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
97
144
  return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
98
145
  "div",
@@ -102,9 +149,12 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
102
149
  [
103
150
  (0, import_vue3.createCommentVNode)(" Header "),
104
151
  !$setup.showSkeleton ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_1, [
105
- _cache[1] || (_cache[1] = (0, import_vue3.createElementVNode)(
152
+ _cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
106
153
  "span",
107
- { id: "aipanel-session-list-title" },
154
+ {
155
+ id: "aipanel-session-list-title",
156
+ class: "aipanel-session-list-title"
157
+ },
108
158
  "\u4F1A\u8BDD\u5217\u8868",
109
159
  -1
110
160
  /* CACHED */
@@ -115,13 +165,32 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
115
165
  title: "\u65B0\u5EFA\u4F1A\u8BDD",
116
166
  "aria-label": "\u65B0\u5EFA\u4F1A\u8BDD",
117
167
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleCreateSession && $setup.handleCreateSession(...args))
118
- }, " + ")
168
+ }, [..._cache[1] || (_cache[1] = [
169
+ (0, import_vue3.createElementVNode)(
170
+ "svg",
171
+ {
172
+ viewBox: "0 0 16 16",
173
+ width: "12",
174
+ height: "12",
175
+ fill: "none",
176
+ stroke: "currentColor",
177
+ "stroke-width": "1.6",
178
+ "stroke-linecap": "round",
179
+ "aria-hidden": "true"
180
+ },
181
+ [
182
+ (0, import_vue3.createElementVNode)("path", { d: "M8 3v10M3 8h10" })
183
+ ],
184
+ -1
185
+ /* CACHED */
186
+ )
187
+ ])])
119
188
  ])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
120
189
  import_vue3.Fragment,
121
190
  { key: 1 },
122
191
  [
123
192
  (0, import_vue3.createCommentVNode)(" Header Skeleton "),
124
- _cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
193
+ _cache[3] || (_cache[3] = (0, import_vue3.createElementVNode)(
125
194
  "div",
126
195
  { class: "aipanel-session-header-skeleton visible" },
127
196
  [
@@ -144,7 +213,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
144
213
  return (0, import_vue3.createElementVNode)("div", {
145
214
  key: `skeleton-${i}`,
146
215
  class: "aipanel-skeleton-item"
147
- }, [..._cache[3] || (_cache[3] = [
216
+ }, [..._cache[4] || (_cache[4] = [
148
217
  (0, import_vue3.createElementVNode)(
149
218
  "div",
150
219
  { class: "aipanel-skeleton-title" },
@@ -170,7 +239,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
170
239
  [
171
240
  (0, import_vue3.createCommentVNode)(" Content "),
172
241
  (0, import_vue3.createElementVNode)("div", _hoisted_3, [
173
- $setup.loadingSessionList ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_4, [..._cache[4] || (_cache[4] = [
242
+ $setup.loadingSessionList ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_4, [..._cache[5] || (_cache[5] = [
174
243
  (0, import_vue3.createElementVNode)(
175
244
  "div",
176
245
  { class: "aipanel-loading-spinner small" },
@@ -185,34 +254,63 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
185
254
  (0, import_vue3.renderList)($setup.sessions, (item) => {
186
255
  return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", {
187
256
  key: item[$setup.sessionKey],
188
- class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionThinking(item.id) }]),
257
+ class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionActive(item.id) }]),
189
258
  role: "option",
190
259
  "aria-selected": item.active,
191
260
  onClick: ($event) => $setup.handleSelectSession(item)
192
261
  }, [
193
- (0, import_vue3.createElementVNode)("div", _hoisted_6, [
194
- (0, import_vue3.createElementVNode)("div", _hoisted_7, [
195
- $setup.isSessionThinking(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", _hoisted_8)) : (0, import_vue3.createCommentVNode)("v-if", true),
196
- (0, import_vue3.createTextVNode)(
197
- " " + (0, import_vue3.toDisplayString)(item.title),
198
- 1
199
- /* TEXT */
200
- )
201
- ]),
202
- (0, import_vue3.createElementVNode)("button", {
203
- class: "aipanel-session-delete-btn",
204
- type: "button",
205
- "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
206
- onClick: (0, import_vue3.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
207
- }, " \xD7 ", 8, _hoisted_9)
208
- ]),
262
+ (0, import_vue3.createCommentVNode)(" \u72B6\u6001\u6307\u793A\uFF1Apending=\u7425\u73C0\u70B9 > \u6D3B\u8DC3(thinking/running/\u5B50\u4EE3\u7406)=\u8F6C\u5708 > completed=\u7EFF\u70B9 > idle "),
263
+ $setup.isSessionPending(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", {
264
+ key: 0,
265
+ class: "aipanel-session-state aipanel-session-state-pending",
266
+ title: $setup.pendingLabel(item.id)
267
+ }, null, 8, _hoisted_6)) : $setup.isSessionActive(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", {
268
+ key: 1,
269
+ class: "aipanel-session-state aipanel-session-state-ongoing",
270
+ title: $setup.runningLabel(item.id),
271
+ viewBox: "0 0 10 10",
272
+ width: "10",
273
+ height: "10",
274
+ "aria-hidden": "true"
275
+ }, [
276
+ ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
277
+ import_vue3.Fragment,
278
+ null,
279
+ (0, import_vue3.renderList)($setup.ONGOING_CELLS, (c) => {
280
+ return (0, import_vue3.createElementVNode)("rect", {
281
+ key: c.x + "-" + c.y,
282
+ x: c.x,
283
+ y: c.y,
284
+ width: "2",
285
+ height: "2",
286
+ style: (0, import_vue3.normalizeStyle)({ animationDelay: c.delay }),
287
+ class: "aipanel-session-ongoing-cell"
288
+ }, null, 12, _hoisted_8);
289
+ }),
290
+ 64
291
+ /* STABLE_FRAGMENT */
292
+ ))
293
+ ], 8, _hoisted_7)) : $setup.isSessionCompleted(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", _hoisted_9)) : (0, import_vue3.createCommentVNode)("v-if", true),
209
294
  (0, import_vue3.createElementVNode)(
210
- "div",
295
+ "span",
211
296
  _hoisted_10,
297
+ (0, import_vue3.toDisplayString)(item.title),
298
+ 1
299
+ /* TEXT */
300
+ ),
301
+ item.meta ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
302
+ "span",
303
+ _hoisted_11,
212
304
  (0, import_vue3.toDisplayString)(item.meta),
213
305
  1
214
306
  /* TEXT */
215
- )
307
+ )) : (0, import_vue3.createCommentVNode)("v-if", true),
308
+ (0, import_vue3.createElementVNode)("button", {
309
+ class: "aipanel-session-delete-btn",
310
+ type: "button",
311
+ "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
312
+ onClick: (0, import_vue3.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
313
+ }, " \xD7 ", 8, _hoisted_12)
216
314
  ], 10, _hoisted_5);
217
315
  }),
218
316
  128
@@ -1,5 +1,5 @@
1
1
  import { type Ref } from "vue";
2
- import type { AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelRemoveSelectedPayload, AIPanelSessionThinkingState, DisplayMode } from "./types";
2
+ import type { AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelRemoveSelectedPayload, AIPanelSessionThinkingState, DisplayMode, ProviderSidebarCollapseControl } from "./types";
3
3
  import type { FloatingBubbleOffset } from "./components/FloatingBubble/types";
4
4
  export interface AIPanelWidgetContext {
5
5
  theme: Ref<string>;
@@ -26,6 +26,10 @@ export interface AIPanelWidgetContext {
26
26
  reviewPanelVisible: Ref<boolean>;
27
27
  /** 是否支持代码审查面板(右上角 </> 按钮);由 Provider capabilities.reviewPanel 决定 */
28
28
  reviewPanelEnabled: Ref<boolean>;
29
+ /** Provider 接管会话侧栏(隐藏原生会话列表,Provider 自家侧栏渲染);由 capabilities.sidebar.takeover 决定 */
30
+ providerSidebar: Ref<boolean>;
31
+ /** 侧栏折叠开关归属(host=宿主左上角按钮驱动 / provider=Provider 自带开关);由 capabilities.sidebar.collapseControl 决定 */
32
+ sidebarCollapseControl: Ref<ProviderSidebarCollapseControl>;
29
33
  bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
30
34
  mode: Ref<"bubble" | "split">;
31
35
  displayMode: Ref<DisplayMode>;
@@ -1 +1 @@
1
- .aipanel-widget{--ap-bg-main: #ffffff;--ap-bg-secondary: #f8f9fa;--ap-bg-tertiary: #f3f4f6;--ap-overlay-bg: rgba(255, 255, 255, .9);--ap-bg-inverse: #1e1e1e;--ap-text-primary: #282828;--ap-text-secondary: #4b5563;--ap-text-tertiary: #6b7280;--ap-text-placeholder: #9ca3af;--ap-text-inverse: #ffffff;--ap-border-primary: #e5e7eb;--ap-border-secondary: #d1d5db;--ap-primary: #3b82f6;--ap-primary-hover: #2563eb;--ap-primary-bg: rgba(59, 130, 246, .1);--ap-danger: #ef4444;--ap-danger-hover: #dc2626;--ap-danger-active: #b91c1c;--ap-success: #10b981;--ap-overlay: rgba(0, 0, 0, .5);--ap-tooltip-bg: #1e1e1e;--ap-dialog-overlay: rgba(0, 0, 0, .5);--ap-thinking-gradient-1: #10b981;--ap-thinking-gradient-2: #059669;--ap-thinking-glow: rgba(16, 185, 129, .3);--ap-thinking-glow-strong: rgba(16, 185, 129, .6);--ap-skeleton-bg: #e5e7eb;--ap-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--ap-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--ap-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--ap-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--ap-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--ap-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--ap-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--ap-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--ap-trigger-bg: #3b82f6;--ap-trigger-bg-hover: #2563eb;--ap-trigger-bg-active: #1d4ed8;--ap-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--ap-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--ap-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.aipanel-widget.aipanel-theme-dark{--ap-bg-main: #1a1a1a;--ap-bg-secondary: #1e1e1e;--ap-bg-tertiary: #282828;--ap-overlay-bg: rgba(26, 26, 26, .9);--ap-bg-inverse: #ffffff;--ap-text-primary: #f3f4f6;--ap-text-secondary: #d1d5db;--ap-text-tertiary: #9ca3af;--ap-text-placeholder: #6b7280;--ap-text-inverse: #282828;--ap-border-primary: #282828;--ap-border-secondary: #4b5563;--ap-primary: #3b82f6;--ap-primary-hover: #2563eb;--ap-primary-bg: rgba(59, 130, 246, .15);--ap-danger: #ef4444;--ap-danger-hover: #dc2626;--ap-danger-active: #b91c1c;--ap-success: #10b981;--ap-overlay: rgba(26, 26, 26, .9);--ap-tooltip-bg: #282828;--ap-dialog-overlay: rgba(0, 0, 0, .7);--ap-thinking-gradient-1: #34d399;--ap-thinking-gradient-2: #10b981;--ap-thinking-glow: rgba(52, 211, 153, .3);--ap-thinking-glow-strong: rgba(52, 211, 153, .6);--ap-skeleton-bg: #151515;--ap-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--ap-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--ap-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--ap-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--ap-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--ap-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--ap-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--ap-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--ap-trigger-bg: #60a5fa;--ap-trigger-bg-hover: #3b82f6;--ap-trigger-bg-active: #2563eb;--ap-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--ap-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--ap-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.aipanel-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--ap-bg-main);border-radius:16px;box-shadow:var(--ap-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.aipanel-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.aipanel-chat.no-transition,.aipanel-chat.no-transition.open{transition:none!important}.aipanel-chat.minimized{width:320px;height:320px}.aipanel-chat.minimized .aipanel-iframe-container{margin-top:-146px}.aipanel-chat-content{display:flex;flex:1;overflow:hidden}.aipanel-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.aipanel-notification:before{content:"\1f4a1";font-size:16px}.aipanel-dialog-overlay{position:fixed;inset:0;background:var(--ap-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.aipanel-dialog{background:var(--ap-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--ap-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.aipanel-dialog-content{margin-bottom:20px}.aipanel-dialog-message{font-size:15px;color:var(--ap-text-primary);line-height:1.5}.aipanel-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.aipanel-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.aipanel-dialog-btn.cancel{background:var(--ap-bg-tertiary);color:var(--ap-text-primary)}.aipanel-dialog-btn.cancel:hover{background:var(--ap-text-primary);color:var(--ap-bg-main)}.aipanel-dialog-btn.confirm{background:var(--ap-danger);color:#fff}.aipanel-dialog-btn.confirm:hover{background:var(--ap-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.aipanel-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.aipanel-page-notification:before{content:"\1f4a1";font-size:16px}.aipanel-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.aipanel-element-tooltip{position:fixed;background:var(--ap-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--ap-shadow-md);max-width:300px;pointer-events:none;line-height:1}.aipanel-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.aipanel-tooltip-file{font-size:11px;color:var(--ap-text-placeholder);word-break:break-all}.aipanel-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.aipanel-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-aipanel-split{transition:padding .3s ease;min-width:auto}body.has-aipanel-split-right{padding-right:var(--aipanel-split-width, 500px)}body.has-aipanel-split-left{padding-left:var(--aipanel-split-width, 500px)}.aipanel-widget.extension-mode{position:relative;width:100%;height:100%;display:flex}.aipanel-widget.extension-mode .aipanel-select-mode-hint,.aipanel-widget.extension-mode .aipanel-dialog-overlay{position:absolute}
1
+ .aipanel-widget{--ap-bg-main: #ffffff;--ap-bg-secondary: #f9fafb;--ap-bg-tertiary: #ebeef2;--ap-overlay-bg: rgba(249, 250, 251, .92);--ap-text-primary: #0f1115;--ap-text-secondary: #61666b;--ap-text-tertiary: #81858c;--ap-text-placeholder: #adb2b8;--ap-border-faint: rgba(15, 17, 21, .04);--ap-border-primary: rgba(15, 17, 21, .1);--ap-border-secondary: rgba(15, 17, 21, .12);--ap-hover-bg: rgba(38, 49, 72, .06);--ap-elevated-fill: #ffffff;--ap-elevated-hover: #f1f3f5;--ap-press-bg: rgba(38, 49, 72, .1);--ap-primary: #0f1115;--ap-primary-hover: #43454a;--ap-on-primary: #ffffff;--ap-accent: #4176e6;--ap-accent-hover: #5686fe;--ap-accent-bg: rgba(65, 118, 230, .1);--ap-danger: #ec1313;--ap-danger-hover: #c40f0f;--ap-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--ap-tooltip-bg: #1e1e1e;--ap-dialog-overlay: rgba(0, 0, 0, .24);--ap-dialog-bg: #ffffff;--ap-scrollbar-thumb: #e5e5e5;--ap-scrollbar-thumb-hover: #d4d4d4;--ap-thinking-glow: rgba(86, 134, 254, .3);--ap-thinking-glow-strong: rgba(86, 134, 254, .55);--ap-skeleton-bg: rgba(15, 17, 21, .06);--ap-skeleton-gradient: linear-gradient( 90deg, rgba(15, 17, 21, .04) 25%, rgba(15, 17, 21, .1) 50%, rgba(15, 17, 21, .04) 75% );--ap-shadow-sm: 0 1px 2px rgba(15, 17, 21, .04), 0 1px 3px rgba(15, 17, 21, .06);--ap-shadow-md: 0 2px 8px rgba(15, 17, 21, .06), 0 4px 16px rgba(15, 17, 21, .06);--ap-shadow-lg: 0 0 0 .5px rgba(15, 17, 21, .06), 0 4px 16px rgba(15, 17, 21, .08), 0 16px 48px rgba(15, 17, 21, .1);--ap-shadow-xl: 0 0 0 .5px rgba(15, 17, 21, .08), 0 8px 32px rgba(15, 17, 21, .12), 0 24px 72px rgba(15, 17, 21, .14);--ap-shadow-accent: 0 1px 2px rgba(65, 118, 230, .14), 0 0 0 1px rgba(65, 118, 230, .18);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}.aipanel-widget.aipanel-theme-dark{--ap-bg-main: #151517;--ap-bg-secondary: #1b1b1c;--ap-bg-tertiary: #2c2c2e;--ap-overlay-bg: rgba(21, 21, 23, .92);--ap-text-primary: #f9fafb;--ap-text-secondary: #cfd3d6;--ap-text-tertiary: #adb2b8;--ap-text-placeholder: #81858c;--ap-border-faint: rgba(255, 255, 255, .06);--ap-border-primary: rgba(255, 255, 255, .12);--ap-border-secondary: rgba(255, 255, 255, .16);--ap-hover-bg: rgba(255, 255, 255, .08);--ap-elevated-fill: #43454a;--ap-elevated-hover: #353638;--ap-press-bg: rgba(255, 255, 255, .14);--ap-primary: #f9fafb;--ap-primary-hover: #ebeef2;--ap-on-primary: #0f1115;--ap-accent: #679efe;--ap-accent-hover: #5686fe;--ap-accent-bg: rgba(103, 158, 254, .16);--ap-danger: #f25a5a;--ap-danger-hover: #ff8383;--ap-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--ap-tooltip-bg: #282828;--ap-dialog-overlay: rgba(0, 0, 0, .5);--ap-dialog-bg: #2c2c2e;--ap-scrollbar-thumb: #3c3c3d;--ap-scrollbar-thumb-hover: #545557;--ap-thinking-glow: rgba(103, 158, 254, .35);--ap-thinking-glow-strong: rgba(103, 158, 254, .6);--ap-skeleton-bg: rgba(255, 255, 255, .07);--ap-skeleton-gradient: linear-gradient( 90deg, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .12) 50%, rgba(255, 255, 255, .05) 75% );--ap-shadow-sm: 0 1px 2px rgba(0, 0, 0, .3), 0 1px 3px rgba(0, 0, 0, .24);--ap-shadow-md: 0 2px 8px rgba(0, 0, 0, .3), 0 4px 16px rgba(0, 0, 0, .2);--ap-shadow-lg: 0 0 0 .5px rgba(255, 255, 255, .06), 0 4px 16px rgba(0, 0, 0, .3), 0 16px 48px rgba(0, 0, 0, .25);--ap-shadow-xl: 0 0 0 .5px rgba(255, 255, 255, .08), 0 8px 32px rgba(0, 0, 0, .36), 0 24px 72px rgba(0, 0, 0, .3);--ap-shadow-accent: 0 1px 2px rgba(103, 158, 254, .2), 0 0 0 1px rgba(103, 158, 254, .25)}@supports not selector(::-webkit-scrollbar){.aipanel-widget,.aipanel-widget *{scrollbar-width:thin;scrollbar-color:var(--ap-scrollbar-thumb) transparent}}.aipanel-widget ::-webkit-scrollbar,.aipanel-widget *::-webkit-scrollbar{width:8px;height:8px}.aipanel-widget ::-webkit-scrollbar-track,.aipanel-widget *::-webkit-scrollbar-track{background:transparent}.aipanel-widget ::-webkit-scrollbar-thumb,.aipanel-widget *::-webkit-scrollbar-thumb{border-radius:4px;background:var(--ap-scrollbar-thumb)}.aipanel-widget ::-webkit-scrollbar-thumb:hover,.aipanel-widget *::-webkit-scrollbar-thumb:hover{background:var(--ap-scrollbar-thumb-hover)}.aipanel-widget ::-webkit-scrollbar-corner,.aipanel-widget *::-webkit-scrollbar-corner{background:transparent}.aipanel-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--ap-bg-main);border-radius:16px;box-shadow:var(--ap-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.aipanel-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.aipanel-chat.no-transition,.aipanel-chat.no-transition.open{transition:none!important}.aipanel-chat.minimized{width:320px;height:320px}.aipanel-chat.minimized .aipanel-iframe-container{margin-top:-146px}.aipanel-chat-content{display:flex;flex:1;overflow:hidden}.aipanel-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.aipanel-notification:before{content:"\1f4a1";font-size:16px}.aipanel-dialog-overlay{position:fixed;inset:0;background:var(--ap-dialog-overlay);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.aipanel-dialog{width:min(380px,100%);background:var(--ap-dialog-bg);border-radius:24px;padding:24px 24px 20px;box-shadow:var(--ap-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.aipanel-dialog-content{margin-bottom:20px}.aipanel-dialog-message{font-size:14px;line-height:22px;font-weight:400;color:var(--ap-text-primary)}.aipanel-dialog-actions{display:flex;gap:8px;justify-content:flex-end}.aipanel-dialog-btn{height:36px;padding:0 20px;border-radius:999px;border:1px solid transparent;font-size:14px;line-height:22px;font-weight:500;cursor:pointer;transition:all .2s}.aipanel-dialog-btn.cancel{background:transparent;border-color:var(--ap-border-primary);color:var(--ap-text-secondary)}.aipanel-dialog-btn.cancel:hover{background:var(--ap-hover-bg);color:var(--ap-text-primary)}.aipanel-dialog-btn.confirm{background:var(--ap-danger);color:#fff}.aipanel-dialog-btn.confirm:hover{background:var(--ap-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.aipanel-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.aipanel-page-notification:before{content:"\1f4a1";font-size:16px}.aipanel-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.aipanel-element-tooltip{position:fixed;background:var(--ap-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--ap-shadow-md);max-width:300px;pointer-events:none;line-height:1}.aipanel-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.aipanel-tooltip-file{font-size:11px;color:var(--ap-text-placeholder);word-break:break-all}.aipanel-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.aipanel-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-aipanel-split{transition:padding .3s ease;min-width:auto}body.has-aipanel-split-right{padding-right:var(--aipanel-split-width, 500px)}body.has-aipanel-split-left{padding-left:var(--aipanel-split-width, 500px)}.aipanel-widget.extension-mode{position:relative;width:100%;height:100%;display:flex}.aipanel-widget.extension-mode .aipanel-select-mode-hint,.aipanel-widget.extension-mode .aipanel-dialog-overlay{position:absolute}
@@ -78,7 +78,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
78
78
  splitMode: { type: Object, required: false, default: void 0 },
79
79
  splitPanelWidth: { type: Number, required: false, default: 500 },
80
80
  hideBubble: { type: Boolean, required: false, default: false },
81
- reviewPanelEnabled: { type: Boolean, required: false, default: false }
81
+ reviewPanelEnabled: { type: Boolean, required: false, default: false },
82
+ providerSidebar: { type: Boolean, required: false, default: false },
83
+ sidebarCollapseControl: { type: String, required: false, default: "host" }
82
84
  },
83
85
  emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "update:thinking", "update:splitPanelWidth", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded", "thinking-change", "split-panel-width-change"],
84
86
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -128,9 +130,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
128
130
  };
129
131
  const localSessionListCollapsed = (0, import_vue2.ref)(props.sessionListCollapsed);
130
132
  const localDisplayMode = (0, import_vue2.ref)(props.displayMode);
131
- const localSplitPosition = (0, import_vue2.ref)(
132
- props.splitMode?.position ?? "right"
133
- );
133
+ const localSplitPosition = (0, import_vue2.ref)(props.splitMode?.position ?? "right");
134
134
  const minimized = (0, import_vue2.ref)(false);
135
135
  const promptDockVisible = (0, import_vue2.ref)(true);
136
136
  const reviewPanelVisible = (0, import_vue2.ref)(false);
@@ -142,6 +142,14 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
142
142
  if (!iframeLoaded.value || !iframeReady.value) return;
143
143
  sendMessageToIframe(import_core.WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
144
144
  sendMessageToIframe(import_core.WIDGET_MSG.MINIMIZE_STATE, { minimized: minimized.value });
145
+ sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_MODE, {
146
+ mode: props.providerSidebar ? "provider" : "host"
147
+ });
148
+ if (props.providerSidebar && props.sidebarCollapseControl === "host") {
149
+ sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_COLLAPSE, {
150
+ collapsed: localSessionListCollapsed.value
151
+ });
152
+ }
145
153
  if (props.reviewPanelEnabled) {
146
154
  sendMessageToIframe(import_core.WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
147
155
  }
@@ -168,8 +176,15 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
168
176
  localDisplayMode.value = val;
169
177
  }
170
178
  );
179
+ (0, import_vue2.watch)(
180
+ () => [props.providerSidebar, props.sidebarCollapseControl],
181
+ () => {
182
+ syncStateToIframe();
183
+ }
184
+ );
171
185
  const handleToggleDisplayMode = () => {
172
- if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector") return;
186
+ if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector")
187
+ return;
173
188
  const modes = ["bubble", "split", "auto"];
174
189
  const currentIndex = modes.indexOf(localDisplayMode.value);
175
190
  const nextIndex = (currentIndex + 1) % modes.length;
@@ -208,6 +223,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
208
223
  localSessionListCollapsed.value = collapsed;
209
224
  emit("update:sessionListCollapsed", collapsed);
210
225
  emit("toggle-session-list", collapsed);
226
+ if (props.providerSidebar && props.sidebarCollapseControl === "host") {
227
+ sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_COLLAPSE, { collapsed });
228
+ }
211
229
  },
212
230
  onEmptyAction: () => {
213
231
  emit("empty-action");
@@ -388,6 +406,16 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
388
406
  iframeReady.value = true;
389
407
  syncStateToIframe();
390
408
  }
409
+ if (event.data?.type === import_core.WIDGET_MSG.SIDEBAR_STATE) {
410
+ if (props.providerSidebar && props.sidebarCollapseControl === "host") {
411
+ const collapsed = event.data.collapsed === true;
412
+ if (collapsed !== localSessionListCollapsed.value) {
413
+ localSessionListCollapsed.value = collapsed;
414
+ emit("update:sessionListCollapsed", collapsed);
415
+ emit("toggle-session-list", collapsed);
416
+ }
417
+ }
418
+ }
391
419
  };
392
420
  (0, import_vue2.onMounted)(() => {
393
421
  if (typeof window !== "undefined") {
@@ -430,7 +458,10 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
430
458
  const gap = 24;
431
459
  const bubbleSize = 44;
432
460
  const screenMargin = 20;
433
- const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? { x: windowWidth.value - bubbleSize - gap, y: windowHeight.value - bubbleSize - gap };
461
+ const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? {
462
+ x: windowWidth.value - bubbleSize - gap,
463
+ y: windowHeight.value - bubbleSize - gap
464
+ };
434
465
  const style = {};
435
466
  if (isBubbleOnRightSide.value) {
436
467
  let rightPos = windowWidth.value - effectiveOffset.x + gap;
@@ -530,6 +561,8 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
530
561
  promptDockVisible,
531
562
  reviewPanelVisible,
532
563
  reviewPanelEnabled: (0, import_vue2.toRef)(props, "reviewPanelEnabled"),
564
+ providerSidebar: (0, import_vue2.toRef)(props, "providerSidebar"),
565
+ sidebarCollapseControl: (0, import_vue2.toRef)(props, "sidebarCollapseControl"),
533
566
  bubbleOffset,
534
567
  mode: effectiveMode,
535
568
  displayMode: localDisplayMode,
@@ -650,6 +683,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
650
683
  "resolved-theme": $setup.resolvedTheme,
651
684
  "split-position": $setup.splitPosition,
652
685
  extension: $setup.isExtensionMode,
686
+ "provider-sidebar": $setup.props.providerSidebar,
653
687
  onResize: $setup.handleResize,
654
688
  onResizeStart: $setup.handleResizeStart,
655
689
  onResizeEnd: $setup.handleResizeEnd,
@@ -718,7 +752,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
718
752
  ]),
719
753
  key: "6"
720
754
  } : void 0
721
- ]), 1032, ["mode", "open", "minimized", "position-style", "animation-origin", "panel-width", "resizable", "min-width", "max-width", "no-transition", "dragging", "thinking", "resolved-theme", "split-position", "extension", "onResize", "onToggle"]),
755
+ ]), 1032, ["mode", "open", "minimized", "position-style", "animation-origin", "panel-width", "resizable", "min-width", "max-width", "no-transition", "dragging", "thinking", "resolved-theme", "split-position", "extension", "provider-sidebar", "onResize", "onToggle"]),
722
756
  (0, import_vue3.createVNode)($setup["SelectHint"])
723
757
  ],
724
758
  64
@@ -778,11 +812,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
778
812
  (0, import_vue3.createElementVNode)("button", {
779
813
  class: "aipanel-dialog-btn cancel",
780
814
  onClick: $setup.handleDialogCancel
781
- }, "\u53D6\u6D88"),
815
+ }, " \u53D6\u6D88 "),
782
816
  (0, import_vue3.createElementVNode)("button", {
783
817
  class: "aipanel-dialog-btn confirm",
784
818
  onClick: $setup.handleDialogConfirm
785
- }, "\u786E\u8BA4")
819
+ }, " \u786E\u8BA4 ")
786
820
  ])
787
821
  ])
788
822
  ])) : (0, import_vue3.createCommentVNode)("v-if", true),
@@ -44,11 +44,13 @@ declare const __VLS_base: import("vue").DefineComponent<AIPanelWidgetProps, {
44
44
  selectEnabled: boolean;
45
45
  theme: import("@aipanel/core").AIPanelWidgetTheme;
46
46
  reviewPanelEnabled: boolean;
47
+ providerSidebar: boolean;
48
+ sidebarCollapseControl: import("@aipanel/core").ProviderSidebarCollapseControl;
47
49
  displayMode: import("@aipanel/core").DisplayMode;
48
50
  showSessionListSkeleton: boolean;
49
51
  sessionKey: string;
50
- sessions: import("@aipanel/core").AIPanelWidgetSession[];
51
52
  thinking: boolean;
53
+ sessions: import("@aipanel/core").AIPanelWidgetSession[];
52
54
  showClearAll: boolean;
53
55
  open: boolean;
54
56
  selectShortcutLabel: string;
@@ -1 +1 @@
1
- export type { AIPanelWidgetTheme, AIPanelWidgetSession, AIPanelSelectedElement, AIPanelRemoveSelectedPayload, AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelWidgetProps, AIPanelWidgetEmits, AIPanelSessionThinkingState, DisplayMode, SplitModeOptions, } from "@aipanel/core";
1
+ export type { AIPanelWidgetTheme, AIPanelWidgetSession, AIPanelSelectedElement, AIPanelRemoveSelectedPayload, AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelWidgetProps, AIPanelWidgetEmits, AIPanelSessionThinkingState, DisplayMode, SplitModeOptions, ProviderSidebarCollapseControl, } from "@aipanel/core";
package/lib/index.cjs CHANGED
@@ -26,7 +26,7 @@ module.exports = __toCommonJS(lib_exports);
26
26
  var import_AI_panel_widget = require("./AI-panel-widget/index.cjs");
27
27
  __reExport(lib_exports, require("./AI-panel-widget/index.cjs"), module.exports);
28
28
  __reExport(lib_exports, require("./setup.cjs"), module.exports);
29
- const version = "1.2.10";
29
+ const version = "1.2.12";
30
30
  function install(app, options) {
31
31
  const components = [
32
32
  import_AI_panel_widget.AIPanelWidget
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { App } from 'vue';
2
- declare const version = "1.2.10";
2
+ declare const version = "1.2.12";
3
3
  declare function install(app: App<any>, options?: any): void;
4
4
  export { install, version, };
5
5
  export * from './AI-panel-widget';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aipanel/ui",
3
- "version": "1.2.10",
3
+ "version": "1.2.12",
4
4
  "description": "Reusable AIPanel widget components built with Pagoda CLI",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "css-selector-generator": "^3.9.2",
34
- "@aipanel/core": "1.2.10"
34
+ "@aipanel/core": "1.2.12"
35
35
  },
36
36
  "scripts": {
37
37
  "build": "pagoda-cli build",
@@ -1 +0,0 @@
1
- .aipanel-split-trigger{position:fixed;right:0;top:50%;transform:translateY(-50%);width:20px;height:48px;background:linear-gradient(135deg,#3b82f6,#2563eb);border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:-2px 0 8px #3b82f640;transition:right .3s ease,width .25s cubic-bezier(.4,0,.2,1),background .25s ease,box-shadow .25s ease;z-index:99998}.aipanel-split-trigger:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger.open{width:20px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:8px 0 0 8px;box-shadow:-2px 0 8px #3b82f640}.aipanel-split-trigger.open:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.aipanel-split-trigger:hover .aipanel-split-trigger-icon{transform:scale(1.1)}.aipanel-split-thinking-indicator{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--ap-success);border-radius:50%;animation:aipanel-thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 4px #10b98180}@keyframes aipanel-thinking-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}
@@ -1,18 +0,0 @@
1
- type __VLS_Props = {
2
- open?: boolean;
3
- thinking?: boolean;
4
- resolvedTheme?: "light" | "dark";
5
- panelWidth?: number;
6
- };
7
- declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
8
- toggle: () => any;
9
- }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
- onToggle?: (() => any) | undefined;
11
- }>, {
12
- resolvedTheme: "light" | "dark";
13
- thinking: boolean;
14
- open: boolean;
15
- panelWidth: number;
16
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
- declare const _default: typeof __VLS_export;
18
- export default _default;
@@ -1,112 +0,0 @@
1
- import "./SplitTrigger-sfc.css";
2
- import { defineComponent as _defineComponent } from "vue";
3
- import { computed } from "vue";
4
- const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
- ...{
6
- name: "SplitTrigger"
7
- },
8
- __name: "SplitTrigger",
9
- props: {
10
- open: { type: Boolean, required: false, default: false },
11
- thinking: { type: Boolean, required: false, default: false },
12
- resolvedTheme: { type: String, required: false, default: "light" },
13
- panelWidth: { type: Number, required: false, default: 500 }
14
- },
15
- emits: ["toggle"],
16
- setup(__props, { expose: __expose, emit: __emit }) {
17
- __expose();
18
- const props = __props;
19
- const emit = __emit;
20
- const buttonClasses = computed(() => [
21
- "aipanel-split-trigger",
22
- {
23
- open: props.open,
24
- thinking: props.thinking,
25
- "aipanel-theme-dark": props.resolvedTheme === "dark"
26
- }
27
- ]);
28
- const buttonStyle = computed(() => {
29
- if (props.open) {
30
- return {
31
- right: `${props.panelWidth}px`
32
- };
33
- }
34
- return {};
35
- });
36
- const handleClick = () => {
37
- emit("toggle");
38
- };
39
- const __returned__ = { props, emit, buttonClasses, buttonStyle, handleClick };
40
- Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
41
- return __returned__;
42
- }
43
- });
44
- import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from "vue";
45
- const _hoisted_1 = ["aria-expanded"];
46
- const _hoisted_2 = { class: "aipanel-split-trigger-icon" };
47
- const _hoisted_3 = {
48
- key: 0,
49
- viewBox: "0 0 24 24",
50
- width: "16",
51
- height: "16",
52
- fill: "none",
53
- stroke: "currentColor",
54
- "stroke-width": "2"
55
- };
56
- const _hoisted_4 = {
57
- key: 1,
58
- viewBox: "0 0 24 24",
59
- width: "16",
60
- height: "16",
61
- fill: "none",
62
- stroke: "currentColor",
63
- "stroke-width": "2"
64
- };
65
- const _hoisted_5 = {
66
- key: 0,
67
- class: "aipanel-split-thinking-indicator"
68
- };
69
- function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
70
- return _openBlock(), _createElementBlock("button", {
71
- class: _normalizeClass($setup.buttonClasses),
72
- style: _normalizeStyle($setup.buttonStyle),
73
- type: "button",
74
- "aria-expanded": $props.open,
75
- "aria-label": "\u6253\u5F00 AI \u52A9\u624B",
76
- onClick: $setup.handleClick
77
- }, [
78
- _createElementVNode("span", _hoisted_2, [
79
- $props.open ? (_openBlock(), _createElementBlock("svg", _hoisted_3, [..._cache[0] || (_cache[0] = [
80
- _createElementVNode(
81
- "path",
82
- {
83
- d: "M9 18l6-6-6-6",
84
- "stroke-linecap": "round",
85
- "stroke-linejoin": "round"
86
- },
87
- null,
88
- -1
89
- /* CACHED */
90
- )
91
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_4, [..._cache[1] || (_cache[1] = [
92
- _createElementVNode(
93
- "path",
94
- {
95
- d: "M15 18l-6-6 6-6",
96
- "stroke-linecap": "round",
97
- "stroke-linejoin": "round"
98
- },
99
- null,
100
- -1
101
- /* CACHED */
102
- )
103
- ])]))
104
- ]),
105
- $props.thinking ? (_openBlock(), _createElementBlock("span", _hoisted_5)) : _createCommentVNode("v-if", true)
106
- ], 14, _hoisted_1);
107
- }
108
- __vue_sfc__.render = __vue_render__;
109
- var SplitTrigger_vue_default = __vue_sfc__;
110
- export {
111
- SplitTrigger_vue_default as default
112
- };
@@ -1 +0,0 @@
1
- .aipanel-split-trigger{position:fixed;right:0;top:50%;transform:translateY(-50%);width:20px;height:48px;background:linear-gradient(135deg,#3b82f6,#2563eb);border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:-2px 0 8px #3b82f640;transition:right .3s ease,width .25s cubic-bezier(.4,0,.2,1),background .25s ease,box-shadow .25s ease;z-index:99998}.aipanel-split-trigger:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger.open{width:20px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:8px 0 0 8px;box-shadow:-2px 0 8px #3b82f640}.aipanel-split-trigger.open:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.aipanel-split-trigger:hover .aipanel-split-trigger-icon{transform:scale(1.1)}.aipanel-split-thinking-indicator{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--ap-success);border-radius:50%;animation:aipanel-thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 4px #10b98180}@keyframes aipanel-thinking-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}