cli-jaw 1.6.14 → 1.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/assets/shark.svg +1 -0
- package/public/dist/assets/{employees-zxrU6ZV_.js → employees-V7lNStu1.js} +1 -1
- package/public/dist/assets/{index-D61icK-D.js → index-Cpe1jccL.js} +4 -4
- package/public/dist/assets/render-BoxeLlL9.js +25 -0
- package/public/dist/assets/settings-BcKp6ppP.js +1 -0
- package/public/dist/assets/{settings-Dl3RnWsB.js → settings-CBCg5Jhh.js} +1 -1
- package/public/dist/assets/skills-BuAXFNgp.js +1 -0
- package/public/dist/assets/{skills-DhiCSGws.js → skills-RbauGmBZ.js} +1 -1
- package/public/dist/assets/{slash-commands-B1k1vFJG.js → slash-commands-BgKxc49D.js} +1 -1
- package/public/dist/assets/slash-commands-DXGb_iGA.js +1 -0
- package/public/dist/assets/ui-KQ8_sSP8.js +131 -0
- package/public/dist/assets/ui-rD__Mvbs.js +1 -0
- package/public/dist/assets/vendor-icons-C6LXvgi0.js +1 -0
- package/public/dist/assets/{ws-CleMWrLF.js → ws-BtTpgocf.js} +1 -1
- package/public/dist/index.html +3 -3
- package/public/index.html +2 -2
- package/public/js/features/avatar.ts +5 -3
- package/public/js/icons.ts +10 -4
- package/public/js/ui.ts +87 -73
- package/public/js/virtual-scroll-bootstrap.ts +42 -0
- package/public/js/virtual-scroll.ts +140 -49
- package/public/dist/assets/render-CVr6a-dp.js +0 -25
- package/public/dist/assets/settings-BHIV4l1s.js +0 -1
- package/public/dist/assets/skills-JuDja1UC.js +0 -1
- package/public/dist/assets/slash-commands-DyLS0abr.js +0 -1
- package/public/dist/assets/ui-BXZhbE_1.js +0 -131
- package/public/dist/assets/ui-qR28iS0L.js +0 -1
- package/public/dist/assets/vendor-icons-BqxEYYco.js +0 -1
|
@@ -27,7 +27,13 @@ export class VirtualScroll {
|
|
|
27
27
|
private firstVisible = -1;
|
|
28
28
|
private lastVisible = -1;
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
// Prefix sum for O(log n) offset lookup
|
|
31
|
+
private prefixHeights: number[] = [0];
|
|
32
|
+
private prefixDirtyFrom = 0;
|
|
33
|
+
|
|
34
|
+
// Spacing model — measured from rendered .msg margin-bottom
|
|
35
|
+
private itemSpacing = 0;
|
|
36
|
+
|
|
31
37
|
onLazyRender: LazyRenderCallback | null = null;
|
|
32
38
|
onPostRender: ((viewport: HTMLElement) => void) | null = null;
|
|
33
39
|
|
|
@@ -44,8 +50,69 @@ export class VirtualScroll {
|
|
|
44
50
|
get active(): boolean { return this._active; }
|
|
45
51
|
get count(): number { return this.items.length; }
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
// ── Prefix sum helpers ──
|
|
54
|
+
|
|
55
|
+
private markPrefixDirty(from: number): void {
|
|
56
|
+
this.prefixDirtyFrom = Math.min(this.prefixDirtyFrom, Math.max(0, from));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private rebuildPrefixHeights(): void {
|
|
60
|
+
const n = this.items.length;
|
|
61
|
+
if (this.prefixHeights.length !== n + 1) {
|
|
62
|
+
this.prefixHeights = new Array(n + 1).fill(0);
|
|
63
|
+
this.prefixDirtyFrom = 0;
|
|
64
|
+
}
|
|
65
|
+
for (let i = this.prefixDirtyFrom; i < n; i++) {
|
|
66
|
+
this.prefixHeights[i + 1] = this.prefixHeights[i] + this.items[i].height;
|
|
67
|
+
}
|
|
68
|
+
this.prefixDirtyFrom = n;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Raw cumulative height up to (but not including) index */
|
|
72
|
+
private offsetForIndex(index: number): number {
|
|
73
|
+
this.rebuildPrefixHeights();
|
|
74
|
+
return this.prefixHeights[Math.max(0, Math.min(index, this.items.length))];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Effective offset including inter-item spacing (margin-bottom) */
|
|
78
|
+
private effectiveOffset(index: number): number {
|
|
79
|
+
return this.offsetForIndex(index) + index * this.itemSpacing;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Total effective height of all items with spacing */
|
|
83
|
+
private totalEffectiveHeight(): number {
|
|
84
|
+
const n = this.items.length;
|
|
85
|
+
if (n === 0) return 0;
|
|
86
|
+
return this.offsetForIndex(n) + (n - 1) * this.itemSpacing;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Binary search: find item index at given scroll offset */
|
|
90
|
+
private indexForOffset(offset: number): number {
|
|
91
|
+
this.rebuildPrefixHeights();
|
|
92
|
+
const n = this.items.length;
|
|
93
|
+
if (n === 0) return 0;
|
|
94
|
+
let lo = 0;
|
|
95
|
+
let hi = n - 1;
|
|
96
|
+
while (lo < hi) {
|
|
97
|
+
const mid = (lo + hi + 1) >> 1;
|
|
98
|
+
const effOff = this.prefixHeights[mid] + mid * this.itemSpacing;
|
|
99
|
+
if (effOff <= offset) lo = mid;
|
|
100
|
+
else hi = mid - 1;
|
|
101
|
+
}
|
|
102
|
+
return lo;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ── Spacing model ──
|
|
106
|
+
|
|
107
|
+
private refreshLayoutMetrics(): void {
|
|
108
|
+
const sample = this.viewport.querySelector<HTMLElement>('.msg');
|
|
109
|
+
if (sample) {
|
|
110
|
+
this.itemSpacing = parseFloat(getComputedStyle(sample).marginBottom) || 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ── Public API ──
|
|
115
|
+
|
|
49
116
|
flushToDOM(): void {
|
|
50
117
|
if (!this._active) return;
|
|
51
118
|
this.container.classList.remove('vs-active');
|
|
@@ -57,15 +124,45 @@ export class VirtualScroll {
|
|
|
57
124
|
this.lastVisible = -1;
|
|
58
125
|
this.items = [];
|
|
59
126
|
this._totalHeight = 0;
|
|
127
|
+
this.prefixHeights = [0];
|
|
128
|
+
this.prefixDirtyFrom = 0;
|
|
129
|
+
this.itemSpacing = 0;
|
|
60
130
|
}
|
|
61
131
|
|
|
62
|
-
/** Bulk-load items
|
|
63
|
-
|
|
64
|
-
|
|
132
|
+
/** Bulk-load items. Call AFTER registering onLazyRender/onPostRender. */
|
|
133
|
+
setItems(
|
|
134
|
+
items: VirtualItem[],
|
|
135
|
+
options?: { autoActivate?: boolean; toBottom?: boolean },
|
|
136
|
+
): void {
|
|
65
137
|
this.items = items;
|
|
66
138
|
this._totalHeight = items.reduce((sum, it) => sum + it.height, 0);
|
|
139
|
+
this.prefixHeights = new Array(items.length + 1).fill(0);
|
|
140
|
+
this.prefixDirtyFrom = 0;
|
|
141
|
+
if (options?.autoActivate === false) return;
|
|
67
142
|
if (!this._active && this.items.length >= THRESHOLD) {
|
|
68
|
-
this.activate(true);
|
|
143
|
+
this.activate(options?.toBottom ?? true);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Seed measured heights before activation. */
|
|
148
|
+
seedMeasuredHeights(startIndex: number, heights: number[]): void {
|
|
149
|
+
for (let offset = 0; offset < heights.length; offset++) {
|
|
150
|
+
const idx = startIndex + offset;
|
|
151
|
+
const item = this.items[idx];
|
|
152
|
+
if (!item) continue;
|
|
153
|
+
const oldH = item.height;
|
|
154
|
+
const nextH = heights[offset];
|
|
155
|
+
if (oldH === nextH) continue;
|
|
156
|
+
item.height = nextH;
|
|
157
|
+
this._totalHeight += nextH - oldH;
|
|
158
|
+
this.markPrefixDirty(idx);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Activate if threshold met. */
|
|
163
|
+
activateIfNeeded(toBottom = false): void {
|
|
164
|
+
if (!this._active && this.items.length >= THRESHOLD) {
|
|
165
|
+
this.activate(toBottom);
|
|
69
166
|
}
|
|
70
167
|
}
|
|
71
168
|
|
|
@@ -73,6 +170,7 @@ export class VirtualScroll {
|
|
|
73
170
|
const item: VirtualItem = { id, html, height: EST_HEIGHT };
|
|
74
171
|
this.items.push(item);
|
|
75
172
|
this._totalHeight += EST_HEIGHT;
|
|
173
|
+
this.markPrefixDirty(this.items.length - 1);
|
|
76
174
|
if (!this._active && this.items.length >= THRESHOLD) {
|
|
77
175
|
this.activate(true);
|
|
78
176
|
}
|
|
@@ -81,8 +179,6 @@ export class VirtualScroll {
|
|
|
81
179
|
}
|
|
82
180
|
}
|
|
83
181
|
|
|
84
|
-
/** Append a live DOM element while keeping VS active.
|
|
85
|
-
* Serializes to HTML for virtual storage. */
|
|
86
182
|
appendLiveItem(div: HTMLElement): void {
|
|
87
183
|
if (!this._active) return;
|
|
88
184
|
const html = div.outerHTML;
|
|
@@ -90,11 +186,10 @@ export class VirtualScroll {
|
|
|
90
186
|
const item: VirtualItem = { id, html, height: EST_HEIGHT };
|
|
91
187
|
this.items.push(item);
|
|
92
188
|
this._totalHeight += EST_HEIGHT;
|
|
93
|
-
|
|
189
|
+
this.markPrefixDirty(this.items.length - 1);
|
|
94
190
|
this.scrollToBottom();
|
|
95
191
|
}
|
|
96
192
|
|
|
97
|
-
/** Update cached HTML for a specific item index (used by lazy render). */
|
|
98
193
|
updateItemHtml(idx: number, html: string): void {
|
|
99
194
|
if (this.items[idx]) {
|
|
100
195
|
this.items[idx].html = html;
|
|
@@ -103,7 +198,6 @@ export class VirtualScroll {
|
|
|
103
198
|
|
|
104
199
|
private scrollHandler = () => this.scheduleRender();
|
|
105
200
|
|
|
106
|
-
/** RC6 fix: activate always scrolls to bottom (new messages are at the end) */
|
|
107
201
|
private activate(toBottom = false): void {
|
|
108
202
|
this._active = true;
|
|
109
203
|
this._totalHeight = 0;
|
|
@@ -116,12 +210,16 @@ export class VirtualScroll {
|
|
|
116
210
|
for (const item of this.items) {
|
|
117
211
|
this._totalHeight += item.height;
|
|
118
212
|
}
|
|
213
|
+
this.prefixHeights = new Array(this.items.length + 1).fill(0);
|
|
214
|
+
this.prefixDirtyFrom = 0;
|
|
215
|
+
|
|
119
216
|
this.container.classList.add('vs-active');
|
|
120
217
|
this.container.replaceChildren(this.spacerTop, this.viewport, this.spacerBottom);
|
|
121
218
|
this.container.addEventListener('scroll', this.scrollHandler, { passive: true });
|
|
219
|
+
|
|
122
220
|
if (toBottom) {
|
|
123
|
-
|
|
124
|
-
this.spacerTop.style.height = `${
|
|
221
|
+
const total = this.totalEffectiveHeight();
|
|
222
|
+
this.spacerTop.style.height = `${total}px`;
|
|
125
223
|
this.spacerBottom.style.height = '0px';
|
|
126
224
|
this.container.scrollTop = this.container.scrollHeight;
|
|
127
225
|
this.firstVisible = -1;
|
|
@@ -142,36 +240,25 @@ export class VirtualScroll {
|
|
|
142
240
|
const scrollTop = this.container.scrollTop;
|
|
143
241
|
const viewHeight = this.container.clientHeight;
|
|
144
242
|
|
|
145
|
-
|
|
146
|
-
let startIdx = this.items.length - 1;
|
|
147
|
-
for (let i = 0; i < this.items.length; i++) {
|
|
148
|
-
if (accum + this.items[i].height > scrollTop) {
|
|
149
|
-
startIdx = i;
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
accum += this.items[i].height;
|
|
153
|
-
}
|
|
154
|
-
|
|
243
|
+
const startIdx = this.indexForOffset(scrollTop);
|
|
155
244
|
const first = Math.max(0, startIdx - BUFFER);
|
|
156
|
-
|
|
245
|
+
|
|
157
246
|
let endIdx = startIdx;
|
|
158
247
|
for (let i = startIdx; i < this.items.length; i++) {
|
|
159
|
-
endAccum += this.items[i].height;
|
|
160
248
|
endIdx = i;
|
|
161
|
-
if (
|
|
249
|
+
if (this.effectiveOffset(i + 1) > scrollTop + viewHeight) break;
|
|
162
250
|
}
|
|
163
251
|
const last = Math.min(this.items.length - 1, endIdx + BUFFER);
|
|
164
252
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (first === this.firstVisible && last === this.lastVisible) return;
|
|
253
|
+
if (first === this.firstVisible && last === this.lastVisible) {
|
|
254
|
+
// Still update spacers when heights changed (RC3)
|
|
255
|
+
this.refreshLayoutMetrics();
|
|
256
|
+
const topSpace = this.effectiveOffset(first);
|
|
257
|
+
const botSpace = this.effectiveOffset(this.items.length) - this.effectiveOffset(last + 1);
|
|
258
|
+
this.spacerTop.style.height = `${topSpace}px`;
|
|
259
|
+
this.spacerBottom.style.height = `${botSpace}px`;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
175
262
|
this.firstVisible = first;
|
|
176
263
|
this.lastVisible = last;
|
|
177
264
|
|
|
@@ -182,7 +269,6 @@ export class VirtualScroll {
|
|
|
182
269
|
if (!isNaN(idx)) mounted.set(idx, child);
|
|
183
270
|
}
|
|
184
271
|
|
|
185
|
-
// Remove items no longer in range
|
|
186
272
|
for (const [idx, el] of mounted) {
|
|
187
273
|
if (idx < first || idx > last) {
|
|
188
274
|
el.remove();
|
|
@@ -190,7 +276,6 @@ export class VirtualScroll {
|
|
|
190
276
|
}
|
|
191
277
|
}
|
|
192
278
|
|
|
193
|
-
// Build ordered list — reuse existing or create new
|
|
194
279
|
const ordered: HTMLElement[] = [];
|
|
195
280
|
for (let i = first; i <= last; i++) {
|
|
196
281
|
const existing = mounted.get(i);
|
|
@@ -208,7 +293,6 @@ export class VirtualScroll {
|
|
|
208
293
|
}
|
|
209
294
|
}
|
|
210
295
|
|
|
211
|
-
// Reorder viewport children to match (minimal DOM moves)
|
|
212
296
|
let nodeRef = this.viewport.firstChild as HTMLElement | null;
|
|
213
297
|
for (const el of ordered) {
|
|
214
298
|
if (el !== nodeRef) {
|
|
@@ -218,7 +302,15 @@ export class VirtualScroll {
|
|
|
218
302
|
}
|
|
219
303
|
}
|
|
220
304
|
|
|
221
|
-
//
|
|
305
|
+
// Measure spacing from actual DOM AFTER mounting items
|
|
306
|
+
this.refreshLayoutMetrics();
|
|
307
|
+
|
|
308
|
+
// Compute spacers with correct spacing
|
|
309
|
+
const topSpace = this.effectiveOffset(first);
|
|
310
|
+
const botSpace = this.effectiveOffset(this.items.length) - this.effectiveOffset(last + 1);
|
|
311
|
+
this.spacerTop.style.height = `${topSpace}px`;
|
|
312
|
+
this.spacerBottom.style.height = `${botSpace}px`;
|
|
313
|
+
|
|
222
314
|
if (this.onLazyRender) {
|
|
223
315
|
const lazyTargets = this.viewport.querySelectorAll<HTMLElement>('.lazy-pending');
|
|
224
316
|
if (lazyTargets.length > 0) {
|
|
@@ -226,17 +318,13 @@ export class VirtualScroll {
|
|
|
226
318
|
}
|
|
227
319
|
}
|
|
228
320
|
|
|
229
|
-
// Fire post-render callback for widget activation
|
|
230
321
|
if (this.onPostRender) {
|
|
231
322
|
this.onPostRender(this.viewport);
|
|
232
323
|
}
|
|
233
324
|
|
|
234
|
-
// Batch-read heights AFTER lazy render + widget activation
|
|
235
325
|
this.remeasureVisible();
|
|
236
326
|
}
|
|
237
327
|
|
|
238
|
-
/** Batch-read heights from visible elements, batch-write to items array.
|
|
239
|
-
* Separated read/write passes = single forced reflow. */
|
|
240
328
|
private remeasureVisible(): void {
|
|
241
329
|
const wasAtBottom = this.container.scrollHeight - this.container.scrollTop - this.container.clientHeight < 80;
|
|
242
330
|
|
|
@@ -253,6 +341,7 @@ export class VirtualScroll {
|
|
|
253
341
|
if (oldH !== newH) {
|
|
254
342
|
this.items[idx].height = newH;
|
|
255
343
|
this._totalHeight += (newH - oldH);
|
|
344
|
+
this.markPrefixDirty(idx);
|
|
256
345
|
heightChanged = true;
|
|
257
346
|
}
|
|
258
347
|
}
|
|
@@ -261,14 +350,13 @@ export class VirtualScroll {
|
|
|
261
350
|
}
|
|
262
351
|
}
|
|
263
352
|
|
|
264
|
-
/**
|
|
353
|
+
/** Synchronous scroll — cancel pending RAF, update spacers, render directly */
|
|
265
354
|
scrollToBottom(): void {
|
|
266
355
|
if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = null; }
|
|
267
|
-
|
|
268
|
-
this.spacerTop.style.height = `${
|
|
356
|
+
const total = this.totalEffectiveHeight();
|
|
357
|
+
this.spacerTop.style.height = `${total}px`;
|
|
269
358
|
this.spacerBottom.style.height = '0px';
|
|
270
359
|
this.container.scrollTop = this.container.scrollHeight;
|
|
271
|
-
// Reset visible range to force full re-render at new position
|
|
272
360
|
this.firstVisible = -1;
|
|
273
361
|
this.lastVisible = -1;
|
|
274
362
|
this.render();
|
|
@@ -277,6 +365,9 @@ export class VirtualScroll {
|
|
|
277
365
|
clear(): void {
|
|
278
366
|
this.items = [];
|
|
279
367
|
this._totalHeight = 0;
|
|
368
|
+
this.prefixHeights = [0];
|
|
369
|
+
this.prefixDirtyFrom = 0;
|
|
370
|
+
this.itemSpacing = 0;
|
|
280
371
|
if (this._active) {
|
|
281
372
|
this.container.classList.remove('vs-active');
|
|
282
373
|
this.container.removeEventListener('scroll', this.scrollHandler);
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,E as r,F as i,I as a,M as o,N as s,O as c,P as l,S as u,T as d,_ as f,b as ee,j as p,k as m,u as te,v as ne,w as h,x as re,y as g}from"./vendor-render-D2YP6GiF.js";import{r as ie}from"./api-DygAf_G_.js";import{Q as _,Z as v}from"./vendor-mermaid-C2RBgdM6.js";import{A as ae,B as oe,C as se,D as ce,E as le,F as ue,G as de,H as fe,I as pe,J as me,K as he,L as ge,M as _e,N as ve,O as ye,P as be,R as xe,S as Se,T as Ce,U as we,V as Te,W as Ee,_ as De,a as Oe,b as ke,c as Ae,d as je,f as Me,g as Ne,h as Pe,i as y,j as Fe,k as Ie,l as Le,m as Re,n as ze,o as Be,p as Ve,q as He,r as Ue,s as We,t as Ge,u as Ke,v as qe,w as Je,x as Ye,y as Xe,z as Ze}from"./vendor-icons-BqxEYYco.js";var b=`ko`,x={},S={};async function Qe(){let e=null;try{e=localStorage.getItem(`claw_locale`)}catch{}if(!e){let t=(navigator.language||`ko`).split(/[-_]/)[0].toLowerCase();e=[`en`,`ko`].includes(t)?t:`ko`}S=await C(`ko`),x=e===`ko`?S:await C(e),b=e,T()}async function C(e){try{let{api:t}=await v(async()=>{let{api:e}=await import(`./api-COrKYKcO.js`);return{api:e}},[]);return await t(`/api/i18n/${e}`)||{}}catch{return{}}}function w(e,t={}){let n=x[e]??S[e]??e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{${e}}`,String(r));return n}function T(){document.querySelectorAll(`[data-i18n]`).forEach(e=>{let t=e.getAttribute(`data-i18n`);t&&(e.textContent=w(t))}),document.querySelectorAll(`[data-i18n-placeholder]`).forEach(e=>{let t=e.getAttribute(`data-i18n-placeholder`);t&&(e.placeholder=w(t))}),document.querySelectorAll(`[data-i18n-title]`).forEach(e=>{let t=e.getAttribute(`data-i18n-title`);t&&(e.title=w(t))}),document.querySelectorAll(`[data-i18n-aria]`).forEach(e=>{let t=e.getAttribute(`data-i18n-aria`);t&&e.setAttribute(`aria-label`,w(t))})}async function $e(e){if(e!==b){x=e===`ko`?S:await C(e),b=e;try{localStorage.setItem(`claw_locale`,e)}catch{}T();try{let{loadEmployees:e}=await v(async()=>{let{loadEmployees:e}=await import(`./employees-zxrU6ZV_.js`);return{loadEmployees:e}},[]);e()}catch{}try{let{loadSkills:e}=await v(async()=>{let{loadSkills:e}=await import(`./skills-JuDja1UC.js`);return{loadSkills:e}},[]);e()}catch{}try{let{loadCommands:e}=await v(async()=>{let{loadCommands:e}=await import(`./slash-commands-DyLS0abr.js`);return{loadCommands:e}},[]);e()}catch{}try{let{loadSettings:e}=await v(async()=>{let{loadSettings:e}=await import(`./settings-BHIV4l1s.js`);return{loadSettings:e}},[]);e()}catch{}}}function et(){return b}function tt(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has(`locale`)||n.searchParams.set(`locale`,b),fetch(n.toString(),t)}var E=14,nt=16;function D(e,t=nt){return me(e,{size:t})}var O={check:D(xe),error:D(ge),warning:D(y),skip:D(We),tool:D(Ue),thinking:D(ke),search:D(Ke),web:D(ae),exec:D(Ge),compacting:D(De),plan:D(qe),brain:D(Ee),heartPulse:D(ye),lock:D(Ye),lockOpen:D(Se),key:D(Ce),settings:D(Ae),file:D(ve),trash:D(Oe),lightbulb:D(Je),refresh:D(Me),mic:D(Xe),clipboard:D(pe),robot:D(de),palette:D(Ne),link:D(se),salute:D(Ie),shark:`🦈`,paperclip:D(Pe),save:D(je),gamepad:D(Fe),house:D(le),radio:D(Ve),folder:D(_e),pencil:D(Re),chart:D(we),hourglass:D(ce),stop:D(Be),close:D(ze,E),send:D(Le),copy:D(ue,E),download:D(be,E),checkSimple:D(fe,E),chevronLeft:D(oe,E),chevronRight:D(Ze,E),chevronDown:D(Te,E),arrowLeft:D(He,E),arrowRight:D(he,E)},rt={"✅":`check`,"❌":`error`,"🔧":`tool`,"⏭":`skip`,"🧠":`brain`,"💓":`heartPulse`,"🔒":`lock`,"🔓":`lockOpen`,"🔑":`key`,"⚙":`settings`,"⚙️":`settings`,"📄":`file`,"🗑":`trash`,"🗑️":`trash`,"⚠":`warning`,"⚠️":`warning`,"💡":`lightbulb`,"🦈":`shark`,"💭":`thinking`,"🔍":`search`,"🌐":`web`,"⚡":`exec`,"🗜":`compacting`,"🗜️":`compacting`,"📝":`plan`,"📑":`clipboard`,"🤖":`robot`,"📋":`clipboard`,"🔄":`refresh`,"🎨":`palette`,"🎤":`mic`,"🔗":`link`,"🫡":`salute`,"📎":`paperclip`,"💾":`save`,"🎮":`gamepad`,"🏠":`house`,"📡":`radio`,"📂":`folder`,"✏️":`pencil`,"📊":`chart`,"🎙️":`mic`};function it(e){let t=rt[e];return t?O[t]:e}function at(e){return e===`✅`?`done`:e===`❌`?`error`:null}function ot(e=document.body){let t=e.querySelectorAll(`[data-icon]`);for(let e of t){let t=e.dataset.icon;t&&O[t]&&(e.innerHTML=O[t],e.classList.add(`icon-hydrated`))}}function st(e){let t=[],n=e.replace(/```[\s\S]*?```/g,e=>(t.push(e),`\x00P${t.length-1}\x00`)).replace(/`[^`]+`/g,e=>(t.push(e),`\x00P${t.length-1}\x00`));return n=n.replace(/([\p{P}])\*\*(?=[^\s\p{P}])/gu,(e,t)=>t===`*`?e:t+`**`),n=n.replace(/\x00P(\d+)\x00/g,(e,n)=>t[Number(n)]),n}var k=0;function ct(e){let t=new Map;return{text:e.replace(/^ {0,3}(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n {0,3}\1[ \t]*$/gm,e=>{let n=`\x00FENCE-${k++}\x00`;return t.set(n,e),n}),fences:t}}function lt(e,t){for(let[n,r]of t)e=e.replace(n,()=>r);return e}function A(e,t=!1){let n=[],r=``,i=0;for(;i<e.length;){let a=e.indexOf(`<svg`,i);if(a===-1){r+=e.slice(i);break}let o=e[a+4];if(o&&!/[\s\/>]/.test(o)){r+=e.slice(i,a+4),i=a+4;continue}r+=e.slice(i,a);let s=0,c=a,l=!1;for(;c<e.length;){let t=e.indexOf(`<svg`,c+1),o=e.indexOf(`</svg>`,c+(c===a?0:1));if(o===-1)break;if(t!==-1&&t<o){let n=e[t+4];n&&/[\s\/>]/.test(n)&&s++,c=t+4}else if(s===0){let t=o+6,s=e.slice(a,t),c=k++,u=`\n\n<div data-jaw-svg="${c}"></div>\n\n`;n.push({id:c,index:a,length:s.length,svg:s,kind:`complete`,placeholder:u}),r+=u,i=t,l=!0;break}else s--,c=o+6}if(!l){let o=k++;if(t){let t=e.slice(a),s=`\n\n<div data-jaw-svg="${o}" data-jaw-kind="partial"></div>\n\n`;n.push({id:o,index:a,length:t.length,svg:``,kind:`partial`,placeholder:s}),r+=s,i=e.length}else{let t=`\n\n<div data-jaw-svg="${o}" data-jaw-kind="error"></div>\n\n`,s=e.slice(a),c=s.search(/\n\s*\n/),l=c===-1?s.length:c;n.push({id:o,index:a,length:l,svg:``,kind:`error`,placeholder:t}),r+=t,i=a+l}}}return{text:r,blocks:n}}l.registerLanguage(`javascript`,s),l.registerLanguage(`js`,s),l.registerLanguage(`typescript`,o),l.registerLanguage(`ts`,o),l.registerLanguage(`python`,p),l.registerLanguage(`py`,p),l.registerLanguage(`bash`,e),l.registerLanguage(`shell`,m),l.registerLanguage(`sh`,m),l.registerLanguage(`json`,c),l.registerLanguage(`css`,n),l.registerLanguage(`xml`,r),l.registerLanguage(`html`,r),l.registerLanguage(`markdown`,d),l.registerLanguage(`md`,d),l.registerLanguage(`yaml`,h),l.registerLanguage(`yml`,h),l.registerLanguage(`sql`,t),l.registerLanguage(`rust`,u),l.registerLanguage(`rs`,u),l.registerLanguage(`go`,re),l.registerLanguage(`java`,ee),l.registerLanguage(`cpp`,g),l.registerLanguage(`c`,g),l.registerLanguage(`diff`,ne),l.registerLanguage(`plaintext`,f),l.registerLanguage(`text`,f);var j=null,M=Promise.resolve();function ut(){return document.documentElement.getAttribute(`data-theme`)===`light`?{primaryColor:`#e2e8f0`,primaryTextColor:`#1a202c`,primaryBorderColor:`#a0aec0`,lineColor:`#718096`,secondaryColor:`#ebf8ff`,tertiaryColor:`#f7fafc`,background:`transparent`,mainBkg:`#e2e8f0`,nodeBorder:`#a0aec0`,clusterBkg:`#f7fafc`,clusterBorder:`#cbd5e0`,titleColor:`#1a202c`,edgeLabelBackground:`#f7fafc`}:{primaryColor:`#2d3748`,primaryTextColor:`#e2e8f0`,primaryBorderColor:`#4a5568`,lineColor:`#718096`,secondaryColor:`#1a365d`,tertiaryColor:`#1a202c`,background:`transparent`,mainBkg:`#2d3748`,nodeBorder:`#4a5568`,clusterBkg:`#1a202c`,clusterBorder:`#2d3748`,titleColor:`#e2e8f0`,edgeLabelBackground:`#1a202c`}}async function N(){return j||(j=await v(()=>import(`./mermaid.core-CYqc8Qyq.js`),[]),j.default.setParseErrorHandler(()=>{})),j.default}function P(){j.default.initialize({startOnLoad:!1,theme:`base`,htmlLabels:!1,themeVariables:ut(),securityLevel:`strict`,suppressErrorRendering:!0})}function F(e){let t=_.sanitize(e,{USE_PROFILES:{svg:!0,svgFilters:!0},FORBID_TAGS:[`script`,`iframe`,`object`,`embed`,`form`,`input`,`foreignObject`,`animate`,`set`,`animateTransform`,`animateMotion`],FORBID_ATTR:[`onerror`,`onclick`,`onload`,`onmouseover`,`onfocus`,`onblur`,`background`]}),n=document.createElement(`div`);n.innerHTML=t;for(let e of n.querySelectorAll(`style`)){let t=e.textContent||``;t=t.replace(/@import\b[^;]*;?/gi,`/* stripped */`),t=t.replace(/@font-face\s*\{[^}]*\}/gi,`/* stripped */`),t=t.replace(/url\s*\(\s*(?!['"]?#)[^)]*\)/gi,`none`),e.textContent=t}return n.innerHTML}function I(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function L(e){return _.sanitize(e,{USE_PROFILES:{html:!0,svg:!0,svgFilters:!0},FORBID_TAGS:[`script`,`style`,`iframe`,`object`,`embed`,`form`,`input`,`foreignObject`,`animate`,`set`,`animateTransform`,`animateMotion`],FORBID_ATTR:[`onerror`,`onclick`,`onload`,`onmouseover`,`onfocus`,`onblur`,`background`],ADD_TAGS:[`use`],ADD_ATTR:[`aria-hidden`,`xmlns`,`viewBox`,`role`,`aria-label`,`data-jaw-svg`,`data-jaw-kind`]})}var dt=`http://www.w3.org/2000/svg`,ft=new Set([`a`,`area`,`link`]);_.addHook(`afterSanitizeAttributes`,e=>{let t=e.tagName.toLowerCase();if(e.namespaceURI===dt||!ft.has(t)){let t=e.getAttribute(`href`)||``;t&&!t.startsWith(`#`)&&e.removeAttribute(`href`)}let n=e.getAttributeNS(`http://www.w3.org/1999/xlink`,`href`)||e.getAttribute(`xlink:href`)||``;if(n&&!n.startsWith(`#`)&&(e.removeAttributeNS(`http://www.w3.org/1999/xlink`,`href`),e.removeAttribute(`xlink:href`)),t===`image`||t===`feimage`){let t=e.getAttribute(`src`)||``;t&&!t.startsWith(`#`)&&e.removeAttribute(`src`)}let r=[`fill`,`stroke`,`filter`,`mask`,`clip-path`,`marker-start`,`marker-mid`,`marker-end`,`cursor`];if(e.hasAttribute(`style`)){let t=e.style?.cssText||``;if(/url\s*\(/i.test(t)){let n=t.replace(/url\s*\(\s*(?!['"]?#)[^)]*\)/gi,`none`);e.style.cssText=n}}for(let t of r)if(e.hasAttribute(t)){let n=e.getAttribute(t)||``;if(/url\s*\(/i.test(n)){let r=n.replace(/url\s*\(\s*(?!['"]?#)[^)]*\)/gi,`none`);e.setAttribute(t,r)}}});var pt=/["'](?:subtasks|employee_config|agent_phases|orchestration_plan)["']\s*:/;function R(e){let t=e.replace(/```json\n([\s\S]*?)\n```/g,(e,t)=>pt.test(t)?``:e);return t=t.replace(/\{[^{}]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,``).trim(),t}function mt(e){let t=[],n=[],r=e.replace(/```[\s\S]*?```/g,e=>(n.push(e),`\x00C${n.length-1}\x00`)).replace(/`[^`]+`/g,e=>(n.push(e),`\x00C${n.length-1}\x00`));return r=r.replace(/\$\$([\s\S]+?)\$\$/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!0}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\\\[([\s\S]+?)\\\]/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!0}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/(?<!\$)\$(?!\$)([^\n$]+?)\$(?!\$)/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!1}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\\\((.+?)\\\)/g,(e,n)=>(t.push({tex:n.trim(),displayMode:!1}),`\x00MATH-${t.length-1}\x00`)),r=r.replace(/\x00C(\d+)\x00/g,(e,t)=>n[Number(t)]),{text:r,blocks:t}}function ht(e,t,n=!1){return e.replace(/\x00MATH-(\d+)\x00/g,(e,r)=>{let i=t[Number(r)];if(!i)return`<code title="math placeholder error">[math error]</code>`;if(n)return i.displayMode?`<div class="math-placeholder">${I(i.tex)}</div>`:`<code class="math-placeholder">${I(i.tex)}</code>`;try{return te.renderToString(i.tex,{displayMode:i.displayMode,throwOnError:!1})}catch{return i.displayMode?`<pre><code>${I(i.tex)}</code></pre>`:`<code>${I(i.tex)}</code>`}})}var z=0;async function gt(){let e=document.querySelectorAll(`.mermaid-rendered`);if(!e.length)return;let t=await N();for(let n of e){let e=n.dataset.mermaidCode;if(!e)continue;let r=`mermaid-${++z}`;try{P();let{svg:i}=await t.render(r,e);n.innerHTML=F(i),V(n)}catch{}}}var B=null;function _t(){B||=new IntersectionObserver(e=>{for(let t of e){if(!t.isIntersecting)continue;let e=t.target;e.classList.contains(`mermaid-pending`)&&(B.unobserve(e),bt(e))}},{rootMargin:`200px`})}function V(e){e.querySelector(`.mermaid-copy-btn`)?.remove(),e.querySelector(`.mermaid-save-btn`)?.remove();let t=document.createElement(`button`);t.className=`mermaid-save-btn`,t.type=`button`,t.ariaLabel=`Save as image`,t.title=`Save`,t.innerHTML=O.download,e.appendChild(t);let n=document.createElement(`button`);n.className=`mermaid-copy-btn`,n.type=`button`,n.ariaLabel=`Copy source`,n.title=`Copy`,n.innerHTML=O.copy,e.appendChild(n)}function vt(e,t,n){e.classList.remove(`mermaid-rendered`),e.innerHTML=`
|
|
2
|
-
<div class="mermaid-error">
|
|
3
|
-
<div class="mermaid-error-title">${O.warning} ${I(w(`mermaid.renderFail`)||`Mermaid render failed`)}</div>
|
|
4
|
-
<div class="mermaid-error-msg">${I(n.slice(0,200))}</div>
|
|
5
|
-
<pre class="mermaid-error-code"><code>${I(t)}</code></pre>
|
|
6
|
-
</div>`}async function yt(e){e.classList.remove(`mermaid-pending`);let t=e.textContent||``;e.dataset.mermaidCode=t;let n=`mermaid-${++z}`;try{let r=await N();P();let{svg:i}=await r.render(n,t);e.innerHTML=F(i),e.classList.add(`mermaid-rendered`),V(e)}catch(n){vt(e,t,n?.message||n?.str||`Unknown error`)}}function bt(e){M=M.then(()=>yt(e))}async function xt(e){let t=(e||document).querySelectorAll(`.mermaid-pending`);if(t.length){_t();for(let e of t)B.observe(e)}}var H=!1;function St(){if(H)return!0;let e=new a;return e.code=function({text:e,lang:t}){if(t===`mermaid`)return`<div class="mermaid-container mermaid-pending">${I(e)}</div>`;if(t?.trim().toLowerCase()===`diagram-html`)return`<div class="diagram-widget-pending" data-diagram-html="${btoa(unescape(encodeURIComponent(e)))}"
|
|
7
|
-
role="status" aria-label="Interactive widget loading">
|
|
8
|
-
<div class="diagram-spinner"></div>
|
|
9
|
-
</div>`;let n=I(e);if(t&&l.getLanguage(t))try{n=l.highlight(e,{language:t}).value}catch{}else try{n=l.highlightAuto(e).value}catch{}let r=t?I(t):``,i=w(`code.copy`)||`Copy`;return`<div class="code-block"><div class="code-header"><span class="code-lang">${r}</span><button class="code-copy-btn" type="button" aria-label="${I(i)}">${I(i)}</button></div><pre><code class="hljs${t?` language-${I(t)}`:``}">${n}</code></pre></div>`},i.setOptions({renderer:e,gfm:!0,breaks:!1}),H=!0,!0}function Ct(e){(e||document).querySelectorAll(`.code-block pre code, .code-block-wrapper pre code`).forEach(e=>{if(e.dataset.highlighted===`yes`)return;let t=[...e.classList].find(e=>e.startsWith(`language-`))?.replace(`language-`,``),n=e.textContent||``;try{t&&l.getLanguage(t)?e.innerHTML=l.highlight(n,{language:t}).value:e.innerHTML=l.highlightAuto(n).value,e.dataset.highlighted=`yes`}catch{}})}var U=/(?:~\/[^\s)`\]"'<>]+|\/(?:Users|home|tmp|var|opt|private)\/[^\s)`\]"'<>]+)/g,wt=/[.,!?:;]+$/,Tt=/^(?:~\/|\/(?:Users|home|tmp|var|opt|private)\/)/;function Et(e){return Tt.test(e)}function W(e,t){t&&t.classList.add(`opening`),ie(`/api/file/open`,`POST`,{path:e}).then(e=>{t?.classList.remove(`opening`),e?.ok===!1?(t?.classList.add(`open-failed`),t&&(t.title=e?.error||`Failed to open`),setTimeout(()=>{t?.classList.remove(`open-failed`),t&&(t.title=``)},2e3)):(t?.classList.add(`opened`),setTimeout(()=>t?.classList.remove(`opened`),1500))}).catch(()=>{t?.classList.remove(`opening`),t?.classList.add(`open-failed`),setTimeout(()=>t?.classList.remove(`open-failed`),2e3)})}function G(e){let t=new Set([`PRE`,`A`,`BUTTON`,`TEXTAREA`,`INPUT`,`SCRIPT`,`STYLE`]),n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(n){let r=n.parentElement;for(;r&&r!==e;){if(t.has(r.tagName)||r.classList.contains(`file-path-link`)||r.tagName===`CODE`&&r.parentElement?.tagName===`PRE`)return NodeFilter.FILTER_REJECT;r=r.parentElement}return NodeFilter.FILTER_ACCEPT}}),r=new Map,i;for(;i=n.nextNode();){let e=i.textContent||``;U.lastIndex=0;let t,n=[];for(;t=U.exec(e);){let e=t[0],r=e.replace(wt,``);r.length<4||n.push({index:t.index,raw:e,clean:r})}n.length&&r.set(i,n)}for(let[e,t]of r){let n=e.textContent||``,r=e.parentNode;if(!r)continue;let i=document.createDocumentFragment(),a=0;for(let{index:e,raw:r,clean:o}of t){e>a&&i.appendChild(document.createTextNode(n.slice(a,e)));let t=document.createElement(`span`);t.className=`file-path-link`,t.setAttribute(`data-file-path`,o),t.setAttribute(`role`,`button`),t.setAttribute(`tabindex`,`0`),t.textContent=o,i.appendChild(t);let s=r.slice(o.length);s&&i.appendChild(document.createTextNode(s)),a=e+r.length}a<n.length&&i.appendChild(document.createTextNode(n.slice(a))),r.replaceChild(i,e)}}var K=!1;function Dt(){K||(K=!0,document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`a`),r=n?.getAttribute(`href`)||``;if(n&&Et(r)){e.preventDefault(),n.classList.add(`file-path-link`),W(r,n);return}let i=t?.closest(`.file-path-link`);if(!i)return;let a=i.getAttribute(`data-file-path`);a&&W(a,i)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target;t?.classList.contains(`file-path-link`)&&(e.preventDefault(),t.click())}))}var q=!1;function Ot(){q||(q=!0,document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`.code-copy-btn`);if(n){let e=n.closest(`.code-block`);if(!e)return;let t=e.querySelector(`pre code`);if(!t)return;navigator.clipboard.writeText(t.textContent||``).then(()=>{let e=n.textContent||``;n.textContent=w(`code.copied`),n.classList.add(`copied`),setTimeout(()=>{n.textContent=e,n.classList.remove(`copied`)},1500)}).catch(()=>{});return}let r=t?.closest(`.code-lang-label`);if(!r)return;let i=r.closest(`.code-block-wrapper`);if(!i)return;let a=i.querySelector(`pre code`);a&&navigator.clipboard.writeText(a.textContent||``).then(()=>{let e=r.textContent||``;r.textContent=w(`code.copied`),r.classList.add(`copied`),setTimeout(()=>{r.textContent=e,r.classList.remove(`copied`)},1500)}).catch(()=>{})}))}var J=!1;function kt(){J||(J=!0,document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`.diagram-copy-btn`);if(n){let e=n.closest(`.diagram-container`);if(!e)return;let t=``;if(e.dataset.widgetHtml)try{t=decodeURIComponent(escape(atob(e.dataset.widgetHtml)))}catch{return}else{let n=e.querySelector(`svg`);n&&(t=n.outerHTML)}t&&Y(n,t,`copy`);return}let r=t?.closest(`.mermaid-copy-btn`);if(r){let e=r.closest(`.mermaid-container`);if(!e)return;let t=e.dataset.mermaidCode||``;t&&Y(r,t,`copy`);return}let i=t?.closest(`.diagram-save-btn`);if(i){let e=i.closest(`.diagram-container`);if(!e)return;if(e.dataset.widgetHtml){let t=e.querySelector(`iframe`);t?.contentWindow&&(t.contentWindow.postMessage({type:`jaw-request-screenshot`},`*`),Y(i,``,`save`));return}let t=e.querySelector(`svg`);t&&X(t,i);return}let a=t?.closest(`.mermaid-save-btn`);if(a){let e=a.closest(`.mermaid-container`);if(!e)return;let t=e.querySelector(`svg`);t&&X(t,a);return}}))}function Y(e,t,n){let r=()=>{let t=e.innerHTML;e.innerHTML=O.checkSimple,e.classList.add(`copied`),setTimeout(()=>{e.innerHTML=t,e.classList.remove(`copied`)},1500)};n===`copy`?navigator.clipboard.writeText(t).then(r).catch(()=>{}):r()}function X(e,t){let n=e.cloneNode(!0),r=e.getBoundingClientRect();n.getAttribute(`width`)||n.setAttribute(`width`,String(r.width)),n.getAttribute(`height`)||n.setAttribute(`height`,String(r.height));let i=new XMLSerializer().serializeToString(n),a=`data:image/svg+xml;charset=utf-8,`+encodeURIComponent(i),o=new Image;o.onload=()=>{let e=document.createElement(`canvas`);e.width=o.naturalWidth*2,e.height=o.naturalHeight*2;let n=e.getContext(`2d`);n.scale(2,2),n.drawImage(o,0,0),e.toBlob(e=>{e&&(Z(e,`diagram-${Date.now()}.png`),Y(t,``,`save`))},`image/png`)},o.onerror=()=>{Z(new Blob([i],{type:`image/svg+xml;charset=utf-8`}),`diagram-${Date.now()}.svg`),Y(t,``,`save`)},o.src=a}function Z(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function At(e){return e.kind===`partial`?`<div class="diagram-container diagram-loading" role="status"
|
|
10
|
-
aria-label="Diagram loading"><div class="diagram-spinner"></div></div>`:e.kind===`error`?`<div class="diagram-container diagram-error" role="alert">
|
|
11
|
-
Malformed SVG: unclosed element</div>`:`<div class="diagram-container diagram-svg" tabindex="0"
|
|
12
|
-
role="figure" aria-label="SVG diagram">
|
|
13
|
-
${L(e.svg)}
|
|
14
|
-
<button class="diagram-save-btn" type="button"
|
|
15
|
-
aria-label="Save as image" title="Save">${O.download}</button>
|
|
16
|
-
<button class="diagram-copy-btn" type="button"
|
|
17
|
-
aria-label="Copy source" title="Copy">${O.copy}</button>
|
|
18
|
-
<button class="diagram-zoom-btn" type="button"
|
|
19
|
-
aria-label="Expand diagram" title="Expand">⤢</button>
|
|
20
|
-
</div>`}function jt(e,t){for(let n of t){let t=`<div\\b[^>]*?\\bdata-jaw-svg="${n.id}"[^>]*></div>`,r=new RegExp(t,`g`),i=At(n);e=e.replace(r,()=>i)}return e}function Mt(e){(e||document).querySelectorAll(`.diagram-zoom-btn`).forEach(e=>{e.dataset.bound||(e.dataset.bound=`1`,e.addEventListener(`click`,()=>{let t=e.closest(`.diagram-container`);if(!t)return;let n=t.cloneNode(!0);n.querySelectorAll(`.diagram-zoom-btn, .diagram-copy-btn, .diagram-save-btn`).forEach(e=>e.remove()),Nt(n.innerHTML)}))})}function Nt(e){let t=document.activeElement,n=document.createElement(`div`);n.className=`diagram-overlay`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,`Expanded diagram`),n.innerHTML=`
|
|
21
|
-
<div class="diagram-overlay-content">${L(e)}</div>
|
|
22
|
-
<button class="diagram-overlay-close" type="button" aria-label="Close">✕</button>
|
|
23
|
-
`,n.querySelectorAll(`.diagram-overlay-content svg`).forEach(e=>{if(!e.getAttribute(`viewBox`)){let t=e.getAttribute(`width`)||e.getBBox?.()?.width,n=e.getAttribute(`height`)||e.getBBox?.()?.height;t&&n&&e.setAttribute(`viewBox`,`0 0 ${parseFloat(String(t))} ${parseFloat(String(n))}`)}e.removeAttribute(`width`),e.removeAttribute(`height`)});let r=n.querySelector(`.diagram-overlay-close`),i=()=>{n.remove(),document.removeEventListener(`keydown`,a),t&&t.isConnected&&t.focus()},a=e=>{if(e.key===`Escape`){i();return}if(e.key===`Tab`){let t=n.querySelectorAll(`button, [href], [tabindex]:not([tabindex="-1"])`);if(t.length===0)return;let r=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===r?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),r.focus())}};r.addEventListener(`click`,i),document.addEventListener(`keydown`,a),document.body.appendChild(n),r.focus()}function Pt(e,t=!1){let n=R(e);if(!n)return`<em class="text-dim orchestrate-placeholder">${I(w(`orchestrator.dispatching`))}</em>`;let{text:r,fences:a}=ct(n.replace(/\n{3,}/g,`
|
|
24
|
-
|
|
25
|
-
`)),{text:o,blocks:s}=A(r,t),{text:c,blocks:l}=mt(lt(o,a));St();let u=st(c),d=i.parse(u);return d=d.replace(/<table/g,`<div class="table-wrapper"><table`).replace(/<\/table>/g,`</table></div>`),d=ht(d,l,t),d=L(d),d=jt(d,s),t||Ft(),Ot(),kt(),Dt(),d}var Q=null,$=null;function Ft(){$&&clearTimeout($),Q&&=(cancelAnimationFrame(Q),null),$=setTimeout(()=>{$=null,Q=requestAnimationFrame(()=>{Q=null,xt(),Ct(),Mt();let e=document.getElementById(`chatMessages`);e&&G(e)})},100)}function It(){$&&=(clearTimeout($),null),Q&&=(cancelAnimationFrame(Q),null)}export{gt as a,it as c,tt as d,et as f,w as h,Pt as i,at as l,$e as m,I as n,R as o,Qe as p,G as r,O as s,It as t,ot as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as e,m as t,v as n}from"./settings-Dl3RnWsB.js";export{t as loadSettings,n as savePerCli,e as updateSettings};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./skills-DhiCSGws.js";export{e as loadSkills};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./slash-commands-B1k1vFJG.js";export{e as loadCommands};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./state-O6NVkWcL.js";import{i as t,t as n}from"./api-DygAf_G_.js";import{Z as r}from"./vendor-mermaid-C2RBgdM6.js";import{c as i,h as a,i as o,l as s,n as c,o as l,r as u,s as d}from"./render-CVr6a-dp.js";import{a as f,i as p,r as m,t as ee}from"./idb-cache-DbK81tgv.js";function h(){let e=globalThis.crypto;if(typeof e?.randomUUID==`function`)return e.randomUUID();if(typeof e?.getRandomValues!=`function`)return`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)});let t=new Uint8Array(16);e.getRandomValues(t),t[6]=t[6]&15|64,t[8]=t[8]&63|128;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}var te=`agentName`,g=`CLI-JAW`,_=g;function v(){return _}function ne(e){_=(e||``).trim()||g,localStorage.setItem(te,_);let t=document.getElementById(`appNameInput`);t&&(t.value=_)}function re(){_=localStorage.getItem(te)||g;let e=document.getElementById(`appNameInput`);e&&(e.value=_),document.getElementById(`appNameSave`)?.addEventListener(`click`,()=>{let e=document.getElementById(`appNameInput`);e&&ne(e.value)}),document.getElementById(`appNameInput`)?.addEventListener(`keydown`,e=>{let t=e;t.key===`Enter`&&(t.preventDefault(),ne(t.target.value),t.target.blur())})}var ie=`agentAvatar`,ae=`userAvatar`,oe=`🦈`,se=`👤`,ce={agent:{emoji:oe,imageUrl:``,updatedAt:null},user:{emoji:se,imageUrl:``,updatedAt:null}},le=!1;function y(e){return ce[e]}function ue(e){return e===`agent`?`agentAvatarPreview`:`userAvatarPreview`}function de(e){return e===`agent`?`.agent-icon`:`.user-icon`}function b(e){let t=document.getElementById(ue(e));if(t){t.innerHTML=x(e);let n=y(e).imageUrl?`image`:`emoji`;t.setAttribute(`data-avatar-kind`,n)}}function x(e){let t=y(e);return t.imageUrl?`<img class="avatar-image" src="${c(t.imageUrl)}" alt="" loading="lazy" decoding="async">`:c(t.emoji)}function S(e){let t=x(e),n=y(e).imageUrl?`image`:`emoji`;document.querySelectorAll(de(e)).forEach(e=>{e.innerHTML=t,e.setAttribute(`data-avatar-kind`,n)})}function C(e,t){t?.kind===`image`&&t.imageUrl?(y(e).imageUrl=t.imageUrl,y(e).updatedAt=t.updatedAt??Date.now()):(y(e).imageUrl=``,y(e).updatedAt=t?.updatedAt??null),b(e),S(e)}async function fe(){let e=await n(`/api/avatar`);e&&(C(`agent`,e.agent),C(`user`,e.user))}async function pe(e,n){let r=await t(),i=new Headers(n.headers||{});return r&&i.set(`Authorization`,`Bearer ${r}`),fetch(e,{...n,headers:i})}async function me(e,t){let n=await pe(`/api/avatar/${e}/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(t.name)},body:t}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||`avatar upload failed (${n.status})`);C(e,r?.data||r)}async function he(e){let t=await pe(`/api/avatar/${e}/image`,{method:`DELETE`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||`avatar reset failed (${t.status})`);C(e,n?.data||n)}function ge(e){let t=e===`agent`?`agentAvatarUploadBtn`:`userAvatarUploadBtn`,n=e===`agent`?`agentAvatarResetBtn`:`userAvatarResetBtn`,r=e===`agent`?`agentAvatarFile`:`userAvatarFile`;document.getElementById(t)?.addEventListener(`click`,()=>{document.getElementById(r)?.click()}),document.getElementById(n)?.addEventListener(`click`,async()=>{try{await he(e)}catch(e){console.warn(`[avatar:reset]`,e.message)}}),document.getElementById(r)?.addEventListener(`change`,async t=>{let n=t.target,r=n.files?.[0];if(r)try{await me(e,r)}catch(e){console.warn(`[avatar:upload]`,e.message)}finally{n.value=``}})}function _e(){return x(`agent`)}function w(){return x(`user`)}async function ve(){y(`agent`).emoji=localStorage.getItem(ie)||oe,y(`user`).emoji=localStorage.getItem(ae)||se,b(`agent`),b(`user`),le||(le=!0,ge(`agent`),ge(`user`)),await fe(),S(`agent`),S(`user`)}var ye=5,T=80,be=class{items=[];container;spacerTop;spacerBottom;viewport;_active=!1;_totalHeight=0;rafId=null;firstVisible=-1;lastVisible=-1;onLazyRender=null;onPostRender=null;constructor(e){this.container=document.getElementById(e),this.spacerTop=document.createElement(`div`),this.spacerTop.className=`vs-spacer-top`,this.spacerBottom=document.createElement(`div`),this.spacerBottom.className=`vs-spacer-bottom`,this.viewport=document.createElement(`div`),this.viewport.className=`vs-viewport`}get active(){return this._active}get count(){return this.items.length}flushToDOM(){this._active&&(this.container.classList.remove(`vs-active`),this.container.removeEventListener(`scroll`,this.scrollHandler),this.rafId&&=(cancelAnimationFrame(this.rafId),null),this.container.innerHTML=this.items.map(e=>e.html).join(``),this._active=!1,this.firstVisible=-1,this.lastVisible=-1,this.items=[],this._totalHeight=0)}setItems(e){this.items=e,this._totalHeight=e.reduce((e,t)=>e+t.height,0),!this._active&&this.items.length>=80&&this.activate(!0)}addItem(e,t){let n={id:e,html:t,height:T};this.items.push(n),this._totalHeight+=T,!this._active&&this.items.length>=80&&this.activate(!0),this._active&&this.scheduleRender()}appendLiveItem(e){if(!this._active)return;let t=e.outerHTML,n={id:h(),html:t,height:T};this.items.push(n),this._totalHeight+=T,this.scrollToBottom()}updateItemHtml(e,t){this.items[e]&&(this.items[e].html=t)}scrollHandler=()=>this.scheduleRender();activate(e=!1){this._active=!0,this._totalHeight=0,this.container.querySelectorAll(`.msg`).forEach((e,t)=>{this.items[t]&&(this.items[t].height=e.getBoundingClientRect().height)});for(let e of this.items)this._totalHeight+=e.height;this.container.classList.add(`vs-active`),this.container.replaceChildren(this.spacerTop,this.viewport,this.spacerBottom),this.container.addEventListener(`scroll`,this.scrollHandler,{passive:!0}),e&&(this.spacerTop.style.height=`${this._totalHeight}px`,this.spacerBottom.style.height=`0px`,this.container.scrollTop=this.container.scrollHeight,this.firstVisible=-1,this.lastVisible=-1),this.render()}scheduleRender(){this.rafId||=requestAnimationFrame(()=>{this.rafId=null,this.render()})}render(){let e=this.container.scrollTop,t=this.container.clientHeight,n=0,r=this.items.length-1;for(let t=0;t<this.items.length;t++){if(n+this.items[t].height>e){r=t;break}n+=this.items[t].height}let i=Math.max(0,r-ye),a=n,o=r;for(let n=r;n<this.items.length&&(a+=this.items[n].height,o=n,!(a>e+t));n++);let s=Math.min(this.items.length-1,o+ye),c=0;for(let e=0;e<i;e++)c+=this.items[e].height;let l=0;for(let e=s+1;e<this.items.length;e++)l+=this.items[e].height;if(this.spacerTop.style.height=`${c}px`,this.spacerBottom.style.height=`${l}px`,i===this.firstVisible&&s===this.lastVisible)return;this.firstVisible=i,this.lastVisible=s;let u=new Map;for(let e of Array.from(this.viewport.children)){let t=Number(e.dataset.vsIdx);isNaN(t)||u.set(t,e)}for(let[e,t]of u)(e<i||e>s)&&(t.remove(),u.delete(e));let d=[];for(let e=i;e<=s;e++){let t=u.get(e);if(t)d.push(t);else{let t=this.items[e],n=document.createElement(`div`);n.innerHTML=t.html;let r=n.firstElementChild;r&&(r.dataset.vsIdx=String(e),d.push(r))}}let f=this.viewport.firstChild;for(let e of d)e===f?f=f.nextSibling:this.viewport.insertBefore(e,f);if(this.onLazyRender){let e=this.viewport.querySelectorAll(`.lazy-pending`);e.length>0&&this.onLazyRender(Array.from(e))}this.onPostRender&&this.onPostRender(this.viewport),this.remeasureVisible()}remeasureVisible(){let e=this.container.scrollHeight-this.container.scrollTop-this.container.clientHeight<80,t=[];this.viewport.querySelectorAll(`[data-vs-idx]`).forEach(e=>{let n=Number(e.dataset.vsIdx);this.items[n]&&t.push({idx:n,newH:e.getBoundingClientRect().height})});let n=!1;for(let{idx:e,newH:r}of t){let t=this.items[e].height;t!==r&&(this.items[e].height=r,this._totalHeight+=r-t,n=!0)}n&&e&&this.scrollToBottom()}scrollToBottom(){this.rafId&&=(cancelAnimationFrame(this.rafId),null),this.spacerTop.style.height=`${this._totalHeight}px`,this.spacerBottom.style.height=`0px`,this.container.scrollTop=this.container.scrollHeight,this.firstVisible=-1,this.lastVisible=-1,this.render()}clear(){this.items=[],this._totalHeight=0,this._active&&(this.container.classList.remove(`vs-active`),this.container.removeEventListener(`scroll`,this.scrollHandler),this.viewport.innerHTML=``,this.spacerTop.style.height=`0`,this.spacerBottom.style.height=`0`,this.container.innerHTML=``),this._active=!1,this.firstVisible=-1,this.lastVisible=-1,this.onLazyRender=null,this.onPostRender=null,this.rafId&&=(cancelAnimationFrame(this.rafId),null)}},xe=null;function E(){return xe||=new be(`chatMessages`),xe}var Se=2e3,Ce=80;function we(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function D(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function Te(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=D(e);n.length<Se||t-e.lastRenderTime>Ce?(e.element.innerHTML=o(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=o(D(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function Ee(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=D(e);return t||(e.element.innerHTML=o(n)),n}var O=[`cdnjs.cloudflare.com`,`cdn.jsdelivr.net`,`unpkg.com`,`esm.sh`,`fonts.googleapis.com`,`fonts.gstatic.com`],De=[/\beval\s*\(/,/\bnew\s+Function\s*\(/,/\bdocument\.cookie\b/,/\bwindow\.opener\b/,/\bwindow\.top\b/,/\bparent\.postMessage\b(?!.*jaw-)/,/\blocation\.href\s*=/,/\bwindow\.location\b/,/\bsetTimeout\s*\(\s*["'`]/,/\bsetInterval\s*\(\s*["'`]/,/\.constructor\s*\.\s*constructor/,/\bdocument\.write\s*\(/,/\binsertAdjacentHTML\s*\(/,/\bimport\s*\(/],Oe=[];function ke(e){let t=[];if(e.length>524288)return{valid:!1,reason:`Payload too large (>512KB)`,warnings:t};let n=/(?:src|href)\s*=\s*["']https?:\/\/([^/"']+)/gi,r;for(;(r=n.exec(e))!==null;){let e=r[1];if(!O.some(t=>e===t||e.endsWith(`.`+t)))return{valid:!1,reason:`Blocked domain: ${e}`,warnings:t}}let i=/url\s*\(\s*['"]?https?:\/\/([^)'"]+)/gi;for(;(r=i.exec(e))!==null;){let e=r[1].split(`/`)[0];O.some(t=>e===t||e.endsWith(`.`+t))||t.push(`CSS url() references external domain: ${e}`)}for(let n of De)if(n.test(e))return{valid:!1,reason:`Dangerous pattern: ${n.source}`,warnings:t};for(let n of Oe)n.test(e)&&t.push(`DOM sink detected: ${n.source}`);return{valid:!0,warnings:t}}function Ae(){let e=document.createElement(`button`);return e.className=`diagram-copy-btn`,e.type=`button`,e.ariaLabel=`Copy source`,e.title=`Copy`,e.innerHTML=d.copy,e}function je(){let e=document.createElement(`button`);return e.className=`diagram-save-btn`,e.type=`button`,e.ariaLabel=`Save as image`,e.title=`Save`,e.innerHTML=d.download,e}var Me=[`cdnjs.cloudflare.com`,`cdn.jsdelivr.net`,`unpkg.com`,`esm.sh`,`fonts.googleapis.com`,`fonts.gstatic.com`],k=new Set,A=new Map,j=null;function Ne(){if(j)return;let e=document.getElementById(`chatMessages`);e&&(j=new MutationObserver(e=>{if(k.size)for(let t of e)for(let e of t.removedNodes)e instanceof HTMLIFrameElement&&e.contentWindow&&(k.delete(e.contentWindow),A.delete(e.contentWindow)),e instanceof HTMLElement&&e.querySelectorAll(`iframe`).forEach(e=>{e.contentWindow&&(k.delete(e.contentWindow),A.delete(e.contentWindow))})}),j.observe(e,{childList:!0,subtree:!0}))}function Pe(e){if(e.includes(`"importmap"`)||e.includes(`'importmap'`))return``;let t={},n=e.match(/(?:cdn\.jsdelivr\.net\/npm|unpkg\.com)\/three@([\d.]+)/);if(n){let r=n[1],i=e.includes(`unpkg.com/three@`)?`unpkg.com`:`cdn.jsdelivr.net/npm`;t.three=`https://${i}/three@${r}/${i===`unpkg.com`?`build/three.module.js`:`build/three.module.min.js`}`,t[`three/addons/`]=`https://${i}/three@${r}/examples/jsm/`}return Object.keys(t).length===0?``:`<script type="importmap">${JSON.stringify({imports:t})}<\/script>`}function Fe(e){let t=`'none'`;(e.includes(`cdn.jsdelivr.net/npm/us-atlas`)||e.includes(`cdn.jsdelivr.net/npm/world-atlas`)||e.includes(`cdn.jsdelivr.net/npm/datamaps`))&&(t=`https://cdn.jsdelivr.net`);let n=/Tone\.min\.js|tone@/.test(e)?`worker-src blob:;`:``,r=Me.map(e=>`https://${e}`),i=r.join(` `),a=[`data:`,`blob:`,...r],o=[`'unsafe-inline'`,`https://fonts.googleapis.com`];/L\.(map|tileLayer|marker|geoJSON|polyline|polygon|circle)\(|leaflet[\w.@/-]*\.(js|css)|tile\.openstreetmap\.org/.test(e)&&(a.push(`https://a.tile.openstreetmap.org`,`https://b.tile.openstreetmap.org`,`https://c.tile.openstreetmap.org`),o.push(`https://cdnjs.cloudflare.com`,`https://cdn.jsdelivr.net`));let s=a.join(` `);return`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' ${i}; style-src ${o.join(` `)}; img-src ${s}; font-src https://fonts.gstatic.com; connect-src ${t}; ${n} base-uri 'none';">`}function Ie(){let e=!document.documentElement.hasAttribute(`data-theme`)||document.documentElement.getAttribute(`data-theme`)===`dark`,t=getComputedStyle(document.documentElement);return{isDark:e,tokens:{"--bg":t.getPropertyValue(`--bg`).trim(),"--surface":t.getPropertyValue(`--surface`).trim(),"--border":t.getPropertyValue(`--border`).trim(),"--text":t.getPropertyValue(`--text`).trim(),"--text-dim":t.getPropertyValue(`--text-dim`).trim(),"--accent":t.getPropertyValue(`--accent`).trim(),"--font-ui":t.getPropertyValue(`--font-ui`).trim(),"--font-mono":t.getPropertyValue(`--font-mono`).trim(),"--radius-sm":t.getPropertyValue(`--radius-sm`).trim(),"--radius-md":t.getPropertyValue(`--radius-md`).trim()}}}function Le(e){return`
|
|
3
|
-
<script>
|
|
4
|
-
(function() {
|
|
5
|
-
var __nonce = '${e}';
|
|
6
|
-
|
|
7
|
-
window.addEventListener('message', function(e) {
|
|
8
|
-
if (e.source !== window.parent) return;
|
|
9
|
-
if (!e.data || typeof e.data !== 'object') return;
|
|
10
|
-
|
|
11
|
-
if (e.data.type === 'jaw-theme-update') {
|
|
12
|
-
window.__jawTheme = { isDark: !!e.data.isDark };
|
|
13
|
-
window.__jawTokens = e.data.tokens || {};
|
|
14
|
-
window.dispatchEvent(new CustomEvent('jaw-theme-change', { detail: window.__jawTheme }));
|
|
15
|
-
}
|
|
16
|
-
if (e.data.type === 'jaw-request-resize') {
|
|
17
|
-
postHeight();
|
|
18
|
-
}
|
|
19
|
-
if (e.data.type === 'jaw-request-screenshot') {
|
|
20
|
-
var canvas = document.querySelector('canvas');
|
|
21
|
-
if (canvas) {
|
|
22
|
-
try {
|
|
23
|
-
var dataUrl = canvas.toDataURL('image/png');
|
|
24
|
-
window.parent.postMessage({ type: 'jaw-screenshot', dataUrl: dataUrl, nonce: __nonce }, '*');
|
|
25
|
-
} catch(ex) { /* tainted canvas or other error */ }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
function postHeight() {
|
|
31
|
-
var h = Math.max(
|
|
32
|
-
document.body.scrollHeight,
|
|
33
|
-
document.body.offsetHeight,
|
|
34
|
-
document.documentElement.scrollHeight
|
|
35
|
-
);
|
|
36
|
-
window.parent.postMessage({ type: 'jaw-diagram-resize', height: h, nonce: __nonce }, '*');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (typeof ResizeObserver !== 'undefined') {
|
|
40
|
-
var ro = new ResizeObserver(function() {
|
|
41
|
-
clearTimeout(ro._t);
|
|
42
|
-
ro._t = setTimeout(postHeight, 50);
|
|
43
|
-
});
|
|
44
|
-
ro.observe(document.body);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
window.addEventListener('load', function() {
|
|
48
|
-
postHeight();
|
|
49
|
-
// Deferred re-measure for async chart renders (Chart.js animation, CDN loading)
|
|
50
|
-
setTimeout(postHeight, 200);
|
|
51
|
-
setTimeout(postHeight, 800);
|
|
52
|
-
window.parent.postMessage({ type: 'jaw-widget-ready', nonce: __nonce }, '*');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
var lastSend = 0;
|
|
56
|
-
window.sendPrompt = function(text) {
|
|
57
|
-
var now = Date.now();
|
|
58
|
-
if (now - lastSend < 3000) return;
|
|
59
|
-
lastSend = now;
|
|
60
|
-
window.parent.postMessage({ type: 'jaw-send-prompt', text: String(text).slice(0, 500), nonce: __nonce }, '*');
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// Ctrl+C / Cmd+C: forward selected text to host for clipboard access
|
|
64
|
-
document.addEventListener('copy', function() {
|
|
65
|
-
var sel = window.getSelection();
|
|
66
|
-
if (sel && sel.toString().trim()) {
|
|
67
|
-
window.parent.postMessage({
|
|
68
|
-
type: 'jaw-copy-text',
|
|
69
|
-
text: sel.toString().slice(0, 512),
|
|
70
|
-
nonce: __nonce
|
|
71
|
-
}, '*');
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
})();
|
|
75
|
-
<\/script>`}var Re=[[/\/p5\.js\/1\.11\.1[1-9]\//g,`/p5.js/1.11.10/`]];function ze(e){for(let[t,n]of Re)e=e.replace(t,n);return e}function Be(e){Ne(),Ve(),e=ze(e);let t=Array.from(crypto.getRandomValues(new Uint8Array(16)),e=>e.toString(16).padStart(2,`0`)).join(``),n=Ie(),r=Fe(e),i=Pe(e),a=Le(t),o=`<!DOCTYPE html>
|
|
76
|
-
<html>
|
|
77
|
-
<head>
|
|
78
|
-
<meta charset="utf-8">
|
|
79
|
-
${r}
|
|
80
|
-
${i}
|
|
81
|
-
<style>
|
|
82
|
-
:root { ${Object.entries(n.tokens).map(([e,t])=>`${e}: ${t};`).join(`
|
|
83
|
-
`)} }
|
|
84
|
-
* { margin: 0; box-sizing: border-box; }
|
|
85
|
-
body {
|
|
86
|
-
font-family: var(--font-ui), system-ui, sans-serif;
|
|
87
|
-
color: var(--text);
|
|
88
|
-
background: transparent;
|
|
89
|
-
padding: 16px;
|
|
90
|
-
overflow: hidden;
|
|
91
|
-
}
|
|
92
|
-
</style>
|
|
93
|
-
</head>
|
|
94
|
-
<body>
|
|
95
|
-
<script>
|
|
96
|
-
window.__jawTheme = ${JSON.stringify({isDark:n.isDark})};
|
|
97
|
-
window.__jawTokens = ${JSON.stringify(n.tokens).replace(/<\//g,`<\\/`)};
|
|
98
|
-
<\/script>
|
|
99
|
-
${a}
|
|
100
|
-
${e}
|
|
101
|
-
</body>
|
|
102
|
-
</html>`,s=document.createElement(`iframe`);return s.sandbox.add(`allow-scripts`),s.srcdoc=o,s.style.cssText=`width: 100%; border: none; overflow: hidden; display: block;`,s.setAttribute(`aria-label`,`Interactive diagram widget`),{iframe:s,nonce:t}}function M(e){(e||document).querySelectorAll(`.diagram-widget-pending`).forEach(e=>{let t=e.dataset.diagramHtml;if(!t)return;let n;try{if(t.length>524288)throw Error(`Widget payload too large`);n=decodeURIComponent(escape(atob(t)))}catch{e.replaceWith(Object.assign(document.createElement(`div`),{className:`diagram-error`,textContent:`Failed to decode widget content`,role:`alert`}));return}let r=ke(n);if(!r.valid){e.replaceWith(Object.assign(document.createElement(`div`),{className:`diagram-error`,textContent:`Widget blocked: ${r.reason}`,role:`alert`}));return}r.warnings.length&&console.warn(`[jaw-diagram] Widget warnings:`,r.warnings);let i=document.createElement(`div`);i.className=`diagram-container diagram-widget`,i.dataset.widgetHtml=t,i.appendChild(je()),i.appendChild(Ae());let{iframe:a,nonce:o}=Be(n);i.appendChild(a),e.replaceWith(i);let s=!1;a.addEventListener(`load`,()=>{s?(a.contentWindow&&(k.delete(a.contentWindow),A.delete(a.contentWindow)),console.warn(`[jaw-diagram] iframe navigated — postMessage channel revoked`)):(s=!0,a.contentWindow&&(k.add(a.contentWindow),A.set(a.contentWindow,o),a.contentWindow.postMessage({type:`jaw-request-resize`},`*`),setTimeout(()=>a.contentWindow?.postMessage({type:`jaw-request-resize`},`*`),300),setTimeout(()=>a.contentWindow?.postMessage({type:`jaw-request-resize`},`*`),1e3)))});let c=Number(i.dataset.gen||`0`);i.dataset.gen=String(c);let l=!1,u=e=>{e.source===a.contentWindow&&e.data?.type===`jaw-widget-ready`&&e.data.nonce===o&&(l=!0,window.removeEventListener(`message`,u))};window.addEventListener(`message`,u),setTimeout(()=>{if(window.removeEventListener(`message`,u),Number(i.dataset.gen||`0`)===c&&!l&&i.isConnected){let e=a.contentWindow;e&&(k.delete(e),A.delete(e)),i.innerHTML=`<div class="diagram-error" role="alert">
|
|
103
|
-
Widget failed to load within 10 seconds.
|
|
104
|
-
</div>`,console.warn(`[jaw-diagram] Widget timeout — iframe deregistered`)}},1e4)})}var N=null;function Ve(){if(N)return;let e=document.getElementById(`chatMessages`);e&&(N=new MutationObserver(t=>{for(let n of t)for(let t of n.addedNodes)if(t instanceof HTMLElement&&(t.classList?.contains(`diagram-widget-pending`)||t.querySelector?.(`.diagram-widget-pending`))){requestAnimationFrame(()=>M(t.parentElement||e));return}}),N.observe(e,{childList:!0}))}var P=new WeakMap;function He(e,t){P.has(e)||(P.set(e,window.setTimeout(()=>P.delete(e),100)),document.querySelectorAll(`iframe`).forEach(n=>{n.contentWindow===e&&(n.style.height=`${Math.min(Math.max(t,60),2e3)}px`)}))}function Ue(){document.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e.dataset.widgetHtml;if(!t)return;let n;try{n=decodeURIComponent(escape(atob(t)))}catch{return}let r=e.querySelector(`iframe`);r?.contentWindow&&(k.delete(r.contentWindow),A.delete(r.contentWindow));let i=e;i.dataset.gen=String((Number(i.dataset.gen||`0`)||0)+1);let{iframe:a,nonce:o}=Be(n);e.innerHTML=``,e.appendChild(je()),e.appendChild(Ae()),e.appendChild(a);let s=!1;a.addEventListener(`load`,()=>{s?a.contentWindow&&(k.delete(a.contentWindow),A.delete(a.contentWindow)):(s=!0,a.contentWindow&&(k.add(a.contentWindow),A.set(a.contentWindow,o),a.contentWindow.postMessage({type:`jaw-request-resize`},`*`),setTimeout(()=>a.contentWindow?.postMessage({type:`jaw-request-resize`},`*`),300),setTimeout(()=>a.contentWindow?.postMessage({type:`jaw-request-resize`},`*`),1e3)))})})}var We=0;window.addEventListener(`message`,e=>{if(!e.data||typeof e.data!=`object`||!e.source||e.origin!==`null`||!k.has(e.source)||![...document.querySelectorAll(`iframe`)].find(t=>t.contentWindow===e.source)?.isConnected)return;let t=A.get(e.source);if(!(!t||e.data.nonce!==t))switch(e.data.type){case`jaw-diagram-resize`:{let t=Number(e.data.height);if(!Number.isFinite(t)||t<0)return;He(e.source,t);break}case`jaw-send-prompt`:{let t=Date.now();if(t-We<3e3)return;We=t;let n=String(e.data.text||``).trim().slice(0,500);if(!n)return;let r=document.getElementById(`chatInput`);r&&(r.value=n,r.dispatchEvent(new Event(`input`,{bubbles:!0})),r.focus());break}case`jaw-copy-text`:{let t=String(e.data.text||``).trim().slice(0,512);if(!t)return;navigator.clipboard.writeText(t).catch(()=>{});break}case`jaw-screenshot`:{let t=String(e.data.dataUrl||``);if(!t.startsWith(`data:image/`)||t.length>5242880)return;fetch(t).then(e=>e.blob()).then(e=>{let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`widget-${Date.now()}.png`,n.click(),setTimeout(()=>URL.revokeObjectURL(t),1e3)}).catch(()=>{});break}case`jaw-widget-ready`:break}});function Ge(e){e.dataset.toolItemBound!==`1`&&(e.addEventListener(`click`,e=>{let t=e.target;if(!t)return;let n=t.closest(`.tool-item-toggle`);if(!n)return;let r=n.closest(`.tool-item`),i=r?.querySelector(`.tool-item-details`),a=n.querySelector(`.tool-item-chevron`);if(!r||!i)return;let o=i.classList.contains(`collapsed`);i.classList.toggle(`collapsed`,!o),r.classList.toggle(`expanded`,o),n.setAttribute(`aria-expanded`,o?`true`:`false`),a&&(a.innerHTML=o?d.chevronDown:d.chevronRight)}),e.dataset.toolItemBound=`1`)}function Ke(){document.querySelectorAll(`.tool-activity-live`).forEach(e=>e.remove()),document.querySelectorAll(`.msg-system.tool-activity`).forEach(e=>e.remove())}function qe(e){let t={};for(let n of e){let e=n.type===`thinking`?`${d.thinking} Thinking`:n.type===`search`?`${d.search} Search`:`${d.tool} Tool`;t[e]=(t[e]||0)+1}return Object.entries(t).map(([e,t])=>t>1?`${e}×${t}`:e).join(` + `)}function Je(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n?n.length>t?`${n.slice(0,t-1)}…`:n:``}function Ye(e){let t=(e.detail||``).trim();return t?t!==(e.label||``).trim():!1}function F(e){let t=`process-step-dot ${e.status}`,n=`process-step-badge ${e.type}`,r=e.type.toUpperCase(),i=c(e.label||e.icon||``),a=e.detail||``,o=`process-detail-${e.id}`,s=Ye(e)?Je(a,e.type===`thinking`?120:100):``,l=s?`<span class="process-step-snippet">${c(s)}</span>`:``;return Ye(e)?`<div class="process-step process-step-expandable" data-step-id="${e.id}" data-type="${e.type}">
|
|
105
|
-
<button class="process-step-toggle" aria-expanded="false" aria-controls="${o}">
|
|
106
|
-
<span class="${t}"></span>
|
|
107
|
-
<span class="${n}">${r}</span>
|
|
108
|
-
<span class="process-step-main">
|
|
109
|
-
<span class="process-step-label">${i}</span>
|
|
110
|
-
${l}
|
|
111
|
-
</span>
|
|
112
|
-
<span class="process-step-chevron">${d.chevronRight}</span>
|
|
113
|
-
</button>
|
|
114
|
-
<div class="process-step-details collapsed" id="${o}">
|
|
115
|
-
<pre class="process-step-full">${c(a)}</pre>
|
|
116
|
-
</div>
|
|
117
|
-
</div>`:`<div class="process-step" data-step-id="${e.id}" data-type="${e.type}">
|
|
118
|
-
<span class="${t}"></span>
|
|
119
|
-
<span class="${n}">${r}</span>
|
|
120
|
-
<span class="process-step-label">${i}</span>
|
|
121
|
-
</div>`}function Xe(e=``,t=!1){return`<div class="process-block${t?` collapsed`:``}">
|
|
122
|
-
<button class="process-summary" aria-expanded="${t?`false`:`true`}">
|
|
123
|
-
<span class="process-dot ${t?`done`:`running`}"></span>
|
|
124
|
-
<span class="process-summary-text">${e}</span>
|
|
125
|
-
<span class="process-duration"></span>
|
|
126
|
-
<span class="process-chevron">${t?d.chevronRight:d.chevronDown}</span>
|
|
127
|
-
</button>
|
|
128
|
-
<div class="process-details">
|
|
129
|
-
<div class="process-steps-inner"></div>
|
|
130
|
-
</div>
|
|
131
|
-
</div>`}function Ze(e){let t=e.closest(`.process-step`),n=t?.querySelector(`.process-step-details`),r=e.querySelector(`.process-step-chevron`);if(!t||!n)return;let i=n.classList.contains(`collapsed`);n.classList.toggle(`collapsed`,!i),t.classList.toggle(`expanded`,i),e.setAttribute(`aria-expanded`,i?`true`:`false`),r&&(r.innerHTML=i?d.chevronDown:d.chevronRight)}function Qe(e){e.dataset.processBlockBound!==`1`&&(e.addEventListener(`click`,e=>{let t=e.target;if(!t)return;let n=t.closest(`.process-step-toggle`);if(n){Ze(n);return}let r=t.closest(`.process-summary`);if(r){let e=r.closest(`.process-block`);if(!e)return;let t=e.classList.contains(`collapsed`);e.classList.toggle(`collapsed`,!t),r.setAttribute(`aria-expanded`,t?`true`:`false`);let n=r.querySelector(`.process-chevron`);n&&(n.innerHTML=t?d.chevronDown:d.chevronRight)}}),e.dataset.processBlockBound=`1`)}function I(e,t=!0){let n=Xe(qe(e),t),r=document.createElement(`div`);r.innerHTML=n;let i=r.querySelector(`.process-steps-inner`);i&&(i.innerHTML=e.map(F).join(``));let a=r.querySelector(`.process-dot`);if(a){let n=e.some(e=>e.status===`running`);a.classList.toggle(`running`,n&&!t),a.classList.toggle(`done`,!n||t)}return r.innerHTML}function L(e){let t=e.element.querySelector(`.process-summary-text`);t&&(t.innerHTML=qe(e.steps));let n=e.steps.some(e=>e.status===`running`),r=e.element.querySelector(`.process-dot`);r&&(r.classList.toggle(`running`,n&&!e.collapsed),r.classList.toggle(`done`,!n||e.collapsed));let i=e.steps.length>0?Math.round((Date.now()-e.steps[0].startTime)/1e3):0,a=e.element.querySelector(`.process-duration`);a&&(a.textContent=i>0?`${i}s`:``)}function R(e){let t=document.createElement(`div`);t.innerHTML=Xe(``,!1);let n=t.firstElementChild,r=e.querySelector(`.msg-content`);return r?r.before(n):e.appendChild(n),{element:n,steps:[],collapsed:!1}}function z(e,t){e.steps.push(t);let n=e.element.querySelector(`.process-steps-inner`);n&&n.insertAdjacentHTML(`beforeend`,F(t)),L(e)}function B(e,t,n){let r=e.steps.findIndex(e=>e.id===t);if(r===-1)return;e.steps[r]=n;let i=e.element.querySelector(`[data-step-id="${t}"]`);if(i){let e=document.createElement(`div`);e.innerHTML=F(n);let t=e.firstElementChild;t&&i.replaceWith(t)}L(e)}function $e(e,t,n){let r=e.steps.find(e=>e.id===t);if(!r)return;r.status=n;let i=e.element.querySelector(`[data-step-id="${t}"]`);if(i){let e=i.querySelector(`.process-step-dot`);e&&(e.classList.remove(`running`,`done`,`error`),e.classList.add(n))}L(e)}function V(e){e.collapsed=!0,e.element.classList.add(`collapsed`);let t=e.element.querySelector(`.process-summary`);t&&t.setAttribute(`aria-expanded`,`false`);let n=e.element.querySelector(`.process-chevron`);n&&(n.innerHTML=d.chevronRight);for(let t of e.steps)t.status===`running`&&(t.status=`done`);e.element.querySelectorAll(`.process-step-dot.running`).forEach(e=>{e.classList.remove(`running`),e.classList.add(`done`)}),L(e)}function H(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function U(e){return _e()}function W(e){return e.map(e=>({id:h(),icon:e.icon?i(e.icon):d.tool,label:e.label||e.name||`tool`,type:e.toolType||`tool`,detail:e.detail||``,stepRef:e.stepRef||``,status:e.status||`done`,startTime:Date.now()}))}function et(t){let n=document.getElementById(`statusBadge`),r=document.getElementById(`btnSend`);e.agentBusy=t===`running`,document.getElementById(`typingIndicator`)?.classList.toggle(`active`,e.agentBusy),t===`running`?(n&&(n.className=`status-badge status-running`,n.textContent=`running`),r&&(r.innerHTML=d.stop,r.title=a(`btn.stop`),r.classList.add(`stop-mode`)),nt()):(n&&(n.className=`status-badge status-idle`,n.textContent=`idle`),r&&(r.innerHTML=d.send,r.title=`Send`,r.classList.remove(`stop-mode`)),G(),tt(0))}function tt(e){let t=document.getElementById(`queueBadge`);if(!t){t=document.createElement(`span`),t.id=`queueBadge`,t.className=`queue-badge`;let e=document.getElementById(`btnSend`);e?.parentElement&&(e.parentElement.style.position=`relative`),e&&(e.style.position=`relative`,e.appendChild(t))}t.textContent=e>0?String(e):``,t.style.display=e>0?`flex`:`none`}function nt(){let e=document.getElementById(`chatMessages`);if(!e||e.querySelector(`.skeleton-msg`))return;K();let t=document.createElement(`div`);t.className=`skeleton-msg`,t.innerHTML=`<div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line"></div>`,e.appendChild(t),Z()}function G(){document.querySelectorAll(`.skeleton-msg`).forEach(e=>e.remove())}function K(){document.getElementById(`emptyState`)?.classList.remove(`visible`)}function q(){let e=document.getElementById(`chatMessages`);e&&e.children.length===0&&document.getElementById(`emptyState`)?.classList.add(`visible`)}function J(e,t,n){let r=document.getElementById(`chatMessages`);if(!r)return;let i=E();K();let a=document.createElement(`div`);a.className=`msg msg-system`+(n?` msg-type-${n}`:``)+(t?` `+t:``),a.innerHTML=e,i.active?i.appendLiveItem(a):r.appendChild(a),Z()}function rt(){Ke(),e.currentAgentDiv=null,e.currentProcessBlock=null}function it(t){if(G(),(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``),e.currentProcessBlock=null),!e.currentProcessBlock){let t=e.currentAgentDiv.querySelector(`.agent-body`);t&&(e.currentProcessBlock=R(t))}if(e.currentProcessBlock){let n=t.status&&t.status!==`running`?t.status:s(t.icon);if(n===`done`||n===`error`){let r=t.stepRef,a=r?[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.stepRef===r):[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label);if(a){t.detail&&!a.detail?(t.icon=i(t.icon),B(e.currentProcessBlock,a.id,{...t,id:a.id})):$e(e.currentProcessBlock,a.id,n),Z();return}let o=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`);if(o){t.detail&&!o.detail?(t.icon=i(t.icon),B(e.currentProcessBlock,o.id,{...t,id:o.id})):$e(e.currentProcessBlock,o.id,n),Z();return}}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!e.detail);if(n){B(e.currentProcessBlock,n.id,t),Z();return}}t.icon=i(t.icon),z(e.currentProcessBlock,t)}Z()}var Y=null;function at(t){if(!t)return;G(),(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``),Y=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(Y||=we(n),Te(Y,t)),Z()}var ot=0;function st(t,n){let r=Date.now();if(!e.currentAgentDiv&&r-ot<500)return;Ke(),G();let i=!!e.currentProcessBlock;e.currentProcessBlock&&=(V(e.currentProcessBlock),null);let a=n&&n.length>0;if(t||a){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=X(`agent`,``));let r=e.currentAgentDiv?.querySelector(`.msg-content`),s=Y?Ee(Y,!0):``,c=t||s;Y=null;let u=a&&!i?I(W(n),!0):``;r&&(r.innerHTML=u+o(c)),r&&r.setAttribute(`data-raw`,l(c)),r&&M(r);let d=E();d.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected&&(d.appendLiveItem(e.currentAgentDiv),e.currentAgentDiv.remove()),c&&f({role:`assistant`,content:c,tool_log:n?JSON.stringify(n):null,timestamp:Date.now()}).catch(()=>{})}Y=null,e.currentAgentDiv=null,ot=Date.now(),et(`idle`),$()}function X(e,t,n){let r=document.getElementById(`chatMessages`),i=E();K(),G();let s=o(t),d=c(e===`user`?a(`msg.you`):v()),f=document.createElement(`div`);e===`agent`?(f.className=`msg msg-agent`,f.innerHTML=`<div class="agent-icon" aria-hidden="true">${U(n)}</div><div class="agent-body"><div class="msg-content">${s}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div>`):(f.className=`msg msg-${e}`,f.innerHTML=`<div class="user-body"><div class="msg-label">${d}</div><div class="msg-content">${s}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div><div class="user-icon" aria-hidden="true">${w()}</div>`);let p=f.querySelector(`.msg-content`);p&&p.setAttribute(`data-raw`,l(t));let m=e===`agent`&&!t;return i.active&&!m?i.appendLiveItem(f):(r?.appendChild(f),M(f),!i.active&&!m&&r&&r.querySelectorAll(`.msg`).length>=80&&(r.querySelectorAll(`.msg`).forEach(e=>{i.addItem(h(),e.outerHTML)}),i.onPostRender=e=>{M(e),u(e)})),Z(),f}var ct=null;function Z(){let e=E();if(e.active){e.scrollToBottom();return}ct||=requestAnimationFrame(()=>{ct=null;let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight)})}function lt(e,t){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),t&&(t.classList.add(`active`),t.setAttribute(`aria-selected`,`true`)),e===`settings`&&r(()=>import(`./settings-BHIV4l1s.js`).then(e=>e.loadSettings()),__vite__mapDeps([0])),e===`agents`&&r(()=>import(`./employees-zxrU6ZV_.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&r(()=>import(`./skills-JuDja1UC.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function ut(){document.getElementById(`tabSettings`)?.classList.contains(`active`)?r(()=>import(`./settings-BHIV4l1s.js`).then(e=>e.savePerCli()),__vite__mapDeps([0])):r(()=>import(`./settings-BHIV4l1s.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}function Q(e){let t=document.getElementById(`statMsgs`);t&&(t.textContent=a(`stat.messages`,{count:e}))}async function $(){let e=await n(`/api/messages`);e&&Q(e.length)}async function dt(){let e=E(),t=document.getElementById(`chatMessages`);try{let e=await n(`/api/settings`);e?.workingDir&&p(e.workingDir)}catch{}let r=await n(`/api/messages`);if(r!==null){if(e.clear(),t&&(t.innerHTML=``),r.length>=80){e.onLazyRender=t=>{for(let n of t){if(!n.classList.contains(`lazy-pending`))continue;let t=n.getAttribute(`data-raw`)||``;n.innerHTML=t?o(t):``,n.classList.remove(`lazy-pending`),M(n);let r=n.closest(`[data-vs-idx]`);if(r){let t=Number(r.dataset.vsIdx);e.updateItemHtml(t,r.outerHTML)}}},e.onPostRender=e=>{M(e),u(e)};let t=[];for(let e of r){let n=e.role===`assistant`?`agent`:e.role,r=l(e.content),i=c(n===`user`?a(`msg.you`):v()),o=e.role===`assistant`?H(e.tool_log):[],s=o.length>0?I(W(o),!0):``,u=`<div class="skeleton-line"></div><div class="skeleton-line"></div>`,d=n===`agent`?`<div class="msg msg-agent"><div class="agent-icon" aria-hidden="true">${U(e.cli)}</div><div class="agent-body">${s}<div class="msg-content lazy-pending" data-raw="${c(r)}">${u}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div></div>`:`<div class="msg msg-${n}"><div class="user-body"><div class="msg-label">${i}</div><div class="msg-content lazy-pending" data-raw="${c(r)}">${u}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div><div class="user-icon" aria-hidden="true">${w()}</div></div>`;t.push({id:h(),html:d,height:80})}e.setItems(t),e.scrollToBottom()}else r.forEach(e=>{let t=X(e.role===`assistant`?`agent`:e.role,e.content,e.cli);if(e.role===`assistant`){let n=H(e.tool_log);if(n.length>0){let e=t.querySelector(`.agent-body`);if(e){let t=R(e);for(let e of W(n))z(t,e);V(t)}}}});ee(r.map(e=>({role:e.role,content:e.content,cli:e.cli??null,tool_log:e.tool_log??null,timestamp:Date.now()}))).catch(()=>{}),Q(r.length),q();return}if(t&&t.children.length>0){q();return}let i=await m();if(i.length>0){if(i.length>=80){for(let t of i){let n=t.role===`assistant`?`agent`:t.role,r=l(t.content),i=c(n===`user`?a(`msg.you`):v()),o=t.role===`assistant`&&t.tool_log?H(t.tool_log):[],s=o.length>0?I(W(o),!0):``,u=`<div class="skeleton-line"></div><div class="skeleton-line"></div>`,d=n===`agent`?`<div class="msg msg-agent"><div class="agent-icon" aria-hidden="true">${U(t.cli)}</div><div class="agent-body">${s}<div class="msg-content lazy-pending" data-raw="${c(r)}">${u}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div></div>`:`<div class="msg msg-${n}"><div class="user-body"><div class="msg-label">${i}</div><div class="msg-content lazy-pending" data-raw="${c(r)}">${u}</div><button class="msg-copy" title="Copy" aria-label="Copy message"></button></div><div class="user-icon" aria-hidden="true">${w()}</div></div>`;e.addItem(h(),d)}e.onLazyRender=t=>{for(let n of t){if(!n.classList.contains(`lazy-pending`))continue;let t=n.getAttribute(`data-raw`)||``;n.innerHTML=t?o(t):``,n.classList.remove(`lazy-pending`),M(n);let r=n.closest(`[data-vs-idx]`);if(r){let t=Number(r.dataset.vsIdx);e.updateItemHtml(t,r.outerHTML)}}},e.onPostRender=e=>{M(e),u(e)},e.scrollToBottom()}else i.forEach(e=>{let t=X(e.role===`assistant`?`agent`:e.role,e.content,e.cli);if(e.role===`assistant`&&e.tool_log){let n=H(e.tool_log);if(n.length>0){let e=t.querySelector(`.agent-body`);if(e){let t=R(e);for(let e of W(n))z(t,e);V(t)}}}});J(`${d.warning} 오프라인 모드 — 캐시된 메시지 표시 중`),Q(i.length)}q()}function ft(){let e=document.getElementById(`chatMessages`);e&&(Qe(e),Ge(e),e.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`.tool-group-summary`);if(n){let e=n.closest(`.tool-group`),t=n.nextElementSibling;if(e&&t){let r=!e.classList.contains(`expanded`);e.classList.toggle(`expanded`),t.classList.toggle(`collapsed`),n.setAttribute(`aria-expanded`,r?`true`:`false`)}return}let r=t.closest(`.msg-copy`);if(!r)return;let i=r.closest(`.msg`)?.querySelector(`.msg-content`);if(!i)return;let a=i.getAttribute(`data-raw`)||i.innerText||i.textContent||``;navigator.clipboard.writeText(a).then(()=>{r.classList.add(`copied`),r.innerHTML=d.checkSimple,setTimeout(()=>{r.classList.remove(`copied`),r.textContent=``},600)}).catch(()=>{})}))}export{ve as _,st as a,dt as c,et as d,it as f,E as g,Ue as h,rt as i,$ as l,tt as m,J as n,ut as o,lt as p,at as r,ft as s,X as t,Z as u,re as v};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e,d as t,i as n,m as r}from"./ui-BXZhbE_1.js";export{n as cleanupToolActivity,e as loadMessages,t as setStatus,r as updateQueueBadge};
|