micro-models-agent 2.29.1 → 2.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +180 -0
  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/dom.js +1 -1
  6. package/dist/assets/js/feed/core.js +1 -1
  7. package/dist/assets/js/feed/sidebar.js +1 -1
  8. package/dist/assets/js/feed/turn.js +4 -4
  9. package/dist/assets/js/footer.js +1 -0
  10. package/dist/assets/js/loader.js +1 -0
  11. package/dist/assets/js/md-normalize.js +5 -0
  12. package/dist/assets/js/session/composer.js +1 -1
  13. package/dist/assets/js/session/tabs.js +1 -1
  14. package/dist/assets/js/settings/controls.js +1 -1
  15. package/dist/assets/js/sidebar/core.js +1 -1
  16. package/dist/assets/js/sidebar/drawer.js +1 -0
  17. package/dist/assets/js/sidebar/files/chrome.js +1 -0
  18. package/dist/assets/js/sidebar/files/constants.js +1 -0
  19. package/dist/assets/js/sidebar/files/crumbs.js +1 -0
  20. package/dist/assets/js/sidebar/files/history.js +1 -0
  21. package/dist/assets/js/sidebar/files/keys.js +1 -0
  22. package/dist/assets/js/sidebar/files/split.js +1 -0
  23. package/dist/assets/js/sidebar/files/tree.js +1 -0
  24. package/dist/assets/js/sidebar/files/view.js +1 -0
  25. package/dist/assets/js/sidebar/files.js +1 -1
  26. package/dist/assets/js/sidebar/state.js +1 -1
  27. package/dist/assets/js/sidebar/trace.js +4 -4
  28. package/dist/assets/js/sidebar.js +1 -1
  29. package/dist/assets/js/state-sync.js +1 -1
  30. package/dist/assets/md.js +1 -1
  31. package/dist/assets/setup.js +2 -2
  32. package/dist/assets/styles.css +1 -1
  33. package/dist/i18n/en.json +1 -1
  34. package/dist/i18n/ru.json +1 -1
  35. package/dist/main.js +370 -355
  36. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import{el as r,icon as w,announce as g}from"../dom.js";import{t as d,pluralCount as _}from"../i18n.js";import{feed as c,tabs as k,session as m}from"../store.js";import{FILE_TOOLS as x,OPENABLE_TOOLS as F,LINK_TOOLS as B,categoryOf as y,labelOf as I,argText as U,formatMs as S,verbosity as b,firstOutputLine as L}from"../format.js";import{copyText as q}from"../../md.js";import{imageCard as P}from"./image-card.js";import{activeFeed as O,liveFeed as j,feedForEvent as a,clearBusy as T,clearEmpty as N,appendTo as h,insertAfter as E,appendActionsRow as D,flushRun as $}from"./core.js";import{finishMd as M,finishThink as R}from"./stream.js";export function onToolStart(e){const n=a(e.sessionId);if(T(n),!n)return;N(n),M(),R(),c.pendingArgs.set(e.toolCallId,e.args||{});const o=r("div","act "+y(e.name));o.appendChild(r("span","g","◇")),o.appendChild(r("span","lab",I(e.name)));const s=U(e.args);s&&(o.appendChild(r("span","sep","·")),o.appendChild(r("span","args",s)));const i=r("span","ok","");o.appendChild(i),o.classList.add("running"),h(n,o),c.toolNodes.set(e.toolCallId,{status:i,line:o}),y(e.name)!=="recon"&&(c.runReconOnly=!1),c.runCount++}function A(e,n){if(typeof n!="string"||!n)return;const o=r("div","toolout"),s=r("div","code");if(s.textContent=n,o.appendChild(s),n.length>600||n.split(`
2
- `).length>12){o.classList.add("collapsed");const p="▸ "+_("web.tool.output",n.length),l=r("span","more",p);l.addEventListener("click",()=>{const u=o.classList.toggle("collapsed");l.textContent=u?p:"▾ "+d("web.tool.collapse")}),o.appendChild(l)}const t=e&&e.parentNode?null:j();e&&e.parentNode?e.parentNode.insertBefore(o,e.nextSibling):h(t,o)}function K(e){if(typeof e!="string"||!e)return null;try{const n=new URL(e,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="file:")return n.href}catch{return null}return null}function z(e){const n=String(e??"").replace(/\\/g,"/");try{const o=m&&m.host&&m.host.workspace?String(m.host.workspace).replace(/\\/g,"/").replace(/\/+$/,""):"";if(o&&(n===o||n.indexOf(o+"/")===0)){const s=n===o?"":n.slice(o.length+1);if(s)return s}}catch{}return n}function C(e,n,o,s){const i=a(o);if(!i)return null;if(x.indexOf(e)!==-1){const t=n.path||n.file||n.dir;if(!t)return null;const p=z(t),l=r("div","filerow "+y(e));if(l.appendChild(r("span","g","◇")),l.appendChild(r("span","lab",I(e))),l.appendChild(r("span","sep"," · ")),F.indexOf(e)!==-1){const f=r("a","path",p||String(t));f.href="/api/file?path="+encodeURIComponent(String(t)),f.target="_blank",f.rel="noopener noreferrer",f.title=d("web.card.open_title")+" · "+String(t),l.appendChild(f)}else{const f=r("span","tail",p||String(t));f.title=String(t),l.appendChild(f)}const u=r("button","copy-btn");return u.type="button",u.title=d("web.card.copy_title"),u.setAttribute("aria-label",d("web.card.copy_title")),u.appendChild(w("copy")),u.addEventListener("click",()=>{q(String(t)).then(f=>{if(u.replaceChildren(w(f?"check":"copy")),!f){const v=l.querySelector(".st");v&&(v.textContent=" ⚠")}window.setTimeout(()=>u.replaceChildren(w("copy")),1400)})}),l.appendChild(u),l.appendChild(r("span","st",s===!1?" ✗":s===!0?" ✓":"")),s===!1&&(l.dataset.fail="1"),/\.drawio(\.xml)?$/i.test(String(t))&&b()==="verbose"&&l.appendChild(r("span","detail","↳ "+d("web.card.drawio_hint"))),h(i,l),l}if(B.indexOf(e)!==-1&&n.url){const t=r("div","linkline");t.appendChild(document.createTextNode("↳ "));const p=K(n.url);if(p){const l=r("a","",n.url);l.href=p,l.target="_blank",l.rel="noopener noreferrer",t.appendChild(l);try{const u=new URL(p).hostname;u&&t.appendChild(r("span","dom"," · "+u))}catch{}}else t.appendChild(r("span","",n.url));return h(i,t),t}return null}function G(e){if(!e.success||!Array.isArray(e.images)||!e.images.length)return;const n=a(e.sessionId);if(n)for(const o of e.images){const s=P(String(e.name||""),String(o));s&&h(n,s)}}export function onToolEnd(e){H(e),G(e)}function H(e){const n=c.toolNodes.get(e.toolCallId),o=n?n.line:null;if(n){n.line.classList.remove("running");const t=S(e.durationMs);n.status.textContent=e.success?" ✓"+(t?" "+t:""):" ✗"+(t?" "+t:""),e.success||(n.status.classList.add("fail"),c.runFails++,c.runReconOnly=!1)}c.toolNodes.delete(e.toolCallId);const s=c.pendingArgs.get(e.toolCallId)||{};c.pendingArgs.delete(e.toolCallId);const i=s.path||s.file||s.dir;if(x.indexOf(e.name)!==-1&&i){if(o&&o.parentNode&&o.remove(),b()==="quiet"){if(e.success){const p=C(e.name,s,e.sessionId,e.success);p&&c.runNodes.push(p),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const p=C(e.name,s,e.sessionId,e.success),l=L(e.output);l&&E(p||o,r("div","detail","↳ "+l)),p&&c.runNodes.push(p)}return}const t=C(e.name,s,e.sessionId,e.success);A(t||o,e.output);return}if(b()==="quiet"){if(e.success){o&&c.runNodes.push(o);const t=C(e.name,s,e.sessionId,e.success);t&&c.runNodes.push(t),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const t=L(e.output);t&&E(o,r("div","detail","↳ "+t))}return}e.success&&C(e.name,s,e.sessionId,e.success),A(o,e.output)}export function onTurnEnd(e){m.busy=!1;const n=a(e.sessionId);T(n),R(),M(),$(),c.toolNodes.forEach(i=>{i&&i.line&&n&&i.line.parentNode===n&&i.line.classList.remove("running")});const o=k.tabs.find(i=>i.id===e.sessionId);if(o&&(o.planCard=null),!n){resetTurnText();return}if(e.success===!1)e.interrupted?(h(n,r("div","warnline","⚠ "+d("web.turn.stopped"))),g(d("web.turn.stopped"))):(h(n,r("div","errline","✗ "+d("web.turn.failed"))),g(d("web.turn.failed")));else{const i=[];typeof e.toolCalls=="number"&&e.toolCalls>0&&i.push(d("web.turn.tools",{count:e.toolCalls})),typeof e.durationMs=="number"&&i.push(S(e.durationMs)),i.length&&h(n,r("div","metric","⟡ "+i.join(" · "))),g(d("web.turn.end",{count:e.toolCalls||0}))}const s=c.turnRoots.map(i=>i.innerText||i.textContent||"").join(`
1
+ import{msgs as A,el as r,icon as w,announce as g}from"../dom.js";import{t as d,pluralCount as _}from"../i18n.js";import{feed as c,tabs as k,session as m}from"../store.js";import{FILE_TOOLS as x,OPENABLE_TOOLS as F,LINK_TOOLS as B,categoryOf as y,labelOf as I,argText as U,formatMs as S,verbosity as b,firstOutputLine as L}from"../format.js";import{copyText as q}from"../../md.js";import{imageCard as P}from"./image-card.js";import{activeFeed as j,liveFeed as D,feedForEvent as a,clearBusy as O,clearEmpty as T,appendTo as h,insertAfter as N,appendActionsRow as $,flushRun as K,scrollToBottom as z}from"./core.js";import{finishMd as E,finishThink as M}from"./stream.js";export function onToolStart(e){const n=a(e.sessionId);if(O(n),!n)return;T(n),E(),M(),c.pendingArgs.set(e.toolCallId,e.args||{});const o=r("div","act "+y(e.name));o.appendChild(r("span","g","◇")),o.appendChild(r("span","lab",I(e.name)));const s=U(e.args);s&&(o.appendChild(r("span","sep","·")),o.appendChild(r("span","args",s)));const i=r("span","ok","");o.appendChild(i),o.classList.add("running"),h(n,o),c.toolNodes.set(e.toolCallId,{status:i,line:o}),y(e.name)!=="recon"&&(c.runReconOnly=!1),c.runCount++}function R(e,n){if(typeof n!="string"||!n)return;const o=r("div","toolout"),s=r("div","code");if(s.textContent=n,o.appendChild(s),n.length>600||n.split(`
2
+ `).length>12){o.classList.add("collapsed");const p="▸ "+_("web.tool.output",n.length),l=r("span","more",p);l.addEventListener("click",()=>{const u=o.classList.toggle("collapsed");l.textContent=u?p:"▾ "+d("web.tool.collapse")}),o.appendChild(l)}const t=e&&e.parentNode?null:D();e&&e.parentNode?e.parentNode.insertBefore(o,e.nextSibling):h(t,o)}function G(e){if(typeof e!="string"||!e)return null;try{const n=new URL(e,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="file:")return n.href}catch{return null}return null}function H(e){const n=String(e??"").replace(/\\/g,"/");try{const o=m&&m.host&&m.host.workspace?String(m.host.workspace).replace(/\\/g,"/").replace(/\/+$/,""):"";if(o&&(n===o||n.indexOf(o+"/")===0)){const s=n===o?"":n.slice(o.length+1);if(s)return s}}catch{}return n}function C(e,n,o,s){const i=a(o);if(!i)return null;if(x.indexOf(e)!==-1){const t=n.path||n.file||n.dir;if(!t)return null;const p=H(t),l=r("div","filerow "+y(e));if(l.appendChild(r("span","g","◇")),l.appendChild(r("span","lab",I(e))),l.appendChild(r("span","sep"," · ")),F.indexOf(e)!==-1){const f=r("a","path",p||String(t));f.href="/api/file?path="+encodeURIComponent(String(t)),f.target="_blank",f.rel="noopener noreferrer",f.title=d("web.card.open_title")+" · "+String(t),l.appendChild(f)}else{const f=r("span","tail",p||String(t));f.title=String(t),l.appendChild(f)}const u=r("button","copy-btn");return u.type="button",u.title=d("web.card.copy_title"),u.setAttribute("aria-label",d("web.card.copy_title")),u.appendChild(w("copy")),u.addEventListener("click",()=>{q(String(t)).then(f=>{if(u.replaceChildren(w(f?"check":"copy")),!f){const v=l.querySelector(".st");v&&(v.textContent=" ⚠")}window.setTimeout(()=>u.replaceChildren(w("copy")),1400)})}),l.appendChild(u),l.appendChild(r("span","st",s===!1?" ✗":s===!0?" ✓":"")),s===!1&&(l.dataset.fail="1"),/\.drawio(\.xml)?$/i.test(String(t))&&b()==="verbose"&&l.appendChild(r("span","detail","↳ "+d("web.card.drawio_hint"))),h(i,l),l}if(B.indexOf(e)!==-1&&n.url){const t=r("div","linkline");t.appendChild(document.createTextNode("↳ "));const p=G(n.url);if(p){const l=r("a","",n.url);l.href=p,l.target="_blank",l.rel="noopener noreferrer",t.appendChild(l);try{const u=new URL(p).hostname;u&&t.appendChild(r("span","dom"," · "+u))}catch{}}else t.appendChild(r("span","",n.url));return h(i,t),t}return null}function J(e){if(!e.success||!Array.isArray(e.images)||!e.images.length)return;const n=a(e.sessionId);if(n)for(const o of e.images){const s=P(String(e.name||""),String(o));s&&h(n,s)}}export function onToolEnd(e){Q(e),J(e)}function Q(e){const n=c.toolNodes.get(e.toolCallId),o=n?n.line:null;if(n){n.line.classList.remove("running");const t=S(e.durationMs);n.status.textContent=e.success?" ✓"+(t?" "+t:""):" ✗"+(t?" "+t:""),e.success||(n.status.classList.add("fail"),c.runFails++,c.runReconOnly=!1)}c.toolNodes.delete(e.toolCallId);const s=c.pendingArgs.get(e.toolCallId)||{};c.pendingArgs.delete(e.toolCallId);const i=s.path||s.file||s.dir;if(x.indexOf(e.name)!==-1&&i){if(o&&o.parentNode&&o.remove(),b()==="quiet"){if(e.success){const p=C(e.name,s,e.sessionId,e.success);p&&c.runNodes.push(p),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const p=C(e.name,s,e.sessionId,e.success),l=L(e.output);l&&N(p||o,r("div","detail","↳ "+l)),p&&c.runNodes.push(p)}return}const t=C(e.name,s,e.sessionId,e.success);R(t||o,e.output);return}if(b()==="quiet"){if(e.success){o&&c.runNodes.push(o);const t=C(e.name,s,e.sessionId,e.success);t&&c.runNodes.push(t),c.runDuration+=typeof e.durationMs=="number"?e.durationMs:0}else{const t=L(e.output);t&&N(o,r("div","detail","↳ "+t))}return}e.success&&C(e.name,s,e.sessionId,e.success),R(o,e.output)}export function onTurnEnd(e){m.busy=!1;const n=a(e.sessionId);O(n),M(),E(),K(),c.toolNodes.forEach(i=>{i&&i.line&&n&&i.line.parentNode===n&&i.line.classList.remove("running")});const o=k.tabs.find(i=>i.id===e.sessionId);if(o&&(o.planCard=null),!n){resetTurnText();return}if(e.success===!1)e.interrupted?(h(n,r("div","warnline","⚠ "+d("web.turn.stopped"))),g(d("web.turn.stopped"))):(h(n,r("div","errline","✗ "+d("web.turn.failed"))),g(d("web.turn.failed")));else{const i=[];typeof e.toolCalls=="number"&&e.toolCalls>0&&i.push(d("web.turn.tools",{count:e.toolCalls})),typeof e.durationMs=="number"&&i.push(S(e.durationMs)),i.length&&h(n,r("div","metric","⟡ "+i.join(" · "))),g(d("web.turn.end",{count:e.toolCalls||0}))}const s=c.turnRoots.map(i=>i.innerText||i.textContent||"").join(`
3
3
 
4
- `);D(n,s,c.turnMd),resetTurnText()}export function resetTurnText(){c.turnMd="",c.turnRoots=[]}export function onErrorEvent(e){if(!e||!e.error)return;const n=a(e.sessionId);n&&h(n,r("div","errline","✗ "+e.error)),g(String(e.error))}export function onCommandOutput(e,n){const o=a(n)||O();o&&(N(o),String(e).split(`
5
- `).forEach(s=>h(o,r("div","cmdout",s))))}export function onLog(e){if(!e||typeof e.text!="string"||!e.text||e.diagnostic&&b()!=="verbose")return;const n=a(e.sessionId)||O();if(!n)return;const o=e.level,s=o==="error"?"errline":o==="warn"?"warnline":"detail",i=o==="error"?"✗ ":o==="warn"?"⚠ ":"↳ ",t=r("div",s);t.textContent=i+e.text,h(n,t),(o==="error"||o==="warn")&&g(e.text)}
4
+ `);$(n,s,c.turnMd),resetTurnText()}export function resetTurnText(){c.turnMd="",c.turnRoots=[]}export function onErrorEvent(e){if(!e||!e.error)return;const n=a(e.sessionId);n&&h(n,r("div","errline","✗ "+e.error)),g(String(e.error))}export function onCommandOutput(e,n){const o=a(n)||A;T(o),String(e).split(`
5
+ `).forEach(s=>h(o,r("div","cmdout",s))),z()}export function onLog(e){if(!e||typeof e.text!="string"||!e.text||e.diagnostic&&b()!=="verbose")return;const n=a(e.sessionId)||j();if(!n)return;const o=e.level,s=o==="error"?"errline":o==="warn"?"warnline":"detail",i=o==="error"?"✗ ":o==="warn"?"⚠ ":"↳ ",t=r("div",s);t.textContent=i+e.text,h(n,t),(o==="error"||o==="warn")&&g(e.text)}
@@ -0,0 +1 @@
1
+ export function renderFooter(t,r,o){const{workspace:i="",version:n="",moeActive:s=!1,dirLabel:a}=r,d=`${i} ${n} ${s}`;if(t.dataset.key!==d){if(t.dataset.key=d,t.textContent="",t.hidden=!i&&!n&&!s,i){t.appendChild(o("ws-k",a));const e=o("ws-v",i);e.title=i,t.appendChild(e)}if(s){const e=o("ws-moe","MoE");e.title="MoE is orchestrating this turn",t.appendChild(e)}if(n){const e=o("ws-ver",`mma ${n}`);e.title=`micro-models-agent ${n}`,t.appendChild(e)}}}
@@ -0,0 +1 @@
1
+ const y={idle:"c-dim track poke blink",think:"c-active st-think blink",read:"c-recon st-read",find:"c-recon st-find squint",web:"c-recon st-web squint",edit:"c-mutate st-edit narrow",type:"c-active st-type narrow",create:"c-mutate st-create",run:"c-exec st-run",tests:"c-exec st-tests",compact:"c-active st-compact",plan:"c-active st-plan",ask:"c-warn st-ask wide",done:"c-ok st-done happy celebrate",error:"c-err st-error sad",stop:"c-dim st-stop sleep",queued:"c-dim st-queued blink",boot:"c-dim st-boot",load:"c-dim st-load"},k={read_file:"read",list_dir:"read",file_info:"read",grep:"find",glob:"find",project_map:"find",chunk_query:"find",history:"find",recall:"find",web_search:"web",web_fetch:"web",download_file:"web",write_file:"create",create_dir:"create",edit_file:"edit",move_file:"edit",delete_file:"edit",attach_image:"edit",bash:"run",pipeline_run:"run",process_wait:"run",process_kill:"run",browser:"run",subagent:"run",mcp_call:"run",plan:"plan",todo:"plan",verify:"plan",lsp_check:"plan"};export function toolState(e){return k[e]||"run"}export function loaderStateFor(e){switch(e.type){case"turn_end":return e.success===!1?"error":"done";case"error":return"error";case"question":return"ask";case"text":return"type";case"tool_start":case"tool_end":return toolState(e.name||"");default:return"think"}}function r(e,n,t){const s=document.createElement(e);return n&&(s.className=n),t!=null&&(s.textContent=t),s}export function createFace(e="think",n=null){const t=r("span");t.setAttribute("aria-hidden","true"),t.dataset.size=n||"";const s=r("span","eyes");s.appendChild(r("i","eye left")),s.appendChild(r("i","eye right"));const c=r("span","orb");c.appendChild(r("i"));const a=r("span","keys");for(let o=0;o<4;o++)a.appendChild(r("i"));const i=r("span","dust");for(let o=0;o<3;o++)i.appendChild(r("i"));return t.append(s,c,a,r("span","grow"),r("span","fly"),i,r("span","q","?"),r("span","spark","✦"),r("span","star")),setFaceState(t,e),t}export function setFaceState(e,n){if(!e)return;const t=e.dataset.size||"";e.className="mdl"+(t?" "+t:"")+" "+y[n],e.dataset.state=n,y[n].includes("track")||(e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg"))}function p(e){return Array.from(document.querySelectorAll(e))}function w(e,n){for(const t of p(".mdl.track")){const s=t.getBoundingClientRect(),c=s.left+s.width/2,a=s.top+s.height/2,i=e-c,o=n-a,d=Math.hypot(i,o)||1,u=s.width*.16,l=Math.min(1,d/140),f=i/d,h=o/d;t.style.setProperty("--ex",(f*u*l).toFixed(1)+"px"),t.style.setProperty("--ey",(h*u*l).toFixed(1)+"px"),t.style.setProperty("--tilt",(f*6*l).toFixed(2)+"deg")}}function x(){for(const e of p(".mdl.track"))e.style.setProperty("--ex","0px"),e.style.setProperty("--ey","0px"),e.style.setProperty("--tilt","0deg")}let m=!1;export function initCursor(){if(m||typeof window>"u")return;m=!0,window.addEventListener("mousemove",n=>w(n.clientX,n.clientY)),window.addEventListener("mouseleave",x);let e=null;window.addEventListener("click",()=>{const n=p(".mdl.poke");if(n.length){for(const t of n)t.classList.remove("blink-once"),t.offsetWidth,t.classList.add("blink-once");e!==null&&window.clearTimeout(e),e=window.setTimeout(()=>{for(const t of n)t.classList.remove("blink-once");e=null},130)}})}
@@ -0,0 +1,5 @@
1
+ const u=/^\s*(```|~~~)/,n=/^(#{1,6})([^\s#].*)$/,c=/^(\s*)(\d+)\)(\s+)(.*)$/,d=/^\s*\|?\s*:?-{1,}:?(\s*\|\s*:?-{1,}:?)+\s*\|?\s*$/,o=/^(?!\s*[-*+]\s)(?!\s*\d+[.)]\s)(?!\s*>)(?!\s*(```|~~~)).*\|.*$/;function f(e){for(let t=0;t<e.length;t++)if(e[t]==="|"&&e[t-1]!=="\\")return!0;return!1}function h(e){let t=e.trim();return t.startsWith("|")||(t="| "+t),t.endsWith("|")||(t=t+" |"),t}function l(e){return f(e)&&d.test(e)}export class MdNormalizer{buf="";held=null;tableActive=!1;fence=!1;push(t){this.buf+=t==null?"":String(t);let i="",s=this.buf.indexOf(`
2
+ `);for(;s!==-1;){const r=this.buf.slice(0,s);this.buf=this.buf.slice(s+1),this.held!==null&&(i+=this.decide(this.held,r)+`
3
+ `),this.held=r,s=this.buf.indexOf(`
4
+ `)}return i}flush(){let t="";return this.held!==null&&(t+=this.decide(this.held,null)+`
5
+ `,this.held=null),this.buf&&(t+=this.decideInline(this.buf),this.buf=""),t}decide(t,i){if(this.fence)return u.test(t)&&(this.fence=!1),t;if(u.test(t))return this.fence=!0,t;if(l(t))return this.tableActive=!0,h(t);const s=o.test(t)&&f(t),r=i!==null&&i.trim()!==""&&l(i);return s&&(r||this.tableActive)?(this.tableActive=!0,h(t)):((t.trim()===""||!s)&&(this.tableActive=!1),this.decideInline(t))}decideInline(t){return n.test(t)?t.replace(n,"$1 $2"):t.replace(c,"$1$2.$3$4")}}export function normalizeMarkdown(e){const t=new MdNormalizer;return t.push(e)+t.flush()}
@@ -1 +1 @@
1
- import{inp as i,imgPicker as g,attachStrip as B,attachErr as k,sendBtn as p,el as f,icon as _}from"../dom.js";import{api as S}from"../api.js";import{t as c}from"../i18n.js";import{tabs as o,session as m,settings as y,MAX_IMAGES as C,MAX_IMAGE_BYTES as z}from"../store.js";import{contextLabel as W}from"../format.js";import{clearEmpty as N,activeFeed as Y,liveFeed as j,appendTo as v,scrollToBottom as P,clearFeed as J,finishMd as Q,resetTurnText as V,finishThink as Z,showBusy as $}from"../feed.js";import{setBusy as ee}from"../rail.js";import"../core/menus.js";import{openSessionsMenu as te}from"./sessions-menu.js";import{closeCmdk as F,updateCmdk as ne,cmdkKeydown as se,initCmdk as ae}from"./cmdk.js";let r={activeTab:()=>null,setTabStatus:()=>{},newChatTab:async()=>{},markTabDead:()=>{},openTab:()=>{},closeTab:()=>{},statusTitle:()=>""};export function initComposer(e){r={...r,...e}}ae({autogrow:T});const ie=200;function T(){i&&(i.style.height="auto",i.style.height=Math.min(i.scrollHeight,ie)+"px")}function oe(e){k&&(k.textContent=e,k.hidden=!1,clearTimeout(o.attachErrTimer),o.attachErrTimer=setTimeout(()=>{k.hidden=!0},4e3))}export function renderAttachments(){if(!B)return;B.textContent="",B.hidden=o.attachments.length===0,o.attachments.forEach((t,n)=>{const s=f("div","thumb"),a=document.createElement("img");a.alt="",a.src=t,s.appendChild(a);const d=f("button","rm");d.type="button",d.title=c("web.attach.remove"),d.setAttribute("aria-label",c("web.attach.remove")),d.appendChild(_("x")),d.addEventListener("click",()=>{o.attachments.splice(n,1),renderAttachments()}),s.appendChild(d),B.appendChild(s)});const e=r.activeTab();e&&(e.attachments=o.attachments.slice())}function re(e){return new Promise((t,n)=>{const s=new FileReader;s.onload=()=>t(String(s.result)),s.onerror=()=>n(s.error||new Error("read failed")),s.readAsDataURL(e)})}async function x(e){let t="";for(const n of e){if(!n||typeof n.type!="string"||n.type.indexOf("image/")!==0){t=c("web.attach.only_images");continue}if(o.attachments.length>=C){t=c("web.attach.too_many",{max:C});break}if(n.size>z){t=c("web.attach.too_large");continue}try{const s=await re(n);if(s.indexOf("data:image/")!==0){t=c("web.attach.invalid");continue}if(o.attachments.length>=C){t=c("web.attach.too_many",{max:C});break}o.attachments.push(s)}catch{t=c("web.attach.read_failed")}}renderAttachments(),t&&oe(t)}function ce(e,t){const n=f("div","u",e);return(t||[]).forEach(s=>{const a=document.createElement("img");a.className="uimg",a.alt="",a.src=s,n.appendChild(a)}),n}export function saveComposer(){const e=r.activeTab();!e||!i||(e.draft=i.value,e.attachments=o.attachments.slice())}export function restoreComposer(e){!e||!i||(i.value=e.draft||"",o.attachments=(e.attachments||[]).slice(),renderAttachments(),T(),F())}const de=document.getElementById("sessBar"),I=document.getElementById("sessNameBtn"),le=document.getElementById("sessName"),L=document.getElementById("sessPrev"),A=document.getElementById("sessNext"),D=document.getElementById("sessClose"),O=document.getElementById("sessTools"),q=document.getElementById("sessDD"),w=document.querySelector(".bar-top"),E=document.getElementById("newChat"),M=document.createComment("top-tools");w&&E&&w.insertBefore(M,E);function X(e){if(o.tabs.length<2)return;const t=o.tabs.findIndex(a=>a.id===o.activeTabId),n=t===-1?0:(t+e+o.tabs.length)%o.tabs.length,s=o.tabs[n];s&&r.openTab(s.id,s.name,s.kind,!0)}export function renderSessBar(){if(!de)return;const e=o.tabs.find(s=>s.id===o.activeTabId),t=e?e.name||String(e.id):"—";le.textContent=t,I.title=t+(e&&e.status&&e.status!=="idle"?" · "+r.statusTitle(e.status):"");const n=o.tabs.length>0;L.disabled=o.tabs.length<2,A.disabled=o.tabs.length<2,D.disabled=!n,I.disabled=!n}function U(){!w||!O||!E||!q||(window.matchMedia("(max-width: 760px)").matches?O.append(E,q):(w.insertBefore(E,M),w.insertBefore(q,M)))}if(L&&L.addEventListener("click",()=>X(-1)),A&&A.addEventListener("click",()=>X(1)),D&&D.addEventListener("click",()=>{o.activeTabId&&r.closeTab(o.activeTabId)}),I&&I.addEventListener("click",e=>{e.stopPropagation(),te()}),typeof window.matchMedia=="function"){const e=window.matchMedia("(max-width: 760px)");typeof e.addEventListener=="function"&&e.addEventListener("change",U),U()}g&&g.addEventListener("change",()=>{x(Array.from(g.files||[])),g.value=""});const G=document.getElementById("attachBtn");G&&g&&G.addEventListener("click",()=>g.click()),i.addEventListener("paste",e=>{const t=e.clipboardData&&e.clipboardData.items;if(!t)return;const n=[];for(const s of t)if(s.kind==="file"&&s.type&&s.type.indexOf("image/")===0){const a=s.getAsFile();a&&n.push(a)}n.length&&(e.preventDefault(),x(n))});const h=document.querySelector(".input-area");h&&(["dragenter","dragover"].forEach(e=>{h.addEventListener(e,t=>{t.preventDefault(),h.classList.add("dragover")})}),h.addEventListener("dragleave",e=>{const t=e;t.relatedTarget&&h.contains(t.relatedTarget)||h.classList.remove("dragover")}),h.addEventListener("drop",e=>{e.preventDefault(),h.classList.remove("dragover");const t=e.dataTransfer;t&&t.files&&t.files.length&&x(Array.from(t.files))}));function H(){i.value="",T(),F()}export function insertIntoDraft(e){if(!i||!e)return;const t=i.selectionStart??i.value.length,n=i.selectionEnd??t;i.value=i.value.slice(0,t)+e+i.value.slice(n);const s=t+e.length;i.selectionStart=i.selectionEnd=s;const a=r.activeTab();a&&(a.draft=i.value),T(),i.focus()}i&&i.addEventListener("input",()=>{const e=r.activeTab();e&&(e.draft=i.value),T(),ne()});async function K(){const e=i.value.trim(),t=o.attachments.slice();if(!e&&!t.length)return;const n=r.activeTab(),s=n&&n.kind==="session"?n.id:null,a=j()||Y();if(n&&n.dead){N(a),r.markTabDead(n.id);return}if(N(a),Q(),V(),Z(),e.startsWith("/")){v(a,f("div","u",e)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H();const u=e.slice(1).split(/\s+/)[0].toLowerCase();if(u==="clear"){J(a);return}if(u==="new"){r.newChatTab();return}const b={line:e};s&&(b.sessionId=s),(await S("/api/command",{method:"POST",body:b})).ok||v(a,f("div","detail","↳ "+c("web.misc.command_unavailable")));return}if(a&&a.querySelector(".startbanner")===null&&a.querySelector(".u")===null){const u=f("div","startbanner");u.appendChild(document.createTextNode(c("web.start.label")+" ")),u.appendChild(f("b","",y.config&&y.config.model||m.host.model||"—"));const b=m.host.sessionId?" · "+c("web.start.session")+" "+String(m.host.sessionId):"";u.appendChild(document.createTextNode(" · "+(m.host.provider||y.config&&y.config.provider&&y.config.provider.active||"—")+" · "+W()+b)),a.insertBefore(u,a.firstChild)}v(a,ce(e,t)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H(),s&&r.setTabStatus(s,"working");const d={text:e};t.length&&(d.images=t),s&&(d.sessionId=s);const l=await S("/api/message",{method:"POST",body:d});if(l.ok)if(l.data&&l.data.noop)l.data.notice&&v(a,f("div","detail",String(l.data.notice)));else if(l.data&&l.data.queued){const u=l.data.queuedForSession||l.data.queued;v(a,f("div","detail","↳ "+c("web.input.queued",{n:u}))),s&&r.setTabStatus(s,"queued")}else window.setTimeout(()=>$(a),180);else{const u=l.data&&l.data.error||l.status,b=u==="queue_full"?c("web.input.queue_full"):u;v(a,f("div","warnline","⚠ "+b)),s&&r.setTabStatus(s,"failed")}}async function R(){const e=r.activeTab(),t=e&&e.kind==="session"?e.id:null,n=m.runningSessionIds||[];t&&!n.includes(t)||!t&&!m.busy||await S("/api/interrupt",{method:"POST",body:t?{sessionId:t}:{}})}i.addEventListener("keydown",e=>{e.isComposing||e.keyCode===229||se(e)||(e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),K()):e.key==="Escape"&&(e.preventDefault(),R()))}),p&&p.addEventListener("click",()=>{const e=r.activeTab();e&&e.kind==="session"&&m.runningSessionIds.includes(e.id)?R():K()});export function reflectBusy(){const e=r.activeTab(),t=m.runningSessionIds||[],n=!!(e&&e.kind==="session"&&t.includes(e.id));i&&i.setAttribute("aria-busy",n?"true":"false");const s=document.querySelector(".input-area");if(s&&s.classList.toggle("busy",n),p){const d=n?c("web.input.stop"):c("web.input.send");p.textContent="",p.appendChild(_(n?"square":"arrow-up")),p.classList.toggle("busy",n),p.title=d,p.setAttribute("aria-label",d)}const a=document.getElementById("hintEsc");a&&(a.hidden=!n),ee(m.busy)}
1
+ import{inp as i,imgPicker as g,attachStrip as B,attachErr as k,sendBtn as p,el as f,icon as _}from"../dom.js";import{api as S}from"../api.js";import{t as c}from"../i18n.js";import{tabs as o,session as m,settings as T,MAX_IMAGES as C,MAX_IMAGE_BYTES as W}from"../store.js";import{contextLabel as z}from"../format.js";import{clearEmpty as N,activeFeed as Y,liveFeed as j,appendTo as v,scrollToBottom as P,clearFeed as J,finishMd as Q,resetTurnText as V,finishThink as Z,showBusy as $}from"../feed.js";import{setBusy as tt}from"../rail.js";import"../core/menus.js";import{openSessionsMenu as et}from"./sessions-menu.js";import{closeCmdk as F,updateCmdk as nt,cmdkKeydown as at,initCmdk as st}from"./cmdk.js";let r={activeTab:()=>null,setTabStatus:()=>{},newChatTab:async()=>{},markTabDead:()=>{},openTab:()=>{},closeTab:()=>{},statusTitle:()=>""};export function initComposer(t){r={...r,...t}}st({autogrow:w});const it=200;function w(){i&&(i.style.height="auto",i.style.height=Math.min(i.scrollHeight,it)+"px")}function ot(t){k&&(k.textContent=t,k.hidden=!1,clearTimeout(o.attachErrTimer),o.attachErrTimer=setTimeout(()=>{k.hidden=!0},4e3))}export function renderAttachments(){if(!B)return;B.textContent="",B.hidden=o.attachments.length===0,o.attachments.forEach((e,n)=>{const a=f("div","thumb"),s=document.createElement("img");s.alt="",s.src=e,a.appendChild(s);const d=f("button","rm");d.type="button",d.title=c("web.attach.remove"),d.setAttribute("aria-label",c("web.attach.remove")),d.appendChild(_("x")),d.addEventListener("click",()=>{o.attachments.splice(n,1),renderAttachments()}),a.appendChild(d),B.appendChild(a)});const t=r.activeTab();t&&(t.attachments=o.attachments.slice())}function rt(t){return new Promise((e,n)=>{const a=new FileReader;a.onload=()=>e(String(a.result)),a.onerror=()=>n(a.error||new Error("read failed")),a.readAsDataURL(t)})}async function x(t){let e="";for(const n of t){if(!n||typeof n.type!="string"||n.type.indexOf("image/")!==0){e=c("web.attach.only_images");continue}if(o.attachments.length>=C){e=c("web.attach.too_many",{max:C});break}if(n.size>W){e=c("web.attach.too_large");continue}try{const a=await rt(n);if(a.indexOf("data:image/")!==0){e=c("web.attach.invalid");continue}if(o.attachments.length>=C){e=c("web.attach.too_many",{max:C});break}o.attachments.push(a)}catch{e=c("web.attach.read_failed")}}renderAttachments(),e&&ot(e)}function ct(t,e){const n=f("div","u",t);return(e||[]).forEach(a=>{const s=document.createElement("img");s.className="uimg",s.alt="",s.src=a,n.appendChild(s)}),n}export function saveComposer(){const t=r.activeTab();!t||!i||(t.draft=i.value,t.attachments=o.attachments.slice())}export function restoreComposer(t){!t||!i||(i.value=t.draft||"",o.attachments=(t.attachments||[]).slice(),renderAttachments(),w(),F())}const dt=document.getElementById("sessBar"),I=document.getElementById("sessNameBtn"),lt=document.getElementById("sessName"),L=document.getElementById("sessPrev"),A=document.getElementById("sessNext"),D=document.getElementById("sessClose"),O=document.getElementById("sessTools"),q=document.getElementById("sessDD"),y=document.querySelector(".bar-top"),E=document.getElementById("newChat"),M=document.createComment("top-tools");y&&E&&y.insertBefore(M,E);function X(t){if(o.tabs.length<2)return;const e=o.tabs.findIndex(s=>s.id===o.activeTabId),n=e===-1?0:(e+t+o.tabs.length)%o.tabs.length,a=o.tabs[n];a&&r.openTab(a.id,a.name,a.kind,!0)}export function renderSessBar(){if(!dt)return;const t=o.tabs.find(a=>a.id===o.activeTabId),e=t?t.name||String(t.id):"—";lt.textContent=e,I.title=e+(t&&t.status&&t.status!=="idle"?" · "+r.statusTitle(t.status):"");const n=o.tabs.length>0;L.disabled=o.tabs.length<2,A.disabled=o.tabs.length<2,D.disabled=!n,I.disabled=!n}function U(){!y||!O||!E||!q||(window.matchMedia("(max-width: 760px)").matches?O.append(E,q):(y.insertBefore(E,M),y.insertBefore(q,M)))}if(L&&L.addEventListener("click",()=>X(-1)),A&&A.addEventListener("click",()=>X(1)),D&&D.addEventListener("click",()=>{o.activeTabId&&r.closeTab(o.activeTabId)}),I&&I.addEventListener("click",t=>{t.stopPropagation(),et()}),typeof window.matchMedia=="function"){const t=window.matchMedia("(max-width: 760px)");typeof t.addEventListener=="function"&&t.addEventListener("change",U),U()}g&&g.addEventListener("change",()=>{x(Array.from(g.files||[])),g.value=""});const G=document.getElementById("attachBtn");G&&g&&G.addEventListener("click",()=>g.click()),i.addEventListener("paste",t=>{const e=t.clipboardData&&t.clipboardData.items;if(!e)return;const n=[];for(const a of e)if(a.kind==="file"&&a.type&&a.type.indexOf("image/")===0){const s=a.getAsFile();s&&n.push(s)}n.length&&(t.preventDefault(),x(n))});const h=document.querySelector(".input-area");h&&(["dragenter","dragover"].forEach(t=>{h.addEventListener(t,e=>{e.preventDefault(),h.classList.add("dragover")})}),h.addEventListener("dragleave",t=>{const e=t;e.relatedTarget&&h.contains(e.relatedTarget)||h.classList.remove("dragover")}),h.addEventListener("drop",t=>{t.preventDefault(),h.classList.remove("dragover");const e=t.dataTransfer;e&&e.files&&e.files.length&&x(Array.from(e.files))}));function H(){i.value="",w(),F()}export function insertIntoDraft(t){if(!i||!t)return;const e=i.selectionStart??i.value.length,n=i.selectionEnd??e;i.value=i.value.slice(0,e)+t+i.value.slice(n);const a=e+t.length;i.selectionStart=i.selectionEnd=a;const s=r.activeTab();s&&(s.draft=i.value),w(),i.focus()}i&&i.addEventListener("input",()=>{const t=r.activeTab();t&&(t.draft=i.value),w(),nt()});async function K(){const t=i.value.trim(),e=o.attachments.slice();if(!t&&!e.length)return;!r.activeTab()&&!t.startsWith("/")&&await r.newChatTab();const n=r.activeTab(),a=n&&n.kind==="session"?n.id:null,s=j()||Y();if(n&&n.dead){N(s),r.markTabDead(n.id);return}if(N(s),Q(),V(),Z(),t.startsWith("/")){v(s,f("div","u",t)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H();const u=t.slice(1).split(/\s+/)[0].toLowerCase();if(u==="clear"){J(s);return}if(u==="new"){r.newChatTab();return}const b={line:t};a&&(b.sessionId=a),(await S("/api/command",{method:"POST",body:b})).ok||v(s,f("div","detail","↳ "+c("web.misc.command_unavailable")));return}if(s&&s.querySelector(".startbanner")===null&&s.querySelector(".u")===null){const u=f("div","startbanner");u.appendChild(document.createTextNode(c("web.start.label")+" ")),u.appendChild(f("b","",T.config&&T.config.model||m.host.model||"—"));const b=m.host.sessionId?" · "+c("web.start.session")+" "+String(m.host.sessionId):"";u.appendChild(document.createTextNode(" · "+(m.host.provider||T.config&&T.config.provider&&T.config.provider.active||"—")+" · "+z()+b)),s.insertBefore(u,s.firstChild)}v(s,ct(t,e)),P(),n&&(n.draft="",n.attachments=[]),o.attachments=[],renderAttachments(),H(),a&&r.setTabStatus(a,"working");const d={text:t};e.length&&(d.images=e),a&&(d.sessionId=a);const l=await S("/api/message",{method:"POST",body:d});if(l.ok)if(l.data&&l.data.noop)l.data.notice&&v(s,f("div","detail",String(l.data.notice)));else if(l.data&&l.data.queued){const u=l.data.queuedForSession||l.data.queued;v(s,f("div","detail","↳ "+c("web.input.queued",{n:u}))),a&&r.setTabStatus(a,"queued")}else window.setTimeout(()=>$(s),180);else{const u=l.data&&l.data.error||l.status,b=u==="queue_full"?c("web.input.queue_full"):u;v(s,f("div","warnline","⚠ "+b)),a&&r.setTabStatus(a,"failed")}}async function R(){const t=r.activeTab(),e=t&&t.kind==="session"?t.id:null,n=m.runningSessionIds||[];e&&!n.includes(e)||!e&&!m.busy||await S("/api/interrupt",{method:"POST",body:e?{sessionId:e}:{}})}i.addEventListener("keydown",t=>{t.isComposing||t.keyCode===229||at(t)||(t.key==="Enter"&&!t.shiftKey?(t.preventDefault(),K()):t.key==="Escape"&&(t.preventDefault(),R()))}),p&&p.addEventListener("click",()=>{const t=r.activeTab();t&&t.kind==="session"&&m.runningSessionIds.includes(t.id)?R():K()});export function reflectBusy(){const t=r.activeTab(),e=m.runningSessionIds||[],n=!!(t&&t.kind==="session"&&e.includes(t.id));i&&i.setAttribute("aria-busy",n?"true":"false");const a=document.querySelector(".input-area");if(a&&a.classList.toggle("busy",n),p){const d=n?c("web.input.stop"):c("web.input.send");p.textContent="",p.appendChild(_(n?"square":"arrow-up")),p.classList.toggle("busy",n),p.title=d,p.setAttribute("aria-label",d)}const s=document.getElementById("hintEsc");s&&(s.hidden=!n),tt(m.busy)}
@@ -1 +1 @@
1
- import{msgs as k,inp as S,tabstripEl as l,el as u,icon as I,link as E}from"../dom.js";import{api as m}from"../api.js";import{t as o}from"../i18n.js";import{tabs as a,session as b,hooks as A}from"../store.js";import{makeFeed as q,showEmptyFeed as D,activeFeed as F,appendTo as x,feedHasContent as B,loadHistory as O,syncUrl as h,scrollToBottom as w}from"../feed.js";import{setIndicator as M}from"../dialog.js";import{sidebarSessionChanged as P,setSessionLoading as v}from"../sidebar.js";import{setSessOpen as H}from"../core/menus.js";import{closeCmdk as W}from"./cmdk.js";import{saveComposer as C,restoreComposer as L,renderAttachments as Y,renderSessBar as _,initComposer as N}from"./composer.js";import{renderSessionsDropdown as p,initSessionsMenu as U}from"./sessions-menu.js";export{reflectBusy}from"./composer.js";export{loadCommands}from"./cmdk.js";export{renderSessionsDropdown}from"./sessions-menu.js";const V={working:"●",waiting:"◉",queued:"○",failed:"✗",dead:"✗"};function T(e){return e==="working"?o("web.tab.working"):e==="waiting"?o("web.tab.waiting"):e==="queued"?o("web.tab.queued"):e==="failed"?o("web.tab.failed"):e==="dead"?o("web.tab.gone"):""}export function activeTab(){return a.tabs.find(e=>e.id===a.activeTabId)||null}export function setTabStatus(e,t){if(!e)return;const i=a.tabs.find(n=>n.id===e);!i||i.status===t||i.dead||(i.status=t,c())}export function markTabDead(e){const t=a.tabs.find(s=>s.id===e);if(!t||t.dead)return;t.dead=!0,t.status="dead",t.historyLoaded=!0,t.historyFailed=!1,t.planCard=null,v(!1),t.feed.replaceChildren();const i=u("div","warnline","✗ "+o("web.session.gone"));x(t.feed,i);const n=E(o("web.topbar.close"),"",()=>closeTab(e));x(t.feed,n),t.feed===F()&&w(),c()}function c(){l.textContent="",a.tabs.forEach(e=>{const t=e.id===a.activeTabId,i=e.name||e.id,n=e.kind==="session"?String(e.id):i,s=u("div","stab"+(t?" on":""));if(s.setAttribute("role","tab"),s.setAttribute("tabindex",t?"0":"-1"),s.setAttribute("aria-selected",t?"true":"false"),s.setAttribute("aria-label",i),s.title=n,e.status&&e.status!=="idle"){const d=u("span","dot st-"+e.status,V[e.status]||"●");d.title=T(e.status),d.setAttribute("aria-label",T(e.status)),s.appendChild(d)}const r=u("span","name",i);r.title=n,s.appendChild(r);const f=u("button","stab-x");f.type="button",f.title=o("web.topbar.close"),f.setAttribute("aria-label",o("web.topbar.close")+": "+i),f.appendChild(I("x")),f.addEventListener("click",d=>{d.stopPropagation(),closeTab(e.id)}),s.appendChild(f);const g=()=>openTab(e.id,e.name,e.kind,!0);s.addEventListener("click",g),s.addEventListener("keydown",d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),g())}),l.appendChild(s)}),j(),_()}function j(){const e=l.querySelector(".stab.on");if(!e)return;const t=Math.max(0,e.offsetLeft-4);(t<l.scrollLeft||t+e.offsetWidth>l.scrollLeft+l.clientWidth)&&(l.scrollLeft=t)}l.addEventListener("wheel",e=>{e.deltaY!==0&&(e.preventDefault(),l.scrollLeft+=e.deltaY)},{passive:!1});export function updateTabName(e,t){if(!e||!t)return;const i=a.tabs.find(s=>s.id===e);i&&i.name!==t&&(i.name=t,c());const n=b.sessions.find(s=>s.id===e);n&&n.name!==t&&(n.name=t,p())}export function openTab(e,t,i,n){C();let s=a.tabs.find(r=>r.id===e);if(s?t&&(s.name=t):(s={id:e,name:t||e,kind:i||"session",feed:q(),historyLoaded:!1,historyLoading:!1,historyFailed:!1,dead:!1,planCard:null,draft:"",attachments:[],status:"idle"},a.tabs.push(s)),a.activeTabId=e,a.liveTabId=e,(i||"session")==="session"&&(b.activeSessionId=e,P(e),A.ensureTabState?.(e)),k.replaceChildren(s.feed),L(s),c(),p(),w(),s.kind==="session"&&!n&&(s.historyLoaded=!0),n&&s.kind==="session"){if(s.dead){h();return}(!B(s.feed)||s.historyFailed)&&(s.historyLoaded=!1),v(!0),m("/api/sessions/activate",{method:"POST",body:{id:e}}).then(r=>{if(r.status===404){markTabDead(e),loadSessions();return}loadSessions()}),O(s).then(r=>{r&&r.gone&&markTabDead(s.id)})}h()}export function closeTab(e){const t=a.tabs.findIndex(n=>n.id===e);if(t===-1)return;const i=a.activeTabId===e;if(i&&C(),a.tabs=a.tabs.filter(n=>n.id!==e),i){const n=a.tabs[Math.min(t,a.tabs.length-1)];n?(a.activeTabId=n.id,a.liveTabId=n.id,k.replaceChildren(n.feed),L(n),w()):(a.activeTabId=null,a.liveTabId=null,S&&(S.value=""),a.attachments=[],Y(),D())}c(),p(),h()}async function y(){const e=await m("/api/sessions",{method:"POST",body:{}});if(e.ok&&e.data&&e.data.session&&e.data.session.id){const t=e.data.session;openTab(t.id,t.name||String(t.id),"session",!1),await loadSessions(),v(!0);return}a.newSeq++,openTab("new"+a.newSeq,o("web.empty.title"),"new",!1),M(o("web.sessions.create_failed"),!0)}document.getElementById("newChat")?.addEventListener("click",()=>{y()});export function reconcileTabStatuses(){const e=b.runningSessionIds||[],t=b.queued||{};let i=!1;a.tabs.forEach(n=>{if(n.kind!=="session"||n.status==="waiting"||n.status==="failed"||n.status==="dead")return;const s=e.includes(n.id)?"working":t[n.id]>0?"queued":"idle";n.status!==s&&(n.status=s,i=!0)}),i&&c()}export async function loadSessions(){const e=await m("/api/sessions");!e.ok||!e.data||(b.sessions=Array.isArray(e.data.sessions)?e.data.sessions:[],p())}document.addEventListener("click",()=>{document.querySelectorAll("[data-sel]").forEach(e=>e.classList.remove("open")),H(!1),W()}),N({activeTab,setTabStatus,newChatTab:y,markTabDead,openTab,closeTab,statusTitle:T}),U({openTab,closeTab,loadSessions,newChatTab:y});
1
+ import{msgs as k,inp as x,tabstripEl as l,el as b,icon as A,link as q}from"../dom.js";import{api as p}from"../api.js";import{t as o}from"../i18n.js";import{tabs as i,session as f,hooks as h}from"../store.js";import{makeFeed as D,showEmptyFeed as F,activeFeed as O,appendTo as C,feedHasContent as B,loadHistory as P,syncUrl as v,scrollToBottom as w}from"../feed.js";import{setIndicator as M}from"../dialog.js";import{sidebarSessionChanged as L,setSessionLoading as T}from"../sidebar.js";import{setSessOpen as H}from"../core/menus.js";import{closeCmdk as W}from"./cmdk.js";import{saveComposer as I,restoreComposer as E,renderAttachments as Y,renderSessBar as _,initComposer as N}from"./composer.js";import{renderSessionsDropdown as m,initSessionsMenu as U}from"./sessions-menu.js";export{reflectBusy}from"./composer.js";export{loadCommands}from"./cmdk.js";export{renderSessionsDropdown}from"./sessions-menu.js";const V={working:"●",waiting:"◉",queued:"○",failed:"✗",dead:"✗"};function y(e){return e==="working"?o("web.tab.working"):e==="waiting"?o("web.tab.waiting"):e==="queued"?o("web.tab.queued"):e==="failed"?o("web.tab.failed"):e==="dead"?o("web.tab.gone"):""}export function activeTab(){return i.tabs.find(e=>e.id===i.activeTabId)||null}export function setTabStatus(e,t){if(!e)return;const a=i.tabs.find(s=>s.id===e);!a||a.status===t||a.dead||(a.status=t,u())}export function markTabDead(e){const t=i.tabs.find(n=>n.id===e);if(!t||t.dead)return;t.dead=!0,t.status="dead",t.historyLoaded=!0,t.historyFailed=!1,t.planCard=null,T(!1),t.feed.replaceChildren();const a=b("div","warnline","✗ "+o("web.session.gone"));C(t.feed,a);const s=q(o("web.topbar.close"),"",()=>closeTab(e));C(t.feed,s),t.feed===O()&&w(),u()}function u(){l.textContent="",i.tabs.forEach(e=>{const t=e.id===i.activeTabId,a=e.name||e.id,s=e.kind==="session"?String(e.id):a,n=b("div","stab"+(t?" on":""));if(n.setAttribute("role","tab"),n.setAttribute("tabindex",t?"0":"-1"),n.setAttribute("aria-selected",t?"true":"false"),n.setAttribute("aria-label",a),n.title=s,e.status&&e.status!=="idle"){const d=b("span","dot st-"+e.status,V[e.status]||"●");d.title=y(e.status),d.setAttribute("aria-label",y(e.status)),n.appendChild(d)}const r=b("span","name",a);r.title=s,n.appendChild(r);const c=b("button","stab-x");c.type="button",c.title=o("web.topbar.close"),c.setAttribute("aria-label",o("web.topbar.close")+": "+a),c.appendChild(A("x")),c.addEventListener("click",d=>{d.stopPropagation(),closeTab(e.id)}),n.appendChild(c);const g=()=>openTab(e.id,e.name,e.kind,!0);n.addEventListener("click",g),n.addEventListener("keydown",d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),g())}),l.appendChild(n)}),j(),_()}function j(){const e=l.querySelector(".stab.on");if(!e)return;const t=Math.max(0,e.offsetLeft-4);(t<l.scrollLeft||t+e.offsetWidth>l.scrollLeft+l.clientWidth)&&(l.scrollLeft=t)}l.addEventListener("wheel",e=>{e.deltaY!==0&&(e.preventDefault(),l.scrollLeft+=e.deltaY)},{passive:!1});export function updateTabName(e,t){if(!e||!t)return;const a=i.tabs.find(n=>n.id===e);a&&a.name!==t&&(a.name=t,u());const s=f.sessions.find(n=>n.id===e);s&&s.name!==t&&(s.name=t,m())}export function openTab(e,t,a,s){I();let n=i.tabs.find(r=>r.id===e);if(n?t&&(n.name=t):(n={id:e,name:t||e,kind:a||"session",feed:D(),historyLoaded:!1,historyLoading:!1,historyFailed:!1,dead:!1,planCard:null,draft:"",attachments:[],status:"idle"},i.tabs.push(n)),i.activeTabId=e,i.liveTabId=e,(a||"session")==="session"&&(f.activeSessionId=e,L(e),h.ensureTabState?.(e)),k.replaceChildren(n.feed),E(n),u(),m(),w(),n.kind==="session"&&!s&&(n.historyLoaded=!0),s&&n.kind==="session"){if(n.dead){v();return}(!B(n.feed)||n.historyFailed)&&(n.historyLoaded=!1),T(!0),p("/api/sessions/activate",{method:"POST",body:{id:e}}).then(r=>{if(r.status===404){markTabDead(e),loadSessions();return}loadSessions()}),P(n).then(r=>{r&&r.gone&&markTabDead(n.id)})}v()}export function closeTab(e){const t=i.tabs.findIndex(s=>s.id===e);if(t===-1)return;const a=i.activeTabId===e;if(a&&I(),i.tabs=i.tabs.filter(s=>s.id!==e),a){const s=i.tabs[Math.min(t,i.tabs.length-1)];s?(i.activeTabId=s.id,i.liveTabId=s.id,k.replaceChildren(s.feed),E(s),s.kind==="session"&&(f.activeSessionId=s.id,L(s.id),h.ensureTabState?.(s.id),p("/api/sessions/activate",{method:"POST",body:{id:s.id}})),w()):z()}u(),m(),v()}function z(){i.activeTabId=null,i.liveTabId=null,f.activeSessionId=null,f.host={},x&&(x.value=""),i.attachments=[],Y(),h.renderActive?.(),F(),p("/api/sessions/deactivate",{method:"POST",body:{}})}async function S(){const e=await p("/api/sessions",{method:"POST",body:{}});if(e.ok&&e.data&&e.data.session&&e.data.session.id){const t=e.data.session;openTab(t.id,t.name||String(t.id),"session",!1),await loadSessions(),T(!0);return}i.newSeq++,openTab("new"+i.newSeq,o("web.empty.title"),"new",!1),M(o("web.sessions.create_failed"),!0)}document.getElementById("newChat")?.addEventListener("click",()=>{S()});export function reconcileTabStatuses(){const e=f.runningSessionIds||[],t=f.queued||{};let a=!1;i.tabs.forEach(s=>{if(s.kind!=="session"||s.status==="waiting"||s.status==="failed"||s.status==="dead")return;const n=e.includes(s.id)?"working":t[s.id]>0?"queued":"idle";s.status!==n&&(s.status=n,a=!0)}),a&&u()}export async function loadSessions(){const e=await p("/api/sessions");!e.ok||!e.data||(f.sessions=Array.isArray(e.data.sessions)?e.data.sessions:[],m())}document.addEventListener("click",()=>{document.querySelectorAll("[data-sel]").forEach(e=>e.classList.remove("open")),H(!1),W()}),N({activeTab,setTabStatus,newChatTab:S,markTabDead,openTab,closeTab,statusTitle:y}),U({openTab,closeTab,loadSessions,newChatTab:S});
@@ -1 +1 @@
1
- import{el as a,makeToggle as g}from"../dom.js";import{tagsEditor as b,checkboxEditor as p,tableEditor as w}from"./editors.js";export function validateJson(i){const e=String(i??"").trim();if(!e)return{ok:!1,error:"required"};try{return JSON.parse(e),{ok:!0}}catch(s){return{ok:!1,error:s instanceof Error?s.message:"invalid JSON"}}}function u(i,e){const s=a("input");return s.setAttribute("aria-label",i),s.value=e,s}function m(i,e,s){const l=s.optionsSource==="providers"?e.providerOptions||[]:e.modelOptions||[],t=typeof i=="string"?i:"";if(!l.length){const o=u(e.label,t);return o.addEventListener("change",()=>e.post(o.value)),o}const n=a("select");n.setAttribute("aria-label",e.label);const c=a("option","",e.emptyLabel||"—");c.value="",n.appendChild(c);const d=new Set([""]);if(l.forEach(o=>{if(d.has(o))return;d.add(o);const y=a("option","",o);y.value=o,o===t&&(y.selected=!0),n.appendChild(y)}),t&&!d.has(t)){const o=a("option","",t);o.value=t,o.selected=!0,n.appendChild(o)}return n.value=t||"",n.addEventListener("change",()=>e.post(n.value)),n}export function controlFor(i,e,s){if(i.readOnly){const t=a("span","val dim",e==null?"—":String(e));return e!=null&&(t.title=String(e)),t}if(i.valueType==="bool")return g(!!e,t=>(s.post(t),!0));if(i.valueType==="enum"){const t=a("select");return t.setAttribute("aria-label",s.label),(i.enum||[]).forEach(n=>{const c=a("option","",s.enumLabel(n));c.value=n,n===e&&(c.selected=!0),t.appendChild(c)}),t.addEventListener("change",()=>s.post(t.value)),t}if(i.valueType==="int"){const t=u(s.label,e==null?"":String(e));return t.type="number",i.min!=null&&(t.min=String(i.min)),i.max!=null&&(t.max=String(i.max)),i.step!=null&&(t.step=String(i.step)),t.addEventListener("change",()=>s.post(t.value)),t}if(i.valueType==="share"){const t=u(s.label,e==null?"":Math.round(Number(e)*100)+"%");return t.addEventListener("change",()=>s.post(t.value)),t}const r=i.editor;if(r&&r.kind==="select")return m(e,s,r);if(r&&r.kind==="tags"&&(i.valueType==="list"||i.valueType==="json"))return b(e,s,r);if(r&&r.kind==="checkboxes")return p(e,s,r);if(r&&r.kind==="table")return w(e,s,r);if(i.valueType==="list"){const t=Array.isArray(e)?e.join(", "):e==null?"":String(e),n=u(s.label,t);return n.placeholder="a, b, c",n.addEventListener("change",()=>s.post(n.value)),n}if(i.valueType==="json"){const t=a("div","jsonctl"),n=a("textarea");n.setAttribute("aria-label",s.label),n.rows=3,n.value=e==null?"":JSON.stringify(e,null,2);const c=a("div","json-err");return c.hidden=!0,n.addEventListener("input",()=>{const d=validateJson(n.value);c.hidden=d.ok,c.textContent=d.ok?"":String(d.error||"invalid JSON")}),n.addEventListener("change",()=>{validateJson(n.value).ok?s.post(n.value.trim()):n.focus()}),t.appendChild(n),t.appendChild(c),t}const l=u(s.label,e==null?"":String(e));return l.addEventListener("change",()=>s.post(l.value)),l}export const PANEL_SECTIONS={general:[{id:"general.interface",titleKey:"web.settings.sec.general.interface",keys:["locale","ui.verbosity"]},{id:"general.agent",titleKey:"web.settings.sec.general.agent",descKey:"web.settings.sec.general.agent.desc",keys:["maxToolIterations","stuckThreshold","autoPlan","execution.autoAdvance"]},{id:"general.provider",titleKey:"web.settings.sec.general.provider",keys:["provider.fallback"]}],model:[{id:"model.tuning",titleKey:"web.settings.sec.model.tuning",descKey:"web.settings.sec.model.tuning.desc",keys:["provider.maxCompletionTokens","modelLoad.autoLoad","modelLoad.flashAttention","modelLoad.evalBatchSize","modelLoad.offloadKvCacheToGpu"]},{id:"model.capabilities",titleKey:"web.settings.sec.model.capabilities",descKey:"web.settings.sec.model.capabilities.desc",keys:["modelCapabilities"]}],context:[{id:"context.window",titleKey:"web.settings.sec.context.window",descKey:"web.settings.sec.context.window.desc",keys:["contextWindow","contextBudget.systemPrompt","contextBudget.responseReserve"]},{id:"context.compaction",titleKey:"web.settings.sec.context.compaction",descKey:"web.settings.sec.context.compaction.desc",keys:["contextBudget.compactionThreshold","contextBudget.compactionMinLoad","contextBudget.policy","contextBudget.compactionSummary","contextBudget.overflowCooldown","contextBudget.toolResultKeep","contextBudget.calibrationWarmup","contextBudget.ratioFloor"]},{id:"context.instructions",titleKey:"web.settings.sec.context.instructions",descKey:"web.settings.sec.context.instructions.desc",keys:["instructions.summarize"]},{id:"context.indexer",titleKey:"web.settings.sec.context.indexer",descKey:"web.settings.sec.context.indexer.desc",keys:["indexer.maxFiles","indexer.respectGitignore","indexer.mapTokenBudget"]},{id:"context.log",titleKey:"web.settings.sec.context.log",descKey:"web.settings.sec.context.log.desc",keys:["contextLog.enabled","contextLog.redact"]}],reasoning:[{id:"reasoning.display",titleKey:"web.settings.sec.reasoning.display",keys:["showReasoning"]},{id:"reasoning.effort",titleKey:"web.settings.sec.reasoning.effort",descKey:"web.settings.sec.reasoning.effort.desc",keys:["reasoning.mode","reasoning.min","reasoning.max","reasoning.baseline","reasoning.overrideCooldown"]}],agent:[{id:"agent.moe",titleKey:"web.settings.sec.agent.moe",descKey:"web.settings.sec.agent.moe.desc",keys:["moe.enabled","moe.maxReplanCycles","orchestrator.model","orchestrator.provider","orchestrator.contextWindow","experts"]},{id:"agent.critic",titleKey:"web.settings.sec.agent.critic",descKey:"web.settings.sec.agent.critic.desc",keys:["critic.enabled","critic.model","critic.provider","critic.tools","critic.maxCalls","critic.maxRepairCycles","critic.timeoutMs"]},{id:"agent.tools",titleKey:"web.settings.sec.agent.tools",descKey:"web.settings.sec.agent.tools.desc",keys:["tools.enableOnDemand","tools.defaultTags","tools.grepEngine","skills.budget"]},{id:"agent.subagent",titleKey:"web.settings.sec.agent.subagent",descKey:"web.settings.sec.agent.subagent.desc",keys:["subagent.resultMode","subagent.maxSummaryChars","subagent.maxParallelChunkQueries","subagent.stableSystemPrompt","subagent.timeoutMs"]},{id:"agent.hallucination",titleKey:"web.settings.sec.agent.hallucination",descKey:"web.settings.sec.agent.hallucination.desc",keys:["hallucination.judge.enabled"]}],network:[{id:"network.web",titleKey:"web.settings.sec.network.web",descKey:"web.settings.sec.network.web.desc",keys:["webSearch.enabled"]},{id:"network.error",titleKey:"web.settings.sec.network.error",descKey:"web.settings.sec.network.error.desc",keys:["errorWebSearch.enabled","errorWebSearch.threshold","errorWebSearch.maxResults","errorWebSearch.maxQueryChars","errorWebSearch.maxSearchesPerSession","errorWebSearch.requestTimeoutMs"]}],browser:[{id:"browser.main",titleKey:"web.settings.sec.browser.main",keys:["browser.enabled","browser.headless"]},{id:"browser.limits",titleKey:"web.settings.sec.browser.limits",descKey:"web.settings.sec.browser.limits.desc",keys:["browser.maxElements","browser.maxContentChars","browser.maxConsoleEntries","browser.maxConsoleLineChars"]},{id:"browser.viewport",titleKey:"web.settings.sec.browser.viewport",keys:["browser.viewportWidth","browser.viewportHeight","browser.navigationTimeout"]}],sessions:[{id:"sessions.main",titleKey:"web.settings.sec.sessions.main",descKey:"web.settings.sec.sessions.main.desc",keys:["session.autoSave","session.autoName","session.maxSessions","session.isolateMemory"]},{id:"sessions.isolation",titleKey:"web.settings.sec.sessions.isolation",descKey:"web.settings.sec.sessions.isolation.desc",keys:["sessionIsolation.enabled","sessionIsolation.isolatePlugins","sessionIsolation.isolateTempFiles"]}],ui:[{id:"ui.chat",titleKey:"web.settings.sec.ui.chat",descKey:"web.settings.sec.ui.chat.desc",keys:["ui.fontSize","ui.activityRail","ui.spinner","ui.showContextStats","ui.showCompaction"]},{id:"ui.images",titleKey:"web.settings.sec.ui.images",descKey:"web.settings.sec.ui.images.desc",keys:["images.maxCount","images.maxBytes"]}],security:[{id:"security.switches",titleKey:"web.settings.sec.security.switches",descKey:"web.settings.sec.security.switches.desc",keys:["security.enabled","security.bash.enabled","security.bash.blockDangerousFlags","security.paths.enabled","security.contentScan.enabled","security.network.enabled","security.sessionEncryption.enabled"]},{id:"security.limits",titleKey:"web.settings.sec.security.limits",descKey:"web.settings.sec.security.limits.desc",keys:["security.maxRecursionDepth","security.maxFileOperations","security.rateLimits.maxRequestsPerMinute","security.rateLimits.maxParallelTasks","security.network.requestTimeout","security.network.maxResponseSize"]},{id:"security.bash",titleKey:"web.settings.sec.security.bash",descKey:"web.settings.sec.security.bash.desc",keys:["security.bash.blacklist","security.bash.whitelist","security.bash.dangerousFlags","security.bash.dangerousOperators"]},{id:"security.paths",titleKey:"web.settings.sec.security.paths",descKey:"web.settings.sec.security.paths.desc",keys:["security.paths.denied","security.paths.allowed"]},{id:"security.network",titleKey:"web.settings.sec.security.network",descKey:"web.settings.sec.security.network.desc",keys:["security.network.deniedDomains","security.network.allowedDomains"]},{id:"security.scan",titleKey:"web.settings.sec.security.scan",descKey:"web.settings.sec.security.scan.desc",keys:["security.contentScan.dangerousPatterns"]},{id:"security.audit",titleKey:"web.settings.sec.security.audit",descKey:"web.settings.sec.security.audit.desc",keys:["security.auditNotifier.enabled","security.auditNotifier.filePath","security.auditNotifier.webhookUrl","security.auditNotifier.webhookTimeout","security.auditNotifier.minSeverity","security.auditNotifier.maxRetries","security.auditNotifier.eventTypes"]},{id:"security.encryption",titleKey:"web.settings.sec.security.encryption",descKey:"web.settings.sec.security.encryption.desc",keys:["security.sessionEncryption.encryptHistory","security.sessionEncryption.encryptSessionLog","security.sessionEncryption.keyPath"]}],advanced:[{id:"advanced.diagnostics",titleKey:"web.settings.sec.advanced.diagnostics",descKey:"web.settings.sec.advanced.diagnostics.desc",keys:["logLevel","version"]},{id:"advanced.retry",titleKey:"web.settings.sec.advanced.retry",descKey:"web.settings.sec.advanced.retry.desc",keys:["retry.maxRetries","retry.baseDelay","retry.maxDelay","retry.maxStreamRetries","retry.noDataTimeoutMs"]},{id:"advanced.service",titleKey:"web.settings.sec.advanced.service",descKey:"web.settings.sec.advanced.service.desc",keys:["pricing.enabled","pricing.overrides","updater.enabled","updater.checkOnStart","updater.autoInstall","updater.intervalMs"]}],plugins:[{id:"plugins.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(t){return{ok:!1,error:t instanceof Error?t.message:"invalid JSON"}}}function u(i,e){const t=a("input");return t.setAttribute("aria-label",i),t.value=e,t}function m(i,e,t){const l=t.optionsSource==="providers"?e.providerOptions||[]:e.modelOptions||[],s=typeof i=="string"?i:"";if(!l.length){const o=u(e.label,s);return o.addEventListener("change",()=>e.post(o.value)),o}const n=a("select");n.setAttribute("aria-label",e.label);const c=a("option","",e.emptyLabel||"—");c.value="",n.appendChild(c);const d=new Set([""]);if(l.forEach(o=>{if(d.has(o))return;d.add(o);const y=a("option","",o);y.value=o,o===s&&(y.selected=!0),n.appendChild(y)}),s&&!d.has(s)){const o=a("option","",s);o.value=s,o.selected=!0,n.appendChild(o)}return n.value=s||"",n.addEventListener("change",()=>e.post(n.value)),n}export function controlFor(i,e,t){if(i.readOnly){const s=a("span","val dim",e==null?"—":String(e));return e!=null&&(s.title=String(e)),s}if(i.valueType==="bool")return g(!!e,s=>(t.post(s),!0));if(i.valueType==="enum"){const s=a("select");return s.setAttribute("aria-label",t.label),(i.enum||[]).forEach(n=>{const c=a("option","",t.enumLabel(n));c.value=n,n===e&&(c.selected=!0),s.appendChild(c)}),s.addEventListener("change",()=>t.post(s.value)),s}if(i.valueType==="int"){const s=u(t.label,e==null?"":String(e));return s.type="number",i.min!=null&&(s.min=String(i.min)),i.max!=null&&(s.max=String(i.max)),i.step!=null&&(s.step=String(i.step)),s.addEventListener("change",()=>t.post(s.value)),s}if(i.valueType==="share"){const s=u(t.label,e==null?"":Math.round(Number(e)*100)+"%");return s.addEventListener("change",()=>t.post(s.value)),s}const r=i.editor;if(r&&r.kind==="select")return m(e,t,r);if(r&&r.kind==="tags"&&(i.valueType==="list"||i.valueType==="json"))return b(e,t,r);if(r&&r.kind==="checkboxes")return p(e,t,r);if(r&&r.kind==="table")return w(e,t,r);if(i.valueType==="list"){const s=Array.isArray(e)?e.join(", "):e==null?"":String(e),n=u(t.label,s);return n.placeholder="a, b, c",n.addEventListener("change",()=>t.post(n.value)),n}if(i.valueType==="json"){const s=a("div","jsonctl"),n=a("textarea");n.setAttribute("aria-label",t.label),n.rows=3,n.value=e==null?"":JSON.stringify(e,null,2);const c=a("div","json-err");return c.hidden=!0,n.addEventListener("input",()=>{const d=validateJson(n.value);c.hidden=d.ok,c.textContent=d.ok?"":String(d.error||"invalid JSON")}),n.addEventListener("change",()=>{validateJson(n.value).ok?t.post(n.value.trim()):n.focus()}),s.appendChild(n),s.appendChild(c),s}const l=u(t.label,e==null?"":String(e));return l.addEventListener("change",()=>t.post(l.value)),l}export const PANEL_SECTIONS={general:[{id:"general.interface",titleKey:"web.settings.sec.general.interface",keys:["locale","ui.verbosity"]},{id:"general.agent",titleKey:"web.settings.sec.general.agent",descKey:"web.settings.sec.general.agent.desc",keys:["maxToolIterations","stuckThreshold","autoPlan","execution.autoAdvance"]},{id:"general.provider",titleKey:"web.settings.sec.general.provider",keys:["provider.fallback"]}],model:[{id:"model.tuning",titleKey:"web.settings.sec.model.tuning",descKey:"web.settings.sec.model.tuning.desc",keys:["provider.maxCompletionTokens","modelLoad.autoLoad","modelLoad.flashAttention","modelLoad.evalBatchSize","modelLoad.offloadKvCacheToGpu"]},{id:"model.capabilities",titleKey:"web.settings.sec.model.capabilities",descKey:"web.settings.sec.model.capabilities.desc",keys:["modelCapabilities"]}],context:[{id:"context.window",titleKey:"web.settings.sec.context.window",descKey:"web.settings.sec.context.window.desc",keys:["contextWindow","contextBudget.systemPrompt","contextBudget.responseReserve"]},{id:"context.compaction",titleKey:"web.settings.sec.context.compaction",descKey:"web.settings.sec.context.compaction.desc",keys:["contextBudget.compactionThreshold","contextBudget.compactionMinLoad","contextBudget.policy","contextBudget.compactionSummary","contextBudget.overflowCooldown","contextBudget.toolResultKeep","contextBudget.calibrationWarmup","contextBudget.ratioFloor"]},{id:"context.instructions",titleKey:"web.settings.sec.context.instructions",descKey:"web.settings.sec.context.instructions.desc",keys:["instructions.summarize"]},{id:"context.indexer",titleKey:"web.settings.sec.context.indexer",descKey:"web.settings.sec.context.indexer.desc",keys:["indexer.maxFiles","indexer.respectGitignore","indexer.mapTokenBudget"]},{id:"context.log",titleKey:"web.settings.sec.context.log",descKey:"web.settings.sec.context.log.desc",keys:["contextLog.enabled","contextLog.redact"]}],reasoning:[{id:"reasoning.display",titleKey:"web.settings.sec.reasoning.display",keys:["showReasoning"]},{id:"reasoning.effort",titleKey:"web.settings.sec.reasoning.effort",descKey:"web.settings.sec.reasoning.effort.desc",keys:["reasoning.mode","reasoning.min","reasoning.max","reasoning.baseline","reasoning.overrideCooldown"]}],agent:[{id:"agent.moe",titleKey:"web.settings.sec.agent.moe",descKey:"web.settings.sec.agent.moe.desc",keys:["moe.enabled","moe.maxReplanCycles","moe.parallelSubtasks","orchestrator.model","orchestrator.provider","orchestrator.contextWindow","experts"]},{id:"agent.critic",titleKey:"web.settings.sec.agent.critic",descKey:"web.settings.sec.agent.critic.desc",keys:["critic.enabled","critic.model","critic.provider","critic.tools","critic.maxCalls","critic.maxRepairCycles","critic.timeoutMs"]},{id:"agent.tools",titleKey:"web.settings.sec.agent.tools",descKey:"web.settings.sec.agent.tools.desc",keys:["tools.enableOnDemand","tools.defaultTags","tools.grepEngine","skills.budget"]},{id:"agent.subagent",titleKey:"web.settings.sec.agent.subagent",descKey:"web.settings.sec.agent.subagent.desc",keys:["subagent.resultMode","subagent.maxSummaryChars","subagent.maxParallelChunkQueries","subagent.stableSystemPrompt","subagent.timeoutMs"]},{id:"agent.hallucination",titleKey:"web.settings.sec.agent.hallucination",descKey:"web.settings.sec.agent.hallucination.desc",keys:["hallucination.judge.enabled"]}],network:[{id:"network.web",titleKey:"web.settings.sec.network.web",descKey:"web.settings.sec.network.web.desc",keys:["webSearch.enabled"]},{id:"network.error",titleKey:"web.settings.sec.network.error",descKey:"web.settings.sec.network.error.desc",keys:["errorWebSearch.enabled","errorWebSearch.threshold","errorWebSearch.maxResults","errorWebSearch.maxQueryChars","errorWebSearch.maxSearchesPerSession","errorWebSearch.requestTimeoutMs"]},{id:"network.service",titleKey:"web.settings.sec.network.service",descKey:"web.settings.sec.network.service.desc",keys:["service.port","service.host","service.token","service.resultRetentionDays","service.idempotencyTtlHours","service.syncWaitMs","service.maxQueueLength","service.callbackTimeoutMs","service.webhookSecret"]}],browser:[{id:"browser.main",titleKey:"web.settings.sec.browser.main",keys:["browser.enabled","browser.headless"]},{id:"browser.limits",titleKey:"web.settings.sec.browser.limits",descKey:"web.settings.sec.browser.limits.desc",keys:["browser.maxElements","browser.maxContentChars","browser.maxConsoleEntries","browser.maxConsoleLineChars"]},{id:"browser.viewport",titleKey:"web.settings.sec.browser.viewport",keys:["browser.viewportWidth","browser.viewportHeight","browser.navigationTimeout"]}],sessions:[{id:"sessions.main",titleKey:"web.settings.sec.sessions.main",descKey:"web.settings.sec.sessions.main.desc",keys:["session.autoSave","session.autoName","session.maxSessions","session.isolateMemory"]},{id:"sessions.isolation",titleKey:"web.settings.sec.sessions.isolation",descKey:"web.settings.sec.sessions.isolation.desc",keys:["sessionIsolation.enabled","sessionIsolation.isolatePlugins","sessionIsolation.isolateTempFiles"]}],ui:[{id:"ui.chat",titleKey:"web.settings.sec.ui.chat",descKey:"web.settings.sec.ui.chat.desc",keys:["ui.fontSize","ui.activityRail","ui.spinner","ui.showContextStats","ui.showCompaction"]},{id:"ui.images",titleKey:"web.settings.sec.ui.images",descKey:"web.settings.sec.ui.images.desc",keys:["images.maxCount","images.maxBytes"]}],security:[{id:"security.switches",titleKey:"web.settings.sec.security.switches",descKey:"web.settings.sec.security.switches.desc",keys:["security.enabled","security.bash.enabled","security.bash.blockDangerousFlags","security.paths.enabled","security.contentScan.enabled","security.network.enabled","security.sessionEncryption.enabled"]},{id:"security.limits",titleKey:"web.settings.sec.security.limits",descKey:"web.settings.sec.security.limits.desc",keys:["security.maxRecursionDepth","security.maxFileOperations","security.rateLimits.maxRequestsPerMinute","security.rateLimits.maxParallelTasks","security.network.requestTimeout","security.network.maxResponseSize"]},{id:"security.bash",titleKey:"web.settings.sec.security.bash",descKey:"web.settings.sec.security.bash.desc",keys:["security.bash.blacklist","security.bash.whitelist","security.bash.dangerousFlags","security.bash.dangerousOperators"]},{id:"security.paths",titleKey:"web.settings.sec.security.paths",descKey:"web.settings.sec.security.paths.desc",keys:["security.paths.denied","security.paths.allowed"]},{id:"security.network",titleKey:"web.settings.sec.security.network",descKey:"web.settings.sec.security.network.desc",keys:["security.network.deniedDomains","security.network.allowedDomains"]},{id:"security.scan",titleKey:"web.settings.sec.security.scan",descKey:"web.settings.sec.security.scan.desc",keys:["security.contentScan.dangerousPatterns"]},{id:"security.audit",titleKey:"web.settings.sec.security.audit",descKey:"web.settings.sec.security.audit.desc",keys:["security.auditNotifier.enabled","security.auditNotifier.filePath","security.auditNotifier.webhookUrl","security.auditNotifier.webhookTimeout","security.auditNotifier.minSeverity","security.auditNotifier.maxRetries","security.auditNotifier.eventTypes"]},{id:"security.encryption",titleKey:"web.settings.sec.security.encryption",descKey:"web.settings.sec.security.encryption.desc",keys:["security.sessionEncryption.encryptHistory","security.sessionEncryption.encryptSessionLog","security.sessionEncryption.keyPath"]}],advanced:[{id:"advanced.diagnostics",titleKey:"web.settings.sec.advanced.diagnostics",descKey:"web.settings.sec.advanced.diagnostics.desc",keys:["logLevel","version"]},{id:"advanced.retry",titleKey:"web.settings.sec.advanced.retry",descKey:"web.settings.sec.advanced.retry.desc",keys:["retry.maxRetries","retry.baseDelay","retry.maxDelay","retry.maxStreamRetries","retry.noDataTimeoutMs"]},{id:"advanced.service",titleKey:"web.settings.sec.advanced.service",descKey:"web.settings.sec.advanced.service.desc",keys:["pricing.enabled","pricing.overrides","updater.enabled","updater.checkOnStart","updater.autoInstall","updater.intervalMs"]}],plugins:[{id:"plugins.registry",titleKey:"web.settings.sec.plugins.registry",descKey:"web.settings.sec.plugins.registry.desc",keys:["plugins.disabled","plugins.maxDrafts"]},{id:"plugins.lsp",titleKey:"web.settings.sec.plugins.lsp",descKey:"web.settings.sec.plugins.lsp.desc",keys:["lsp.enabled","lsp.offline"]}]};export function keyToPanel(){const i=new Map;for(const[e,t]of Object.entries(PANEL_SECTIONS))for(const r of t)for(const l of r.keys)i.set(l,e);return i}
@@ -1 +1 @@
1
- import{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{}}
@@ -1,5 +1,5 @@
1
- import{el as r}from"../dom.js";import{api as E}from"../api.js";import{t as a}from"../i18n.js";import{labelOf as T,categoryOf as B,argText as A,formatMs as v}from"../format.js";import{sb as i,paneEl as S,TRACE_CAP as M,MAX_OUTPUT_CHARS as x}from"./state.js";function q(e){return e==="composing"?a("web.rail.composing"):e==="tool"?a("web.rail.working"):e==="thinking"?a("web.action.thinking"):String(e||"")}function L(e,t){return e==="tool"||e==="tool_fail"?B(t):e==="phase"?"phase":"meta"}function C(e){switch(e.kind){case"phase":return q(e.phase);case"plan":return a("web.sidebar.trace_plan");case"question":return a("web.sidebar.trace_question");case"text":return a("web.sidebar.trace_text",{count:e.chars||0});case"status":return a("web.sidebar.trace_status");case"log":return a("web.sidebar.trace_log",{level:e.level||""});case"retract":return a("web.sidebar.trace_retract");case"index":return a("web.sidebar.trace_index",{phase:e.phase||""});case"critic":return a("web.sidebar.trace_critic",{status:e.status||""});case"moe":return a("web.sidebar.trace_moe");case"compaction":return a("web.sidebar.trace_compaction");case"probe":return a("web.sidebar.trace_probe");case"usage":return a("web.sidebar.trace_usage");case"audit":return a("web.sidebar.trace_audit");case"claim":return a("web.sidebar.trace_claim",{kind:e.subkind||""});case"output":return a("web.sidebar.trace_output");default:return T(e.name)}}function R(e){if(e.kind==="text"||e.kind==="phase")return"";if(e.kind==="plan"){const t=typeof e.currentIndex=="number"?e.currentIndex:0,s=Array.isArray(e.steps)?e.steps.length:0;return s?a("web.rail.step_of",{cur:Math.min(t+1,s),total:s}):""}return e.kind==="question"?e.text||"":e.text&&typeof e.text=="string"&&e.kind!=="tool"&&e.kind!=="tool_fail"?(e.text.split(`
2
- `).map(s=>s.trim()).find(s=>s.length>0)||"").slice(0,160):A(e.args)}function w(e){return e.kind==="tool_fail"||e.kind==="error"||e.kind==="claim"||e.kind==="critic"&&e.status==="critical"||e.kind==="log"&&(e.level==="warn"||e.level==="error")}function _(e){const t=["trc",L(e.kind,e.name)];w(e)&&t.push("warn"),i.selected===e.id&&t.push("sel");const s=r("div",t.join(" "));s.dataset.id=String(e.id),s.appendChild(r("span","g",w(e)?"⚠":e.kind==="question"?"?":"◇")),s.appendChild(r("span","lab",C(e)));const n=R(e);return n&&s.appendChild(r("span","args",n)),e.durationMs&&s.appendChild(r("span","t",v(e.durationMs))),s.addEventListener("click",()=>{if(i.selected===e.id){collapseDetail();return}i.listEl&&i.listEl.querySelectorAll(".trc.sel").forEach(d=>d.classList.remove("sel")),i.selected=e.id,s.classList.add("sel"),renderDetail(e)}),s}export function renderList(){const e=i.listEl;if(!e)return;if(e.textContent="",e.dataset.lastTurn="-1",i.nodeById.clear(),i.headerByTurn.clear(),i.selected&&!i.trace.some(s=>s.id===i.selected)&&(i.selected=null),i.trace.length===0){e.appendChild(r("div","trace-turn",a("web.sidebar.trace_empty")));return}let t=-1;for(const s of i.trace){if(s.turn!==t){t=s.turn;const d=r("div","trace-turn",a("web.sidebar.trace_turn",{n:s.turn}));i.headerByTurn.set(s.turn,d),e.appendChild(d)}const n=_(s);i.nodeById.set(s.id,n),e.appendChild(n)}e.dataset.lastTurn=String(t),e.scrollTop=e.scrollHeight}function o(e){for(e.id=++i.seq,e.turn=i.turn,e.ts=Date.now(),i.trace.push(e);i.trace.length>M;){const t=i.trace.shift();if(!t)break;const s=i.nodeById.get(t.id);if(s&&(s.remove(),i.nodeById.delete(t.id)),t.toolCallId!=null&&i.callIndex.delete(t.toolCallId),!i.trace.some(n=>n.turn===t.turn)){const n=i.headerByTurn.get(t.turn);n&&(n.remove(),i.headerByTurn.delete(t.turn))}}return e}function l(e){const t=i.listEl;if(!t)return;const s=t.dataset.lastTurn?Number(t.dataset.lastTurn):-1;if(e.turn!==s){const d=r("div","trace-turn",a("web.sidebar.trace_turn",{n:e.turn}));i.headerByTurn.set(e.turn,d),t.appendChild(d),t.dataset.lastTurn=String(e.turn)}const n=_(e);i.nodeById.set(e.id,n),t.appendChild(n),t.scrollTop=t.scrollHeight}function j(e){const t=i.nodeById.get(e.id),s=_(e);i.nodeById.set(e.id,s),t&&t.parentNode?t.replaceWith(s):i.listEl&&i.listEl.appendChild(s),i.listEl&&(i.listEl.scrollTop=i.listEl.scrollHeight)}function P(e){const t=i.nodeById.get(e.id);t&&(t.textContent="",t.appendChild(r("span","g","✦")),t.appendChild(r("span","lab",C(e))),i.listEl&&(i.listEl.scrollTop=i.listEl.scrollHeight))}export function sidebarSessionChanged(e){(i.el&&i.el.dataset.sid)!==(e||"")&&(i.el&&(i.el.dataset.sid=e||""),i.trace=[],i.callIndex.clear(),i.textEntry=null,i.turn=0,i.seq=0,i.logCursor=new Date().toISOString(),i.logPulling=!1,collapseDetail(),renderList())}export function sidebarSessionId(){return i.el&&i.el.dataset.sid||null}export function setSessionLoading(e){if(!i.el)return;i.el.classList.toggle("sb-loading",!!e);const t=S("session");t&&t.setAttribute("aria-busy",e?"true":"false")}export function sidebarTurnEnd(e){i.turn=typeof e=="number"&&e>i.turn?e:i.turn+1,i.textEntry=null}export function sidebarTraceEvent(e,t){if(t)switch(e){case"tool_start":{const s=o({kind:"tool",name:t.name,args:t.args||{},toolCallId:t.toolCallId});t.toolCallId!=null&&i.callIndex.set(t.toolCallId,s),l(s);break}case"tool_end":{const s=t.toolCallId!=null?i.callIndex.get(t.toolCallId):void 0;if(t.toolCallId!=null&&i.callIndex.delete(t.toolCallId),s)s.kind=t.success===!1?"tool_fail":"tool",s.success=t.success!==!1,s.durationMs=t.durationMs,s.output=t.output||"",j(s);else{const n=o({kind:t.success===!1?"tool_fail":"tool",name:t.name,args:t.args||{},toolCallId:t.toolCallId,success:t.success!==!1,durationMs:t.durationMs,output:t.output||""});l(n)}break}case"phase":t.phase!=="done"&&l(o({kind:"phase",phase:t.phase}));break;case"plan":l(o({kind:"plan",steps:Array.isArray(t.steps)?t.steps:[],currentIndex:typeof t.currentIndex=="number"?t.currentIndex:0}));break;case"question":l(o({kind:"question",text:t.question||t.text||""}));break;case"text":{i.textEntry||(i.textEntry=o({kind:"text",text:"",chars:0}),l(i.textEntry));const s=t.chunk||"";i.textEntry.chars+=s.length,i.textEntry.text+=s,i.textEntry.text.length>x&&(i.textEntry.text=i.textEntry.text.slice(0,x)+`
3
- … [truncated from `+i.textEntry.chars+" chars]"),P(i.textEntry);break}case"error":l(o({kind:"error",message:t.message||t.error||""}));break;case"meta":{if(t.kind!==void 0&&t.kind!=="status")break;const s=t.chunk||"";if(!s.trim())break;l(o({kind:"status",text:s}));break}case"log":{if(t.diagnostic&&t.level==="info")break;const s=t.text||"";if(!s.trim())break;l(o({kind:"log",text:s,level:t.level||"",source:t.source||""}));break}case"retract":l(o({kind:"retract",text:t.reason||""}));break;case"index":{const s=t.stats&&typeof t.stats=="object"?Object.entries(t.stats).map(([n,d])=>n+": "+d).join(", "):"";l(o({kind:"index",phase:t.phase||"",text:s}));break}default:break}}export async function sidebarPullLog(){const e=i.el&&i.el.dataset.sid;if(!(!e||i.logPulling)){i.logPulling=!0;try{let t="/api/sessions/"+encodeURIComponent(e)+"/log?limit=100";i.logCursor&&(t+="&since="+encodeURIComponent(i.logCursor));const s=await E(t);if(!s.ok||!s.data||!Array.isArray(s.data.log))return;for(const n of s.data.log)typeof n.ts=="string"&&(i.logCursor===null||n.ts>i.logCursor)&&(i.logCursor=n.ts),O(n)}catch{}finally{i.logPulling=!1}}}function O(e){if(!(!e||typeof e.type!="string"))switch(e.type){case"critic_check":l(o({kind:"critic",status:"check",text:"",iteration:e.iteration}));break;case"critic_verdict":l(o({kind:"critic",status:e.status||"",text:e.content||"",iteration:e.iteration}));break;case"critic_escalation":l(o({kind:"critic",status:"escalation",text:e.content||"",iteration:e.iteration}));break;case"moe_plan":case"moe_subtask":case"moe_replan":case"moe_verify":{const t=[e.title,e.subtaskId,e.expertTag,e.status].filter(s=>typeof s=="string"&&s).join(" · ");l(o({kind:"moe",subtype:e.type,text:t,iteration:e.iteration}));break}case"compaction":l(o({kind:"compaction",text:e.content||"",iteration:e.iteration}));break;case"context_probe":l(o({kind:"probe",text:e.content||""}));break;case"llm_usage":{const t=typeof e.totalTokens=="number"?e.totalTokens:(e.promptTokens||0)+(e.completionTokens||0),s=[e.model||e.provider,t?t+" tok":""].filter(Boolean).join(" · ");l(o({kind:"usage",text:s,iteration:e.iteration}));break}case"audit":l(o({kind:"audit",text:e.content||"",iteration:e.iteration}));break;case"claim_retry":l(o({kind:"claim",subkind:e.kind||"",text:e.content||"",iteration:e.iteration}));break;case"output":l(o({kind:"output",text:e.content||"",iteration:e.iteration}));break;default:break}}function b(e,t){const s=r("div");return s.appendChild(r("h5","",e)),s.appendChild(t),s}function k(e,t){const s=r("div","kv");s.appendChild(r("span","dim",e));const n=r("b");return n.textContent=t,s.appendChild(n),s}function h(e){const t=r("div","code");return t.textContent=e,t}function D(e){return typeof e!="string"?"":e.length<=x?e:e.slice(0,x)+`
4
- … [truncated from `+e.length+" chars]"}export function renderDetail(e){const t=i.detailGlyph,s=i.detailTitle,n=i.detailBody,d=i.detailEl;if(!d||!t||!s||!n)return;d.hidden=!1;const m=w(e);t.textContent=m?"⚠":e.kind==="question"?"?":"◇",t.style.color=m?"var(--yellow)":"var(--accent)",s.textContent=C(e),n.textContent="";const c=r("div");c.appendChild(r("h5","",a("web.sidebar.detail_metadata")));const g=e.ts?new Date(e.ts):null;if((e.kind==="tool"||e.kind==="tool_fail")&&(c.appendChild(k(a("web.sidebar.detail_status"),e.success===!1?a("web.sidebar.detail_fail"):a("web.sidebar.detail_ok"))),e.durationMs&&c.appendChild(k(a("web.sidebar.detail_duration"),v(e.durationMs)))),g&&c.appendChild(k(a("web.sidebar.detail_time"),g.toLocaleTimeString())),e.toolCallId&&c.appendChild(k(a("web.sidebar.detail_tool_call"),String(e.toolCallId))),i.el&&i.el.dataset.sid&&c.appendChild(k(a("web.sidebar.detail_session"),i.el.dataset.sid)),c.appendChild(k(a("web.sidebar.detail_turn"),String(e.turn))),typeof e.iteration=="number"&&c.appendChild(k(a("web.sidebar.detail_iteration"),String(e.iteration))),n.appendChild(c),e.kind==="tool"||e.kind==="tool_fail")n.appendChild(b(a("web.sidebar.detail_arguments"),h(JSON.stringify(e.args||{},null,2)))),n.appendChild(b(a("web.sidebar.detail_output"),h(D(e.output))));else if(e.kind==="text")n.appendChild(b(a("web.sidebar.detail_text"),h(e.text||""))),H(e);else if(e.kind==="plan"){const u=r("div");(e.steps||[]).forEach(p=>{const f=p.status==="done"?"✓":p.status==="failed"?"✗":p.status==="in_progress"?"▸":"○",I=p.status==="failed"?"fail":p.status==="in_progress"?"cur":p.status==="done"?"done":"";u.appendChild(r("div",("plan-step "+I).trim(),f+" "+p.text))}),n.appendChild(b(a("web.sidebar.detail_plan"),u))}else if(e.kind==="question")n.appendChild(b(a("web.sidebar.trace_question"),h(e.text||"")));else if(e.kind==="error")n.appendChild(b(a("web.sidebar.detail_error"),h(e.message||"")));else if(e.kind==="status"||e.kind==="log"||e.kind==="retract"||e.kind==="index"||e.kind==="critic"||e.kind==="moe"||e.kind==="compaction"||e.kind==="probe"||e.kind==="usage"||e.kind==="audit"||e.kind==="claim"||e.kind==="output"){const u=e.kind==="moe"&&e.subtype?e.subtype:e.kind==="log"&&e.level?"log · "+e.level:e.kind==="index"&&e.phase?"index · "+e.phase:e.kind==="critic"&&e.status?"critic · "+e.status:e.kind==="claim"&&e.subkind?"claim_retry · "+e.subkind:C(e);n.appendChild(b(u,h(e.text||"")))}}async function H(e){const t=i.el&&i.el.dataset.sid,s=i.detailBody;if(!(!t||!s||i.selected!==e.id))try{const n=await E("/api/sessions/"+encodeURIComponent(t)+"/log?types=assistant,llm_usage&limit=20");if(!n.ok||!n.data||!Array.isArray(n.data.log)||i.selected!==e.id)return;const d=n.data.log,m=d.filter(f=>f.type==="assistant"),c=d.filter(f=>f.type==="llm_usage"),g=m.map(f=>f.iteration).filter(f=>typeof f=="number"),u=c.length>0?c[c.length-1]:null,p=[a("web.sidebar.detail_provenance_count",{n:m.length})+(g.length>0?" · iter "+Math.min(...g)+"–"+Math.max(...g):""),u?[u.model||u.provider,u.totalTokens??(u.promptTokens||0)+(u.completionTokens||0)].filter(Boolean).join(" · "):""].filter(Boolean).join(`
1
+ import{el as l}from"../dom.js";import{api as v}from"../api.js";import{t as a}from"../i18n.js";import{labelOf as B,categoryOf as S,argText as A,formatMs as I}from"../format.js";import{createFace as q,setFaceState as M,toolState as L}from"../loader.js";import{sb as i,paneEl as R,TRACE_CAP as j,MAX_OUTPUT_CHARS as x}from"./state.js";let w=null;export function initTraceFace(){const e=document.querySelector(".trc-face");e&&(w=q("idle","sm"),e.replaceChildren(w))}export function setTraceFace(e){M(w,e)}function P(e,t){switch(e){case"tool_start":case"tool_fail":case"tool":return L(typeof t.name=="string"?t.name:"");case"phase":return t.phase==="composing"?"type":t.phase==="tool"?"run":"think";case"text":return"type";case"question":return"ask";case"plan":return"plan";case"error":case"retract":return"error";case"compaction":return"compact";case"index":return"run";default:return"think"}}function O(e){return e==="composing"?a("web.rail.composing"):e==="tool"?a("web.rail.working"):e==="thinking"?a("web.action.thinking"):String(e||"")}function F(e,t){return e==="tool"||e==="tool_fail"?S(t):e==="phase"?"phase":"meta"}function C(e){switch(e.kind){case"phase":return O(e.phase);case"plan":return a("web.sidebar.trace_plan");case"question":return a("web.sidebar.trace_question");case"text":return a("web.sidebar.trace_text",{count:e.chars||0});case"status":return a("web.sidebar.trace_status");case"log":return a("web.sidebar.trace_log",{level:e.level||""});case"retract":return a("web.sidebar.trace_retract");case"index":return a("web.sidebar.trace_index",{phase:e.phase||""});case"critic":return a("web.sidebar.trace_critic",{status:e.status||""});case"moe":return a("web.sidebar.trace_moe");case"compaction":return a("web.sidebar.trace_compaction");case"probe":return a("web.sidebar.trace_probe");case"usage":return a("web.sidebar.trace_usage");case"audit":return a("web.sidebar.trace_audit");case"claim":return a("web.sidebar.trace_claim",{kind:e.subkind||""});case"output":return a("web.sidebar.trace_output");default:return B(e.name)}}function D(e){if(e.kind==="text"||e.kind==="phase")return"";if(e.kind==="plan"){const t=typeof e.currentIndex=="number"?e.currentIndex:0,s=Array.isArray(e.steps)?e.steps.length:0;return s?a("web.rail.step_of",{cur:Math.min(t+1,s),total:s}):""}return e.kind==="question"?e.text||"":e.text&&typeof e.text=="string"&&e.kind!=="tool"&&e.kind!=="tool_fail"?(e.text.split(`
2
+ `).map(s=>s.trim()).find(s=>s.length>0)||"").slice(0,160):A(e.args)}function _(e){return e.kind==="tool_fail"||e.kind==="error"||e.kind==="claim"||e.kind==="critic"&&e.status==="critical"||e.kind==="log"&&(e.level==="warn"||e.level==="error")}function E(e){const t=["trc",F(e.kind,e.name)];_(e)&&t.push("warn"),i.selected===e.id&&t.push("sel");const s=l("div",t.join(" "));s.dataset.id=String(e.id),s.appendChild(l("span","g",_(e)?"⚠":e.kind==="question"?"?":"◇")),s.appendChild(l("span","lab",C(e)));const n=D(e);return n&&s.appendChild(l("span","args",n)),e.durationMs&&s.appendChild(l("span","t",I(e.durationMs))),s.addEventListener("click",()=>{if(i.selected===e.id){collapseDetail();return}i.listEl&&i.listEl.querySelectorAll(".trc.sel").forEach(c=>c.classList.remove("sel")),i.selected=e.id,s.classList.add("sel"),renderDetail(e)}),s}export function renderList(){const e=i.listEl;if(!e)return;if(e.textContent="",e.dataset.lastTurn="-1",i.nodeById.clear(),i.headerByTurn.clear(),i.selected&&!i.trace.some(s=>s.id===i.selected)&&(i.selected=null),i.trace.length===0){e.appendChild(l("div","trace-turn",a("web.sidebar.trace_empty")));return}let t=-1;for(const s of i.trace){if(s.turn!==t){t=s.turn;const c=l("div","trace-turn",a("web.sidebar.trace_turn",{n:s.turn}));i.headerByTurn.set(s.turn,c),e.appendChild(c)}const n=E(s);i.nodeById.set(s.id,n),e.appendChild(n)}e.dataset.lastTurn=String(t),e.scrollTop=e.scrollHeight}function o(e){for(e.id=++i.seq,e.turn=i.turn,e.ts=Date.now(),i.trace.push(e);i.trace.length>j;){const t=i.trace.shift();if(!t)break;const s=i.nodeById.get(t.id);if(s&&(s.remove(),i.nodeById.delete(t.id)),t.toolCallId!=null&&i.callIndex.delete(t.toolCallId),!i.trace.some(n=>n.turn===t.turn)){const n=i.headerByTurn.get(t.turn);n&&(n.remove(),i.headerByTurn.delete(t.turn))}}return e}function r(e){const t=i.listEl;if(!t)return;const s=t.dataset.lastTurn?Number(t.dataset.lastTurn):-1;if(e.turn!==s){const c=l("div","trace-turn",a("web.sidebar.trace_turn",{n:e.turn}));i.headerByTurn.set(e.turn,c),t.appendChild(c),t.dataset.lastTurn=String(e.turn)}const n=E(e);i.nodeById.set(e.id,n),t.appendChild(n),t.scrollTop=t.scrollHeight}function H(e){const t=i.nodeById.get(e.id),s=E(e);i.nodeById.set(e.id,s),t&&t.parentNode?t.replaceWith(s):i.listEl&&i.listEl.appendChild(s),i.listEl&&(i.listEl.scrollTop=i.listEl.scrollHeight)}function U(e){const t=i.nodeById.get(e.id);t&&(t.textContent="",t.appendChild(l("span","g","✦")),t.appendChild(l("span","lab",C(e))),i.listEl&&(i.listEl.scrollTop=i.listEl.scrollHeight))}export function sidebarSessionChanged(e){(i.el&&i.el.dataset.sid)!==(e||"")&&(i.el&&(i.el.dataset.sid=e||""),i.trace=[],i.callIndex.clear(),i.textEntry=null,i.turn=0,i.seq=0,i.logCursor=new Date().toISOString(),i.logPulling=!1,collapseDetail(),renderList())}export function sidebarSessionId(){return i.el&&i.el.dataset.sid||null}export function setSessionLoading(e){if(!i.el)return;i.el.classList.toggle("sb-loading",!!e);const t=R("session");t&&t.setAttribute("aria-busy",e?"true":"false")}export function sidebarTurnEnd(e){i.turn=typeof e=="number"&&e>i.turn?e:i.turn+1,i.textEntry=null}export function sidebarTraceEvent(e,t){if(t)switch(setTraceFace(P(e,t)),e){case"tool_start":{const s=o({kind:"tool",name:t.name,args:t.args||{},toolCallId:t.toolCallId});t.toolCallId!=null&&i.callIndex.set(t.toolCallId,s),r(s);break}case"tool_end":{const s=t.toolCallId!=null?i.callIndex.get(t.toolCallId):void 0;if(t.toolCallId!=null&&i.callIndex.delete(t.toolCallId),s)s.kind=t.success===!1?"tool_fail":"tool",s.success=t.success!==!1,s.durationMs=t.durationMs,s.output=t.output||"",H(s);else{const n=o({kind:t.success===!1?"tool_fail":"tool",name:t.name,args:t.args||{},toolCallId:t.toolCallId,success:t.success!==!1,durationMs:t.durationMs,output:t.output||""});r(n)}break}case"phase":t.phase!=="done"&&r(o({kind:"phase",phase:t.phase}));break;case"plan":r(o({kind:"plan",steps:Array.isArray(t.steps)?t.steps:[],currentIndex:typeof t.currentIndex=="number"?t.currentIndex:0}));break;case"question":r(o({kind:"question",text:t.question||t.text||""}));break;case"text":{i.textEntry||(i.textEntry=o({kind:"text",text:"",chars:0}),r(i.textEntry));const s=t.chunk||"";i.textEntry.chars+=s.length,i.textEntry.text+=s,i.textEntry.text.length>x&&(i.textEntry.text=i.textEntry.text.slice(0,x)+`
3
+ … [truncated from `+i.textEntry.chars+" chars]"),U(i.textEntry);break}case"error":r(o({kind:"error",message:t.message||t.error||""}));break;case"meta":{if(t.kind!==void 0&&t.kind!=="status")break;const s=t.chunk||"";if(!s.trim())break;r(o({kind:"status",text:s}));break}case"log":{if(t.diagnostic&&t.level==="info")break;const s=t.text||"";if(!s.trim())break;r(o({kind:"log",text:s,level:t.level||"",source:t.source||""}));break}case"retract":r(o({kind:"retract",text:t.reason||""}));break;case"index":{const s=t.stats&&typeof t.stats=="object"?Object.entries(t.stats).map(([n,c])=>n+": "+c).join(", "):"";r(o({kind:"index",phase:t.phase||"",text:s}));break}default:break}}export async function sidebarPullLog(){const e=i.el&&i.el.dataset.sid;if(!(!e||i.logPulling)){i.logPulling=!0;try{let t="/api/sessions/"+encodeURIComponent(e)+"/log?limit=100";i.logCursor&&(t+="&since="+encodeURIComponent(i.logCursor));const s=await v(t);if(!s.ok||!s.data||!Array.isArray(s.data.log))return;for(const n of s.data.log)typeof n.ts=="string"&&(i.logCursor===null||n.ts>i.logCursor)&&(i.logCursor=n.ts),N(n)}catch{}finally{i.logPulling=!1}}}function N(e){if(!(!e||typeof e.type!="string"))switch(e.type){case"critic_check":r(o({kind:"critic",status:"check",text:"",iteration:e.iteration}));break;case"critic_verdict":r(o({kind:"critic",status:e.status||"",text:e.content||"",iteration:e.iteration}));break;case"critic_escalation":r(o({kind:"critic",status:"escalation",text:e.content||"",iteration:e.iteration}));break;case"moe_plan":case"moe_subtask":case"moe_replan":case"moe_verify":{const t=[e.title,e.subtaskId,e.expertTag,e.status].filter(s=>typeof s=="string"&&s).join(" · ");r(o({kind:"moe",subtype:e.type,text:t,iteration:e.iteration}));break}case"compaction":r(o({kind:"compaction",text:e.content||"",iteration:e.iteration}));break;case"context_probe":r(o({kind:"probe",text:e.content||""}));break;case"llm_usage":{const t=typeof e.totalTokens=="number"?e.totalTokens:(e.promptTokens||0)+(e.completionTokens||0),s=[e.model||e.provider,t?t+" tok":""].filter(Boolean).join(" · ");r(o({kind:"usage",text:s,iteration:e.iteration}));break}case"audit":r(o({kind:"audit",text:e.content||"",iteration:e.iteration}));break;case"claim_retry":r(o({kind:"claim",subkind:e.kind||"",text:e.content||"",iteration:e.iteration}));break;case"output":r(o({kind:"output",text:e.content||"",iteration:e.iteration}));break;default:break}}function b(e,t){const s=l("div");return s.appendChild(l("h5","",e)),s.appendChild(t),s}function k(e,t){const s=l("div","kv");s.appendChild(l("span","dim",e));const n=l("b");return n.textContent=t,s.appendChild(n),s}function h(e){const t=l("div","code");return t.textContent=e,t}function G(e){return typeof e!="string"?"":e.length<=x?e:e.slice(0,x)+`
4
+ … [truncated from `+e.length+" chars]"}export function renderDetail(e){const t=i.detailGlyph,s=i.detailTitle,n=i.detailBody,c=i.detailEl;if(!c||!t||!s||!n)return;c.hidden=!1;const m=_(e);t.textContent=m?"⚠":e.kind==="question"?"?":"◇",t.style.color=m?"var(--yellow)":"var(--accent)",s.textContent=C(e),n.textContent="";const d=l("div");d.appendChild(l("h5","",a("web.sidebar.detail_metadata")));const g=e.ts?new Date(e.ts):null;if((e.kind==="tool"||e.kind==="tool_fail")&&(d.appendChild(k(a("web.sidebar.detail_status"),e.success===!1?a("web.sidebar.detail_fail"):a("web.sidebar.detail_ok"))),e.durationMs&&d.appendChild(k(a("web.sidebar.detail_duration"),I(e.durationMs)))),g&&d.appendChild(k(a("web.sidebar.detail_time"),g.toLocaleTimeString())),e.toolCallId&&d.appendChild(k(a("web.sidebar.detail_tool_call"),String(e.toolCallId))),i.el&&i.el.dataset.sid&&d.appendChild(k(a("web.sidebar.detail_session"),i.el.dataset.sid)),d.appendChild(k(a("web.sidebar.detail_turn"),String(e.turn))),typeof e.iteration=="number"&&d.appendChild(k(a("web.sidebar.detail_iteration"),String(e.iteration))),n.appendChild(d),e.kind==="tool"||e.kind==="tool_fail")n.appendChild(b(a("web.sidebar.detail_arguments"),h(JSON.stringify(e.args||{},null,2)))),n.appendChild(b(a("web.sidebar.detail_output"),h(G(e.output))));else if(e.kind==="text")n.appendChild(b(a("web.sidebar.detail_text"),h(e.text||""))),W(e);else if(e.kind==="plan"){const u=l("div");(e.steps||[]).forEach(p=>{const f=p.status==="done"?"✓":p.status==="failed"?"✗":p.status==="in_progress"?"▸":"○",T=p.status==="failed"?"fail":p.status==="in_progress"?"cur":p.status==="done"?"done":"";u.appendChild(l("div",("plan-step "+T).trim(),f+" "+p.text))}),n.appendChild(b(a("web.sidebar.detail_plan"),u))}else if(e.kind==="question")n.appendChild(b(a("web.sidebar.trace_question"),h(e.text||"")));else if(e.kind==="error")n.appendChild(b(a("web.sidebar.detail_error"),h(e.message||"")));else if(e.kind==="status"||e.kind==="log"||e.kind==="retract"||e.kind==="index"||e.kind==="critic"||e.kind==="moe"||e.kind==="compaction"||e.kind==="probe"||e.kind==="usage"||e.kind==="audit"||e.kind==="claim"||e.kind==="output"){const u=e.kind==="moe"&&e.subtype?e.subtype:e.kind==="log"&&e.level?"log · "+e.level:e.kind==="index"&&e.phase?"index · "+e.phase:e.kind==="critic"&&e.status?"critic · "+e.status:e.kind==="claim"&&e.subkind?"claim_retry · "+e.subkind:C(e);n.appendChild(b(u,h(e.text||"")))}}async function W(e){const t=i.el&&i.el.dataset.sid,s=i.detailBody;if(!(!t||!s||i.selected!==e.id))try{const n=await v("/api/sessions/"+encodeURIComponent(t)+"/log?types=assistant,llm_usage&limit=20");if(!n.ok||!n.data||!Array.isArray(n.data.log)||i.selected!==e.id)return;const c=n.data.log,m=c.filter(f=>f.type==="assistant"),d=c.filter(f=>f.type==="llm_usage"),g=m.map(f=>f.iteration).filter(f=>typeof f=="number"),u=d.length>0?d[d.length-1]:null,p=[a("web.sidebar.detail_provenance_count",{n:m.length})+(g.length>0?" · iter "+Math.min(...g)+"–"+Math.max(...g):""),u?[u.model||u.provider,u.totalTokens??(u.promptTokens||0)+(u.completionTokens||0)].filter(Boolean).join(" · "):""].filter(Boolean).join(`
5
5
  `);p&&s.appendChild(b(a("web.sidebar.detail_provenance"),h(p)))}catch{}}export function collapseDetail(){i.selected=null,i.detailEl&&(i.detailEl.hidden=!0),i.listEl&&i.listEl.querySelectorAll(".trc.sel").forEach(e=>e.classList.remove("sel"))}
@@ -1 +1 @@
1
- export*from"./sidebar/core.js";export*from"./sidebar/trace.js";export*from"./sidebar/map.js";export*from"./sidebar/lsp.js";export*from"./sidebar/files.js";export*from"./sidebar/plugins.js";
1
+ export*from"./sidebar/core.js";export*from"./sidebar/drawer.js";export*from"./sidebar/trace.js";export*from"./sidebar/map.js";export*from"./sidebar/lsp.js";export*from"./sidebar/files.js";export*from"./sidebar/plugins.js";
@@ -1 +1 @@
1
- import{tabs as o,session as i}from"./store.js";export function applyCounters(s){i.busy=!!s.busy,i.runningSessionId=s.runningSessionId||null,i.runningSessionIds=s.runningSessionIds||(i.runningSessionId?[i.runningSessionId]:[]),i.queued=s.queued||{}}export function routeState(s){applyCounters(s);const t=o.activeTabId;if(s.state){const n=typeof s.sessionId=="string"?s.sessionId:t,e=n?o.tabs.find(a=>a.id===n):null;e&&(e.state=s.state)}return!s.sessionId||s.sessionId===t}export function storeSnapshot(s){const t=s&&s.sessionId;if(typeof t!="string")return null;const n=o.tabs.find(e=>e.id===t);return n&&(n.state=s),t}export function mergeUsage(s,t){const n=s?o.tabs.find(a=>a.id===s):null;n&&(n.state=Object.assign({},n.state,t));const e=!s||s===o.activeTabId;return e&&(i.host=Object.assign({},i.host,t)),e}
1
+ import{tabs as o,session as i}from"./store.js";export function applyCounters(t){i.busy=!!t.busy,i.runningSessionId=t.runningSessionId||null,i.runningSessionIds=t.runningSessionIds||(i.runningSessionId?[i.runningSessionId]:[]),i.queued=t.queued||{}}export function routeState(t){applyCounters(t);const s=o.activeTabId;if(t.state){const n=typeof t.sessionId=="string"?t.sessionId:s,e=n?o.tabs.find(u=>u.id===n):null;e&&(e.state=t.state)}return!t.sessionId||t.sessionId===s}export function storeSnapshot(t){const s=t&&t.sessionId;if(typeof s!="string")return null;const n=o.tabs.find(e=>e.id===s);return n&&(n.state=t),s}export function shouldHydrateAutoOpen(t,s){if(!s)return!1;const n=(t||[]).find(e=>e.id===s);return!!(n&&typeof n.messageCount=="number"&&n.messageCount>0)}export function mergeUsage(t,s){const n=t?o.tabs.find(u=>u.id===t):null;n&&(n.state=Object.assign({},n.state,s));const e=!t||t===o.activeTabId;return e&&(i.host=Object.assign({},i.host,s)),e}
package/dist/assets/md.js CHANGED
@@ -1 +1 @@
1
- import*as i from"./smd.js";const d='<rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',h='<path d="M20 6 9 17l-5-5"/>';function g(t){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.setAttribute("aria-hidden","true"),e.setAttribute("focusable","false"),e.setAttribute("class","svg-icon");const n=new DOMParser().parseFromString("<svg>"+t+"</svg>","image/svg+xml").documentElement;for(const r of Array.from(n.childNodes))e.appendChild(document.importNode(r,!0));return e}function a(t,e){t.replaceChildren(g(e))}export function copyText(t){const e=String(t??"");return navigator.clipboard&&navigator.clipboard.writeText&&window.isSecureContext?navigator.clipboard.writeText(e).then(()=>!0,()=>p(e)):Promise.resolve(p(e))}function p(t){const e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.position="fixed",e.style.top="-1000px",e.style.opacity="0",document.body.appendChild(e);let o=!1;try{e.select(),o=document.execCommand("copy")}catch{o=!1}return e.remove(),o}function C(t){const e=new DOMParser().parseFromString(t,"text/html");return Array.from(e.body.childNodes).map(o=>document.importNode(o,!0))}export function highlightInto(t,e,o){const n=window.hljs;if(!n||!e)return!1;try{const r=o&&n.getLanguage(o)?n.highlight(e,{language:o,ignoreIllegals:!0}).value:n.highlightAuto(e).value;return t.replaceChildren(...C(r)),t.classList.add("hljs"),!0}catch{return!1}}function b(t,e){if(typeof t!="string"||!t)return null;const o=t.trim();if(e&&/^data:image\/[a-z0-9.+-]+;/i.test(o))return o;try{const n=new URL(o,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="mailto:")return n.href}catch{}return null}function x(t){const e=document.createElement("button");return e.type="button",e.className="cb-copy",e.disabled=!0,e.setAttribute("aria-label",t.copyLabel||"copy"),e.title=t.copyLabel||"copy",a(e,d),e}function m(t,e,o,n){const r=t.title;a(t,e),o&&(t.setAttribute("aria-label",o),t.title=o),t.classList.add("done"),window.setTimeout(()=>{a(t,d),t.setAttribute("aria-label",r),t.title=r,t.classList.remove("done")},n)}function y(t,e,o){t.addEventListener("click",()=>{t.disabled||copyText(e.textContent).then(n=>{n?m(t,h,o.copiedLabel||"copied",1400):m(t,d,o.copyFailedLabel||"copy failed",1800)})})}function E(t,e){if(t.types.push(e),e===i.CODE_BLOCK||e===i.CODE_FENCE){const o=t.nodes[t.index],n=document.createElement("div");n.className="codeblock";const r=document.createElement("div");r.className="cb-head";const s=document.createElement("span");s.className="cb-lang";const c=x(t.opts);r.appendChild(s),r.appendChild(c);const u=document.createElement("pre"),l=document.createElement("code");u.appendChild(l),n.appendChild(r),n.appendChild(u),o.appendChild(n),t.nodes[++t.index]=l,t.code={text:"",lang:"",codeEl:l,langEl:s,btn:c,wrap:n},y(c,l,t.opts);return}i.default_add_token(t,e)}function f(t){const e=t.code;e&&(t.opts.highlight!==!1&&highlightInto(e.codeEl,e.text,e.lang),e.wrap.setAttribute("data-lang",e.lang||""),e.wrap.classList.add("closed"),e.btn.disabled=!1)}function w(t){const e=t.types.pop();(e===i.CODE_BLOCK||e===i.CODE_FENCE)&&(f(t),t.code=null),i.default_end_token(t)}function A(t,e){if(t.code){t.code.text+=e,t.code.codeEl.appendChild(document.createTextNode(e));return}if(t.opts.animate){const o=t.animN||0;t.animN=o+1;const n=document.createElement("span");n.className="tk";const r=o%4*20;r&&(n.style.animationDelay=r+"ms"),n.appendChild(document.createTextNode(e)),t.nodes[t.index].appendChild(n);return}i.default_add_text(t,e)}function v(t,e,o){if(t.code&&e===i.LANG){const n=String(o||"").trim().toLowerCase().split(/\s+/)[0]||"";t.code.lang=n,t.code.langEl.textContent=n,n&&(t.code.codeEl.className="language-"+n);return}if(e===i.HREF||e===i.SRC){const n=t.nodes[t.index],r=b(o,e===i.SRC);r&&n&&(e===i.SRC?(n.setAttribute("src",r),n.setAttribute("alt","")):(n.setAttribute("href",r),n.tagName==="A"&&(n.setAttribute("target","_blank"),n.setAttribute("rel","noopener noreferrer"))));return}i.default_set_attr(t,e,o)}export function mountMarkdown(t,e){const o=e||{},n=document.createElement("div");n.className="md",t.appendChild(n);const r={root:n,nodes:[n],index:0,types:[],code:null,opts:o},s=i.parser({data:r,add_token:E,end_token:w,add_text:A,set_attr:v});return{root:n,write(c){i.parser_write(s,String(c??""))},end(){i.parser_end(s),r.code&&(f(r),r.code=null)}}}export function renderMarkdown(t,e,o){const n=mountMarkdown(t,o);return n.write(e),n.end(),n.root}
1
+ import*as i from"./smd.js";import{MdNormalizer as h}from"./js/md-normalize.js";const a='<rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',g='<path d="M20 6 9 17l-5-5"/>';function C(t){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.setAttribute("aria-hidden","true"),e.setAttribute("focusable","false"),e.setAttribute("class","svg-icon");const n=new DOMParser().parseFromString("<svg>"+t+"</svg>","image/svg+xml").documentElement;for(const r of Array.from(n.childNodes))e.appendChild(document.importNode(r,!0));return e}function u(t,e){t.replaceChildren(C(e))}export function copyText(t){const e=String(t??"");return navigator.clipboard&&navigator.clipboard.writeText&&window.isSecureContext?navigator.clipboard.writeText(e).then(()=>!0,()=>p(e)):Promise.resolve(p(e))}function p(t){const e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.position="fixed",e.style.top="-1000px",e.style.opacity="0",document.body.appendChild(e);let o=!1;try{e.select(),o=document.execCommand("copy")}catch{o=!1}return e.remove(),o}function b(t){const e=new DOMParser().parseFromString(t,"text/html");return Array.from(e.body.childNodes).map(o=>document.importNode(o,!0))}export function highlightInto(t,e,o){const n=window.hljs;if(!n||!e)return!1;try{const r=o&&n.getLanguage(o)?n.highlight(e,{language:o,ignoreIllegals:!0}).value:n.highlightAuto(e).value;return t.replaceChildren(...b(r)),t.classList.add("hljs"),!0}catch{return!1}}function w(t,e){if(typeof t!="string"||!t)return null;const o=t.trim();if(e&&/^data:image\/[a-z0-9.+-]+;/i.test(o))return o;try{const n=new URL(o,location.href);if(n.protocol==="http:"||n.protocol==="https:"||n.protocol==="mailto:")return n.href}catch{}return null}function x(t){const e=document.createElement("button");return e.type="button",e.className="cb-copy",e.disabled=!0,e.setAttribute("aria-label",t.copyLabel||"copy"),e.title=t.copyLabel||"copy",u(e,a),e}function m(t,e,o,n){const r=t.title;u(t,e),o&&(t.setAttribute("aria-label",o),t.title=o),t.classList.add("done"),window.setTimeout(()=>{u(t,a),t.setAttribute("aria-label",r),t.title=r,t.classList.remove("done")},n)}function y(t,e,o){t.addEventListener("click",()=>{t.disabled||copyText(e.textContent).then(n=>{n?m(t,g,o.copiedLabel||"copied",1400):m(t,a,o.copyFailedLabel||"copy failed",1800)})})}function E(t,e){if(t.types.push(e),e===i.CODE_BLOCK||e===i.CODE_FENCE){const o=t.nodes[t.index],n=document.createElement("div");n.className="codeblock";const r=document.createElement("div");r.className="cb-head";const s=document.createElement("span");s.className="cb-lang";const c=x(t.opts);r.appendChild(s),r.appendChild(c);const l=document.createElement("pre"),d=document.createElement("code");l.appendChild(d),n.appendChild(r),n.appendChild(l),o.appendChild(n),t.nodes[++t.index]=d,t.code={text:"",lang:"",codeEl:d,langEl:s,btn:c,wrap:n},y(c,d,t.opts);return}i.default_add_token(t,e)}function f(t){const e=t.code;e&&(t.opts.highlight!==!1&&highlightInto(e.codeEl,e.text,e.lang),e.wrap.setAttribute("data-lang",e.lang||""),e.wrap.classList.add("closed"),e.btn.disabled=!1)}function A(t){const e=t.types.pop();(e===i.CODE_BLOCK||e===i.CODE_FENCE)&&(f(t),t.code=null),i.default_end_token(t)}function N(t,e){if(t.code){t.code.text+=e,t.code.codeEl.appendChild(document.createTextNode(e));return}if(t.opts.animate){const o=t.animN||0;t.animN=o+1;const n=document.createElement("span");n.className="tk";const r=o%4*20;r&&(n.style.animationDelay=r+"ms"),n.appendChild(document.createTextNode(e)),t.nodes[t.index].appendChild(n);return}i.default_add_text(t,e)}function v(t,e,o){if(t.code&&e===i.LANG){const n=String(o||"").trim().toLowerCase().split(/\s+/)[0]||"";t.code.lang=n,t.code.langEl.textContent=n,n&&(t.code.codeEl.className="language-"+n);return}if(e===i.HREF||e===i.SRC){const n=t.nodes[t.index],r=w(o,e===i.SRC);r&&n&&(e===i.SRC?(n.setAttribute("src",r),n.setAttribute("alt","")):(n.setAttribute("href",r),n.tagName==="A"&&(n.setAttribute("target","_blank"),n.setAttribute("rel","noopener noreferrer"))));return}i.default_set_attr(t,e,o)}export function mountMarkdown(t,e){const o=e||{},n=document.createElement("div");n.className="md",t.appendChild(n);const r={root:n,nodes:[n],index:0,types:[],code:null,opts:o},s=i.parser({data:r,add_token:E,end_token:A,add_text:N,set_attr:v}),c=new h;return{root:n,write(l){i.parser_write(s,c.push(String(l??"")))},end(){i.parser_write(s,c.flush()),i.parser_end(s),r.code&&(f(r),r.code=null)}}}export function renderMarkdown(t,e,o){const n=mountMarkdown(t,o);return n.write(e),n.end(),n.root}