cli-jaw 2.2.5 → 2.2.6
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/commands/hooks.js +14 -1
- package/dist/bin/commands/hooks.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +13 -0
- package/dist/src/agent/agy-runtime.js.map +1 -1
- package/dist/src/agent/agy-transcript-watcher.js +15 -1
- package/dist/src/agent/agy-transcript-watcher.js.map +1 -1
- package/dist/src/agent/agy-transcript.js +6 -0
- package/dist/src/agent/agy-transcript.js.map +1 -1
- package/dist/src/agent/cursor-runtime.js +17 -10
- package/dist/src/agent/cursor-runtime.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +15 -1
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/pi-runtime.js +1 -1
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +35 -0
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn.js +71 -17
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/claude-models.js +4 -2
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/registry.js +11 -5
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/code-mode/model-options.js +4 -4
- package/dist/src/code-mode/model-options.js.map +1 -1
- package/dist/src/core/config.js +21 -2
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +8 -1
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +2 -1
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/policy-flags.js +76 -0
- package/dist/src/core/policy-flags.js.map +1 -0
- package/dist/src/core/policy-hooks.js +99 -0
- package/dist/src/core/policy-hooks.js.map +1 -0
- package/dist/src/discord/bot.js +3 -1
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/forwarder.js +26 -1
- package/dist/src/discord/forwarder.js.map +1 -1
- package/dist/src/memory/heartbeat-report.js +37 -0
- package/dist/src/memory/heartbeat-report.js.map +1 -0
- package/dist/src/memory/heartbeat.js +93 -15
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/messaging/extract-images.js +36 -0
- package/dist/src/messaging/extract-images.js.map +1 -0
- package/dist/src/messaging/send.js +4 -0
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +9 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/prompt/templates/control-system.md +10 -4
- package/dist/src/routes/heartbeat.js +37 -2
- package/dist/src/routes/heartbeat.js.map +1 -1
- package/dist/src/routes/static.js +60 -2
- package/dist/src/routes/static.js.map +1 -1
- package/dist/src/telegram/bot.js +9 -3
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/forwarder.js +63 -14
- package/dist/src/telegram/forwarder.js.map +1 -1
- package/package.json +1 -1
- package/public/css/chat.css +26 -1
- package/public/dist/assets/{Agent-CrLn42Jb.js → Agent-CFL9DQ4E.js} +1 -1
- package/public/dist/assets/{Heartbeat-Dk-_TtKV.js → Heartbeat-CyHHQW1b.js} +1 -1
- package/public/dist/assets/{Memory-BOicOlcn.js → Memory-C1a0JE5p.js} +1 -1
- package/public/dist/assets/{ModelProvider-DQ2AA0gJ.js → ModelProvider-D7hZbklc.js} +1 -1
- package/public/dist/assets/agent-meta-DMCjCJQX.js +1 -0
- package/public/dist/assets/{app-BJVZZqTm.js → app-C3-AnizF.js} +4 -4
- package/public/dist/assets/app-Nu2VPaO5.css +1 -0
- package/public/dist/assets/{bgtask-badge-Bz8_kUKd.js → bgtask-badge-0mUWMNfr.js} +1 -1
- package/public/dist/assets/bgtask-badge-Wu4srpYm.js +1 -0
- package/public/dist/assets/constants-BlggFGWl.js +1 -0
- package/public/dist/assets/{employees-BYebrTfH.js → employees-CiDBVvox.js} +1 -1
- package/public/dist/assets/iframe-renderer-B_pElzJm.js +1 -0
- package/public/dist/assets/{iframe-renderer-DACMLTYf.js → iframe-renderer-Coe3pdG-.js} +2 -2
- package/public/dist/assets/{manager-pcvo6od1.js → manager-DGbe14am.js} +1 -1
- package/public/dist/assets/memory-BuRk_KpT.js +1 -0
- package/public/dist/assets/{memory-DLD5Xpk8.js → memory-DlttSUGL.js} +1 -1
- package/public/dist/assets/message-history-CcgoxNii.js +1 -0
- package/public/dist/assets/{message-history-DdIshS4Q.js → message-history-Z3VCjoSI.js} +1 -1
- package/public/dist/assets/render-BVjRYi0-.js +122 -0
- package/public/dist/assets/settings-BSJt5rk5.js +1 -0
- package/public/dist/assets/{settings-DYIfnpYq.js → settings-DTQ7d6hb.js} +1 -1
- package/public/dist/assets/settings-core-B0_d5ZvH.js +1 -0
- package/public/dist/assets/{settings-core-DRYE_5Wb.js → settings-core-Cy6lW9S8.js} +1 -1
- package/public/dist/assets/{sidebar-Cn-KLQ0U.js → sidebar-W5DFwl9M.js} +3 -3
- package/public/dist/assets/skills-BBRF65cl.js +1 -0
- package/public/dist/assets/{skills-Brt3opa5.js → skills-DJm-YVJG.js} +1 -1
- package/public/dist/assets/slash-commands-BAELQN6G.js +1 -0
- package/public/dist/assets/{slash-commands-jMNf0b43.js → slash-commands-BHrKvHqX.js} +1 -1
- package/public/dist/assets/{trace-drawer-Dv5cDGLR.js → trace-drawer-ZVSxXjO7.js} +1 -1
- package/public/dist/assets/{ui-BeyzLs7f.js → ui-BSD17U37.js} +1 -1
- package/public/dist/assets/ui-DkoZK29A.js +1 -0
- package/public/dist/index.html +2 -2
- package/public/dist/manager/index.html +1 -1
- package/public/js/constants.ts +18 -11
- package/public/js/render/delegations.ts +25 -0
- package/public/js/render/markdown.ts +10 -5
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +16 -12
- package/public/dist/assets/agent-meta-tiPlp7OI.js +0 -1
- package/public/dist/assets/app-CvNmD8jx.css +0 -1
- package/public/dist/assets/bgtask-badge-iOk9R0RF.js +0 -1
- package/public/dist/assets/constants-DzwdndBj.js +0 -1
- package/public/dist/assets/iframe-renderer-Clu9EYLW.js +0 -1
- package/public/dist/assets/memory-oWWwCkg5.js +0 -1
- package/public/dist/assets/message-history-C6D4juRe.js +0 -1
- package/public/dist/assets/render-E2PXsTyS.js +0 -122
- package/public/dist/assets/settings-core-BURhLoX3.js +0 -1
- package/public/dist/assets/settings-yyDc7X3c.js +0 -1
- package/public/dist/assets/skills-KHfKUuAJ.js +0 -1
- package/public/dist/assets/slash-commands-nb096e6A.js +0 -1
- package/public/dist/assets/ui-DabvyDGc.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./memory-DlttSUGL.js";export{e as refreshMemorySidebar};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as e,n as t}from"./api-tVoG39dL.js";import{T as n,b as r,j as i,x as a}from"./render-
|
|
1
|
+
import{i as e,n as t}from"./api-tVoG39dL.js";import{T as n,b as r,j as i,x as a}from"./render-BVjRYi0-.js";import{r as o}from"./locale-DC-ZsWOf.js";function s(e){return document.getElementById(e)}function c(e,t){let n=s(e);n&&(n.textContent=t==null?``:String(t))}function l(e,t){let n=s(e);n&&(n.value=t==null?``:String(t))}function u(e,t){let r=s(`memorySidebarBtn`);if(!r)return;if(e?.enabled&&e?.hasSoul===!1){r.innerHTML=`${a.brain} Memory · <span style="color:var(--accent)">${o(`updateNeeded`)}</span>`;return}if(e?.enabled&&e?.hasSoul&&!e?.soulSynthesized){r.innerHTML=`${a.brain} Memory · <span style="color:var(--accent)">${i(`memory.banner.soulOptimize`)}</span>`;return}let c=e?.indexState===`ready`?`Ready`:e?.state===`not_initialized`?`Indexing`:e?.state||`(${t})`;r.innerHTML=`${a.brain} Memory · ${n(c)}`}function d(e){let t=s(`advStatusBanner`);if(t){if(!e?.enabled){t.style.display=`none`,t.textContent=``;return}if(t.style.display=``,e.hasSoul===!1){t.innerHTML=`<span>Memory structure upgrade available.</span>
|
|
2
2
|
<button id="advUpgradeSoulBtn" class="btn-sm" style="margin-left:8px">${o(`memoryUpdateBtn`)}</button>`;return}if(e.hasSoul&&!e.soulSynthesized){t.innerHTML=`<span>Soul identity can be personalized with your active CLI.</span>
|
|
3
3
|
<button id="advSynthesizeSoulBtn" class="btn-sm" style="margin-left:8px">${i(`memory.banner.soulOptimize`)}</button>`;return}if(e.state===`not_initialized`){t.textContent=`Integrated memory is preparing its index. Temporary fallback memory context is active until initialization completes.`;return}if(e.indexState===`not_indexed`){t.textContent=`Integrated memory is configured. Indexed search/read will activate after indexing becomes available.`;return}t.textContent=`Memory active. search/read=${e.routing?.searchRead||`basic`} / save=${e.routing?.save||`basic`}`}}function f(e,t=!0){let n=s(`advStatusBanner`);n&&(n.style.display=t?``:`none`,n.textContent=e)}function p(e){for(let t of[`advBootstrapBtn`,`advReindexBtn`,`advReimportBtn`,`advOpenCorruptedBtn`]){let n=s(t);n&&(n.disabled=e)}}function m(e){s(`memOn`)?.classList.toggle(`active`,e.enabled),s(`memOff`)?.classList.toggle(`active`,!e.enabled),l(`memFlushEvery`,e.flushEvery),l(`memRetention`,e.retentionDays),l(`memFlushLang`,e.flushLanguage||`en`),c(`memPath`,e.path),c(`memCounter`,e.counter),c(`memThreshold`,e.flushEvery)}function h(e){let t=s(`memTabBtnSettings`),n=s(`memTabSettings`);!t||!n||(t.style.display=``,n.style.display||(n.style.display=``))}function g(e){c(`advIndexState`,e?.indexState||e?.state||`-`),c(`advStorageRoot`,e?.storageRoot||`-`),c(`advIndexedFiles`,e?.indexedFiles||0),c(`advIndexedChunks`,e?.indexedChunks||0),c(`advLastIndexedAt`,e?.lastIndexedAt||`-`),c(`advImportStatus`,e?.importStatus||`-`),c(`advCorruptedCount`,e?.corruptedCount||0),c(`advLastExpansion`,(e?.lastExpansion||[]).join(`, `)||`-`),c(`advLastError`,e?.lastError||`-`);let t=e?.importedCounts||{};c(`advImportStatus`,`${e?.importStatus||`-`} (core:${t.core||0} md:${t.markdown||0} kv:${t.kv||0} claude:${t.claude||0})`),c(`advProfileFresh`,e?.profileFresh===!1?`⚠ stale`:`✓ fresh`),c(`advLastReflectedAt`,e?.lastReflectedAt||`never`),c(`advFlushRunning`,e?.flushRunning?`running`:`idle`),c(`advMigrationLock`,e?.migrationLocked?`⚠ locked`:`none`);let n=e?.staleWarnings||[];c(`advWarnings`,n.length?n.join(`, `):`none`),c(`advSoulStatus`,e?.hasSoul?`✓ active`:`⚠ not created`)}function _(e){let t=s(`basicMemoryFiles`);if(t){if(!e?.length){t.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">No memory files yet</p>`;return}t.innerHTML=e.map(e=>`
|
|
4
4
|
<div style="display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border:1px solid var(--border);border-radius:4px;margin-bottom:4px;cursor:pointer"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,o as t}from"./message-history-Z3VCjoSI.js";export{e as historyReloadInFlight,t as loadMessages};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./state-DxpgDKMO.js";import{a as t,n,t as r}from"./api-tVoG39dL.js";import{E as i,T as a,a as o,b as s,c,i as l,j as u,l as d,o as f,r as p,s as m,t as h,u as ee,v as g,w as te,x as _}from"./render-E2PXsTyS.js";import{a as v}from"./mermaid-preprocess-0hqEN7sn.js";import{C as y,D as b,E as x,M as ne,N as S,S as C,T as re,_ as w,b as ie,d as ae,h as T,j as oe,m as E,o as se,s as ce,t as D,v as le,x as ue,y as de}from"./iframe-renderer-DACMLTYf.js";import{a as fe,i as pe,r as me,t as he}from"./idb-cache-BzzftUET.js";var ge=`agentAvatar`,_e=`userAvatar`,ve=_.shark,ye=_.user,be={agent:{emoji:ve,imageUrl:``,updatedAt:null},user:{emoji:ye,imageUrl:``,updatedAt:null}},xe=!1;function O(e){return be[e]}function Se(e){return e===`agent`?`agentAvatarPreview`:`userAvatarPreview`}function Ce(e){return e===`agent`?`.agent-icon`:`.user-icon`}function k(e){let t=document.getElementById(Se(e));if(t){t.innerHTML=A(e);let n=O(e).imageUrl?`image`:`emoji`;t.setAttribute(`data-avatar-kind`,n)}}function A(e){let t=O(e);return t.imageUrl?`<img class="avatar-image" src="${a(t.imageUrl)}" alt="" loading="lazy" decoding="async">`:t.emoji}function we(e){let t=A(e),n=O(e).imageUrl?`image`:`emoji`;document.querySelectorAll(Ce(e)).forEach(e=>{e.innerHTML=t,e.setAttribute(`data-avatar-kind`,n)})}function j(e,t){t?.kind===`image`&&t.imageUrl?(O(e).imageUrl=t.imageUrl,O(e).updatedAt=t.updatedAt??Date.now()):(O(e).imageUrl=``,O(e).updatedAt=t?.updatedAt??null),k(e),we(e)}async function Te(){let e=await n(`/api/avatar`);e&&(j(`agent`,e.agent),j(`user`,e.user))}async function Ee(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 De(e,t){let n=await Ee(`/api/avatar/${e}/upload`,{method:`POST`,headers:{"Content-Type":t.type||`image/png`,"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})`);j(e,r?.data||r)}async function Oe(e){let t=await Ee(`/api/avatar/${e}/image`,{method:`DELETE`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||`avatar reset failed (${t.status})`);j(e,n?.data||n)}function ke(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 Oe(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 De(e,r)}catch(e){console.warn(`[avatar:upload]`,e.message)}finally{n.value=``}})}function Ae(){return A(`agent`)}function je(){return A(`user`)}async function Me(){O(`agent`).emoji=localStorage.getItem(ge)||ve,O(`user`).emoji=localStorage.getItem(_e)||ye,k(`agent`),k(`user`),xe||(xe=!0,ke(`agent`),ke(`user`)),await Te(),we(`agent`),we(`user`)}function Ne(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?_.chevronDown:_.chevronRight)}),e.dataset.toolItemBound=`1`)}function Pe(){document.querySelectorAll(`.tool-activity-live`).forEach(e=>e.remove()),document.querySelectorAll(`.msg-system.tool-activity`).forEach(e=>e.remove())}function Fe(){let e=Number(window.location.port);if(Number.isFinite(e)&&e>0)return e;let t=window.location.pathname.match(/^\/i\/(\d+)/);return t?Number(t[1]):null}function Ie(e){let t=e.split(/\r?\n/).map(e=>e.trim()).find(Boolean);return t?t.length>96?`${t.slice(0,93)}...`:t:`Pinned reminder`}function Le(e){let t=e.querySelector(`.msg-content`);return t?.getAttribute(`data-raw`)||t?.innerText||t?.textContent||``}function Re(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function ze(e,t){let n=Fe(),r=e.dataset.messageId||``;return{title:Ie(t),notes:t,priority:`normal`,instanceId:e.dataset.instanceId||(n?`port:${n}`:`browser`),messageId:r,turnIndex:Re(e.dataset.turnIndex),port:n,threadKey:window.location.pathname,sourceText:t}}function Be(e){e.classList.add(`copied`),e.innerHTML=_.checkSimple,setTimeout(()=>{e.classList.remove(`copied`),e.textContent=``},600)}async function Ve(e){let t=e.closest(`.msg`);t&&(await s(Le(t))).ok&&Be(e)}async function He(e,t){let r=e.closest(`.msg`);if(!r)return;let i=Le(r).trim();if(!i){t.onStatus?.(`Cannot pin an empty message as a reminder.`);return}e.setAttribute(`aria-busy`,`true`),e.classList.add(`is-pinning`);try{let a=await n(`/api/dashboard/reminders/from-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(ze(r,i))});if(!a?.ok)throw Error(a?.error||`Reminder pin failed`);e.classList.add(`is-pinned`),t.onStatus?.(`Pinned reminder: ${a.item?.title||Ie(i)}`)}catch(e){t.onStatus?.(`Reminder pin failed: ${e.message}`)}finally{e.classList.remove(`is-pinning`),e.removeAttribute(`aria-busy`)}}function Ue(e){let t=e.closest(`.tool-group-summary`);if(!t)return!1;let n=t.closest(`.tool-group`),r=t.nextElementSibling;if(n&&r){let e=!n.classList.contains(`expanded`);n.classList.toggle(`expanded`),r.classList.toggle(`collapsed`),t.setAttribute(`aria-expanded`,e?`true`:`false`)}return!0}function We(e){let t=[`data-message-role="${a(e.role)}"`,`data-message-id="${a(e.messageId)}"`];if(e.turnIndex!==null&&t.push(`data-turn-index="${e.turnIndex}"`),typeof window<`u`){let e=Fe();e&&t.push(`data-instance-id="port:${e}"`)}return t.join(` `)}function Ge(){return`<div class="msg-actions"><button class="msg-pin-reminder" type="button" title="Pin as reminder" aria-label="Pin as reminder"></button><button class="msg-copy" type="button" title="Copy" aria-label="Copy message"></button></div>`}function Ke(e={}){let t=document.getElementById(`chatMessages`);t&&(de(t),Ne(t),t.addEventListener(`click`,t=>{let n=t.target;if(Ue(n))return;let r=n.closest(`.msg-copy`);if(r){Ve(r).catch(t=>{e.onStatus?.(`Copy failed: ${t.message}`)});return}let i=n.closest(`.msg-pin-reminder`);i&&He(i,e)}))}var qe=`agentName`,M=`CLI-JAW`,N=M;function Je(){return N}function Ye(e){N=(e||``).trim()||M,localStorage.setItem(qe,N);let t=document.getElementById(`appNameInput`);t&&(t.value=N)}function Xe(){N=localStorage.getItem(qe)||M;let e=document.getElementById(`appNameInput`);e&&(e.value=N),document.getElementById(`appNameSave`)?.addEventListener(`click`,()=>{let e=document.getElementById(`appNameInput`);e&&Ye(e.value)}),document.getElementById(`appNameInput`)?.addEventListener(`keydown`,e=>{let t=e;t.key===`Enter`&&(t.preventDefault(),Ye(t.target.value),t.target.blur())})}var Ze=`:scope > .process-block, :scope > .tool-group, :scope > .msg-content > .process-block, :scope > .msg-content > .tool-group`;function P(e){return e.querySelector(`.agent-body`)}function F(e){let t=P(e);return t?Array.from(t.querySelectorAll(Ze)):[]}function Qe(e){let t=e.querySelector(`:scope > .msg-content`);return e.querySelector(`:scope > .process-block`)??e.querySelector(`:scope > .tool-group`)??t?.querySelector(`:scope > .process-block`)??t?.querySelector(`:scope > .tool-group`)??null}function I(e){let t=P(e);if(!t)return;let n=t.querySelector(`.msg-content`),r=F(e);if(r.length===0)return;let i=Qe(t)??r[0];n&&i.parentElement!==t&&t.insertBefore(i,n);for(let e of r)e!==i&&(b(e),e.remove())}function $e(e){return F(e).length>0}function et(e){return e===`thinking`||e===`search`||e===`subagent`?e:`tool`}function tt(e){return e===`done`||e===`error`?e:`running`}function nt(e){let t=e.dataset.stepId||``;if(!t)return null;let n=re(t),r=e.querySelector(`.process-step-label`)?.textContent?.trim()||``,i=e.querySelector(`.process-step-full`),a=i?.dataset.detailLazy===`true`?y(t)||n?.preview||``:i?.textContent||y(t)||n?.preview||``,o=e.querySelector(`.process-step-icon`)?.innerHTML||_.tool,s=Number(e.dataset.startTime||``);return{id:t,type:n?.type||et(e.dataset.type),icon:n?.icon||o,rawIcon:n?.rawIcon,label:n?.label||r,isEmployee:n?.isEmployee===!0||e.dataset.isEmployee===`true`,detail:a,detailPreview:n?.preview,detailLength:n?.detailLength,detailTruncated:n?.detailTruncated,stepRef:n?.stepRef||e.dataset.stepRef||``,traceRunId:n?.traceRunId||e.dataset.traceRunId||``,traceSeq:n?.traceSeq||Number(e.dataset.traceSeq||0)||void 0,detailAvailable:n?.detailAvailable,detailBytes:n?.detailBytes,rawRetentionStatus:n?.rawRetentionStatus,status:n?.status||tt(e.dataset.status),startTime:Number.isFinite(s)&&s>0?s:Date.now()}}function rt(e){let t=P(e)?.querySelector(`:scope > .process-block`);if(!t)return null;let n={element:t,steps:Array.from(t.querySelectorAll(`.process-step`)).map(nt).filter(e=>!!e),collapsed:t.classList.contains(`collapsed`)};return x(n),n}function it(e,t=!1){let n=y(e.id)||e.detail||e.detailPreview||``,r=t&&e.status===`running`?`done`:e.status;return{icon:e.rawIcon||e.icon||_.tool,rawIcon:e.rawIcon||e.icon||``,label:e.label||`tool`,isEmployee:e.isEmployee===!0,detail:n,toolType:e.type,stepRef:e.stepRef||``,status:r,traceRunId:e.traceRunId||``,traceSeq:e.traceSeq,detailAvailable:e.detailAvailable,detailBytes:e.detailBytes,rawRetentionStatus:e.rawRetentionStatus}}function at(e,t=!1){let n=re(e);if(!n)return null;let r=t&&n.status===`running`?`done`:n.status;return{icon:n.rawIcon||n.icon||_.tool,rawIcon:n.rawIcon||n.icon||``,label:n.label||`tool`,isEmployee:n.isEmployee===!0,detail:y(e)||n.preview||``,toolType:n.type,stepRef:n.stepRef||``,status:r,traceRunId:n.traceRunId||``,traceSeq:n.traceSeq,detailAvailable:n.detailAvailable,detailBytes:n.detailBytes,rawRetentionStatus:n.rawRetentionStatus}}function ot(e,t=!1){if(!e)return[];if(`steps`in e)return e.steps.map(e=>it(e,t));let n=new Set;e.querySelectorAll(`.process-block[data-process-step-ids]`).forEach(e=>{(e.dataset.processStepIds||``).split(/\s+/).filter(Boolean).forEach(e=>n.add(e))}),e.querySelectorAll(`.process-step[data-step-id]`).forEach(e=>{let t=e.dataset.stepId;t&&n.add(t)});let r=[];return n.forEach(n=>{let i=at(n,t);if(i){r.push(i);return}let a=e.querySelector(`.process-step[data-step-id="${CSS.escape(n)}"]`),o=a?nt(a):null;o&&r.push(it(o,t))}),r}function st(e){for(let t of F(e))b(t),t.remove()}function ct(e){return Ae()}function lt(){let t=document.getElementById(`chatMessages`);if(!t||t.querySelector(`.skeleton-msg`)||e.currentAgentDiv&&e.currentAgentDiv.isConnected)return;R();let n=document.createElement(`div`);n.className=`skeleton-msg`,n.innerHTML=`<div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line"></div>`,t.appendChild(n),E()}function L(){document.querySelectorAll(`.skeleton-msg`).forEach(e=>e.remove())}function R(){document.getElementById(`emptyState`)?.classList.remove(`visible`)}function z(){let e=document.getElementById(`chatMessages`);e&&e.children.length===0&&document.getElementById(`emptyState`)?.classList.add(`visible`)}function ut(e,t,n){let r=document.getElementById(`chatMessages`);if(!r)return;let i=w();R();let a=document.createElement(`div`);a.className=`msg msg-system`+(n?` msg-type-${n}`:``)+(t?` `+t:``),a.innerHTML=v(e),i.active?i.appendLiveItem(a):r.appendChild(a),E()}function dt(e){let t=e.match(/^\[(?:사용자가 파일 (\d+)개를 보냈습니다|User sent (\d+) files)\]/);if(t){let n=t[1]||t[2],r=e.match(/(?:사용자 메시지|User message): (.+)$/s);return`📎 [${n} files]${r?` `+r[1].trim():``}`}let n=e.match(/^\[(?:사용자가 파일을 보냈습니다|사용자가 이미지를 보냈습니다|사용자가 동영상을 보냈습니다|User sent a file|User sent an image|User sent a video): ([^\]]+)\]/);if(n){let t=n[1],i=t.split(`/`).pop()||t,a=e.match(/🎤\s*(.{0,80})/)?`${u(`chat.voice.label`)} `:``,o=e.match(/(?:사용자 메시지|User message): (.+)$/s),s=o?` `+o[1].trim():``,c=(i.split(`.`).pop()||``).toLowerCase(),l=`${r}/media/${encodeURIComponent(i)}`;return[`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`].includes(c)?`${a}<img src="${l}" alt="${i}" class="chat-inline-img" loading="lazy" />${s?`<br>${s}`:``}`:[`mp4`,`webm`,`mov`,`ogg`].includes(c)?`${a}<video src="${l}" controls class="chat-inline-video" preload="metadata"></video>${s?`<br>${s}`:``}`:`${a}📎 [${i}]${s}`}return e}function ft(e,t,n){let r=document.getElementById(`chatMessages`),s=w();R(),L();let d=h(e===`user`?dt(t):t),te=a(e===`user`?u(`msg.you`):Je()),_=document.createElement(`div`),v=r?r.querySelectorAll(`.msg`).length:null,y=S();_.setAttribute(`data-message-role`,e),_.setAttribute(`data-message-id`,y),v!==null&&_.setAttribute(`data-turn-index`,String(v));let b=Number(window.location.port);Number.isFinite(b)&&b>0&&_.setAttribute(`data-instance-id`,`port:${b}`);let x=Ge();e===`agent`?(_.className=`msg msg-agent`,_.innerHTML=`<div class="agent-icon" aria-hidden="true">${ct(n)}</div><div class="agent-body"><div class="msg-content">${d}</div>${x}</div>`):(_.className=`msg msg-${e}${e===`user`&&n===`goal_continuation`?` msg-goal-boundary`:``}`,_.innerHTML=`<div class="user-body"><div class="msg-label">${te}</div><div class="msg-content">${d}</div>${x}</div><div class="user-icon" aria-hidden="true">${je()}</div>`);let ne=_.querySelector(`.msg-content`);ne&&ne.setAttribute(`data-raw`,i(t));let C=e===`agent`&&!t;return s.active&&!C?(_.classList.contains(`msg-agent`)&&I(_),s.appendLiveItem(_)):(r?.appendChild(_),D(_),c(_),m(_),f(_),o(_),l(_),p(_),!s.active&&!C&&r&&r.querySelectorAll(`.msg`).length>=1&&(r.querySelectorAll(`.msg`).forEach(e=>{e.classList.contains(`msg-agent`)&&I(e),s.addItem(S(),e.outerHTML)}),s.onPostRender=e=>{D(e),c(e),m(e),f(e),o(e),l(e),p(e),ee(e),g(e,{immediate:!0})})),E(e===`user`),_}var B=3e3,pt=24e3,V=`⚠️`,H=`Tool log truncated`,mt=`Inline preview capped.`,ht=/^tr_[A-Za-z0-9_-]{16,80}$/;function U(e,t){if(e==null)return;let n=String(e);if(n)return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}…`}function gt(e,t){return`[detail truncated: kept ${e} of ${t} chars]`}function W(e){return{icon:V,label:U(e>0?`${e} tool event${e===1?``:`s`} omitted`:H,240)||H,toolType:`tool`,status:`done`,detail:mt}}function _t(e){if(!e||typeof e!=`object`)return 0;let t=e;if(t.icon!==V)return 0;let n=String(t.label??``);if(n===H)return 1;let r=/^(\d+) tool events? omitted$/.exec(n);return r?Number(r[1]):0}function G(e,t){let n=Number(e);if(!(!Number.isFinite(n)||n<0))return Math.min(Math.floor(n),t)}function vt(e,t=B){let n=e.detail==null?``:String(e.detail),r=Math.max(0,Math.min(B,t)),i=U(n,r);if(i&&n.length>r){let e=gt(i.length,n.length),t=Math.max(0,r-e.length-1);i=`${n.slice(0,t)}\n${e}`}let a={icon:U(e.icon,240)||`🔧`,label:U(e.label,240)||`tool`},o=U(e.rawIcon,240),s=U(e.toolType,240),c=U(e.stepRef,240),l=U(e.status,240),u=U(e.traceRunId,96),d=G(e.traceSeq,2**53-1),f=G(e.detailBytes,2**53-1),p=U(e.rawRetentionStatus,32);return o&&(a.rawIcon=o),i&&(a.detail=i),s&&(a.toolType=s),c&&(a.stepRef=c),l&&(a.status=l),e.isEmployee===!0&&(a.isEmployee=!0),u&&ht.test(u)&&(a.traceRunId=u),d!=null&&d>0&&(a.traceSeq=d),e.detailAvailable===!0&&(a.detailAvailable=!0),f!=null&&(a.detailBytes=f),p&&(a.rawRetentionStatus=p),a}function K(e){if(!Array.isArray(e)||e.length===0)return[];let t=e,n=_t(e[0]);n>0&&(t=e.slice(1));let r=0;(n>0||t.length>160)&&(r=Math.max(0,t.length-159),r>0&&(t=t.slice(r)));let i=n+r,a=t.map(e=>e&&typeof e==`object`?e:{label:e}),o=Array(a.length).fill(0),s=pt;for(let e=a.length-1;e>=0;e--){let t=a[e].detail,n=t==null?0:String(t).length,r=Math.min(B,s);o[e]=r,s=Math.max(0,s-Math.min(n,r))}let c=a.map((e,t)=>vt(e,o[t]));return i>0&&c.unshift(W(i)),bt(c)}function yt(e){let t={icon:U(e.icon,24)||`🔧`,label:U(e.label,80)||`tool`},n=U(e.toolType,48),r=U(e.stepRef,80),i=U(e.status,24),a=U(e.detail,180),o=U(e.traceRunId,96),s=G(e.traceSeq,2**53-1),c=G(e.detailBytes,2**53-1),l=U(e.rawRetentionStatus,32);return n&&(t.toolType=n),r&&(t.stepRef=r),i&&(t.status=i),a&&(t.detail=a),e.isEmployee===!0&&(t.isEmployee=!0),o&&ht.test(o)&&(t.traceRunId=o),s!=null&&s>0&&(t.traceSeq=s),e.detailAvailable===!0&&(t.detailAvailable=!0),c!=null&&(t.detailBytes=c),l&&(t.rawRetentionStatus=l),t}function bt(e){if(JSON.stringify(e).length<=64e3)return e;let t=e.map(yt),n=JSON.stringify(t);for(;n.length>64e3&&t.length>1;){let e=_t(t[0]);t.splice(+(e>0),1);let r=W(e+1);e>0?t[0]=r:t.unshift(r),n=JSON.stringify(t)}if(n.length<=64e3)return t;let r=[{icon:V,label:H,toolType:`tool`,status:`done`,detail:mt}];return JSON.stringify(r).length<=64e3?r:[]}function xt(e){let t=K(e);if(t.length===0)return null;let n=JSON.stringify(t);return n.length<=64e3?n:JSON.stringify(bt(t))}function St(e){if(!e)return[];if(e.length>18e4)return[W(1)];try{return K(JSON.parse(e))}catch{return[]}}function Ct(e){return e===`thinking`||e===`search`||e===`subagent`?e:`tool`}function wt(e){return e===`running`||e===`done`||e===`error`?e:`done`}function Tt(e){if(e.label)return e.label;let t=e;return typeof t.name==`string`&&t.name?t.name:`tool`}function Et(e){let t=Tt(e);return e.toolType===`tool`?oe(t):t}function q(e){return St(e)}function Dt(e){return xt(q(e))}function J(e){return e.role!==`assistant`||!e.tool_log?{...e,tool_log:null}:{...e,tool_log:Dt(e.tool_log)}}function Y(e,t){let n=t&&t>0?t:Date.now();return e.map(e=>({id:S(),icon:e.icon?te(e.icon):_.tool,rawIcon:e.rawIcon||e.icon||``,label:Et(e),isEmployee:e.isEmployee===!0,type:Ct(e.toolType),detail:e.toolType===`tool`?ne(e.detail||``):e.detail||``,stepRef:e.stepRef||``,traceRunId:e.traceRunId||``,traceSeq:e.traceSeq,detailAvailable:e.detailAvailable,detailBytes:e.detailBytes,rawRetentionStatus:e.rawRetentionStatus,status:wt(e.status),startTime:n}))}function Ot(e,t){let n=String(e.stepRef||``).trim();return n?`ref:${n}`:`ord:${e.toolType||`tool`}:${e.label||`tool`}:${t}`}function kt(e,t){if(e.length===0)return t;let n=new Map,r=new Map,i=e=>{let t=`${e.toolType||`tool`}:${e.label||`tool`}`,n=(r.get(t)||0)+1;return r.set(t,n),Ot(e,n)};return t.forEach(e=>n.set(i(e),e)),r.clear(),e.forEach(e=>{let t=i(e),r=n.get(t),a=r?.detail||``,o=e.detail||``;n.set(t,{...r||{},...e,detail:o.length>=a.length?o:a,status:e.status||r?.status||`done`})}),Array.from(n.values())}function At(e){return K(e)}function jt(e){return xt(e)}function Mt(e){return Ae()}function Nt(e,t){let n=e.role===`assistant`?`agent`:e.role,r=We({role:n,messageId:String(e.id??S()),turnIndex:t}),o=i(n===`user`?dt(e.content):e.content),s=a(n===`user`?u(`msg.you`):Je()),c=e.role===`assistant`&&e.tool_log?Dt(e.tool_log):null,l=c?a(c):``,d=l?` data-tool-log="${l}"`:``,f=`<div class="msg-content lazy-pending" data-raw="${a(o)}"></div>`,p=Ge(),m=n===`user`&&e.cli===`goal_continuation`?` msg-goal-boundary`:``,h=n===`agent`?`<div class="msg msg-agent" ${r}><div class="agent-icon" aria-hidden="true">${Mt(e.cli)}</div><div class="agent-body"${d}>${f}${p}</div></div>`:`<div class="msg msg-${n}${m}" ${r}><div class="user-body"><div class="msg-label">${s}</div>${f}${p}</div><div class="user-icon" aria-hidden="true">${je()}</div></div>`;return{id:S(),html:h,height:80,rehydratesProcessDetails:!!l}}function Pt(e,t){if(t.onBeforeVirtualHistoryBootstrap?.(),t.registerCallbacks(),t.setItems(e,{autoActivate:!1}),t.shouldFollowBottom?.()??!0){t.activateIfNeeded(!0),t.scrollToBottom(),t.onAfterVirtualHistoryBottomed?.();return}let n=t.restoreIndex;n!=null&&n>=0?(t.activateIfNeeded(!1),t.scrollToIndex?.(n)):(t.activateIfNeeded(!0),t.scrollToBottom(),t.onAfterVirtualHistoryBottomed?.())}function Ft(t){let n=document.getElementById(`statusBadge`),r=document.getElementById(`btnSend`),i=document.getElementById(`typingIndicator`)?.querySelector(`.label`);e.agentBusy=t===`running`||t===`steering`,document.getElementById(`typingIndicator`)?.classList.toggle(`active`,e.agentBusy),t===`running`?(n&&(n.className=`status-badge status-running`,n.textContent=`running`),r&&(r.innerHTML=_.stop,r.title=u(`btn.stop`),r.classList.add(`stop-mode`)),i&&(i.textContent=u(`status.responding`)),lt()):t===`steering`?(n&&(n.className=`status-badge status-steering`,n.textContent=`steering`),r&&(r.innerHTML=_.stop,r.title=`Steering...`,r.classList.add(`stop-mode`)),i&&(i.textContent=`Steering...`)):(n&&(n.className=`status-badge status-idle`,n.textContent=`idle`),r&&(r.innerHTML=_.send,r.title=`Send`,r.classList.remove(`stop-mode`)),i&&(i.textContent=u(`status.responding`)),L())}function It(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 X(e){let t=document.getElementById(`statMsgs`);t&&(t.textContent=u(`stat.messages`,{count:e}))}async function Lt(){let e=await n(`/api/messages/count`);e&&X(e.count)}function Z(e){return e.map((e,t)=>Nt(J(e),t))}var Rt=3e3;function zt(){return`?limit=${Rt}`}function Q(e){return String(e||``).trim()||`unknown`}function Bt(e){let t=Q(e.origin),n=Q(e.pathname||`/`);return`${t}${n.startsWith(`/`)?n:`/${n}`}`}function Vt(e){return`${Q(e.locationKey)}::${Q(e.workingDir)}`}function Ht(){return Bt(typeof window>`u`?{}:{origin:window.location.origin,pathname:window.location.pathname})}function Ut(e){if(!e||e===`default`)return null;let t=e.indexOf(`::`);return t>=0?e.slice(t+2):e}function Wt(e){e.onLazyRender=e=>{for(let t of e){if(!t.classList.contains(`lazy-pending`))continue;let e=t.getAttribute(`data-raw`)||``,n=t.closest(`.msg-agent`),r=n?.querySelector(`.agent-body`),i=r?.dataset.toolLog||``;if(n&&r&&i&&!$e(n)){let e=q(i);e.length>0&&t.insertAdjacentHTML(`beforebegin`,ie(Y(e),!0)),delete r.dataset.toolLog,I(n)}t.innerHTML=e?h(e):``,t.classList.remove(`lazy-pending`),D(t),c(t),m(t),f(t),o(t),l(t),p(t),g(t,{immediate:!0})}},e.onPostRender=e=>{D(e),c(e),m(e),f(e),o(e),l(e),p(e),ee(e),g(e,{immediate:!0})}}function Gt(e,t={}){return{registerCallbacks:()=>Wt(e),setItems:(t,n)=>e.setItems(t,n),activateIfNeeded:t=>e.activateIfNeeded(t),scrollToBottom:()=>e.scrollToBottom(),scrollToIndex:t=>e.scrollToIndex(t),shouldFollowBottom:t.forceInitialBottom?()=>!0:se,restoreIndex:t.restoreIndex??null,onBeforeVirtualHistoryBootstrap:()=>{ce()},onAfterVirtualHistoryBottomed:()=>{ae(),T()}}}function Kt(e){e.forEach(e=>{let t=ft(e.role===`assistant`?`agent`:e.role,e.content,e.cli);if(e.role===`assistant`&&e.tool_log){let n=q(e.tool_log);if(n.length>0){let e=t.querySelector(`.agent-body`);if(e){let t=C(e);for(let e of Y(n))le(t,e);ue(t)}}}})}function qt(e){let t=e.message_id??e.id;return{...t===void 0?{}:{id:t},role:e.role,content:e.content,cli:e.cli??null,tool_log:e.tool_log??null}}var Jt=``;function Yt(e,t){let n=t.length>0?t[t.length-1]:null;return`${e}|${t.length}|${n?JSON.stringify(n):``}`}var $=null;async function Xt(){return $||($=Qt().finally(()=>{$=null}),$)}function Zt(){return $!==null}async function Qt(){let e=w(),t=document.getElementById(`chatMessages`),r=me(),i=Ht(),a=Ut(r);try{let e=await n(`/api/settings`);e?.workingDir&&(a=e.workingDir)}catch{}let o=Vt({locationKey:i,workingDir:a});fe(o);let s=o!==r,c=await n(`/api/messages${zt()}`);if(c!==null){let n=c.map(J);d(n);let r=!!t?.querySelector(`.msg`)||e.active,i=Yt(o,n);if(r&&!s&&i===Jt){X(n.length);return}Jt=i;let a=s||!r,l=!a&&e.active?e.firstVisibleIndex():null;e.clear(),t&&(t.innerHTML=``),n.length>=1?Pt(Z(n),Gt(e,{forceInitialBottom:a,restoreIndex:a?null:l})):(Kt(n),a&&T()),he(n.map(e=>({...e.id===void 0?{}:{message_id:e.id},role:e.role,content:e.content,cli:e.cli??null,tool_log:e.tool_log??null,timestamp:Date.now()}))).catch(()=>{}),X(n.length),z();return}if(t&&t.children.length>0){z();return}let l=await pe();if(l.length>0){let t=l.map(qt).map(J);d(t),t.length>=1?Pt(Z(t),Gt(e,{forceInitialBottom:!0})):(Kt(t),T()),ut(`${_.warning} ${u(`ui.offline.banner`)}`),X(t.length)}z()}export{st as C,Pe as D,Ke as E,Me as O,I as S,Xe as T,ft as _,Zt as a,rt as b,Wt as c,It as d,Nt as f,Y as g,jt as h,Z as i,Lt as l,At as m,Bt as n,Xt as o,kt as p,Vt as r,Gt as s,zt as t,Ft as u,ut as v,ot as w,$e as x,L as y};
|
|
1
|
+
import{t as e}from"./state-DxpgDKMO.js";import{a as t,n,t as r}from"./api-tVoG39dL.js";import{E as i,T as a,a as o,b as s,c,i as l,j as u,l as d,o as f,r as p,s as m,t as h,u as ee,v as g,w as te,x as _}from"./render-BVjRYi0-.js";import{a as v}from"./mermaid-preprocess-0hqEN7sn.js";import{C as y,D as b,E as x,M as ne,N as S,S as C,T as re,_ as w,b as ie,d as ae,h as T,j as oe,m as E,o as se,s as ce,t as D,v as le,x as ue,y as de}from"./iframe-renderer-Coe3pdG-.js";import{a as fe,i as pe,r as me,t as he}from"./idb-cache-BzzftUET.js";var ge=`agentAvatar`,_e=`userAvatar`,ve=_.shark,ye=_.user,be={agent:{emoji:ve,imageUrl:``,updatedAt:null},user:{emoji:ye,imageUrl:``,updatedAt:null}},xe=!1;function O(e){return be[e]}function Se(e){return e===`agent`?`agentAvatarPreview`:`userAvatarPreview`}function Ce(e){return e===`agent`?`.agent-icon`:`.user-icon`}function k(e){let t=document.getElementById(Se(e));if(t){t.innerHTML=A(e);let n=O(e).imageUrl?`image`:`emoji`;t.setAttribute(`data-avatar-kind`,n)}}function A(e){let t=O(e);return t.imageUrl?`<img class="avatar-image" src="${a(t.imageUrl)}" alt="" loading="lazy" decoding="async">`:t.emoji}function we(e){let t=A(e),n=O(e).imageUrl?`image`:`emoji`;document.querySelectorAll(Ce(e)).forEach(e=>{e.innerHTML=t,e.setAttribute(`data-avatar-kind`,n)})}function j(e,t){t?.kind===`image`&&t.imageUrl?(O(e).imageUrl=t.imageUrl,O(e).updatedAt=t.updatedAt??Date.now()):(O(e).imageUrl=``,O(e).updatedAt=t?.updatedAt??null),k(e),we(e)}async function Te(){let e=await n(`/api/avatar`);e&&(j(`agent`,e.agent),j(`user`,e.user))}async function Ee(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 De(e,t){let n=await Ee(`/api/avatar/${e}/upload`,{method:`POST`,headers:{"Content-Type":t.type||`image/png`,"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})`);j(e,r?.data||r)}async function Oe(e){let t=await Ee(`/api/avatar/${e}/image`,{method:`DELETE`}),n=await t.json().catch(()=>null);if(!t.ok)throw Error(n?.error||`avatar reset failed (${t.status})`);j(e,n?.data||n)}function ke(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 Oe(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 De(e,r)}catch(e){console.warn(`[avatar:upload]`,e.message)}finally{n.value=``}})}function Ae(){return A(`agent`)}function je(){return A(`user`)}async function Me(){O(`agent`).emoji=localStorage.getItem(ge)||ve,O(`user`).emoji=localStorage.getItem(_e)||ye,k(`agent`),k(`user`),xe||(xe=!0,ke(`agent`),ke(`user`)),await Te(),we(`agent`),we(`user`)}function Ne(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?_.chevronDown:_.chevronRight)}),e.dataset.toolItemBound=`1`)}function Pe(){document.querySelectorAll(`.tool-activity-live`).forEach(e=>e.remove()),document.querySelectorAll(`.msg-system.tool-activity`).forEach(e=>e.remove())}function Fe(){let e=Number(window.location.port);if(Number.isFinite(e)&&e>0)return e;let t=window.location.pathname.match(/^\/i\/(\d+)/);return t?Number(t[1]):null}function Ie(e){let t=e.split(/\r?\n/).map(e=>e.trim()).find(Boolean);return t?t.length>96?`${t.slice(0,93)}...`:t:`Pinned reminder`}function Le(e){let t=e.querySelector(`.msg-content`);return t?.getAttribute(`data-raw`)||t?.innerText||t?.textContent||``}function Re(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function ze(e,t){let n=Fe(),r=e.dataset.messageId||``;return{title:Ie(t),notes:t,priority:`normal`,instanceId:e.dataset.instanceId||(n?`port:${n}`:`browser`),messageId:r,turnIndex:Re(e.dataset.turnIndex),port:n,threadKey:window.location.pathname,sourceText:t}}function Be(e){e.classList.add(`copied`),e.innerHTML=_.checkSimple,setTimeout(()=>{e.classList.remove(`copied`),e.textContent=``},600)}async function Ve(e){let t=e.closest(`.msg`);t&&(await s(Le(t))).ok&&Be(e)}async function He(e,t){let r=e.closest(`.msg`);if(!r)return;let i=Le(r).trim();if(!i){t.onStatus?.(`Cannot pin an empty message as a reminder.`);return}e.setAttribute(`aria-busy`,`true`),e.classList.add(`is-pinning`);try{let a=await n(`/api/dashboard/reminders/from-message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(ze(r,i))});if(!a?.ok)throw Error(a?.error||`Reminder pin failed`);e.classList.add(`is-pinned`),t.onStatus?.(`Pinned reminder: ${a.item?.title||Ie(i)}`)}catch(e){t.onStatus?.(`Reminder pin failed: ${e.message}`)}finally{e.classList.remove(`is-pinning`),e.removeAttribute(`aria-busy`)}}function Ue(e){let t=e.closest(`.tool-group-summary`);if(!t)return!1;let n=t.closest(`.tool-group`),r=t.nextElementSibling;if(n&&r){let e=!n.classList.contains(`expanded`);n.classList.toggle(`expanded`),r.classList.toggle(`collapsed`),t.setAttribute(`aria-expanded`,e?`true`:`false`)}return!0}function We(e){let t=[`data-message-role="${a(e.role)}"`,`data-message-id="${a(e.messageId)}"`];if(e.turnIndex!==null&&t.push(`data-turn-index="${e.turnIndex}"`),typeof window<`u`){let e=Fe();e&&t.push(`data-instance-id="port:${e}"`)}return t.join(` `)}function Ge(){return`<div class="msg-actions"><button class="msg-pin-reminder" type="button" title="Pin as reminder" aria-label="Pin as reminder"></button><button class="msg-copy" type="button" title="Copy" aria-label="Copy message"></button></div>`}function Ke(e={}){let t=document.getElementById(`chatMessages`);t&&(de(t),Ne(t),t.addEventListener(`click`,t=>{let n=t.target;if(Ue(n))return;let r=n.closest(`.msg-copy`);if(r){Ve(r).catch(t=>{e.onStatus?.(`Copy failed: ${t.message}`)});return}let i=n.closest(`.msg-pin-reminder`);i&&He(i,e)}))}var qe=`agentName`,M=`CLI-JAW`,N=M;function Je(){return N}function Ye(e){N=(e||``).trim()||M,localStorage.setItem(qe,N);let t=document.getElementById(`appNameInput`);t&&(t.value=N)}function Xe(){N=localStorage.getItem(qe)||M;let e=document.getElementById(`appNameInput`);e&&(e.value=N),document.getElementById(`appNameSave`)?.addEventListener(`click`,()=>{let e=document.getElementById(`appNameInput`);e&&Ye(e.value)}),document.getElementById(`appNameInput`)?.addEventListener(`keydown`,e=>{let t=e;t.key===`Enter`&&(t.preventDefault(),Ye(t.target.value),t.target.blur())})}var Ze=`:scope > .process-block, :scope > .tool-group, :scope > .msg-content > .process-block, :scope > .msg-content > .tool-group`;function P(e){return e.querySelector(`.agent-body`)}function F(e){let t=P(e);return t?Array.from(t.querySelectorAll(Ze)):[]}function Qe(e){let t=e.querySelector(`:scope > .msg-content`);return e.querySelector(`:scope > .process-block`)??e.querySelector(`:scope > .tool-group`)??t?.querySelector(`:scope > .process-block`)??t?.querySelector(`:scope > .tool-group`)??null}function I(e){let t=P(e);if(!t)return;let n=t.querySelector(`.msg-content`),r=F(e);if(r.length===0)return;let i=Qe(t)??r[0];n&&i.parentElement!==t&&t.insertBefore(i,n);for(let e of r)e!==i&&(b(e),e.remove())}function $e(e){return F(e).length>0}function et(e){return e===`thinking`||e===`search`||e===`subagent`?e:`tool`}function tt(e){return e===`done`||e===`error`?e:`running`}function nt(e){let t=e.dataset.stepId||``;if(!t)return null;let n=re(t),r=e.querySelector(`.process-step-label`)?.textContent?.trim()||``,i=e.querySelector(`.process-step-full`),a=i?.dataset.detailLazy===`true`?y(t)||n?.preview||``:i?.textContent||y(t)||n?.preview||``,o=e.querySelector(`.process-step-icon`)?.innerHTML||_.tool,s=Number(e.dataset.startTime||``);return{id:t,type:n?.type||et(e.dataset.type),icon:n?.icon||o,rawIcon:n?.rawIcon,label:n?.label||r,isEmployee:n?.isEmployee===!0||e.dataset.isEmployee===`true`,detail:a,detailPreview:n?.preview,detailLength:n?.detailLength,detailTruncated:n?.detailTruncated,stepRef:n?.stepRef||e.dataset.stepRef||``,traceRunId:n?.traceRunId||e.dataset.traceRunId||``,traceSeq:n?.traceSeq||Number(e.dataset.traceSeq||0)||void 0,detailAvailable:n?.detailAvailable,detailBytes:n?.detailBytes,rawRetentionStatus:n?.rawRetentionStatus,status:n?.status||tt(e.dataset.status),startTime:Number.isFinite(s)&&s>0?s:Date.now()}}function rt(e){let t=P(e)?.querySelector(`:scope > .process-block`);if(!t)return null;let n={element:t,steps:Array.from(t.querySelectorAll(`.process-step`)).map(nt).filter(e=>!!e),collapsed:t.classList.contains(`collapsed`)};return x(n),n}function it(e,t=!1){let n=y(e.id)||e.detail||e.detailPreview||``,r=t&&e.status===`running`?`done`:e.status;return{icon:e.rawIcon||e.icon||_.tool,rawIcon:e.rawIcon||e.icon||``,label:e.label||`tool`,isEmployee:e.isEmployee===!0,detail:n,toolType:e.type,stepRef:e.stepRef||``,status:r,traceRunId:e.traceRunId||``,traceSeq:e.traceSeq,detailAvailable:e.detailAvailable,detailBytes:e.detailBytes,rawRetentionStatus:e.rawRetentionStatus}}function at(e,t=!1){let n=re(e);if(!n)return null;let r=t&&n.status===`running`?`done`:n.status;return{icon:n.rawIcon||n.icon||_.tool,rawIcon:n.rawIcon||n.icon||``,label:n.label||`tool`,isEmployee:n.isEmployee===!0,detail:y(e)||n.preview||``,toolType:n.type,stepRef:n.stepRef||``,status:r,traceRunId:n.traceRunId||``,traceSeq:n.traceSeq,detailAvailable:n.detailAvailable,detailBytes:n.detailBytes,rawRetentionStatus:n.rawRetentionStatus}}function ot(e,t=!1){if(!e)return[];if(`steps`in e)return e.steps.map(e=>it(e,t));let n=new Set;e.querySelectorAll(`.process-block[data-process-step-ids]`).forEach(e=>{(e.dataset.processStepIds||``).split(/\s+/).filter(Boolean).forEach(e=>n.add(e))}),e.querySelectorAll(`.process-step[data-step-id]`).forEach(e=>{let t=e.dataset.stepId;t&&n.add(t)});let r=[];return n.forEach(n=>{let i=at(n,t);if(i){r.push(i);return}let a=e.querySelector(`.process-step[data-step-id="${CSS.escape(n)}"]`),o=a?nt(a):null;o&&r.push(it(o,t))}),r}function st(e){for(let t of F(e))b(t),t.remove()}function ct(e){return Ae()}function lt(){let t=document.getElementById(`chatMessages`);if(!t||t.querySelector(`.skeleton-msg`)||e.currentAgentDiv&&e.currentAgentDiv.isConnected)return;R();let n=document.createElement(`div`);n.className=`skeleton-msg`,n.innerHTML=`<div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line"></div>`,t.appendChild(n),E()}function L(){document.querySelectorAll(`.skeleton-msg`).forEach(e=>e.remove())}function R(){document.getElementById(`emptyState`)?.classList.remove(`visible`)}function z(){let e=document.getElementById(`chatMessages`);e&&e.children.length===0&&document.getElementById(`emptyState`)?.classList.add(`visible`)}function ut(e,t,n){let r=document.getElementById(`chatMessages`);if(!r)return;let i=w();R();let a=document.createElement(`div`);a.className=`msg msg-system`+(n?` msg-type-${n}`:``)+(t?` `+t:``),a.innerHTML=v(e),i.active?i.appendLiveItem(a):r.appendChild(a),E()}function dt(e){let t=e.match(/^\[(?:사용자가 파일 (\d+)개를 보냈습니다|User sent (\d+) files)\]/);if(t){let n=t[1]||t[2],r=e.match(/(?:사용자 메시지|User message): (.+)$/s);return`📎 [${n} files]${r?` `+r[1].trim():``}`}let n=e.match(/^\[(?:사용자가 파일을 보냈습니다|사용자가 이미지를 보냈습니다|사용자가 동영상을 보냈습니다|User sent a file|User sent an image|User sent a video): ([^\]]+)\]/);if(n){let t=n[1],i=t.split(`/`).pop()||t,a=e.match(/🎤\s*(.{0,80})/)?`${u(`chat.voice.label`)} `:``,o=e.match(/(?:사용자 메시지|User message): (.+)$/s),s=o?` `+o[1].trim():``,c=(i.split(`.`).pop()||``).toLowerCase(),l=`${r}/media/${encodeURIComponent(i)}`;return[`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`].includes(c)?`${a}<img src="${l}" alt="${i}" class="chat-inline-img" loading="lazy" />${s?`<br>${s}`:``}`:[`mp4`,`webm`,`mov`,`ogg`].includes(c)?`${a}<video src="${l}" controls class="chat-inline-video" preload="metadata"></video>${s?`<br>${s}`:``}`:`${a}📎 [${i}]${s}`}return e}function ft(e,t,n){let r=document.getElementById(`chatMessages`),s=w();R(),L();let d=h(e===`user`?dt(t):t),te=a(e===`user`?u(`msg.you`):Je()),_=document.createElement(`div`),v=r?r.querySelectorAll(`.msg`).length:null,y=S();_.setAttribute(`data-message-role`,e),_.setAttribute(`data-message-id`,y),v!==null&&_.setAttribute(`data-turn-index`,String(v));let b=Number(window.location.port);Number.isFinite(b)&&b>0&&_.setAttribute(`data-instance-id`,`port:${b}`);let x=Ge();e===`agent`?(_.className=`msg msg-agent`,_.innerHTML=`<div class="agent-icon" aria-hidden="true">${ct(n)}</div><div class="agent-body"><div class="msg-content">${d}</div>${x}</div>`):(_.className=`msg msg-${e}${e===`user`&&n===`goal_continuation`?` msg-goal-boundary`:``}`,_.innerHTML=`<div class="user-body"><div class="msg-label">${te}</div><div class="msg-content">${d}</div>${x}</div><div class="user-icon" aria-hidden="true">${je()}</div>`);let ne=_.querySelector(`.msg-content`);ne&&ne.setAttribute(`data-raw`,i(t));let C=e===`agent`&&!t;return s.active&&!C?(_.classList.contains(`msg-agent`)&&I(_),s.appendLiveItem(_)):(r?.appendChild(_),D(_),c(_),m(_),f(_),o(_),l(_),p(_),!s.active&&!C&&r&&r.querySelectorAll(`.msg`).length>=1&&(r.querySelectorAll(`.msg`).forEach(e=>{e.classList.contains(`msg-agent`)&&I(e),s.addItem(S(),e.outerHTML)}),s.onPostRender=e=>{D(e),c(e),m(e),f(e),o(e),l(e),p(e),ee(e),g(e,{immediate:!0})})),E(e===`user`),_}var B=3e3,pt=24e3,V=`⚠️`,H=`Tool log truncated`,mt=`Inline preview capped.`,ht=/^tr_[A-Za-z0-9_-]{16,80}$/;function U(e,t){if(e==null)return;let n=String(e);if(n)return n.length<=t?n:`${n.slice(0,Math.max(0,t-1))}…`}function gt(e,t){return`[detail truncated: kept ${e} of ${t} chars]`}function W(e){return{icon:V,label:U(e>0?`${e} tool event${e===1?``:`s`} omitted`:H,240)||H,toolType:`tool`,status:`done`,detail:mt}}function _t(e){if(!e||typeof e!=`object`)return 0;let t=e;if(t.icon!==V)return 0;let n=String(t.label??``);if(n===H)return 1;let r=/^(\d+) tool events? omitted$/.exec(n);return r?Number(r[1]):0}function G(e,t){let n=Number(e);if(!(!Number.isFinite(n)||n<0))return Math.min(Math.floor(n),t)}function vt(e,t=B){let n=e.detail==null?``:String(e.detail),r=Math.max(0,Math.min(B,t)),i=U(n,r);if(i&&n.length>r){let e=gt(i.length,n.length),t=Math.max(0,r-e.length-1);i=`${n.slice(0,t)}\n${e}`}let a={icon:U(e.icon,240)||`🔧`,label:U(e.label,240)||`tool`},o=U(e.rawIcon,240),s=U(e.toolType,240),c=U(e.stepRef,240),l=U(e.status,240),u=U(e.traceRunId,96),d=G(e.traceSeq,2**53-1),f=G(e.detailBytes,2**53-1),p=U(e.rawRetentionStatus,32);return o&&(a.rawIcon=o),i&&(a.detail=i),s&&(a.toolType=s),c&&(a.stepRef=c),l&&(a.status=l),e.isEmployee===!0&&(a.isEmployee=!0),u&&ht.test(u)&&(a.traceRunId=u),d!=null&&d>0&&(a.traceSeq=d),e.detailAvailable===!0&&(a.detailAvailable=!0),f!=null&&(a.detailBytes=f),p&&(a.rawRetentionStatus=p),a}function K(e){if(!Array.isArray(e)||e.length===0)return[];let t=e,n=_t(e[0]);n>0&&(t=e.slice(1));let r=0;(n>0||t.length>160)&&(r=Math.max(0,t.length-159),r>0&&(t=t.slice(r)));let i=n+r,a=t.map(e=>e&&typeof e==`object`?e:{label:e}),o=Array(a.length).fill(0),s=pt;for(let e=a.length-1;e>=0;e--){let t=a[e].detail,n=t==null?0:String(t).length,r=Math.min(B,s);o[e]=r,s=Math.max(0,s-Math.min(n,r))}let c=a.map((e,t)=>vt(e,o[t]));return i>0&&c.unshift(W(i)),bt(c)}function yt(e){let t={icon:U(e.icon,24)||`🔧`,label:U(e.label,80)||`tool`},n=U(e.toolType,48),r=U(e.stepRef,80),i=U(e.status,24),a=U(e.detail,180),o=U(e.traceRunId,96),s=G(e.traceSeq,2**53-1),c=G(e.detailBytes,2**53-1),l=U(e.rawRetentionStatus,32);return n&&(t.toolType=n),r&&(t.stepRef=r),i&&(t.status=i),a&&(t.detail=a),e.isEmployee===!0&&(t.isEmployee=!0),o&&ht.test(o)&&(t.traceRunId=o),s!=null&&s>0&&(t.traceSeq=s),e.detailAvailable===!0&&(t.detailAvailable=!0),c!=null&&(t.detailBytes=c),l&&(t.rawRetentionStatus=l),t}function bt(e){if(JSON.stringify(e).length<=64e3)return e;let t=e.map(yt),n=JSON.stringify(t);for(;n.length>64e3&&t.length>1;){let e=_t(t[0]);t.splice(+(e>0),1);let r=W(e+1);e>0?t[0]=r:t.unshift(r),n=JSON.stringify(t)}if(n.length<=64e3)return t;let r=[{icon:V,label:H,toolType:`tool`,status:`done`,detail:mt}];return JSON.stringify(r).length<=64e3?r:[]}function xt(e){let t=K(e);if(t.length===0)return null;let n=JSON.stringify(t);return n.length<=64e3?n:JSON.stringify(bt(t))}function St(e){if(!e)return[];if(e.length>18e4)return[W(1)];try{return K(JSON.parse(e))}catch{return[]}}function Ct(e){return e===`thinking`||e===`search`||e===`subagent`?e:`tool`}function wt(e){return e===`running`||e===`done`||e===`error`?e:`done`}function Tt(e){if(e.label)return e.label;let t=e;return typeof t.name==`string`&&t.name?t.name:`tool`}function Et(e){let t=Tt(e);return e.toolType===`tool`?oe(t):t}function q(e){return St(e)}function Dt(e){return xt(q(e))}function J(e){return e.role!==`assistant`||!e.tool_log?{...e,tool_log:null}:{...e,tool_log:Dt(e.tool_log)}}function Y(e,t){let n=t&&t>0?t:Date.now();return e.map(e=>({id:S(),icon:e.icon?te(e.icon):_.tool,rawIcon:e.rawIcon||e.icon||``,label:Et(e),isEmployee:e.isEmployee===!0,type:Ct(e.toolType),detail:e.toolType===`tool`?ne(e.detail||``):e.detail||``,stepRef:e.stepRef||``,traceRunId:e.traceRunId||``,traceSeq:e.traceSeq,detailAvailable:e.detailAvailable,detailBytes:e.detailBytes,rawRetentionStatus:e.rawRetentionStatus,status:wt(e.status),startTime:n}))}function Ot(e,t){let n=String(e.stepRef||``).trim();return n?`ref:${n}`:`ord:${e.toolType||`tool`}:${e.label||`tool`}:${t}`}function kt(e,t){if(e.length===0)return t;let n=new Map,r=new Map,i=e=>{let t=`${e.toolType||`tool`}:${e.label||`tool`}`,n=(r.get(t)||0)+1;return r.set(t,n),Ot(e,n)};return t.forEach(e=>n.set(i(e),e)),r.clear(),e.forEach(e=>{let t=i(e),r=n.get(t),a=r?.detail||``,o=e.detail||``;n.set(t,{...r||{},...e,detail:o.length>=a.length?o:a,status:e.status||r?.status||`done`})}),Array.from(n.values())}function At(e){return K(e)}function jt(e){return xt(e)}function Mt(e){return Ae()}function Nt(e,t){let n=e.role===`assistant`?`agent`:e.role,r=We({role:n,messageId:String(e.id??S()),turnIndex:t}),o=i(n===`user`?dt(e.content):e.content),s=a(n===`user`?u(`msg.you`):Je()),c=e.role===`assistant`&&e.tool_log?Dt(e.tool_log):null,l=c?a(c):``,d=l?` data-tool-log="${l}"`:``,f=`<div class="msg-content lazy-pending" data-raw="${a(o)}"></div>`,p=Ge(),m=n===`user`&&e.cli===`goal_continuation`?` msg-goal-boundary`:``,h=n===`agent`?`<div class="msg msg-agent" ${r}><div class="agent-icon" aria-hidden="true">${Mt(e.cli)}</div><div class="agent-body"${d}>${f}${p}</div></div>`:`<div class="msg msg-${n}${m}" ${r}><div class="user-body"><div class="msg-label">${s}</div>${f}${p}</div><div class="user-icon" aria-hidden="true">${je()}</div></div>`;return{id:S(),html:h,height:80,rehydratesProcessDetails:!!l}}function Pt(e,t){if(t.onBeforeVirtualHistoryBootstrap?.(),t.registerCallbacks(),t.setItems(e,{autoActivate:!1}),t.shouldFollowBottom?.()??!0){t.activateIfNeeded(!0),t.scrollToBottom(),t.onAfterVirtualHistoryBottomed?.();return}let n=t.restoreIndex;n!=null&&n>=0?(t.activateIfNeeded(!1),t.scrollToIndex?.(n)):(t.activateIfNeeded(!0),t.scrollToBottom(),t.onAfterVirtualHistoryBottomed?.())}function Ft(t){let n=document.getElementById(`statusBadge`),r=document.getElementById(`btnSend`),i=document.getElementById(`typingIndicator`)?.querySelector(`.label`);e.agentBusy=t===`running`||t===`steering`,document.getElementById(`typingIndicator`)?.classList.toggle(`active`,e.agentBusy),t===`running`?(n&&(n.className=`status-badge status-running`,n.textContent=`running`),r&&(r.innerHTML=_.stop,r.title=u(`btn.stop`),r.classList.add(`stop-mode`)),i&&(i.textContent=u(`status.responding`)),lt()):t===`steering`?(n&&(n.className=`status-badge status-steering`,n.textContent=`steering`),r&&(r.innerHTML=_.stop,r.title=`Steering...`,r.classList.add(`stop-mode`)),i&&(i.textContent=`Steering...`)):(n&&(n.className=`status-badge status-idle`,n.textContent=`idle`),r&&(r.innerHTML=_.send,r.title=`Send`,r.classList.remove(`stop-mode`)),i&&(i.textContent=u(`status.responding`)),L())}function It(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 X(e){let t=document.getElementById(`statMsgs`);t&&(t.textContent=u(`stat.messages`,{count:e}))}async function Lt(){let e=await n(`/api/messages/count`);e&&X(e.count)}function Z(e){return e.map((e,t)=>Nt(J(e),t))}var Rt=3e3;function zt(){return`?limit=${Rt}`}function Q(e){return String(e||``).trim()||`unknown`}function Bt(e){let t=Q(e.origin),n=Q(e.pathname||`/`);return`${t}${n.startsWith(`/`)?n:`/${n}`}`}function Vt(e){return`${Q(e.locationKey)}::${Q(e.workingDir)}`}function Ht(){return Bt(typeof window>`u`?{}:{origin:window.location.origin,pathname:window.location.pathname})}function Ut(e){if(!e||e===`default`)return null;let t=e.indexOf(`::`);return t>=0?e.slice(t+2):e}function Wt(e){e.onLazyRender=e=>{for(let t of e){if(!t.classList.contains(`lazy-pending`))continue;let e=t.getAttribute(`data-raw`)||``,n=t.closest(`.msg-agent`),r=n?.querySelector(`.agent-body`),i=r?.dataset.toolLog||``;if(n&&r&&i&&!$e(n)){let e=q(i);e.length>0&&t.insertAdjacentHTML(`beforebegin`,ie(Y(e),!0)),delete r.dataset.toolLog,I(n)}t.innerHTML=e?h(e):``,t.classList.remove(`lazy-pending`),D(t),c(t),m(t),f(t),o(t),l(t),p(t),g(t,{immediate:!0})}},e.onPostRender=e=>{D(e),c(e),m(e),f(e),o(e),l(e),p(e),ee(e),g(e,{immediate:!0})}}function Gt(e,t={}){return{registerCallbacks:()=>Wt(e),setItems:(t,n)=>e.setItems(t,n),activateIfNeeded:t=>e.activateIfNeeded(t),scrollToBottom:()=>e.scrollToBottom(),scrollToIndex:t=>e.scrollToIndex(t),shouldFollowBottom:t.forceInitialBottom?()=>!0:se,restoreIndex:t.restoreIndex??null,onBeforeVirtualHistoryBootstrap:()=>{ce()},onAfterVirtualHistoryBottomed:()=>{ae(),T()}}}function Kt(e){e.forEach(e=>{let t=ft(e.role===`assistant`?`agent`:e.role,e.content,e.cli);if(e.role===`assistant`&&e.tool_log){let n=q(e.tool_log);if(n.length>0){let e=t.querySelector(`.agent-body`);if(e){let t=C(e);for(let e of Y(n))le(t,e);ue(t)}}}})}function qt(e){let t=e.message_id??e.id;return{...t===void 0?{}:{id:t},role:e.role,content:e.content,cli:e.cli??null,tool_log:e.tool_log??null}}var Jt=``;function Yt(e,t){let n=t.length>0?t[t.length-1]:null;return`${e}|${t.length}|${n?JSON.stringify(n):``}`}var $=null;async function Xt(){return $||($=Qt().finally(()=>{$=null}),$)}function Zt(){return $!==null}async function Qt(){let e=w(),t=document.getElementById(`chatMessages`),r=me(),i=Ht(),a=Ut(r);try{let e=await n(`/api/settings`);e?.workingDir&&(a=e.workingDir)}catch{}let o=Vt({locationKey:i,workingDir:a});fe(o);let s=o!==r,c=await n(`/api/messages${zt()}`);if(c!==null){let n=c.map(J);d(n);let r=!!t?.querySelector(`.msg`)||e.active,i=Yt(o,n);if(r&&!s&&i===Jt){X(n.length);return}Jt=i;let a=s||!r,l=!a&&e.active?e.firstVisibleIndex():null;e.clear(),t&&(t.innerHTML=``),n.length>=1?Pt(Z(n),Gt(e,{forceInitialBottom:a,restoreIndex:a?null:l})):(Kt(n),a&&T()),he(n.map(e=>({...e.id===void 0?{}:{message_id:e.id},role:e.role,content:e.content,cli:e.cli??null,tool_log:e.tool_log??null,timestamp:Date.now()}))).catch(()=>{}),X(n.length),z();return}if(t&&t.children.length>0){z();return}let l=await pe();if(l.length>0){let t=l.map(qt).map(J);d(t),t.length>=1?Pt(Z(t),Gt(e,{forceInitialBottom:!0})):(Kt(t),T()),ut(`${_.warning} ${u(`ui.offline.banner`)}`),X(t.length)}z()}export{st as C,Pe as D,Ke as E,Me as O,I as S,Xe as T,ft as _,Zt as a,rt as b,Wt as c,It as d,Nt as f,Y as g,jt as h,Z as i,Lt as l,At as m,Bt as n,Xt as o,kt as p,Vt as r,Gt as s,zt as t,Ft as u,ut as v,ot as w,$e as x,L as y};
|
|
@@ -0,0 +1,122 @@
|
|
|
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{A as e,L as t,R as n,_ as r,a as i,b as a,c as o,d as s,f as c,g as l,h as u,i as d,l as f,m as p,o as ee,p as te,s as ne,u as re,v as ie,x as m,y as ae}from"./vendor-render-DCb9B75Q.js";import{i as oe,t as h}from"./api-tVoG39dL.js";import{t as g}from"./preload-helper-DFYRRz9w.js";import{a as se,i as ce,n as le,o as ue,r as de,t as fe}from"./mermaid-preprocess-0hqEN7sn.js";import{$ as pe,$t as me,A as he,At as ge,B as _e,Bt as ve,C as ye,Cn as be,Ct as xe,D as Se,Dt as Ce,E as we,Et as Te,F as Ee,Ft as De,G as Oe,Gt as ke,H as Ae,Ht as je,I as Me,It as Ne,J as Pe,Jt as Fe,K as Ie,Kt as Le,L as Re,Lt as ze,M as Be,Mt as Ve,N as He,Nt as Ue,O as We,Ot as Ge,P as Ke,Pt as qe,Q as Je,Qt as Ye,R as Xe,Rt as Ze,S as Qe,Sn as $e,St as et,T as tt,Tn as nt,Tt as rt,U as it,Ut as at,V as ot,Vt as st,W as ct,Wt as lt,X as ut,Xt as dt,Y as ft,Yt as pt,Z as mt,Zt as ht,_ as gt,_n as _t,_t as vt,a as yt,an as bt,at as xt,b as St,bn as Ct,bt as wt,c as Tt,cn as Et,ct as Dt,d as Ot,dn as kt,dt as At,en as jt,et as Mt,f as Nt,fn as Pt,ft as Ft,g as It,gn as Lt,gt as Rt,h as zt,hn as Bt,ht as Vt,i as Ht,in as Ut,it as Wt,j as Gt,jt as Kt,k as qt,kt as Jt,l as Yt,ln as Xt,lt as Zt,m as Qt,mn as $t,mt as en,n as tn,nn,nt as rn,o as an,on,ot as sn,p as cn,pn as ln,pt as un,q as dn,qt as fn,r as pn,rn as mn,rt as hn,s as gn,sn as _n,st as vn,t as yn,tn as bn,tt as xn,u as Sn,un as Cn,ut as wn,v as Tn,vn as En,vt as Dn,w as On,wn as kn,wt as An,x as jn,xn as Mn,xt as Nn,y as Pn,yn as Fn,yt as In,z as Ln,zt as Rn}from"./vendor-icons-eoCVgkBn.js";var zn=[`en`,`ko`,`zh`,`ja`],_=`ko`,Bn={},v={};async function Vn(){let e=null;try{e=localStorage.getItem(`claw_locale`)}catch{}if(!e){let t=(navigator.language||`ko`).split(/[-_]/)[0].toLowerCase();e=zn.includes(t)?t:`ko`}v=await Hn(`ko`),Bn=e===`ko`?v:await Hn(e),_=e,document.documentElement.lang=_,Un()}async function Hn(e){try{let{api:t}=await g(async()=>{let{api:e}=await import(`./api-DNnX8m0u.js`);return{api:e}},[]);return await t(`/api/i18n/${e}`)||{}}catch{return{}}}function y(e,t={}){let n=Bn[e]??v[e]??e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{${e}}`,String(r));return n}function Un(){document.querySelectorAll(`[data-i18n]`).forEach(e=>{let t=e.getAttribute(`data-i18n`);t&&(e.textContent=y(t))}),document.querySelectorAll(`[data-i18n-placeholder]`).forEach(e=>{let t=e.getAttribute(`data-i18n-placeholder`);t&&(e.placeholder=y(t))}),document.querySelectorAll(`[data-i18n-title]`).forEach(e=>{let t=e.getAttribute(`data-i18n-title`);t&&(e.title=y(t))}),document.querySelectorAll(`[data-i18n-aria]`).forEach(e=>{let t=e.getAttribute(`data-i18n-aria`);t&&e.setAttribute(`aria-label`,y(t))})}async function Wn(e){if(e!==_){zn.includes(e)||(e=`ko`),Bn=e===`ko`?v:await Hn(e),_=e,document.documentElement.lang=_;try{localStorage.setItem(`claw_locale`,e)}catch{}Un();try{let{loadEmployees:e}=await g(async()=>{let{loadEmployees:e}=await import(`./employees-CiDBVvox.js`);return{loadEmployees:e}},__vite__mapDeps([0]));e()}catch{}try{let{loadSkills:e}=await g(async()=>{let{loadSkills:e}=await import(`./skills-BBRF65cl.js`);return{loadSkills:e}},[]);e()}catch{}try{let{loadCommands:e}=await g(async()=>{let{loadCommands:e}=await import(`./slash-commands-BAELQN6G.js`);return{loadCommands:e}},[]);e()}catch{}try{let{loadSettings:e}=await g(async()=>{let{loadSettings:e}=await import(`./settings-BSJt5rk5.js`);return{loadSettings:e}},[]);e()}catch{}}}function Gn(){return _}function Kn(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has(`locale`)||n.searchParams.set(`locale`,_),fetch(n.toString(),t)}function qn(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 Jn=0;function Yn(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-${Jn++}\x00`;return t.set(n,e),n}),fences:t}}function Xn(e,t){for(let[n,r]of t)e=e.replace(n,()=>r);return e}function Zn(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=Jn++,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=Jn++;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}}function b(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}var Qn=/["'](?:subtasks|employee_config|agent_phases|orchestration_plan)["']\s*:/,$n=/(^|\n)(?:## Approved Plan \((?:authoritative|auto-injected by orchestrator)[^\n]*\)|\[PABCD — [A-Z]:[^\n]*\]|\[PLANNING MODE[^\n]*\]|\[PLAN AUDIT[^\n]*\]|The approved plan is already injected above)/m;function er(e){let t=$n.exec(e);return!t||t.index<0?e:e.slice(0,t.index).trim()}function tr(e){let t=e.replace(/```json\n([\s\S]*?)\n```/g,(e,t)=>Qn.test(t)?``:e);return t=t.replace(/\{[^{}]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,``).trim(),er(t)}function nr(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 rr(t,n,r=!1){return t.replace(/\x00MATH-(\d+)\x00/g,(t,i)=>{let a=n[Number(i)];if(!a)return`<code title="math placeholder error">[math error]</code>`;if(r)return a.displayMode?`<div class="math-placeholder">${b(a.tex)}</div>`:`<code class="math-placeholder">${b(a.tex)}</code>`;try{return e.renderToString(a.tex,{displayMode:a.displayMode,throwOnError:!1})}catch{return a.displayMode?`<pre><code>${b(a.tex)}</code></pre>`:`<code>${b(a.tex)}</code>`}})}var ir={"✅":`check`,"❌":`error`,"❔":`unknown`,"🔧":`tool`,"⏭":`skip`,"🧠":`brain`,"💓":`heartPulse`,"🔒":`lock`,"🔓":`lockOpen`,"🔑":`key`,"⚙":`settings`,"⚙️":`settings`,"📄":`file`,"🗑":`trash`,"🗑️":`trash`,"⚠":`warning`,"⚠️":`warning`,"💡":`lightbulb`,"🦈":`shark`,"👤":`user`,"💭":`thinking`,"💬":`message`,"🔍":`search`,"🌐":`web`,"⚡":`exec`,"💻":`terminal`,"🗜":`compacting`,"🗜️":`compacting`,"📝":`plan`,"📑":`clipboard`,"🤖":`robot`,"📋":`clipboard`,"🔄":`refresh`,"🎨":`palette`,"🎤":`mic`,"🔗":`link`,"🫡":`salute`,"📎":`paperclip`,"💾":`save`,"🎮":`gamepad`,"🏠":`house`,"📡":`radio`,"📂":`folder`,"✏️":`pencil`,"📊":`chart`,"🎙️":`mic`,"⏳":`hourglass`,"⏹️":`stop`,"🎯":`target`,"📨":`send`,"🚫":`ban`,"▶":`play`,"🔐":`permission`,"📖":`read`},ar={"🧪":`test`,"🏗️":`architecture`,"🍎":`apple`,"🔴":`statusDot`,"🎬":`video`,"🐍":`code`,"🐛":`bug`,"📐":`drafting`,"📚":`library`,"📦":`package`,"🔬":`research`,"🖼️":`image`,"🗃️":`database`,"▲":`triangle`,"🇰🇷":`korea`,"✍️":`pen`,"🎥":`video`,"🐘":`database`,"🐦":`message`,"👥":`people`,"📏":`ruler`,"📱":`mobile`,"🔀":`branch`,"🔎":`searchCheck`,"🔥":`flame`,"🖥️":`monitor`,"🗺️":`map`,"🧵":`thread`,"🚀":`deploy`,"🛡️":`shield`,"☁️":`cloud`,"☕":`coffee`,"♾️":`infinity`,"♿":`accessibility`,"⚓":`anchor`,"⚛️":`atom`,"✉️":`mail`,"🌊":`waves`,"🌍":`web`,"🌤️":`weather`,"🌲":`tree`,"🍃":`leaf`,"🎭":`theatre`,"🎵":`music`,"🏋️":`fitness`,"🏛️":`institution`,"🏢":`company`,"🏭":`factory`,"🐙":`git`,"🐪":`camel`,"🐳":`container`,"🐹":`golang`,"👁️":`eye`,"💎":`gem`,"💚":`heart`,"💰":`money`,"💼":`briefcase`,"📍":`mapPin`,"📓":`notebook`,"📘":`read`,"📢":`megaphone`,"📧":`mail`,"📩":`inbox`,"📰":`newspaper`,"📲":`mobile`,"📸":`camera`,"📽️":`presentation`,"🔁":`repeat`,"🔊":`volume`,"🔌":`plug`,"🔔":`bell`,"🔤":`language`,"🔷":`code`,"🔺":`triangle`,"🕷️":`crawler`,"🗄️":`database`,"🗣️":`voice`,"🤗":`hug`,"🤝":`handshake`,"🦀":`rust`,"🦋":`flutter`,"🦠":`quality`,"🧙":`wizard`,"🧩":`puzzle`,"🧭":`compass`,"🧱":`brick`,"🧹":`cleanup`,"🚚":`truck`,"🚨":`siren`,"🛂":`compliance`,"🛃":`compliance`,"🟣":`code`},or={...ir,...ar},sr=`<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>`,x=14,cr=16;function S(e,t=cr){return nt(e,{size:t})}var C={check:S(me),error:S(dt),warning:S(Ot),skip:S(St),tool:S(pn),thinking:S(Mt),search:S(We),web:S(rt),exec:S(yn),compacting:S(Ie),plan:S(Pe),message:S(xn),unknown:S(Ye),read:S(ln),terminal:S(Qt),test:S(ge),architecture:S(at),build:S(_n),apple:S($e),statusDot:S(pt),video:S(gn),bug:S(on),ruler:S(Be),drafting:S(ze),library:S(wn),package:S(Ie),research:S(Je),image:S(vt),archive:S(Mn),database:S(ve),deploy:S(Ke),shield:S(ye),shieldAlert:S(tt),permission:S(On),cloud:S(fn),code:S(Le),coffee:S(ke),infinity:S(Vt),accessibility:S(kn),anchor:S(be),atom:S(En),mail:S(xt),waves:S(Ht),map:S(hn),weather:S(It),tree:S(Nt),leaf:S(At),theatre:S(Ue),music:S(ut),fitness:S(Ne),institution:S(un),company:S(_n),factory:S(De),git:S(Te),camel:S(Le),container:S(je),golang:S(Ve),eye:S(he),gem:S(Ce),heart:S(wt),money:S(Rn),briefcase:S(Xt),mapPin:S(Wt),notebook:S(dn),megaphone:S(rn),mailIn:S(xt),inbox:S(Rt),newspaper:S(ft),mobile:S(Pn),camera:S(bt),presentation:S(Ln),repeat:S(Ee),volume:S(an),plug:S(_e),bell:S(Bt),language:S(Ft),triangle:S(Sn),crawler:S(on),voice:S(Tn),hug:S(An),handshake:S(et),rust:S(Le),flutter:S(Ht),quality:S(_t),wizard:S(yt),puzzle:S(Xe),compass:S(lt),brick:S(Cn),cleanup:S(Et),truck:S(Yt),siren:S(jn),compliance:S(_t),korea:S(Ft),people:S(Tt),branch:S(Te),searchCheck:S(qt),flame:S(Kt),monitor:S(mt),route:S(He),thread:S(Te),bike:S($t),ship:S(Qe),pen:S(it),brain:S(kt),heartPulse:S(Nn),lock:S(sn),lockOpen:S(vn),key:S(en),settings:S(we),file:S(qe),trash:S(cn),lightbulb:S(Zt),refresh:S(Me),mic:S(pe),clipboard:S(Fe),robot:S(Pt),palette:S(Oe),link:S(Dt),salute:S(xe),shark:sr,user:S(ht),paperclip:S(ct),save:S(Gt),gamepad:S(Ge),house:S(Dn),radio:S(Re),folder:S(Jt),pencil:S(Ae),chart:S(Ut),hourglass:S(In),target:S(zt),ban:S(Lt),play:S(ot),stop:S(gt),close:S(tn,x),send:S(Se),copy:S(st,x),download:S(Ze,x),checkSimple:S(mn,x),chevronLeft:S(bn,x),chevronRight:S(jt,x),chevronDown:S(nn,x),arrowLeft:S(Ct,x),arrowRight:S(Fn,x)};function lr(e){return Object.prototype.hasOwnProperty.call(C,e)}function ur(e,t=`tool`){let n=(e||``).trim();if(!n)return C[t];if(n.startsWith(`<svg`))return n;if(lr(n))return C[n];let r=or[n];return r?C[r]:C[t]}function dr(e){return e===`✅`?`done`:e===`❌`?`error`:null}function fr(e=document.body){let t=e.querySelectorAll(`[data-icon]`);for(let e of t){let t=e.dataset.icon;t&&C[t]&&(e.innerHTML=C[t],e.classList.add(`icon-hydrated`))}}function pr(e){return e instanceof Error?e.message:String(e)}function mr(){return window.cliJawDesktop?.clipboard??null}async function hr(e){try{let t=mr();if(t){let n=await t.writeText(e);return n.ok?{ok:!0}:{ok:!1,error:n.error??`Clipboard bridge rejected the copy request.`}}return navigator.clipboard?.writeText?(await navigator.clipboard.writeText(e),{ok:!0}):{ok:!1,error:`Clipboard API is unavailable.`}}catch(e){return{ok:!1,error:pr(e)}}}function gr(e){if(/\bwidth\s*=/i.test(e.slice(0,e.indexOf(`>`))))return e;let t=e.match(/viewBox=["']?\s*([\d.]+)\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(!t)return e;let n=Math.round(parseFloat(t[3])),r=Math.round(parseFloat(t[4]));return!n||!r?e:e.replace(/^<svg/,`<svg width="${n}" height="${r}"`)}function _r(e){e.querySelector(`.mermaid-zoom-btn`)?.remove(),e.querySelector(`.mermaid-copy-btn`)?.remove(),e.querySelector(`.mermaid-save-btn`)?.remove();let t=document.createElement(`button`);t.className=`mermaid-zoom-btn`,t.type=`button`,t.ariaLabel=`Expand diagram`,t.title=`Expand`,t.textContent=`⤢`,e.appendChild(t);let n=document.createElement(`button`);n.className=`mermaid-save-btn`,n.type=`button`,n.ariaLabel=`Save as image`,n.title=`Save`,n.innerHTML=C.download,e.appendChild(n);let r=document.createElement(`button`);r.className=`mermaid-copy-btn`,r.type=`button`,r.ariaLabel=`Copy source`,r.title=`Copy`,r.innerHTML=C.copy,e.appendChild(r)}var vr=!1;function yr(){vr||(vr=!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&&w(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&&w(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`},`*`),w(i,``,`save`));return}let t=e.querySelector(`svg`);t&&xr(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&&xr(t,a);return}}))}function w(e,t,n){let r=()=>{let t=e.innerHTML;e.innerHTML=C.checkSimple,e.classList.add(`copied`),setTimeout(()=>{e.innerHTML=t,e.classList.remove(`copied`)},1500)};n===`copy`?hr(t).then(e=>{e.ok&&r()}):r()}function br(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&&br(t,a)}}function xr(e,t){let n=e.cloneNode(!0);br(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&&(Sr(e,`diagram-${Date.now()}.png`),w(t,``,`save`))},`image/png`)},o.onerror=()=>{Sr(new Blob([i],{type:`image/svg+xml;charset=utf-8`}),`diagram-${Date.now()}.svg`),w(t,``,`save`)},o.src=a}function Sr(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 Cr(e){if(e.kind===`partial`)return`<div class="diagram-container diagram-loading" role="status"
|
|
3
|
+
aria-label="Diagram loading"><div class="diagram-spinner"></div></div>`;if(e.kind===`error`)return`<div class="diagram-container diagram-error" role="alert">
|
|
4
|
+
Malformed SVG: unclosed element</div>`;let t=se(e.svg);return t=gr(t),`<div class="diagram-container diagram-svg" tabindex="0"
|
|
5
|
+
role="figure" aria-label="SVG diagram">
|
|
6
|
+
${t}
|
|
7
|
+
<button class="diagram-save-btn" type="button"
|
|
8
|
+
aria-label="Save as image" title="Save">${C.download}</button>
|
|
9
|
+
<button class="diagram-copy-btn" type="button"
|
|
10
|
+
aria-label="Copy source" title="Copy">${C.copy}</button>
|
|
11
|
+
<button class="diagram-zoom-btn" type="button"
|
|
12
|
+
aria-label="Expand diagram" title="Expand">⤢</button>
|
|
13
|
+
</div>`}function wr(e,t){for(let n of t){let t=`<div\\b[^>]*?\\bdata-jaw-svg="${n.id}"[^>]*></div>`,r=new RegExp(t,`g`),i=Cr(n);e=e.replace(r,()=>i)}return e}function Tr(e){(e||document).querySelectorAll(`.diagram-zoom-btn, .mermaid-zoom-btn`).forEach(e=>{e.dataset.bound||(e.dataset.bound=`1`,e.addEventListener(`click`,()=>{if(e.closest(`.diagram-widget`))return;let t=e.closest(`.diagram-container`),n=e.closest(`.mermaid-container`),r=t||n;if(!r)return;let i=r.cloneNode(!0);i.querySelectorAll(`.diagram-zoom-btn, .mermaid-zoom-btn, .diagram-copy-btn, .diagram-save-btn, .mermaid-copy-btn, .mermaid-save-btn`).forEach(e=>e.remove());let a=n&&!t?`mermaid`:`inline-svg`;Er(i.innerHTML,a)}))})}function Er(e,t=`inline-svg`){let n=document.activeElement,r=document.createElement(`div`);r.className=`diagram-overlay`,r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-label`,`Expanded diagram`);let i=se(e);r.innerHTML=[`<div class="`,t===`inline-svg`?`diagram-overlay-content diagram-svg-overlay`:`diagram-overlay-content`,`">`,i,`</div>`,`<button class="diagram-overlay-close" type="button" aria-label="Close">✕</button>`].join(``),r.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 a=r.querySelector(`.diagram-overlay-close`),o=()=>{r.remove(),document.removeEventListener(`keydown`,s),n&&n.isConnected&&n.focus()},s=e=>{if(e.key===`Escape`){o();return}if(e.key===`Tab`){let t=r.querySelectorAll(`button, [href], [tabindex]:not([tabindex="-1"])`);if(t.length===0)return;let n=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),n.focus())}};a.addEventListener(`click`,o),document.addEventListener(`keydown`,s),document.body.appendChild(r),a.focus()}var Dr=!1;function Or(){Dr||(Dr=!0,m.registerLanguage(`javascript`,a),m.registerLanguage(`js`,a),m.registerLanguage(`typescript`,ae),m.registerLanguage(`ts`,ae),m.registerLanguage(`python`,ie),m.registerLanguage(`py`,ie),m.registerLanguage(`bash`,r),m.registerLanguage(`shell`,l),m.registerLanguage(`sh`,l),m.registerLanguage(`json`,u),m.registerLanguage(`css`,p),m.registerLanguage(`xml`,te),m.registerLanguage(`html`,te),m.registerLanguage(`markdown`,c),m.registerLanguage(`md`,c),m.registerLanguage(`yaml`,s),m.registerLanguage(`yml`,s),m.registerLanguage(`sql`,re),m.registerLanguage(`rust`,f),m.registerLanguage(`rs`,f),m.registerLanguage(`go`,o),m.registerLanguage(`java`,ne),m.registerLanguage(`cpp`,ee),m.registerLanguage(`c`,ee),m.registerLanguage(`diff`,i),m.registerLanguage(`plaintext`,d),m.registerLanguage(`text`,d))}function kr(e,t){if(Or(),t&&m.getLanguage(t))try{return m.highlight(e,{language:t}).value}catch{return b(e)}try{return m.highlightAuto(e).value}catch{return b(e)}}function Ar(e){Or(),(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&&m.getLanguage(t)?e.innerHTML=m.highlight(n,{language:t}).value:e.innerHTML=m.highlightAuto(n).value,e.dataset.highlighted=`yes`}catch{}})}var T=null,E=Promise.resolve();async function jr(){return T||=(await g(()=>import(`./mermaid-loader-Bd9rYyxD.js`),__vite__mapDeps([0]))).loadMermaid(),T}function D(){T.initialize(de())}var Mr=0;async function Nr(){let e=document.querySelectorAll(`.mermaid-rendered`);e.length&&(E=E.then(async()=>{let t=await jr();for(let n of e){let e=n,r=e.dataset.mermaidCode;if(!r||!e.isConnected)continue;let i=fe(r),a=`mermaid-${++Mr}`;try{D();let n;try{({svg:n}=await t.render(a,i))}catch{let e=le(i);if(!e)continue;D(),{svg:n}=await t.render(`${a}-retry`,e)}if(!e.isConnected)continue;e.innerHTML=ue(n);let r=e.closest(`.mermaid-container`);r&&r.classList.toggle(`mermaid-type-wide`,ce(i)),_r(e),Tr(e)}catch{}}}).catch(e=>{console.error(`[mermaid:queue] rerender failed, keeping queue alive:`,e)}),await E)}var O=null;function Pr(){O||=new IntersectionObserver(e=>{for(let t of e){if(!t.isIntersecting)continue;let e=t.target;e.classList.contains(`mermaid-pending`)&&(O.unobserve(e),Lr(e))}},{rootMargin:`200px`})}function Fr(e,t,n){e.classList.remove(`mermaid-rendered`),e.innerHTML=`
|
|
14
|
+
<div class="mermaid-error">
|
|
15
|
+
<div class="mermaid-error-title">${C.warning} ${b(y(`mermaid.renderFail`)||`Mermaid render failed`)}</div>
|
|
16
|
+
<div class="mermaid-error-msg">${b(n.slice(0,200))}</div>
|
|
17
|
+
<pre class="mermaid-error-code"><code>${b(t)}</code></pre>
|
|
18
|
+
</div>`}async function Ir(e){if(!e.isConnected){delete e.dataset.mermaidQueued,delete e.dataset.mermaidInflight;return}e.classList.remove(`mermaid-pending`);let t=e.dataset.mermaidCodeRaw||``,n=fe(t?decodeURIComponent(t):e.textContent||``);e.dataset.mermaidCode=n;let r=`mermaid-${++Mr}`;e.dataset.mermaidInflight=`1`;try{let t=await jr();D();let i;try{({svg:i}=await t.render(r,n))}catch(e){let a=le(n);if(!a)throw e;D(),{svg:i}=await t.render(`${r}-retry`,a)}if(!e.isConnected)return;e.innerHTML=ue(i),e.classList.add(`mermaid-rendered`);let a=e.closest(`.mermaid-container`);a&&a.classList.toggle(`mermaid-type-wide`,ce(n)),delete e.dataset.mermaidCodeRaw,_r(e),Tr(e)}catch(t){Fr(e,n,t?.message||t?.str||`Unknown error`)}finally{delete e.dataset.mermaidQueued,delete e.dataset.mermaidInflight}}function Lr(e){e.dataset.mermaidQueued!==`1`&&(e.dataset.mermaidQueued=`1`,E=E.then(()=>Ir(e)).catch(e=>{console.error(`[mermaid:queue] render failed, keeping queue alive:`,e)}))}async function Rr(e,t={}){let n=(e||document).querySelectorAll(`.mermaid-pending`);if(n.length){Pr();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){O.unobserve(e),Lr(e);continue}}O.observe(e)}}}function zr(e){if(!O)return;let t=[`.mermaid-pending`,`[data-mermaid-queued="1"]`,`[data-mermaid-inflight="1"]`].join(`,`),n=[];e.matches(t)&&n.push(e),e.querySelectorAll(t).forEach(e=>n.push(e));for(let e of n)O.unobserve(e),delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt,delete e.dataset.mermaidInflight,!e.classList.contains(`mermaid-rendered`)&&(e.dataset.mermaidCodeRaw||e.dataset.mermaidCode)&&e.classList.add(`mermaid-pending`)}function Br(){if(T)return;let e=()=>{jr().catch(()=>{})};typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:2e3}):setTimeout(e,500)}function k(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function A(){if(window.parent===window)return null;try{let e=window.parent.location.origin;if(e&&e!==`null`&&k(e))return e}catch{}if(Wr)return Wr;try{if(document.referrer){let e=new URL(document.referrer).origin;if(k(e))return e}}catch{}return null}var j=!1,Vr=!1,Hr=!1,Ur=!1,Wr=null,M=new Set;function Gr(){return j}function Kr(e){k(e)&&(Wr=e)}function qr(e){for(let t of M)t(e);M.clear()}function Jr(){let e=A()||`*`;try{return window.parent.postMessage({type:`jaw-preview-capabilities-request`},e),!0}catch{return!1}}function Yr(){Hr||(Hr=!0,window.addEventListener(`message`,e=>{if(e.source!==window.parent||!k(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-capabilities`||(Kr(e.origin),j=t.docPanel===!0,Vr=!0,qr(j))}),Jr())}function Xr(e=180){return Yr(),j||Vr?Promise.resolve(j):Jr()?new Promise(t=>{let n=!1,r=e=>{n||(n=!0,M.delete(r),window.clearTimeout(i),t(e))},i=window.setTimeout(()=>r(j),e);M.add(r)}):Promise.resolve(!1)}function Zr(e){return e instanceof HTMLInputElement?[`text`,`search`,`url`,`tel`,`email`,`password`].includes(e.type):!1}function Qr(e){if(!e)return null;if(e instanceof HTMLTextAreaElement||Zr(e))return e;let t=e.closest(`[contenteditable="true"]`);return t instanceof HTMLElement?t:null}function $r(e){return e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement?!e.disabled&&!e.readOnly:e.isContentEditable}function ei(e){if(!$r(e))return!1;if(e===document.activeElement)return!0;let t=window.getComputedStyle(e);if(t.display===`none`||t.visibility===`hidden`||t.visibility===`collapse`)return!1;let n=e.getBoundingClientRect();return n.width>0&&n.height>0}function ti(){let e=Qr(document.activeElement);if(e&&ei(e))return e;let t=[`#chatInput`,`textarea.chat-input`,`textarea[data-chat-input="true"]`,`textarea[aria-label*="chat" i]`,`textarea[placeholder*="message" i]`,`textarea[placeholder*="메시지" i]`,`textarea[placeholder*="입력" i]`,`textarea`,`input[type="text"]`,`input[type="search"]`,`input:not([type])`,`[contenteditable="true"]`],n=new Set;for(let e of t)for(let t of document.querySelectorAll(e)){if(n.has(t))continue;n.add(t);let e=Qr(t);if(e&&ei(e))return e}return null}function ni(e,t){if(e instanceof HTMLTextAreaElement||Zr(e)){if(!$r(e))return!1;let n=document.activeElement===e,r=n?e.selectionStart??e.value.length:e.value.length,i=n?e.selectionEnd??r:r;return e.setRangeText(t,r,i,`end`),e.dispatchEvent(new InputEvent(`input`,{bubbles:!0,inputType:`insertText`,data:t})),e.focus(),!0}let n=e.closest(`[contenteditable="true"]`);if(!(n instanceof HTMLElement)||!$r(n))return!1;let r=window.getSelection(),i=null;if(r&&r.rangeCount>0){let e=r.getRangeAt(0);n.contains(e.commonAncestorContainer)&&(i=e)}i||(i=document.createRange(),i.selectNodeContents(n),i.collapse(!1)),i.deleteContents();let a=document.createTextNode(t);return i.insertNode(a),i.setStartAfter(a),i.setEndAfter(a),r?.removeAllRanges(),r?.addRange(i),n.dispatchEvent(new InputEvent(`input`,{bubbles:!0,inputType:`insertText`,data:t})),n.focus(),!0}function ri(){Ur||(Ur=!0,window.addEventListener(`message`,e=>{if(!k(e.origin))return;let t=e.data;if(!t||t.type!==`jaw-preview-insert-text`)return;Kr(e.origin);let n=typeof t.requestId==`string`?t.requestId:``,r=typeof t.text==`string`?t.text:``,i=(t,r)=>{n&&window.parent.postMessage({type:`jaw-preview-insert-text-result`,requestId:n,ok:t,...r?{error:r}:{}},e.origin)};if(!n||!r){i(!1,`invalid insert request`);return}let a=ti();if(!a||!ni(a,r)){i(!1,`no editable target`);return}i(!0)}))}function ii(e){let t=A();return!t||!e.trim()?!1:(window.parent.postMessage({type:`jaw-preview-open-notes`,path:e},t),!0)}function ai(e){let t=A();return!t||!e.trim()?!1:(window.parent.postMessage({type:`jaw-preview-open-doc`,path:e},t),!0)}function oi(e,t){let n=A();return!n||e.length===0?!1:(window.parent.postMessage({type:`dashboard.invalidate`,topics:e,reason:t},n),!0)}var si=new Set([`.git`,`.assets`,`_templates`,`_snippets`,`_plugins`]),ci=`.md`;function N(e){return e.replace(/\\/g,`/`).trim()}function li(e){let t=e.split(`/`)[0]??``;return si.has(t)}function ui(e){return!(!e||e.startsWith(`/`)||e.includes(`..`)||!e.endsWith(ci)||li(e))}function di(e,t){let n=N(e),r=N(t).replace(/\/+$/,``);if(!r||n===r)return null;let i=`${r}/`;if(!n.startsWith(i))return null;let a=n.slice(i.length);return ui(a)?a:null}function fi(e){let t=N(e),n=t.match(/^(\/Users\/[^/]+)/);if(n)return n[1];let r=t.match(/^(\/home\/[^/]+)/);return r?r[1]:null}function pi(e,t){if(!e.startsWith(`~/`))return e;let n=fi(t);return n?`${n}/${e.slice(2)}`:e}function mi(e,t){let n=N(e);return n?t&&!n.startsWith(`~/`)&&ui(n)?n:t&&di(pi(n,t),t)||null:null}var hi=/(?:~\/[^\s)`\]"'<>]+|\/(?:Users|home|tmp|var|opt|private)\/[^\s)`\]"'<>]+)/g,gi=/(?:^|[\s([{"'`])([A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*\.md)\b/g,_i=/[.,!?:;]+$/,vi=/^(?:~\/|\/(?:Users|home|tmp|var|opt|private)\/)/,yi=/\.(ts|tsx|js|jsx|py|rs|go|java|cpp|c|css|html|htm|xml|json|yaml|yml|sh|bash|sql)$/i,bi=/\.(md|mdx)$/i,P,xi=null;function Si(e){return vi.test(e)}function Ci(e){if(Si(e))return e;try{let t=new URL(e,window.location.href);if(t.origin!==window.location.origin||t.pathname!==`/api/file/open`)return null;let n=t.searchParams.get(`path`)??``;return Si(n)?n:null}catch{return null}}function wi(e){try{let t=new URL(e,window.location.href);return t.protocol!==`http:`&&t.protocol!==`https:`||t.username||t.password?!1:t.origin!==window.location.origin}catch{return!1}}function Ti(e){e.target=`_blank`;let t=new Set(e.rel.split(/\s+/).filter(Boolean));t.add(`noopener`),t.add(`noreferrer`),e.rel=[...t].join(` `)}async function Ei(){return P===void 0?A()?(xi||=oe(`/api/dashboard/notes/info`,`GET`,null).then(e=>typeof e?.root==`string`?e.root:null).catch(()=>null).then(e=>(P=e,e)),xi):(P=null,null):P}function Di(e,t){t&&t.classList.add(`opening`),oe(`/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 Oi(e,t,n){let r=document.createElement(`span`);r.className=`file-path-link`,r.setAttribute(`data-file-path`,t),n&&r.setAttribute(`data-vault-rel`,n),r.setAttribute(`role`,`button`),r.setAttribute(`tabindex`,`0`);let i=t.split(`/`).pop()||t,a=/\.\w{1,10}$/.test(i);r.textContent=a?i:t,a&&(r.title=t),e.appendChild(r)}function ki(e){hi.lastIndex=0;let t=[],n;for(;n=hi.exec(e);){let e=n[0],r=e.replace(_i,``);r.length<4||t.push({index:n.index,raw:e,clean:r})}return t}function Ai(e){gi.lastIndex=0;let t=[],n;for(;n=gi.exec(e);){let e=n[0].slice(0,n[0].length-n[1].length),r=n[1],i=n.index+e.length;t.push({index:i,raw:r,clean:r})}return t}function ji(e,t){let n=[...e,...t].sort((e,t)=>e.index-t.index),r=[],i=-1;for(let e of n)e.index<i||(r.push(e),i=e.index+e.raw.length);return r}function Mi(e,t=null){let n=new Set([`PRE`,`A`,`BUTTON`,`TEXTAREA`,`INPUT`,`SCRIPT`,`STYLE`]),r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(t){let r=t.parentElement;for(;r&&r!==e;){if(n.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}}),i=new Map,a;for(;a=r.nextNode();){let e=a.textContent||``,n=ji(ki(e),t?Ai(e):[]);n.length&&i.set(a,n)}for(let[e,n]of i){let r=e.textContent||``,i=e.parentNode;if(!i)continue;let a=document.createDocumentFragment(),o=0;for(let{index:e,raw:i,clean:s}of n){e>o&&a.appendChild(document.createTextNode(r.slice(o,e))),Oi(a,s,mi(s,t));let n=i.slice(s.length);n&&a.appendChild(document.createTextNode(n)),o=e+i.length}o<r.length&&a.appendChild(document.createTextNode(r.slice(o))),i.replaceChild(a,e)}}async function Ni(e){Mi(e,await Ei())}async function Pi(e,t){let n=await Ei(),r=t.getAttribute(`data-vault-rel`)||mi(e,n);if(r&&A()&&ii(r)){t.classList.add(`opened`),setTimeout(()=>t.classList.remove(`opened`),1500);return}if((bi.test(e)||yi.test(e))&&(Gr()||await Xr())&&A()&&ai(e)){t.classList.add(`opened`),setTimeout(()=>t.classList.remove(`opened`),1500);return}Di(e,t)}var Fi=!1;function Ii(){Fi||(Fi=!0,Yr(),document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`a`),r=n?.getAttribute(`href`)||``;if(n&&wi(r)){Ti(n);return}let i=n?Ci(r):null;if(n&&i){e.preventDefault(),n.classList.add(`file-path-link`),Pi(i,n);return}let a=t?.closest(`.file-path-link`);if(!a)return;let o=a.getAttribute(`data-file-path`);o&&(e.preventDefault(),Pi(o,a))},!0),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())},!0))}function F(e){return typeof e==`string`?e.trim():``}function Li(e){try{return JSON.parse(e)}catch{return null}}function Ri(e){let t=F(e);return t===`multi_select`||t===`multi`||t===`checkbox`?`multi_select`:t===`rank_priorities`||t===`rank`||t===`ranking`?`rank_priorities`:`single_select`}function zi(e){return Array.isArray(e)?e.map((e,t)=>{if(typeof e==`string`){let n=e.trim();return n?{id:`option_${t+1}`,value:n,label:n,description:``,submitText:``}:null}if(!e||typeof e!=`object`)return null;let n=e,r=F(n.label)||F(n.text)||F(n.value)||F(n.id);if(!r)return null;let i=F(n.value)||r;return{id:F(n.id)||i||`option_${t+1}`,value:i,label:r,description:F(n.description),submitText:F(n.submitText)}}).filter(e=>!!e):[]}function Bi(e){if(!e||typeof e!=`object`||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){let e=n.trim();if(!e)continue;let i=Array.isArray(r)?r.map(F).filter(Boolean):[F(r)].filter(Boolean);i.length>0&&(t[e]=i)}return t}function Vi(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=F(n.question)||F(n.title)||F(n.prompt);return r?{id:F(n.id)||`q${t+1}`,type:Ri(n.type),question:r,options:zi(n.options),visibleWhen:Bi(n.visibleWhen)}:null}function Hi(e){if(!e||typeof e!=`object`)return null;let t=e,n=(Array.isArray(t.questions)?t.questions:[{question:t.question,options:t.options,type:t.type}]).map((e,t)=>Vi(e,t)).filter(e=>!!e);return n.length>0?{questions:n}:null}function Ui(e){return Hi(Li(e))}function Wi(e){let t=[];for(let n of e.matchAll(/^ {0,3}```(?:elicitation|choice-buttons)[^\n]*\n([\s\S]*?)^ {0,3}```/gm)){let e=n[1]?.trim();e&&t.push(e)}return t}var Gi=`jaw:elicitation:complete`,Ki=`구조화 질문 응답:`;function qi(e){return Array.isArray(e)?`[${e.map(qi).join(`,`)}]`:e&&typeof e==`object`?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${qi(e[t])}`).join(`,`)}}`:JSON.stringify(e)}function Ji(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Yi(){let e=typeof window>`u`?`unknown`:`${window.location.origin}${window.location.pathname}`,t=`default`;try{t=localStorage.getItem(`clijaw_scope`)||`default`}catch{}return Ji(`${e}::${t}`)}function Xi(e){return Ji(qi(e))}function Zi(e){return`${Gi}:${Yi()}:${e.turnIndex}:${e.blockIndex}:${Xi(e.spec)}`}function Qi(e,t){let n=e.closest(`.msg`),r=n?.dataset.turnIndex||``,i=Number(r);if(!Number.isFinite(i)||i<0)return null;let a=e.closest(`.msg-content`)||n,o=a?Array.from(a.querySelectorAll(`.elicitation-pending, .elicitation-block`)):[e];return Zi({turnIndex:i,blockIndex:Math.max(0,o.indexOf(e)),spec:t})}function $i(e){if(!e)return!1;try{return localStorage.getItem(e)===`1`}catch{return!1}}function ea(e){if(e)try{localStorage.setItem(e,`1`)}catch{}}function ta(e){return e===`assistant`||e===`agent`}function na(e){return e?.role===`user`&&e.content.includes(Ki)}function ra(e,t){return t.questions.some(t=>e.includes(t.question))}function ia(e){e.forEach((t,n)=>{if(!ta(t.role))return;let r=e[n+1];na(r)&&Wi(t.content).forEach((e,t)=>{let i=Ui(e);!i||!ra(r.content,i)||ea(Zi({turnIndex:n,blockIndex:t,spec:i}))})})}var aa=`.elicitation-pending`,oa=`.elicitation-block`,I=`submitting`,sa=`위 응답을 기준으로 계속 진행해줘.`,L=new WeakMap,ca=null,la=0;function R(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function ua(e,t){let n=encodeURIComponent(e);return`<div class="elicitation-pending" data-elicitation-kind="${R(t)}" data-elicitation-spec="${R(n)}" role="status" aria-label="Structured question loading">
|
|
19
|
+
<div class="elicitation-loading">질문을 준비하는 중...</div>
|
|
20
|
+
</div>`}function da(e){let t=[];return e instanceof HTMLElement&&e.matches(aa)&&t.push(e),t.push(...Array.from(e.querySelectorAll(aa))),t}function fa(e=document){for(let t of da(e)){if(t.dataset.elicitationHydrated===`true`)continue;let e=t.dataset.elicitationSpec||``,n=``;try{n=decodeURIComponent(e)}catch{n=``}let r=Ui(n);if(t.dataset.elicitationHydrated=`true`,!r){console.warn(`[elicitation] invalid structured question spec`,{kind:t.dataset.elicitationKind||``,decodedChars:n.length,reason:n?`parse_or_normalize_failed`:`empty_spec`}),t.className=`elicitation-block elicitation-error`,t.innerHTML=`<div class="elicitation-error-text">질문 형식을 읽을 수 없습니다.</div>`;continue}let i=Qi(t,r);if(t.dataset.elicitationCompletionKey=i||``,$i(i)){Da(t);continue}let a={spec:r,index:0,answers:[]};L.set(t,a),ya(t,a)}}function pa(e){let t=L.get(e);if(!t)return;let n=t.spec.questions[t.index];if(!n){ka(e,t);return}let r=t.spec.questions.length,i=e.id||`elicitation-${++la}`;e.id=i,e.className=`elicitation-block`,e.dataset.elicitationState=`active`,e.innerHTML=`
|
|
21
|
+
<div class="elicitation-top">
|
|
22
|
+
<div class="elicitation-progress">Q${t.index+1} ${t.index+1}/${r}</div>
|
|
23
|
+
<button class="elicitation-skip" type="button" data-elicitation-action="skip">skip</button>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="elicitation-question" id="${R(i)}-question">${b(n.question)}</div>
|
|
26
|
+
<div class="elicitation-options" role="group" aria-labelledby="${R(i)}-question">
|
|
27
|
+
${n.options.map(e=>ma(n,e)).join(``)}
|
|
28
|
+
</div>
|
|
29
|
+
${n.type===`multi_select`?`<button class="elicitation-submit" type="button" data-elicitation-action="submit-multi">선택 완료</button>`:``}
|
|
30
|
+
<div class="elicitation-input-row">
|
|
31
|
+
<input class="elicitation-input" type="text" placeholder="직접 입력" aria-label="직접 입력">
|
|
32
|
+
<button class="elicitation-submit" type="button" data-elicitation-action="submit-custom">입력</button>
|
|
33
|
+
</div>`}function ma(e,t){let n=e.type===`multi_select`?` aria-pressed="false"`:``,r=t.description?`<span class="elicitation-option-description">${b(t.description)}</span>`:``;return`<button class="elicitation-option" type="button" data-elicitation-action="select-option" data-option-id="${R(t.id)}"${n}>
|
|
34
|
+
<span class="elicitation-option-label">${b(t.label)}</span>${r}
|
|
35
|
+
</button>`}function ha(e){return e instanceof HTMLElement?e.closest(oa):null}function z(e){return e.spec.questions[e.index]||null}function ga(e,t){return z(e)?.options.find(e=>e.id===t)||null}function _a(e){let t=new Map;for(let n of e.answers)n&&t.set(n.question.id,n);return t}function va(e,t){for(let[n,r]of Object.entries(e.visibleWhen)){let e=t.get(n);if(!e||e.skipped||!e.values.some(e=>r.includes(e)))return!1}return!0}function ya(e,t){for(;t.index<t.spec.questions.length;){let e=z(t);if(!e||va(e,_a(t)))break;t.index+=1}pa(e)}function B(e,t){let n=L.get(e),r=n?z(n):null;!n||!r||e.dataset.elicitationState===I||(n.answers[n.index]={question:r,...t},n.index+=1,ya(e,n))}function ba(e,t,n){let r=ga(n,e.dataset.optionId||``),i=z(n);if(!(!r||!i)){if(i.type===`multi_select`){let t=e.getAttribute(`aria-pressed`)!==`true`;e.setAttribute(`aria-pressed`,String(t)),e.classList.toggle(`is-selected`,t);return}B(t,{skipped:!1,values:[r.value],labels:[r.submitText||r.label]})}}function xa(e,t){let n=Array.from(e.querySelectorAll(`.elicitation-option[aria-pressed="true"]`)).map(e=>ga(t,e.dataset.optionId||``)).filter(e=>!!e);n.length!==0&&B(e,{skipped:!1,values:n.map(e=>e.value),labels:n.map(e=>e.submitText||e.label)})}function Sa(e){let t=e.querySelector(`.elicitation-input`),n=t?.value.trim()||``;if(!n){t?.focus();return}B(e,{skipped:!1,values:[n],labels:[n]})}function Ca(e){let t=e.target instanceof HTMLElement?e.target.closest(`[data-elicitation-action]`):null;if(!t)return;let n=ha(t),r=n?L.get(n):null;if(!n||!r||n.dataset.elicitationState===I)return;e.preventDefault();let i=t.dataset.elicitationAction;i===`select-option`&&ba(t,n,r),i===`submit-multi`&&xa(n,r),i===`submit-custom`&&Sa(n),i===`skip`&&B(n,{skipped:!0,values:[],labels:[`skip`]})}function wa(e){if(e.key!==`Enter`)return;let t=e.target;if(!(t instanceof HTMLElement)||t.tagName!==`INPUT`||!t.classList.contains(`elicitation-input`))return;let n=ha(t);n&&(e.preventDefault(),Sa(n))}function Ta(e){return e.filter(e=>!!e)}function Ea(e){return`구조화 질문 응답:\n\n${Ta(e).map(e=>{let t=e.skipped?`skip`:e.labels.join(`, `),n=e.values.length>0?` (값: ${e.values.join(`, `)})`:``;return`- ${e.question.question}: ${t}${n}`}).join(`
|
|
36
|
+
`)}\n\n${sa}`}function Da(e){e.className=`elicitation-block elicitation-complete`,e.dataset.elicitationState=`complete`,e.innerHTML=`<div class="elicitation-complete-row"><button class="elicitation-complete-button" type="button" disabled>응답 완료</button></div>`}function Oa(e,t){return new(e.ownerDocument.defaultView?.Event||Event)(t,{bubbles:!0})}function ka(e,t){if(e.dataset.elicitationState===I)return;e.dataset.elicitationState=I;let n=document.getElementById(`chatInput`);if(!n){e.classList.add(`elicitation-error`),e.innerHTML=`<div class="elicitation-error-text">입력창을 찾을 수 없습니다.</div>`;return}n.value=Ea(t.answers),n.dispatchEvent(Oa(n,`input`)),n.dispatchEvent(Oa(n,`cmd-execute`)),ea(e.dataset.elicitationCompletionKey||null),L.delete(e),Da(e)}function Aa(){ca!==document&&(document.addEventListener(`click`,Ca),document.addEventListener(`keydown`,wa),ca=document)}var ja=`.search-results-pending`,Ma=10,Na=240;function Pa(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function V(e,t=Na){let n=typeof e==`string`?e.trim().replace(/\s+/g,` `):``;return n.length>t?`${n.slice(0,t-1)}…`:n}function Fa(e){let t=e.replace(/^\[|\]$/g,``).toLowerCase();return t===`localhost`||t.endsWith(`.localhost`)||t.endsWith(`.local`)||/^0\./.test(t)||/^10\./.test(t)||/^127\./.test(t)||/^169\.254\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^192\.168\./.test(t)||/^::1$/.test(t)}function Ia(e){let t=typeof e==`string`?e.trim():``;if(!t)return``;try{let e=new URL(t);return![`http:`,`https:`].includes(e.protocol)||e.username||e.password||Fa(e.hostname)?``:e.href}catch{return``}}function La(e){try{return JSON.parse(e)}catch{return null}}function Ra(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.schemaVersion!==`search-results-v1`)return null;let n=V(t.query,160),r=Array.isArray(t.results)?t.results:[],i=new Set,a=[];for(let e of r){if(!e||typeof e!=`object`)continue;let t=e,n=Ia(t.url||t.link);if(!n||i.has(n))continue;i.add(n);let r=V(t.title,160)||new URL(n).hostname;if(a.push({title:r,url:n,snippet:V(t.snippet||t.description),source:V(t.source,80)||new URL(n).hostname}),a.length>=Ma)break}return!n&&a.length===0?null:{schemaVersion:`search-results-v1`,query:n,results:a}}function za(e){return`<div class="search-results-pending" data-search-results-kind="search-results" data-search-results-spec="${Pa(encodeURIComponent(e))}" role="status" aria-label="Search results loading">
|
|
37
|
+
<div class="search-results-loading">검색 결과를 준비하는 중...</div>
|
|
38
|
+
</div>`}function Ba(e){let t=[];return e instanceof HTMLElement&&e.matches(ja)&&t.push(e),t.push(...Array.from(e.querySelectorAll(ja))),t}function Va(e){let t=e.results.length===0?`<div class="search-results-empty">표시할 검색 결과가 없습니다.</div>`:``,n=e.results.map((e,t)=>`
|
|
39
|
+
<a class="search-result-card" href="${Pa(e.url)}" target="_blank" rel="noopener noreferrer">
|
|
40
|
+
<span class="search-result-index">${t+1}</span>
|
|
41
|
+
<span class="search-result-body">
|
|
42
|
+
<span class="search-result-title">${b(e.title)}</span>
|
|
43
|
+
${e.snippet?`<span class="search-result-snippet">${b(e.snippet)}</span>`:``}
|
|
44
|
+
<span class="search-result-source">${b(e.source)}</span>
|
|
45
|
+
</span>
|
|
46
|
+
</a>`).join(``);return`
|
|
47
|
+
<div class="search-results-header">
|
|
48
|
+
<div class="search-results-title">Search Results</div>
|
|
49
|
+
${e.query?`<div class="search-results-query">${b(e.query)}</div>`:``}
|
|
50
|
+
</div>
|
|
51
|
+
<div class="search-results-list">${n}${t}</div>`}function Ha(e=document){for(let t of Ba(e)){if(t.dataset.searchResultsHydrated===`true`)continue;t.dataset.searchResultsHydrated=`true`;let e=t.dataset.searchResultsSpec||``,n=``;try{n=decodeURIComponent(e)}catch{n=``}delete t.dataset.searchResultsSpec;let r=Ra(La(n));if(!r){console.warn(`[search-results] invalid search result spec`,{decodedChars:n.length}),t.className=`search-results-block search-results-error`,t.innerHTML=`<div class="search-results-error-text">검색 결과 형식을 읽을 수 없습니다.</div>`;continue}t.className=`search-results-block`,t.innerHTML=Va(r)}}var Ua=`.compose-block-pending`,Wa=`.compose-block`,Ga=120,Ka=180,H=2e4,qa=4e3,Ja=3,U=new WeakMap,Ya=null;function Xa(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function W(e,t){let n=typeof e==`string`?e.trim():``;return n.length>t?n.slice(0,t):n}function Za(e,t){if(!Array.isArray(e))return[];let n=[],r=0;for(let i of e){let e=typeof i==`string`?i.trim():``;if(!e)continue;let a=t-r;if(a<=0)break;let o=e.length>a?e.slice(0,a):e;n.push(o),r+=o.length}return n}function Qa(e){let t=W(e.body,H);if(t)return t;let n=Za(e.paragraphs,H);if(n.length>0)return n.join(`
|
|
52
|
+
|
|
53
|
+
`);let r=Za(e.bodyLines,H);return r.length>0?r.join(`
|
|
54
|
+
`):``}function $a(e){let t=typeof e==`string`?e.trim():``;return t===`email`||t===`message`||t===`document`||t===`other`?t:t===`textMessage`?`message`:`other`}function eo(e){try{return JSON.parse(e)}catch{return null}}function to(e){return encodeURIComponent(JSON.stringify(e))}function no(e){let t=e.dataset.composeBlockSpec||``,n=``;try{n=decodeURIComponent(t)}catch{n=``}return io(eo(n))}function ro(e,t,n){if(!e||typeof e!=`object`)return null;let r=e,i=Qa(r);if(!i)return null;let a=W(r.label,40)||`Variant ${t+1}`;return{id:W(r.id,60)||`variant_${t+1}`,label:a,subject:W(r.subject,Ka)||n,body:i}}function io(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.schemaVersion!==`compose-block-v1`)return null;let n=$a(t.kind),r=W(t.subject,Ka),i=(Array.isArray(t.variants)?t.variants:[]).map((e,t)=>ro(e,t,r)).filter(e=>!!e).slice(0,Ja);return i.length===0?null:{schemaVersion:`compose-block-v1`,kind:n,title:W(t.title,Ga)||`Draft`,subject:r,variants:i}}function ao(e){return`<div class="compose-block-pending" data-compose-block-kind="compose-block" data-compose-block-spec="${Xa(encodeURIComponent(e))}" role="status" aria-label="Compose block loading">
|
|
55
|
+
<div class="compose-loading">초안을 준비하는 중...</div>
|
|
56
|
+
</div>`}function oo(e){let t=[];return e instanceof HTMLElement&&e.matches(Ua)&&t.push(e),t.push(...Array.from(e.querySelectorAll(Ua))),t}function so(e){let t=[],n=`${Wa}[data-compose-block-spec]`;return e instanceof HTMLElement&&e.matches(n)&&t.push(e),t.push(...Array.from(e.querySelectorAll(n))),t}function co(e){return e===`email`?`Email`:e===`message`?`Message`:e===`document`?`Document`:`Draft`}function lo(e){return e===`document`?`Title`:e===`message`?`Topic`:`Subject`}function uo(e){return e.variants.map((e,t)=>`<button class="compose-tab${t===0?` is-active`:``}" type="button" data-compose-action="variant" data-variant-id="${Xa(e.id)}" aria-pressed="${t===0?`true`:`false`}">${b(e.label)}</button>`).join(``)}function fo(e){let t=e.variants[0],n=e.kind===`email`?`<button class="compose-btn" type="button" data-compose-action="mail">Open in Mail</button>`:e.kind===`message`?`<button class="compose-btn" type="button" data-compose-action="sms">Open in Messages</button>`:``;return`
|
|
57
|
+
<div class="compose-block-header">
|
|
58
|
+
<div class="compose-title">${b(e.title)}</div>
|
|
59
|
+
<div class="compose-kind">${b(co(e.kind))}</div>
|
|
60
|
+
</div>
|
|
61
|
+
<label class="compose-subject-row">
|
|
62
|
+
<span>${b(lo(e.kind))}</span>
|
|
63
|
+
<input class="compose-subject-input" type="text" value="${Xa(t.subject||e.subject)}" maxlength="${Ka}">
|
|
64
|
+
</label>
|
|
65
|
+
<div class="compose-tabs" role="group" aria-label="Draft variants">${uo(e)}</div>
|
|
66
|
+
<textarea class="compose-body" rows="8" maxlength="${H}">${b(t.body)}</textarea>
|
|
67
|
+
<div class="compose-actions">
|
|
68
|
+
<button class="compose-btn" type="button" data-compose-action="copy">Copy</button>
|
|
69
|
+
${n}
|
|
70
|
+
</div>
|
|
71
|
+
<div class="compose-followup">
|
|
72
|
+
<label class="compose-followup-row">
|
|
73
|
+
<span>Prompt</span>
|
|
74
|
+
<textarea class="compose-followup-input" rows="2" maxlength="${qa}" placeholder="추가 요청을 입력하세요. Cmd/Ctrl+Enter로 보낼 수 있습니다."></textarea>
|
|
75
|
+
</label>
|
|
76
|
+
<div class="compose-followup-actions">
|
|
77
|
+
<div class="compose-followup-error" role="alert" aria-live="polite"></div>
|
|
78
|
+
<button class="compose-btn compose-send-btn" type="button" data-compose-action="send-followup">Send</button>
|
|
79
|
+
</div>
|
|
80
|
+
</div>`}function po(e=document){for(let t of oo(e)){if(t.dataset.composeBlockHydrated===`true`)continue;t.dataset.composeBlockHydrated=`true`;let e=no(t);if(!e){console.warn(`[compose-block] invalid compose block spec`),delete t.dataset.composeBlockSpec,t.className=`compose-block compose-error`,t.innerHTML=`<div class="compose-error-text">초안 형식을 읽을 수 없습니다. compose-block은 strict JSON이어야 하며 문자열 안 줄바꿈은 \\n으로 escape해야 합니다.</div>`;continue}t.className=`compose-block`,t.dataset.composeBlockSpec=to(e),U.set(t,e),t.innerHTML=fo(e)}for(let t of so(e)){if(U.has(t))continue;let e=no(t);e&&U.set(t,e)}}function mo(e){return e instanceof HTMLElement?e.closest(Wa):null}function ho(e){return{subject:e.querySelector(`.compose-subject-input`)?.value||``,body:e.querySelector(`.compose-body`)?.value||``}}function go(e){let t=(e.querySelector(`.compose-followup-input`)?.value||``).trim();return t.length>qa?t.slice(0,qa):t}function _o(e,t,n=`error`){let r=e.querySelector(`.compose-followup-error`);r&&(r.textContent=t,r.dataset.state=t?n:``)}function vo(e,t){return new(e.ownerDocument.defaultView?.Event||Event)(t,{bubbles:!0})}function yo(e,t,n,r){let i=lo(e.kind);return[`다음 compose-block 초안을 사용자가 편집했습니다.`,``,`종류: ${co(e.kind)}`,`카드 제목: ${e.title}`,``,`${i}:`,t||`(비어 있음)`,``,`본문:`,n||`(비어 있음)`,``,`사용자 추가 요청:`,r,``,`위 수정본과 추가 요청을 반영해서 새 compose-block 초안을 다시 작성해주세요. 결과는 strict JSON compose-block으로 반환하고, 멀티라인 본문은 variants[].paragraphs 또는 variants[].bodyLines 배열을 우선 사용해주세요.`].join(`
|
|
81
|
+
`)}function bo(e,t){let n=go(e);if(!n){_o(e,`추가 요청을 입력한 뒤 Send를 눌러주세요.`),e.querySelector(`.compose-followup-input`)?.focus();return}let r=document.getElementById(`chatInput`);if(!r){_o(e,`채팅 입력창을 찾을 수 없습니다.`);return}let{subject:i,body:a}=ho(e);r.value=yo(t,i,a,n),r.dispatchEvent(vo(r,`input`)),r.dispatchEvent(vo(r,`cmd-execute`));let o=e.querySelector(`.compose-followup-input`);o&&(o.value=``),_o(e,`전송했습니다.`,`success`)}function xo(e,t){let n=U.get(e);if(!n)return;let r=n?.variants.find(e=>e.id===t);if(!r)return;let i=e.querySelector(`.compose-subject-input`),a=e.querySelector(`.compose-body`);i&&(i.value=r.subject||n.subject),a&&(a.value=r.body);for(let n of e.querySelectorAll(`.compose-tab`)){let e=n.dataset.variantId===t;n.classList.toggle(`is-active`,e),n.setAttribute(`aria-pressed`,String(e))}}async function So(e){let t=navigator.clipboard;if(t?.writeText){await t.writeText(e);return}let n=document.createElement(`textarea`);n.value=e,n.style.position=`fixed`,n.style.opacity=`0`,document.body.appendChild(n),n.select(),document.execCommand(`copy`),n.remove()}function Co(e){window.location.href=e}function wo(e){let t=e.target instanceof HTMLElement?e.target.closest(`[data-compose-action]`):null;if(!t)return;let n=mo(t),r=n?U.get(n):null;if(!n||!r)return;e.preventDefault();let i=t.dataset.composeAction,{subject:a,body:o}=ho(n);i===`variant`&&xo(n,t.dataset.variantId||``),i===`copy`&&So(a?`${a}\n\n${o}`:o),i===`mail`&&Co(`mailto:?subject=${encodeURIComponent(a)}&body=${encodeURIComponent(o)}`),i===`sms`&&Co(`sms:?body=${encodeURIComponent(o)}`),i===`send-followup`&&bo(n,r)}function To(e){if(e.key!==`Enter`||e.shiftKey||!e.metaKey&&!e.ctrlKey)return;let t=e.target;if(!(t instanceof HTMLElement)||!t.classList.contains(`compose-followup-input`))return;let n=mo(t),r=n?U.get(n):null;!n||!r||(e.preventDefault(),bo(n,r))}function Eo(){Ya!==document&&(document.addEventListener(`click`,wo),document.addEventListener(`keydown`,To),Ya=document)}var Do=`.dataframe-pending`,Oo=`.dataframe-block`,ko=20,Ao=500,jo=240,Mo=25,G=new WeakMap,No=null;function Po(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function Fo(e,t=jo){let n=``;return n=e==null?``:typeof e==`object`?JSON.stringify(e):String(e),n=n.trim(),n.length>t?`${n.slice(0,t-1)}…`:n}function Io(e){try{return JSON.parse(e)}catch{return null}}function Lo(e){return encodeURIComponent(JSON.stringify(e))}function Ro(e){let t=e.dataset.dataframeSpec||``,n=``;try{n=decodeURIComponent(t)}catch{n=``}return Vo(Io(n))}function zo(e){return Math.min(100,Math.max(5,typeof e==`number`&&Number.isFinite(e)?Math.floor(e):Mo))}function Bo(e){return e===`number`||e===`boolean`||e===`date`||e===`json`?e:`string`}function Vo(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.schemaVersion!==`dataframe-v1`)return null;let n=(Array.isArray(t.columns)?t.columns:[]).map(e=>Fo(e,80)).filter(Boolean).slice(0,ko);if(n.length===0)return null;let r=(Array.isArray(t.rows)?t.rows:Array.isArray(t.data)?t.data:[]).filter(e=>Array.isArray(e)).slice(0,Ao).map(e=>n.map((t,n)=>Fo(e[n]))),i=Array.isArray(t.types)?t.types:[],a=n.map((e,t)=>Bo(i[t]));return{schemaVersion:`dataframe-v1`,title:Fo(t.title,120)||`Dataframe`,columns:n,types:a,rows:r,pageSize:zo(t.pageSize)}}function Ho(e){return`<div class="dataframe-pending" data-dataframe-kind="dataframe" data-dataframe-spec="${Po(encodeURIComponent(e))}" role="status" aria-label="Dataframe loading">
|
|
82
|
+
<div class="dataframe-loading">표를 준비하는 중...</div>
|
|
83
|
+
</div>`}function Uo(e){let t=[];return e instanceof HTMLElement&&e.matches(Do)&&t.push(e),t.push(...Array.from(e.querySelectorAll(Do))),t}function Wo(e){let t=[],n=`${Oo}[data-dataframe-spec]`;return e instanceof HTMLElement&&e.matches(n)&&t.push(e),t.push(...Array.from(e.querySelectorAll(n))),t}function Go(e){let t=e.filter.trim().toLowerCase(),n=e.spec.rows;if(t&&(n=n.filter(e=>e.some(e=>e.toLowerCase().includes(t)))),e.sortColumn!==null){let t=e.sortColumn,r=e.sortDirection===`asc`?1:-1;n=[...n].sort((e,n)=>e[t].localeCompare(n[t],void 0,{numeric:!0})*r)}return n}function K(e){let t=G.get(e);if(!t)return;let n=Go(t),r=Math.max(1,Math.ceil(n.length/t.spec.pageSize));t.page=Math.min(t.page,r-1);let i=t.page*t.spec.pageSize,a=n.slice(i,i+t.spec.pageSize),o=t.spec.columns.map((e,n)=>{let r=t.sortColumn===n?t.sortDirection===`asc`?`↑`:`↓`:``;return`<th><button class="dataframe-sort-btn" type="button" data-dataframe-action="sort" data-column-index="${n}">${b(e)} ${r}</button></th>`}).join(``),s=a.length===0?`<tr><td class="dataframe-empty" colspan="${t.spec.columns.length}">표시할 행이 없습니다.</td></tr>`:a.map(e=>`<tr>${e.map(e=>`<td><button class="dataframe-cell" type="button" data-dataframe-action="copy-cell" data-cell-value="${Po(e)}">${b(e)}</button></td>`).join(``)}</tr>`).join(``);e.querySelector(`.dataframe-table-wrap`).innerHTML=`<table class="dataframe-table"><thead><tr>${o}</tr></thead><tbody>${s}</tbody></table>`,e.querySelector(`.dataframe-page-info`).textContent=`${t.page+1}/${r} · ${n.length} rows`;let c=e.querySelector(`[data-dataframe-action="prev"]`),l=e.querySelector(`[data-dataframe-action="next"]`);c&&(c.disabled=t.page===0),l&&(l.disabled=t.page>=r-1)}function Ko(e){return`
|
|
84
|
+
<div class="dataframe-toolbar">
|
|
85
|
+
<div class="dataframe-title">${b(e.title)}</div>
|
|
86
|
+
<input class="dataframe-filter" type="search" placeholder="Filter" aria-label="Filter table">
|
|
87
|
+
</div>
|
|
88
|
+
<div class="dataframe-table-wrap"></div>
|
|
89
|
+
<div class="dataframe-pagination">
|
|
90
|
+
<button class="dataframe-page-btn" type="button" data-dataframe-action="prev">Prev</button>
|
|
91
|
+
<span class="dataframe-page-info"></span>
|
|
92
|
+
<button class="dataframe-page-btn" type="button" data-dataframe-action="next">Next</button>
|
|
93
|
+
</div>`}function qo(e=document){for(let t of Uo(e)){if(t.dataset.dataframeHydrated===`true`)continue;t.dataset.dataframeHydrated=`true`;let e=Ro(t);if(!e){console.warn(`[dataframe] invalid dataframe spec`),delete t.dataset.dataframeSpec,t.className=`dataframe-block dataframe-error`,t.innerHTML=`<div class="dataframe-error-text">표 형식을 읽을 수 없습니다.</div>`;continue}t.className=`dataframe-block`,t.dataset.dataframeSpec=Lo(e),G.set(t,{spec:e,filter:``,sortColumn:null,sortDirection:`asc`,page:0}),t.innerHTML=Ko(e),K(t)}for(let t of Wo(e)){if(G.has(t))continue;let e=Ro(t);if(!e)continue;let n=t.querySelector(`.dataframe-filter`)?.value||``;G.set(t,{spec:e,filter:n,sortColumn:null,sortDirection:`asc`,page:0}),K(t)}}function Jo(e){return e instanceof HTMLElement?e.closest(Oo):null}async function Yo(e){navigator.clipboard?.writeText&&await navigator.clipboard.writeText(e)}function Xo(e){let t=e.target instanceof HTMLElement?e.target.closest(`[data-dataframe-action]`):null;if(!t)return;let n=Jo(t),r=n?G.get(n):null;if(!n||!r)return;e.preventDefault();let i=t.dataset.dataframeAction;if(i===`sort`){let e=Number(t.dataset.columnIndex);if(!Number.isInteger(e))return;r.sortColumn===e?r.sortDirection=r.sortDirection===`asc`?`desc`:`asc`:(r.sortColumn=e,r.sortDirection=`asc`),r.page=0,K(n)}i===`prev`&&(r.page=Math.max(0,r.page-1),K(n)),i===`next`&&(r.page+=1,K(n)),i===`copy-cell`&&Yo(t.dataset.cellValue||``)}function Zo(e){let t=e.target;if(!(t instanceof HTMLElement)||!t.classList.contains(`dataframe-filter`))return;let n=Jo(t),r=n?G.get(n):null;!n||!r||(r.filter=t.value,r.page=0,K(n))}function Qo(){No!==document&&(document.addEventListener(`click`,Xo),document.addEventListener(`input`,Zo),No=document)}var $o=`.chart-json-pending`,es=24,q=[`#2563eb`,`#16a34a`,`#dc2626`,`#9333ea`,`#ca8a04`,`#0891b2`];function J(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function ts(e,t){let n=typeof e==`string`?e.trim():``;return n.length>t?`${n.slice(0,t-1)}…`:n}function ns(e){try{return JSON.parse(e)}catch{return null}}function rs(e){return e===`line`||e===`pie`?e:`bar`}function is(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.schemaVersion!==`chart-json-v1`)return null;let n=Array.isArray(t.labels)?t.labels:[],r=Array.isArray(t.data)?t.data:[],i=Math.min(n.length,r.length,es),a=[],o=[];for(let e=0;e<i;e+=1){let t=Number(r[e]);Number.isFinite(t)&&(a.push(ts(n[e],40)||`Item ${e+1}`),o.push(t))}return a.length===0?null:{schemaVersion:`chart-json-v1`,type:rs(t.type),title:ts(t.title,120)||`Chart`,description:ts(t.description,240),labels:a,data:o}}function as(e){return`<div class="chart-json-pending" data-chart-json-kind="chart-json" data-chart-json-spec="${J(encodeURIComponent(e))}" role="status" aria-label="Chart loading">
|
|
94
|
+
<div class="chart-json-loading">차트를 준비하는 중...</div>
|
|
95
|
+
</div>`}function os(e){let t=[];return e instanceof HTMLElement&&e.matches($o)&&t.push(e),t.push(...Array.from(e.querySelectorAll($o))),t}function ss(e,t,n){return n===t?.5:(e-t)/(n-t)}function cs(e){let t=Math.max(...e.data,1),n=Math.max(8,(360-6*(e.data.length-1))/e.data.length),r=e.data.map((r,i)=>{let a=Math.max(2,r/t*130);return`<rect x="${i*(n+6)}" y="${170-a-24}" width="${n}" height="${a}" rx="3" fill="${q[i%q.length]}"><title>${b(e.labels[i])}: ${r}</title></rect>`}).join(``);return`<svg class="chart-json-svg" viewBox="0 0 360 170" role="img" aria-label="${J(e.title)}">${r}</svg>`}function ls(e){let t=Math.min(...e.data),n=Math.max(...e.data),r=e.data.map((r,i)=>{let a=e.data.length===1?360/2:i/(e.data.length-1)*360,o=145-ss(r,t,n)*120;return`${a.toFixed(1)},${o.toFixed(1)}`}),i=r.map((t,n)=>{let[r,i]=t.split(`,`);return`<circle cx="${r}" cy="${i}" r="3" fill="${q[n%q.length]}"><title>${b(e.labels[n])}: ${e.data[n]}</title></circle>`}).join(``);return`<svg class="chart-json-svg" viewBox="0 0 360 170" role="img" aria-label="${J(e.title)}"><polyline points="${r.join(` `)}" fill="none" stroke="#2563eb" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>${i}</svg>`}function us(e,t,n,r,i){let a=e+n*Math.cos(r),o=t+n*Math.sin(r),s=e+n*Math.cos(i),c=t+n*Math.sin(i),l=+(i-r>Math.PI);return`M ${e} ${t} L ${a.toFixed(2)} ${o.toFixed(2)} A ${n} ${n} 0 ${l} 1 ${s.toFixed(2)} ${c.toFixed(2)} Z`}function ds(e){let t=e.data.reduce((e,t)=>e+Math.max(0,t),0);if(t<=0)return cs(e);let n=-Math.PI/2,r=e.data.map((r,i)=>{let a=Math.max(0,r)/t*Math.PI*2,o=us(90,85,64,n,n+a);return n+=a,`<path d="${o}" fill="${q[i%q.length]}"><title>${b(e.labels[i])}: ${r}</title></path>`}).join(``);return`<svg class="chart-json-svg" viewBox="0 0 180 170" role="img" aria-label="${J(e.title)}">${r}</svg>`}function fs(e){return e.labels.map((e,t)=>`<span class="chart-json-legend-item"><span class="chart-json-swatch chart-json-swatch-${t%q.length}"></span>${b(e)}</span>`).join(``)}function ps(e){let t=e.type===`line`?ls(e):e.type===`pie`?ds(e):cs(e);return`
|
|
96
|
+
<div class="chart-json-header">
|
|
97
|
+
<div class="chart-json-title">${b(e.title)}</div>
|
|
98
|
+
${e.description?`<div class="chart-json-description">${b(e.description)}</div>`:``}
|
|
99
|
+
</div>
|
|
100
|
+
<div class="chart-json-frame">${t}</div>
|
|
101
|
+
<div class="chart-json-legend">${fs(e)}</div>`}function ms(e=document){for(let t of os(e)){if(t.dataset.chartJsonHydrated===`true`)continue;t.dataset.chartJsonHydrated=`true`;let e=t.dataset.chartJsonSpec||``,n=``;try{n=decodeURIComponent(e)}catch{n=``}delete t.dataset.chartJsonSpec;let r=is(ns(n));if(!r){console.warn(`[chart-json] invalid chart spec`,{decodedChars:n.length}),t.className=`chart-json-block chart-json-error`,t.innerHTML=`<div class="chart-json-error-text">차트 형식을 읽을 수 없습니다.</div>`;continue}t.className=`chart-json-block`,t.innerHTML=ps(r)}}var hs=`link-preview-card`,gs=4,_s=200,Y=new Map,vs=[],ys=0;function bs(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`)}function xs(e){let t=e.replace(/^\[|\]$/g,``).toLowerCase();return t===`localhost`||t.endsWith(`.localhost`)||t.endsWith(`.local`)||/^0\./.test(t)||/^10\./.test(t)||/^127\./.test(t)||/^169\.254\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^192\.168\./.test(t)||/^::1$/.test(t)}function Ss(e){try{let t=new URL(e,window.location.href);return![`http:`,`https:`].includes(t.protocol)||t.origin===window.location.origin||t.username||t.password||xs(t.hostname)||/\.(?:png|jpe?g|gif|webp|avif|svg|mp4|webm|mov|zip|tar|gz|pdf)(?:$|\?)/i.test(t.pathname)?``:t.href}catch{return``}}function Cs(e){return e.closest(`.${hs}, .search-results-block, .elicitation-block, .code-block`)||e.dataset.linkPreviewAttached===`true`?!1:!!Ss(e.href)}async function ws(e){ys>=gs&&await new Promise(e=>vs.push(e)),ys+=1;try{return await e()}finally{--ys,vs.shift()?.()}}function Ts(e){let t=Y.get(e);if(t)return Y.delete(e),Y.set(e,t),t;let n=ws(async()=>{try{let t=await fetch(`${h}/api/link-preview?url=${encodeURIComponent(e)}`);if(t.status===204||!t.ok)return null;let n=await t.json();return n.ok&&n.data?n.data:null}catch{return null}});for(Y.set(e,n);Y.size>_s;){let e=Y.keys().next().value;if(!e)break;Y.delete(e)}return n}function Es(e){return`${h}/api/link-preview/image?url=${encodeURIComponent(e)}`}function Ds(e,t){let n=String(e.title||``).trim(),r=String(e.description||``).trim(),i=String(e.siteName||e.domain||``).trim(),a=String(e.canonicalUrl||e.finalUrl||t).trim(),o=new URL(a||t).hostname,s=i&&i.toLowerCase()!==o.toLowerCase()?i:``,c=String(e.image||``).trim(),l=String(e.favicon||``).trim();if(!n&&!r&&!c&&!l)return null;let u=c?`<img class="link-preview-image" src="${bs(Es(c))}" alt="" loading="lazy" referrerpolicy="no-referrer">`:`<div class="link-preview-image link-preview-image-empty" aria-hidden="true"></div>`,d=l?`<img class="link-preview-favicon" src="${bs(Es(l))}" alt="" loading="lazy" referrerpolicy="no-referrer">`:``,f=document.createElement(`a`);return f.className=hs,f.href=a||t,f.target=`_blank`,f.rel=`noopener noreferrer`,f.setAttribute(`aria-label`,n?`Link preview: ${n}`:`Link preview`),f.innerHTML=`
|
|
102
|
+
${u}
|
|
103
|
+
<span class="link-preview-body">
|
|
104
|
+
<span class="link-preview-meta">${d}${s?`<span>${b(s)}</span><span class="link-preview-separator">-</span>`:``}<span class="link-preview-url">${b(o)}</span></span>
|
|
105
|
+
${n?`<span class="link-preview-title">${b(n)}</span>`:``}
|
|
106
|
+
${r?`<span class="link-preview-description">${b(r)}</span>`:``}
|
|
107
|
+
</span>`,f.href=a||t,f}async function Os(e){let t=Ss(e.href);if(!t||e.dataset.linkPreviewAttached===`true`)return;e.dataset.linkPreviewAttached=`true`;let n=await Ts(t);if(!n||!e.isConnected)return;let r=Ds(n,t);r&&e.insertAdjacentElement(`afterend`,r)}function ks(e){if(!(`IntersectionObserver`in window)){Os(e);return}let t=new IntersectionObserver(n=>{for(let r of n)r.isIntersecting&&(t.disconnect(),Os(e))},{rootMargin:`160px`});t.observe(e)}function As(e=document){let t=[];e instanceof HTMLAnchorElement&&Cs(e)&&t.push(e),t.push(...Array.from(e.querySelectorAll(`a[href]`)).filter(Cs));for(let e of t)ks(e)}var X=null,Z=null;function js(){Z&&clearTimeout(Z),X&&=(cancelAnimationFrame(X),null),Z=setTimeout(()=>{Z=null,X=requestAnimationFrame(()=>{X=null;let e=document.getElementById(`chatMessages`);(!e||e.querySelector(`.mermaid-pending, [data-mermaid-code-raw]`))&&Rr(),(!e||e.querySelector(`.code-block pre code, .code-block-wrapper pre code`))&&Ar(),(!e||e.querySelector(`.diagram-zoom-btn, .mermaid-zoom-btn`))&&Tr(),e&&(fa(e),Ha(e),po(e),qo(e),ms(e),As(e),Ni(e))})},100)}function Ms(){Z&&=(clearTimeout(Z),null),X&&=(cancelAnimationFrame(X),null)}var Ns=!1;function Ps(e,t){hr(t).then(t=>{if(!t.ok)return;let n=e.textContent||``;e.textContent=y(`code.copied`),e.classList.add(`copied`),setTimeout(()=>{e.textContent=n,e.classList.remove(`copied`)},1500)})}function Fs(){Ns||(Ns=!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;Ps(n,t.textContent||``);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&&Ps(r,a.textContent||``)}))}var Is=!1;function Ls(){Is||(Is=!0,document.addEventListener(`error`,e=>{let t=e.target;if(!(t instanceof HTMLElement)||t.tagName!==`IMG`||!t.classList.contains(`chat-inline-img`))return;let n=t.getAttribute(`alt`)?.trim()||``,r=document.createElement(`div`);r.className=`chat-inline-img-error`,r.setAttribute(`role`,`status`),r.textContent=n?`Image unavailable: ${n}`:`Image unavailable`,t.replaceWith(r)},!0))}function Rs(){Ls(),Fs(),yr(),Ii(),Aa(),Eo(),Qo()}var zs=/^---\s+\S+\n\+\+\+\s+\S+\n@@\s/m,Bs=800;function Vs(e){return zs.test(e.trim())}function Hs(e){return e.startsWith(`--- `)||e.startsWith(`+++ `)?`diff-file`:e.startsWith(`@@`)?`diff-hunk`:e.startsWith(`+`)?`diff-add`:e.startsWith(`-`)?`diff-del`:e.startsWith(` `)?`diff-ctx`:`diff-meta`}function Us(e,t){return t.startsWith(`@@`)||t.startsWith(`--- `)||t.startsWith(`+++ `)?``:String(e+1)}function Ws(e){let t=e.replace(/\r\n/g,`
|
|
108
|
+
`).split(`
|
|
109
|
+
`);return`<div class="diff-viewer" role="region" aria-label="Diff viewer">${t.slice(0,Bs).map((e,t)=>`<div class="diff-line ${Hs(e)}"><span class="diff-ln">${b(Us(t,e))}</span><span class="diff-code">${b(e||` `)}</span></div>`).join(``)}${t.length>Bs?`<div class="diff-omitted">${t.length-Bs} lines omitted</div>`:``}</div>`}var Gs=[`elicitation`,`choice-buttons`,`search-results`,`compose-block`,`dataframe`,`chart-json`],Ks=/^ {0,3}(`{3,}|~{3,})([A-Za-z0-9_-]+)?[^\n]*$/;function qs(e){return new Set(e.map(e=>e.trim().toLowerCase()).filter(Boolean))}function Js(e,t){let n=t[0],r=t.length;return RegExp(`^ {0,3}\\${n}{${r},}[ \\t]*$`).test(e)}function Ys(e,t=Gs){let n=qs(t),r=new Set,i=0,a=0,o=e.split(/\r?\n/);for(let e=0;e<o.length;e+=1){let t=o[e].match(Ks);if(!t)continue;let s=t[1],c=(t[2]||``).trim().toLowerCase();if(!n.has(c))continue;r.add(c);let l=!1;for(let t=e+1;t<o.length;t+=1)if(Js(o[t],s)){i+=1,l=!0,e=t;break}if(!l){a+=1;break}}return{status:a>0?`incomplete`:i>0?`complete`:`absent`,completeCount:i,incompleteCount:a,langs:[...r]}}function Xs(e){return Ys(e).status===`incomplete`}var Zs=!1,Q=!1,Qs=RegExp(`^([ \\t]{0,3})([-*+]|\\d+[.)])[ \\t]+(\`{3,}|~{3,})(${[`elicitation`,`choice-buttons`,`search-results`,`compose-block`,`dataframe`,`chart-json`].join(`|`)})([^\\n]*)$`,`gim`);function $s(e){return e.replace(Qs,`$1$3$4$5`)}function $(e,t){let n=kr(e,t),r=t?b(t):``,i=y(`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="${b(i)}">${b(i)}</button></div><pre><code class="hljs${t?` language-${b(t)}`:``}">${n}</code></pre></div>`}function ec(e){let t=e.trim();if(!t)return``;if(t.startsWith(`{`))try{let e=JSON.parse(t);return typeof e.id==`string`?e.id.trim():``}catch{return``}return t}function tc(){if(Zs)return!0;let e=new n;return e.code=function({text:e,lang:t}){let n=t?.trim().toLowerCase();if(n===`mermaid`)return`<div class="mermaid-container mermaid-pending" data-mermaid-code-raw="${encodeURIComponent(e)}" role="status" aria-label="Diagram loading">
|
|
110
|
+
<div class="mermaid-skeleton">
|
|
111
|
+
<div class="mermaid-skeleton-spinner"></div>
|
|
112
|
+
<div class="mermaid-skeleton-text">Rendering diagram…</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>`;if(n===`diagram-html`)return`<div class="diagram-widget-pending" data-diagram-html="${btoa(unescape(encodeURIComponent(e)))}"
|
|
115
|
+
role="status" aria-label="Interactive widget loading">
|
|
116
|
+
<div class="diagram-spinner"></div>
|
|
117
|
+
</div>`;if(n===`diagram-file`){let n=ec(e);return n?`<div class="diagram-widget-pending" data-widget-id="${b(n)}"
|
|
118
|
+
role="status" aria-label="Interactive widget loading">
|
|
119
|
+
<div class="diagram-spinner"></div>
|
|
120
|
+
</div>`:$(e,t)}return n===`elicitation`||n===`choice-buttons`?Q?$(e,t):ua(e,n):n===`search-results`?Q?$(e,t):za(e):n===`compose-block`?Q?$(e,t):ao(e):n===`dataframe`?Q?$(e,t):Ho(e):n===`chart-json`?Q?$(e,t):as(e):n===`diff`||!n&&Vs(e)?Ws(e):$(e,t)},e.image=function({href:e,title:t,text:n}){if(!e)return``;let r;r=e.includes(`/uploads/`)?`${h}/media/${encodeURIComponent(e.split(`/`).pop())}`:e.startsWith(`/`)?`${h}/api/image?path=${encodeURIComponent(e)}`:b(e);let i=b(n||``),a=t?` title="${b(t)}"`:``,o=(e.split(/[?#]/)[0].split(`.`).pop()||``).toLowerCase();return[`mp4`,`webm`,`mov`,`ogg`].includes(o)?`<video src="${r}" controls class="chat-inline-video" preload="metadata"${a}></video>`:`<img src="${r}" alt="${i}" class="chat-inline-img" loading="lazy"${a} />`},e.link=function({href:e,title:t,text:n}){return`<a href="${b(e||``)}" target="_blank" rel="noopener noreferrer"${t?` title="${b(t)}"`:``}>${n}</a>`},t.setOptions({renderer:e,gfm:!0,breaks:!1}),Zs=!0,!0}function nc(e,n=!1){let r=tr(e);if(!r)return`<em class="text-dim orchestrate-placeholder">`+b(y(`orchestrator.dispatching`))+`</em>`;let i=$s(r).replace(/\n{3,}/g,`
|
|
121
|
+
|
|
122
|
+
`),a=Xs(i),{text:o,fences:s}=Yn(i),{text:c,blocks:l}=Zn(o,n),{text:u,blocks:d}=nr(Xn(c,s));Or(),tc();let f=qn(u),p=``;Q=n||a;try{p=t.parse(f)}finally{Q=!1}return p=p.replace(/<table/g,`<div class="table-wrapper"><table`).replace(/<\/table>/g,`</table></div>`),p=rr(p,d,n),p=se(p),p=wr(p,l),n||js(),Rs(),p}export{Wn as A,fr as C,Kn as D,tr as E,Gn as O,dr as S,b as T,zr as _,qo as a,hr as b,fa as c,Yr as d,ri as f,Br as g,A as h,ms as i,y as j,Vn as k,ia as l,oi as m,Ms as n,po as o,k as p,As as r,Ha as s,nc as t,Ni as u,Rr as v,ur as w,C as x,Nr as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,d as t,p as n}from"./settings-core-Cy6lW9S8.js";import"./settings-DTQ7d6hb.js";export{e as loadSettings,t as savePerCli,n as updateSettings};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./state-DxpgDKMO.js";import{i as t,n}from"./api-tVoG39dL.js";import{T as r,j as i,x as a}from"./render-
|
|
1
|
+
import{t as e}from"./state-DxpgDKMO.js";import{i as t,n}from"./api-tVoG39dL.js";import{T as r,j as i,x as a}from"./render-BVjRYi0-.js";import{r as o}from"./locale-DC-ZsWOf.js";import"./settings-core-Cy6lW9S8.js";import{n as s,r as c}from"./provider-icons-stsNmQKx.js";function l(e){if(e.precision===`binary`)return{percent:null,text:e.status===`exhausted`?`Exhausted`:`Available`};let t=Math.max(0,Math.min(100,Math.round(e.percent)));return{percent:t,text:`${t}%`}}var u=new Set([`ai-e`,`codex-app`]),d=new Set([`ai-e`,`claude-e`,`jwc`,`pi`,`codex-app`,`gemini`]),f={},p={cursor:{title:`Enable quota bars (dashboard session)`,description:`Cursor does not expose quota via its CLI. To display usage bars, log in with cursor-agent or manually export your session token from cursor.com DevTools (Application → Cookies → WorkosCursorSessionToken).`,commands:[`cursor-agent login`,`export CURSOR_SESSION_TOKEN="<WorkosCursorSessionToken from cursor.com DevTools>"`,`echo "$CURSOR_SESSION_TOKEN" > ~/.cli-jaw/quota/cursor-session-token && chmod 600 ~/.cli-jaw/quota/cursor-session-token`]},agy:{title:`Enable Gem / Cla quota bars`,description:`Antigravity wraps Google Gemini and Claude models. Log in with antigravity-usage to fetch your remaining Gem/Cla tier quotas.`,commands:[`npx antigravity-usage login`,`npx antigravity-usage --json`]},grok:{title:`Grok login`,description:`Authenticate with Grok (X/Twitter AI) to enable quota tracking and model access through the progrok proxy.`,commands:[`progrok login`]},opencode:{title:`OpenCode Go quota (API key)`,description:`cli-jaw reads your sk- API key from ~/.local/share/opencode/auth.json (opencode-go) or OPENCODE_GO_API_KEY, then calls GET /zen/go/v1/usage. The usage endpoint is not deployed yet — quota bars appear when upstream ships it. Your key still works for models/chat.`,commands:[`opencode providers login`,`export OPENCODE_GO_API_KEY=sk-...`,`curl -s -H "Authorization: Bearer $OPENCODE_GO_API_KEY" https://opencode.ai/zen/go/v1/usage`],note:`Not the opencode-quota plugin (cookie scrape). Built-in opencode stats = session tokens only.`,links:[{label:`OpenCode Go docs`,url:`https://opencode.ai/docs/go/`},{label:`Upstream usage API issue #16017`,url:`https://github.com/anomalyco/opencode/issues/16017`},{label:`Upstream usage API PR #16513`,url:`https://github.com/anomalyco/opencode/pull/16513`},{label:`slkiser/opencode-quota (cookie workaround)`,url:`https://github.com/slkiser/opencode-quota`},{label:`robinebers/openusage (local cost estimate)`,url:`https://github.com/robinebers/openusage`},{label:`Rodowen/oc-go-monitor (cookie + /usage)`,url:`https://github.com/Rodowen/oc-go-monitor`}]}};function m(e,t){return e===`gemini`?t===`Pro`||t===`P`?`P`:t===`Flash`||t===`F`?`F`:t:e===`copilot`&&(t===`Premium`||t===`Prem`||t.includes(`plus monthly subscriber quota`))?`30d`:t.replace(`-hour`,`h`).replace(`-day`,`d`).replace(` Sonnet`,``).replace(` Opus`,``)}function h(e,t){if(t.delegatedProvider)return`Delegates quota/status to ${t.delegatedProvider}`;let n=t.quotaSource?.match(/^not-exposed-by-(.*?)-cli$/);return n?`Quota not exposed by ${n[1].toUpperCase()} CLI`:t.quotaSource?t.quotaSource:e===`opencode`?`Auth/status only`:`Usage data not exposed by this CLI`}function g(e){return e.toLowerCase().replace(/^cursor\s+/i,``).trim()}var _=new Set([`auth/status only`,`google cloud code`,`runtime-checked`]),v=new Set([`cursor`,`antigravity.google`,`antigravity`,`max`,`copilot`,`gemini`]);function y(e,t){let n=t.account;if(!n)return[];let r=[];n.email&&r.push(n.email);let i=new Set(r.map(g));for(let e of[n.plan,n.tier]){if(!e)continue;let t=g(e);if(!(!t||_.has(t))&&!v.has(t)&&!i.has(t)){i.add(t),r.push(e);break}}return r}function b(e,t,n=[]){let i=p[e],a=[...n,...i?i.commands:[],...i?.note?[i.note]:[]].filter(Boolean);return a.length?`<button type="button" class="help-trigger" style="margin-left:4px" data-cli-help="${r(a.join(`
|
|
2
2
|
`))}"${i?.description?` data-cli-help-desc="${r(i.description)}"`:``}${i?.links?.length?` data-cli-help-links="${r(JSON.stringify(i.links))}"`:``} aria-label="Setup help">?</button>`:``}function ee(e,t){let n=p[e],i=t.sessionUsage,a=[];i?.primaryModelId&&a.push(`Model: ${i.primaryModelId}`),i?.contextTokensUsed&&i?.contextWindowTokens?a.push(`Session context: ${Math.round(i.contextTokensUsed).toLocaleString()} / ${Math.round(i.contextWindowTokens).toLocaleString()} tokens`):i?.turnCount&&a.push(`Session turns: ${Math.round(i.turnCount).toLocaleString()}`);let o=b(e,t,a);if(n){let e=n.commands.map(e=>`
|
|
3
3
|
<div style="margin-top:3px"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px;word-break:break-all">${r(e)}</code></div>
|
|
4
4
|
`).join(``),t=n.description?`<div style="margin-top:3px;color:var(--text-dim);font-size:10px">${r(n.description)}</div>`:``,i=n.links?.length?`<ul style="margin:6px 0 0;padding-left:16px;font-size:10px">${n.links.map(e=>`<li><a href="${r(e.url)}" target="_blank" rel="noopener noreferrer">${r(e.label)}</a></li>`).join(``)}</ul>`:``;return`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as e,l as t}from"./settings-core-Cy6lW9S8.js";export{t as refreshHeaderFromSettingsChange,e as savePerCli};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as e,n as t,r as n}from"./api-tVoG39dL.js";import{T as r,j as i,m as a,x as o}from"./render-
|
|
1
|
+
import{i as e,n as t,r as n}from"./api-tVoG39dL.js";import{T as r,j as i,m as a,x as o}from"./render-BVjRYi0-.js";import{n as s}from"./locale-DC-ZsWOf.js";import{a as c,i as l,n as u,o as d,t as f}from"./constants-BlggFGWl.js";import{a as p,c as m,l as ee,u as te}from"./pi-settings-Dh5lgb87.js";import{n as ne,r as h}from"./provider-icons-stsNmQKx.js";function re(t){let n=document.getElementById(`sttEngine`),r=document.getElementById(`sttGeminiKey`),i=document.getElementById(`sttGeminiModel`),a=document.getElementById(`sttGeminiModelCustom`),o=document.getElementById(`sttWhisperModel`),s=document.getElementById(`sttOpenaiBaseUrl`),c=document.getElementById(`sttOpenaiKey`),l=document.getElementById(`sttOpenaiModel`),u=document.getElementById(`sttVertexJson`);if(n&&(n.value=t.engine||`auto`),r&&(r.placeholder=t.geminiKeySet?g(t.geminiKeyLast4):`AIza...`),i){let e=t.geminiModel||`gemini-2.5-flash-lite`;Array.from(i.options).some(t=>t.value===e)?i.value=e:(i.value=`__custom__`,a&&(a.value=e,a.style.display=``))}o&&(o.value=t.whisperModel||`mlx-community/whisper-large-v3-turbo`),s&&(s.value=t.openaiBaseUrl||``),c&&(c.placeholder=t.openaiKeySet?g(t.openaiKeyLast4):`sk-...`),l&&(l.value=t.openaiModel||``),u&&(u.value=t.vertexConfig||``);function d(){let e=n?.value||`auto`,t=e===`auto`||e===`gemini`,r=e===`openai`,i=e===`vertex`,a=e===`auto`||e===`whisper`;document.querySelectorAll(`.stt-gemini`).forEach(e=>e.style.display=t?``:`none`),document.querySelectorAll(`.stt-openai`).forEach(e=>e.style.display=r?``:`none`),document.querySelectorAll(`.stt-vertex`).forEach(e=>e.style.display=i?``:`none`),document.querySelectorAll(`.stt-whisper`).forEach(e=>e.style.display=a?``:`none`)}d();async function f(){let t={stt:{engine:n?.value||`auto`,geminiModel:(i?.value===`__custom__`?a?.value:i?.value)||`gemini-2.5-flash-lite`,whisperModel:o?.value||``,openaiBaseUrl:s?.value||``,openaiModel:l?.value||``,vertexConfig:u?.value||``}};r?.value&&(t.stt.geminiApiKey=r.value),c?.value&&(t.stt.openaiApiKey=c.value),console.log(`[stt] saving:`,{engine:t.stt.engine,hasGeminiKey:!!t.stt.geminiApiKey,hasOpenaiKey:!!t.stt.openaiApiKey});try{if(await e(`/api/settings`,`PUT`,t),r?.value){let e=r.value.slice(-4);r.value=``,r.placeholder=g(e)}if(c?.value){let e=c.value.slice(-4);c.value=``,c.placeholder=g(e)}}catch(e){console.error(`[stt] save failed:`,e)}}n?.addEventListener(`change`,()=>{d(),f()}),i?.addEventListener(`change`,()=>{a&&(a.style.display=i.value===`__custom__`?``:`none`),i.value!==`__custom__`&&f()}),a?.addEventListener(`blur`,f),r?.addEventListener(`blur`,()=>{r.value&&f()}),c?.addEventListener(`blur`,()=>{c.value&&f()}),s?.addEventListener(`blur`,f),l?.addEventListener(`blur`,f),o?.addEventListener(`blur`,f),u?.addEventListener(`blur`,f)}function g(e){return i(`stt.key.savedPlaceholder`,{last4:e||``})}async function ie(){let t=document.getElementById(`tgToken`)?.value.trim()||``,n=document.getElementById(`tgChatIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{telegram:{token:t,allowedChatIds:n?n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>!isNaN(e)):[]}})}async function ae(t){document.getElementById(`tgOn`)?.classList.toggle(`active`,t),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{enabled:t}})}async function oe(t){document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{forwardAll:t}})}async function se(t){document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{mentionOnly:t}})}function ce(e){if(!e.telegram)return;let t=e.telegram;document.getElementById(`tgOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`tgToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`tgChatIds`);t.allowedChatIds?.length&&r&&(r.value=t.allowedChatIds.join(`, `));let i=t.forwardAll!==!1;document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,i),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!i);let a=t.mentionOnly!==!1;document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,a),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!a)}async function le(){let t=document.getElementById(`dcToken`)?.value.trim()||``,n=document.getElementById(`dcGuildId`)?.value.trim()||``,r=document.getElementById(`dcChannelIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{discord:{token:t,guildId:n,channelIds:r?r.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function ue(t){document.getElementById(`dcOn`)?.classList.toggle(`active`,t),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{enabled:t}})}async function de(t){document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{forwardAll:t}})}async function fe(t){document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,t),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{allowBots:t}})}async function pe(t){document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{mentionOnly:t}})}function me(e){if(!e.discord)return;let t=e.discord;document.getElementById(`dcOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`dcToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`dcGuildId`);t.guildId&&r&&(r.value=t.guildId);let i=document.getElementById(`dcChannelIds`);t.channelIds?.length&&i&&(i.value=t.channelIds.join(`, `));let a=t.forwardAll!==!1;document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,a),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!a);let o=!!t.allowBots;document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,o),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!o);let s=!!t.mentionOnly;document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,s),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!s)}function he(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.configured==`boolean`&&typeof t.activeInbound==`boolean`&&typeof t.sendCapable==`boolean`}function ge(e){if(!e||typeof e!=`object`)return null;let t=e.channels;if(!t||typeof t!=`object`)return null;let n=t;return n.activeInbound!==`telegram`&&n.activeInbound!==`discord`||!he(n.telegram)||!he(n.discord)?null:{activeInbound:n.activeInbound,telegram:n.telegram,discord:n.discord}}function _e(e){let t=[];return t.push(e.configured?i(`settings.channel.configured`):i(`settings.channel.notConfigured`)),e.sendCapable&&t.push(i(`settings.channel.sendCapable`)),e.activeInbound&&t.push(i(`settings.channel.activeInbound`)),t}function ve(e,t,n){let a=_e(t).map(e=>`<span class="transport-status-chip">${r(e)}</span>`).join(``),o=n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${r(i(`settings.channel.sendOnlyHint`))}</p>`:``;return`
|
|
2
2
|
<div class="transport-status-block">
|
|
3
3
|
<div class="transport-status-label">${r(e)}</div>
|
|
4
4
|
<div class="transport-status-chips">${a}</div>
|