micro-models-agent 2.29.0 → 2.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +198 -0
  2. package/README.md +15 -0
  3. package/dist/assets/app.js +1 -1
  4. package/dist/assets/index.html +64 -14
  5. package/dist/assets/js/dom.js +1 -1
  6. package/dist/assets/js/feed/core.js +1 -1
  7. package/dist/assets/js/feed/sidebar.js +1 -1
  8. package/dist/assets/js/feed/turn.js +4 -4
  9. package/dist/assets/js/footer.js +1 -0
  10. package/dist/assets/js/loader.js +1 -0
  11. package/dist/assets/js/md-normalize.js +5 -0
  12. package/dist/assets/js/session/composer.js +1 -1
  13. package/dist/assets/js/session/tabs.js +1 -1
  14. package/dist/assets/js/settings/controls.js +1 -1
  15. package/dist/assets/js/settings/panels.js +1 -1
  16. package/dist/assets/js/sidebar/core.js +1 -1
  17. package/dist/assets/js/sidebar/drawer.js +1 -0
  18. package/dist/assets/js/sidebar/files/chrome.js +1 -0
  19. package/dist/assets/js/sidebar/files/constants.js +1 -0
  20. package/dist/assets/js/sidebar/files/crumbs.js +1 -0
  21. package/dist/assets/js/sidebar/files/history.js +1 -0
  22. package/dist/assets/js/sidebar/files/keys.js +1 -0
  23. package/dist/assets/js/sidebar/files/split.js +1 -0
  24. package/dist/assets/js/sidebar/files/tree.js +1 -0
  25. package/dist/assets/js/sidebar/files/view.js +1 -0
  26. package/dist/assets/js/sidebar/files.js +1 -1
  27. package/dist/assets/js/sidebar/plugins.js +1 -0
  28. package/dist/assets/js/sidebar/state.js +1 -1
  29. package/dist/assets/js/sidebar/trace.js +4 -4
  30. package/dist/assets/js/sidebar.js +1 -1
  31. package/dist/assets/js/state-sync.js +1 -1
  32. package/dist/assets/js/subdialog.js +1 -1
  33. package/dist/assets/md.js +1 -1
  34. package/dist/assets/setup.js +2 -2
  35. package/dist/assets/styles.css +1 -1
  36. package/dist/i18n/en.json +1 -1
  37. package/dist/i18n/ru.json +1 -1
  38. package/dist/main.js +409 -358
  39. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import{el as r,icon as w,announce as g}from"../dom.js";import{t as d,pluralCount as _}from"../i18n.js";import{feed as c,tabs as k,session as m}from"../store.js";import{FILE_TOOLS as x,OPENABLE_TOOLS as F,LINK_TOOLS as B,categoryOf as y,labelOf as I,argText as U,formatMs as S,verbosity as b,firstOutputLine as L}from"../format.js";import{copyText as q}from"../../md.js";import{imageCard as P}from"./image-card.js";import{activeFeed as O,liveFeed as j,feedForEvent as a,clearBusy as T,clearEmpty as N,appendTo as h,insertAfter as E,appendActionsRow as D,flushRun as $}from"./core.js";import{finishMd as M,finishThink as R}from"./stream.js";export function onToolStart(e){const n=a(e.sessionId);if(T(n),!n)return;N(n),M(),R(),c.pendingArgs.set(e.toolCallId,e.args||{});const o=r("div","act "+y(e.name));o.appendChild(r("span","g","◇")),o.appendChild(r("span","lab",I(e.name)));const s=U(e.args);s&&(o.appendChild(r("span","sep","·")),o.appendChild(r("span","args",s)));const i=r("span","ok","");o.appendChild(i),o.classList.add("running"),h(n,o),c.toolNodes.set(e.toolCallId,{status:i,line:o}),y(e.name)!=="recon"&&(c.runReconOnly=!1),c.runCount++}function A(e,n){if(typeof n!="string"||!n)return;const o=r("div","toolout"),s=r("div","code");if(s.textContent=n,o.appendChild(s),n.length>600||n.split(`
2
- `).length>12){o.classList.add("collapsed");const p="▸ "+_("web.tool.output",n.length),l=r("span","more",p);l.addEventListener("click",()=>{const u=o.classList.toggle("collapsed");l.textContent=u?p:"▾ "+d("web.tool.collapse")}),o.appendChild(l)}const t=e&&e.parentNode?null:j();e&&e.parentNode?e.parentNode.insertBefore(o,e.nextSibling):h(t,o)}function K(e){if(typeof e!="string"||!e)return null;try{const n=new URL(e,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="file:")return n.href}catch{return null}return null}function z(e){const n=String(e??"").replace(/\\/g,"/");try{const o=m&&m.host&&m.host.workspace?String(m.host.workspace).replace(/\\/g,"/").replace(/\/+$/,""):"";if(o&&(n===o||n.indexOf(o+"/")===0)){const s=n===o?"":n.slice(o.length+1);if(s)return s}}catch{}return n}function C(e,n,o,s){const i=a(o);if(!i)return null;if(x.indexOf(e)!==-1){const t=n.path||n.file||n.dir;if(!t)return null;const p=z(t),l=r("div","filerow "+y(e));if(l.appendChild(r("span","g","◇")),l.appendChild(r("span","lab",I(e))),l.appendChild(r("span","sep"," · ")),F.indexOf(e)!==-1){const f=r("a","path",p||String(t));f.href="/api/file?path="+encodeURIComponent(String(t)),f.target="_blank",f.rel="noopener noreferrer",f.title=d("web.card.open_title")+" · "+String(t),l.appendChild(f)}else{const f=r("span","tail",p||String(t));f.title=String(t),l.appendChild(f)}const u=r("button","copy-btn");return u.type="button",u.title=d("web.card.copy_title"),u.setAttribute("aria-label",d("web.card.copy_title")),u.appendChild(w("copy")),u.addEventListener("click",()=>{q(String(t)).then(f=>{if(u.replaceChildren(w(f?"check":"copy")),!f){const v=l.querySelector(".st");v&&(v.textContent=" ⚠")}window.setTimeout(()=>u.replaceChildren(w("copy")),1400)})}),l.appendChild(u),l.appendChild(r("span","st",s===!1?" ✗":s===!0?" ✓":"")),s===!1&&(l.dataset.fail="1"),/\.drawio(\.xml)?$/i.test(String(t))&&b()==="verbose"&&l.appendChild(r("span","detail","↳ "+d("web.card.drawio_hint"))),h(i,l),l}if(B.indexOf(e)!==-1&&n.url){const t=r("div","linkline");t.appendChild(document.createTextNode("↳ "));const p=K(n.url);if(p){const l=r("a","",n.url);l.href=p,l.target="_blank",l.rel="noopener noreferrer",t.appendChild(l);try{const u=new URL(p).hostname;u&&t.appendChild(r("span","dom"," · "+u))}catch{}}else t.appendChild(r("span","",n.url));return h(i,t),t}return null}function G(e){if(!e.success||!Array.isArray(e.images)||!e.images.length)return;const n=a(e.sessionId);if(n)for(const o of e.images){const s=P(String(e.name||""),String(o));s&&h(n,s)}}export function onToolEnd(e){H(e),G(e)}function H(e){const n=c.toolNodes.get(e.toolCallId),o=n?n.line:null;if(n){n.line.classList.remove("running");const t=S(e.durationMs);n.status.textContent=e.success?" ✓"+(t?" "+t:""):" ✗"+(t?" "+t:""),e.success||(n.status.classList.add("fail"),c.runFails++,c.runReconOnly=!1)}c.toolNodes.delete(e.toolCallId);const s=c.pendingArgs.get(e.toolCallId)||{};c.pendingArgs.delete(e.toolCallId);const i=s.path||s.file||s.dir;if(x.indexOf(e.name)!==-1&&i){if(o&&o.parentNode&&o.remove(),b()==="quiet"){if(e.success){const p=C(e.name,s,e.sessionId,e.success);p&&c.runNodes.push(p),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const p=C(e.name,s,e.sessionId,e.success),l=L(e.output);l&&E(p||o,r("div","detail","↳ "+l)),p&&c.runNodes.push(p)}return}const t=C(e.name,s,e.sessionId,e.success);A(t||o,e.output);return}if(b()==="quiet"){if(e.success){o&&c.runNodes.push(o);const t=C(e.name,s,e.sessionId,e.success);t&&c.runNodes.push(t),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const t=L(e.output);t&&E(o,r("div","detail","↳ "+t))}return}e.success&&C(e.name,s,e.sessionId,e.success),A(o,e.output)}export function onTurnEnd(e){m.busy=!1;const n=a(e.sessionId);T(n),R(),M(),$(),c.toolNodes.forEach(i=>{i&&i.line&&n&&i.line.parentNode===n&&i.line.classList.remove("running")});const o=k.tabs.find(i=>i.id===e.sessionId);if(o&&(o.planCard=null),!n){resetTurnText();return}if(e.success===!1)e.interrupted?(h(n,r("div","warnline","⚠ "+d("web.turn.stopped"))),g(d("web.turn.stopped"))):(h(n,r("div","errline","✗ "+d("web.turn.failed"))),g(d("web.turn.failed")));else{const i=[];typeof e.toolCalls=="number"&&e.toolCalls>0&&i.push(d("web.turn.tools",{count:e.toolCalls})),typeof e.durationMs=="number"&&i.push(S(e.durationMs)),i.length&&h(n,r("div","metric","⟡ "+i.join(" · "))),g(d("web.turn.end",{count:e.toolCalls||0}))}const s=c.turnRoots.map(i=>i.innerText||i.textContent||"").join(`
1
+ import{msgs as A,el as r,icon as w,announce as g}from"../dom.js";import{t as d,pluralCount as _}from"../i18n.js";import{feed as c,tabs as k,session as m}from"../store.js";import{FILE_TOOLS as x,OPENABLE_TOOLS as F,LINK_TOOLS as B,categoryOf as y,labelOf as I,argText as U,formatMs as S,verbosity as b,firstOutputLine as L}from"../format.js";import{copyText as q}from"../../md.js";import{imageCard as P}from"./image-card.js";import{activeFeed as j,liveFeed as D,feedForEvent as a,clearBusy as O,clearEmpty as T,appendTo as h,insertAfter as N,appendActionsRow as $,flushRun as K,scrollToBottom as z}from"./core.js";import{finishMd as E,finishThink as M}from"./stream.js";export function onToolStart(e){const n=a(e.sessionId);if(O(n),!n)return;T(n),E(),M(),c.pendingArgs.set(e.toolCallId,e.args||{});const o=r("div","act "+y(e.name));o.appendChild(r("span","g","◇")),o.appendChild(r("span","lab",I(e.name)));const s=U(e.args);s&&(o.appendChild(r("span","sep","·")),o.appendChild(r("span","args",s)));const i=r("span","ok","");o.appendChild(i),o.classList.add("running"),h(n,o),c.toolNodes.set(e.toolCallId,{status:i,line:o}),y(e.name)!=="recon"&&(c.runReconOnly=!1),c.runCount++}function R(e,n){if(typeof n!="string"||!n)return;const o=r("div","toolout"),s=r("div","code");if(s.textContent=n,o.appendChild(s),n.length>600||n.split(`
2
+ `).length>12){o.classList.add("collapsed");const p="▸ "+_("web.tool.output",n.length),l=r("span","more",p);l.addEventListener("click",()=>{const u=o.classList.toggle("collapsed");l.textContent=u?p:"▾ "+d("web.tool.collapse")}),o.appendChild(l)}const t=e&&e.parentNode?null:D();e&&e.parentNode?e.parentNode.insertBefore(o,e.nextSibling):h(t,o)}function G(e){if(typeof e!="string"||!e)return null;try{const n=new URL(e,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="file:")return n.href}catch{return null}return null}function H(e){const n=String(e??"").replace(/\\/g,"/");try{const o=m&&m.host&&m.host.workspace?String(m.host.workspace).replace(/\\/g,"/").replace(/\/+$/,""):"";if(o&&(n===o||n.indexOf(o+"/")===0)){const s=n===o?"":n.slice(o.length+1);if(s)return s}}catch{}return n}function C(e,n,o,s){const i=a(o);if(!i)return null;if(x.indexOf(e)!==-1){const t=n.path||n.file||n.dir;if(!t)return null;const p=H(t),l=r("div","filerow "+y(e));if(l.appendChild(r("span","g","◇")),l.appendChild(r("span","lab",I(e))),l.appendChild(r("span","sep"," · ")),F.indexOf(e)!==-1){const f=r("a","path",p||String(t));f.href="/api/file?path="+encodeURIComponent(String(t)),f.target="_blank",f.rel="noopener noreferrer",f.title=d("web.card.open_title")+" · "+String(t),l.appendChild(f)}else{const f=r("span","tail",p||String(t));f.title=String(t),l.appendChild(f)}const u=r("button","copy-btn");return u.type="button",u.title=d("web.card.copy_title"),u.setAttribute("aria-label",d("web.card.copy_title")),u.appendChild(w("copy")),u.addEventListener("click",()=>{q(String(t)).then(f=>{if(u.replaceChildren(w(f?"check":"copy")),!f){const v=l.querySelector(".st");v&&(v.textContent=" ⚠")}window.setTimeout(()=>u.replaceChildren(w("copy")),1400)})}),l.appendChild(u),l.appendChild(r("span","st",s===!1?" ✗":s===!0?" ✓":"")),s===!1&&(l.dataset.fail="1"),/\.drawio(\.xml)?$/i.test(String(t))&&b()==="verbose"&&l.appendChild(r("span","detail","↳ "+d("web.card.drawio_hint"))),h(i,l),l}if(B.indexOf(e)!==-1&&n.url){const t=r("div","linkline");t.appendChild(document.createTextNode("↳ "));const p=G(n.url);if(p){const l=r("a","",n.url);l.href=p,l.target="_blank",l.rel="noopener noreferrer",t.appendChild(l);try{const u=new URL(p).hostname;u&&t.appendChild(r("span","dom"," · "+u))}catch{}}else t.appendChild(r("span","",n.url));return h(i,t),t}return null}function J(e){if(!e.success||!Array.isArray(e.images)||!e.images.length)return;const n=a(e.sessionId);if(n)for(const o of e.images){const s=P(String(e.name||""),String(o));s&&h(n,s)}}export function onToolEnd(e){Q(e),J(e)}function Q(e){const n=c.toolNodes.get(e.toolCallId),o=n?n.line:null;if(n){n.line.classList.remove("running");const t=S(e.durationMs);n.status.textContent=e.success?" ✓"+(t?" "+t:""):" ✗"+(t?" "+t:""),e.success||(n.status.classList.add("fail"),c.runFails++,c.runReconOnly=!1)}c.toolNodes.delete(e.toolCallId);const s=c.pendingArgs.get(e.toolCallId)||{};c.pendingArgs.delete(e.toolCallId);const i=s.path||s.file||s.dir;if(x.indexOf(e.name)!==-1&&i){if(o&&o.parentNode&&o.remove(),b()==="quiet"){if(e.success){const p=C(e.name,s,e.sessionId,e.success);p&&c.runNodes.push(p),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const p=C(e.name,s,e.sessionId,e.success),l=L(e.output);l&&N(p||o,r("div","detail","↳ "+l)),p&&c.runNodes.push(p)}return}const t=C(e.name,s,e.sessionId,e.success);R(t||o,e.output);return}if(b()==="quiet"){if(e.success){o&&c.runNodes.push(o);const t=C(e.name,s,e.sessionId,e.success);t&&c.runNodes.push(t),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const t=L(e.output);t&&N(o,r("div","detail","↳ "+t))}return}e.success&&C(e.name,s,e.sessionId,e.success),R(o,e.output)}export function onTurnEnd(e){m.busy=!1;const n=a(e.sessionId);O(n),M(),E(),K(),c.toolNodes.forEach(i=>{i&&i.line&&n&&i.line.parentNode===n&&i.line.classList.remove("running")});const o=k.tabs.find(i=>i.id===e.sessionId);if(o&&(o.planCard=null),!n){resetTurnText();return}if(e.success===!1)e.interrupted?(h(n,r("div","warnline","⚠ "+d("web.turn.stopped"))),g(d("web.turn.stopped"))):(h(n,r("div","errline","✗ "+d("web.turn.failed"))),g(d("web.turn.failed")));else{const i=[];typeof e.toolCalls=="number"&&e.toolCalls>0&&i.push(d("web.turn.tools",{count:e.toolCalls})),typeof e.durationMs=="number"&&i.push(S(e.durationMs)),i.length&&h(n,r("div","metric","⟡ "+i.join(" · "))),g(d("web.turn.end",{count:e.toolCalls||0}))}const s=c.turnRoots.map(i=>i.innerText||i.textContent||"").join(`
3
3
 
4
- `);D(n,s,c.turnMd),resetTurnText()}export function resetTurnText(){c.turnMd="",c.turnRoots=[]}export function onErrorEvent(e){if(!e||!e.error)return;const n=a(e.sessionId);n&&h(n,r("div","errline","✗ "+e.error)),g(String(e.error))}export function onCommandOutput(e,n){const o=a(n)||O();o&&(N(o),String(e).split(`
5
- `).forEach(s=>h(o,r("div","cmdout",s))))}export function onLog(e){if(!e||typeof e.text!="string"||!e.text||e.diagnostic&&b()!=="verbose")return;const n=a(e.sessionId)||O();if(!n)return;const o=e.level,s=o==="error"?"errline":o==="warn"?"warnline":"detail",i=o==="error"?"✗ ":o==="warn"?"⚠ ":"↳ ",t=r("div",s);t.textContent=i+e.text,h(n,t),(o==="error"||o==="warn")&&g(e.text)}
4
+ `);$(n,s,c.turnMd),resetTurnText()}export function resetTurnText(){c.turnMd="",c.turnRoots=[]}export function onErrorEvent(e){if(!e||!e.error)return;const n=a(e.sessionId);n&&h(n,r("div","errline","✗ "+e.error)),g(String(e.error))}export function onCommandOutput(e,n){const o=a(n)||A;T(o),String(e).split(`
5
+ `).forEach(s=>h(o,r("div","cmdout",s))),z()}export function onLog(e){if(!e||typeof e.text!="string"||!e.text||e.diagnostic&&b()!=="verbose")return;const n=a(e.sessionId)||j();if(!n)return;const o=e.level,s=o==="error"?"errline":o==="warn"?"warnline":"detail",i=o==="error"?"✗ ":o==="warn"?"⚠ ":"↳ ",t=r("div",s);t.textContent=i+e.text,h(n,t),(o==="error"||o==="warn")&&g(e.text)}
@@ -0,0 +1 @@
1
+ export function renderFooter(t,r,o){const{workspace:i="",version:n="",moeActive:s=!1,dirLabel:a}=r,d=`${i} ${n} ${s}`;if(t.dataset.key!==d){if(t.dataset.key=d,t.textContent="",t.hidden=!i&&!n&&!s,i){t.appendChild(o("ws-k",a));const e=o("ws-v",i);e.title=i,t.appendChild(e)}if(s){const e=o("ws-moe","MoE");e.title="MoE is orchestrating this turn",t.appendChild(e)}if(n){const e=o("ws-ver",`mma ${n}`);e.title=`micro-models-agent ${n}`,t.appendChild(e)}}}
@@ -0,0 +1 @@
1
+ const y={idle:"c-dim track poke blink",think:"c-active st-think blink",read:"c-recon st-read",find:"c-recon st-find squint",web:"c-recon st-web squint",edit:"c-mutate st-edit narrow",type:"c-active st-type narrow",create:"c-mutate st-create",run:"c-exec st-run",tests:"c-exec st-tests",compact:"c-active st-compact",plan:"c-active st-plan",ask:"c-warn st-ask wide",done:"c-ok st-done happy celebrate",error:"c-err st-error sad",stop:"c-dim st-stop sleep",queued:"c-dim st-queued blink",boot:"c-dim st-boot",load:"c-dim st-load"},k={read_file:"read",list_dir:"read",file_info:"read",grep:"find",glob:"find",project_map:"find",chunk_query:"find",history:"find",recall:"find",web_search:"web",web_fetch:"web",download_file:"web",write_file:"create",create_dir:"create",edit_file:"edit",move_file:"edit",delete_file:"edit",attach_image:"edit",bash:"run",pipeline_run:"run",process_wait:"run",process_kill:"run",browser:"run",subagent:"run",mcp_call:"run",plan:"plan",todo:"plan",verify:"plan",lsp_check:"plan"};export function toolState(e){return k[e]||"run"}export function loaderStateFor(e){switch(e.type){case"turn_end":return e.success===!1?"error":"done";case"error":return"error";case"question":return"ask";case"text":return"type";case"tool_start":case"tool_end":return toolState(e.name||"");default:return"think"}}function r(e,n,t){const s=document.createElement(e);return n&&(s.className=n),t!=null&&(s.textContent=t),s}export function createFace(e="think",n=null){const t=r("span");t.setAttribute("aria-hidden","true"),t.dataset.size=n||"";const s=r("span","eyes");s.appendChild(r("i","eye left")),s.appendChild(r("i","eye right"));const c=r("span","orb");c.appendChild(r("i"));const a=r("span","keys");for(let o=0;o<4;o++)a.appendChild(r("i"));const i=r("span","dust");for(let o=0;o<3;o++)i.appendChild(r("i"));return t.append(s,c,a,r("span","grow"),r("span","fly"),i,r("span","q","?"),r("span","spark","✦"),r("span","star")),setFaceState(t,e),t}export function setFaceState(e,n){if(!e)return;const t=e.dataset.size||"";e.className="mdl"+(t?" "+t:"")+" "+y[n],e.dataset.state=n,y[n].includes("track")||(e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg"))}function p(e){return Array.from(document.querySelectorAll(e))}function w(e,n){for(const t of p(".mdl.track")){const s=t.getBoundingClientRect(),c=s.left+s.width/2,a=s.top+s.height/2,i=e-c,o=n-a,d=Math.hypot(i,o)||1,u=s.width*.16,l=Math.min(1,d/140),f=i/d,h=o/d;t.style.setProperty("--ex",(f*u*l).toFixed(1)+"px"),t.style.setProperty("--ey",(h*u*l).toFixed(1)+"px"),t.style.setProperty("--tilt",(f*6*l).toFixed(2)+"deg")}}function x(){for(const e of p(".mdl.track"))e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg")}let m=!1;export function initCursor(){if(m||typeof window>"u")return;m=!0,window.addEventListener("mousemove",n=>w(n.clientX,n.clientY)),window.addEventListener("mouseleave",x);let e=null;window.addEventListener("click",()=>{const n=p(".mdl.poke");if(n.length){for(const t of n)t.classList.remove("blink-once"),t.offsetWidth,t.classList.add("blink-once");e!==null&&window.clearTimeout(e),e=window.setTimeout(()=>{for(const t of n)t.classList.remove("blink-once");e=null},130)}})}
@@ -0,0 +1,5 @@
1
+ const u=/^\s*(```|~~~)/,n=/^(#{1,6})([^\s#].*)$/,c=/^(\s*)(\d+)\)(\s+)(.*)$/,d=/^\s*\|?\s*:?-{1,}:?(\s*\|\s*:?-{1,}:?)+\s*\|?\s*$/,o=/^(?!\s*[-*+]\s)(?!\s*\d+[.)]\s)(?!\s*>)(?!\s*(```|~~~)).*\|.*$/;function f(e){for(let t=0;t<e.length;t++)if(e[t]==="|"&&e[t-1]!=="\\")return!0;return!1}function h(e){let t=e.trim();return t.startsWith("|")||(t="| "+t),t.endsWith("|")||(t=t+" |"),t}function l(e){return f(e)&&d.test(e)}export class MdNormalizer{buf="";held=null;tableActive=!1;fence=!1;push(t){this.buf+=t==null?"":String(t);let i="",s=this.buf.indexOf(`
2
+ `);for(;s!==-1;){const r=this.buf.slice(0,s);this.buf=this.buf.slice(s+1),this.held!==null&&(i+=this.decide(this.held,r)+`
3
+ `),this.held=r,s=this.buf.indexOf(`
4
+ `)}return i}flush(){let t="";return this.held!==null&&(t+=this.decide(this.held,null)+`
5
+ `,this.held=null),this.buf&&(t+=this.decideInline(this.buf),this.buf=""),t}decide(t,i){if(this.fence)return u.test(t)&&(this.fence=!1),t;if(u.test(t))return this.fence=!0,t;if(l(t))return this.tableActive=!0,h(t);const s=o.test(t)&&f(t),r=i!==null&&i.trim()!==""&&l(i);return s&&(r||this.tableActive)?(this.tableActive=!0,h(t)):((t.trim()===""||!s)&&(this.tableActive=!1),this.decideInline(t))}decideInline(t){return n.test(t)?t.replace(n,"$1 $2"):t.replace(c,"$1$2.$3$4")}}export function normalizeMarkdown(e){const t=new MdNormalizer;return t.push(e)+t.flush()}
@@ -1 +1 @@
1
- import{inp as i,imgPicker as g,attachStrip as B,attachErr as k,sendBtn as p,el as f,icon as _}from"../dom.js";import{api as S}from"../api.js";import{t as c}from"../i18n.js";import{tabs as o,session as m,settings as y,MAX_IMAGES as C,MAX_IMAGE_BYTES as z}from"../store.js";import{contextLabel as W}from"../format.js";import{clearEmpty as N,activeFeed as Y,liveFeed as j,appendTo as v,scrollToBottom as P,clearFeed as J,finishMd as Q,resetTurnText as V,finishThink as Z,showBusy as $}from"../feed.js";import{setBusy as ee}from"../rail.js";import"../core/menus.js";import{openSessionsMenu as te}from"./sessions-menu.js";import{closeCmdk as F,updateCmdk as ne,cmdkKeydown as se,initCmdk as ae}from"./cmdk.js";let r={activeTab:()=>null,setTabStatus:()=>{},newChatTab:async()=>{},markTabDead:()=>{},openTab:()=>{},closeTab:()=>{},statusTitle:()=>""};export function initComposer(e){r={...r,...e}}ae({autogrow:T});const ie=200;function T(){i&&(i.style.height="auto",i.style.height=Math.min(i.scrollHeight,ie)+"px")}function oe(e){k&&(k.textContent=e,k.hidden=!1,clearTimeout(o.attachErrTimer),o.attachErrTimer=setTimeout(()=>{k.hidden=!0},4e3))}export function renderAttachments(){if(!B)return;B.textContent="",B.hidden=o.attachments.length===0,o.attachments.forEach((t,n)=>{const s=f("div","thumb"),a=document.createElement("img");a.alt="",a.src=t,s.appendChild(a);const d=f("button","rm");d.type="button",d.title=c("web.attach.remove"),d.setAttribute("aria-label",c("web.attach.remove")),d.appendChild(_("x")),d.addEventListener("click",()=>{o.attachments.splice(n,1),renderAttachments()}),s.appendChild(d),B.appendChild(s)});const e=r.activeTab();e&&(e.attachments=o.attachments.slice())}function re(e){return new Promise((t,n)=>{const s=new FileReader;s.onload=()=>t(String(s.result)),s.onerror=()=>n(s.error||new Error("read failed")),s.readAsDataURL(e)})}async function x(e){let t="";for(const n of e){if(!n||typeof n.type!="string"||n.type.indexOf("image/")!==0){t=c("web.attach.only_images");continue}if(o.attachments.length>=C){t=c("web.attach.too_many",{max:C});break}if(n.size>z){t=c("web.attach.too_large");continue}try{const s=await re(n);if(s.indexOf("data:image/")!==0){t=c("web.attach.invalid");continue}if(o.attachments.length>=C){t=c("web.attach.too_many",{max:C});break}o.attachments.push(s)}catch{t=c("web.attach.read_failed")}}renderAttachments(),t&&oe(t)}function ce(e,t){const n=f("div","u",e);return(t||[]).forEach(s=>{const a=document.createElement("img");a.className="uimg",a.alt="",a.src=s,n.appendChild(a)}),n}export function saveComposer(){const e=r.activeTab();!e||!i||(e.draft=i.value,e.attachments=o.attachments.slice())}export function restoreComposer(e){!e||!i||(i.value=e.draft||"",o.attachments=(e.attachments||[]).slice(),renderAttachments(),T(),F())}const de=document.getElementById("sessBar"),I=document.getElementById("sessNameBtn"),le=document.getElementById("sessName"),L=document.getElementById("sessPrev"),A=document.getElementById("sessNext"),D=document.getElementById("sessClose"),O=document.getElementById("sessTools"),q=document.getElementById("sessDD"),w=document.querySelector(".bar-top"),E=document.getElementById("newChat"),M=document.createComment("top-tools");w&&E&&w.insertBefore(M,E);function X(e){if(o.tabs.length<2)return;const t=o.tabs.findIndex(a=>a.id===o.activeTabId),n=t===-1?0:(t+e+o.tabs.length)%o.tabs.length,s=o.tabs[n];s&&r.openTab(s.id,s.name,s.kind,!0)}export function renderSessBar(){if(!de)return;const e=o.tabs.find(s=>s.id===o.activeTabId),t=e?e.name||String(e.id):"—";le.textContent=t,I.title=t+(e&&e.status&&e.status!=="idle"?" · "+r.statusTitle(e.status):"");const n=o.tabs.length>0;L.disabled=o.tabs.length<2,A.disabled=o.tabs.length<2,D.disabled=!n,I.disabled=!n}function U(){!w||!O||!E||!q||(window.matchMedia("(max-width: 760px)").matches?O.append(E,q):(w.insertBefore(E,M),w.insertBefore(q,M)))}if(L&&L.addEventListener("click",()=>X(-1)),A&&A.addEventListener("click",()=>X(1)),D&&D.addEventListener("click",()=>{o.activeTabId&&r.closeTab(o.activeTabId)}),I&&I.addEventListener("click",e=>{e.stopPropagation(),te()}),typeof window.matchMedia=="function"){const e=window.matchMedia("(max-width: 760px)");typeof e.addEventListener=="function"&&e.addEventListener("change",U),U()}g&&g.addEventListener("change",()=>{x(Array.from(g.files||[])),g.value=""});const G=document.getElementById("attachBtn");G&&g&&G.addEventListener("click",()=>g.click()),i.addEventListener("paste",e=>{const t=e.clipboardData&&e.clipboardData.items;if(!t)return;const n=[];for(const s of t)if(s.kind==="file"&&s.type&&s.type.indexOf("image/")===0){const a=s.getAsFile();a&&n.push(a)}n.length&&(e.preventDefault(),x(n))});const h=document.querySelector(".input-area");h&&(["dragenter","dragover"].forEach(e=>{h.addEventListener(e,t=>{t.preventDefault(),h.classList.add("dragover")})}),h.addEventListener("dragleave",e=>{const t=e;t.relatedTarget&&h.contains(t.relatedTarget)||h.classList.remove("dragover")}),h.addEventListener("drop",e=>{e.preventDefault(),h.classList.remove("dragover");const t=e.dataTransfer;t&&t.files&&t.files.length&&x(Array.from(t.files))}));function H(){i.value="",T(),F()}export function insertIntoDraft(e){if(!i||!e)return;const t=i.selectionStart??i.value.length,n=i.selectionEnd??t;i.value=i.value.slice(0,t)+e+i.value.slice(n);const s=t+e.length;i.selectionStart=i.selectionEnd=s;const a=r.activeTab();a&&(a.draft=i.value),T(),i.focus()}i&&i.addEventListener("input",()=>{const e=r.activeTab();e&&(e.draft=i.value),T(),ne()});async function K(){const e=i.value.trim(),t=o.attachments.slice();if(!e&&!t.length)return;const n=r.activeTab(),s=n&&n.kind==="session"?n.id:null,a=j()||Y();if(n&&n.dead){N(a),r.markTabDead(n.id);return}if(N(a),Q(),V(),Z(),e.startsWith("/")){v(a,f("div","u",e)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H();const u=e.slice(1).split(/\s+/)[0].toLowerCase();if(u==="clear"){J(a);return}if(u==="new"){r.newChatTab();return}const b={line:e};s&&(b.sessionId=s),(await S("/api/command",{method:"POST",body:b})).ok||v(a,f("div","detail","↳ "+c("web.misc.command_unavailable")));return}if(a&&a.querySelector(".startbanner")===null&&a.querySelector(".u")===null){const u=f("div","startbanner");u.appendChild(document.createTextNode(c("web.start.label")+" ")),u.appendChild(f("b","",y.config&&y.config.model||m.host.model||"—"));const b=m.host.sessionId?" · "+c("web.start.session")+" "+String(m.host.sessionId):"";u.appendChild(document.createTextNode(" · "+(m.host.provider||y.config&&y.config.provider&&y.config.provider.active||"—")+" · "+W()+b)),a.insertBefore(u,a.firstChild)}v(a,ce(e,t)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H(),s&&r.setTabStatus(s,"working");const d={text:e};t.length&&(d.images=t),s&&(d.sessionId=s);const l=await S("/api/message",{method:"POST",body:d});if(l.ok)if(l.data&&l.data.noop)l.data.notice&&v(a,f("div","detail",String(l.data.notice)));else if(l.data&&l.data.queued){const u=l.data.queuedForSession||l.data.queued;v(a,f("div","detail","↳ "+c("web.input.queued",{n:u}))),s&&r.setTabStatus(s,"queued")}else window.setTimeout(()=>$(a),180);else{const u=l.data&&l.data.error||l.status,b=u==="queue_full"?c("web.input.queue_full"):u;v(a,f("div","warnline","⚠ "+b)),s&&r.setTabStatus(s,"failed")}}async function R(){const e=r.activeTab(),t=e&&e.kind==="session"?e.id:null,n=m.runningSessionIds||[];t&&!n.includes(t)||!t&&!m.busy||await S("/api/interrupt",{method:"POST",body:t?{sessionId:t}:{}})}i.addEventListener("keydown",e=>{e.isComposing||e.keyCode===229||se(e)||(e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),K()):e.key==="Escape"&&(e.preventDefault(),R()))}),p&&p.addEventListener("click",()=>{const e=r.activeTab();e&&e.kind==="session"&&m.runningSessionIds.includes(e.id)?R():K()});export function reflectBusy(){const e=r.activeTab(),t=m.runningSessionIds||[],n=!!(e&&e.kind==="session"&&t.includes(e.id));i&&i.setAttribute("aria-busy",n?"true":"false");const s=document.querySelector(".input-area");if(s&&s.classList.toggle("busy",n),p){const d=n?c("web.input.stop"):c("web.input.send");p.textContent="",p.appendChild(_(n?"square":"arrow-up")),p.classList.toggle("busy",n),p.title=d,p.setAttribute("aria-label",d)}const a=document.getElementById("hintEsc");a&&(a.hidden=!n),ee(m.busy)}
1
+ import{inp as i,imgPicker as g,attachStrip as B,attachErr as k,sendBtn as p,el as f,icon as _}from"../dom.js";import{api as S}from"../api.js";import{t as c}from"../i18n.js";import{tabs as o,session as m,settings as T,MAX_IMAGES as C,MAX_IMAGE_BYTES as W}from"../store.js";import{contextLabel as z}from"../format.js";import{clearEmpty as N,activeFeed as Y,liveFeed as j,appendTo as v,scrollToBottom as P,clearFeed as J,finishMd as Q,resetTurnText as V,finishThink as Z,showBusy as $}from"../feed.js";import{setBusy as tt}from"../rail.js";import"../core/menus.js";import{openSessionsMenu as et}from"./sessions-menu.js";import{closeCmdk as F,updateCmdk as nt,cmdkKeydown as at,initCmdk as st}from"./cmdk.js";let r={activeTab:()=>null,setTabStatus:()=>{},newChatTab:async()=>{},markTabDead:()=>{},openTab:()=>{},closeTab:()=>{},statusTitle:()=>""};export function initComposer(t){r={...r,...t}}st({autogrow:w});const it=200;function w(){i&&(i.style.height="auto",i.style.height=Math.min(i.scrollHeight,it)+"px")}function ot(t){k&&(k.textContent=t,k.hidden=!1,clearTimeout(o.attachErrTimer),o.attachErrTimer=setTimeout(()=>{k.hidden=!0},4e3))}export function renderAttachments(){if(!B)return;B.textContent="",B.hidden=o.attachments.length===0,o.attachments.forEach((e,n)=>{const a=f("div","thumb"),s=document.createElement("img");s.alt="",s.src=e,a.appendChild(s);const d=f("button","rm");d.type="button",d.title=c("web.attach.remove"),d.setAttribute("aria-label",c("web.attach.remove")),d.appendChild(_("x")),d.addEventListener("click",()=>{o.attachments.splice(n,1),renderAttachments()}),a.appendChild(d),B.appendChild(a)});const t=r.activeTab();t&&(t.attachments=o.attachments.slice())}function rt(t){return new Promise((e,n)=>{const a=new FileReader;a.onload=()=>e(String(a.result)),a.onerror=()=>n(a.error||new Error("read failed")),a.readAsDataURL(t)})}async function x(t){let e="";for(const n of t){if(!n||typeof n.type!="string"||n.type.indexOf("image/")!==0){e=c("web.attach.only_images");continue}if(o.attachments.length>=C){e=c("web.attach.too_many",{max:C});break}if(n.size>W){e=c("web.attach.too_large");continue}try{const a=await rt(n);if(a.indexOf("data:image/")!==0){e=c("web.attach.invalid");continue}if(o.attachments.length>=C){e=c("web.attach.too_many",{max:C});break}o.attachments.push(a)}catch{e=c("web.attach.read_failed")}}renderAttachments(),e&&ot(e)}function ct(t,e){const n=f("div","u",t);return(e||[]).forEach(a=>{const s=document.createElement("img");s.className="uimg",s.alt="",s.src=a,n.appendChild(s)}),n}export function saveComposer(){const t=r.activeTab();!t||!i||(t.draft=i.value,t.attachments=o.attachments.slice())}export function restoreComposer(t){!t||!i||(i.value=t.draft||"",o.attachments=(t.attachments||[]).slice(),renderAttachments(),w(),F())}const dt=document.getElementById("sessBar"),I=document.getElementById("sessNameBtn"),lt=document.getElementById("sessName"),L=document.getElementById("sessPrev"),A=document.getElementById("sessNext"),D=document.getElementById("sessClose"),O=document.getElementById("sessTools"),q=document.getElementById("sessDD"),y=document.querySelector(".bar-top"),E=document.getElementById("newChat"),M=document.createComment("top-tools");y&&E&&y.insertBefore(M,E);function X(t){if(o.tabs.length<2)return;const e=o.tabs.findIndex(s=>s.id===o.activeTabId),n=e===-1?0:(e+t+o.tabs.length)%o.tabs.length,a=o.tabs[n];a&&r.openTab(a.id,a.name,a.kind,!0)}export function renderSessBar(){if(!dt)return;const t=o.tabs.find(a=>a.id===o.activeTabId),e=t?t.name||String(t.id):"—";lt.textContent=e,I.title=e+(t&&t.status&&t.status!=="idle"?" · "+r.statusTitle(t.status):"");const n=o.tabs.length>0;L.disabled=o.tabs.length<2,A.disabled=o.tabs.length<2,D.disabled=!n,I.disabled=!n}function U(){!y||!O||!E||!q||(window.matchMedia("(max-width: 760px)").matches?O.append(E,q):(y.insertBefore(E,M),y.insertBefore(q,M)))}if(L&&L.addEventListener("click",()=>X(-1)),A&&A.addEventListener("click",()=>X(1)),D&&D.addEventListener("click",()=>{o.activeTabId&&r.closeTab(o.activeTabId)}),I&&I.addEventListener("click",t=>{t.stopPropagation(),et()}),typeof window.matchMedia=="function"){const t=window.matchMedia("(max-width: 760px)");typeof t.addEventListener=="function"&&t.addEventListener("change",U),U()}g&&g.addEventListener("change",()=>{x(Array.from(g.files||[])),g.value=""});const G=document.getElementById("attachBtn");G&&g&&G.addEventListener("click",()=>g.click()),i.addEventListener("paste",t=>{const e=t.clipboardData&&t.clipboardData.items;if(!e)return;const n=[];for(const a of e)if(a.kind==="file"&&a.type&&a.type.indexOf("image/")===0){const s=a.getAsFile();s&&n.push(s)}n.length&&(t.preventDefault(),x(n))});const h=document.querySelector(".input-area");h&&(["dragenter","dragover"].forEach(t=>{h.addEventListener(t,e=>{e.preventDefault(),h.classList.add("dragover")})}),h.addEventListener("dragleave",t=>{const e=t;e.relatedTarget&&h.contains(e.relatedTarget)||h.classList.remove("dragover")}),h.addEventListener("drop",t=>{t.preventDefault(),h.classList.remove("dragover");const e=t.dataTransfer;e&&e.files&&e.files.length&&x(Array.from(e.files))}));function H(){i.value="",w(),F()}export function insertIntoDraft(t){if(!i||!t)return;const e=i.selectionStart??i.value.length,n=i.selectionEnd??e;i.value=i.value.slice(0,e)+t+i.value.slice(n);const a=e+t.length;i.selectionStart=i.selectionEnd=a;const s=r.activeTab();s&&(s.draft=i.value),w(),i.focus()}i&&i.addEventListener("input",()=>{const t=r.activeTab();t&&(t.draft=i.value),w(),nt()});async function K(){const t=i.value.trim(),e=o.attachments.slice();if(!t&&!e.length)return;!r.activeTab()&&!t.startsWith("/")&&await r.newChatTab();const n=r.activeTab(),a=n&&n.kind==="session"?n.id:null,s=j()||Y();if(n&&n.dead){N(s),r.markTabDead(n.id);return}if(N(s),Q(),V(),Z(),t.startsWith("/")){v(s,f("div","u",t)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H();const u=t.slice(1).split(/\s+/)[0].toLowerCase();if(u==="clear"){J(s);return}if(u==="new"){r.newChatTab();return}const b={line:t};a&&(b.sessionId=a),(await S("/api/command",{method:"POST",body:b})).ok||v(s,f("div","detail","↳ "+c("web.misc.command_unavailable")));return}if(s&&s.querySelector(".startbanner")===null&&s.querySelector(".u")===null){const u=f("div","startbanner");u.appendChild(document.createTextNode(c("web.start.label")+" ")),u.appendChild(f("b","",T.config&&T.config.model||m.host.model||"—"));const b=m.host.sessionId?" · "+c("web.start.session")+" "+String(m.host.sessionId):"";u.appendChild(document.createTextNode(" · "+(m.host.provider||T.config&&T.config.provider&&T.config.provider.active||"—")+" · "+z()+b)),s.insertBefore(u,s.firstChild)}v(s,ct(t,e)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H(),a&&r.setTabStatus(a,"working");const d={text:t};e.length&&(d.images=e),a&&(d.sessionId=a);const l=await S("/api/message",{method:"POST",body:d});if(l.ok)if(l.data&&l.data.noop)l.data.notice&&v(s,f("div","detail",String(l.data.notice)));else if(l.data&&l.data.queued){const u=l.data.queuedForSession||l.data.queued;v(s,f("div","detail","↳ "+c("web.input.queued",{n:u}))),a&&r.setTabStatus(a,"queued")}else window.setTimeout(()=>$(s),180);else{const u=l.data&&l.data.error||l.status,b=u==="queue_full"?c("web.input.queue_full"):u;v(s,f("div","warnline","⚠ "+b)),a&&r.setTabStatus(a,"failed")}}async function R(){const t=r.activeTab(),e=t&&t.kind==="session"?t.id:null,n=m.runningSessionIds||[];e&&!n.includes(e)||!e&&!m.busy||await S("/api/interrupt",{method:"POST",body:e?{sessionId:e}:{}})}i.addEventListener("keydown",t=>{t.isComposing||t.keyCode===229||at(t)||(t.key==="Enter"&&!t.shiftKey?(t.preventDefault(),K()):t.key==="Escape"&&(t.preventDefault(),R()))}),p&&p.addEventListener("click",()=>{const t=r.activeTab();t&&t.kind==="session"&&m.runningSessionIds.includes(t.id)?R():K()});export function reflectBusy(){const t=r.activeTab(),e=m.runningSessionIds||[],n=!!(t&&t.kind==="session"&&e.includes(t.id));i&&i.setAttribute("aria-busy",n?"true":"false");const a=document.querySelector(".input-area");if(a&&a.classList.toggle("busy",n),p){const d=n?c("web.input.stop"):c("web.input.send");p.textContent="",p.appendChild(_(n?"square":"arrow-up")),p.classList.toggle("busy",n),p.title=d,p.setAttribute("aria-label",d)}const s=document.getElementById("hintEsc");s&&(s.hidden=!n),tt(m.busy)}
@@ -1 +1 @@
1
- import{msgs as k,inp as S,tabstripEl as l,el as u,icon as I,link as E}from"../dom.js";import{api as m}from"../api.js";import{t as o}from"../i18n.js";import{tabs as a,session as b,hooks as A}from"../store.js";import{makeFeed as q,showEmptyFeed as D,activeFeed as F,appendTo as x,feedHasContent as B,loadHistory as O,syncUrl as h,scrollToBottom as w}from"../feed.js";import{setIndicator as M}from"../dialog.js";import{sidebarSessionChanged as P,setSessionLoading as v}from"../sidebar.js";import{setSessOpen as H}from"../core/menus.js";import{closeCmdk as W}from"./cmdk.js";import{saveComposer as C,restoreComposer as L,renderAttachments as Y,renderSessBar as _,initComposer as N}from"./composer.js";import{renderSessionsDropdown as p,initSessionsMenu as U}from"./sessions-menu.js";export{reflectBusy}from"./composer.js";export{loadCommands}from"./cmdk.js";export{renderSessionsDropdown}from"./sessions-menu.js";const V={working:"●",waiting:"◉",queued:"○",failed:"✗",dead:"✗"};function T(e){return e==="working"?o("web.tab.working"):e==="waiting"?o("web.tab.waiting"):e==="queued"?o("web.tab.queued"):e==="failed"?o("web.tab.failed"):e==="dead"?o("web.tab.gone"):""}export function activeTab(){return a.tabs.find(e=>e.id===a.activeTabId)||null}export function setTabStatus(e,t){if(!e)return;const i=a.tabs.find(n=>n.id===e);!i||i.status===t||i.dead||(i.status=t,c())}export function markTabDead(e){const t=a.tabs.find(s=>s.id===e);if(!t||t.dead)return;t.dead=!0,t.status="dead",t.historyLoaded=!0,t.historyFailed=!1,t.planCard=null,v(!1),t.feed.replaceChildren();const i=u("div","warnline","✗ "+o("web.session.gone"));x(t.feed,i);const n=E(o("web.topbar.close"),"",()=>closeTab(e));x(t.feed,n),t.feed===F()&&w(),c()}function c(){l.textContent="",a.tabs.forEach(e=>{const t=e.id===a.activeTabId,i=e.name||e.id,n=e.kind==="session"?String(e.id):i,s=u("div","stab"+(t?" on":""));if(s.setAttribute("role","tab"),s.setAttribute("tabindex",t?"0":"-1"),s.setAttribute("aria-selected",t?"true":"false"),s.setAttribute("aria-label",i),s.title=n,e.status&&e.status!=="idle"){const d=u("span","dot st-"+e.status,V[e.status]||"●");d.title=T(e.status),d.setAttribute("aria-label",T(e.status)),s.appendChild(d)}const r=u("span","name",i);r.title=n,s.appendChild(r);const f=u("button","stab-x");f.type="button",f.title=o("web.topbar.close"),f.setAttribute("aria-label",o("web.topbar.close")+": "+i),f.appendChild(I("x")),f.addEventListener("click",d=>{d.stopPropagation(),closeTab(e.id)}),s.appendChild(f);const g=()=>openTab(e.id,e.name,e.kind,!0);s.addEventListener("click",g),s.addEventListener("keydown",d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),g())}),l.appendChild(s)}),j(),_()}function j(){const e=l.querySelector(".stab.on");if(!e)return;const t=Math.max(0,e.offsetLeft-4);(t<l.scrollLeft||t+e.offsetWidth>l.scrollLeft+l.clientWidth)&&(l.scrollLeft=t)}l.addEventListener("wheel",e=>{e.deltaY!==0&&(e.preventDefault(),l.scrollLeft+=e.deltaY)},{passive:!1});export function updateTabName(e,t){if(!e||!t)return;const i=a.tabs.find(s=>s.id===e);i&&i.name!==t&&(i.name=t,c());const n=b.sessions.find(s=>s.id===e);n&&n.name!==t&&(n.name=t,p())}export function openTab(e,t,i,n){C();let s=a.tabs.find(r=>r.id===e);if(s?t&&(s.name=t):(s={id:e,name:t||e,kind:i||"session",feed:q(),historyLoaded:!1,historyLoading:!1,historyFailed:!1,dead:!1,planCard:null,draft:"",attachments:[],status:"idle"},a.tabs.push(s)),a.activeTabId=e,a.liveTabId=e,(i||"session")==="session"&&(b.activeSessionId=e,P(e),A.ensureTabState?.(e)),k.replaceChildren(s.feed),L(s),c(),p(),w(),s.kind==="session"&&!n&&(s.historyLoaded=!0),n&&s.kind==="session"){if(s.dead){h();return}(!B(s.feed)||s.historyFailed)&&(s.historyLoaded=!1),v(!0),m("/api/sessions/activate",{method:"POST",body:{id:e}}).then(r=>{if(r.status===404){markTabDead(e),loadSessions();return}loadSessions()}),O(s).then(r=>{r&&r.gone&&markTabDead(s.id)})}h()}export function closeTab(e){const t=a.tabs.findIndex(n=>n.id===e);if(t===-1)return;const i=a.activeTabId===e;if(i&&C(),a.tabs=a.tabs.filter(n=>n.id!==e),i){const n=a.tabs[Math.min(t,a.tabs.length-1)];n?(a.activeTabId=n.id,a.liveTabId=n.id,k.replaceChildren(n.feed),L(n),w()):(a.activeTabId=null,a.liveTabId=null,S&&(S.value=""),a.attachments=[],Y(),D())}c(),p(),h()}async function y(){const e=await m("/api/sessions",{method:"POST",body:{}});if(e.ok&&e.data&&e.data.session&&e.data.session.id){const t=e.data.session;openTab(t.id,t.name||String(t.id),"session",!1),await loadSessions(),v(!0);return}a.newSeq++,openTab("new"+a.newSeq,o("web.empty.title"),"new",!1),M(o("web.sessions.create_failed"),!0)}document.getElementById("newChat")?.addEventListener("click",()=>{y()});export function reconcileTabStatuses(){const e=b.runningSessionIds||[],t=b.queued||{};let i=!1;a.tabs.forEach(n=>{if(n.kind!=="session"||n.status==="waiting"||n.status==="failed"||n.status==="dead")return;const s=e.includes(n.id)?"working":t[n.id]>0?"queued":"idle";n.status!==s&&(n.status=s,i=!0)}),i&&c()}export async function loadSessions(){const e=await m("/api/sessions");!e.ok||!e.data||(b.sessions=Array.isArray(e.data.sessions)?e.data.sessions:[],p())}document.addEventListener("click",()=>{document.querySelectorAll("[data-sel]").forEach(e=>e.classList.remove("open")),H(!1),W()}),N({activeTab,setTabStatus,newChatTab:y,markTabDead,openTab,closeTab,statusTitle:T}),U({openTab,closeTab,loadSessions,newChatTab:y});
1
+ import{msgs as k,inp as x,tabstripEl as l,el as b,icon as A,link as q}from"../dom.js";import{api as p}from"../api.js";import{t as o}from"../i18n.js";import{tabs as i,session as f,hooks as h}from"../store.js";import{makeFeed as D,showEmptyFeed as F,activeFeed as O,appendTo as C,feedHasContent as B,loadHistory as P,syncUrl as v,scrollToBottom as w}from"../feed.js";import{setIndicator as M}from"../dialog.js";import{sidebarSessionChanged as L,setSessionLoading as T}from"../sidebar.js";import{setSessOpen as H}from"../core/menus.js";import{closeCmdk as W}from"./cmdk.js";import{saveComposer as I,restoreComposer as E,renderAttachments as Y,renderSessBar as _,initComposer as N}from"./composer.js";import{renderSessionsDropdown as m,initSessionsMenu as U}from"./sessions-menu.js";export{reflectBusy}from"./composer.js";export{loadCommands}from"./cmdk.js";export{renderSessionsDropdown}from"./sessions-menu.js";const V={working:"●",waiting:"◉",queued:"○",failed:"✗",dead:"✗"};function y(e){return e==="working"?o("web.tab.working"):e==="waiting"?o("web.tab.waiting"):e==="queued"?o("web.tab.queued"):e==="failed"?o("web.tab.failed"):e==="dead"?o("web.tab.gone"):""}export function activeTab(){return i.tabs.find(e=>e.id===i.activeTabId)||null}export function setTabStatus(e,t){if(!e)return;const a=i.tabs.find(s=>s.id===e);!a||a.status===t||a.dead||(a.status=t,u())}export function markTabDead(e){const t=i.tabs.find(n=>n.id===e);if(!t||t.dead)return;t.dead=!0,t.status="dead",t.historyLoaded=!0,t.historyFailed=!1,t.planCard=null,T(!1),t.feed.replaceChildren();const a=b("div","warnline","✗ "+o("web.session.gone"));C(t.feed,a);const s=q(o("web.topbar.close"),"",()=>closeTab(e));C(t.feed,s),t.feed===O()&&w(),u()}function u(){l.textContent="",i.tabs.forEach(e=>{const t=e.id===i.activeTabId,a=e.name||e.id,s=e.kind==="session"?String(e.id):a,n=b("div","stab"+(t?" on":""));if(n.setAttribute("role","tab"),n.setAttribute("tabindex",t?"0":"-1"),n.setAttribute("aria-selected",t?"true":"false"),n.setAttribute("aria-label",a),n.title=s,e.status&&e.status!=="idle"){const d=b("span","dot st-"+e.status,V[e.status]||"●");d.title=y(e.status),d.setAttribute("aria-label",y(e.status)),n.appendChild(d)}const r=b("span","name",a);r.title=s,n.appendChild(r);const c=b("button","stab-x");c.type="button",c.title=o("web.topbar.close"),c.setAttribute("aria-label",o("web.topbar.close")+": "+a),c.appendChild(A("x")),c.addEventListener("click",d=>{d.stopPropagation(),closeTab(e.id)}),n.appendChild(c);const g=()=>openTab(e.id,e.name,e.kind,!0);n.addEventListener("click",g),n.addEventListener("keydown",d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),g())}),l.appendChild(n)}),j(),_()}function j(){const e=l.querySelector(".stab.on");if(!e)return;const t=Math.max(0,e.offsetLeft-4);(t<l.scrollLeft||t+e.offsetWidth>l.scrollLeft+l.clientWidth)&&(l.scrollLeft=t)}l.addEventListener("wheel",e=>{e.deltaY!==0&&(e.preventDefault(),l.scrollLeft+=e.deltaY)},{passive:!1});export function updateTabName(e,t){if(!e||!t)return;const a=i.tabs.find(n=>n.id===e);a&&a.name!==t&&(a.name=t,u());const s=f.sessions.find(n=>n.id===e);s&&s.name!==t&&(s.name=t,m())}export function openTab(e,t,a,s){I();let n=i.tabs.find(r=>r.id===e);if(n?t&&(n.name=t):(n={id:e,name:t||e,kind:a||"session",feed:D(),historyLoaded:!1,historyLoading:!1,historyFailed:!1,dead:!1,planCard:null,draft:"",attachments:[],status:"idle"},i.tabs.push(n)),i.activeTabId=e,i.liveTabId=e,(a||"session")==="session"&&(f.activeSessionId=e,L(e),h.ensureTabState?.(e)),k.replaceChildren(n.feed),E(n),u(),m(),w(),n.kind==="session"&&!s&&(n.historyLoaded=!0),s&&n.kind==="session"){if(n.dead){v();return}(!B(n.feed)||n.historyFailed)&&(n.historyLoaded=!1),T(!0),p("/api/sessions/activate",{method:"POST",body:{id:e}}).then(r=>{if(r.status===404){markTabDead(e),loadSessions();return}loadSessions()}),P(n).then(r=>{r&&r.gone&&markTabDead(n.id)})}v()}export function closeTab(e){const t=i.tabs.findIndex(s=>s.id===e);if(t===-1)return;const a=i.activeTabId===e;if(a&&I(),i.tabs=i.tabs.filter(s=>s.id!==e),a){const s=i.tabs[Math.min(t,i.tabs.length-1)];s?(i.activeTabId=s.id,i.liveTabId=s.id,k.replaceChildren(s.feed),E(s),s.kind==="session"&&(f.activeSessionId=s.id,L(s.id),h.ensureTabState?.(s.id),p("/api/sessions/activate",{method:"POST",body:{id:s.id}})),w()):z()}u(),m(),v()}function z(){i.activeTabId=null,i.liveTabId=null,f.activeSessionId=null,f.host={},x&&(x.value=""),i.attachments=[],Y(),h.renderActive?.(),F(),p("/api/sessions/deactivate",{method:"POST",body:{}})}async function S(){const e=await p("/api/sessions",{method:"POST",body:{}});if(e.ok&&e.data&&e.data.session&&e.data.session.id){const t=e.data.session;openTab(t.id,t.name||String(t.id),"session",!1),await loadSessions(),T(!0);return}i.newSeq++,openTab("new"+i.newSeq,o("web.empty.title"),"new",!1),M(o("web.sessions.create_failed"),!0)}document.getElementById("newChat")?.addEventListener("click",()=>{S()});export function reconcileTabStatuses(){const e=f.runningSessionIds||[],t=f.queued||{};let a=!1;i.tabs.forEach(s=>{if(s.kind!=="session"||s.status==="waiting"||s.status==="failed"||s.status==="dead")return;const n=e.includes(s.id)?"working":t[s.id]>0?"queued":"idle";s.status!==n&&(s.status=n,a=!0)}),a&&u()}export async function loadSessions(){const e=await p("/api/sessions");!e.ok||!e.data||(f.sessions=Array.isArray(e.data.sessions)?e.data.sessions:[],m())}document.addEventListener("click",()=>{document.querySelectorAll("[data-sel]").forEach(e=>e.classList.remove("open")),H(!1),W()}),N({activeTab,setTabStatus,newChatTab:S,markTabDead,openTab,closeTab,statusTitle:y}),U({openTab,closeTab,loadSessions,newChatTab:S});
@@ -1 +1 @@
1
- import{el as a,makeToggle as g}from"../dom.js";import{tagsEditor as b,checkboxEditor as p,tableEditor as w}from"./editors.js";export function validateJson(i){const e=String(i??"").trim();if(!e)return{ok:!1,error:"required"};try{return JSON.parse(e),{ok:!0}}catch(s){return{ok:!1,error:s instanceof Error?s.message:"invalid JSON"}}}function u(i,e){const s=a("input");return s.setAttribute("aria-label",i),s.value=e,s}function m(i,e,s){const l=s.optionsSource==="providers"?e.providerOptions||[]:e.modelOptions||[],t=typeof i=="string"?i:"";if(!l.length){const o=u(e.label,t);return o.addEventListener("change",()=>e.post(o.value)),o}const n=a("select");n.setAttribute("aria-label",e.label);const c=a("option","",e.emptyLabel||"—");c.value="",n.appendChild(c);const d=new Set([""]);if(l.forEach(o=>{if(d.has(o))return;d.add(o);const y=a("option","",o);y.value=o,o===t&&(y.selected=!0),n.appendChild(y)}),t&&!d.has(t)){const o=a("option","",t);o.value=t,o.selected=!0,n.appendChild(o)}return n.value=t||"",n.addEventListener("change",()=>e.post(n.value)),n}export function controlFor(i,e,s){if(i.readOnly){const t=a("span","val dim",e==null?"—":String(e));return e!=null&&(t.title=String(e)),t}if(i.valueType==="bool")return g(!!e,t=>(s.post(t),!0));if(i.valueType==="enum"){const t=a("select");return t.setAttribute("aria-label",s.label),(i.enum||[]).forEach(n=>{const c=a("option","",s.enumLabel(n));c.value=n,n===e&&(c.selected=!0),t.appendChild(c)}),t.addEventListener("change",()=>s.post(t.value)),t}if(i.valueType==="int"){const t=u(s.label,e==null?"":String(e));return t.type="number",i.min!=null&&(t.min=String(i.min)),i.max!=null&&(t.max=String(i.max)),i.step!=null&&(t.step=String(i.step)),t.addEventListener("change",()=>s.post(t.value)),t}if(i.valueType==="share"){const t=u(s.label,e==null?"":Math.round(Number(e)*100)+"%");return t.addEventListener("change",()=>s.post(t.value)),t}const r=i.editor;if(r&&r.kind==="select")return m(e,s,r);if(r&&r.kind==="tags"&&(i.valueType==="list"||i.valueType==="json"))return b(e,s,r);if(r&&r.kind==="checkboxes")return p(e,s,r);if(r&&r.kind==="table")return w(e,s,r);if(i.valueType==="list"){const t=Array.isArray(e)?e.join(", "):e==null?"":String(e),n=u(s.label,t);return n.placeholder="a, b, c",n.addEventListener("change",()=>s.post(n.value)),n}if(i.valueType==="json"){const t=a("div","jsonctl"),n=a("textarea");n.setAttribute("aria-label",s.label),n.rows=3,n.value=e==null?"":JSON.stringify(e,null,2);const c=a("div","json-err");return c.hidden=!0,n.addEventListener("input",()=>{const d=validateJson(n.value);c.hidden=d.ok,c.textContent=d.ok?"":String(d.error||"invalid JSON")}),n.addEventListener("change",()=>{validateJson(n.value).ok?s.post(n.value.trim()):n.focus()}),t.appendChild(n),t.appendChild(c),t}const l=u(s.label,e==null?"":String(e));return l.addEventListener("change",()=>s.post(l.value)),l}export const PANEL_SECTIONS={general:[{id:"general.interface",titleKey:"web.settings.sec.general.interface",keys:["locale","ui.verbosity"]},{id:"general.agent",titleKey:"web.settings.sec.general.agent",descKey:"web.settings.sec.general.agent.desc",keys:["maxToolIterations","stuckThreshold","autoPlan","execution.autoAdvance"]},{id:"general.provider",titleKey:"web.settings.sec.general.provider",keys:["provider.fallback"]}],model:[{id:"model.tuning",titleKey:"web.settings.sec.model.tuning",descKey:"web.settings.sec.model.tuning.desc",keys:["provider.maxCompletionTokens","modelLoad.autoLoad","modelLoad.flashAttention","modelLoad.evalBatchSize","modelLoad.offloadKvCacheToGpu"]},{id:"model.capabilities",titleKey:"web.settings.sec.model.capabilities",descKey:"web.settings.sec.model.capabilities.desc",keys:["modelCapabilities"]}],context:[{id:"context.window",titleKey:"web.settings.sec.context.window",descKey:"web.settings.sec.context.window.desc",keys:["contextWindow","contextBudget.systemPrompt","contextBudget.responseReserve"]},{id:"context.compaction",titleKey:"web.settings.sec.context.compaction",descKey:"web.settings.sec.context.compaction.desc",keys:["contextBudget.compactionThreshold","contextBudget.compactionMinLoad","contextBudget.policy","contextBudget.compactionSummary","contextBudget.overflowCooldown","contextBudget.toolResultKeep","contextBudget.calibrationWarmup","contextBudget.ratioFloor"]},{id:"context.instructions",titleKey:"web.settings.sec.context.instructions",descKey:"web.settings.sec.context.instructions.desc",keys:["instructions.summarize"]},{id:"context.indexer",titleKey:"web.settings.sec.context.indexer",descKey:"web.settings.sec.context.indexer.desc",keys:["indexer.maxFiles","indexer.respectGitignore","indexer.mapTokenBudget"]},{id:"context.log",titleKey:"web.settings.sec.context.log",descKey:"web.settings.sec.context.log.desc",keys:["contextLog.enabled","contextLog.redact"]}],reasoning:[{id:"reasoning.display",titleKey:"web.settings.sec.reasoning.display",keys:["showReasoning"]},{id:"reasoning.effort",titleKey:"web.settings.sec.reasoning.effort",descKey:"web.settings.sec.reasoning.effort.desc",keys:["reasoning.mode","reasoning.min","reasoning.max","reasoning.baseline","reasoning.overrideCooldown"]}],agent:[{id:"agent.moe",titleKey:"web.settings.sec.agent.moe",descKey:"web.settings.sec.agent.moe.desc",keys:["moe.enabled","moe.maxReplanCycles","orchestrator.model","orchestrator.provider","orchestrator.contextWindow","experts"]},{id:"agent.critic",titleKey:"web.settings.sec.agent.critic",descKey:"web.settings.sec.agent.critic.desc",keys:["critic.enabled","critic.model","critic.provider","critic.tools","critic.maxCalls","critic.maxRepairCycles","critic.timeoutMs"]},{id:"agent.tools",titleKey:"web.settings.sec.agent.tools",descKey:"web.settings.sec.agent.tools.desc",keys:["tools.enableOnDemand","tools.defaultTags","tools.grepEngine","skills.budget"]},{id:"agent.subagent",titleKey:"web.settings.sec.agent.subagent",descKey:"web.settings.sec.agent.subagent.desc",keys:["subagent.resultMode","subagent.maxSummaryChars","subagent.maxParallelChunkQueries","subagent.stableSystemPrompt","subagent.timeoutMs"]},{id:"agent.hallucination",titleKey:"web.settings.sec.agent.hallucination",descKey:"web.settings.sec.agent.hallucination.desc",keys:["hallucination.judge.enabled"]}],network:[{id:"network.web",titleKey:"web.settings.sec.network.web",descKey:"web.settings.sec.network.web.desc",keys:["webSearch.enabled"]},{id:"network.error",titleKey:"web.settings.sec.network.error",descKey:"web.settings.sec.network.error.desc",keys:["errorWebSearch.enabled","errorWebSearch.threshold","errorWebSearch.maxResults","errorWebSearch.maxQueryChars","errorWebSearch.maxSearchesPerSession","errorWebSearch.requestTimeoutMs"]}],browser:[{id:"browser.main",titleKey:"web.settings.sec.browser.main",keys:["browser.enabled","browser.headless"]},{id:"browser.limits",titleKey:"web.settings.sec.browser.limits",descKey:"web.settings.sec.browser.limits.desc",keys:["browser.maxElements","browser.maxContentChars","browser.maxConsoleEntries","browser.maxConsoleLineChars"]},{id:"browser.viewport",titleKey:"web.settings.sec.browser.viewport",keys:["browser.viewportWidth","browser.viewportHeight","browser.navigationTimeout"]}],sessions:[{id:"sessions.main",titleKey:"web.settings.sec.sessions.main",descKey:"web.settings.sec.sessions.main.desc",keys:["session.autoSave","session.autoName","session.maxSessions","session.isolateMemory"]},{id:"sessions.isolation",titleKey:"web.settings.sec.sessions.isolation",descKey:"web.settings.sec.sessions.isolation.desc",keys:["sessionIsolation.enabled","sessionIsolation.isolatePlugins","sessionIsolation.isolateTempFiles"]}],ui:[{id:"ui.chat",titleKey:"web.settings.sec.ui.chat",descKey:"web.settings.sec.ui.chat.desc",keys:["ui.fontSize","ui.activityRail","ui.spinner","ui.showContextStats","ui.showCompaction"]},{id:"ui.images",titleKey:"web.settings.sec.ui.images",descKey:"web.settings.sec.ui.images.desc",keys:["images.maxCount","images.maxBytes"]}],security:[{id:"security.switches",titleKey:"web.settings.sec.security.switches",descKey:"web.settings.sec.security.switches.desc",keys:["security.enabled","security.bash.enabled","security.bash.blockDangerousFlags","security.paths.enabled","security.contentScan.enabled","security.network.enabled","security.sessionEncryption.enabled"]},{id:"security.limits",titleKey:"web.settings.sec.security.limits",descKey:"web.settings.sec.security.limits.desc",keys:["security.maxRecursionDepth","security.maxFileOperations","security.rateLimits.maxRequestsPerMinute","security.rateLimits.maxParallelTasks","security.network.requestTimeout","security.network.maxResponseSize"]},{id:"security.bash",titleKey:"web.settings.sec.security.bash",descKey:"web.settings.sec.security.bash.desc",keys:["security.bash.blacklist","security.bash.whitelist","security.bash.dangerousFlags","security.bash.dangerousOperators"]},{id:"security.paths",titleKey:"web.settings.sec.security.paths",descKey:"web.settings.sec.security.paths.desc",keys:["security.paths.denied","security.paths.allowed"]},{id:"security.network",titleKey:"web.settings.sec.security.network",descKey:"web.settings.sec.security.network.desc",keys:["security.network.deniedDomains","security.network.allowedDomains"]},{id:"security.scan",titleKey:"web.settings.sec.security.scan",descKey:"web.settings.sec.security.scan.desc",keys:["security.contentScan.dangerousPatterns"]},{id:"security.audit",titleKey:"web.settings.sec.security.audit",descKey:"web.settings.sec.security.audit.desc",keys:["security.auditNotifier.enabled","security.auditNotifier.filePath","security.auditNotifier.webhookUrl","security.auditNotifier.webhookTimeout","security.auditNotifier.minSeverity","security.auditNotifier.maxRetries","security.auditNotifier.eventTypes"]},{id:"security.encryption",titleKey:"web.settings.sec.security.encryption",descKey:"web.settings.sec.security.encryption.desc",keys:["security.sessionEncryption.encryptHistory","security.sessionEncryption.encryptSessionLog","security.sessionEncryption.keyPath"]}],advanced:[{id:"advanced.diagnostics",titleKey:"web.settings.sec.advanced.diagnostics",descKey:"web.settings.sec.advanced.diagnostics.desc",keys:["logLevel","version"]},{id:"advanced.retry",titleKey:"web.settings.sec.advanced.retry",descKey:"web.settings.sec.advanced.retry.desc",keys:["retry.maxRetries","retry.baseDelay","retry.maxDelay","retry.maxStreamRetries","retry.noDataTimeoutMs"]},{id:"advanced.service",titleKey:"web.settings.sec.advanced.service",descKey:"web.settings.sec.advanced.service.desc",keys:["pricing.enabled","pricing.overrides","updater.enabled","updater.checkOnStart","updater.autoInstall","updater.intervalMs"]}],plugins:[{id:"plugins.lsp",titleKey:"web.settings.sec.plugins.lsp",descKey:"web.settings.sec.plugins.lsp.desc",keys:["lsp.enabled","lsp.offline"]}]};export function keyToPanel(){const i=new Map;for(const[e,s]of Object.entries(PANEL_SECTIONS))for(const r of s)for(const l of r.keys)i.set(l,e);return i}
1
+ import{el as a,makeToggle as g}from"../dom.js";import{tagsEditor as b,checkboxEditor as p,tableEditor as w}from"./editors.js";export function validateJson(i){const e=String(i??"").trim();if(!e)return{ok:!1,error:"required"};try{return JSON.parse(e),{ok:!0}}catch(t){return{ok:!1,error:t instanceof Error?t.message:"invalid JSON"}}}function u(i,e){const t=a("input");return t.setAttribute("aria-label",i),t.value=e,t}function m(i,e,t){const l=t.optionsSource==="providers"?e.providerOptions||[]:e.modelOptions||[],s=typeof i=="string"?i:"";if(!l.length){const o=u(e.label,s);return o.addEventListener("change",()=>e.post(o.value)),o}const n=a("select");n.setAttribute("aria-label",e.label);const c=a("option","",e.emptyLabel||"—");c.value="",n.appendChild(c);const d=new Set([""]);if(l.forEach(o=>{if(d.has(o))return;d.add(o);const y=a("option","",o);y.value=o,o===s&&(y.selected=!0),n.appendChild(y)}),s&&!d.has(s)){const o=a("option","",s);o.value=s,o.selected=!0,n.appendChild(o)}return n.value=s||"",n.addEventListener("change",()=>e.post(n.value)),n}export function controlFor(i,e,t){if(i.readOnly){const s=a("span","val dim",e==null?"—":String(e));return e!=null&&(s.title=String(e)),s}if(i.valueType==="bool")return g(!!e,s=>(t.post(s),!0));if(i.valueType==="enum"){const s=a("select");return s.setAttribute("aria-label",t.label),(i.enum||[]).forEach(n=>{const c=a("option","",t.enumLabel(n));c.value=n,n===e&&(c.selected=!0),s.appendChild(c)}),s.addEventListener("change",()=>t.post(s.value)),s}if(i.valueType==="int"){const s=u(t.label,e==null?"":String(e));return s.type="number",i.min!=null&&(s.min=String(i.min)),i.max!=null&&(s.max=String(i.max)),i.step!=null&&(s.step=String(i.step)),s.addEventListener("change",()=>t.post(s.value)),s}if(i.valueType==="share"){const s=u(t.label,e==null?"":Math.round(Number(e)*100)+"%");return s.addEventListener("change",()=>t.post(s.value)),s}const r=i.editor;if(r&&r.kind==="select")return m(e,t,r);if(r&&r.kind==="tags"&&(i.valueType==="list"||i.valueType==="json"))return b(e,t,r);if(r&&r.kind==="checkboxes")return p(e,t,r);if(r&&r.kind==="table")return w(e,t,r);if(i.valueType==="list"){const s=Array.isArray(e)?e.join(", "):e==null?"":String(e),n=u(t.label,s);return n.placeholder="a, b, c",n.addEventListener("change",()=>t.post(n.value)),n}if(i.valueType==="json"){const s=a("div","jsonctl"),n=a("textarea");n.setAttribute("aria-label",t.label),n.rows=3,n.value=e==null?"":JSON.stringify(e,null,2);const c=a("div","json-err");return c.hidden=!0,n.addEventListener("input",()=>{const d=validateJson(n.value);c.hidden=d.ok,c.textContent=d.ok?"":String(d.error||"invalid JSON")}),n.addEventListener("change",()=>{validateJson(n.value).ok?t.post(n.value.trim()):n.focus()}),s.appendChild(n),s.appendChild(c),s}const l=u(t.label,e==null?"":String(e));return l.addEventListener("change",()=>t.post(l.value)),l}export const PANEL_SECTIONS={general:[{id:"general.interface",titleKey:"web.settings.sec.general.interface",keys:["locale","ui.verbosity"]},{id:"general.agent",titleKey:"web.settings.sec.general.agent",descKey:"web.settings.sec.general.agent.desc",keys:["maxToolIterations","stuckThreshold","autoPlan","execution.autoAdvance"]},{id:"general.provider",titleKey:"web.settings.sec.general.provider",keys:["provider.fallback"]}],model:[{id:"model.tuning",titleKey:"web.settings.sec.model.tuning",descKey:"web.settings.sec.model.tuning.desc",keys:["provider.maxCompletionTokens","modelLoad.autoLoad","modelLoad.flashAttention","modelLoad.evalBatchSize","modelLoad.offloadKvCacheToGpu"]},{id:"model.capabilities",titleKey:"web.settings.sec.model.capabilities",descKey:"web.settings.sec.model.capabilities.desc",keys:["modelCapabilities"]}],context:[{id:"context.window",titleKey:"web.settings.sec.context.window",descKey:"web.settings.sec.context.window.desc",keys:["contextWindow","contextBudget.systemPrompt","contextBudget.responseReserve"]},{id:"context.compaction",titleKey:"web.settings.sec.context.compaction",descKey:"web.settings.sec.context.compaction.desc",keys:["contextBudget.compactionThreshold","contextBudget.compactionMinLoad","contextBudget.policy","contextBudget.compactionSummary","contextBudget.overflowCooldown","contextBudget.toolResultKeep","contextBudget.calibrationWarmup","contextBudget.ratioFloor"]},{id:"context.instructions",titleKey:"web.settings.sec.context.instructions",descKey:"web.settings.sec.context.instructions.desc",keys:["instructions.summarize"]},{id:"context.indexer",titleKey:"web.settings.sec.context.indexer",descKey:"web.settings.sec.context.indexer.desc",keys:["indexer.maxFiles","indexer.respectGitignore","indexer.mapTokenBudget"]},{id:"context.log",titleKey:"web.settings.sec.context.log",descKey:"web.settings.sec.context.log.desc",keys:["contextLog.enabled","contextLog.redact"]}],reasoning:[{id:"reasoning.display",titleKey:"web.settings.sec.reasoning.display",keys:["showReasoning"]},{id:"reasoning.effort",titleKey:"web.settings.sec.reasoning.effort",descKey:"web.settings.sec.reasoning.effort.desc",keys:["reasoning.mode","reasoning.min","reasoning.max","reasoning.baseline","reasoning.overrideCooldown"]}],agent:[{id:"agent.moe",titleKey:"web.settings.sec.agent.moe",descKey:"web.settings.sec.agent.moe.desc",keys:["moe.enabled","moe.maxReplanCycles","moe.parallelSubtasks","orchestrator.model","orchestrator.provider","orchestrator.contextWindow","experts"]},{id:"agent.critic",titleKey:"web.settings.sec.agent.critic",descKey:"web.settings.sec.agent.critic.desc",keys:["critic.enabled","critic.model","critic.provider","critic.tools","critic.maxCalls","critic.maxRepairCycles","critic.timeoutMs"]},{id:"agent.tools",titleKey:"web.settings.sec.agent.tools",descKey:"web.settings.sec.agent.tools.desc",keys:["tools.enableOnDemand","tools.defaultTags","tools.grepEngine","skills.budget"]},{id:"agent.subagent",titleKey:"web.settings.sec.agent.subagent",descKey:"web.settings.sec.agent.subagent.desc",keys:["subagent.resultMode","subagent.maxSummaryChars","subagent.maxParallelChunkQueries","subagent.stableSystemPrompt","subagent.timeoutMs"]},{id:"agent.hallucination",titleKey:"web.settings.sec.agent.hallucination",descKey:"web.settings.sec.agent.hallucination.desc",keys:["hallucination.judge.enabled"]}],network:[{id:"network.web",titleKey:"web.settings.sec.network.web",descKey:"web.settings.sec.network.web.desc",keys:["webSearch.enabled"]},{id:"network.error",titleKey:"web.settings.sec.network.error",descKey:"web.settings.sec.network.error.desc",keys:["errorWebSearch.enabled","errorWebSearch.threshold","errorWebSearch.maxResults","errorWebSearch.maxQueryChars","errorWebSearch.maxSearchesPerSession","errorWebSearch.requestTimeoutMs"]},{id:"network.service",titleKey:"web.settings.sec.network.service",descKey:"web.settings.sec.network.service.desc",keys:["service.port","service.host","service.token","service.resultRetentionDays","service.idempotencyTtlHours","service.syncWaitMs","service.maxQueueLength","service.callbackTimeoutMs","service.webhookSecret"]}],browser:[{id:"browser.main",titleKey:"web.settings.sec.browser.main",keys:["browser.enabled","browser.headless"]},{id:"browser.limits",titleKey:"web.settings.sec.browser.limits",descKey:"web.settings.sec.browser.limits.desc",keys:["browser.maxElements","browser.maxContentChars","browser.maxConsoleEntries","browser.maxConsoleLineChars"]},{id:"browser.viewport",titleKey:"web.settings.sec.browser.viewport",keys:["browser.viewportWidth","browser.viewportHeight","browser.navigationTimeout"]}],sessions:[{id:"sessions.main",titleKey:"web.settings.sec.sessions.main",descKey:"web.settings.sec.sessions.main.desc",keys:["session.autoSave","session.autoName","session.maxSessions","session.isolateMemory"]},{id:"sessions.isolation",titleKey:"web.settings.sec.sessions.isolation",descKey:"web.settings.sec.sessions.isolation.desc",keys:["sessionIsolation.enabled","sessionIsolation.isolatePlugins","sessionIsolation.isolateTempFiles"]}],ui:[{id:"ui.chat",titleKey:"web.settings.sec.ui.chat",descKey:"web.settings.sec.ui.chat.desc",keys:["ui.fontSize","ui.activityRail","ui.spinner","ui.showContextStats","ui.showCompaction"]},{id:"ui.images",titleKey:"web.settings.sec.ui.images",descKey:"web.settings.sec.ui.images.desc",keys:["images.maxCount","images.maxBytes"]}],security:[{id:"security.switches",titleKey:"web.settings.sec.security.switches",descKey:"web.settings.sec.security.switches.desc",keys:["security.enabled","security.bash.enabled","security.bash.blockDangerousFlags","security.paths.enabled","security.contentScan.enabled","security.network.enabled","security.sessionEncryption.enabled"]},{id:"security.limits",titleKey:"web.settings.sec.security.limits",descKey:"web.settings.sec.security.limits.desc",keys:["security.maxRecursionDepth","security.maxFileOperations","security.rateLimits.maxRequestsPerMinute","security.rateLimits.maxParallelTasks","security.network.requestTimeout","security.network.maxResponseSize"]},{id:"security.bash",titleKey:"web.settings.sec.security.bash",descKey:"web.settings.sec.security.bash.desc",keys:["security.bash.blacklist","security.bash.whitelist","security.bash.dangerousFlags","security.bash.dangerousOperators"]},{id:"security.paths",titleKey:"web.settings.sec.security.paths",descKey:"web.settings.sec.security.paths.desc",keys:["security.paths.denied","security.paths.allowed"]},{id:"security.network",titleKey:"web.settings.sec.security.network",descKey:"web.settings.sec.security.network.desc",keys:["security.network.deniedDomains","security.network.allowedDomains"]},{id:"security.scan",titleKey:"web.settings.sec.security.scan",descKey:"web.settings.sec.security.scan.desc",keys:["security.contentScan.dangerousPatterns"]},{id:"security.audit",titleKey:"web.settings.sec.security.audit",descKey:"web.settings.sec.security.audit.desc",keys:["security.auditNotifier.enabled","security.auditNotifier.filePath","security.auditNotifier.webhookUrl","security.auditNotifier.webhookTimeout","security.auditNotifier.minSeverity","security.auditNotifier.maxRetries","security.auditNotifier.eventTypes"]},{id:"security.encryption",titleKey:"web.settings.sec.security.encryption",descKey:"web.settings.sec.security.encryption.desc",keys:["security.sessionEncryption.encryptHistory","security.sessionEncryption.encryptSessionLog","security.sessionEncryption.keyPath"]}],advanced:[{id:"advanced.diagnostics",titleKey:"web.settings.sec.advanced.diagnostics",descKey:"web.settings.sec.advanced.diagnostics.desc",keys:["logLevel","version"]},{id:"advanced.retry",titleKey:"web.settings.sec.advanced.retry",descKey:"web.settings.sec.advanced.retry.desc",keys:["retry.maxRetries","retry.baseDelay","retry.maxDelay","retry.maxStreamRetries","retry.noDataTimeoutMs"]},{id:"advanced.service",titleKey:"web.settings.sec.advanced.service",descKey:"web.settings.sec.advanced.service.desc",keys:["pricing.enabled","pricing.overrides","updater.enabled","updater.checkOnStart","updater.autoInstall","updater.intervalMs"]}],plugins:[{id:"plugins.registry",titleKey:"web.settings.sec.plugins.registry",descKey:"web.settings.sec.plugins.registry.desc",keys:["plugins.disabled","plugins.maxDrafts"]},{id:"plugins.lsp",titleKey:"web.settings.sec.plugins.lsp",descKey:"web.settings.sec.plugins.lsp.desc",keys:["lsp.enabled","lsp.offline"]}]};export function keyToPanel(){const i=new Map;for(const[e,t]of Object.entries(PANEL_SECTIONS))for(const r of t)for(const l of r.keys)i.set(l,e);return i}
@@ -1 +1 @@
1
- import{el as i,icon as T,link as k,inlineTextNodes as q,makeToggle as J}from"../dom.js";import{api as w}from"../api.js";import{t as s}from"../i18n.js";import{settings as l,getPath as D,THEME_KEY as N}from"../store.js";import{setIndicator as C}from"../dialog.js";import{controlFor as U,PANEL_SECTIONS as E}from"./controls.js";import{postConfig as j}from"./write.js";import{openSubDialog as O,closeSubDialog as _}from"./subdialog.js";import{mcpLiteralField as v,providerInput as x,providerSelect as H,providerCheck as P}from"./form.js";export function configLabel(e){const n="config.key."+e.key,t=s(n);return t===n?e.key:t}export function enumLabel(e){const n="config.enum."+e,t=s(n);return t===n?e:t}export function defFor(e){return l.registry.find(n=>n.key===e)||null}export function row(e,n,t){const d=i("div","row"),o=i("div","row-label");if(o.appendChild(i("span","row-name",e)),t&&o.appendChild(i("span","row-desc",t)),d.appendChild(o),typeof n=="string"){const a=i("span","val",n);a.title=n,d.appendChild(a)}else n&&d.appendChild(n);return d}export function descFor(e){const n="config.desc."+e,t=s(n);return t===n?"":t}function B(){const e=l.providers||{},n=l.config&&l.config.provider||{},d=(Array.isArray(e.entries)&&e.entries.length?e.entries:Array.isArray(n.entries)?n.entries:[]).map(a=>a.label||a.type).filter(a=>!!a),o=e.active||n.active;return o&&d.indexOf(o)===-1&&d.unshift(o),d}function Y(e,n){const t=e.readOnly&&e.value!==void 0?e.value:l.config?D(l.config,n):void 0;return U(e,t,{label:configLabel(e),enumLabel,emptyLabel:s("config.enum.none"),modelOptions:l.models,providerOptions:B(),fieldLabel:d=>{const o="config.field."+d,a=s(o);return a===o?d:a},post:d=>{j(n,d,!1)}})}function z(e){const n=i("div","settings-section"),t=i("div","sec-head");if(t.appendChild(i("span","sec-title",s(e.titleKey))),n.appendChild(t),e.descKey){const o=s(e.descKey);o!==e.descKey&&n.appendChild(i("div","sec-desc",o))}const d=i("div","sec-body");return e.keys.forEach(o=>{const a=defFor(o);a&&d.appendChild(row(configLabel(a),Y(a,o),descFor(a.key)))}),n.appendChild(d),n}export function renderSections(e,n){const t=document.querySelector('[data-panel="'+e+'"]');t&&n.forEach(d=>t.appendChild(z(d)))}export function renderPanel(e){const n=document.querySelector('[data-panel="'+e+'"]');n&&(n.textContent="",renderSections(e,E[e]||[]))}export function settingsSection(e){const n=i("div","settings-section"),t=i("div","sec-head");t.appendChild(i("span","sec-title",s(e))),n.appendChild(t);const d=i("div","sec-body");return n.appendChild(d),{el:n,head:t,body:d}}export function chip(e,n,t){const d=i("button","chip"+(n?" "+n:""),e);return d.type="button",d.addEventListener("click",t),d}export function placeholderFor(e,n){const t=i("div","placeholder");return e===void 0?t.textContent=s("web.settings.loading"):t.textContent=n,t}export function groupHeader(e,n){const t=i("div","row");return t.appendChild(i("span","val accent",e)),n!=null&&t.appendChild(i("span","val dim",String(n))),t}export function currentTheme(){return localStorage.getItem(N)||"auto"}function I(){const e=document.querySelector('[data-panel="ui"]');if(!e)return;e.textContent="";const n=i("span","seg");["dark","light","auto"].forEach(r=>{const p=i("button",currentTheme()===r?"on":"",r);p.type="button",p.setAttribute("aria-pressed",currentTheme()===r?"true":"false"),p.addEventListener("click",()=>{n.querySelectorAll("button").forEach(u=>{u.classList.remove("on"),u.setAttribute("aria-pressed","false")}),p.classList.add("on"),p.setAttribute("aria-pressed","true"),applyTheme(r)}),n.appendChild(p)});const t=i("div","settings-section"),d=i("div","sec-head");d.appendChild(i("span","sec-title",s("web.settings.sec.ui.theme"))),t.appendChild(d);const o=s("web.settings.sec.ui.theme.desc");o!=="web.settings.sec.ui.theme.desc"&&t.appendChild(i("div","sec-desc",o));const a=i("div","sec-body");a.appendChild(row(s("web.settings.theme"),n)),t.appendChild(a),e.appendChild(t),renderSections("ui",E.ui||[])}export function applyTheme(e){localStorage.setItem(N,e);const n=e==="light"||e==="auto"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;document.body.classList.toggle("light",!!n),I()}window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{currentTheme()==="auto"&&applyTheme("auto")});function G(){const e=document.querySelector('[data-panel="security"]');if(!e)return;e.textContent="",renderSections("security",E.security||[]);const n=i("div","settings-section"),t=i("div","sec-head");t.appendChild(i("span","sec-title",s("web.settings.sec.security.access"))),n.appendChild(t);const d=i("div","sec-body");d.appendChild(row(s("web.settings.web_token"),i("span","val dim",l.webToken||s("web.settings.web_token_none")),s("config.desc.webToken")));const o=i("div","placeholder");o.appendChild(i("span","tag",s("web.settings.terminal_tag"))),o.appendChild(document.createTextNode(" "+s("web.settings.security_note"))),d.appendChild(o),n.appendChild(d),e.appendChild(n)}const Q=["conventions","decisions","errors","facts"];function V(){const e=i("div","pform"),n=i("div","pform-grid"),t=i("select");t.setAttribute("aria-label",s("web.settings.memory_category")),Q.forEach(a=>t.appendChild(i("option","",a))),t.value="facts",n.appendChild(v(s("web.settings.memory_category"),t)),e.appendChild(n);const d=i("textarea");d.rows=5,d.placeholder=s("web.settings.new_memory"),d.value="",e.appendChild(v(s("web.settings.new_memory"),d));const o=i("div","pform-actions");o.appendChild(k(s("web.settings.save"),"",async()=>{const a=d.value.trim();if(!a){d.focus();return}const r=await w("/api/memory",{method:"POST",body:{category:t.value,text:a}});r.ok&&r.data&&r.data.ok?(_(),await loadMemory()):C(s("web.settings.add_failed"),!0)})),o.appendChild(k(s("web.settings.cancel"),"dim",()=>_())),e.appendChild(o),O(s("web.settings.memory_add_title"),e,()=>F())}function F(){const e=document.querySelector('[data-panel="memory"]');if(!e)return;if(e.textContent="",l.memory===void 0||l.memory===null){e.appendChild(placeholderFor(l.memory,s("web.settings.memory_unavailable")));return}const n=l.memory,t=i("button","sec-add");t.type="button",t.appendChild(T("plus")),t.appendChild(i("span","",s("web.settings.add"))),t.addEventListener("click",()=>V());const d=i("div","sec-head");d.appendChild(i("span","sec-title",s("web.settings.sec.memory.add"))),d.appendChild(t);const o=i("div","settings-section");o.appendChild(d),e.appendChild(o);const a=i("input","searchbox");a.placeholder=s("web.settings.search_memory"),a.setAttribute("aria-label",s("web.settings.search_memory")),e.appendChild(a);const r=i("div","settings-list");e.appendChild(r);const p=(h,g)=>{const c=i("div","mem-cat");return c.appendChild(i("span","",h)),g!=null&&c.appendChild(i("span","n",String(g))),c},u=(h,g)=>{const c=i("div","mem-entry"),m=i("span","mem-text");return m.appendChild(q(String(h??""))),m.title=String(h??""),c.appendChild(m),g&&c.appendChild(k(s("web.settings.forget"),"mem-del",g)),c},b=()=>{r.textContent="";const h=a.value.trim().toLowerCase();let g=!1;(n.categories||[]).forEach(m=>{const f=(m.entries||[]).filter(y=>!h||String(y.text).toLowerCase().indexOf(h)!==-1);f.length&&(g=!0,r.appendChild(p(m.name,f.length)),f.forEach(y=>{r.appendChild(u(y.text,async()=>{(await w("/api/memory/"+encodeURIComponent(m.name)+"/"+y.n,{method:"DELETE"})).ok?await loadMemory():C(s("web.settings.forget_failed"),!0)}))}))});const c=Object.entries(n.preferences||{});if(c.length&&!h&&(g=!0,r.appendChild(p(s("web.settings.preferences"),c.length)),c.forEach(([m,f])=>{r.appendChild(u(m+" = "+f))})),!g){const m=i("div","placeholder");m.textContent=h?s("web.settings.no_matches"):s("web.settings.no_memory"),r.appendChild(m)}};a.addEventListener("input",b),b()}function M(){const e=document.querySelector('[data-panel="skills"]');if(!e)return;if(e.textContent="",l.skills===void 0||l.skills===null){e.appendChild(placeholderFor(l.skills,s("web.settings.skills_unavailable")));return}if(!l.skills.length){const t=i("div","placeholder");t.textContent=s("web.settings.no_skills"),e.appendChild(t);return}const n=i("div","settings-list");l.skills.forEach(t=>{const d=i("div","skill-item"),o=i("div","skill-head");o.appendChild(i("span",t.enabled?"g":"dim",t.enabled?"✓":"○"));const a=i("span","name",t.name);if(a.title=t.name,o.appendChild(a),o.appendChild(i("span","st",t.enabled?s("web.settings.enabled"):s("web.settings.available"))),d.appendChild(o),t.source){const r=i("div","skill-src",t.source);r.title=t.source,d.appendChild(r)}n.appendChild(d)}),e.appendChild(n)}function S(){const e=document.querySelector('[data-panel="plugins"]');if(!e)return;if(e.textContent="",l.pluginsData===void 0||l.pluginsData===null){e.appendChild(placeholderFor(l.pluginsData,s("web.settings.plugins_unavailable")));return}const n=l.pluginsData,t=i("div","settings-list");if(t.appendChild(groupHeader(s("web.settings.plugins_header"),(n.plugins||[]).length)),!(n.plugins||[]).length){const a=i("div","placeholder");a.textContent=s("web.settings.no_plugins"),t.appendChild(a)}(n.plugins||[]).forEach(a=>{const r=i("div","list-line");r.appendChild(i("span","g","✓"));const p=i("span","name",a.name);if(p.title=a.name,r.appendChild(p),a.version&&r.appendChild(i("span","src","v"+a.version)),a.source){const u=i("span","src",a.source);u.title=a.source,r.appendChild(u)}a.builtin&&r.appendChild(i("span","src",s("web.settings.builtin"))),r.appendChild(i("span","st",a.enabled===!1?s("web.settings.disabled"):s("web.settings.enabled"))),t.appendChild(r)});const d=i("div","settings-note");d.textContent=s("web.settings.plugins_note"),t.appendChild(d),t.appendChild(groupHeader(s("web.settings.mcp_servers"),(n.mcp||[]).length));const o=i("button","sec-add");if(o.type="button",o.appendChild(T("plus")),o.appendChild(i("span","",s("web.settings.mcp_add"))),o.addEventListener("click",()=>R("add",null)),t.appendChild(o),!(n.mcp||[]).length){const a=i("div","placeholder");a.textContent=s("web.settings.no_mcp"),t.appendChild(a)}if((n.mcp||[]).forEach(a=>{const r=i("div","list-line"),p=a.status!=="disabled",u=J(p,h=>{w("/api/mcp/"+encodeURIComponent(a.id||a.name),{method:"POST",body:{enabled:h}}).then(async g=>{g.ok&&g.data&&g.data.ok?(C(s("web.settings.mcp_saved"),!1),await loadPlugins()):C(s("web.settings.save_failed"),!0)})});u.title=p?s("web.settings.mcp_disable"):s("web.settings.mcp_enable"),u.setAttribute("aria-label",u.title),r.appendChild(u);const b=i("span","name",a.name);b.title=a.name,r.appendChild(b),r.appendChild(i("span","st",a.status||"—")),r.appendChild(chip(s("web.settings.edit"),"",()=>R("edit",a))),r.appendChild(chip(s("web.settings.delete"),"danger",async()=>{const h=await w("/api/mcp/"+encodeURIComponent(a.id||a.name),{method:"DELETE"});h.ok&&h.data&&h.data.ok?(C(s("web.settings.mcp_saved"),!1),await loadPlugins()):C(h.data&&h.data.error||s("web.settings.delete_failed"),!0)})),t.appendChild(r)}),l.mcpForm&&t.appendChild(K()),(n.mcp||[]).length){const a=i("div","settings-note");a.textContent=s("web.settings.mcp_note"),t.appendChild(a)}Z(t),e.appendChild(t),renderSections("plugins",E.plugins||[])}function K(){const e=l.mcpForm&&l.mcpForm.mode||"add",n=l.mcpForm&&l.mcpForm.entry||{},t=i("div","pform"),d=i("div","pform-grid"),o=x(n.name||"","text","my-server"),a=H(["stdio","sse","http"],n.transport||"stdio"),r=x(n.command||"","text","npx"),p=x(n.url||"","text","https://…");d.appendChild(v("name",o)),d.appendChild(v("transport",a)),d.appendChild(v("command",r)),d.appendChild(v("url",p)),t.appendChild(d);const u=i("details","pform-adv");u.appendChild(i("summary","",s("web.settings.provider_advanced")));const b=x(n.args?JSON.stringify(n.args):"","text",'["--stdio"]'),h=x(n.timeout!=null?String(n.timeout):"","number","30000"),g=P(n.enabled!==!1);u.appendChild(v("args (JSON)",b)),u.appendChild(v("timeout (ms)",h));const c=Array.isArray(n.envKeys)?n.envKeys:[],m=Array.isArray(n.headerKeys)?n.headerKeys:[],f=i("textarea");f.placeholder=c.length?"stored: "+c.join(", ")+" — blank keeps":'{"TOKEN": "…"}';const y=i("textarea");y.placeholder=m.length?"stored: "+m.join(", ")+" — blank keeps":'{"Authorization": "…"}',u.appendChild(v("env (JSON)",f)),u.appendChild(v("headers (JSON)",y)),u.appendChild(v("enabled",g)),t.appendChild(u);const L={name:o,transport:a,command:r,url:p,args:b,timeout:h,env:f,headers:y,enabled:g},A=i("div","pform-actions");return A.appendChild(k(s("web.settings.save"),"",()=>{X(L,e,n)})),A.appendChild(k(s("web.settings.cancel"),"dim",()=>_())),t.appendChild(A),t}function R(e,n){l.mcpForm={mode:e,entry:n||null},O(s(e==="edit"?"web.settings.mcp_edit_title":"web.settings.mcp_add"),K(),()=>{l.mcpForm=null,S(),loadPlugins()})}function W(e){const n=e.trim();if(!n)return{present:!1,value:null};let t=null;try{t=JSON.parse(n)}catch{return{present:!0,value:null}}return!t||typeof t!="object"||Array.isArray(t)?{present:!0,value:null}:Object.values(t).every(d=>typeof d=="string")?{present:!0,value:t}:{present:!0,value:null}}async function X(e,n,t){const d=e.name.value.trim(),o=e.transport.value||"stdio",a=e.command.value.trim(),r=e.url.value.trim();if(!d||(o==="stdio"?!a:!r)){C(s("web.settings.mcp_required"),!0);return}const p={name:d,transport:o};a&&(p.command=a),r&&(p.url=r);const u=e.args.value.trim();if(u){let c=null;try{c=JSON.parse(u)}catch{c=null}if(!Array.isArray(c)||!c.every(m=>typeof m=="string")){C(s("web.settings.mcp_invalid"),!0);return}p.args=c}for(const c of["env","headers"]){const m=W(e[c].value);if(m.present&&!m.value){C(s("web.settings.mcp_invalid"),!0);return}m.present&&(p[c]=m.value)}const b=e.timeout.value.trim();if(b){const c=Number(b);if(!Number.isInteger(c)||c<1e3||c>3e5){C(s("web.settings.mcp_invalid"),!0);return}p.timeout=c}p.enabled=e.enabled.checked;const h=n==="edit"?"/api/mcp/"+encodeURIComponent(t.id||t.name):"/api/mcp",g=await w(h,{method:n==="edit"?"PUT":"POST",body:p});g.ok&&g.data&&g.data.ok?(C(s("web.settings.mcp_saved"),!1),_()):C(g.data&&g.data.error||s("web.settings.save_failed"),!0)}function Z(e){const n=l.lsp;if(e.appendChild(groupHeader(s("web.settings.lsp_servers"),Array.isArray(n)?n.length:null)),n==null){e.appendChild(placeholderFor(n,s("web.settings.lsp_unavailable")));return}if(!n.length){const t=i("div","placeholder");t.textContent=s("web.settings.no_lsp"),e.appendChild(t)}if(n.forEach(t=>{const d=i("div","list-line");d.appendChild(i("span",t.enabled?"g":"dim",t.enabled?"✓":"○"));const o=i("span","name",t.lang);o.title=t.lang,d.appendChild(o);const a=[t.command,t.timeout!=null?t.timeout+" ms":null].filter(Boolean).join(" · ");a&&d.appendChild(i("span","src",a)),d.appendChild(i("span","st",t.enabled?s("web.settings.enabled"):s("web.settings.disabled"))),d.appendChild(chip(s("web.settings.edit"),"",()=>$(t))),e.appendChild(d)}),n.length){const t=i("div","settings-note");t.textContent=s("web.settings.lsp_note"),e.appendChild(t)}}function $(e){l.lspForm={lang:e.lang,entry:e},O(e.lang,ee(),()=>{l.lspForm=null,S(),loadLsp()})}function ee(){const e=l.lspForm&&l.lspForm.entry||{},n=l.lspForm&&l.lspForm.lang||e.lang||"",t=i("div","pform"),d=i("div","pform-grid"),o=x(e.command||"","text","npx"),a=x(e.timeout!=null?String(e.timeout):"","number","30000"),r=P(e.enabled!==!1);d.appendChild(v("command",o)),d.appendChild(v("timeout (ms)",a)),d.appendChild(v("enabled",r)),t.appendChild(d);const p=i("textarea");p.value=e.args?JSON.stringify(e.args):"",p.placeholder='["--stdio"]',t.appendChild(v("args (JSON)",p));const u=i("div","pform-actions");return u.appendChild(k(s("web.settings.save"),"",async()=>{const b={},h=o.value.trim();h&&(b.command=h);const g=a.value.trim();if(g){const f=Number(g);if(!Number.isInteger(f)||f<1e3||f>3e5){C(s("web.settings.provider_invalid"),!0);return}b.timeout=f}const c=p.value.trim();if(c){let f=null;try{f=JSON.parse(c)}catch{f=null}if(!Array.isArray(f)||!f.every(y=>typeof y=="string")){C(s("web.settings.provider_invalid"),!0);return}b.args=f}b.enabled=r.checked;const m=await w("/api/lsp/"+encodeURIComponent(n),{method:"PUT",body:b});m.ok&&m.data&&m.data.ok?(C(s("web.settings.mcp_saved"),!1),_()):C(m.data&&m.data.error||s("web.settings.save_failed"),!0)})),u.appendChild(k(s("web.settings.cancel"),"dim",()=>_())),t.appendChild(u),t}export async function loadLsp(){const e=await w("/api/lsp");l.lsp=e.ok&&e.data&&Array.isArray(e.data.servers)?e.data.servers:null,S()}export async function loadMemory(){const e=await w("/api/memory");l.memory=e.ok&&e.data?e.data:null,F()}export async function loadSkills(){const e=await w("/api/skills");l.skills=e.ok&&e.data&&Array.isArray(e.data.skills)?e.data.skills:null,M()}export async function loadPlugins(){const e=await w("/api/plugins");l.pluginsData=e.ok&&e.data?{plugins:e.data.plugins||[],mcp:e.data.mcp||[]}:null,S()}export{I as renderUiPanel,F as renderMemoryPanel,M as renderSkillsPanel,S as renderPluginsPanel,G as renderSecurityPanel};
1
+ import{el as i,icon as O,link as k,inlineTextNodes as q,makeToggle as L}from"../dom.js";import{api as y}from"../api.js";import{t as a}from"../i18n.js";import{settings as l,getPath as J,THEME_KEY as P}from"../store.js";import{setIndicator as b}from"../dialog.js";import{controlFor as U,PANEL_SECTIONS as E}from"./controls.js";import{postConfig as j}from"./write.js";import{openSubDialog as T,closeSubDialog as x}from"./subdialog.js";import{mcpLiteralField as v,providerInput as _,providerSelect as H,providerCheck as I}from"./form.js";export function configLabel(e){const n="config.key."+e.key,t=a(n);return t===n?e.key:t}export function enumLabel(e){const n="config.enum."+e,t=a(n);return t===n?e:t}export function defFor(e){return l.registry.find(n=>n.key===e)||null}export function row(e,n,t){const s=i("div","row"),o=i("div","row-label");if(o.appendChild(i("span","row-name",e)),t&&o.appendChild(i("span","row-desc",t)),s.appendChild(o),typeof n=="string"){const r=i("span","val",n);r.title=n,s.appendChild(r)}else n&&s.appendChild(n);return s}export function descFor(e){const n="config.desc."+e,t=a(n);return t===n?"":t}function B(){const e=l.providers||{},n=l.config&&l.config.provider||{},s=(Array.isArray(e.entries)&&e.entries.length?e.entries:Array.isArray(n.entries)?n.entries:[]).map(r=>r.label||r.type).filter(r=>!!r),o=e.active||n.active;return o&&s.indexOf(o)===-1&&s.unshift(o),s}function Y(e,n){const t=e.readOnly&&e.value!==void 0?e.value:l.config?J(l.config,n):void 0;return U(e,t,{label:configLabel(e),enumLabel,emptyLabel:a("config.enum.none"),modelOptions:l.models,providerOptions:B(),fieldLabel:s=>{const o="config.field."+s,r=a(o);return r===o?s:r},post:s=>{j(n,s,!1)}})}function z(e){const n=i("div","settings-section"),t=i("div","sec-head");if(t.appendChild(i("span","sec-title",a(e.titleKey))),n.appendChild(t),e.descKey){const o=a(e.descKey);o!==e.descKey&&n.appendChild(i("div","sec-desc",o))}const s=i("div","sec-body");return e.keys.forEach(o=>{const r=defFor(o);r&&s.appendChild(row(configLabel(r),Y(r,o),descFor(r.key)))}),n.appendChild(s),n}export function renderSections(e,n){const t=document.querySelector('[data-panel="'+e+'"]');t&&n.forEach(s=>t.appendChild(z(s)))}export function renderPanel(e){const n=document.querySelector('[data-panel="'+e+'"]');n&&(n.textContent="",renderSections(e,E[e]||[]))}export function settingsSection(e){const n=i("div","settings-section"),t=i("div","sec-head");t.appendChild(i("span","sec-title",a(e))),n.appendChild(t);const s=i("div","sec-body");return n.appendChild(s),{el:n,head:t,body:s}}export function chip(e,n,t){const s=i("button","chip"+(n?" "+n:""),e);return s.type="button",s.addEventListener("click",t),s}export function placeholderFor(e,n){const t=i("div","placeholder");return e===void 0?t.textContent=a("web.settings.loading"):t.textContent=n,t}export function groupHeader(e,n){const t=i("div","row");return t.appendChild(i("span","val accent",e)),n!=null&&t.appendChild(i("span","val dim",String(n))),t}export function currentTheme(){return localStorage.getItem(P)||"auto"}function M(){const e=document.querySelector('[data-panel="ui"]');if(!e)return;e.textContent="";const n=i("span","seg");["dark","light","auto"].forEach(d=>{const p=i("button",currentTheme()===d?"on":"",d);p.type="button",p.setAttribute("aria-pressed",currentTheme()===d?"true":"false"),p.addEventListener("click",()=>{n.querySelectorAll("button").forEach(g=>{g.classList.remove("on"),g.setAttribute("aria-pressed","false")}),p.classList.add("on"),p.setAttribute("aria-pressed","true"),applyTheme(d)}),n.appendChild(p)});const t=i("div","settings-section"),s=i("div","sec-head");s.appendChild(i("span","sec-title",a("web.settings.sec.ui.theme"))),t.appendChild(s);const o=a("web.settings.sec.ui.theme.desc");o!=="web.settings.sec.ui.theme.desc"&&t.appendChild(i("div","sec-desc",o));const r=i("div","sec-body");r.appendChild(row(a("web.settings.theme"),n)),t.appendChild(r),e.appendChild(t),renderSections("ui",E.ui||[])}export function applyTheme(e){localStorage.setItem(P,e);const n=e==="light"||e==="auto"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches;document.body.classList.toggle("light",!!n),M()}window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{currentTheme()==="auto"&&applyTheme("auto")});function G(){const e=document.querySelector('[data-panel="security"]');if(!e)return;e.textContent="",renderSections("security",E.security||[]);const n=i("div","settings-section"),t=i("div","sec-head");t.appendChild(i("span","sec-title",a("web.settings.sec.security.access"))),n.appendChild(t);const s=i("div","sec-body");s.appendChild(row(a("web.settings.web_token"),i("span","val dim",l.webToken||a("web.settings.web_token_none")),a("config.desc.webToken")));const o=i("div","placeholder");o.appendChild(i("span","tag",a("web.settings.terminal_tag"))),o.appendChild(document.createTextNode(" "+a("web.settings.security_note"))),s.appendChild(o),n.appendChild(s),e.appendChild(n)}const Q=["conventions","decisions","errors","facts"];function V(){const e=i("div","pform"),n=i("div","pform-grid"),t=i("select");t.setAttribute("aria-label",a("web.settings.memory_category")),Q.forEach(r=>t.appendChild(i("option","",r))),t.value="facts",n.appendChild(v(a("web.settings.memory_category"),t)),e.appendChild(n);const s=i("textarea");s.rows=5,s.placeholder=a("web.settings.new_memory"),s.value="",e.appendChild(v(a("web.settings.new_memory"),s));const o=i("div","pform-actions");o.appendChild(k(a("web.settings.save"),"",async()=>{const r=s.value.trim();if(!r){s.focus();return}const d=await y("/api/memory",{method:"POST",body:{category:t.value,text:r}});d.ok&&d.data&&d.data.ok?(x(),await loadMemory()):b(a("web.settings.add_failed"),!0)})),o.appendChild(k(a("web.settings.cancel"),"dim",()=>x())),e.appendChild(o),T(a("web.settings.memory_add_title"),e,()=>N())}function N(){const e=document.querySelector('[data-panel="memory"]');if(!e)return;if(e.textContent="",l.memory===void 0||l.memory===null){e.appendChild(placeholderFor(l.memory,a("web.settings.memory_unavailable")));return}const n=l.memory,t=i("button","sec-add");t.type="button",t.appendChild(O("plus")),t.appendChild(i("span","",a("web.settings.add"))),t.addEventListener("click",()=>V());const s=i("div","sec-head");s.appendChild(i("span","sec-title",a("web.settings.sec.memory.add"))),s.appendChild(t);const o=i("div","settings-section");o.appendChild(s),e.appendChild(o);const r=i("input","searchbox");r.placeholder=a("web.settings.search_memory"),r.setAttribute("aria-label",a("web.settings.search_memory")),e.appendChild(r);const d=i("div","settings-list");e.appendChild(d);const p=(f,u)=>{const c=i("div","mem-cat");return c.appendChild(i("span","",f)),u!=null&&c.appendChild(i("span","n",String(u))),c},g=(f,u)=>{const c=i("div","mem-entry"),m=i("span","mem-text");return m.appendChild(q(String(f??""))),m.title=String(f??""),c.appendChild(m),u&&c.appendChild(k(a("web.settings.forget"),"mem-del",u)),c},h=()=>{d.textContent="";const f=r.value.trim().toLowerCase();let u=!1;(n.categories||[]).forEach(m=>{const C=(m.entries||[]).filter(w=>!f||String(w.text).toLowerCase().indexOf(f)!==-1);C.length&&(u=!0,d.appendChild(p(m.name,C.length)),C.forEach(w=>{d.appendChild(g(w.text,async()=>{(await y("/api/memory/"+encodeURIComponent(m.name)+"/"+w.n,{method:"DELETE"})).ok?await loadMemory():b(a("web.settings.forget_failed"),!0)}))}))});const c=Object.entries(n.preferences||{});if(c.length&&!f&&(u=!0,d.appendChild(p(a("web.settings.preferences"),c.length)),c.forEach(([m,C])=>{d.appendChild(g(m+" = "+C))})),!u){const m=i("div","placeholder");m.textContent=f?a("web.settings.no_matches"):a("web.settings.no_memory"),d.appendChild(m)}};r.addEventListener("input",h),h()}function D(){const e=document.querySelector('[data-panel="skills"]');if(!e)return;if(e.textContent="",l.skills===void 0||l.skills===null){e.appendChild(placeholderFor(l.skills,a("web.settings.skills_unavailable")));return}if(!l.skills.length){const t=i("div","placeholder");t.textContent=a("web.settings.no_skills"),e.appendChild(t);return}const n=i("div","settings-list");l.skills.forEach(t=>{const s=i("div","skill-item"),o=i("div","skill-head");o.appendChild(i("span",t.enabled?"g":"dim",t.enabled?"✓":"○"));const r=i("span","name",t.name);if(r.title=t.name,o.appendChild(r),o.appendChild(i("span","st",t.enabled?a("web.settings.enabled"):a("web.settings.available"))),s.appendChild(o),t.source){const d=i("div","skill-src",t.source);d.title=t.source,s.appendChild(d)}n.appendChild(s)}),e.appendChild(n)}async function W(){b(a("web.plugins.reloading"),!1);const e=await y("/api/reload/plugins",{method:"POST"});if(!e.ok||!e.data||e.data.ok!==!0){b(a("web.plugins.reload_failed"),!0);return}const n=e.data.reload||{},t=n.plugins||{},s=n.skills||{},o=[a("web.plugins.reload_done",{loaded:String(t.loaded??0),unloaded:String(t.unloaded??0),failed:String(t.failed??0)})];(Number(s.added)>0||Number(s.removed)>0)&&o.push(a("web.plugins.reload_skills",{added:String(s.added??0),removed:String(s.removed??0)})),b(o.join(" · "),Number(t.failed)>0),Number(t.staleTs)>0&&b(a("web.plugins.reload_stale",{count:String(t.staleTs)}),!0),await loadPlugins()}async function X(e,n){const t=await y("/api/plugins/"+encodeURIComponent(e),{method:"POST",body:{enabled:n}});if(!t.ok||!t.data||t.data.ok!==!0){b(a("web.plugins.toggle_failed"),!0);return}l.pluginsData={plugins:t.data.plugins||[],mcp:l.pluginsData&&l.pluginsData.mcp||[]},S()}function S(){const e=document.querySelector('[data-panel="plugins"]');if(!e)return;if(e.textContent="",l.pluginsData===void 0||l.pluginsData===null){e.appendChild(placeholderFor(l.pluginsData,a("web.settings.plugins_unavailable")));return}const n=l.pluginsData,t=i("div","settings-list");if(t.appendChild(groupHeader(a("web.settings.plugins_header"),(n.plugins||[]).length)),!(n.plugins||[]).length){const d=i("div","placeholder");d.textContent=a("web.settings.no_plugins"),t.appendChild(d)}(n.plugins||[]).forEach(d=>{const p=i("div","list-line");p.appendChild(i("span","g",d.enabled===!1?"–":"✓"));const g=i("span","name",d.name);if(g.title=d.name,p.appendChild(g),d.version&&p.appendChild(i("span","src","v"+d.version)),d.source){const h=i("span","src",d.source);h.title=d.source,p.appendChild(h)}d.builtin&&p.appendChild(i("span","src",a("web.settings.builtin"))),p.appendChild(L(d.enabled!==!1,()=>{X(d.name,d.enabled===!1)})),t.appendChild(p)});const s=i("div","settings-note");s.textContent=a("web.settings.plugins_note"),t.appendChild(s);const o=i("button","sec-add");o.type="button",o.appendChild(O("refresh")),o.appendChild(i("span","",a("web.plugins.reload"))),o.addEventListener("click",()=>{W()}),t.appendChild(o),t.appendChild(groupHeader(a("web.settings.mcp_servers"),(n.mcp||[]).length));const r=i("button","sec-add");if(r.type="button",r.appendChild(O("plus")),r.appendChild(i("span","",a("web.settings.mcp_add"))),r.addEventListener("click",()=>R("add",null)),t.appendChild(r),!(n.mcp||[]).length){const d=i("div","placeholder");d.textContent=a("web.settings.no_mcp"),t.appendChild(d)}if((n.mcp||[]).forEach(d=>{const p=i("div","list-line"),g=d.status!=="disabled",h=L(g,u=>{y("/api/mcp/"+encodeURIComponent(d.id||d.name),{method:"POST",body:{enabled:u}}).then(async c=>{c.ok&&c.data&&c.data.ok?(b(a("web.settings.mcp_saved"),!1),await loadPlugins()):b(a("web.settings.save_failed"),!0)})});h.title=g?a("web.settings.mcp_disable"):a("web.settings.mcp_enable"),h.setAttribute("aria-label",h.title),p.appendChild(h);const f=i("span","name",d.name);f.title=d.name,p.appendChild(f),p.appendChild(i("span","st",d.status||"—")),p.appendChild(chip(a("web.settings.edit"),"",()=>R("edit",d))),p.appendChild(chip(a("web.settings.delete"),"danger",async()=>{const u=await y("/api/mcp/"+encodeURIComponent(d.id||d.name),{method:"DELETE"});u.ok&&u.data&&u.data.ok?(b(a("web.settings.mcp_saved"),!1),await loadPlugins()):b(u.data&&u.data.error||a("web.settings.delete_failed"),!0)})),t.appendChild(p)}),l.mcpForm&&t.appendChild(K()),(n.mcp||[]).length){const d=i("div","settings-note");d.textContent=a("web.settings.mcp_note"),t.appendChild(d)}ee(t),e.appendChild(t),renderSections("plugins",E.plugins||[])}function K(){const e=l.mcpForm&&l.mcpForm.mode||"add",n=l.mcpForm&&l.mcpForm.entry||{},t=i("div","pform"),s=i("div","pform-grid"),o=_(n.name||"","text","my-server"),r=H(["stdio","sse","http"],n.transport||"stdio"),d=_(n.command||"","text","npx"),p=_(n.url||"","text","https://…");s.appendChild(v("name",o)),s.appendChild(v("transport",r)),s.appendChild(v("command",d)),s.appendChild(v("url",p)),t.appendChild(s);const g=i("details","pform-adv");g.appendChild(i("summary","",a("web.settings.provider_advanced")));const h=_(n.args?JSON.stringify(n.args):"","text",'["--stdio"]'),f=_(n.timeout!=null?String(n.timeout):"","number","30000"),u=I(n.enabled!==!1);g.appendChild(v("args (JSON)",h)),g.appendChild(v("timeout (ms)",f));const c=Array.isArray(n.envKeys)?n.envKeys:[],m=Array.isArray(n.headerKeys)?n.headerKeys:[],C=i("textarea");C.placeholder=c.length?"stored: "+c.join(", ")+" — blank keeps":'{"TOKEN": "…"}';const w=i("textarea");w.placeholder=m.length?"stored: "+m.join(", ")+" — blank keeps":'{"Authorization": "…"}',g.appendChild(v("env (JSON)",C)),g.appendChild(v("headers (JSON)",w)),g.appendChild(v("enabled",u)),t.appendChild(g);const F={name:o,transport:r,command:d,url:p,args:h,timeout:f,env:C,headers:w,enabled:u},A=i("div","pform-actions");return A.appendChild(k(a("web.settings.save"),"",()=>{$(F,e,n)})),A.appendChild(k(a("web.settings.cancel"),"dim",()=>x())),t.appendChild(A),t}function R(e,n){l.mcpForm={mode:e,entry:n||null},T(a(e==="edit"?"web.settings.mcp_edit_title":"web.settings.mcp_add"),K(),()=>{l.mcpForm=null,S(),loadPlugins()})}function Z(e){const n=e.trim();if(!n)return{present:!1,value:null};let t=null;try{t=JSON.parse(n)}catch{return{present:!0,value:null}}return!t||typeof t!="object"||Array.isArray(t)?{present:!0,value:null}:Object.values(t).every(s=>typeof s=="string")?{present:!0,value:t}:{present:!0,value:null}}async function $(e,n,t){const s=e.name.value.trim(),o=e.transport.value||"stdio",r=e.command.value.trim(),d=e.url.value.trim();if(!s||(o==="stdio"?!r:!d)){b(a("web.settings.mcp_required"),!0);return}const p={name:s,transport:o};r&&(p.command=r),d&&(p.url=d);const g=e.args.value.trim();if(g){let c=null;try{c=JSON.parse(g)}catch{c=null}if(!Array.isArray(c)||!c.every(m=>typeof m=="string")){b(a("web.settings.mcp_invalid"),!0);return}p.args=c}for(const c of["env","headers"]){const m=Z(e[c].value);if(m.present&&!m.value){b(a("web.settings.mcp_invalid"),!0);return}m.present&&(p[c]=m.value)}const h=e.timeout.value.trim();if(h){const c=Number(h);if(!Number.isInteger(c)||c<1e3||c>3e5){b(a("web.settings.mcp_invalid"),!0);return}p.timeout=c}p.enabled=e.enabled.checked;const f=n==="edit"?"/api/mcp/"+encodeURIComponent(t.id||t.name):"/api/mcp",u=await y(f,{method:n==="edit"?"PUT":"POST",body:p});u.ok&&u.data&&u.data.ok?(b(a("web.settings.mcp_saved"),!1),x()):b(u.data&&u.data.error||a("web.settings.save_failed"),!0)}function ee(e){const n=l.lsp;if(e.appendChild(groupHeader(a("web.settings.lsp_servers"),Array.isArray(n)?n.length:null)),n==null){e.appendChild(placeholderFor(n,a("web.settings.lsp_unavailable")));return}if(!n.length){const t=i("div","placeholder");t.textContent=a("web.settings.no_lsp"),e.appendChild(t)}if(n.forEach(t=>{const s=i("div","list-line");s.appendChild(i("span",t.enabled?"g":"dim",t.enabled?"✓":"○"));const o=i("span","name",t.lang);o.title=t.lang,s.appendChild(o);const r=[t.command,t.timeout!=null?t.timeout+" ms":null].filter(Boolean).join(" · ");r&&s.appendChild(i("span","src",r)),s.appendChild(i("span","st",t.enabled?a("web.settings.enabled"):a("web.settings.disabled"))),s.appendChild(chip(a("web.settings.edit"),"",()=>te(t))),e.appendChild(s)}),n.length){const t=i("div","settings-note");t.textContent=a("web.settings.lsp_note"),e.appendChild(t)}}function te(e){l.lspForm={lang:e.lang,entry:e},T(e.lang,ne(),()=>{l.lspForm=null,S(),loadLsp()})}function ne(){const e=l.lspForm&&l.lspForm.entry||{},n=l.lspForm&&l.lspForm.lang||e.lang||"",t=i("div","pform"),s=i("div","pform-grid"),o=_(e.command||"","text","npx"),r=_(e.timeout!=null?String(e.timeout):"","number","30000"),d=I(e.enabled!==!1);s.appendChild(v("command",o)),s.appendChild(v("timeout (ms)",r)),s.appendChild(v("enabled",d)),t.appendChild(s);const p=i("textarea");p.value=e.args?JSON.stringify(e.args):"",p.placeholder='["--stdio"]',t.appendChild(v("args (JSON)",p));const g=i("div","pform-actions");return g.appendChild(k(a("web.settings.save"),"",async()=>{const h={},f=o.value.trim();f&&(h.command=f);const u=r.value.trim();if(u){const C=Number(u);if(!Number.isInteger(C)||C<1e3||C>3e5){b(a("web.settings.provider_invalid"),!0);return}h.timeout=C}const c=p.value.trim();if(c){let C=null;try{C=JSON.parse(c)}catch{C=null}if(!Array.isArray(C)||!C.every(w=>typeof w=="string")){b(a("web.settings.provider_invalid"),!0);return}h.args=C}h.enabled=d.checked;const m=await y("/api/lsp/"+encodeURIComponent(n),{method:"PUT",body:h});m.ok&&m.data&&m.data.ok?(b(a("web.settings.mcp_saved"),!1),x()):b(m.data&&m.data.error||a("web.settings.save_failed"),!0)})),g.appendChild(k(a("web.settings.cancel"),"dim",()=>x())),t.appendChild(g),t}export async function loadLsp(){const e=await y("/api/lsp");l.lsp=e.ok&&e.data&&Array.isArray(e.data.servers)?e.data.servers:null,S()}export async function loadMemory(){const e=await y("/api/memory");l.memory=e.ok&&e.data?e.data:null,N()}export async function loadSkills(){const e=await y("/api/skills");l.skills=e.ok&&e.data&&Array.isArray(e.data.skills)?e.data.skills:null,D()}export async function loadPlugins(){const e=await y("/api/plugins");l.pluginsData=e.ok&&e.data?{plugins:e.data.plugins||[],mcp:e.data.mcp||[]}:null,S()}export{M as renderUiPanel,N as renderMemoryPanel,D as renderSkillsPanel,S as renderPluginsPanel,G as renderSecurityPanel};
@@ -1 +1 @@
1
- import{icon as m}from"../dom.js";import{session as g}from"../store.js";import{t as f}from"../i18n.js";import{sb as e,TABS as a,ICON_NAME as b,paneEl as B,mqMobile as S,readStored as h,storeTab as v}from"./state.js";import{collapseDetail as d,renderList as u,renderDetail as x}from"./trace.js";import{sidebarMapState as y,sidebarMapIndicator as I}from"./map.js";import{renderLsp as E,sidebarLspState as p}from"./lsp.js";import{renderFilesTree as T,refreshFilesTree as k}from"./files.js";export function setSidebarTab(n,i=!0){a.includes(n)||(n="session"),i&&v(n);const t=n==="trace"&&S()?"session":n;t!==e.active&&d(),e.active=t,a.forEach(r=>{const s=B(r);s&&(s.hidden=r!==t);const l=e.el&&e.el.querySelector('.sb-tab[data-tab="'+r+'"]');if(l){const c=r===t;l.classList.toggle("on",c),l.setAttribute("aria-selected",c?"true":"false")}}),e.nameTextEl&&(e.nameTextEl.textContent=f("web.sidebar.tab_"+t));const o=e.nameEl&&e.nameEl.querySelector(".sb-ico");o&&(o.textContent="",o.appendChild(m(b[t]))),t==="lsp"&&p(),t==="files"&&T()}export function sidebarBusy(n){const i=e.el&&e.el.querySelector('.sb-tab[data-tab="trace"]');i&&(i.dataset.indicator=n?"live":"")}export function applySidebarI18n(){if(e.el){if(a.forEach(n=>{const i=e.el?.querySelector('.sb-tab[data-tab="'+n+'"]');if(i){const t=f("web.sidebar.tab_"+n);i.title=t,i.setAttribute("aria-label",t)}}),setSidebarTab(e.active,!1),u(),e.selected){const n=e.trace.find(i=>i.id===e.selected);n&&x(n)}y(g.host),E(),k()}}export function initSidebar(){if(e.el||(e.el=document.querySelector(".sb"),!e.el))return;const n=e.el;e.nameEl=document.getElementById("sbName"),e.nameTextEl=document.getElementById("sbNameText"),e.mapEl=document.getElementById("mapBody"),e.lspEl=document.getElementById("lspBody"),e.listEl=document.getElementById("traceList"),e.detailEl=document.getElementById("traceDetail"),e.detailGlyph=document.getElementById("detailGlyph"),e.detailTitle=document.getElementById("detailTitle"),e.detailBody=document.getElementById("detailBody"),e.detailClose=document.getElementById("detailClose"),e.detailClose&&e.detailClose.addEventListener("click",d),n.querySelectorAll(".sb-tab .sb-ico").forEach(t=>{const o=t.closest(".sb-tab")?.dataset.tab||"session";t.textContent="",t.appendChild(m(b[o]))}),n.querySelectorAll(".sb-tab").forEach(t=>{t.addEventListener("click",()=>setSidebarTab(t.dataset.tab||"session")),t.addEventListener("keydown",o=>{if(o.key!=="ArrowLeft"&&o.key!=="ArrowRight")return;o.preventDefault();const r=a.indexOf(t.dataset.tab||"session"),s=a[(r+(o.key==="ArrowRight"?1:a.length-1))%a.length];setSidebarTab(s);const l=n.querySelector('.sb-tab[data-tab="'+s+'"]');l&&l.focus()})}),document.addEventListener("keydown",t=>{if(!t.altKey||!["1","2","3","4","5"].includes(t.key))return;const o=document.activeElement?String(document.activeElement.tagName):"";o==="INPUT"||o==="TEXTAREA"||(t.preventDefault(),setSidebarTab(a[Number(t.key)-1]))}),document.addEventListener("keydown",t=>{t.key==="Escape"&&e.selected&&d()});const i=h();setSidebarTab(i&&a.includes(i)?i:"session"),u()}export{y as sidebarMapState,I as sidebarMapIndicator,E as renderLsp,p as sidebarLspState};
1
+ import{icon as f}from"../dom.js";import{session as g}from"../store.js";import{t as m}from"../i18n.js";import{sb as e,TABS as o,ICON_NAME as u,paneEl as h,mqMobile as B,PHONE_MQ as v,readStored as S,storeTab as T}from"./state.js";import{collapseDetail as d,renderList as b,renderDetail as I,initTraceFace as x,setTraceFace as w}from"./trace.js";import{sidebarDrawerOpen as L}from"./drawer.js";import{sidebarMapState as p,sidebarMapIndicator as k}from"./map.js";import{renderLsp as y,sidebarLspState as E}from"./lsp.js";import{renderFilesTree as A,refreshFilesTree as C}from"./files.js";import{renderPlugins as q,sidebarPluginsState as N}from"./plugins.js";export function setSidebarTab(i,a=!0){o.includes(i)||(i="session"),a&&T(i);const t=i==="trace"&&B()?"session":i;t!==e.active&&d(),e.active=t,o.forEach(r=>{const l=h(r);l&&(l.hidden=r!==t);const s=e.el&&e.el.querySelector('.sb-tab[data-tab="'+r+'"]');if(s){const c=r===t;s.classList.toggle("on",c),s.setAttribute("aria-selected",c?"true":"false")}}),e.nameTextEl&&(e.nameTextEl.textContent=m("web.sidebar.tab_"+t));const n=e.nameEl&&e.nameEl.querySelector(".sb-ico");n&&(n.textContent="",n.appendChild(f(u[t]))),t==="lsp"&&E(),t==="files"&&A(),t==="plugins"&&N()}export function sidebarBusy(i){const a=e.el&&e.el.querySelector('.sb-tab[data-tab="trace"]');a&&(a.dataset.indicator=i?"live":""),i||w("idle")}export function applySidebarI18n(){if(e.el){if(o.forEach(i=>{const a=e.el?.querySelector('.sb-tab[data-tab="'+i+'"]');if(a){const t=m("web.sidebar.tab_"+i);a.title=t,a.setAttribute("aria-label",t)}}),setSidebarTab(e.active,!1),b(),e.selected){const i=e.trace.find(a=>a.id===e.selected);i&&I(i)}p(g.host),y(),C(),q()}}export function initSidebar(){if(e.el||(e.el=document.querySelector(".sb"),!e.el))return;const i=e.el;if(e.nameEl=document.getElementById("sbName"),e.nameTextEl=document.getElementById("sbNameText"),e.mapEl=document.getElementById("mapBody"),e.lspEl=document.getElementById("lspBody"),e.plugins.bodyEl=document.getElementById("pluginsBody"),e.listEl=document.getElementById("traceList"),x(),e.detailEl=document.getElementById("traceDetail"),e.detailGlyph=document.getElementById("detailGlyph"),e.detailTitle=document.getElementById("detailTitle"),e.detailBody=document.getElementById("detailBody"),e.detailClose=document.getElementById("detailClose"),e.detailClose&&e.detailClose.addEventListener("click",d),i.querySelectorAll(".sb-tab .sb-ico").forEach(t=>{const n=t.closest(".sb-tab")?.dataset.tab||"session";t.textContent="",t.appendChild(f(u[n]))}),i.querySelectorAll(".sb-tab").forEach(t=>{t.addEventListener("click",()=>setSidebarTab(t.dataset.tab||"session")),t.addEventListener("keydown",n=>{if(n.key!=="ArrowLeft"&&n.key!=="ArrowRight")return;n.preventDefault();const r=o.indexOf(t.dataset.tab||"session"),l=o[(r+(n.key==="ArrowRight"?1:o.length-1))%o.length];setSidebarTab(l);const s=i.querySelector('.sb-tab[data-tab="'+l+'"]');s&&s.focus()})}),document.addEventListener("keydown",t=>{if(!t.altKey||!["1","2","3","4","5","6"].includes(t.key))return;const n=document.activeElement?String(document.activeElement.tagName):"";n==="INPUT"||n==="TEXTAREA"||(t.preventDefault(),setSidebarTab(o[Number(t.key)-1]))}),document.addEventListener("keydown",t=>{t.key==="Escape"&&e.selected&&!L()&&d()}),typeof window.matchMedia=="function"){const t=window.matchMedia(v);typeof t.addEventListener=="function"&&t.addEventListener("change",n=>{n.matches&&setSidebarTab(e.active,!1)})}const a=S();setSidebarTab(a&&o.includes(a)?a:"session"),b()}export{p as sidebarMapState,k as sidebarMapIndicator,y as renderLsp,E as sidebarLspState};
@@ -0,0 +1 @@
1
+ import{trapTab as d}from"../dialog.js";import{NARROW_MQ as l}from"./state.js";const c='button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"]), [role="treeitem"]';let e={btn:null,backdrop:null,panel:null,bars:[]},s=!1,n=!1,o=null;function b(){return document.body}function f(){return e.bars.reduce((t,a)=>t+(a.offsetHeight||0),0)}function r(){e.panel&&e.panel.style.setProperty("--sb-inset",`${f()}px`)}export function sidebarDrawerOpen(){return n}export function setSidebarDrawer(t){const a=b();if(a){if(t===n){r();return}if(n=t,a.classList.toggle("sb-open",t),e.btn?.setAttribute("aria-expanded",t?"true":"false"),t)o=document.activeElement||null,r(),e.panel?.setAttribute("role","dialog"),e.panel?.setAttribute("aria-modal","true"),(e.panel?.querySelector(".sb-tab.on")||e.panel?.querySelector(c))?.focus();else{e.panel?.removeAttribute("role"),e.panel?.removeAttribute("aria-modal"),e.panel?.style.removeProperty("--sb-inset");const i=o||e.btn;o=null,i?.focus?.()}}}export function toggleSidebarDrawer(){setSidebarDrawer(!n)}function u(){if(p()){n&&r();return}n&&(n=!1,document.body.classList.remove("sb-open"),e.btn?.setAttribute("aria-expanded","false"),e.panel?.removeAttribute("role"),e.panel?.removeAttribute("aria-modal"),e.panel?.style.removeProperty("--sb-inset"),o=null)}function p(){return typeof window<"u"&&window.matchMedia?window.matchMedia(l).matches:!1}function m(){return Array.from(document.querySelectorAll(".overlay")).some(t=>t.classList.contains("open"))}export function initSidebarDrawer(){if(e={btn:document.getElementById("toggleSidebar"),backdrop:document.getElementById("sbBackdrop"),panel:document.querySelector(".sb"),bars:[".bar-top",".bar-sub"].map(t=>document.querySelector(t)).filter(t=>!!t)},s){r();return}if(!(!e.btn&&!e.panel)){if(s=!0,e.btn?.addEventListener("click",()=>toggleSidebarDrawer()),e.backdrop?.addEventListener("click",()=>setSidebarDrawer(!1)),document.addEventListener("keydown",t=>{if(t.key==="Escape"&&n&&!m()){t.preventDefault(),setSidebarDrawer(!1);return}t.key==="Tab"&&n&&e.panel&&d(e.panel,t)}),window.addEventListener("resize",()=>{n&&r()}),typeof window.matchMedia=="function"){const t=window.matchMedia(l);typeof t.addEventListener=="function"&&t.addEventListener("change",u)}u()}}
@@ -0,0 +1 @@
1
+ import{el as t,icon as f}from"../../dom.js";import{t as r}from"../../i18n.js";import{sb as o}from"../state.js";import{canBack as s,canForward as p}from"./history.js";import{viewerFull as n}from"./split.js";import{EXPAND_DIR_CAP as c}from"./constants.js";export function iconize(l,e,i){l&&(l.textContent="",l.appendChild(f(e)),l.title=r(i),l.setAttribute("aria-label",r(i)))}export function localizeChrome(){const l=o.files;iconize(l.collapseAllEl,"chevrons-down-up","web.files.collapse_all"),iconize(l.expandAllEl,"chevrons-up-down","web.files.expand_all"),iconize(l.refreshEl,"refresh","web.files.refresh"),iconize(l.backEl,"arrow-left","web.files.back"),iconize(l.fwdEl,"arrow-right","web.files.forward"),iconize(l.detailAttachEl,"paperclip","web.files.attach");const e=n();iconize(l.wideEl,e?"panel-left":"panel",e?"web.files.narrow":"web.files.wide"),iconize(document.getElementById("filesClose"),"x","web.files.close")}export function syncChrome(l){const e=o.files,i=!!e.workspace;e.collapseAllEl&&(e.collapseAllEl.disabled=!i||e.expanded.size===0),e.expandAllEl&&(e.expandAllEl.disabled=!i||e.expanding),e.refreshEl&&(e.refreshEl.disabled=!i),e.backEl&&(e.backEl.disabled=!s(l)),e.fwdEl&&(e.fwdEl.disabled=!p(l)),e.detailAttachEl&&(e.detailAttachEl.disabled=!e.selectedPath),e.wideEl&&(e.wideEl.disabled=!e.selectedPath);const a=e.treeEl;if(!a)return;const d=a.querySelector(".fcapped");e.expandCapped&&!d?a.appendChild(t("div","fdim wn fcapped",r("web.files.expand_capped",{n:c}))):!e.expandCapped&&d&&d.remove()}
@@ -0,0 +1 @@
1
+ export const EXPAND_DEPTH=4,EXPAND_DIR_CAP=200,EXPAND_BATCH=8;
@@ -0,0 +1 @@
1
+ import{el as i}from"../../dom.js";import{sb as s}from"../state.js";import"./tree.js";let l={reveal:()=>{}};export function initCrumbDeps(e){l={...l,...e}}export function renderCrumbs(e){const n=s.files.crumbEl;if(!n)return;n.textContent="";const r=e.split("/"),p=r.length>4&&!s.files.crumbsOpen,c=p?r.slice(r.length-3):r;if(p){const t=i("button","fcrumb more","…");t.type="button",t.title=e,t.addEventListener("click",()=>{s.files.crumbsOpen=!0,renderCrumbs(e)}),n.appendChild(t)}c.forEach((t,u)=>{if(u===c.length-1){n.appendChild(i("span","fcrumb cur",t));return}const f=c.slice(0,u+1).join("/"),o=i("button","fcrumb",t);o.type="button",o.title=f,o.addEventListener("click",()=>l.reveal(f)),n.appendChild(o),n.appendChild(i("span","fsep","›"))})}export function clearCrumbs(){const e=s.files.crumbEl;e&&(e.textContent="")}
@@ -0,0 +1 @@
1
+ export const HISTORY_CAP=50;export function createHistory(){return{stack:[],index:-1}}export function current(n){return n.index>=0&&n.index<n.stack.length?n.stack[n.index]:null}export function canBack(n){return n.index>0}export function canForward(n){return n.index>=0&&n.index<n.stack.length-1}export function push(n,t){if(current(n)===t)return;const e=n.stack.indexOf(t,n.index+1);if(e>=0){n.index=e;return}n.stack=n.stack.slice(0,n.index+1),n.stack.push(t),n.stack.length>50&&n.stack.shift(),n.index=n.stack.length-1}export function goBack(n){return canBack(n)?(n.index-=1,current(n)):null}export function goForward(n){return canForward(n)?(n.index+=1,current(n)):null}export function resetHistory(n){n.stack=[],n.index=-1}
@@ -0,0 +1 @@
1
+ let t=null;function i(r){return r.dataset.path||""}function f(r){return Number(r.dataset.depth||0)}function s(r){return r.dataset.kind==="dir"}function l(r){r&&(r.focus({preventScroll:!0}),typeof r.scrollIntoView=="function"&&r.scrollIntoView({block:"nearest"}))}function a(r,e){if(!t)return;const n=t.rows();if(n.length===0)return;const o=t.getCursor();let u=o===null?-1:n.findIndex(d=>i(d)===o);u=r===null?u+e:n.findIndex(d=>i(d)===r),!(u<0||u>=n.length)&&(t.setCursor(i(n[u])),t.onCursorMove(),l(n[u]))}function c(){if(!t)return null;const r=t.getCursor();return r===null?null:t.rows().find(e=>i(e)===r)||null}function p(r){const e=f(r),n=g(r);return n&&f(n)>e?n:null}function w(r){const e=f(r),n=t?t.rows():[],o=n.indexOf(r);for(let u=o-1;u>=0;u--)if(f(n[u])<e)return n[u];return null}function g(r){if(!t)return null;const e=t.rows(),n=e.indexOf(r);return n>=0&&n+1<e.length?e[n+1]:null}function h(r){if(!t)return;const e=t.rows();if(e.length===0)return;const n=c(),o=r.key;if(o==="ArrowDown"||o==="ArrowUp"){if(n===null&&o==="ArrowUp"){r.preventDefault(),a(null,-1);return}if(n===null&&e.length>0){r.preventDefault(),t.setCursor(i(e[0])),t.onCursorMove(),l(e[0]);return}r.preventDefault(),a(null,o==="ArrowDown"?1:-1);return}if(o==="ArrowRight"){if(!n)return;if(r.preventDefault(),s(n)&&!t.isExpanded(i(n)))t.toggleDir(i(n)),l(c());else if(s(n)){const u=p(n);u&&(t.setCursor(i(u)),t.onCursorMove(),l(u))}return}if(o==="ArrowLeft"){if(!n)return;if(r.preventDefault(),s(n)&&t.isExpanded(i(n)))t.toggleDir(i(n)),l(c());else{const u=w(n);u&&(t.setCursor(i(u)),t.onCursorMove(),l(u))}return}if(o==="Enter"||o===" "){if(!n)return;r.preventDefault(),s(n)?(t.toggleDir(i(n)),l(c())):t.openFile(i(n));return}if(o==="Home"||o==="End"){r.preventDefault(),t.setCursor(i(o==="Home"?e[0]:e[e.length-1])),t.onCursorMove(),l(t.rows().find(u=>i(u)===t.getCursor())||null);return}o==="*"&&(r.preventDefault(),t.expandToDepth())}export function initFilesKeys(r,e){t=e,r&&r.addEventListener("keydown",n=>{h(n),n.defaultPrevented&&n.stopPropagation()})}export function focusTreeRow(r,e){if(!r)return;const n=Array.from(r.querySelectorAll(".frow")).find(o=>o.dataset.path===e);l(n||null)}export function initGlobalFilesKeys(r){document.addEventListener("keydown",e=>{const n=document.activeElement?String(document.activeElement.tagName):"",o=n==="INPUT"||n==="TEXTAREA";if(e.altKey&&(e.key==="ArrowLeft"||e.key==="ArrowRight")){if(o)return;e.preventDefault(),r.step(e.key==="ArrowLeft"?-1:1);return}e.key==="Escape"&&!o&&r.isOpen()&&r.closeViewer()})}
@@ -0,0 +1 @@
1
+ export const WIDTH_KEY="mma-files-tree-w",TREE_MIN=200,TREE_MAX=480,TREE_DEFAULT=240;let t={pane:null,side:null,splitter:null},o=h(),i=!1,c=!1;function h(){try{return a(Number(localStorage.getItem(WIDTH_KEY)))}catch{return 240}}function a(r){return!Number.isFinite(r)||r<=0?240:Math.min(480,Math.max(200,Math.round(r)))}function d(){try{localStorage.setItem(WIDTH_KEY,String(o))}catch{}}function l(r,e=!0){return o=a(r),e&&d(),applySplit(),o}export function initSplit(r){if(t={...t,...r},c||!t.splitter)return;c=!0;const e=t.splitter;e.addEventListener("pointerdown",n=>{n.preventDefault();const s=n.clientX,E=o;try{e.setPointerCapture(n.pointerId)}catch{}const p=f=>{l(E+(f.clientX-s),!1)},u=()=>{e.removeEventListener("pointermove",p),e.removeEventListener("pointerup",u),e.removeEventListener("pointercancel",u),d()};e.addEventListener("pointermove",p),e.addEventListener("pointerup",u),e.addEventListener("pointercancel",u)}),e.addEventListener("keydown",n=>{const s=n.shiftKey?40:12;if(n.key==="ArrowLeft")l(o-s);else if(n.key==="ArrowRight")l(o+s);else if(n.key==="Home")l(240);else return;n.preventDefault()}),e.addEventListener("dblclick",()=>l(240))}export function applySplit(){t.side&&(t.pane?.style.setProperty("--files-tree-w",`${o}px`),t.side.hidden=i),t.pane&&t.pane.classList.toggle("f-full",i),t.splitter&&(t.splitter.hidden=i)}export function treeWidth(){return o}export function viewerFull(){return i}export function toggleViewerFull(){return setViewerFull(!i)}export function setViewerFull(r){return i===r||(i=r,applySplit()),i}
@@ -0,0 +1 @@
1
+ import{el as f,icon as u}from"../../dom.js";import{t as p}from"../../i18n.js";import{sb as a}from"../state.js";import{focusTreeRow as g}from"./keys.js";let n={ensureListing:()=>Promise.resolve(),toggleDir:()=>{},openFile:()=>{},insertPath:()=>{},markDirty:()=>{},render:()=>{}};export function initTreeDeps(e){n={...n,...e}}export function visibleRows(){const e=a.files.treeEl;return e?Array.from(e.querySelectorAll(".frow")):[]}export function paintCursor(){const e=a.files.cursor;visibleRows().forEach(t=>t.classList.toggle("cursor",t.dataset.path===e))}export function renderDir(e,t,l){const d=a.files.listings.get(t)||[];if(d.length===0&&l===0){e.appendChild(f("div","fdim",p("web.files.empty")));return}for(const i of d){const s=t?`${t}/${i.name}`:i.name;if(e.appendChild(b(i,s,l)),i.type==="dir"&&a.files.expanded.has(s))if(a.files.listings.has(s))renderDir(e,s,l+1);else{const r=a.files.errored.has(s)?p("web.files.error"):p("web.files.loading"),c=f("div","fdim",r);c.style.setProperty("--indent",String(l+1)),e.appendChild(c),n.ensureListing(s).then(()=>n.markDirty())}}if(a.files.truncated.has(t)){const i=f("div","fdim",p("web.files.truncated"));i.style.setProperty("--indent",String(l)),e.appendChild(i)}}function b(e,t,l){const d=a.files,i=e.type==="dir",s=!i&&d.selectedPath===t,r=f("div",`frow${i?" dir":""}${s?" sel":""}${d.cursor===t?" cursor":""}`);if(r.dataset.path=t,r.dataset.kind=e.type,r.dataset.depth=String(l),r.style.setProperty("--indent",String(l)),r.tabIndex=-1,r.setAttribute("role","treeitem"),r.setAttribute("aria-label",e.name),i?r.setAttribute("aria-expanded",String(d.expanded.has(t))):r.setAttribute("aria-selected",String(s)),i){const o=f("span","ftw");o.appendChild(u(d.expanded.has(t)?"chevron-down":"chevron-right")),r.appendChild(o)}const c=f("span","fic");if(c.appendChild(u(i?"folder":"file")),r.appendChild(c),r.appendChild(f("span","fname",e.name)),!i){const o=f("button","fattach");o.type="button",o.title=p("web.files.attach"),o.setAttribute("aria-label",`${p("web.files.attach")} ${t}`),o.appendChild(u("paperclip")),o.addEventListener("click",m=>{m.stopPropagation(),n.insertPath(t)}),r.appendChild(o)}return r.addEventListener("click",()=>{d.cursor=t,n.markDirty(),i?n.toggleDir(t):n.openFile(t)}),r}export function revealInTree(e){const t=a.files;n.ensureListing(e).then(()=>{t.expanded.add(e),t.cursor=e,n.markDirty(),n.render(),g(t.treeEl,e)})}
@@ -0,0 +1 @@
1
+ import{el as a}from"../../dom.js";import{t as p}from"../../i18n.js";import{renderMarkdown as f}from"../../../md.js";export function fileUrl(e){return"/api/file?path="+encodeURIComponent(e)}export async function fetchFile(e){try{const n=await fetch(fileUrl(e));if(!n.ok)return{ok:!1,mime:"",text:""};const t=n.headers.get("content-type")||"",r=t.indexOf("text/plain")===0?await n.text():"";return{ok:!0,mime:t,text:r}}catch{return{ok:!1,mime:"",text:""}}}export function paintLoading(e){e&&(e.textContent="",e.appendChild(a("div","fdim",p("web.files.loading"))))}export function paintError(e){e&&(e.textContent="",e.appendChild(a("div","fdim wn",p("web.files.open_failed"))))}export function paintFile(e,n,t){if(e){if(!t.ok)return paintError(e);e.textContent="",t.mime.indexOf("text/plain")===0?l(e,n,t.text):s(e,n,t.mime)}}function l(e,n,t){const r=u(n);if(r==="md"||r==="markdown"){const d=a("div","fmd");f(d,t),e.appendChild(d);return}const c=a("pre","fpre"),o=a("code","fcode");o.textContent=t;const i=window.hljs;if(i)try{const d=i.getLanguage(r)?i.highlight(t,{language:r,ignoreIllegals:!0}):i.highlightAuto(t);o.replaceChildren(...m(d.value))}catch{}c.appendChild(o),e.appendChild(c)}function s(e,n,t){const r=fileUrl(n);if(t.indexOf("image/")===0){const i=document.createElement("img");i.className="fimg",i.alt=n,i.src=r,e.appendChild(i);return}if(t.indexOf("application/pdf")===0){const i=a("embed","fembed");i.setAttribute("src",r),i.setAttribute("type","application/pdf"),e.appendChild(i);return}const c=t.indexOf("audio/")===0?"audio":t.indexOf("video/")===0?"video":null;if(!c)return paintError(e);const o=document.createElement(c);o.controls=!0,o.src=r,e.appendChild(o)}function u(e){const n=e.lastIndexOf(".");return n===-1?"":e.slice(n+1).toLowerCase()}function m(e){const n=new DOMParser().parseFromString(e,"text/html");return Array.from(n.body.childNodes).map(t=>document.importNode(t,!0))}
@@ -1 +1 @@
1
- import{el as o,icon as g}from"../dom.js";import{api as P}from"../api.js";import{t as r}from"../i18n.js";import{renderMarkdown as L}from"../../md.js";import{sb as t}from"./state.js";let m={insertPath:()=>{}};export function initFiles(e){m={...m,...e},t.files.treeEl=document.getElementById("filesTree"),t.files.detailEl=document.getElementById("filesDetail"),t.files.detailTitleEl=document.getElementById("filesTitle"),t.files.detailBodyEl=document.getElementById("filesBody"),t.files.detailAttachEl=document.getElementById("filesAttach"),document.getElementById("filesClose")?.addEventListener("click",closeFile),t.files.detailAttachEl?.addEventListener("click",()=>{t.files.selectedPath&&m.insertPath(t.files.selectedPath)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&t.files.selectedPath&&closeFile()})}let w="",x=!0;const C=new Map,u=new Set,E=new Set;function c(){x=!0}export function sidebarFilesState(e){const n=e&&e.workspace||"";n!==w&&(w=n,t.files.listings.clear(),t.files.expanded.clear(),t.files.selectedPath=null,t.files.detailEl&&(t.files.detailEl.hidden=!0),c()),t.active==="files"&&renderFilesTree()}function h(e){if(t.files.listings.has(e))return Promise.resolve();const n=C.get(e);if(n)return n;const i=P("/api/files?path="+encodeURIComponent(e)).then(s=>{s.ok&&s.data?(t.files.listings.set(e,s.data.entries||[]),s.data.truncated&&E.add(e),u.delete(e)):u.add(e),c()}).finally(()=>C.delete(e));return C.set(e,i),i}export function refreshFilesTree(){c(),renderFilesTree()}export function renderFilesTree(){const e=t.files.treeEl;if(!(!e||!x)){if(x=!1,e.textContent="",!w){e.appendChild(o("div","fdim",r("web.files.no_workspace")));return}if(!t.files.listings.has("")){e.appendChild(o("div","fdim",u.has("")?r("web.files.error"):r("web.files.loading"))),h("").then(renderFilesTree);return}b(e,"",0)}}function b(e,n,i){const s=t.files.listings.get(n)||[];if(s.length===0&&i===0){e.appendChild(o("div","fdim",r("web.files.empty")));return}for(const d of s){const l=n?`${n}/${d.name}`:d.name;if(e.appendChild(B(d,l,i)),d.type==="dir"&&t.files.expanded.has(l))if(t.files.listings.has(l))b(e,l,i+1);else{const f=o("div","fdim",u.has(l)?r("web.files.error"):r("web.files.loading"));f.style.paddingLeft=`${8+(i+1)*14}px`,e.appendChild(f),h(l).then(renderFilesTree)}}if(E.has(n)){const d=o("div","fdim",r("web.files.truncated"));d.style.paddingLeft=`${8+i*14}px`,e.appendChild(d)}}function B(e,n,i){const s=e.type==="dir",d=!s&&t.files.selectedPath===n,l=o("div",`frow${s?" dir":""}${d?" sel":""}`);l.style.paddingLeft=`${8+i*14}px`;const f=o("span","ftw");s&&f.appendChild(g(t.files.expanded.has(n)?"chevron-down":"chevron-right")),l.appendChild(f);const a=o("span","fic");if(a.appendChild(g(s?"folder":"file")),l.appendChild(a),l.appendChild(o("span","fname",e.name)),!s){const p=o("button","fattach");p.type="button",p.title=r("web.files.attach"),p.setAttribute("aria-label",r("web.files.attach")),p.appendChild(g("paperclip")),p.addEventListener("click",k=>{k.stopPropagation(),m.insertPath(n)}),l.appendChild(p)}return l.addEventListener("click",()=>{s?I(n):openFile(n)}),l}function I(e){t.files.expanded.has(e)?t.files.expanded.delete(e):(t.files.expanded.add(e),t.files.listings.has(e)||h(e).then(renderFilesTree)),c(),renderFilesTree()}export async function openFile(e){t.files.selectedPath=e;const n=t.files.detailEl;t.files.detailTitleEl&&(t.files.detailTitleEl.textContent=e,t.files.detailTitleEl.title=e),n&&(n.hidden=!1);const i=t.files.detailBodyEl;i&&(i.textContent="",i.appendChild(o("div","fdim",r("web.files.loading")))),c(),renderFilesTree();let s;try{s=await fetch(v(e))}catch{y();return}if(!s.ok||!i){y();return}const d=s.headers.get("content-type")||"";i.textContent="",d.indexOf("text/plain")===0?O(i,e,await s.text()):T(i,e,d)}export function closeFile(){t.files.selectedPath=null,t.files.detailEl&&(t.files.detailEl.hidden=!0),c(),renderFilesTree()}export function sidebarFilesChanged(){const e=["",...t.files.expanded];e.forEach(i=>{t.files.listings.delete(i),u.delete(i),E.delete(i)}),c(),renderFilesTree();const n=t.files.selectedPath?openFile(t.files.selectedPath):Promise.resolve();Promise.all([...e.map(h),n]).then(renderFilesTree)}function y(){const e=t.files.detailBodyEl;e&&(e.textContent="",e.appendChild(o("div","fdim wn",r("web.files.open_failed"))))}function v(e){return"/api/file?path="+encodeURIComponent(e)}function F(e){const n=e.lastIndexOf(".");return n===-1?"":e.slice(n+1).toLowerCase()}function O(e,n,i){const s=F(n);if(s==="md"||s==="markdown"){const a=o("div","fmd");L(a,i),e.appendChild(a);return}const d=o("pre","fpre"),l=o("code","fcode");l.textContent=i;const f=window.hljs;if(f)try{const a=f.getLanguage(s)?f.highlight(i,{language:s,ignoreIllegals:!0}):f.highlightAuto(i);l.replaceChildren(...A(a.value))}catch{}d.appendChild(l),e.appendChild(d)}function T(e,n,i){const s=v(n);if(i.indexOf("image/")===0){const l=document.createElement("img");l.className="fimg",l.alt=n,l.src=s,e.appendChild(l);return}if(i.indexOf("application/pdf")===0){const l=o("embed","fembed");l.setAttribute("src",s),l.setAttribute("type","application/pdf"),e.appendChild(l);return}const d=i.indexOf("audio/")===0?"audio":i.indexOf("video/")===0?"video":null;if(d){const l=document.createElement(d);l.controls=!0,l.src=s,e.appendChild(l);return}y()}function A(e){const n=new DOMParser().parseFromString(e,"text/html");return Array.from(n.body.childNodes).map(i=>document.importNode(i,!0))}
1
+ import{api as A}from"../api.js";import{t as f}from"../i18n.js";import{el as g}from"../dom.js";import{sb as r}from"./state.js";import{initSplit as F,applySplit as D,toggleViewerFull as L,setViewerFull as b}from"./files/split.js";import{createHistory as T,push as B,goBack as _,goForward as S,resetHistory as H}from"./files/history.js";import{initFilesKeys as I,focusTreeRow as y,initGlobalFilesKeys as R}from"./files/keys.js";import{initTreeDeps as M,renderDir as N,paintCursor as V,visibleRows as X,revealInTree as z}from"./files/tree.js";import{initCrumbDeps as K,renderCrumbs as O,clearCrumbs as v}from"./files/crumbs.js";import{syncChrome as d,localizeChrome as E,iconize as U}from"./files/chrome.js";import{fetchFile as $,paintFile as G,paintLoading as W}from"./files/view.js";import{EXPAND_DEPTH as j,EXPAND_DIR_CAP as q,EXPAND_BATCH as J}from"./files/constants.js";let p={insertPath:()=>{}},n=T(),m=!0;const h=new Map;export function initFiles(i){p={...p,...i};const e=r.files,t=l=>document.getElementById(l);e.sideEl=t("filesSide"),e.splitterEl=t("filesSplitter"),e.treeEl=t("filesTree"),e.detailEl=t("filesDetail"),e.crumbEl=t("filesCrumbs"),e.backEl=t("filesBack"),e.fwdEl=t("filesFwd"),e.wideEl=t("filesWide"),e.collapseAllEl=t("filesCollapseAll"),e.expandAllEl=t("filesExpandAll"),e.refreshEl=t("filesRefresh"),e.detailBodyEl=t("filesBody"),e.detailAttachEl=t("filesAttach");const s=t("filesClose");M({ensureListing:a,toggleDir:C,openFile:l=>{openFile(l)},insertPath:p.insertPath,markDirty:o,render:renderFilesTree}),K({reveal:z}),E(),s?.addEventListener("click",()=>closeFile()),e.splitterEl&&(e.splitterEl.title=f("web.files.tree_width")),e.treeEl&&e.treeEl.setAttribute("aria-label",f("web.sidebar.tab_files")),e.detailAttachEl?.addEventListener("click",()=>{e.selectedPath&&p.insertPath(e.selectedPath)}),e.backEl?.addEventListener("click",()=>{w(-1)}),e.fwdEl?.addEventListener("click",()=>{w(1)}),e.wideEl?.addEventListener("click",()=>{const l=L();U(e.wideEl,l?"panel-left":"panel",l?"web.files.narrow":"web.files.wide")}),e.collapseAllEl?.addEventListener("click",()=>collapseAll()),e.expandAllEl?.addEventListener("click",()=>{expandAll()}),e.refreshEl?.addEventListener("click",()=>sidebarFilesChanged()),F({pane:t("pane-files"),side:e.sideEl,splitter:e.splitterEl}),D(),I(e.treeEl,{rows:X,toggleDir:C,openFile:l=>{openFile(l)},isExpanded:l=>e.expanded.has(l),expandToDepth:Q,getCursor:()=>e.cursor,setCursor:l=>{e.cursor=l},onCursorMove:V}),R({step:l=>{w(l)},closeViewer:closeFile,isOpen:()=>!!e.selectedPath})}function o(){m=!0}export function sidebarFilesState(i){const e=r.files,t=String(i&&i.workspace||"");t!==e.workspace&&(e.workspace=t,e.listings.clear(),e.expanded.clear(),e.truncated.clear(),e.errored.clear(),e.selectedPath=null,e.cursor=null,e.expandCapped=!1,e.crumbsOpen=!1,H(n),e.detailEl&&(e.detailEl.hidden=!0),b(!1),v(),d(n),o()),r.active==="files"&&renderFilesTree()}function a(i){const e=r.files;if(e.listings.has(i))return Promise.resolve();const t=h.get(i);if(t)return t;const s=A("/api/files?path="+encodeURIComponent(i)).then(l=>{l.ok&&l.data?(e.listings.set(i,l.data.entries||[]),l.data.truncated&&e.truncated.add(i),e.errored.delete(i)):e.errored.add(i),o()}).finally(()=>h.delete(i));return h.set(i,s),s}export function refreshFilesTree(){E(),o(),renderFilesTree()}export function renderFilesTree(){const i=r.files,e=i.treeEl;if(!(!e||!m)){if(m=!1,e.textContent="",!i.workspace){e.appendChild(g("div","fdim",f("web.files.no_workspace"))),d(n);return}if(!i.listings.has("")){e.appendChild(g("div","fdim",i.errored.has("")?f("web.files.error"):f("web.files.loading"))),d(n),a("").then(renderFilesTree);return}N(e,"",0),d(n)}}function C(i){const e=r.files;e.expanded.has(i)?e.expanded.delete(i):(e.expanded.add(i),e.listings.has(i)||a(i).then(renderFilesTree)),o(),renderFilesTree()}export function collapseAll(){r.files.expanded.clear(),r.files.expandCapped=!1,o(),renderFilesTree()}export async function expandAll(){const i=r.files;if(!i.expanding){i.expanding=!0,o(),d(n);try{await P(j)}finally{i.expanding=!1,o(),renderFilesTree(),d(n)}}}function Q(){const i=r.files.cursor;if(!i)return;const e=i.split("/").length-1;P(e).then(()=>y(r.files.treeEl,i))}async function P(i){const e=r.files;let t=q;await a("");let s=k("");for(let l=1;l<=i&&s.length>0&&t>0;l++){const u=s.slice(0,Math.min(J,t));t-=u.length,await Promise.all(u.map(a));for(const c of u){e.expanded.add(c);for(const x of k(c))e.expanded.has(x)||s.push(x)}s=s.filter(c=>!e.expanded.has(c)),o(),renderFilesTree()}e.expandCapped=t<=0&&s.length>0}function k(i){return(r.files.listings.get(i)||[]).filter(t=>t.type==="dir").map(t=>i?`${i}/${t.name}`:t.name)}export async function openFile(i){const e=r.files;e.selectedPath=i,B(n,i),O(i),e.detailEl&&(e.detailEl.hidden=!1),W(e.detailBodyEl),d(n),o(),renderFilesTree(),G(e.detailBodyEl,i,await $(i))}export function closeFile(){const i=r.files;i.selectedPath=null,i.detailEl&&(i.detailEl.hidden=!0),b(!1),v(),E(),d(n),o(),renderFilesTree()}async function w(i){const e=i<0?_(n):S(n);e&&await openFile(e)}export function sidebarFilesChanged(){const i=r.files,e=["",...i.expanded];e.forEach(s=>{i.listings.delete(s),i.truncated.delete(s),i.errored.delete(s)}),o(),renderFilesTree();const t=i.selectedPath?openFile(i.selectedPath):Promise.resolve();Promise.all([...e.map(a),t]).then(()=>{i.cursor&&y(i.treeEl,i.cursor),renderFilesTree()})}
@@ -0,0 +1 @@
1
+ import{el as t,icon as _,makeToggle as b}from"../dom.js";import{api as m}from"../api.js";import{t as l}from"../i18n.js";import{setIndicator as C}from"../dialog.js";import{openSubDialog as P}from"../subdialog.js";import{sb as p}from"./state.js";let u=null;function R(n){return n.enabled?n.warnings?.length?["⚠","warn"]:["✓","ok"]:["–","dim"]}function E(n){const i=document.createDocumentFragment();return n.version&&i.appendChild(t("span","plg-ver","v"+String(n.version))),n.author&&(n.version&&i.appendChild(document.createTextNode(" · ")),i.appendChild(t("span","plg-author",String(n.author)))),i}function L(n){const i=t("div","plg-row"),[e,a]=R(n);i.appendChild(t("span","plg-g "+a,e)),i.appendChild(t("span","plg-name",n.name)),i.appendChild(E(n)),v(n)&&i.appendChild(t("span","plg-badges",v(n)));const s=b(!!n.enabled,d=>(w(n.name,d),!1));return s.title=l(n.enabled?"web.plugins.disable":"web.plugins.enable"),s.setAttribute("aria-label",l(n.enabled?"web.plugins.disable":"web.plugins.enable")),i.appendChild(s),i.addEventListener("click",()=>openPluginDialog(n)),i}function v(n){const i=[];return n.draft?i.push(l("web.plugins.badge_draft")):n.builtin?i.push(l("web.plugins.badge_builtin")):n.source&&i.push(String(n.source)),i.join(" · ")}async function w(n,i){const e=await m("/api/plugins/"+encodeURIComponent(n),{method:"POST",body:{enabled:i}});if(!e.ok||!e.data||e.data.ok!==!0){const a=e.data&&e.data.error||String(e.status);C(a==="not_found"?l("cli.plugins.not_found",{name:n}):l("web.plugins.toggle_failed"),!0);return}k(e.data),renderPlugins(),u?.()}function k(n){const i=n.plugins||[];p.plugins.records=i,p.plugins.failures=n.failures||[]}function T(n){const i=String(n.description||"").trim();return i?t("div","plg-desc",i.length>90?i.slice(0,89)+"…":i):null}function j(n){const i=p.plugins.records,e=i.filter(r=>!r.enabled).length,a=p.plugins.failures.length,s=i.length-e,d=[l("web.plugins.summary",{active:String(s),off:String(e)})];a>0&&d.push(l("web.plugins.failed_count",{count:String(a)})),n.appendChild(t("div","plg-summary",d.join(" · ")))}function D(n){for(const i of p.plugins.failures){const e=t("div","plg-row plg-broken");e.appendChild(t("span","plg-g fail","✗")),e.appendChild(t("span","plg-name",String(i.entry||i.path||"?"))),e.appendChild(t("span","plg-meta",String(i.message||""))),n.appendChild(e)}}export function renderPlugins(){const n=p.plugins.bodyEl;if(!n)return;if(n.textContent="",p.plugins.unavailable){n.appendChild(t("div","fdim",l("web.plugins.unavailable")));return}if(!p.plugins.loaded){n.appendChild(t("div","fdim",l("web.plugins.loading")));return}j(n);const i=p.plugins.records;i.length===0&&p.plugins.failures.length===0&&n.appendChild(t("div","fdim",l("web.plugins.empty")));const e=i.sort((a,s)=>+!!a.builtin-+!!s.builtin);for(const a of e){n.appendChild(L(a));const s=T(a);s&&n.appendChild(s)}D(n)}export function openPluginDialog(n){const i=t("div","plg-info");u=()=>A(i,n),u(),P(String(n.name),i,()=>{u=null})}function g(n,i){const e=t("div","kv");return e.appendChild(t("span","dim",n)),e.appendChild(t("b","",i)),e}function I(n){const i=t("a","plg-link");return i.href=n,i.textContent=n,i.target="_blank",i.rel="noopener noreferrer",i}function N(n){const i=t("div","lsp-install");i.appendChild(t("code","lsp-cmd",n));const e=t("button","linkbtn lsp-copy");return e.type="button",e.title=l("web.plugins.copy_path"),e.setAttribute("aria-label",l("web.plugins.copy_path")),e.appendChild(_("copy")),e.addEventListener("click",()=>{navigator.clipboard&&navigator.clipboard.writeText(n).then(()=>C(l("web.plugins.copied"),!1)).catch(()=>{})}),i.appendChild(e),i}function S(n,i){if(i.length===0)return null;const e=t("div","plg-chips");e.appendChild(t("span","dim",n));for(const a of i)e.appendChild(t("span","plg-tag",a));return e}function A(n,i){n.textContent="";const e=t("div","kv");e.appendChild(t("span","dim",l("web.plugins.state"))),e.appendChild(t("b","",l(i.enabled?"cli.plugins.on":"cli.plugins.off")+" · "+(i.source||"builtin"))),n.appendChild(e);const a=t("div","kv lsp-toggle");a.appendChild(t("span","dim",l("web.plugins.switch_enabled")));const s=b(!!i.enabled,o=>(w(i.name,o),!1));if(s.title=l("web.plugins.switch_enabled"),a.appendChild(s),n.appendChild(a),n.appendChild(t("div","plg-desc-block",String(i.description||l("web.plugins.no_description")))),i.author&&n.appendChild(g(l("cli.plugins.author"),String(i.author))),i.version&&n.appendChild(g(l("web.plugins.version"),"v"+String(i.version))),i.homepage){const o=t("div","kv");o.appendChild(t("span","dim",l("cli.plugins.homepage"))),o.appendChild(I(String(i.homepage))),n.appendChild(o)}const d=i.provides||{},r=S(l("web.plugins.tools"),d.tools||[]),c=S(l("web.plugins.hooks"),d.hooks||[]);r&&n.appendChild(r),c&&n.appendChild(c),(d.tools||[]).length>0&&n.appendChild(t("div","plg-hint",l("web.plugins.cache_note")));const h=i.permissions||[];n.appendChild(h.length>0?g(l("cli.plugins.perms_label"),h.join(", ")):t("div","plg-hint",l("web.plugins.permissions_none"))),n.appendChild(t("div","plg-hint",l("web.plugins.permissions_hint")));const f=i.warnings||[];if(f.length>0){n.appendChild(t("div","plg-warn-title",l("web.plugins.warnings")));for(const o of f)n.appendChild(t("div","plg-hint warn",String(o)))}i.path&&n.appendChild(N(String(i.path)))}export function sidebarPluginsState(){p.active!=="plugins"||p.plugins.unavailable||p.plugins.loaded||y()}async function y(){const n=await m("/api/plugins");if(!n.ok||!n.data){p.plugins.unavailable=!0,p.plugins.loaded=!0,renderPlugins();return}p.plugins.unavailable=!1,p.plugins.loaded=!0,k(n.data),renderPlugins()}export function sidebarPluginsEvent(){p.active==="plugins"&&y()}
@@ -1 +1 @@
1
- export const TAB_KEY="mma-sidebar-tab",TABS=["session","map","trace","lsp","files"],ICON_NAME={session:"list-checks",map:"map",trace:"activity",lsp:"stethoscope",files:"folder-tree"},TRACE_CAP=500,MAX_OUTPUT_CHARS=2e4,sb={el:null,nameEl:null,nameTextEl:null,mapEl:null,listEl:null,detailEl:null,detailGlyph:null,detailTitle:null,detailBody:null,detailClose:null,lspEl:null,active:"session",trace:[],selected:null,turn:0,seq:0,logCursor:null,logPulling:!1,nodeById:new Map,callIndex:new Map,headerByTurn:new Map,textEntry:null,lspDiag:null,lspFlags:null,lspProbing:!1,lspLoaded:!1,lspUnavailable:!1,reindexing:!1,postResolved:!1,reindexError:!1,files:{treeEl:null,detailEl:null,detailTitleEl:null,detailBodyEl:null,detailAttachEl:null,expanded:new Set,listings:new Map,selectedPath:null}};export function paneEl(l){return document.getElementById("pane-"+l)}export function mqMobile(){return typeof window<"u"&&window.matchMedia?window.matchMedia("(max-width: 760px)").matches:!1}export function readStored(){try{return localStorage.getItem(TAB_KEY)}catch{return null}}export function storeTab(l){try{localStorage.setItem(TAB_KEY,l)}catch{}}
1
+ export const TAB_KEY="mma-sidebar-tab",TABS=["session","files","lsp","trace","plugins","map"],ICON_NAME={session:"list-checks",map:"layout-grid",trace:"activity",lsp:"code",files:"folder-tree",plugins:"plug"},TRACE_CAP=500,MAX_OUTPUT_CHARS=2e4,sb={el:null,nameEl:null,nameTextEl:null,mapEl:null,listEl:null,detailEl:null,detailGlyph:null,detailTitle:null,detailBody:null,detailClose:null,lspEl:null,active:"session",trace:[],selected:null,turn:0,seq:0,logCursor:null,logPulling:!1,nodeById:new Map,callIndex:new Map,headerByTurn:new Map,textEntry:null,lspDiag:null,lspFlags:null,lspProbing:!1,lspLoaded:!1,lspUnavailable:!1,reindexing:!1,postResolved:!1,reindexError:!1,files:{sideEl:null,splitterEl:null,treeEl:null,detailEl:null,crumbEl:null,backEl:null,fwdEl:null,wideEl:null,collapseAllEl:null,expandAllEl:null,refreshEl:null,detailBodyEl:null,detailAttachEl:null,expanded:new Set,listings:new Map,truncated:new Set,errored:new Set,workspace:"",selectedPath:null,cursor:null,history:[],histIndex:-1,expanding:!1,expandCapped:!1,crumbsOpen:!1},plugins:{bodyEl:null,records:[],failures:[],loaded:!1,unavailable:!1}};export function paneEl(l){return document.getElementById("pane-"+l)}export const NARROW_MQ="(max-width: 1024px)",PHONE_MQ="(max-width: 760px)";function e(l){return typeof window<"u"&&window.matchMedia?window.matchMedia(l).matches:!1}export function mqNarrow(){return e(NARROW_MQ)}export function mqMobile(){return e(PHONE_MQ)}export function readStored(){try{return localStorage.getItem(TAB_KEY)}catch{return null}}export function storeTab(l){try{localStorage.setItem(TAB_KEY,l)}catch{}}