micro-models-agent 2.29.1 → 2.36.0

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 (40) hide show
  1. package/CHANGELOG.md +204 -2
  2. package/README.md +15 -0
  3. package/dist/assets/app.js +1 -1
  4. package/dist/assets/index.html +56 -16
  5. package/dist/assets/js/core/store/feed.js +1 -1
  6. package/dist/assets/js/core/store/index.js +1 -1
  7. package/dist/assets/js/dom.js +1 -1
  8. package/dist/assets/js/feed/core.js +1 -1
  9. package/dist/assets/js/feed/sidebar.js +1 -1
  10. package/dist/assets/js/feed/stream.js +1 -1
  11. package/dist/assets/js/feed/turn.js +4 -4
  12. package/dist/assets/js/footer.js +1 -0
  13. package/dist/assets/js/loader.js +1 -0
  14. package/dist/assets/js/md-normalize.js +5 -0
  15. package/dist/assets/js/session/composer.js +1 -1
  16. package/dist/assets/js/session/tabs.js +1 -1
  17. package/dist/assets/js/settings/controls.js +1 -1
  18. package/dist/assets/js/settings/write.js +1 -1
  19. package/dist/assets/js/sidebar/core.js +1 -1
  20. package/dist/assets/js/sidebar/drawer.js +1 -0
  21. package/dist/assets/js/sidebar/files/chrome.js +1 -0
  22. package/dist/assets/js/sidebar/files/constants.js +1 -0
  23. package/dist/assets/js/sidebar/files/crumbs.js +1 -0
  24. package/dist/assets/js/sidebar/files/history.js +1 -0
  25. package/dist/assets/js/sidebar/files/keys.js +1 -0
  26. package/dist/assets/js/sidebar/files/split.js +1 -0
  27. package/dist/assets/js/sidebar/files/tree.js +1 -0
  28. package/dist/assets/js/sidebar/files/view.js +1 -0
  29. package/dist/assets/js/sidebar/files.js +1 -1
  30. package/dist/assets/js/sidebar/state.js +1 -1
  31. package/dist/assets/js/sidebar/trace.js +4 -4
  32. package/dist/assets/js/sidebar.js +1 -1
  33. package/dist/assets/js/state-sync.js +1 -1
  34. package/dist/assets/md.js +1 -1
  35. package/dist/assets/setup.js +2 -2
  36. package/dist/assets/styles.css +1 -1
  37. package/dist/i18n/en.json +1 -1
  38. package/dist/i18n/ru.json +1 -1
  39. package/dist/main.js +370 -355
  40. package/package.json +1 -1
@@ -1 +1 @@
1
- import{msgs as g,el as w,setIcon as k}from"../dom.js";import{t as v}from"../i18n.js";import{feed as t}from"../store.js";import{verbosity as y}from"../format.js";import{mountMarkdown as b}from"../../md.js";import{activeFeed as l,feedForEvent as d,clearBusy as f,clearEmpty as x,flushRun as M,showBusy as R,appendTo as m,scroll as a,mdOpts as A,buildThinkBlock as F}from"./core.js";let s="",c=null,p=!1;function h(){if(p=!1,!s||!t.curMd){s="",c=null;return}const n=s,o=c;s="",c=null,t.curMd.write(n),o&&o===l()&&a()}function L(){p||(p=!0,typeof window<"u"&&typeof window.requestAnimationFrame=="function"?window.requestAnimationFrame(h):h())}export function finishMd(){h(),t.curMd&&(t.curMd.root.classList.remove("streaming"),t.curMd.end(),t.curMd=null),t.curText=null}export function onText(n,o){const e=d(o);f(e),e&&(x(e),t.curThink&&finishThink(),t.curText==null&&(M(),t.curText="",t.curMd=b(e,A(!0)),t.curMd.root.classList.add("streaming"),t.turnRoots.push(t.curMd.root)),t.curText+=n,t.turnMd+=n,c&&c!==e&&h(),c=e,s+=n,L())}export function finishThink(){if(t.curThink&&(t.curThink.wrap&&t.curThink.wrap.classList.remove("live"),t.curThink.startedAt)){const n=t.curThink.head.querySelector(".dur");n&&(n.textContent="· "+((Date.now()-t.curThink.startedAt)/1e3).toFixed(1)+"s")}t.curThink=null}export function onReasoning(n,o){const e=d(o);if(f(e),!!e){if(x(e),finishMd(),!t.curThink){M();const{wrap:r,head:i,body:u}=F(!0);m(e,r),t.curThink={wrap:r,head:i,body:u,startedAt:Date.now()}}t.curThink.body.textContent+=n,e===l()&&a()}}export function onMeta(n,o,e){if(e==="tool"&&y()==="quiet")return;const r=d(o);f(r);const i=(n||"").trim();if(!r||!i)return;x(r),finishMd();const u=i.indexOf("⚠")!==-1||i.indexOf("✗")!==-1;m(r,w("div",u?"metaln warn":"metaln",i)),r===l()&&a()}export function onRetract(n,o){const e=d(o);if(!e)return;f(e);const r=t.curMd?t.curMd.root:null,i=!!r||t.curText!=null&&t.curText!=="",u=t.curText?t.curText.length:0;if(finishMd(),finishThink(),r){const T=t.turnRoots.indexOf(r);T!==-1&&t.turnRoots.splice(T,1),r.remove()}u>0&&(t.turnMd=t.turnMd.slice(0,Math.max(0,t.turnMd.length-u))),i&&(n&&m(e,w("div","metaln",n)),e===l()&&a())}export function onPhase(n,o){const e=d(o);n==="thinking"?R(e):f(e)}g?.addEventListener("click",n=>{const e=n.target.closest(".think-h");if(!e)return;const r=e.nextElementSibling;if(!r)return;const i=r.classList.toggle("hidden");e.setAttribute("aria-expanded",i?"false":"true");const u=e.querySelector(".tog");u&&k(u,i?"chevron-right":"chevron-down",v(i?"web.action.show":"web.action.hide"))});
1
+ import{msgs as g,el as p,setIcon as w}from"../dom.js";import{t as M}from"../i18n.js";import{streamStateFor as c}from"../store.js";import{verbosity as k}from"../format.js";import{mountMarkdown as v}from"../../md.js";import{activeFeed as f,feedForEvent as u,clearBusy as s,clearEmpty as l,flushRun as T,showBusy as y,appendTo as h,scroll as a,mdOpts as b,buildThinkBlock as R}from"./core.js";function x(r){const n=c(r);if(n.textScheduled=!1,!n.pendingText||!n.curMd){n.pendingText="";return}const t=n.pendingText;n.pendingText="",n.curMd.write(t),r===f()&&a()}function S(r){const n=c(r);n.textScheduled||(n.textScheduled=!0,typeof window<"u"&&typeof window.requestAnimationFrame=="function"?window.requestAnimationFrame(()=>x(r)):x(r))}export function finishMd(r){if(!r)return;const n=c(r);x(r),n.curMd&&(n.curMd.root.classList.remove("streaming"),n.curMd.end(),n.curMd=null),n.curText=null}export function onText(r,n){const t=u(n);if(s(t),!t)return;l(t);const e=c(t);e.curThink&&finishThink(t),e.curText==null&&(T(t),e.curText="",e.curMd=v(t,b(!0)),e.curMd.root.classList.add("streaming"),e.turnRoots.push(e.curMd.root)),e.curText+=r,e.turnMd+=r,e.pendingText+=r,S(t)}export function finishThink(r){if(!r)return;const n=c(r);if(n.curThink&&(n.curThink.wrap&&n.curThink.wrap.classList.remove("live"),n.curThink.startedAt)){const t=n.curThink.head.querySelector(".dur");t&&(t.textContent="· "+((Date.now()-n.curThink.startedAt)/1e3).toFixed(1)+"s")}n.curThink=null}export function onReasoning(r,n){const t=u(n);if(s(t),!t)return;l(t),finishMd(t);const e=c(t);if(!e.curThink){T(t);const{wrap:o,head:i,body:d}=R(!0);h(t,o),e.curThink={wrap:o,head:i,body:d,startedAt:Date.now()}}e.curThink.body.textContent+=r,t===f()&&a()}export function onMeta(r,n,t){if(t==="tool"&&k()==="quiet")return;const e=u(n);s(e);const o=(r||"").trim();if(!e||!o)return;l(e),finishMd(e);const i=o.indexOf("⚠")!==-1||o.indexOf("✗")!==-1;h(e,p("div",i?"metaln warn":"metaln",o)),e===f()&&a()}export function onRetract(r,n){const t=u(n);if(!t)return;s(t);const e=c(t),o=e.curMd?e.curMd.root:null,i=!!o||e.curText!=null&&e.curText!=="",d=e.curText?e.curText.length:0;if(finishMd(t),finishThink(t),o){const m=e.turnRoots.indexOf(o);m!==-1&&e.turnRoots.splice(m,1),o.remove()}d>0&&(e.turnMd=e.turnMd.slice(0,Math.max(0,e.turnMd.length-d))),i&&(r&&h(t,p("div","metaln",r)),t===f()&&a())}export function onPhase(r,n){const t=u(n);r==="thinking"?y(t):s(t)}g?.addEventListener("click",r=>{const t=r.target.closest(".think-h");if(!t)return;const e=t.nextElementSibling;if(!e)return;const o=e.classList.toggle("hidden");t.setAttribute("aria-expanded",o?"false":"true");const i=t.querySelector(".tog");i&&w(i,o?"chevron-right":"chevron-down",M(o?"web.action.show":"web.action.hide"))});
@@ -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 i,icon as w,announce as a}from"../dom.js";import{t as f,pluralCount as _}from"../i18n.js";import{streamStateFor as C,tabs as k,session as g}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 h,clearBusy as O,clearEmpty as T,appendTo as d,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=h(e.sessionId);if(O(n),!n)return;T(n),E(n),M(n);const o=C(n);o.pendingArgs.set(e.toolCallId,e.args||{});const s=i("div","act "+y(e.name));s.appendChild(i("span","g","◇")),s.appendChild(i("span","lab",I(e.name)));const l=U(e.args);l&&(s.appendChild(i("span","sep","·")),s.appendChild(i("span","args",l)));const t=i("span","ok","");s.appendChild(t),s.classList.add("running"),d(n,s),o.toolNodes.set(e.toolCallId,{status:t,line:s}),y(e.name)!=="recon"&&(o.runReconOnly=!1),o.runCount++}function R(e,n){if(typeof n!="string"||!n)return;const o=i("div","toolout"),s=i("div","code");if(s.textContent=n,o.appendChild(s),n.length>600||n.split(`
2
+ `).length>12){o.classList.add("collapsed");const u="▸ "+_("web.tool.output",n.length),r=i("span","more",u);r.addEventListener("click",()=>{const c=o.classList.toggle("collapsed");r.textContent=c?u:"▾ "+f("web.tool.collapse")}),o.appendChild(r)}const t=e&&e.parentNode?null:D();e&&e.parentNode?e.parentNode.insertBefore(o,e.nextSibling):d(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=g&&g.host&&g.host.workspace?String(g.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 m(e,n,o,s){const l=h(o);if(!l)return null;if(x.indexOf(e)!==-1){const t=n.path||n.file||n.dir;if(!t)return null;const u=H(t),r=i("div","filerow "+y(e));if(r.appendChild(i("span","g","◇")),r.appendChild(i("span","lab",I(e))),r.appendChild(i("span","sep"," · ")),F.indexOf(e)!==-1){const p=i("a","path",u||String(t));p.href="/api/file?path="+encodeURIComponent(String(t)),p.target="_blank",p.rel="noopener noreferrer",p.title=f("web.card.open_title")+" · "+String(t),r.appendChild(p)}else{const p=i("span","tail",u||String(t));p.title=String(t),r.appendChild(p)}const c=i("button","copy-btn");return c.type="button",c.title=f("web.card.copy_title"),c.setAttribute("aria-label",f("web.card.copy_title")),c.appendChild(w("copy")),c.addEventListener("click",()=>{q(String(t)).then(p=>{if(c.replaceChildren(w(p?"check":"copy")),!p){const v=r.querySelector(".st");v&&(v.textContent=" ⚠")}window.setTimeout(()=>c.replaceChildren(w("copy")),1400)})}),r.appendChild(c),r.appendChild(i("span","st",s===!1?" ✗":s===!0?" ✓":"")),s===!1&&(r.dataset.fail="1"),/\.drawio(\.xml)?$/i.test(String(t))&&b()==="verbose"&&r.appendChild(i("span","detail","↳ "+f("web.card.drawio_hint"))),d(l,r),r}if(B.indexOf(e)!==-1&&n.url){const t=i("div","linkline");t.appendChild(document.createTextNode("↳ "));const u=G(n.url);if(u){const r=i("a","",n.url);r.href=u,r.target="_blank",r.rel="noopener noreferrer",t.appendChild(r);try{const c=new URL(u).hostname;c&&t.appendChild(i("span","dom"," · "+c))}catch{}}else t.appendChild(i("span","",n.url));return d(l,t),t}return null}function J(e){if(!e.success||!Array.isArray(e.images)||!e.images.length)return;const n=h(e.sessionId);if(n)for(const o of e.images){const s=P(String(e.name||""),String(o));s&&d(n,s)}}export function onToolEnd(e){Q(e),J(e)}function Q(e){const n=h(e.sessionId),o=n?C(n):null,s=o?o.toolNodes.get(e.toolCallId):void 0,l=s?s.line:null;if(s&&o){s.line.classList.remove("running");const r=S(e.durationMs);s.status.textContent=e.success?" ✓"+(r?" "+r:""):" ✗"+(r?" "+r:""),e.success||(s.status.classList.add("fail"),o.runFails++,o.runReconOnly=!1),o.toolNodes.delete(e.toolCallId)}const t=(o?o.pendingArgs.get(e.toolCallId):void 0)||{};o&&o.pendingArgs.delete(e.toolCallId);const u=t.path||t.file||t.dir;if(x.indexOf(e.name)!==-1&&u){if(l&&l.parentNode&&l.remove(),b()==="quiet"){if(e.success){const c=m(e.name,t,e.sessionId,e.success);c&&o&&o.runNodes.push(c),o&&(o.runDuration+=typeof e.durationMs=="number"?e.durationMs:0)}else{const c=m(e.name,t,e.sessionId,e.success),p=L(e.output);p&&N(c||l,i("div","detail","↳ "+p)),c&&o&&o.runNodes.push(c)}return}const r=m(e.name,t,e.sessionId,e.success);R(r||l,e.output);return}if(b()==="quiet"){if(e.success){l&&o&&o.runNodes.push(l);const r=m(e.name,t,e.sessionId,e.success);r&&o&&o.runNodes.push(r),o&&(o.runDuration+=typeof e.durationMs=="number"?e.durationMs:0)}else{const r=L(e.output);r&&N(l,i("div","detail","↳ "+r))}return}e.success&&m(e.name,t,e.sessionId,e.success),R(l,e.output)}export function onTurnEnd(e){g.busy=!1;const n=h(e.sessionId);O(n),M(n),E(n),K(n);const o=n?C(n):null;o&&o.toolNodes.forEach(t=>{t&&t.line&&n&&t.line.parentNode===n&&t.line.classList.remove("running")});const s=k.tabs.find(t=>t.id===e.sessionId);if(s&&(s.planCard=null),!n||!o){resetTurnText(n);return}if(e.success===!1)e.interrupted?(d(n,i("div","warnline","⚠ "+f("web.turn.stopped"))),a(f("web.turn.stopped"))):(d(n,i("div","errline","✗ "+f("web.turn.failed"))),a(f("web.turn.failed")));else{const t=[];typeof e.toolCalls=="number"&&e.toolCalls>0&&t.push(f("web.turn.tools",{count:e.toolCalls})),typeof e.durationMs=="number"&&t.push(S(e.durationMs)),t.length&&d(n,i("div","metric","⟡ "+t.join(" · "))),a(f("web.turn.end",{count:e.toolCalls||0}))}const l=o.turnRoots.map(t=>t.innerText||t.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,l,o.turnMd),resetTurnText(n)}export function resetTurnText(e){if(!e)return;const n=C(e);n.turnMd="",n.turnRoots=[]}export function onErrorEvent(e){if(!e||!e.error)return;const n=h(e.sessionId);n&&d(n,i("div","errline","✗ "+e.error)),a(String(e.error))}export function onCommandOutput(e,n){const o=h(n)||A;T(o),String(e).split(`
5
+ `).forEach(s=>d(o,i("div","cmdout",s))),z()}export function onLog(e){if(!e||typeof e.text!="string"||!e.text||e.diagnostic&&b()!=="verbose")return;const n=h(e.sessionId)||j();if(!n)return;const o=e.level,s=o==="error"?"errline":o==="warn"?"warnline":"detail",l=o==="error"?"✗ ":o==="warn"?"⚠ ":"↳ ",t=i("div",s);t.textContent=l+e.text,d(n,t),(o==="error"||o==="warn")&&a(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 m={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"},_={read_file:"read",list_dir:"read",file_info:"read",load_skill:"read",session_info:"read",grep:"find",glob:"find",project_map:"find",chunk_query:"find",history:"find",recall:"find",search_history:"find",web_search:"web",web_fetch:"web",download_file:"web",web_browse:"web",write_file:"create",create_dir:"create",define_capability:"create",remember:"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",enable_tools:"run",plan:"plan",todo:"plan",verify:"plan",lsp_check:"plan",set_thinking:"think",approve:"ask",question:"ask",meet_done:"done"};export function toolState(e){return _[e]||"run"}export function loaderStateFor(e){switch(e.type){case"turn_end":return e.success===!1?"error":"done";case"error":case"retract":return"error";case"question":return"ask";case"text":return"type";case"tool_start":case"tool_end":return toolState(e.name||"");case"index":return"find";case"setup_done":return"done";case"usage":case"state":case"config":case"files":case"sessions":case"plugins":case"log":return"idle";default:return"think"}}export const MMART_NAME="MMART";let w=()=>`Привет! Я ${MMART_NAME}`;export function setGreetResolver(e){w=e}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 o=r("span","orb");o.appendChild(r("i"));const a=r("span","keys");for(let i=0;i<4;i++)a.appendChild(r("i"));const c=r("span","dust");for(let i=0;i<3;i++)c.appendChild(r("i"));return t.append(s,o,a,r("span","grow"),r("span","fly"),c,r("span","q","?"),r("span","spark","✦"),r("span","star"),r("span","mdl-tip")),setFaceState(t,e),t}export function setFaceState(e,n){if(!e)return;const t=e.dataset.size||"";e.className="mdl"+(t?" "+t:"")+" "+m[n],e.dataset.state=n,m[n].includes("track")||(e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg"))}const p=new WeakMap;function b(e){const n=e.querySelector(".mdl-tip");if(!n)return;n.textContent=w(),e.classList.add("show-tip");const t=p.get(e);t!==void 0&&window.clearTimeout(t),p.set(e,window.setTimeout(()=>{e.classList.remove("show-tip"),p.delete(e)},2200))}function u(e){return Array.from(document.querySelectorAll(e))}function x(e,n){for(const t of u(".mdl.track")){const s=t.getBoundingClientRect(),o=s.left+s.width/2,a=s.top+s.height/2,c=e-o,i=n-a,l=Math.hypot(c,i)||1,f=s.width*.16,d=Math.min(1,l/140),y=c/l,k=i/l;t.style.setProperty("--ex",(y*f*d).toFixed(1)+"px"),t.style.setProperty("--ey",(k*f*d).toFixed(1)+"px"),t.style.setProperty("--tilt",(y*6*d).toFixed(2)+"deg")}}function g(){for(const e of u(".mdl.track"))e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg")}function v(e){const n=e.target;return!n||typeof n.closest!="function"?null:n.closest(".mdl.poke")}let h=!1;export function initCursor(){if(h||typeof window>"u")return;h=!0,window.addEventListener("mousemove",n=>x(n.clientX,n.clientY)),window.addEventListener("mouseleave",g);let e=null;window.addEventListener("click",n=>{const t=u(".mdl.poke");if(t.length){for(const o of t)o.classList.remove("blink-once"),o.offsetWidth,o.classList.add("blink-once");e!==null&&window.clearTimeout(e),e=window.setTimeout(()=>{for(const o of t)o.classList.remove("blink-once");e=null},130)}const s=v(n);s&&b(s)})}
@@ -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(s),V(s),Z(s),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 x,inp as C,tabstripEl as c,el as p,icon as O,link as B}from"../dom.js";import{api as b}from"../api.js";import{t as d}from"../i18n.js";import{tabs as i,session as f,hooks as v}from"../store.js";import{makeFeed as D,showEmptyFeed as F,activeFeed as P,appendTo as I,feedHasContent as N,loadHistory as _,syncUrl as y,scrollToBottom as w}from"../feed.js";import{setIndicator as M}from"../dialog.js";import{sidebarSessionChanged as L,setSessionLoading as S}from"../sidebar.js";import{setSessOpen as Y}from"../core/menus.js";import{closeCmdk as H}from"./cmdk.js";import{saveComposer as A,restoreComposer as E,renderAttachments as J,renderSessBar as W,initComposer as K}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:"✗"},q="mma-open-tabs";function h(){try{const e=i.tabs.filter(s=>s.kind==="session"&&!s.dead).map(s=>String(s.id)),t=i.tabs.find(s=>s.id===i.activeTabId),n={ids:e,active:t&&t.kind==="session"&&!t.dead?String(t.id):null};localStorage.setItem(q,JSON.stringify(n))}catch{}}export function readSavedTabs(){try{const e=localStorage.getItem(q);if(!e)return{ids:[],active:null};const t=JSON.parse(e),n=Array.isArray(t.ids)?t.ids.filter(a=>typeof a=="string"):[],s=typeof t.active=="string"?t.active:null;return{ids:n,active:s}}catch{return{ids:[],active:null}}}function T(e){return e==="working"?d("web.tab.working"):e==="waiting"?d("web.tab.waiting"):e==="queued"?d("web.tab.queued"):e==="failed"?d("web.tab.failed"):e==="dead"?d("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 n=i.tabs.find(s=>s.id===e);!n||n.status===t||n.dead||(n.status=t,u())}export function markTabDead(e){const t=i.tabs.find(a=>a.id===e);if(!t||t.dead)return;t.dead=!0,t.status="dead",t.historyLoaded=!0,t.historyFailed=!1,t.planCard=null,S(!1),t.feed.replaceChildren();const n=p("div","warnline","✗ "+d("web.session.gone"));I(t.feed,n);const s=B(d("web.topbar.close"),"",()=>closeTab(e));I(t.feed,s),t.feed===P()&&w(),u()}function u(){c.textContent="",i.tabs.forEach(e=>{const t=e.id===i.activeTabId,n=e.name||e.id,s=e.kind==="session"?String(e.id):n,a=p("div","stab"+(t?" on":""));if(a.setAttribute("role","tab"),a.setAttribute("tabindex",t?"0":"-1"),a.setAttribute("aria-selected",t?"true":"false"),a.setAttribute("aria-label",n),a.title=s,e.status&&e.status!=="idle"){const l=p("span","dot st-"+e.status,V[e.status]||"●");l.title=T(e.status),l.setAttribute("aria-label",T(e.status)),a.appendChild(l)}const o=p("span","name",n);o.title=s,a.appendChild(o);const r=p("button","stab-x");r.type="button",r.title=d("web.topbar.close"),r.setAttribute("aria-label",d("web.topbar.close")+": "+n),r.appendChild(O("x")),r.addEventListener("click",l=>{l.stopPropagation(),closeTab(e.id)}),a.appendChild(r);const k=()=>openTab(e.id,e.name,e.kind,!0);a.addEventListener("click",k),a.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),k())}),c.appendChild(a)}),j(),W()}function j(){const e=c.querySelector(".stab.on");if(!e)return;const t=Math.max(0,e.offsetLeft-4);(t<c.scrollLeft||t+e.offsetWidth>c.scrollLeft+c.clientWidth)&&(c.scrollLeft=t)}c.addEventListener("wheel",e=>{e.deltaY!==0&&(e.preventDefault(),c.scrollLeft+=e.deltaY)},{passive:!1});export function updateTabName(e,t){if(!e||!t)return;const n=i.tabs.find(a=>a.id===e);n&&n.name!==t&&(n.name=t,u());const s=f.sessions.find(a=>a.id===e);s&&s.name!==t&&(s.name=t,m())}export function openTab(e,t,n,s,a=!0){a&&A();let o=i.tabs.find(r=>r.id===e);if(o?t&&(o.name=t):(o={id:e,name:t||e,kind:n||"session",feed:D(),historyLoaded:!1,historyLoading:!1,historyFailed:!1,dead:!1,planCard:null,draft:"",attachments:[],status:"idle"},i.tabs.push(o)),!a){u(),m(),h();return}if(i.activeTabId=e,i.liveTabId=e,(n||"session")==="session"&&(f.activeSessionId=e,L(e),v.ensureTabState?.(e)),x.replaceChildren(o.feed),E(o),u(),m(),w(),o.kind==="session"&&!s&&(o.historyLoaded=!0),s&&o.kind==="session"){if(o.dead){y(),h();return}(!N(o.feed)||o.historyFailed)&&(o.historyLoaded=!1),S(!0),b("/api/sessions/activate",{method:"POST",body:{id:e}}).then(r=>{if(r.status===404){markTabDead(e),loadSessions();return}loadSessions()}),_(o).then(r=>{r&&r.gone&&markTabDead(o.id)})}y(),h()}export function closeTab(e){const t=i.tabs.findIndex(s=>s.id===e);if(t===-1)return;const n=i.activeTabId===e;if(n&&A(),i.tabs=i.tabs.filter(s=>s.id!==e),n){const s=i.tabs[Math.min(t,i.tabs.length-1)];s?(i.activeTabId=s.id,i.liveTabId=s.id,x.replaceChildren(s.feed),E(s),s.kind==="session"&&(f.activeSessionId=s.id,L(s.id),v.ensureTabState?.(s.id),b("/api/sessions/activate",{method:"POST",body:{id:s.id}})),w()):z()}u(),m(),y(),h()}function z(){i.activeTabId=null,i.liveTabId=null,f.activeSessionId=null,f.host={},C&&(C.value=""),i.attachments=[],J(),v.renderActive?.(),F(),h(),b("/api/sessions/deactivate",{method:"POST",body:{}})}async function g(){const e=await b("/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(),S(!0);return}i.newSeq++,openTab("new"+i.newSeq,d("web.empty.title"),"new",!1),M(d("web.sessions.create_failed"),!0)}document.getElementById("newChat")?.addEventListener("click",()=>{g()});export function reconcileTabStatuses(){const e=f.runningSessionIds||[],t=f.queued||{};let n=!1;i.tabs.forEach(s=>{if(s.kind!=="session"||s.status==="waiting"||s.status==="failed"||s.status==="dead")return;const a=e.includes(s.id)?"working":t[s.id]>0?"queued":"idle";s.status!==a&&(s.status=a,n=!0)}),n&&u()}export async function loadSessions(){const e=await b("/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")),Y(!1),H()}),K({activeTab,setTabStatus,newChatTab:g,markTabDead,openTab,closeTab,statusTitle:T}),U({openTab,closeTab,loadSessions,newChatTab:g});
@@ -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.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,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(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","contextAuto","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,s]of Object.entries(PANEL_SECTIONS))for(const r of s)for(const l of r.keys)i.set(l,e);return i}
@@ -1 +1 @@
1
- import{el as l,icon as A,link as _,connStatus as L,staleBar as w}from"../dom.js";import{api as k}from"../api.js";import{t as r,loadI18n as W}from"../i18n.js";import{settings as p,session as q,setPath as D,getPath as N,hooks as R}from"../store.js";import{contextLabel as z,matchesQuery as F}from"../format.js";import{closeAllMenus as v,setSessOpen as K}from"../core/menus.js";import{setIndicator as B}from"../dialog.js";import{setLayout as G}from"../rail.js";function S(e,n,o){e&&(e.textContent=n+":",e.appendChild(l("b","",o)),e.appendChild(A("chevron-down")))}function x(e,n,o,t){const i=l("button","mi"+(o?" on":""));return i.type="button",i.setAttribute("aria-pressed",o?"true":"false"),i.appendChild(l("span","",e)),n&&i.appendChild(l("span","sub",n)),i.addEventListener("click",s=>{s.stopPropagation(),t(),v()}),i}function O(e,n,o){const t=l("button","mi row-mi");return t.type="button",n&&t.appendChild(A(n)),t.appendChild(l("span","",e)),t.addEventListener("click",i=>{i.stopPropagation(),v(),o()}),t}let C="";export function renderSelectors(){const e=p.config||{},n=e.provider||{};S(document.getElementById("selModelBtn"),r("web.selectors.model"),e.model||"—");const o=document.getElementById("selModelMenu");o.textContent="";const t=document.createElement("input");t.id="selModelSearch",t.className="searchbox",t.type="search",t.autocomplete="off",t.spellcheck=!1,t.placeholder=r("web.selectors.search_models"),t.setAttribute("aria-label",r("web.selectors.search_models")),t.value=C,t.addEventListener("click",a=>a.stopPropagation()),o.appendChild(t);const i=l("div","model-menu-list");o.appendChild(i);const s=()=>{i.textContent="";const a=p.models.filter(d=>F(d,C));if(!a.length){i.appendChild(l("div","mi dim",p.models.length?r("web.settings.no_matches"):r("web.selectors.no_models")));return}a.forEach(d=>{const c=x(String(d),"",d===e.model,()=>{C="",postConfig("model",d,!0)});c.addEventListener("keydown",g=>{g.key==="ArrowUp"&&c===i.querySelector(".mi:not(.dim)")&&(g.preventDefault(),g.stopPropagation(),t.focus())}),i.appendChild(c)})};t.addEventListener("input",()=>{C=t.value,s()}),t.addEventListener("keydown",a=>{if(a.stopPropagation(),a.key==="ArrowDown"){a.preventDefault();const d=i.querySelector(".mi:not(.dim)");d&&d.focus()}else if(a.key==="Enter"){a.preventDefault();const d=i.querySelector(".mi:not(.dim)");d&&d.click()}else a.key==="Escape"&&(t.value?(a.preventDefault(),t.value="",C="",s()):v())}),s(),o.appendChild(l("div","sep")),o.appendChild(O(r("web.selectors.refresh_list"),"refresh",()=>{loadModels().then(renderSelectors)})),S(document.getElementById("selProviderBtn"),r("web.selectors.provider"),n.active||n.type||"—");const u=document.getElementById("selProviderMenu");u.textContent="",(Array.isArray(n.entries)&&n.entries.length?n.entries:[{label:n.active||n.type,type:n.type}]).forEach(a=>{const d=a.label||a.type;d&&u.appendChild(x(d,a.type||"",d===(n.active||n.type),()=>{postConfig("provider.active",d,!0)}))}),S(document.getElementById("selContextBtn"),r("web.selectors.context"),z());const m=document.getElementById("selContextMenu");m.textContent="",[8192,16384,32768,65536,131072].forEach(a=>{m.appendChild(x(Math.round(a/1024)+"K",a===e.contextWindow?r("web.selectors.current"):"",a===e.contextWindow,()=>{postConfig("contextWindow",a,!1)}))}),m.appendChild(l("div","sep"));const y=l("button","mi row-mi");y.type="button",y.appendChild(A("settings")),y.appendChild(l("span","",r("web.selectors.custom"))),y.addEventListener("click",a=>{if(a.stopPropagation(),m.querySelector(".ctx-custom"))return;const d=l("div","ctx-custom"),c=l("input");c.type="number",c.min="1024",c.step="1024",c.value=String(e.contextWindow||32768),c.placeholder=r("web.selectors.context_prompt"),c.setAttribute("aria-label",r("web.selectors.context_prompt"));const g=()=>{const f=Number(c.value.trim());Number.isFinite(f)&&f>=1024?(v(),postConfig("contextWindow",f,!1)):c.focus()};c.addEventListener("click",f=>f.stopPropagation()),c.addEventListener("keydown",f=>{f.stopPropagation(),f.key==="Enter"?(f.preventDefault(),g()):f.key==="Escape"&&d.remove()});const T=_(r("web.settings.save"),"",g);d.appendChild(c),d.appendChild(T),m.appendChild(d),setTimeout(()=>c.focus(),0)}),m.appendChild(y),V(),P()}const H=["auto","default","none","low","medium","high","max"],U=["auto","default","none","low","high"];function V(){const e=document.querySelector('[data-sel="reasoning"]'),n=document.getElementById("selReasoningBtn"),o=document.getElementById("selReasoningMenu");if(!e||!n||!o)return;const t=q.reasoning;if(!t||t.strategy==="none"){e.hidden=!0;return}if(e.hidden=!1,t.supported===!1){S(n,r("web.selectors.reasoning"),r("web.selectors.reasoning_off")),o.textContent="",o.appendChild(l("div","mi dim",r("reasoning.probe_failed"))),o.appendChild(l("div","sep")),o.appendChild(O(r("web.settings.reasoning"),"settings",()=>h.openSettingsAt?.("reasoning")));return}const i=p.config&&N(p.config,"reasoning.mode")||t.mode||"auto";S(n,r("web.selectors.reasoning"),String(i)),o.textContent="",(t.strategy==="openai-effort"?H:U).forEach(u=>{o.appendChild(x(u,u===i?r("web.selectors.current"):"",u===i,()=>{postConfig("reasoning.mode",u,!1)}))})}document.querySelectorAll("[data-sel]").forEach(e=>{const n=e.querySelector("button");n&&(n.setAttribute("aria-haspopup","menu"),n.setAttribute("aria-expanded","false"),n.addEventListener("click",o=>{o.stopPropagation(),K(!1),document.querySelectorAll("[data-sel]").forEach(i=>{if(i!==e){i.classList.remove("open");const s=i.querySelector("button");s&&s.setAttribute("aria-expanded","false")}});const t=e.classList.toggle("open");if(n.setAttribute("aria-expanded",t?"true":"false"),t&&e.dataset&&e.dataset.sel==="model"){const i=document.getElementById("selModelSearch");i&&setTimeout(()=>i.focus(),0)}}))});const j=["provider.active","model","contextWindow","reasoning.mode"];let I=0,E=null,h={renderSettings:null,openSettingsAt:null};export function setWriteHooks(e){h={...h,...e}}function P(){const e=E!==null||!p.config,n=document.querySelector(".selectors");n&&(e?n.setAttribute("data-pending",E||"boot"):n.removeAttribute("data-pending")),["selProviderBtn","selModelBtn","selContextBtn","selReasoningBtn"].forEach(o=>{const t=document.getElementById(o);t&&(t.classList.toggle("pending",e),t.setAttribute("aria-busy",e?"true":"false"))})}export async function postConfig(e,n,o){const t=j.indexOf(e)!==-1;if(t&&E!==null)return B(r("web.selectors.switch_busy"),!0),!1;let i=0;t&&(i=++I,E=e,v(),P());try{const s=await k("/api/config",{method:"POST",body:{key:e,value:n}});if(!s.ok||!s.data||!s.data.ok){const M=s.data&&(s.data.error||s.data.reason)||s.status||r("web.settings.save_failed");return B(String(M),!0),!1}const u=s.data.persisted!==!1;return B(u?r("web.settings.saved"):s.data.warning||"not persisted",!u),p.config&&s.data.value!==void 0&&D(p.config,e,s.data.value),e==="ui.activityRail"&&G(String(s.data.value)),e==="ui.fontSize"&&applyFontSize(String(s.data.value)),e==="locale"&&(await W(),R.applyStaticI18n&&R.applyStaticI18n(),h.renderSettings?.()),e==="provider.active"||e==="model"?await Promise.all([loadConfig(),loadModels()]):t&&await loadConfig(),t&&i!==I||(renderSelectors(),o&&h.renderSettings?.()),!0}finally{t&&i===I&&(E=null,P())}}export async function loadConfig(){const e=await k("/api/config");!e.ok||!e.data||(p.config=e.data.config||{},p.registry=Array.isArray(e.data.registry)?e.data.registry:[],p.webToken=typeof e.data.webToken=="string"?e.data.webToken:null,applyFontSize(),renderSelectors(),h.renderSettings?.())}export async function loadModels(){const e=await k("/api/models");!e.ok||!e.data||(p.models=Array.isArray(e.data.models)?e.data.models:[],e.data.reasoning&&typeof e.data.reasoning=="object"&&(q.reasoning=e.data.reasoning),renderSelectors())}export function setConnStatus(e){L&&(L.hidden=!e,L.textContent=e?"⋯ "+r("web.conn.reconnecting"):"")}let b=null;export function setStaleBar(e,n){if(!w)return null;const o=e===void 0?!!b:!!e;return!n&&o===b||(b=o,w.hidden=!o,w.textContent="",!o)||(w.appendChild(l("span","","⚠ "+r("web.i18n.stale")+" ")),w.appendChild(_(r("web.i18n.reload"),"",()=>location.reload()))),b}export function applyFontSize(e){const n=e||p.config&&p.config.ui&&p.config.ui.fontSize||"comfortable",o=n==="compact"||n==="large"?n:"comfortable";o==="comfortable"?document.body.removeAttribute("data-font"):document.body.setAttribute("data-font",o)}
1
+ import{el as l,icon as B,link as q,connStatus as k,staleBar as y}from"../dom.js";import{api as I}from"../api.js";import{t as s,loadI18n as z}from"../i18n.js";import{settings as c,session as R,setPath as W,getPath as F,hooks as O}from"../store.js";import{contextLabel as T,matchesQuery as K}from"../format.js";import{closeAllMenus as v,setSessOpen as G}from"../core/menus.js";import{setIndicator as L}from"../dialog.js";import{setLayout as H}from"../rail.js";function S(e,n,o){e&&(e.textContent=n+":",e.appendChild(l("b","",o)),e.appendChild(B("chevron-down")))}function x(e,n,o,t){const i=l("button","mi"+(o?" on":""));return i.type="button",i.setAttribute("aria-pressed",o?"true":"false"),i.appendChild(l("span","",e)),n&&i.appendChild(l("span","sub",n)),i.addEventListener("click",r=>{r.stopPropagation(),t(),v()}),i}function D(e,n,o){const t=l("button","mi row-mi");return t.type="button",n&&t.appendChild(B(n)),t.appendChild(l("span","",e)),t.addEventListener("click",i=>{i.stopPropagation(),v(),o()}),t}let C="";export function renderSelectors(){const e=c.config||{},n=e.provider||{};S(document.getElementById("selModelBtn"),s("web.selectors.model"),e.model||"—");const o=document.getElementById("selModelMenu");o.textContent="";const t=document.createElement("input");t.id="selModelSearch",t.className="searchbox",t.type="search",t.autocomplete="off",t.spellcheck=!1,t.placeholder=s("web.selectors.search_models"),t.setAttribute("aria-label",s("web.selectors.search_models")),t.value=C,t.addEventListener("click",d=>d.stopPropagation()),o.appendChild(t);const i=l("div","model-menu-list");o.appendChild(i);const r=()=>{i.textContent="";const d=c.models.filter(a=>K(a,C));if(!d.length){i.appendChild(l("div","mi dim",c.models.length?s("web.settings.no_matches"):s("web.selectors.no_models")));return}d.forEach(a=>{const p=x(String(a),"",a===e.model,()=>{C="",postConfig("model",a,!0)});p.addEventListener("keydown",g=>{g.key==="ArrowUp"&&p===i.querySelector(".mi:not(.dim)")&&(g.preventDefault(),g.stopPropagation(),t.focus())}),i.appendChild(p)})};t.addEventListener("input",()=>{C=t.value,r()}),t.addEventListener("keydown",d=>{if(d.stopPropagation(),d.key==="ArrowDown"){d.preventDefault();const a=i.querySelector(".mi:not(.dim)");a&&a.focus()}else if(d.key==="Enter"){d.preventDefault();const a=i.querySelector(".mi:not(.dim)");a&&a.click()}else d.key==="Escape"&&(t.value?(d.preventDefault(),t.value="",C="",r()):v())}),r(),o.appendChild(l("div","sep")),o.appendChild(D(s("web.selectors.refresh_list"),"refresh",()=>{loadModels().then(renderSelectors)})),S(document.getElementById("selProviderBtn"),s("web.selectors.provider"),n.active||n.type||"—");const u=document.getElementById("selProviderMenu");u.textContent="",(Array.isArray(n.entries)&&n.entries.length?n.entries:[{label:n.active||n.type,type:n.type}]).forEach(d=>{const a=d.label||d.type;a&&u.appendChild(x(a,d.type||"",a===(n.active||n.type),()=>{postConfig("provider.active",a,!0)}))});const A=!!c.config&&e.contextAuto!==!1;S(document.getElementById("selContextBtn"),s("web.selectors.context"),A?s("web.selectors.auto"):T());const m=document.getElementById("selContextMenu");m.textContent="",m.appendChild(x(s("web.selectors.auto"),A?T():"",A,()=>{postConfig("contextAuto",!0,!1)})),m.appendChild(l("div","sep")),[8192,16384,32768,65536,131072].forEach(d=>{const a=!A&&d===e.contextWindow;m.appendChild(x(Math.round(d/1024)+"K",a?s("web.selectors.current"):"",a,()=>{postConfig("contextWindow",d,!1)}))}),m.appendChild(l("div","sep"));const w=l("button","mi row-mi");w.type="button",w.appendChild(B("settings")),w.appendChild(l("span","",s("web.selectors.custom"))),w.addEventListener("click",d=>{if(d.stopPropagation(),m.querySelector(".ctx-custom"))return;const a=l("div","ctx-custom"),p=l("input");p.type="number",p.min="1024",p.step="1024",p.value=String(e.contextWindow||32768),p.placeholder=s("web.selectors.context_prompt"),p.setAttribute("aria-label",s("web.selectors.context_prompt"));const g=()=>{const f=Number(p.value.trim());Number.isFinite(f)&&f>=1024?(v(),postConfig("contextWindow",f,!1)):p.focus()};p.addEventListener("click",f=>f.stopPropagation()),p.addEventListener("keydown",f=>{f.stopPropagation(),f.key==="Enter"?(f.preventDefault(),g()):f.key==="Escape"&&a.remove()});const N=q(s("web.settings.save"),"",g);a.appendChild(p),a.appendChild(N),m.appendChild(a),setTimeout(()=>p.focus(),0)}),m.appendChild(w),j(),_()}const U=["auto","default","none","low","medium","high","max"],V=["auto","default","none","low","high"];function j(){const e=document.querySelector('[data-sel="reasoning"]'),n=document.getElementById("selReasoningBtn"),o=document.getElementById("selReasoningMenu");if(!e||!n||!o)return;const t=R.reasoning;if(!t||t.strategy==="none"){e.hidden=!0;return}if(e.hidden=!1,t.supported===!1){S(n,s("web.selectors.reasoning"),s("web.selectors.reasoning_off")),o.textContent="",o.appendChild(l("div","mi dim",s("reasoning.probe_failed"))),o.appendChild(l("div","sep")),o.appendChild(D(s("web.settings.reasoning"),"settings",()=>b.openSettingsAt?.("reasoning")));return}const i=c.config&&F(c.config,"reasoning.mode")||t.mode||"auto";S(n,s("web.selectors.reasoning"),String(i)),o.textContent="",(t.strategy==="openai-effort"?U:V).forEach(u=>{o.appendChild(x(u,u===i?s("web.selectors.current"):"",u===i,()=>{postConfig("reasoning.mode",u,!1)}))})}document.querySelectorAll("[data-sel]").forEach(e=>{const n=e.querySelector("button");n&&(n.setAttribute("aria-haspopup","menu"),n.setAttribute("aria-expanded","false"),n.addEventListener("click",o=>{o.stopPropagation(),G(!1),document.querySelectorAll("[data-sel]").forEach(i=>{if(i!==e){i.classList.remove("open");const r=i.querySelector("button");r&&r.setAttribute("aria-expanded","false")}});const t=e.classList.toggle("open");if(n.setAttribute("aria-expanded",t?"true":"false"),t&&e.dataset&&e.dataset.sel==="model"){const i=document.getElementById("selModelSearch");i&&setTimeout(()=>i.focus(),0)}}))});const Q=["provider.active","model","contextWindow","contextAuto","reasoning.mode"];let P=0,E=null,b={renderSettings:null,openSettingsAt:null};export function setWriteHooks(e){b={...b,...e}}function _(){const e=E!==null||!c.config,n=document.querySelector(".selectors");n&&(e?n.setAttribute("data-pending",E||"boot"):n.removeAttribute("data-pending")),["selProviderBtn","selModelBtn","selContextBtn","selReasoningBtn"].forEach(o=>{const t=document.getElementById(o);t&&(t.classList.toggle("pending",e),t.setAttribute("aria-busy",e?"true":"false"))})}export async function postConfig(e,n,o){const t=Q.indexOf(e)!==-1;if(t&&E!==null)return L(s("web.selectors.switch_busy"),!0),!1;let i=0;t&&(i=++P,E=e,v(),_());try{const r=await I("/api/config",{method:"POST",body:{key:e,value:n}});if(!r.ok||!r.data||!r.data.ok){const M=r.data&&(r.data.error||r.data.reason)||r.status||s("web.settings.save_failed");return L(String(M),!0),!1}const u=r.data.persisted!==!1;return e==="contextAuto"&&r.data.probed===!1?L(s("web.selectors.auto_failed"),!0):L(u?s("web.settings.saved"):r.data.warning||"not persisted",!u),c.config&&r.data.value!==void 0&&W(c.config,e,r.data.value),e==="contextAuto"&&c.config&&typeof r.data.contextWindow=="number"&&W(c.config,"contextWindow",r.data.contextWindow),e==="ui.activityRail"&&H(String(r.data.value)),e==="ui.fontSize"&&applyFontSize(String(r.data.value)),e==="locale"&&(await z(),O.applyStaticI18n&&O.applyStaticI18n(),b.renderSettings?.()),e==="provider.active"||e==="model"?await Promise.all([loadConfig(),loadModels()]):t&&await loadConfig(),t&&i!==P||(renderSelectors(),o&&b.renderSettings?.()),!0}finally{t&&i===P&&(E=null,_())}}export async function loadConfig(){const e=await I("/api/config");!e.ok||!e.data||(c.config=e.data.config||{},c.registry=Array.isArray(e.data.registry)?e.data.registry:[],c.webToken=typeof e.data.webToken=="string"?e.data.webToken:null,applyFontSize(),renderSelectors(),b.renderSettings?.())}export async function loadModels(){const e=await I("/api/models");!e.ok||!e.data||(c.models=Array.isArray(e.data.models)?e.data.models:[],e.data.reasoning&&typeof e.data.reasoning=="object"&&(R.reasoning=e.data.reasoning),renderSelectors())}export function setConnStatus(e){k&&(k.hidden=!e,k.textContent=e?"⋯ "+s("web.conn.reconnecting"):"")}let h=null;export function setStaleBar(e,n){if(!y)return null;const o=e===void 0?!!h:!!e;return!n&&o===h||(h=o,y.hidden=!o,y.textContent="",!o)||(y.appendChild(l("span","","⚠ "+s("web.i18n.stale")+" ")),y.appendChild(q(s("web.i18n.reload"),"",()=>location.reload()))),h}export function applyFontSize(e){const n=e||c.config&&c.config.ui&&c.config.ui.fontSize||"comfortable",o=n==="compact"||n==="large"?n:"comfortable";o==="comfortable"?document.body.removeAttribute("data-font"):document.body.setAttribute("data-font",o)}
@@ -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 r,ICON_NAME as u,paneEl as B,mqMobile as S,readStored as h,storeTab as I}from"./state.js";import{collapseDetail as d,renderList as b,renderDetail as v}from"./trace.js";import{sidebarMapState as y,sidebarMapIndicator as x}from"./map.js";import{renderLsp as p,sidebarLspState as E}from"./lsp.js";import{renderFilesTree as T,refreshFilesTree as k}from"./files.js";import{renderPlugins as A,sidebarPluginsState as L}from"./plugins.js";export function setSidebarTab(n,i=!0){r.includes(n)||(n="session"),i&&I(n);const t=n==="trace"&&S()?"session":n;t!==e.active&&d(),e.active=t,r.forEach(a=>{const s=B(a);s&&(s.hidden=a!==t);const l=e.el&&e.el.querySelector('.sb-tab[data-tab="'+a+'"]');if(l){const c=a===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(u[t]))),t==="lsp"&&E(),t==="files"&&T(),t==="plugins"&&L()}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(r.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),b(),e.selected){const n=e.trace.find(i=>i.id===e.selected);n&&v(n)}y(g.host),p(),k(),A()}}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.plugins.bodyEl=document.getElementById("pluginsBody"),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(u[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 a=r.indexOf(t.dataset.tab||"session"),s=r[(a+(o.key==="ArrowRight"?1:r.length-1))%r.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","6"].includes(t.key))return;const o=document.activeElement?String(document.activeElement.tagName):"";o==="INPUT"||o==="TEXTAREA"||(t.preventDefault(),setSidebarTab(r[Number(t.key)-1]))}),document.addEventListener("keydown",t=>{t.key==="Escape"&&e.selected&&d()});const i=h();setSidebarTab(i&&r.includes(i)?i:"session"),b()}export{y as sidebarMapState,x as sidebarMapIndicator,p as renderLsp,E 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()})}
@@ -1 +1 @@
1
- export const TAB_KEY="mma-sidebar-tab",TABS=["session","map","trace","lsp","files","plugins"],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:{treeEl:null,detailEl:null,detailTitleEl:null,detailBodyEl:null,detailAttachEl:null,expanded:new Set,listings:new Map,selectedPath:null},plugins:{bodyEl:null,records:[],failures:[],loaded:!1,unavailable:!1}};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{}}