@aipanel/ui 1.2.10 → 1.2.11

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.
@@ -1,4 +1,19 @@
1
1
  import { computed } from "vue";
2
+ function formatRelativeTime(ts) {
3
+ const time = new Date(ts).getTime();
4
+ if (Number.isNaN(time)) return "";
5
+ const diff = Date.now() - time;
6
+ if (diff < 0) return "\u521A\u521A";
7
+ const minute = 6e4;
8
+ const hour = 60 * minute;
9
+ const day = 24 * hour;
10
+ if (diff < minute) return "\u521A\u521A";
11
+ if (diff < hour) return `${Math.floor(diff / minute)} \u5206\u949F\u524D`;
12
+ if (diff < day) return `${Math.floor(diff / hour)} \u5C0F\u65F6\u524D`;
13
+ if (diff < 7 * day) return `${Math.floor(diff / day)} \u5929\u524D`;
14
+ const date = new Date(time);
15
+ return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
16
+ }
2
17
  function formatSessionMeta(session) {
3
18
  if (session.meta) {
4
19
  return session.meta;
@@ -6,11 +21,7 @@ function formatSessionMeta(session) {
6
21
  if (!session.updatedAt) {
7
22
  return "";
8
23
  }
9
- const date = new Date(session.updatedAt);
10
- if (Number.isNaN(date.getTime())) {
11
- return "";
12
- }
13
- return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
24
+ return formatRelativeTime(session.updatedAt);
14
25
  }
15
26
  function useSession(options) {
16
27
  const sessionItems = computed(
@@ -1 +1 @@
1
- .aipanel-session-list{width:240px;background:var(--ap-bg-secondary);border-right:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.aipanel-session-list.collapsed{width:0;overflow:hidden}.aipanel-session-list.collapsed .aipanel-session-list-header,.aipanel-session-list.collapsed .aipanel-session-list-content{display:none}.aipanel-session-list-header{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--ap-text-primary)}.aipanel-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--ap-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.aipanel-new-session-btn:hover{background:var(--ap-primary-hover);transform:scale(1.05)}.aipanel-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.aipanel-session-list-loading-overlay{position:absolute;inset:0;background:var(--ap-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.aipanel-loading-spinner.small{width:24px;height:24px;border-width:2px}.aipanel-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--ap-text-primary)}.aipanel-session-item:hover{background:var(--ap-bg-tertiary)}.aipanel-session-item.active{background:var(--ap-primary);color:#fff;transition:none}.aipanel-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-session-meta{font-size:12px;opacity:.6}.aipanel-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.aipanel-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.aipanel-session-item:hover .aipanel-session-delete-btn{opacity:1}.aipanel-session-delete-btn:hover{background:var(--ap-danger);color:#fff}.aipanel-session-item.active .aipanel-session-delete-btn{color:#ffffffb3}.aipanel-session-item.active .aipanel-session-delete-btn:hover{background:#fff3;color:#fff}.aipanel-session-header-skeleton{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:none;justify-content:space-between;align-items:center}.aipanel-session-header-skeleton.visible{display:flex}.aipanel-skeleton-header-title{height:18px;width:80px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.aipanel-skeleton-header-btn{width:28px;height:28px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.aipanel-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.aipanel-session-skeleton.visible{display:block}.aipanel-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--ap-skeleton-bg)}.aipanel-skeleton-title{height:16px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.aipanel-skeleton-meta{height:12px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.aipanel-session-empty{padding:32px 16px;text-align:center;color:var(--ap-text-placeholder);font-size:13px}.aipanel-thinking-loading{display:inline-block;width:12px;height:12px;margin-right:6px;border:2px solid var(--ap-border-secondary);border-top-color:var(--ap-text-secondary);border-radius:50%;animation:thinking-spin .8s linear infinite;vertical-align:middle}.aipanel-session-item.active .aipanel-thinking-loading{border-color:#ffffff4d;border-top-color:#ffffffe6}@keyframes thinking-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
1
+ .aipanel-session-list{width:240px;background:var(--ap-bg-secondary);border-right:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.aipanel-session-list.collapsed{width:0;overflow:hidden}.aipanel-session-list.collapsed .aipanel-session-list-header,.aipanel-session-list.collapsed .aipanel-session-list-content{display:none}.aipanel-session-list-header{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--ap-text-primary)}.aipanel-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--ap-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.aipanel-new-session-btn:hover{background:var(--ap-primary-hover);transform:scale(1.05)}.aipanel-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.aipanel-session-list-loading-overlay{position:absolute;inset:0;background:var(--ap-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.aipanel-loading-spinner.small{width:24px;height:24px;border-width:2px}.aipanel-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--ap-text-primary)}.aipanel-session-item:hover{background:var(--ap-bg-tertiary)}.aipanel-session-item.active{background:var(--ap-primary);color:#fff;transition:none}.aipanel-session-title{display:flex;align-items:center;min-width:0;font-size:14px;font-weight:500;margin-bottom:4px}.aipanel-session-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.aipanel-session-meta{font-size:12px;opacity:.6}.aipanel-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.aipanel-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.aipanel-session-item:hover .aipanel-session-delete-btn{opacity:1}.aipanel-session-delete-btn:hover{background:var(--ap-danger);color:#fff}.aipanel-session-item.active .aipanel-session-delete-btn{color:#ffffffb3}.aipanel-session-item.active .aipanel-session-delete-btn:hover{background:#fff3;color:#fff}.aipanel-session-header-skeleton{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:none;justify-content:space-between;align-items:center}.aipanel-session-header-skeleton.visible{display:flex}.aipanel-skeleton-header-title{height:18px;width:80px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.aipanel-skeleton-header-btn{width:28px;height:28px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.aipanel-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.aipanel-session-skeleton.visible{display:block}.aipanel-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--ap-skeleton-bg)}.aipanel-skeleton-title{height:16px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.aipanel-skeleton-meta{height:12px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.aipanel-session-empty{padding:32px 16px;text-align:center;color:var(--ap-text-placeholder);font-size:13px}.aipanel-session-state{position:relative;flex:0 0 auto;width:10px;height:10px;margin-right:6px}.aipanel-session-state-pending:before,.aipanel-session-state-completed:before{content:"";position:absolute;inset:0;border-radius:50%;background:currentColor;opacity:.1}.aipanel-session-state-pending:after,.aipanel-session-state-completed:after{content:"";position:absolute;inset:20%;border-radius:50%;background:currentColor}.aipanel-session-state-pending{color:var(--ap-state-pending)}.aipanel-session-state-completed{color:var(--ap-state-completed)}.aipanel-session-state-ongoing{color:var(--ap-state-ongoing)}.aipanel-session-ongoing-cell{fill:currentColor;opacity:.15;animation:aipanel-ongoing-chase 1s infinite}@keyframes aipanel-ongoing-chase{0%,12.4%{opacity:1}12.5%,24.9%{opacity:.6}25%,37.4%{opacity:.35}37.5%,to{opacity:.15}}.aipanel-session-item.active .aipanel-session-state-pending{color:var(--ap-state-pending)}.aipanel-session-item.active .aipanel-session-state-completed{color:var(--ap-state-completed)}.aipanel-session-item.active .aipanel-session-state-ongoing{color:#fffffff2}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
@@ -31,20 +31,61 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
31
31
  if (showSessionListSkeleton.value) return true;
32
32
  return false;
33
33
  });
34
- function isSessionThinking(sessionId) {
35
- if (!sessionStates?.value || !sessionId) return false;
36
- return sessionStates.value[sessionId]?.thinking ?? false;
34
+ const ONGOING_CELLS = [
35
+ { x: 0, y: 0, delay: "-1000ms" },
36
+ { x: 4, y: 0, delay: "-875ms" },
37
+ { x: 8, y: 0, delay: "-750ms" },
38
+ { x: 8, y: 4, delay: "-625ms" },
39
+ { x: 8, y: 8, delay: "-500ms" },
40
+ { x: 4, y: 8, delay: "-375ms" },
41
+ { x: 0, y: 8, delay: "-250ms" },
42
+ { x: 0, y: 4, delay: "-125ms" }
43
+ ];
44
+ const PENDING_LABELS = {
45
+ approval: "\u7B49\u5F85\u5BA1\u6279",
46
+ "plan-review": "\u7B49\u5F85\u8BA1\u5212\u786E\u8BA4",
47
+ question: "\u7B49\u5F85\u56DE\u590D"
48
+ };
49
+ function runningLabel(sessionId) {
50
+ const n = sessionStates?.value?.[sessionId]?.subagentsRunning ?? 0;
51
+ return n > 0 ? "\u5B50\u4EE3\u7406\u8FD0\u884C\u4E2D (" + n + ")" : "\u8FD0\u884C\u4E2D";
52
+ }
53
+ function sessionRowStatus(sessionId) {
54
+ const state = sessionStates?.value?.[sessionId];
55
+ if (!state) return "idle";
56
+ if (state.hasPending) return "pending";
57
+ const subagentsRunning = (state.subagentsRunning ?? 0) > 0;
58
+ if (subagentsRunning) return "running";
59
+ if (state.thinking) return "thinking";
60
+ const running = state.statusType === "running" || state.statusType === "streaming";
61
+ if (running) return "running";
62
+ if (state.completed) return "completed";
63
+ return "idle";
64
+ }
65
+ function pendingLabel(sessionId) {
66
+ const kind = sessionStates?.value?.[sessionId]?.pendingKind;
67
+ return kind && PENDING_LABELS[kind] || "\u7B49\u5F85\u7528\u6237";
68
+ }
69
+ function isSessionActive(sessionId) {
70
+ const status = sessionRowStatus(sessionId);
71
+ return status === "thinking" || status === "running";
72
+ }
73
+ function isSessionPending(sessionId) {
74
+ return sessionRowStatus(sessionId) === "pending";
75
+ }
76
+ function isSessionCompleted(sessionId) {
77
+ return sessionRowStatus(sessionId) === "completed";
37
78
  }
38
79
  const __returned__ = { collapsed, sessions, loadingSessionList, showSessionListSkeleton, handleCreateSession, handleSelectSession, handleDeleteSession, sessionKey, sessionStates, isAnimating, get animTimer() {
39
80
  return animTimer;
40
81
  }, set animTimer(v) {
41
82
  animTimer = v;
42
- }, showSkeleton, isSessionThinking };
83
+ }, showSkeleton, ONGOING_CELLS, PENDING_LABELS, runningLabel, sessionRowStatus, pendingLabel, isSessionActive, isSessionPending, isSessionCompleted };
43
84
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
44
85
  return __returned__;
45
86
  }
46
87
  });
47
- import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment, renderList as _renderList, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, renderSlot as _renderSlot } from "vue";
88
+ import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment, renderList as _renderList, normalizeStyle as _normalizeStyle, toDisplayString as _toDisplayString, withModifiers as _withModifiers, normalizeClass as _normalizeClass, renderSlot as _renderSlot } from "vue";
48
89
  const _hoisted_1 = {
49
90
  key: 0,
50
91
  class: "aipanel-session-list-header"
@@ -65,12 +106,17 @@ const _hoisted_4 = {
65
106
  const _hoisted_5 = ["aria-selected", "onClick"];
66
107
  const _hoisted_6 = { class: "aipanel-session-header" };
67
108
  const _hoisted_7 = { class: "aipanel-session-title" };
68
- const _hoisted_8 = {
69
- key: 0,
70
- class: "aipanel-thinking-loading"
109
+ const _hoisted_8 = ["title"];
110
+ const _hoisted_9 = ["title"];
111
+ const _hoisted_10 = ["x", "y"];
112
+ const _hoisted_11 = {
113
+ key: 2,
114
+ class: "aipanel-session-state aipanel-session-state-completed",
115
+ title: "\u5DF2\u5B8C\u6210"
71
116
  };
72
- const _hoisted_9 = ["aria-label", "onClick"];
73
- const _hoisted_10 = { class: "aipanel-session-meta" };
117
+ const _hoisted_12 = { class: "aipanel-session-title-text" };
118
+ const _hoisted_13 = ["aria-label", "onClick"];
119
+ const _hoisted_14 = { class: "aipanel-session-meta" };
74
120
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
75
121
  return _openBlock(), _createElementBlock(
76
122
  "div",
@@ -163,16 +209,49 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
163
209
  _renderList($setup.sessions, (item) => {
164
210
  return _openBlock(), _createElementBlock("div", {
165
211
  key: item[$setup.sessionKey],
166
- class: _normalizeClass(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionThinking(item.id) }]),
212
+ class: _normalizeClass(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionActive(item.id) }]),
167
213
  role: "option",
168
214
  "aria-selected": item.active,
169
215
  onClick: ($event) => $setup.handleSelectSession(item)
170
216
  }, [
171
217
  _createElementVNode("div", _hoisted_6, [
172
218
  _createElementVNode("div", _hoisted_7, [
173
- $setup.isSessionThinking(item.id) ? (_openBlock(), _createElementBlock("span", _hoisted_8)) : _createCommentVNode("v-if", true),
174
- _createTextVNode(
175
- " " + _toDisplayString(item.title),
219
+ _createCommentVNode(" \u72B6\u6001\u6307\u793A\uFF1Apending=\u7425\u73C0\u70B9 > \u6D3B\u8DC3(thinking/running/\u5B50\u4EE3\u7406)=\u8F6C\u5708 > completed=\u7EFF\u70B9 > idle "),
220
+ $setup.isSessionPending(item.id) ? (_openBlock(), _createElementBlock("span", {
221
+ key: 0,
222
+ class: "aipanel-session-state aipanel-session-state-pending",
223
+ title: $setup.pendingLabel(item.id)
224
+ }, null, 8, _hoisted_8)) : $setup.isSessionActive(item.id) ? (_openBlock(), _createElementBlock("svg", {
225
+ key: 1,
226
+ class: "aipanel-session-state aipanel-session-state-ongoing",
227
+ title: $setup.runningLabel(item.id),
228
+ viewBox: "0 0 10 10",
229
+ width: "10",
230
+ height: "10",
231
+ "aria-hidden": "true"
232
+ }, [
233
+ (_openBlock(), _createElementBlock(
234
+ _Fragment,
235
+ null,
236
+ _renderList($setup.ONGOING_CELLS, (c) => {
237
+ return _createElementVNode("rect", {
238
+ key: c.x + "-" + c.y,
239
+ x: c.x,
240
+ y: c.y,
241
+ width: "2",
242
+ height: "2",
243
+ style: _normalizeStyle({ animationDelay: c.delay }),
244
+ class: "aipanel-session-ongoing-cell"
245
+ }, null, 12, _hoisted_10);
246
+ }),
247
+ 64
248
+ /* STABLE_FRAGMENT */
249
+ ))
250
+ ], 8, _hoisted_9)) : $setup.isSessionCompleted(item.id) ? (_openBlock(), _createElementBlock("span", _hoisted_11)) : _createCommentVNode("v-if", true),
251
+ _createElementVNode(
252
+ "span",
253
+ _hoisted_12,
254
+ _toDisplayString(item.title),
176
255
  1
177
256
  /* TEXT */
178
257
  )
@@ -182,11 +261,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
182
261
  type: "button",
183
262
  "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
184
263
  onClick: _withModifiers(($event) => $setup.handleDeleteSession(item), ["stop"])
185
- }, " \xD7 ", 8, _hoisted_9)
264
+ }, " \xD7 ", 8, _hoisted_13)
186
265
  ]),
187
266
  _createElementVNode(
188
267
  "div",
189
- _hoisted_10,
268
+ _hoisted_14,
190
269
  _toDisplayString(item.meta),
191
270
  1
192
271
  /* TEXT */
@@ -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: #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-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--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-state-pending: #fbbf24;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--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}
@@ -47,8 +47,8 @@ declare const __VLS_base: import("vue").DefineComponent<AIPanelWidgetProps, {
47
47
  displayMode: import("@aipanel/core").DisplayMode;
48
48
  showSessionListSkeleton: boolean;
49
49
  sessionKey: string;
50
- sessions: import("@aipanel/core").AIPanelWidgetSession[];
51
50
  thinking: boolean;
51
+ sessions: import("@aipanel/core").AIPanelWidgetSession[];
52
52
  showClearAll: boolean;
53
53
  open: boolean;
54
54
  selectShortcutLabel: string;
@@ -95,9 +95,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
95
95
  };
96
96
  const localSessionListCollapsed = ref(props.sessionListCollapsed);
97
97
  const localDisplayMode = ref(props.displayMode);
98
- const localSplitPosition = ref(
99
- props.splitMode?.position ?? "right"
100
- );
98
+ const localSplitPosition = ref(props.splitMode?.position ?? "right");
101
99
  const minimized = ref(false);
102
100
  const promptDockVisible = ref(true);
103
101
  const reviewPanelVisible = ref(false);
@@ -136,7 +134,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
136
134
  }
137
135
  );
138
136
  const handleToggleDisplayMode = () => {
139
- if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector") return;
137
+ if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector")
138
+ return;
140
139
  const modes = ["bubble", "split", "auto"];
141
140
  const currentIndex = modes.indexOf(localDisplayMode.value);
142
141
  const nextIndex = (currentIndex + 1) % modes.length;
@@ -397,7 +396,10 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
397
396
  const gap = 24;
398
397
  const bubbleSize = 44;
399
398
  const screenMargin = 20;
400
- const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? { x: windowWidth.value - bubbleSize - gap, y: windowHeight.value - bubbleSize - gap };
399
+ const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? {
400
+ x: windowWidth.value - bubbleSize - gap,
401
+ y: windowHeight.value - bubbleSize - gap
402
+ };
401
403
  const style = {};
402
404
  if (isBubbleOnRightSide.value) {
403
405
  let rightPos = windowWidth.value - effectiveOffset.x + gap;
@@ -746,11 +748,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
746
748
  _createElementVNode("button", {
747
749
  class: "aipanel-dialog-btn cancel",
748
750
  onClick: $setup.handleDialogCancel
749
- }, "\u53D6\u6D88"),
751
+ }, " \u53D6\u6D88 "),
750
752
  _createElementVNode("button", {
751
753
  class: "aipanel-dialog-btn confirm",
752
754
  onClick: $setup.handleDialogConfirm
753
- }, "\u786E\u8BA4")
755
+ }, " \u786E\u8BA4 ")
754
756
  ])
755
757
  ])
756
758
  ])) : _createCommentVNode("v-if", true),
package/es/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.11";
3
3
  declare function install(app: App<any>, options?: any): void;
4
4
  export { install, version, };
5
5
  export * from './AI-panel-widget';
package/es/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AIPanelWidget } from "./AI-panel-widget/index.mjs";
2
- const version = "1.2.10";
2
+ const version = "1.2.11";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  AIPanelWidget
@@ -21,6 +21,21 @@ __export(use_session_exports, {
21
21
  });
22
22
  module.exports = __toCommonJS(use_session_exports);
23
23
  var import_vue = require("vue");
24
+ function formatRelativeTime(ts) {
25
+ const time = new Date(ts).getTime();
26
+ if (Number.isNaN(time)) return "";
27
+ const diff = Date.now() - time;
28
+ if (diff < 0) return "\u521A\u521A";
29
+ const minute = 6e4;
30
+ const hour = 60 * minute;
31
+ const day = 24 * hour;
32
+ if (diff < minute) return "\u521A\u521A";
33
+ if (diff < hour) return `${Math.floor(diff / minute)} \u5206\u949F\u524D`;
34
+ if (diff < day) return `${Math.floor(diff / hour)} \u5C0F\u65F6\u524D`;
35
+ if (diff < 7 * day) return `${Math.floor(diff / day)} \u5929\u524D`;
36
+ const date = new Date(time);
37
+ return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
38
+ }
24
39
  function formatSessionMeta(session) {
25
40
  if (session.meta) {
26
41
  return session.meta;
@@ -28,11 +43,7 @@ function formatSessionMeta(session) {
28
43
  if (!session.updatedAt) {
29
44
  return "";
30
45
  }
31
- const date = new Date(session.updatedAt);
32
- if (Number.isNaN(date.getTime())) {
33
- return "";
34
- }
35
- return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
46
+ return formatRelativeTime(session.updatedAt);
36
47
  }
37
48
  function useSession(options) {
38
49
  const sessionItems = (0, import_vue.computed)(
@@ -1 +1 @@
1
- .aipanel-session-list{width:240px;background:var(--ap-bg-secondary);border-right:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.aipanel-session-list.collapsed{width:0;overflow:hidden}.aipanel-session-list.collapsed .aipanel-session-list-header,.aipanel-session-list.collapsed .aipanel-session-list-content{display:none}.aipanel-session-list-header{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--ap-text-primary)}.aipanel-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--ap-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.aipanel-new-session-btn:hover{background:var(--ap-primary-hover);transform:scale(1.05)}.aipanel-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.aipanel-session-list-loading-overlay{position:absolute;inset:0;background:var(--ap-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.aipanel-loading-spinner.small{width:24px;height:24px;border-width:2px}.aipanel-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--ap-text-primary)}.aipanel-session-item:hover{background:var(--ap-bg-tertiary)}.aipanel-session-item.active{background:var(--ap-primary);color:#fff;transition:none}.aipanel-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-session-meta{font-size:12px;opacity:.6}.aipanel-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.aipanel-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.aipanel-session-item:hover .aipanel-session-delete-btn{opacity:1}.aipanel-session-delete-btn:hover{background:var(--ap-danger);color:#fff}.aipanel-session-item.active .aipanel-session-delete-btn{color:#ffffffb3}.aipanel-session-item.active .aipanel-session-delete-btn:hover{background:#fff3;color:#fff}.aipanel-session-header-skeleton{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:none;justify-content:space-between;align-items:center}.aipanel-session-header-skeleton.visible{display:flex}.aipanel-skeleton-header-title{height:18px;width:80px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.aipanel-skeleton-header-btn{width:28px;height:28px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.aipanel-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.aipanel-session-skeleton.visible{display:block}.aipanel-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--ap-skeleton-bg)}.aipanel-skeleton-title{height:16px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.aipanel-skeleton-meta{height:12px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.aipanel-session-empty{padding:32px 16px;text-align:center;color:var(--ap-text-placeholder);font-size:13px}.aipanel-thinking-loading{display:inline-block;width:12px;height:12px;margin-right:6px;border:2px solid var(--ap-border-secondary);border-top-color:var(--ap-text-secondary);border-radius:50%;animation:thinking-spin .8s linear infinite;vertical-align:middle}.aipanel-session-item.active .aipanel-thinking-loading{border-color:#ffffff4d;border-top-color:#ffffffe6}@keyframes thinking-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
1
+ .aipanel-session-list{width:240px;background:var(--ap-bg-secondary);border-right:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.aipanel-session-list.collapsed{width:0;overflow:hidden}.aipanel-session-list.collapsed .aipanel-session-list-header,.aipanel-session-list.collapsed .aipanel-session-list-content{display:none}.aipanel-session-list-header{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--ap-text-primary)}.aipanel-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--ap-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.aipanel-new-session-btn:hover{background:var(--ap-primary-hover);transform:scale(1.05)}.aipanel-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.aipanel-session-list-loading-overlay{position:absolute;inset:0;background:var(--ap-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.aipanel-loading-spinner.small{width:24px;height:24px;border-width:2px}.aipanel-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--ap-text-primary)}.aipanel-session-item:hover{background:var(--ap-bg-tertiary)}.aipanel-session-item.active{background:var(--ap-primary);color:#fff;transition:none}.aipanel-session-title{display:flex;align-items:center;min-width:0;font-size:14px;font-weight:500;margin-bottom:4px}.aipanel-session-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.aipanel-session-meta{font-size:12px;opacity:.6}.aipanel-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.aipanel-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.aipanel-session-item:hover .aipanel-session-delete-btn{opacity:1}.aipanel-session-delete-btn:hover{background:var(--ap-danger);color:#fff}.aipanel-session-item.active .aipanel-session-delete-btn{color:#ffffffb3}.aipanel-session-item.active .aipanel-session-delete-btn:hover{background:#fff3;color:#fff}.aipanel-session-header-skeleton{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:none;justify-content:space-between;align-items:center}.aipanel-session-header-skeleton.visible{display:flex}.aipanel-skeleton-header-title{height:18px;width:80px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.aipanel-skeleton-header-btn{width:28px;height:28px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.aipanel-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.aipanel-session-skeleton.visible{display:block}.aipanel-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--ap-skeleton-bg)}.aipanel-skeleton-title{height:16px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.aipanel-skeleton-meta{height:12px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.aipanel-session-empty{padding:32px 16px;text-align:center;color:var(--ap-text-placeholder);font-size:13px}.aipanel-session-state{position:relative;flex:0 0 auto;width:10px;height:10px;margin-right:6px}.aipanel-session-state-pending:before,.aipanel-session-state-completed:before{content:"";position:absolute;inset:0;border-radius:50%;background:currentColor;opacity:.1}.aipanel-session-state-pending:after,.aipanel-session-state-completed:after{content:"";position:absolute;inset:20%;border-radius:50%;background:currentColor}.aipanel-session-state-pending{color:var(--ap-state-pending)}.aipanel-session-state-completed{color:var(--ap-state-completed)}.aipanel-session-state-ongoing{color:var(--ap-state-ongoing)}.aipanel-session-ongoing-cell{fill:currentColor;opacity:.15;animation:aipanel-ongoing-chase 1s infinite}@keyframes aipanel-ongoing-chase{0%,12.4%{opacity:1}12.5%,24.9%{opacity:.6}25%,37.4%{opacity:.35}37.5%,to{opacity:.15}}.aipanel-session-item.active .aipanel-session-state-pending{color:var(--ap-state-pending)}.aipanel-session-item.active .aipanel-session-state-completed{color:var(--ap-state-completed)}.aipanel-session-item.active .aipanel-session-state-ongoing{color:#fffffff2}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
@@ -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
  }
@@ -87,12 +128,17 @@ const _hoisted_4 = {
87
128
  const _hoisted_5 = ["aria-selected", "onClick"];
88
129
  const _hoisted_6 = { class: "aipanel-session-header" };
89
130
  const _hoisted_7 = { class: "aipanel-session-title" };
90
- const _hoisted_8 = {
91
- key: 0,
92
- class: "aipanel-thinking-loading"
131
+ const _hoisted_8 = ["title"];
132
+ const _hoisted_9 = ["title"];
133
+ const _hoisted_10 = ["x", "y"];
134
+ const _hoisted_11 = {
135
+ key: 2,
136
+ class: "aipanel-session-state aipanel-session-state-completed",
137
+ title: "\u5DF2\u5B8C\u6210"
93
138
  };
94
- const _hoisted_9 = ["aria-label", "onClick"];
95
- const _hoisted_10 = { class: "aipanel-session-meta" };
139
+ const _hoisted_12 = { class: "aipanel-session-title-text" };
140
+ const _hoisted_13 = ["aria-label", "onClick"];
141
+ const _hoisted_14 = { class: "aipanel-session-meta" };
96
142
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
97
143
  return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
98
144
  "div",
@@ -185,16 +231,49 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
185
231
  (0, import_vue3.renderList)($setup.sessions, (item) => {
186
232
  return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", {
187
233
  key: item[$setup.sessionKey],
188
- class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionThinking(item.id) }]),
234
+ class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionActive(item.id) }]),
189
235
  role: "option",
190
236
  "aria-selected": item.active,
191
237
  onClick: ($event) => $setup.handleSelectSession(item)
192
238
  }, [
193
239
  (0, import_vue3.createElementVNode)("div", _hoisted_6, [
194
240
  (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),
241
+ (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 "),
242
+ $setup.isSessionPending(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", {
243
+ key: 0,
244
+ class: "aipanel-session-state aipanel-session-state-pending",
245
+ title: $setup.pendingLabel(item.id)
246
+ }, null, 8, _hoisted_8)) : $setup.isSessionActive(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", {
247
+ key: 1,
248
+ class: "aipanel-session-state aipanel-session-state-ongoing",
249
+ title: $setup.runningLabel(item.id),
250
+ viewBox: "0 0 10 10",
251
+ width: "10",
252
+ height: "10",
253
+ "aria-hidden": "true"
254
+ }, [
255
+ ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
256
+ import_vue3.Fragment,
257
+ null,
258
+ (0, import_vue3.renderList)($setup.ONGOING_CELLS, (c) => {
259
+ return (0, import_vue3.createElementVNode)("rect", {
260
+ key: c.x + "-" + c.y,
261
+ x: c.x,
262
+ y: c.y,
263
+ width: "2",
264
+ height: "2",
265
+ style: (0, import_vue3.normalizeStyle)({ animationDelay: c.delay }),
266
+ class: "aipanel-session-ongoing-cell"
267
+ }, null, 12, _hoisted_10);
268
+ }),
269
+ 64
270
+ /* STABLE_FRAGMENT */
271
+ ))
272
+ ], 8, _hoisted_9)) : $setup.isSessionCompleted(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", _hoisted_11)) : (0, import_vue3.createCommentVNode)("v-if", true),
273
+ (0, import_vue3.createElementVNode)(
274
+ "span",
275
+ _hoisted_12,
276
+ (0, import_vue3.toDisplayString)(item.title),
198
277
  1
199
278
  /* TEXT */
200
279
  )
@@ -204,11 +283,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
204
283
  type: "button",
205
284
  "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
206
285
  onClick: (0, import_vue3.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
207
- }, " \xD7 ", 8, _hoisted_9)
286
+ }, " \xD7 ", 8, _hoisted_13)
208
287
  ]),
209
288
  (0, import_vue3.createElementVNode)(
210
289
  "div",
211
- _hoisted_10,
290
+ _hoisted_14,
212
291
  (0, import_vue3.toDisplayString)(item.meta),
213
292
  1
214
293
  /* TEXT */
@@ -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: #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-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--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-state-pending: #fbbf24;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--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}
@@ -128,9 +128,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
128
128
  };
129
129
  const localSessionListCollapsed = (0, import_vue2.ref)(props.sessionListCollapsed);
130
130
  const localDisplayMode = (0, import_vue2.ref)(props.displayMode);
131
- const localSplitPosition = (0, import_vue2.ref)(
132
- props.splitMode?.position ?? "right"
133
- );
131
+ const localSplitPosition = (0, import_vue2.ref)(props.splitMode?.position ?? "right");
134
132
  const minimized = (0, import_vue2.ref)(false);
135
133
  const promptDockVisible = (0, import_vue2.ref)(true);
136
134
  const reviewPanelVisible = (0, import_vue2.ref)(false);
@@ -169,7 +167,8 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
169
167
  }
170
168
  );
171
169
  const handleToggleDisplayMode = () => {
172
- if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector") return;
170
+ if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector")
171
+ return;
173
172
  const modes = ["bubble", "split", "auto"];
174
173
  const currentIndex = modes.indexOf(localDisplayMode.value);
175
174
  const nextIndex = (currentIndex + 1) % modes.length;
@@ -430,7 +429,10 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
430
429
  const gap = 24;
431
430
  const bubbleSize = 44;
432
431
  const screenMargin = 20;
433
- const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? { x: windowWidth.value - bubbleSize - gap, y: windowHeight.value - bubbleSize - gap };
432
+ const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? {
433
+ x: windowWidth.value - bubbleSize - gap,
434
+ y: windowHeight.value - bubbleSize - gap
435
+ };
434
436
  const style = {};
435
437
  if (isBubbleOnRightSide.value) {
436
438
  let rightPos = windowWidth.value - effectiveOffset.x + gap;
@@ -778,11 +780,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
778
780
  (0, import_vue3.createElementVNode)("button", {
779
781
  class: "aipanel-dialog-btn cancel",
780
782
  onClick: $setup.handleDialogCancel
781
- }, "\u53D6\u6D88"),
783
+ }, " \u53D6\u6D88 "),
782
784
  (0, import_vue3.createElementVNode)("button", {
783
785
  class: "aipanel-dialog-btn confirm",
784
786
  onClick: $setup.handleDialogConfirm
785
- }, "\u786E\u8BA4")
787
+ }, " \u786E\u8BA4 ")
786
788
  ])
787
789
  ])
788
790
  ])) : (0, import_vue3.createCommentVNode)("v-if", true),
@@ -47,8 +47,8 @@ declare const __VLS_base: import("vue").DefineComponent<AIPanelWidgetProps, {
47
47
  displayMode: import("@aipanel/core").DisplayMode;
48
48
  showSessionListSkeleton: boolean;
49
49
  sessionKey: string;
50
- sessions: import("@aipanel/core").AIPanelWidgetSession[];
51
50
  thinking: boolean;
51
+ sessions: import("@aipanel/core").AIPanelWidgetSession[];
52
52
  showClearAll: boolean;
53
53
  open: boolean;
54
54
  selectShortcutLabel: string;
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.11";
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.11";
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.11",
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.11"
35
35
  },
36
36
  "scripts": {
37
37
  "build": "pagoda-cli build",