cli-jaw 1.7.32 → 1.7.33
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/dist/bin/cli-jaw.js +11 -0
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/star-prompt.js +96 -0
- package/dist/bin/star-prompt.js.map +1 -0
- package/dist/src/agent/args.js +0 -4
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/events.js +328 -54
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/spawn.js +9 -6
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/command-context.js +1 -0
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +2 -1
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers.js +20 -0
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/registry.js +6 -19
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/config.js +1 -0
- package/dist/src/core/config.js.map +1 -1
- package/package.json +1 -1
- package/public/css/tool-ui.css +20 -1
- package/public/dist/assets/constants-IeOVgtYz.js +1 -0
- package/public/dist/assets/{employees-CpgcoYx1.js → employees-Do9d6Xi5.js} +1 -1
- package/public/dist/assets/{index-DVAk6-ox.css → index-qALA03H1.css} +1 -1
- package/public/dist/assets/{index-DlhVtNGh.js → index-yGExjgR_.js} +4 -4
- package/public/dist/assets/{memory-jVeY3J9Z.js → memory-DeZSzBAb.js} +1 -1
- package/public/dist/assets/memory-Dpe-qPbZ.js +1 -0
- package/public/dist/assets/render-CQnnZ-_i.js +30 -0
- package/public/dist/assets/{settings-DN37FmEm.js → settings-C8bSXG3q.js} +1 -1
- package/public/dist/assets/settings-COrhSfDh.js +1 -0
- package/public/dist/assets/skills-BO0V4aHG.js +1 -0
- package/public/dist/assets/{skills-C-Hd0Khs.js → skills-Ci5t_dsV.js} +1 -1
- package/public/dist/assets/{slash-commands-DKD_PVHP.js → slash-commands-0RvnZU9z.js} +1 -1
- package/public/dist/assets/slash-commands-DbUvFtCk.js +1 -0
- package/public/dist/assets/ui-Cxk1_e0b.js +1 -0
- package/public/dist/assets/ui-IWxpAzJ7.js +131 -0
- package/public/dist/assets/vendor-icons-Bs4t7RP2.js +1 -0
- package/public/dist/assets/ws-FsYmCE65.js +14 -0
- package/public/dist/index.html +2 -2
- package/public/js/constants.ts +5 -18
- package/public/js/features/process-block.ts +10 -1
- package/public/js/features/settings-types.ts +1 -1
- package/public/js/features/tool-ui.ts +2 -0
- package/public/js/icons.ts +15 -0
- package/public/js/ui.ts +80 -18
- package/public/js/virtual-scroll.ts +38 -8
- package/public/js/ws.ts +7 -3
- package/public/dist/assets/constants-2eOyiA6N.js +0 -1
- package/public/dist/assets/memory-CnXTT6wp.js +0 -1
- package/public/dist/assets/render-CtsdCdtV.js +0 -30
- package/public/dist/assets/settings-DidDB9Rr.js +0 -1
- package/public/dist/assets/skills-BsXI_IT2.js +0 -1
- package/public/dist/assets/slash-commands-DTi0pAMr.js +0 -1
- package/public/dist/assets/ui-BUkXAGyS.js +0 -1
- package/public/dist/assets/ui-N2Up5Bik.js +0 -130
- package/public/dist/assets/vendor-icons-C6LXvgi0.js +0 -1
- package/public/dist/assets/ws-Dgn9Mqgb.js +0 -14
package/public/js/icons.ts
CHANGED
|
@@ -42,9 +42,12 @@ import {
|
|
|
42
42
|
Pencil,
|
|
43
43
|
ChartBar,
|
|
44
44
|
Hourglass,
|
|
45
|
+
Target,
|
|
45
46
|
Square,
|
|
46
47
|
X,
|
|
47
48
|
Send,
|
|
49
|
+
Ban,
|
|
50
|
+
Play,
|
|
48
51
|
Check,
|
|
49
52
|
ChevronLeft,
|
|
50
53
|
ChevronRight,
|
|
@@ -118,6 +121,9 @@ export const ICONS = {
|
|
|
118
121
|
pencil: luc(Pencil),
|
|
119
122
|
chart: luc(ChartBar),
|
|
120
123
|
hourglass: luc(Hourglass),
|
|
124
|
+
target: luc(Target),
|
|
125
|
+
ban: luc(Ban),
|
|
126
|
+
play: luc(Play),
|
|
121
127
|
stop: luc(Square),
|
|
122
128
|
close: luc(X, S),
|
|
123
129
|
send: luc(Send),
|
|
@@ -178,6 +184,10 @@ const iconMap: Partial<Record<IconName, (s: number) => string>> = {
|
|
|
178
184
|
folder: (s) => luc(FolderOpen, s),
|
|
179
185
|
pencil: (s) => luc(Pencil, s),
|
|
180
186
|
chart: (s) => luc(ChartBar, s),
|
|
187
|
+
hourglass: (s) => luc(Hourglass, s),
|
|
188
|
+
target: (s) => luc(Target, s),
|
|
189
|
+
ban: (s) => luc(Ban, s),
|
|
190
|
+
play: (s) => luc(Play, s),
|
|
181
191
|
copy: (s) => luc(Copy, s),
|
|
182
192
|
download: (s) => luc(Download, s),
|
|
183
193
|
};
|
|
@@ -227,6 +237,11 @@ const EMOJI_TO_ICON: Record<string, IconName> = {
|
|
|
227
237
|
'✏️': 'pencil',
|
|
228
238
|
'📊': 'chart',
|
|
229
239
|
'🎙️': 'mic',
|
|
240
|
+
'⏳': 'hourglass',
|
|
241
|
+
'🎯': 'target',
|
|
242
|
+
'📨': 'send',
|
|
243
|
+
'🚫': 'ban',
|
|
244
|
+
'▶': 'play',
|
|
230
245
|
};
|
|
231
246
|
|
|
232
247
|
/** Convert an emoji string to its icon SVG. Falls back to the emoji if unknown. */
|
package/public/js/ui.ts
CHANGED
|
@@ -29,6 +29,12 @@ interface MessageItem { role: string; content: string; tool_log?: string | null;
|
|
|
29
29
|
interface QueuedOverlayItem { id: string; prompt: string; source?: string; ts?: number; }
|
|
30
30
|
interface ActiveRunSnapshot { running?: boolean; cli?: string; text?: string; toolLog?: ToolLogEntry[]; }
|
|
31
31
|
|
|
32
|
+
function processStepType(toolType?: string): ProcessStep['type'] {
|
|
33
|
+
return toolType === 'thinking' || toolType === 'search' || toolType === 'subagent'
|
|
34
|
+
? toolType
|
|
35
|
+
: 'tool';
|
|
36
|
+
}
|
|
37
|
+
|
|
32
38
|
function parseToolLog(toolLog?: string | null): ToolLogEntry[] {
|
|
33
39
|
if (!toolLog) return [];
|
|
34
40
|
try {
|
|
@@ -47,8 +53,9 @@ function toProcessSteps(tools: ToolLogEntry[]): ProcessStep[] {
|
|
|
47
53
|
return tools.map((tool: any) => ({
|
|
48
54
|
id: generateId(),
|
|
49
55
|
icon: tool.icon ? emojiToIcon(tool.icon) : ICONS.tool,
|
|
56
|
+
rawIcon: tool.rawIcon || tool.icon || '',
|
|
50
57
|
label: tool.label || tool.name || 'tool',
|
|
51
|
-
type: tool.toolType
|
|
58
|
+
type: processStepType(tool.toolType),
|
|
52
59
|
detail: tool.detail || '',
|
|
53
60
|
stepRef: tool.stepRef || '',
|
|
54
61
|
status: tool.status || 'done',
|
|
@@ -160,6 +167,7 @@ export function showProcessStep(step: ProcessStep): void {
|
|
|
160
167
|
}
|
|
161
168
|
}
|
|
162
169
|
if (state.currentProcessBlock) {
|
|
170
|
+
const rawIcon = step.rawIcon || step.icon;
|
|
163
171
|
// Completion detection: prefer semantic status field, fall back to emoji check
|
|
164
172
|
const resolvedStatus = (step.status && step.status !== 'running')
|
|
165
173
|
? step.status
|
|
@@ -173,28 +181,54 @@ export function showProcessStep(step: ProcessStep): void {
|
|
|
173
181
|
: [...state.currentProcessBlock.steps].reverse()
|
|
174
182
|
.find(s => s.status === 'running' && s.label === step.label);
|
|
175
183
|
if (match) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
step.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
184
|
+
step.icon = emojiToIcon(step.icon);
|
|
185
|
+
const mergedDetail = step.detail
|
|
186
|
+
? (match.detail ? `${match.detail}\n${step.detail}` : step.detail)
|
|
187
|
+
: match.detail;
|
|
188
|
+
replaceStep(state.currentProcessBlock, match.id, {
|
|
189
|
+
...match,
|
|
190
|
+
...step,
|
|
191
|
+
id: match.id,
|
|
192
|
+
rawIcon,
|
|
193
|
+
detail: mergedDetail,
|
|
194
|
+
label: step.label || match.label,
|
|
195
|
+
status: resolvedStatus,
|
|
196
|
+
});
|
|
183
197
|
scrollToBottom();
|
|
184
198
|
return;
|
|
185
199
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
200
|
+
if (!step.stepRef) {
|
|
201
|
+
// Legacy fallback only for uncorrelated tools. stepRef-bearing done events
|
|
202
|
+
// must not close another subagent's running row.
|
|
203
|
+
const anyRunning = [...state.currentProcessBlock.steps].reverse()
|
|
204
|
+
.find(s => s.status === 'running');
|
|
205
|
+
if (anyRunning) {
|
|
206
|
+
if (step.detail && !anyRunning.detail) {
|
|
207
|
+
step.icon = emojiToIcon(step.icon);
|
|
208
|
+
replaceStep(state.currentProcessBlock, anyRunning.id, { ...step, id: anyRunning.id, rawIcon });
|
|
209
|
+
} else {
|
|
210
|
+
updateStepStatus(state.currentProcessBlock, anyRunning.id, resolvedStatus);
|
|
211
|
+
}
|
|
212
|
+
scrollToBottom();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (step.stepRef && (resolvedStatus === 'done' || resolvedStatus === 'error')) {
|
|
217
|
+
const existingDone = [...state.currentProcessBlock.steps].reverse()
|
|
218
|
+
.find(s => s.stepRef === step.stepRef && (s.status === 'done' || s.status === 'error'));
|
|
219
|
+
if (existingDone) {
|
|
191
220
|
step.icon = emojiToIcon(step.icon);
|
|
192
|
-
replaceStep(state.currentProcessBlock,
|
|
193
|
-
|
|
194
|
-
|
|
221
|
+
replaceStep(state.currentProcessBlock, existingDone.id, {
|
|
222
|
+
...existingDone,
|
|
223
|
+
...step,
|
|
224
|
+
id: existingDone.id,
|
|
225
|
+
rawIcon,
|
|
226
|
+
status: resolvedStatus,
|
|
227
|
+
detail: step.detail,
|
|
228
|
+
});
|
|
229
|
+
scrollToBottom();
|
|
230
|
+
return;
|
|
195
231
|
}
|
|
196
|
-
scrollToBottom();
|
|
197
|
-
return;
|
|
198
232
|
}
|
|
199
233
|
}
|
|
200
234
|
// Dedupe: detail이 있는 재broadcast → 같은 label+type의 detail 없는 유령 교체
|
|
@@ -211,6 +245,7 @@ export function showProcessStep(step: ProcessStep): void {
|
|
|
211
245
|
}
|
|
212
246
|
}
|
|
213
247
|
// Convert emoji icon to SVG before adding step
|
|
248
|
+
step.rawIcon = rawIcon;
|
|
214
249
|
step.icon = emojiToIcon(step.icon);
|
|
215
250
|
addStep(state.currentProcessBlock, step);
|
|
216
251
|
}
|
|
@@ -444,6 +479,33 @@ function ensureScrollTracking(): void {
|
|
|
444
479
|
}, { passive: true });
|
|
445
480
|
}
|
|
446
481
|
|
|
482
|
+
export function isChatNearBottom(): boolean {
|
|
483
|
+
ensureScrollTracking();
|
|
484
|
+
const c = document.getElementById('chatMessages');
|
|
485
|
+
if (!c) return userNearBottom;
|
|
486
|
+
const vs = getVirtualScroll();
|
|
487
|
+
if (vs.active) return vs.isNearBottom(SCROLL_BOTTOM_THRESHOLD);
|
|
488
|
+
const dist = c.scrollHeight - c.scrollTop - c.clientHeight;
|
|
489
|
+
return dist < SCROLL_BOTTOM_THRESHOLD;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
export function reconcileChatBottomAfterLayout(shouldFollow = isChatNearBottom()): void {
|
|
493
|
+
ensureScrollTracking();
|
|
494
|
+
if (!shouldFollow) return;
|
|
495
|
+
userNearBottom = true;
|
|
496
|
+
const vs = getVirtualScroll();
|
|
497
|
+
if (vs.active) {
|
|
498
|
+
vs.reconcileBottomAfterLayout('reconnect', true);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
requestAnimationFrame(() => {
|
|
502
|
+
requestAnimationFrame(() => {
|
|
503
|
+
const c = document.getElementById('chatMessages');
|
|
504
|
+
if (c) c.scrollTop = c.scrollHeight;
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
|
|
447
509
|
/** Scroll chat to bottom.
|
|
448
510
|
* @param force - bypass user-scroll detection (use for explicit user actions) */
|
|
449
511
|
export function scrollToBottom(force = false): void {
|
|
@@ -13,6 +13,7 @@ import { generateId } from './uuid.js';
|
|
|
13
13
|
const THRESHOLD = 1;
|
|
14
14
|
const EST_HEIGHT = 80;
|
|
15
15
|
const OVERSCAN = 5;
|
|
16
|
+
const BOTTOM_THRESHOLD = 80;
|
|
16
17
|
|
|
17
18
|
export interface VirtualItem {
|
|
18
19
|
id: string;
|
|
@@ -168,15 +169,30 @@ export class VirtualScroll {
|
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
scrollToBottom(): void {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
//
|
|
175
|
-
// outside VS
|
|
176
|
-
// Note: activate(toBottom) uses scrollToIndex for immediate sync.
|
|
172
|
+
if (this._active && this.virtualizer && this.items.length > 0) {
|
|
173
|
+
this.virtualizer.scrollToIndex(this.items.length - 1, { align: 'end' });
|
|
174
|
+
}
|
|
175
|
+
// Keep DOM scrollTop as the final source so streaming placeholder
|
|
176
|
+
// content outside VS is still reachable.
|
|
177
177
|
this.container.scrollTop = this.container.scrollHeight;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
+
isNearBottom(threshold = BOTTOM_THRESHOLD): boolean {
|
|
181
|
+
const dist = this.container.scrollHeight - this.container.scrollTop - this.container.clientHeight;
|
|
182
|
+
return dist < threshold;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
reconcileBottomAfterLayout(reason: 'pageshow' | 'visibility' | 'focus' | 'reconnect' | 'manual', shouldFollow = this.isNearBottom()): void {
|
|
186
|
+
if (!shouldFollow) return;
|
|
187
|
+
void reason;
|
|
188
|
+
requestAnimationFrame(() => {
|
|
189
|
+
this.invalidateLayout();
|
|
190
|
+
requestAnimationFrame(() => {
|
|
191
|
+
this.scrollToBottom();
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
180
196
|
flushToDOM(): void {
|
|
181
197
|
if (!this._active) return;
|
|
182
198
|
this.deactivate();
|
|
@@ -274,13 +290,27 @@ export class VirtualScroll {
|
|
|
274
290
|
// pageshow fires when page is restored from bfcache (persisted=true).
|
|
275
291
|
// Regular reload goes through normal activate() flow, but bfcache
|
|
276
292
|
// restores the JS heap with stale cached measurements.
|
|
293
|
+
const restoreBottomAfterLayout = (reason: 'pageshow' | 'visibility' | 'focus') => {
|
|
294
|
+
if (!this.virtualizer) return;
|
|
295
|
+
const shouldFollow = this.isNearBottom();
|
|
296
|
+
this.reconcileBottomAfterLayout(reason, shouldFollow);
|
|
297
|
+
};
|
|
277
298
|
const onPageShow = (e: PageTransitionEvent) => {
|
|
278
|
-
if (!e.persisted
|
|
279
|
-
|
|
299
|
+
if (!e.persisted) return;
|
|
300
|
+
restoreBottomAfterLayout('pageshow');
|
|
280
301
|
};
|
|
281
302
|
window.addEventListener('pageshow', onPageShow);
|
|
303
|
+
const onVisibilityChange = () => {
|
|
304
|
+
if (document.visibilityState !== 'visible') return;
|
|
305
|
+
restoreBottomAfterLayout('visibility');
|
|
306
|
+
};
|
|
307
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
308
|
+
const onFocus = () => restoreBottomAfterLayout('focus');
|
|
309
|
+
window.addEventListener('focus', onFocus);
|
|
282
310
|
this.cleanupFn = () => {
|
|
283
311
|
window.removeEventListener('pageshow', onPageShow);
|
|
312
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
313
|
+
window.removeEventListener('focus', onFocus);
|
|
284
314
|
for (const cleanup of cleanupFns.reverse()) cleanup();
|
|
285
315
|
};
|
|
286
316
|
|
package/public/js/ws.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ── WebSocket Connection ──
|
|
2
2
|
import { state } from './state.js';
|
|
3
|
-
import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, applyQueuedOverlay, hydrateActiveRun } from './ui.js';
|
|
3
|
+
import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, applyQueuedOverlay, hydrateActiveRun, isChatNearBottom, reconcileChatBottomAfterLayout } from './ui.js';
|
|
4
4
|
import { renderPendingQueue } from './features/pending-queue.js';
|
|
5
5
|
import { t, getLang } from './features/i18n.js';
|
|
6
6
|
import { getVirtualScroll } from './virtual-scroll.js';
|
|
@@ -255,11 +255,13 @@ export function connect(): void {
|
|
|
255
255
|
} else if (msg.type === 'agent_tool') {
|
|
256
256
|
const empPrefix = msg.isEmployee ? '(E) ' : '';
|
|
257
257
|
const stepType = msg.toolType === 'thinking' ? 'thinking'
|
|
258
|
-
: msg.toolType === 'search' ? 'search'
|
|
258
|
+
: msg.toolType === 'search' ? 'search'
|
|
259
|
+
: msg.toolType === 'subagent' ? 'subagent' : 'tool';
|
|
259
260
|
showProcessStep({
|
|
260
261
|
id: `step-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
|
|
261
262
|
type: stepType,
|
|
262
263
|
icon: msg.icon || ICONS.tool,
|
|
264
|
+
rawIcon: (msg as any).rawIcon || msg.icon || '',
|
|
263
265
|
label: empPrefix + (msg.label || ''),
|
|
264
266
|
detail: msg.detail || '',
|
|
265
267
|
stepRef: msg.stepRef || '',
|
|
@@ -305,6 +307,7 @@ export function connect(): void {
|
|
|
305
307
|
console.log('[ws] connected');
|
|
306
308
|
const now = Date.now();
|
|
307
309
|
const skipReload = now - lastLoadTs < 10000;
|
|
310
|
+
const shouldFollowBottom = isChatNearBottom();
|
|
308
311
|
import('./ui.js').then(async m => {
|
|
309
312
|
m.cleanupToolActivity();
|
|
310
313
|
if (!skipReload) {
|
|
@@ -316,7 +319,8 @@ export function connect(): void {
|
|
|
316
319
|
}
|
|
317
320
|
}
|
|
318
321
|
refreshRuntimeSnapshot({ hydrateRun: true })
|
|
319
|
-
.catch(() => { /* snapshot not critical — UI recovers on next WS event */ })
|
|
322
|
+
.catch(() => { /* snapshot not critical — UI recovers on next WS event */ })
|
|
323
|
+
.finally(() => reconcileChatBottomAfterLayout(shouldFollowBottom));
|
|
320
324
|
});
|
|
321
325
|
};
|
|
322
326
|
state.ws.onclose = () => {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./api-DygAf_G_.js";var t={claude:{label:`Claude`,efforts:[`low`,`medium`,`high`,`xhigh`,`max`],models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`]},codex:{label:`Codex`,efforts:[`low`,`medium`,`high`,`xhigh`],models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.3-codex`,`gpt-5.3-codex-spark`,`gpt-5.2-codex`,`gpt-5.1-codex-max`,`gpt-5.1-codex-mini`]},gemini:{label:`Gemini`,efforts:[],models:[`gemini-3.0-pro-preview`,`gemini-3.1-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`,`gemini-2.5-flash`]},opencode:{label:`OpenCode`,efforts:[`minimal`,`low`,`high`,`max`],models:[`anthropic/claude-opus-4-6-thinking`,`anthropic/claude-sonnet-4-6-thinking`,`anthropic/claude-sonnet-4-6`,`openai/gpt-5.4-xhigh`,`openai/gpt-5.4-high`,`openai/gpt-5.3-codex-xhigh`,`openai/gpt-5.3-codex-high`,`opencode/big-pickle`,`opencode-go/glm-5`,`opencode-go/glm-5.1`,`opencode-go/kimi-k2.5`,`opencode-go/kimi-k2.6`,`opencode-go/mimo-v2-pro`,`opencode-go/mimo-v2-omni`,`opencode-go/minimax-m2.5`,`opencode-go/minimax-m2.7`,`opencode/GLM-5 Free`,`opencode/MiniMax M2.5 Free`,`opencode/Kimi K2.5 Free`,`opencode/GPT 5 Nano Free`,`opencode/Grok Code Fast 1 Free`]},copilot:{label:`Copilot`,efforts:[`low`,`medium`,`high`],effortNote:`-> ~/.copilot/config.json`,models:[`gpt-5.5`,`claude-sonnet-4.6`,`claude-haiku-4.5`,`gpt-5.4`,`gpt-5.3-codex`,`gpt-5.2-codex`,`gpt-5.1-codex`,`gpt-4.1`,`gpt-5-mini`,`gemini-3-pro-preview`]}};function n(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r?.models)?[...r.models]:[];return t}function r(e){let t={};for(let[n,r]of Object.entries(e||{})){if(!r||typeof r!=`object`)continue;let e=r,i={label:e.label||n,efforts:Array.isArray(e.efforts)?[...e.efforts]:[],models:Array.isArray(e.models)?[...e.models]:[]};typeof e.effortNote==`string`&&e.effortNote.trim()&&(i.effortNote=e.effortNote),t[n]=i}return t}var i=r(t),a=Object.keys(i),o=n(i);function s(e){let t=r(e);return Object.keys(t).length?(i=t,a=Object.keys(t),o=n(t),!0):!1}async function c(){try{let t=await e(`/api/cli-registry`);if(!t||!s(t))throw Error(`invalid registry`)}catch(e){console.warn(`[cli-registry] fallback:`,e.message),s(t)}return i}function l(){return a}function u(e){return i[e]||null}var d=[{value:`frontend`,labelKey:`role.label.frontend`,label:`Frontend`,prompt:`Frontend employee — UI/UX, CSS, components`,skill:`dev-frontend`},{value:`backend`,labelKey:`role.label.backend`,label:`Backend`,prompt:`Backend employee — API, DB, server logic`,skill:`dev-backend`},{value:`data`,labelKey:`role.label.data`,label:`Data`,prompt:`Data employee — data pipeline, analysis, ML`,skill:`dev-data`},{value:`docs`,labelKey:`role.label.docs`,label:`Docs`,prompt:`Docs employee — documentation, README, API docs`,skill:`documentation`},{value:`custom`,labelKey:`role.label.custom`,label:`Custom...`,prompt:``,skill:null}];export{c as a,u as i,d as n,l as r,o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./memory-jVeY3J9Z.js";export{e as refreshMemorySidebar};
|
|
@@ -1,30 +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-UktBx7L0.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,Y as De,_ as Oe,a as ke,b as Ae,c as je,d as Me,f as Ne,g as Pe,h as Fe,i as Ie,j as Le,k as Re,l as ze,m as Be,n as Ve,o as He,p as Ue,q as We,r as Ge,s as Ke,t as qe,u as Je,v as Ye,w as Xe,x as Ze,y as Qe,z as $e}from"./vendor-icons-C6LXvgi0.js";var y=`ko`,b={},x={};async function et(){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`}x=await S(`ko`),b=e===`ko`?x:await S(e),y=e,w()}async function S(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 C(e,t={}){let n=b[e]??x[e]??e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{${e}}`,String(r));return n}function w(){document.querySelectorAll(`[data-i18n]`).forEach(e=>{let t=e.getAttribute(`data-i18n`);t&&(e.textContent=C(t))}),document.querySelectorAll(`[data-i18n-placeholder]`).forEach(e=>{let t=e.getAttribute(`data-i18n-placeholder`);t&&(e.placeholder=C(t))}),document.querySelectorAll(`[data-i18n-title]`).forEach(e=>{let t=e.getAttribute(`data-i18n-title`);t&&(e.title=C(t))}),document.querySelectorAll(`[data-i18n-aria]`).forEach(e=>{let t=e.getAttribute(`data-i18n-aria`);t&&e.setAttribute(`aria-label`,C(t))})}async function tt(e){if(e!==y){b=e===`ko`?x:await S(e),y=e;try{localStorage.setItem(`claw_locale`,e)}catch{}w();try{let{loadEmployees:e}=await v(async()=>{let{loadEmployees:e}=await import(`./employees-CpgcoYx1.js`);return{loadEmployees:e}},[]);e()}catch{}try{let{loadSkills:e}=await v(async()=>{let{loadSkills:e}=await import(`./skills-BsXI_IT2.js`);return{loadSkills:e}},[]);e()}catch{}try{let{loadCommands:e}=await v(async()=>{let{loadCommands:e}=await import(`./slash-commands-DTi0pAMr.js`);return{loadCommands:e}},[]);e()}catch{}try{let{loadSettings:e}=await v(async()=>{let{loadSettings:e}=await import(`./settings-DidDB9Rr.js`);return{loadSettings:e}},[]);e()}catch{}}}function nt(){return y}function rt(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has(`locale`)||n.searchParams.set(`locale`,y),fetch(n.toString(),t)}var it=`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12c0 0 2-4 6-4 1 0 2 .5 3 1l3-6c0 0 1 5 3 7 1.5 1.5 5 2 5 2s-1 4-5 4c-1 0-2-.3-3-.8L12 18c0 0-2-1-4-1-4 0-6-5-6-5z"/><circle cx="17" cy="11" r="0.5" fill="currentColor" stroke="none"/><path d="M7 12l1 2"/><path d="M9.5 12l1 2"/></svg>`,T=14,at=16;function E(e,t=at){return De(e,{size:t})}var D={check:E($e),error:E(ge),warning:E(Ie),skip:E(Ke),tool:E(Ge),thinking:E(Ae),search:E(Je),web:E(ae),exec:E(qe),compacting:E(Oe),plan:E(Ye),brain:E(de),heartPulse:E(ye),lock:E(Ze),lockOpen:E(Se),key:E(Ce),settings:E(je),file:E(ve),trash:E(ke),lightbulb:E(Xe),refresh:E(Ne),mic:E(Qe),clipboard:E(pe),robot:E(he),palette:E(Pe),link:E(se),salute:E(Re),shark:it,user:E(xe),paperclip:E(Fe),save:E(Me),gamepad:E(Le),house:E(le),radio:E(Ue),folder:E(_e),pencil:E(Be),chart:E(Ee),hourglass:E(ce),stop:E(He),close:E(Ve,T),send:E(ze),copy:E(ue,T),download:E(be,T),checkSimple:E(we,T),chevronLeft:E(Te,T),chevronRight:E(oe,T),chevronDown:E(fe,T),arrowLeft:E(me,T),arrowRight:E(We,T)},ot={"✅":`check`,"❌":`error`,"🔧":`tool`,"⏭":`skip`,"🧠":`brain`,"💓":`heartPulse`,"🔒":`lock`,"🔓":`lockOpen`,"🔑":`key`,"⚙":`settings`,"⚙️":`settings`,"📄":`file`,"🗑":`trash`,"🗑️":`trash`,"⚠":`warning`,"⚠️":`warning`,"💡":`lightbulb`,"🦈":`shark`,"👤":`user`,"💭":`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 st(e){let t=ot[e];return t?D[t]:e}function ct(e){return e===`✅`?`done`:e===`❌`?`error`:null}function lt(e=document.body){let t=e.querySelectorAll(`[data-icon]`);for(let e of t){let t=e.dataset.icon;t&&D[t]&&(e.innerHTML=D[t],e.classList.add(`icon-hydrated`))}}function ut(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 O=0;function dt(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-${O++}\x00`;return t.set(n,e),n}),fences:t}}function ft(e,t){for(let[n,r]of t)e=e.replace(n,()=>r);return e}function pt(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=O++,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=O++;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 k=null,A=Promise.resolve();function mt(){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 j(){return k||(k=await v(()=>import(`./mermaid.core-CoRN09Dx.js`),[]),k.default.setParseErrorHandler(()=>{})),k.default}function ht(){k.default.initialize({startOnLoad:!1,theme:`base`,htmlLabels:!1,themeVariables:mt(),securityLevel:`strict`,suppressErrorRendering:!0})}function M(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 N(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function P(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`,`data-mermaid-code-raw`]})}var gt=`http://www.w3.org/2000/svg`,_t=new Set([`a`,`area`,`link`]);_.addHook(`afterSanitizeAttributes`,e=>{let t=e.tagName.toLowerCase();if(e.namespaceURI===gt||!_t.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 vt=/["'](?:subtasks|employee_config|agent_phases|orchestration_plan)["']\s*:/;function F(e){let t=e.replace(/```json\n([\s\S]*?)\n```/g,(e,t)=>vt.test(t)?``:e);return t=t.replace(/\{[^{}]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,``).trim(),t}function yt(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 bt(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">${N(i.tex)}</div>`:`<code class="math-placeholder">${N(i.tex)}</code>`;try{return te.renderToString(i.tex,{displayMode:i.displayMode,throwOnError:!1})}catch{return i.displayMode?`<pre><code>${N(i.tex)}</code></pre>`:`<code>${N(i.tex)}</code>`}})}var I=0;async function xt(){let e=document.querySelectorAll(`.mermaid-rendered`);if(!e.length)return;let t=await j();for(let n of e){let e=n.dataset.mermaidCode;if(!e)continue;let r=`mermaid-${++I}`;try{ht();let{svg:i}=await t.render(r,e);n.innerHTML=M(i),R(n)}catch{}}}var L=null;function St(){L||=new IntersectionObserver(e=>{for(let t of e){if(!t.isIntersecting)continue;let e=t.target;e.classList.contains(`mermaid-pending`)&&(L.unobserve(e),z(e))}},{rootMargin:`200px`})}function R(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=D.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=D.copy,e.appendChild(n)}function Ct(e,t,n){e.classList.remove(`mermaid-rendered`),e.innerHTML=`
|
|
2
|
-
<div class="mermaid-error">
|
|
3
|
-
<div class="mermaid-error-title">${D.warning} ${N(C(`mermaid.renderFail`)||`Mermaid render failed`)}</div>
|
|
4
|
-
<div class="mermaid-error-msg">${N(n.slice(0,200))}</div>
|
|
5
|
-
<pre class="mermaid-error-code"><code>${N(t)}</code></pre>
|
|
6
|
-
</div>`}async function wt(e){if(!e.isConnected){delete e.dataset.mermaidQueued;return}e.classList.remove(`mermaid-pending`);let t=e.dataset.mermaidCodeRaw||``,n=t?decodeURIComponent(t):e.textContent||``;e.dataset.mermaidCode=n;let r=`mermaid-${++I}`;try{let t=await j();ht();let{svg:i}=await t.render(r,n);if(!e.isConnected){delete e.dataset.mermaidQueued;return}e.innerHTML=M(i),e.classList.add(`mermaid-rendered`),R(e)}catch(t){Ct(e,n,t?.message||t?.str||`Unknown error`)}}function z(e){e.dataset.mermaidQueued!==`1`&&(e.dataset.mermaidQueued=`1`,A=A.then(()=>wt(e)).catch(e=>{console.error(`[mermaid:queue] render failed, keeping queue alive:`,e)}))}async function B(e,t={}){let n=(e||document).querySelectorAll(`.mermaid-pending`);if(n.length){St();for(let e of n)if(e.dataset.mermaidQueued!==`1`){if(t.immediate){let t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight;if(t.bottom>=-200&&t.top<=n+200){L.unobserve(e),z(e);continue}}L.observe(e)}}}function Tt(){if(k)return;let e=()=>{j().catch(()=>{})};typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:2e3}):setTimeout(e,500)}var V=!1;function Et(){if(V)return!0;let e=new a;return e.code=function({text:e,lang:t}){if(t===`mermaid`)return`<div class="mermaid-container mermaid-pending" data-mermaid-code-raw="${encodeURIComponent(e)}" role="status" aria-label="Diagram loading">
|
|
7
|
-
<div class="mermaid-skeleton">
|
|
8
|
-
<div class="mermaid-skeleton-spinner"></div>
|
|
9
|
-
<div class="mermaid-skeleton-text">Rendering diagram…</div>
|
|
10
|
-
</div>
|
|
11
|
-
</div>`;if(t?.trim().toLowerCase()===`diagram-html`)return`<div class="diagram-widget-pending" data-diagram-html="${btoa(unescape(encodeURIComponent(e)))}"
|
|
12
|
-
role="status" aria-label="Interactive widget loading">
|
|
13
|
-
<div class="diagram-spinner"></div>
|
|
14
|
-
</div>`;let n=N(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?N(t):``,i=C(`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="${N(i)}">${N(i)}</button></div><pre><code class="hljs${t?` language-${N(t)}`:``}">${n}</code></pre></div>`},i.setOptions({renderer:e,gfm:!0,breaks:!1}),V=!0,!0}function Dt(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 H=/(?:~\/[^\s)`\]"'<>]+|\/(?:Users|home|tmp|var|opt|private)\/[^\s)`\]"'<>]+)/g,Ot=/[.,!?:;]+$/,kt=/^(?:~\/|\/(?:Users|home|tmp|var|opt|private)\/)/;function At(e){return kt.test(e)}function U(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 W(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||``;H.lastIndex=0;let t,n=[];for(;t=H.exec(e);){let e=t[0],r=e.replace(Ot,``);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 G=!1;function jt(){G||(G=!0,document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`a`),r=n?.getAttribute(`href`)||``;if(n&&At(r)){e.preventDefault(),n.classList.add(`file-path-link`),U(r,n);return}let i=t?.closest(`.file-path-link`);if(!i)return;let a=i.getAttribute(`data-file-path`);a&&U(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 K=!1;function Mt(){K||(K=!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=C(`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=C(`code.copied`),r.classList.add(`copied`),setTimeout(()=>{r.textContent=e,r.classList.remove(`copied`)},1500)}).catch(()=>{})}))}var q=!1;function Nt(){q||(q=!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&&J(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&&J(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`},`*`),J(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 J(e,t,n){let r=()=>{let t=e.innerHTML;e.innerHTML=D.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 Y(e,t){let n=e.children,r=t.children,i=[`fill`,`stroke`,`stroke-width`,`color`,`opacity`,`rx`,`ry`,`font-size`,`font-weight`,`font-family`,`text-anchor`,`dominant-baseline`];for(let e=0;e<n.length;e++){let t=n[e],a=r[e];if(!t||!a)continue;let o=getComputedStyle(t);for(let e of i){let t=o.getPropertyValue(e);t&&a.style.setProperty(e,t)}t.children.length&&Y(t,a)}}function X(e,t){let n=e.cloneNode(!0);Y(e,n);let 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`),J(t,``,`save`))},`image/png`)},o.onerror=()=>{Z(new Blob([i],{type:`image/svg+xml;charset=utf-8`}),`diagram-${Date.now()}.svg`),J(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 Pt(e){return e.kind===`partial`?`<div class="diagram-container diagram-loading" role="status"
|
|
15
|
-
aria-label="Diagram loading"><div class="diagram-spinner"></div></div>`:e.kind===`error`?`<div class="diagram-container diagram-error" role="alert">
|
|
16
|
-
Malformed SVG: unclosed element</div>`:`<div class="diagram-container diagram-svg" tabindex="0"
|
|
17
|
-
role="figure" aria-label="SVG diagram">
|
|
18
|
-
${P(e.svg)}
|
|
19
|
-
<button class="diagram-save-btn" type="button"
|
|
20
|
-
aria-label="Save as image" title="Save">${D.download}</button>
|
|
21
|
-
<button class="diagram-copy-btn" type="button"
|
|
22
|
-
aria-label="Copy source" title="Copy">${D.copy}</button>
|
|
23
|
-
<button class="diagram-zoom-btn" type="button"
|
|
24
|
-
aria-label="Expand diagram" title="Expand">⤢</button>
|
|
25
|
-
</div>`}function Ft(e,t){for(let n of t){let t=`<div\\b[^>]*?\\bdata-jaw-svg="${n.id}"[^>]*></div>`,r=new RegExp(t,`g`),i=Pt(n);e=e.replace(r,()=>i)}return e}function It(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()),Lt(n.innerHTML)}))})}function Lt(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=`
|
|
26
|
-
<div class="diagram-overlay-content">${P(e)}</div>
|
|
27
|
-
<button class="diagram-overlay-close" type="button" aria-label="Close">✕</button>
|
|
28
|
-
`,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 Rt(e,t=!1){let n=F(e);if(!n)return`<em class="text-dim orchestrate-placeholder">${N(C(`orchestrator.dispatching`))}</em>`;let{text:r,fences:a}=dt(n.replace(/\n{3,}/g,`
|
|
29
|
-
|
|
30
|
-
`)),{text:o,blocks:s}=pt(r,t),{text:c,blocks:l}=yt(ft(o,a));Et();let u=ut(c),d=i.parse(u);return d=d.replace(/<table/g,`<div class="table-wrapper"><table`).replace(/<\/table>/g,`</table></div>`),d=bt(d,l,t),d=P(d),d=Ft(d,s),t||zt(),Mt(),Nt(),jt(),d}var Q=null,$=null;function zt(){$&&clearTimeout($),Q&&=(cancelAnimationFrame(Q),null),$=setTimeout(()=>{$=null,Q=requestAnimationFrame(()=>{Q=null,B(),Dt(),It();let e=document.getElementById(`chatMessages`);e&&W(e)})},100)}function Bt(){$&&=(clearTimeout($),null),Q&&=(cancelAnimationFrame(Q),null)}export{C as _,Rt as a,F as c,ct as d,lt as f,tt as g,et as h,Tt as i,D as l,nt as m,N as n,B as o,rt as p,W as r,xt as s,Bt as t,st as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as e,m as t,v as n}from"./settings-DN37FmEm.js";export{t as loadSettings,n as savePerCli,e as updateSettings};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./skills-C-Hd0Khs.js";export{e as loadSkills};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./slash-commands-DKD_PVHP.js";export{e as loadCommands};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,g as t,u as n}from"./ui-N2Up5Bik.js";export{e as cleanupToolActivity,n as loadMessages,t as updateQueueBadge};
|