cli-jaw 1.7.24 → 1.7.25
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/src/cli/claude-models.js +12 -9
- package/dist/src/cli/claude-models.js.map +1 -1
- package/package.json +1 -1
- package/public/css/diagram.css +1 -1
- package/public/dist/assets/{employees-C0yujZsW.js → employees-DLT2rMc3.js} +1 -1
- package/public/dist/assets/{index-Cjc9HWVX.js → index-6g9umK6o.js} +4 -4
- package/public/dist/assets/{index-D1vzoEEU.css → index-CmogXq5K.css} +1 -1
- package/public/dist/assets/{memory-FFmqjyCC.js → memory-DPYwJcXJ.js} +1 -1
- package/public/dist/assets/memory-DksY51a-.js +1 -0
- package/public/dist/assets/render-BosFqJjy.js +25 -0
- package/public/dist/assets/settings-ByGM9Iy-.js +1 -0
- package/public/dist/assets/{settings-MICU1hXS.js → settings-DRmRVgdQ.js} +1 -1
- package/public/dist/assets/skills-9zi59C86.js +1 -0
- package/public/dist/assets/{skills-BzRE-_tP.js → skills-BqW_NElf.js} +1 -1
- package/public/dist/assets/slash-commands-BhoiSfeY.js +1 -0
- package/public/dist/assets/{slash-commands-DH53hTco.js → slash-commands-DLvf6F7X.js} +1 -1
- package/public/dist/assets/{ui-DZb07Luj.js → ui-CQMgnEmb.js} +2 -2
- package/public/dist/assets/ui-N7VPPz3I.js +1 -0
- package/public/dist/assets/{ws-PsjiwLxs.js → ws-HZU5v8LO.js} +2 -2
- package/public/dist/index.html +2 -2
- package/public/js/render.ts +20 -3
- package/public/dist/assets/memory-irEuKgdV.js +0 -1
- package/public/dist/assets/render-D1FcBRwU.js +0 -25
- package/public/dist/assets/settings-my0MZC-q.js +0 -1
- package/public/dist/assets/skills--Z8gqYp5.js +0 -1
- package/public/dist/assets/slash-commands-u5fbLK7K.js +0 -1
- package/public/dist/assets/ui-CfUxt-FY.js +0 -1
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
// ─── Claude Model Normalization (single source of truth) ──────────
|
|
2
2
|
export const CLAUDE_CANONICAL_MODELS = [
|
|
3
|
-
'claude-opus-4-6',
|
|
4
3
|
'claude-opus-4-6[1m]',
|
|
5
|
-
'
|
|
6
|
-
'opus',
|
|
7
|
-
'
|
|
8
|
-
'
|
|
9
|
-
'
|
|
4
|
+
'claude-opus-4-6',
|
|
5
|
+
'claude-opus-4-7[1m]',
|
|
6
|
+
'claude-opus-4-7',
|
|
7
|
+
'claude-sonnet-4-6[1m]',
|
|
8
|
+
'claude-sonnet-4-6',
|
|
9
|
+
'claude-haiku-4-5',
|
|
10
10
|
];
|
|
11
11
|
export const CLAUDE_LEGACY_VALUE_MAP = {
|
|
12
|
-
'claude-sonnet-4-6'
|
|
13
|
-
'
|
|
12
|
+
'sonnet': 'claude-sonnet-4-6',
|
|
13
|
+
'sonnet[1m]': 'claude-sonnet-4-6[1m]',
|
|
14
|
+
'opus': 'claude-opus-4-6',
|
|
15
|
+
'opus[1m]': 'claude-opus-4-6[1m]',
|
|
16
|
+
'haiku': 'claude-haiku-4-5',
|
|
14
17
|
};
|
|
15
18
|
export function isClaudeCli(cli) {
|
|
16
19
|
return cli === 'claude';
|
|
@@ -28,7 +31,7 @@ export function migrateLegacyClaudeValue(model) {
|
|
|
28
31
|
return CLAUDE_LEGACY_VALUE_MAP[value] || value;
|
|
29
32
|
}
|
|
30
33
|
export function getDefaultClaudeModel() {
|
|
31
|
-
return 'sonnet';
|
|
34
|
+
return 'claude-sonnet-4-6';
|
|
32
35
|
}
|
|
33
36
|
export function getDefaultClaudeChoices() {
|
|
34
37
|
return [...CLAUDE_CANONICAL_MODELS];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-models.js","sourceRoot":"","sources":["../../../src/cli/claude-models.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,iBAAiB;IACjB,qBAAqB;IACrB,
|
|
1
|
+
{"version":3,"file":"claude-models.js","sourceRoot":"","sources":["../../../src/cli/claude-models.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,iBAAiB;IACjB,uBAAuB;IACvB,mBAAmB;IACnB,kBAAkB;CACV,CAAC;AAIX,MAAM,CAAC,MAAM,uBAAuB,GAAyC;IAC3E,QAAQ,EAAE,mBAAmB;IAC7B,YAAY,EAAE,uBAAuB;IACrC,MAAM,EAAE,iBAAiB;IACzB,UAAU,EAAE,qBAAqB;IACjC,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,KAAK,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAQ,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,uBAAuB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IAC9B,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cli-jaw",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.25",
|
|
4
4
|
"description": "Personal AI assistant powered by 5 engines (Claude, Codex, Gemini, OpenCode, Copilot) — Web, Terminal, Telegram, and Discord interfaces with 107 built-in skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
package/public/css/diagram.css
CHANGED
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
background: var(--surface);
|
|
13
13
|
border: 1px solid var(--border);
|
|
14
14
|
padding: var(--space-4);
|
|
15
|
+
max-width: calc(680px + 2 * var(--space-4));
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
.diagram-svg svg {
|
|
18
19
|
display: block;
|
|
19
20
|
width: 100%;
|
|
20
21
|
height: auto;
|
|
21
|
-
max-width: 680px;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
.diagram-widget {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./state-O6NVkWcL.js";import{n as t,r as n,t as r}from"./api-DygAf_G_.js";import{h as i,n as a,s as o}from"./render-
|
|
1
|
+
import{t as e}from"./state-O6NVkWcL.js";import{n as t,r as n,t as r}from"./api-DygAf_G_.js";import{h as i,n as a,s as o}from"./render-BosFqJjy.js";import{n as s}from"./ws-HZU5v8LO.js";import{n as c,r as l,t as u}from"./constants-DGOVap6o.js";var d={"React/Vue 기반 UI 컴포넌트 개발, 스타일링":`frontend`,"API 서버, DB 스키마, 비즈니스 로직 구현":`backend`,"프론트엔드와 백엔드 모두 담당":`frontend`,"CI/CD, Docker, 인프라 자동화":`backend`,"테스트 작성, 버그 재현, 품질 관리":`custom`,"데이터 파이프라인, ETL, 분석 쿼리":`data`,"API 문서화, README, 가이드 작성":`docs`,"UI/UX 구현, CSS, 컴포넌트 개발":`frontend`,"API, DB, 서버 로직 구현":`backend`,"데이터 파이프라인, 분석, ML":`data`,"문서화, README, API docs":`docs`,"UI/UX, CSS, components":`frontend`,"API, DB, server logic":`backend`,"Data pipeline, analysis, ML":`data`,"Documentation, README, API docs":`docs`},f={1:`#60a5fa`,2:`#a78bfa`,3:`#34d399`,4:`#fbbf24`,5:`#f472b6`};async function p(){e.employees=await r(`/api/employees`)||[],m()}function m(){let t=document.getElementById(`employeesList`);if(!t)return;let n=e.employees;if(n.length===0){t.innerHTML=`<div style="color:var(--text-dim);font-size:11px;padding:4px 0">${i(`emp.addPrompt`)}</div>`;return}let r=l();t.innerHTML=n.map(e=>{let t=e.source===`static`,n=u[e.cli]||[],l=d[e.role||``],p=l?c.find(e=>e.value===l):c.find(t=>t.prompt===e.role),m=p?p.value:e.role?`custom`:`frontend`,h=m===`custom`,g=s(e.id),_=g?.phase||e.phase,v=g?.phaseLabel||e.phaseLabel,y=_?`<span style="background:${f[_]||`#888`};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${a(v||`P`+_)}</span>`:``,b=t?`<span style="background:#3b3b4f;color:#a78bfa;padding:1px 6px;border-radius:9px;font-size:9px;letter-spacing:0.3px">BUILT-IN</span>`:``,x=t?`border-left:2px solid #a78bfa;`:``,S=t?`<span style="flex:1;color:var(--text);font-size:12px;font-weight:600">${a(e.name||`Agent`)}</span>`:`<input style="flex:1;background:none;border:none;color:var(--text);font-size:12px;font-weight:600;font-family:inherit;outline:none" value="${a(e.name||`Agent`)}" data-emp-name="${a(e.id)}">`,C=t?``:`<button style="background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px" data-emp-delete="${a(e.id)}" title="${i(`emp.delete`)}">${o.close}</button>`,w=t?`<select disabled title="CLI fixed for built-in employee"><option>${a(e.cli)}</option></select>`:`<select data-emp-cli="${a(e.id)}">${r.map(t=>`<option${e.cli===t?` selected`:``}>${a(t)}</option>`).join(``)}</select>`,T=t?`<div style="font-size:11px;color:var(--text-dim);padding:4px 0">${a(e.role||``)}</div>`:`<select data-emp-role="${a(e.id)}">${c.map(e=>`<option value="${e.value}"${m===e.value?` selected`:``}>${e.label}</option>`).join(``)}</select>
|
|
2
2
|
<textarea data-emp-custom="${a(e.id)}" style="display:${h?`block`:`none`};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical" placeholder="${i(`emp.customRole`)}">${h?a(e.role||``):``}</textarea>`;return`
|
|
3
3
|
<div class="settings-group" style="margin-bottom:8px;padding:8px 10px;${x}">
|
|
4
4
|
<div style="display:flex;align-items:center;gap:6px;margin-bottom:6px">
|
|
@@ -1,10 +1,10 @@
|
|
|
1
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{n as e,t}from"./vendor-render-D2YP6GiF.js";import{t as n}from"./state-O6NVkWcL.js";import{i as r,n as i,r as a,t as o}from"./api-DygAf_G_.js";import{Z as s}from"./vendor-mermaid-UktBx7L0.js";import{a as c,f as l,h as u,m as ee,n as d,p as te,s as f,t as ne,u as re}from"./render-
|
|
3
|
-
`);c&&(e+=u(`chat.file.sentWithMsg`,{text:c})),T(),await a(`/api/message`,`POST`,{prompt:e})}catch(e){p(u(`chat.file.uploadFail`,{msg:e.message})),T()}}else{e.value=``,D();let t=await fetch(`/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:c})}),n=await t.json().catch(()=>({}));if(t.status===409&&n?.error===`duplicate`)return;if(!t.ok){p(`${f.error} ${d(n.error||u(`chat.requestFail`,{status:t.status}))}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await s(async()=>{let{updateQueueBadge:e}=await import(`./ui-
|
|
2
|
+
import{n as e,t}from"./vendor-render-D2YP6GiF.js";import{t as n}from"./state-O6NVkWcL.js";import{i as r,n as i,r as a,t as o}from"./api-DygAf_G_.js";import{Z as s}from"./vendor-mermaid-UktBx7L0.js";import{a as c,f as l,h as u,m as ee,n as d,p as te,s as f,t as ne,u as re}from"./render-BosFqJjy.js";import{_ as ie,b as ae,h as oe,l as se,n as p,s as ce,t as m,v as le,y as ue}from"./ui-CQMgnEmb.js";import{a as h,n as de}from"./idb-cache-DbK81tgv.js";import{r as fe,t as pe}from"./ws-HZU5v8LO.js";import{t as me}from"./locale-CxI5nTcf.js";import{a as he,i as ge,n as _e,o as ve,r as ye,t as be}from"./slash-commands-DLvf6F7X.js";import{i as xe,t as Se}from"./skills-BqW_NElf.js";import{a as Ce,r as we}from"./constants-DGOVap6o.js";import{A as Te,D as Ee,E as De,F as Oe,I as ke,M as Ae,N as je,O as g,P as Me,S as Ne,_ as Pe,a as Fe,c as Ie,f as Le,g as Re,h as ze,i as Be,j as Ve,k as He,l as Ue,m as We,n as Ge,o as Ke,p as qe,r as Je,s as Ye,t as _,u as Xe,v,w as Ze,x as Qe}from"./settings-DRmRVgdQ.js";import{c as y,d as $e,f as et,i as tt,l as nt,m as rt,n as it,o as at,p as ot,r as st,s as ct,t as lt,u as b}from"./memory-DPYwJcXJ.js";var x=[];function ut(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?300*1e3:1e4}var S=!1;async function C(){let e=document.getElementById(`chatInput`),t=document.getElementById(`btnSend`);if(!e||!t)return;let o=document.activeElement===t;if(t.classList.contains(`stop-mode`)&&o&&!e.value.trim()&&!n.attachedFiles.length){i(`/api/stop`,`POST`);return}if(S)return;let c=e.value.trim();if(!c&&!n.attachedFiles.length)return;S=!0;let l=t,ee=l.disabled;l.disabled=!0;try{let t=c.slice(1).trim().split(/\s+/)[0]||``,i=t.includes(`/`)||t.includes(`\\`);if(c.startsWith(`/`)&&!n.attachedFiles.length&&!i){e.value=``,D(),be();try{let e,t,n=ut(c);if(typeof AbortSignal?.timeout==`function`)e=AbortSignal.timeout(n);else{let r=new AbortController;e=r.signal,t=setTimeout(()=>r.abort(),n)}let i=me(),o=await r(),s=await fetch(`/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":i,...o?{Authorization:`Bearer ${o}`}:{}},body:JSON.stringify({text:c,locale:i}),signal:e});t&&clearTimeout(t);let l=await s.json().catch(()=>({}));if(l?.code===`not_command`){m(`user`,c),h({role:`user`,content:c,timestamp:Date.now()}),await a(`/api/message`,`POST`,{prompt:c});return}if(!s.ok&&!l?.text)throw Error(`HTTP ${s.status}`);if(l?.code===`clear_screen`){ne(),le().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}l?.text&&p(d(l.text),``,l.type)}catch(e){p(u(`chat.cmd.fail`,{msg:e.message}),``,`error`)}return}if(n.attachedFiles.length){let t=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${c}`;m(`user`,t),h({role:`user`,content:t,timestamp:Date.now()}),e.value=``,D();try{let e=(await Promise.all(n.attachedFiles.map(e=>ft(e)))).map(e=>u(`chat.file.sent`,{path:e})).join(`
|
|
3
|
+
`);c&&(e+=u(`chat.file.sentWithMsg`,{text:c})),T(),await a(`/api/message`,`POST`,{prompt:e})}catch(e){p(u(`chat.file.uploadFail`,{msg:e.message})),T()}}else{e.value=``,D();let t=await fetch(`/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:c})}),n=await t.json().catch(()=>({}));if(t.status===409&&n?.error===`duplicate`)return;if(!t.ok){p(`${f.error} ${d(n.error||u(`chat.requestFail`,{status:t.status}))}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await s(async()=>{let{updateQueueBadge:e}=await import(`./ui-N7VPPz3I.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(n.pending||1)}else n.continued?(m(`user`,c),h({role:`user`,content:c,timestamp:Date.now()}),p(u(`chat.continue`))):(m(`user`,c),h({role:`user`,content:c,timestamp:Date.now()}))}}finally{S=!1,l.disabled=ee}}function dt(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),C())}async function ft(e){let t=await fetch(`/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function w(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);E(),document.getElementById(`chatInput`)?.focus()}function pt(e){n.attachedFiles.splice(e,1),E()}function T(){x.forEach(e=>URL.revokeObjectURL(e)),x=[],n.attachedFiles=[],E();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function E(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(x.forEach(e=>URL.revokeObjectURL(e)),x=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);x.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
|
|
4
4
|
${i}
|
|
5
5
|
<span class="file-chip-name">${f.paperclip} ${d(e.name)} (${n}KB)</span>
|
|
6
6
|
<button class="file-chip-remove" data-file-idx="${t}" title="Remove">${f.close}</button>
|
|
7
|
-
</div>`}).join(``))}}async function mt(){ne(),le().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await s(async()=>{let{cleanupToolActivity:e}=await import(`./ui-
|
|
7
|
+
</div>`}).join(``))}}async function mt(){ne(),le().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await s(async()=>{let{cleanupToolActivity:e}=await import(`./ui-N7VPPz3I.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),de().catch(()=>{})}var ht=0;function gt(e){ht||=requestAnimationFrame(()=>{ht=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`})}function _t(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>gt(e))}function D(){let e=document.getElementById(`chatInput`);e&&(e.style.height=`auto`)}function vt(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&w(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&w(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t)if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}n.length&&(e.preventDefault(),w(n))})}async function yt(e,t,r){let i=document.getElementById(`chatInput`),o=i?.value.trim()||``,s=[...n.attachedFiles],c=[`🎤 [음성 메시지]`];s.length&&c.push(`📎 [${s.map(e=>e.name).join(`, `)}]`),o&&c.push(o),m(`user`,c.join(` `)),h({role:`user`,content:c.join(` `),timestamp:Date.now()}),i&&o&&(i.value=``,D()),s.length&&T();try{let n=await fetch(`/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let i=await n.json().catch(()=>null);if(!i?.text)throw Error(`Empty STT result`);p(`${f.mic} STT (${d(i.engine||``)}, ${i.elapsed?.toFixed(1)}s): "${d(i.text.slice(0,100))}"`,``,`info`);let c=[];s.length&&(c=await Promise.all(s.map(e=>ft(e))));let l=[];for(let e of c)l.push(u(`chat.file.sent`,{path:e}));l.push(`🎤 ${i.text}`),o&&l.push(o),await a(`/api/message`,`POST`,{prompt:l.join(`
|
|
8
8
|
`)})}catch(e){p(u(`voice.sttFail`,{msg:e.message}),``,`error`)}}var bt={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},xt={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function St(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function Ct(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=St(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=wt(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function wt(e){try{let[t,n,r,i,a]=Tt(e);return O(t,{min:0,max:59}),O(n,{min:0,max:23}),O(r,{min:1,max:31}),O(i,{min:1,max:12,aliases:xt}),O(a,{min:0,max:7,aliases:bt,normalize:Ot}),null}catch(e){return e.message}}function Tt(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function O(e,t){for(let n of e.split(`,`))Et(n.trim(),t)}function Et(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,Dt(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||k(e,t)>k(r,t))throw Error(`invalid cron range "${n}"`);return}k(n,t)}}function k(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!kt(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function Dt(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function Ot(e){return e===7?0:e}function kt(e,t,n){return e>=t&&e<=n}async function At(){n.heartbeatJobs=((await o(`/api/heartbeat`))?.jobs||[]).map(M),n.heartbeatErrors=P(n.heartbeatJobs),A(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function jt(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function A(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(M);n.heartbeatJobs=t,n.heartbeatErrors=P(t),t.length===0?e.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">${u(`hb.empty`)}</p>`:e.innerHTML=t.map((e,t)=>{let r=It(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||Ht(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${d(r.cron)}" placeholder="${d(u(`hb.cronPlaceholder`))}"
|
|
9
9
|
data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,l=i?`<span class="hb-chip">${d(u(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${d(u(`hb.minutesLabel`))}</span>`;return`
|
|
10
10
|
<div class="hb-job-card">
|
|
@@ -29,4 +29,4 @@ import{n as e,t}from"./vendor-render-D2YP6GiF.js";import{t as n}from"./state-O6N
|
|
|
29
29
|
<textarea class="hb-prompt" rows="2" placeholder="${d(u(`hb.prompt`))}"
|
|
30
30
|
data-hb-prompt="${t}">${d(String(e.prompt||``))}</textarea>
|
|
31
31
|
</div>
|
|
32
|
-
`}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${f.heartPulse} Heartbeat (${r})`)}function Mt(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:Rt({kind:`every`,minutes:5}),prompt:``}),A(),j()}function Nt(e){n.heartbeatJobs.splice(e,1),A(),j()}function Pt(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,A(),j())}async function j(){let e=n.heartbeatJobs.map(M);if(n.heartbeatJobs=e,n.heartbeatErrors=P(e),Object.keys(n.heartbeatErrors).length>0){A();return}let t=await a(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(M),n.heartbeatErrors=P(n.heartbeatJobs),A())}async function Ft(){try{let e=((await o(`/api/heartbeat`))?.jobs||[]).map(M).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${f.heartPulse} Heartbeat (${e})`)}catch{}}function M(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:It(e.schedule),prompt:String(e.prompt||``)}}function It(e){let t=Lt(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function Lt(e){return(typeof e==`string`?e.trim():``)||void 0}function Rt(e){let t=N();return t?{...e,timeZone:t}:e}function N(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function zt(){let e=N();return e?`${u(`hb.timezoneAuto`)} ${e}`:u(`hb.timezoneAuto`)}function P(e){let t={};for(let n of e){let e=Bt(n);e&&(t[n.id]=e)}return t}function Bt(e){let t=Ct(e.schedule);return t.ok?null:Vt(t.code,t.error)}function Vt(e,t){switch(e){case`invalid_cron`:return u(`hb.invalidCron`);case`invalid_timezone`:return u(`hb.invalidTimeZone`);case`invalid_minutes`:return u(`hb.invalidMinutes`);default:return t||u(`hb.invalidSchedule`)}}function Ht(e){let t=e.timeZone||N()||`Asia/Seoul`;return e.kind===`cron`?u(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):u(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var F=`sidebarState`,I=900,Ut=768;function L(){return window.innerWidth<=Ut}function R(){document.body.classList.remove(`left-expanded`,`right-expanded`)}function Wt(e){let t=`${e}-expanded`,n=e===`left`?`right-expanded`:`left-expanded`,r=!document.body.classList.contains(t);document.body.classList.remove(n),document.body.classList.toggle(t,r)}function Gt(){let e={};try{e=JSON.parse(localStorage.getItem(F)||`{}`)}catch{}e.left&&document.body.classList.add(`left-collapsed`),e.right&&document.body.classList.add(`right-collapsed`);let t=L();document.getElementById(`toggleLeft`)?.addEventListener(`click`,B),document.getElementById(`toggleRight`)?.addEventListener(`click`,V),window.addEventListener(`resize`,()=>{let e=L();if(window.innerWidth>I){R();let e={};try{e=JSON.parse(localStorage.getItem(F)||`{}`)}catch{}document.body.classList.toggle(`left-collapsed`,!!e.left),document.body.classList.toggle(`right-collapsed`,!!e.right)}else document.body.classList.remove(`left-collapsed`,`right-collapsed`),e!==t&&R();t=e,H()}),window.innerWidth<=I&&(document.body.classList.remove(`left-collapsed`,`right-collapsed`),L()&&R()),H()}function z(){return window.innerWidth<=I}function B(){z()?Wt(`left`):document.body.classList.toggle(`left-collapsed`),Jt(),H()}function V(){z()?Wt(`right`):document.body.classList.toggle(`right-collapsed`),Jt(),H()}function Kt(){return z()?document.body.classList.contains(`left-expanded`):!document.body.classList.contains(`left-collapsed`)}function qt(){return z()?document.body.classList.contains(`right-expanded`):!document.body.classList.contains(`right-collapsed`)}function H(){let e=document.getElementById(`toggleLeft`),t=document.getElementById(`toggleRight`);e&&(e.innerHTML=Kt()?f.chevronLeft:f.chevronRight),t&&(t.innerHTML=qt()?f.chevronRight:f.chevronLeft)}function Jt(){localStorage.setItem(F,JSON.stringify({left:document.body.classList.contains(`left-collapsed`),right:document.body.classList.contains(`right-collapsed`)}))}var Yt=`theme`,U=null;function Xt(n){let r=n===`light`?t:e;U||(U=document.createElement(`style`),U.id=`hljsTheme`,document.head.appendChild(U)),U.textContent=r}function Zt(){let e=localStorage.getItem(Yt),t=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;$t(e||t),document.getElementById(`toggleTheme`)?.addEventListener(`click`,Qt)}function Qt(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;$t(e),localStorage.setItem(Yt,e)}function $t(e){document.documentElement.setAttribute(`data-theme`,e);let t=document.getElementById(`toggleTheme`);t&&t.classList.toggle(`is-light`,e===`light`),Xt(e),ie(),c()}var en=50,tn=30,nn=80,rn=500,W=null,an=!1;function on(){if(an||!(`ontouchstart`in window))return;an=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,sn,{passive:!0}),e.addEventListener(`touchend`,cn,{passive:!0}))}function sn(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<tn?r=`left`:t.clientX>n-tn&&(r=`right`),W={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function cn(e){if(!W)return;let t=e.changedTouches[0],n=t.clientX-W.startX,r=Math.abs(t.clientY-W.startY),i=Date.now()-W.startTime,a=W;W=null,!(r>nn||i>rn||Math.abs(n)<en)&&(n>0&&a.isEdge===`left`&&B(),n<0&&a.isEdge===`right`&&V())}var G=!1,K=null,q=[],J=null,Y=null,ln=0;function un(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function dn(e){let t=e;switch(t.name){case`NotAllowedError`:return u(`voice.micDenied`);case`NotFoundError`:return u(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return u(`voice.micBusy`);default:return t instanceof TypeError||!navigator.mediaDevices?u(`voice.httpsRequired`):u(`voice.micDenied`)}}async function fn(){if(n.isRecording)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){p(u(`voice.unsupported`),``,`error`);return}try{J=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(e){p(dn(e),``,`error`);return}let e=un();K=new MediaRecorder(J,e?{mimeType:e}:{}),q=[],K.ondataavailable=e=>{e.data.size>0&&q.push(e.data)},K.onerror=()=>{pn(),p(u(`voice.interrupted`),``,`error`)},K.onstop=async()=>{if(G){q=[],gn(),G=!1;return}let t=K?.mimeType||e||`audio/webm`,n=t.includes(`mp4`)?`.m4a`:t.includes(`ogg`)?`.ogg`:`.webm`,r=new Blob(q,{type:t});if(q=[],gn(),r.size>20*1024*1024){p(u(`voice.tooLarge`),``,`error`);return}if(r.size<1e3){p(u(`voice.tooShort`),``,`error`);return}await yt(r,n,t)},K.start(),n.isRecording=!0,ln=Date.now(),X(!0),_n()}function pn(){!n.isRecording||!K||(K.state===`recording`&&K.stop(),n.isRecording=!1,vn(),X(!1))}function mn(){!n.isRecording||!K||(G=!0,K.state===`recording`&&K.stop(),n.isRecording=!1,vn(),X(!1))}function hn(){n.isRecording?pn():fn()}function gn(){J?.getTracks().forEach(e=>e.stop()),J=null}function _n(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Y=setInterval(()=>{let t=Math.floor((Date.now()-ln)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function vn(){Y&&=(clearInterval(Y),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function X(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`);t&&(t.classList.toggle(`recording`,e),t.innerHTML=e?f.stop:f.mic,t.title=u(e?`voice.stop`:`voice.start`)),n&&(n.style.display=e?`inline-block`:`none`)}window.addEventListener(`unhandledrejection`,e=>{console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:yn,addEmployee:bn,deleteEmployee:xn,updateEmployee:Z,onEmpCliChange:Sn,onEmpRoleChange:Cn}=await s(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-C0yujZsW.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));document.getElementById(`btnSend`)?.addEventListener(`click`,C);var Q=document.getElementById(`chatInput`);Q?.addEventListener(`keydown`,e=>{ye(e)||dt(e)});var $=0;Q?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{ve(e.target?.value||``),$=0}))}),Q?.addEventListener(`cmd-execute`,()=>{C()}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,_e),document.addEventListener(`click`,ge),fe(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,T),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&pt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>hn()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>mn()),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,tt),document.getElementById(`btnClearChat`)?.addEventListener(`click`,mt),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,At),document.getElementById(`langToggle`)?.addEventListener(`click`,async()=>{let e=l()===`ko`?`en`:`ko`;await ee(e);let t=document.getElementById(`langToggle`);t&&(t.innerHTML=`${f.web} ${u(`lang.`+e)}`),n.ws&&n.ws.close()}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`,`settings`];r[n]&&oe(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,ce),document.getElementById(`selCli`)?.addEventListener(`change`,()=>ze()),document.getElementById(`selModel`)?.addEventListener(`change`,()=>Pe()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>Pe()),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>Re()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>Re()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,bn),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){xn(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Z(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){Sn(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(u(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Z(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Z(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){Cn(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Z(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&xe(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&Se(t.dataset.filter||`all`,t)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,Je),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>Oe(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>Oe(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>Me(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>Me(!0)),document.getElementById(`tgMentionOff`)?.addEventListener(`click`,()=>ke(!1)),document.getElementById(`tgMentionOn`)?.addEventListener(`click`,()=>ke(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,je),document.getElementById(`tgChatIds`)?.addEventListener(`change`,je),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>Ee(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>Ee(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>He(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>He(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>Ve(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>Ve(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>Te(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>Te(!0)),document.getElementById(`dcMentionOff`)?.addEventListener(`click`,()=>Ae(!1)),document.getElementById(`dcMentionOn`)?.addEventListener(`click`,()=>Ae(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,g),document.getElementById(`dcGuildId`)?.addEventListener(`change`,g),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,g),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,De);function wn(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),v()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>wn(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>wn(!1));function Tn(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),v()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>Tn(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>Tn(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,v),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,v);function En(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),v()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>En(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>En(!1));function Dn(){for(let e of we()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){Le(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){Xe(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,v)}}document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Ze),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,Ne),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>Ue(!0)),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){localStorage.setItem(`cliStatusInterval`,this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>_(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,Fe),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&_()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,Be),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,Ke),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>Ge()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>Ge(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,Ye),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,Ie),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>jt(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>jt()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,Mt),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){Pt(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){Nt(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,j();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},A(),j();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},A(),j();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},A(),j();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},A(),j();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,j();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>lt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>lt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>b(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>b(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>b(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>nt(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>nt(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,y),document.getElementById(`memRetention`)?.addEventListener(`change`,y),document.getElementById(`memFlushLang`)?.addEventListener(`change`,y),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,et),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,ct),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,at),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,ct),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,st),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&ot(),e.target?.id===`advSynthesizeSoulBtn`&&$e()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),it(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){rt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){tt();return}});async function On(){re(),Qe(),Zt(),await te();let e=document.getElementById(`langToggle`);e&&(e.innerHTML=`${f.web} ${u(`lang.`+l())}`),await Ce(),Dn(),pe(),vt(),_t(),await he(),await We(),qe(),Ue(),yn(),Ft(),ae(),await ue(),Gt(),se(),on(),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}On().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(n.isRecording){e.preventDefault(),mn();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`&&(e.preventDefault(),hn())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,B),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,V);
|
|
32
|
+
`}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${f.heartPulse} Heartbeat (${r})`)}function Mt(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:Rt({kind:`every`,minutes:5}),prompt:``}),A(),j()}function Nt(e){n.heartbeatJobs.splice(e,1),A(),j()}function Pt(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,A(),j())}async function j(){let e=n.heartbeatJobs.map(M);if(n.heartbeatJobs=e,n.heartbeatErrors=P(e),Object.keys(n.heartbeatErrors).length>0){A();return}let t=await a(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(M),n.heartbeatErrors=P(n.heartbeatJobs),A())}async function Ft(){try{let e=((await o(`/api/heartbeat`))?.jobs||[]).map(M).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${f.heartPulse} Heartbeat (${e})`)}catch{}}function M(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:It(e.schedule),prompt:String(e.prompt||``)}}function It(e){let t=Lt(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function Lt(e){return(typeof e==`string`?e.trim():``)||void 0}function Rt(e){let t=N();return t?{...e,timeZone:t}:e}function N(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function zt(){let e=N();return e?`${u(`hb.timezoneAuto`)} ${e}`:u(`hb.timezoneAuto`)}function P(e){let t={};for(let n of e){let e=Bt(n);e&&(t[n.id]=e)}return t}function Bt(e){let t=Ct(e.schedule);return t.ok?null:Vt(t.code,t.error)}function Vt(e,t){switch(e){case`invalid_cron`:return u(`hb.invalidCron`);case`invalid_timezone`:return u(`hb.invalidTimeZone`);case`invalid_minutes`:return u(`hb.invalidMinutes`);default:return t||u(`hb.invalidSchedule`)}}function Ht(e){let t=e.timeZone||N()||`Asia/Seoul`;return e.kind===`cron`?u(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):u(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var F=`sidebarState`,I=900,Ut=768;function L(){return window.innerWidth<=Ut}function R(){document.body.classList.remove(`left-expanded`,`right-expanded`)}function Wt(e){let t=`${e}-expanded`,n=e===`left`?`right-expanded`:`left-expanded`,r=!document.body.classList.contains(t);document.body.classList.remove(n),document.body.classList.toggle(t,r)}function Gt(){let e={};try{e=JSON.parse(localStorage.getItem(F)||`{}`)}catch{}e.left&&document.body.classList.add(`left-collapsed`),e.right&&document.body.classList.add(`right-collapsed`);let t=L();document.getElementById(`toggleLeft`)?.addEventListener(`click`,B),document.getElementById(`toggleRight`)?.addEventListener(`click`,V),window.addEventListener(`resize`,()=>{let e=L();if(window.innerWidth>I){R();let e={};try{e=JSON.parse(localStorage.getItem(F)||`{}`)}catch{}document.body.classList.toggle(`left-collapsed`,!!e.left),document.body.classList.toggle(`right-collapsed`,!!e.right)}else document.body.classList.remove(`left-collapsed`,`right-collapsed`),e!==t&&R();t=e,H()}),window.innerWidth<=I&&(document.body.classList.remove(`left-collapsed`,`right-collapsed`),L()&&R()),H()}function z(){return window.innerWidth<=I}function B(){z()?Wt(`left`):document.body.classList.toggle(`left-collapsed`),Jt(),H()}function V(){z()?Wt(`right`):document.body.classList.toggle(`right-collapsed`),Jt(),H()}function Kt(){return z()?document.body.classList.contains(`left-expanded`):!document.body.classList.contains(`left-collapsed`)}function qt(){return z()?document.body.classList.contains(`right-expanded`):!document.body.classList.contains(`right-collapsed`)}function H(){let e=document.getElementById(`toggleLeft`),t=document.getElementById(`toggleRight`);e&&(e.innerHTML=Kt()?f.chevronLeft:f.chevronRight),t&&(t.innerHTML=qt()?f.chevronRight:f.chevronLeft)}function Jt(){localStorage.setItem(F,JSON.stringify({left:document.body.classList.contains(`left-collapsed`),right:document.body.classList.contains(`right-collapsed`)}))}var Yt=`theme`,U=null;function Xt(n){let r=n===`light`?t:e;U||(U=document.createElement(`style`),U.id=`hljsTheme`,document.head.appendChild(U)),U.textContent=r}function Zt(){let e=localStorage.getItem(Yt),t=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;$t(e||t),document.getElementById(`toggleTheme`)?.addEventListener(`click`,Qt)}function Qt(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;$t(e),localStorage.setItem(Yt,e)}function $t(e){document.documentElement.setAttribute(`data-theme`,e);let t=document.getElementById(`toggleTheme`);t&&t.classList.toggle(`is-light`,e===`light`),Xt(e),ie(),c()}var en=50,tn=30,nn=80,rn=500,W=null,an=!1;function on(){if(an||!(`ontouchstart`in window))return;an=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,sn,{passive:!0}),e.addEventListener(`touchend`,cn,{passive:!0}))}function sn(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<tn?r=`left`:t.clientX>n-tn&&(r=`right`),W={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function cn(e){if(!W)return;let t=e.changedTouches[0],n=t.clientX-W.startX,r=Math.abs(t.clientY-W.startY),i=Date.now()-W.startTime,a=W;W=null,!(r>nn||i>rn||Math.abs(n)<en)&&(n>0&&a.isEdge===`left`&&B(),n<0&&a.isEdge===`right`&&V())}var G=!1,K=null,q=[],J=null,Y=null,ln=0;function un(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function dn(e){let t=e;switch(t.name){case`NotAllowedError`:return u(`voice.micDenied`);case`NotFoundError`:return u(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return u(`voice.micBusy`);default:return t instanceof TypeError||!navigator.mediaDevices?u(`voice.httpsRequired`):u(`voice.micDenied`)}}async function fn(){if(n.isRecording)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){p(u(`voice.unsupported`),``,`error`);return}try{J=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(e){p(dn(e),``,`error`);return}let e=un();K=new MediaRecorder(J,e?{mimeType:e}:{}),q=[],K.ondataavailable=e=>{e.data.size>0&&q.push(e.data)},K.onerror=()=>{pn(),p(u(`voice.interrupted`),``,`error`)},K.onstop=async()=>{if(G){q=[],gn(),G=!1;return}let t=K?.mimeType||e||`audio/webm`,n=t.includes(`mp4`)?`.m4a`:t.includes(`ogg`)?`.ogg`:`.webm`,r=new Blob(q,{type:t});if(q=[],gn(),r.size>20*1024*1024){p(u(`voice.tooLarge`),``,`error`);return}if(r.size<1e3){p(u(`voice.tooShort`),``,`error`);return}await yt(r,n,t)},K.start(),n.isRecording=!0,ln=Date.now(),X(!0),_n()}function pn(){!n.isRecording||!K||(K.state===`recording`&&K.stop(),n.isRecording=!1,vn(),X(!1))}function mn(){!n.isRecording||!K||(G=!0,K.state===`recording`&&K.stop(),n.isRecording=!1,vn(),X(!1))}function hn(){n.isRecording?pn():fn()}function gn(){J?.getTracks().forEach(e=>e.stop()),J=null}function _n(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Y=setInterval(()=>{let t=Math.floor((Date.now()-ln)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function vn(){Y&&=(clearInterval(Y),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function X(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`);t&&(t.classList.toggle(`recording`,e),t.innerHTML=e?f.stop:f.mic,t.title=u(e?`voice.stop`:`voice.start`)),n&&(n.style.display=e?`inline-block`:`none`)}window.addEventListener(`unhandledrejection`,e=>{console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:yn,addEmployee:bn,deleteEmployee:xn,updateEmployee:Z,onEmpCliChange:Sn,onEmpRoleChange:Cn}=await s(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-DLT2rMc3.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));document.getElementById(`btnSend`)?.addEventListener(`click`,C);var Q=document.getElementById(`chatInput`);Q?.addEventListener(`keydown`,e=>{ye(e)||dt(e)});var $=0;Q?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{ve(e.target?.value||``),$=0}))}),Q?.addEventListener(`cmd-execute`,()=>{C()}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,_e),document.addEventListener(`click`,ge),fe(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,T),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&pt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>hn()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>mn()),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,tt),document.getElementById(`btnClearChat`)?.addEventListener(`click`,mt),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,At),document.getElementById(`langToggle`)?.addEventListener(`click`,async()=>{let e=l()===`ko`?`en`:`ko`;await ee(e);let t=document.getElementById(`langToggle`);t&&(t.innerHTML=`${f.web} ${u(`lang.`+e)}`),n.ws&&n.ws.close()}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`,`settings`];r[n]&&oe(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,ce),document.getElementById(`selCli`)?.addEventListener(`change`,()=>ze()),document.getElementById(`selModel`)?.addEventListener(`change`,()=>Pe()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>Pe()),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>Re()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>Re()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,bn),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){xn(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Z(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){Sn(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(u(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Z(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Z(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){Cn(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Z(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&xe(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&Se(t.dataset.filter||`all`,t)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,Je),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>Oe(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>Oe(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>Me(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>Me(!0)),document.getElementById(`tgMentionOff`)?.addEventListener(`click`,()=>ke(!1)),document.getElementById(`tgMentionOn`)?.addEventListener(`click`,()=>ke(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,je),document.getElementById(`tgChatIds`)?.addEventListener(`change`,je),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>Ee(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>Ee(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>He(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>He(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>Ve(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>Ve(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>Te(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>Te(!0)),document.getElementById(`dcMentionOff`)?.addEventListener(`click`,()=>Ae(!1)),document.getElementById(`dcMentionOn`)?.addEventListener(`click`,()=>Ae(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,g),document.getElementById(`dcGuildId`)?.addEventListener(`change`,g),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,g),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,De);function wn(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),v()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>wn(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>wn(!1));function Tn(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),v()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>Tn(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>Tn(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,v),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,v);function En(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),v()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>En(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>En(!1));function Dn(){for(let e of we()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){Le(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){Xe(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,v)}}document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Ze),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,Ne),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>Ue(!0)),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){localStorage.setItem(`cliStatusInterval`,this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>_(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>_()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,Fe),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&_()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,Be),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,Ke),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>Ge()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>Ge(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,Ye),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,Ie),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>jt(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>jt()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,Mt),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){Pt(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){Nt(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,j();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},A(),j();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},A(),j();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},A(),j();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},A(),j();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,j();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>lt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>lt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>b(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>b(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>b(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>nt(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>nt(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,y),document.getElementById(`memRetention`)?.addEventListener(`change`,y),document.getElementById(`memFlushLang`)?.addEventListener(`change`,y),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,et),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,ct),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,at),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,ct),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,st),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&ot(),e.target?.id===`advSynthesizeSoulBtn`&&$e()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),it(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){rt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){tt();return}});async function On(){re(),Qe(),Zt(),await te();let e=document.getElementById(`langToggle`);e&&(e.innerHTML=`${f.web} ${u(`lang.`+l())}`),await Ce(),Dn(),pe(),vt(),_t(),await he(),await We(),qe(),Ue(),yn(),Ft(),ae(),await ue(),Gt(),se(),on(),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}On().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(n.isRecording){e.preventDefault(),mn();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`&&(e.preventDefault(),hn())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,B),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,V);
|