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.
Files changed (58) hide show
  1. package/dist/bin/cli-jaw.js +11 -0
  2. package/dist/bin/cli-jaw.js.map +1 -1
  3. package/dist/bin/star-prompt.js +96 -0
  4. package/dist/bin/star-prompt.js.map +1 -0
  5. package/dist/src/agent/args.js +0 -4
  6. package/dist/src/agent/args.js.map +1 -1
  7. package/dist/src/agent/events.js +328 -54
  8. package/dist/src/agent/events.js.map +1 -1
  9. package/dist/src/agent/spawn.js +9 -6
  10. package/dist/src/agent/spawn.js.map +1 -1
  11. package/dist/src/cli/command-context.js +1 -0
  12. package/dist/src/cli/command-context.js.map +1 -1
  13. package/dist/src/cli/commands.js +2 -1
  14. package/dist/src/cli/commands.js.map +1 -1
  15. package/dist/src/cli/handlers.js +20 -0
  16. package/dist/src/cli/handlers.js.map +1 -1
  17. package/dist/src/cli/registry.js +6 -19
  18. package/dist/src/cli/registry.js.map +1 -1
  19. package/dist/src/core/config.js +1 -0
  20. package/dist/src/core/config.js.map +1 -1
  21. package/package.json +1 -1
  22. package/public/css/tool-ui.css +20 -1
  23. package/public/dist/assets/constants-IeOVgtYz.js +1 -0
  24. package/public/dist/assets/{employees-CpgcoYx1.js → employees-Do9d6Xi5.js} +1 -1
  25. package/public/dist/assets/{index-DVAk6-ox.css → index-qALA03H1.css} +1 -1
  26. package/public/dist/assets/{index-DlhVtNGh.js → index-yGExjgR_.js} +4 -4
  27. package/public/dist/assets/{memory-jVeY3J9Z.js → memory-DeZSzBAb.js} +1 -1
  28. package/public/dist/assets/memory-Dpe-qPbZ.js +1 -0
  29. package/public/dist/assets/render-CQnnZ-_i.js +30 -0
  30. package/public/dist/assets/{settings-DN37FmEm.js → settings-C8bSXG3q.js} +1 -1
  31. package/public/dist/assets/settings-COrhSfDh.js +1 -0
  32. package/public/dist/assets/skills-BO0V4aHG.js +1 -0
  33. package/public/dist/assets/{skills-C-Hd0Khs.js → skills-Ci5t_dsV.js} +1 -1
  34. package/public/dist/assets/{slash-commands-DKD_PVHP.js → slash-commands-0RvnZU9z.js} +1 -1
  35. package/public/dist/assets/slash-commands-DbUvFtCk.js +1 -0
  36. package/public/dist/assets/ui-Cxk1_e0b.js +1 -0
  37. package/public/dist/assets/ui-IWxpAzJ7.js +131 -0
  38. package/public/dist/assets/vendor-icons-Bs4t7RP2.js +1 -0
  39. package/public/dist/assets/ws-FsYmCE65.js +14 -0
  40. package/public/dist/index.html +2 -2
  41. package/public/js/constants.ts +5 -18
  42. package/public/js/features/process-block.ts +10 -1
  43. package/public/js/features/settings-types.ts +1 -1
  44. package/public/js/features/tool-ui.ts +2 -0
  45. package/public/js/icons.ts +15 -0
  46. package/public/js/ui.ts +80 -18
  47. package/public/js/virtual-scroll.ts +38 -8
  48. package/public/js/ws.ts +7 -3
  49. package/public/dist/assets/constants-2eOyiA6N.js +0 -1
  50. package/public/dist/assets/memory-CnXTT6wp.js +0 -1
  51. package/public/dist/assets/render-CtsdCdtV.js +0 -30
  52. package/public/dist/assets/settings-DidDB9Rr.js +0 -1
  53. package/public/dist/assets/skills-BsXI_IT2.js +0 -1
  54. package/public/dist/assets/slash-commands-DTi0pAMr.js +0 -1
  55. package/public/dist/assets/ui-BUkXAGyS.js +0 -1
  56. package/public/dist/assets/ui-N2Up5Bik.js +0 -130
  57. package/public/dist/assets/vendor-icons-C6LXvgi0.js +0 -1
  58. package/public/dist/assets/ws-Dgn9Mqgb.js +0 -14
@@ -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 || 'tool',
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
- // Replace entire step when incoming has detail the running step lacks
177
- if (step.detail && !match.detail) {
178
- step.icon = emojiToIcon(step.icon);
179
- replaceStep(state.currentProcessBlock, match.id, { ...step, id: match.id });
180
- } else {
181
- updateStepStatus(state.currentProcessBlock, match.id, resolvedStatus);
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
- // No matching running step — try any running step as fallback
187
- const anyRunning = [...state.currentProcessBlock.steps].reverse()
188
- .find(s => s.status === 'running');
189
- if (anyRunning) {
190
- if (step.detail && !anyRunning.detail) {
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, anyRunning.id, { ...step, id: anyRunning.id });
193
- } else {
194
- updateStepStatus(state.currentProcessBlock, anyRunning.id, resolvedStatus);
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
- // Single source: DOM scrollTop only.
172
- // tanstack picks up the new position via its scroll event listener
173
- // (1 frame delay — fine for ongoing streaming/chat).
174
- // This also reaches streaming placeholder content that lives
175
- // outside VS as a direct container child.
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 || !this.virtualizer) return;
279
- scheduleInvalidateLayout();
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' : 'tool';
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}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};