@openchambery/web 1.19.19-beta.1 → 1.19.19

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 (51) hide show
  1. package/dist/assets/{AssistantView-DzLbHxG4.js → AssistantView-DaQygS2g.js} +3 -3
  2. package/dist/assets/{DiagramView-DKYXGEGY.js → DiagramView-DU13N_4L.js} +1 -1
  3. package/dist/assets/MarkdownRenderer-CQHRhqB1.js +2 -0
  4. package/dist/assets/MarkdownRendererImpl-CfPlhzKB.js +10 -0
  5. package/dist/assets/MarkstreamRendererImpl-BZu0kqan.js +3 -0
  6. package/dist/assets/{MobileDetailNavigation-DJt-_lQH.js → MobileDetailNavigation-DeLsBXQl.js} +1 -1
  7. package/dist/assets/{MobileShareBridge-BwGTFw94.js → MobileShareBridge-6jsuuuL-.js} +1 -1
  8. package/dist/assets/MobileSurface-DCP4BC35.js +2 -0
  9. package/dist/assets/{MultiRunWindow-BEf4sNll.js → MultiRunWindow-EN15uCln.js} +1 -1
  10. package/dist/assets/{SettingsView-C0Ks6Imq.js → SettingsView-Cm-fwFNM.js} +1 -1
  11. package/dist/assets/{SettingsWindow-B4sFTpds.js → SettingsWindow-CSBXDRrg.js} +1 -1
  12. package/dist/assets/{TerminalView-BSu-5rph.js → TerminalView-CWRwefBO.js} +1 -1
  13. package/dist/assets/{ToolOutputDialog-cYGNEssJ.js → ToolOutputDialog-CJFSAiw6.js} +1 -1
  14. package/dist/assets/{appThemeRegistry-4Eidkdwf.js → appThemeRegistry-BCBPxOn0.js} +1 -1
  15. package/dist/assets/{fileMentionTouchSelection-DWGooirf.js → fileMentionTouchSelection-LxAU-jJG.js} +1 -1
  16. package/dist/assets/{gitApi-BVmIm__-.js → gitApi-BSN7ZfSp.js} +1 -1
  17. package/dist/assets/{insertionBoundaries-DnU5095a.js → insertionBoundaries-DiTLBzlO.js} +1 -1
  18. package/dist/assets/{main-DnUeA6xl.js → main-BbJQ9Vtx.js} +2 -2
  19. package/dist/assets/main-DFRHWaDr.js +169 -0
  20. package/dist/assets/{miniChat-COUGQv_j.js → miniChat-DaZ0MUes.js} +2 -2
  21. package/dist/assets/{mobile-C5MOyIJ0.js → mobile-ctmwtKIg.js} +2 -2
  22. package/dist/assets/{multirun-CIZIv7p7.js → multirun-9Z45iiC7.js} +1 -1
  23. package/dist/assets/{projectMeta-BYicrg5a.js → projectMeta-CIGtyoau.js} +1 -1
  24. package/dist/assets/{renderElectronMiniChatApp-hc3iIeQm.js → renderElectronMiniChatApp-Bpmux7pj.js} +2 -2
  25. package/dist/assets/{renderMobileApp-B1ukSj4I.js → renderMobileApp-DYlwZgHu.js} +4 -4
  26. package/dist/assets/{runtimeConfig-CfiNX02L.js → runtimeConfig-B0raYq9L.js} +1 -1
  27. package/dist/assets/{runtimeEndpointReset-CiVPaJ0l.js → runtimeEndpointReset-D09YtB1G.js} +1 -1
  28. package/dist/assets/{sessionLookup-i6lguiZs.js → sessionLookup-CBlhAA0q.js} +1 -1
  29. package/dist/assets/{useAppFontEffects-BPcZ0xYI.js → useAppFontEffects-CDbz3983.js} +5 -5
  30. package/dist/assets/{useDesktopWindowControlsLayout-DynbSs7l.js → useDesktopWindowControlsLayout-DNqYfyg5.js} +1 -1
  31. package/dist/assets/{useEffectiveDirectory-CuPv_Spa.js → useEffectiveDirectory-B_8RoAcb.js} +1 -1
  32. package/dist/assets/{useMobileNavigationStore-D-y0Rt9A.js → useMobileNavigationStore-Btsf88wS.js} +2 -2
  33. package/dist/assets/{useSessionAutoCleanup-GXVBo-n8.js → useSessionAutoCleanup-B7uBJZxU.js} +1 -1
  34. package/dist/assets/{useWorkerHighlightedLines-CvckSPzG.js → useWorkerHighlightedLines-CPzF9843.js} +1 -1
  35. package/dist/index.html +2 -2
  36. package/dist/mini-chat.html +2 -2
  37. package/dist/mobile.html +2 -2
  38. package/package.json +1 -1
  39. package/server/lib/question-auto-delegate/DOCUMENTATION.md +1 -1
  40. package/server/lib/question-auto-delegate/core.test.js +20 -0
  41. package/server/lib/relay/DOCUMENTATION.md +5 -3
  42. package/server/lib/relay/tunnel-host.js +24 -1
  43. package/server/lib/relay/tunnel-host.test.js +67 -1
  44. package/server/lib/ui-auth/DOCUMENTATION.md +1 -0
  45. package/server/lib/ui-auth/ui-auth.js +10 -1
  46. package/server/lib/ui-auth/ui-auth.test.js +21 -0
  47. package/dist/assets/MarkdownRenderer-CtmVLnAd.js +0 -2
  48. package/dist/assets/MarkdownRendererImpl-Cqx43iX3.js +0 -10
  49. package/dist/assets/MarkstreamRendererImpl-BPbyoQOQ.js +0 -3
  50. package/dist/assets/MobileSurface-BVhZRggJ.js +0 -2
  51. package/dist/assets/main-VrW7l_A4.js +0 -169
@@ -1,4 +1,4 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./runtime-fetch-zIalUnbb.js";import{Cn as n,tn as r}from"./persistence-DwRBC4zl.js";import{nt as i,rt as a}from"./vendor-base-ui-CnHfUmDN.js";import{n as o}from"./platform-DQ5_LNKO.js";import{_ as s}from"./useUIStore-CxOoCv7B.js";import{a as c,n as l}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{n as u}from"./vendor-react-DLPElpoQ.js";import{f as d,r as f,t as p}from"./button-B1A-UMjO.js";import{n as m}from"./Icon-B5uh1TBO.js";import{i as h,n as g,t as _}from"./tooltip-C5FMIBsd.js";import{n as v}from"./useThemeSystem-DMzWVJaW.js";import{n as y}from"./markdownTheme-DOfGg-A7.js";import{n as b}from"./MarkdownRenderer-CtmVLnAd.js";import{a as x,n as S,o as C,t as w}from"./markdown-worker-CptoICmq.js";import{a as T,i as E,o as D,t as ee}from"./imageSource-BlAJJUEI.js";import{t as te}from"./vendor-tanstack-react-virtual-tlDgH6PG.js";var O=e(a(),1),k=u(),A=i(),ne=`w-[min(30rem,calc(100cqw-1rem))] min-w-[280px] max-w-full overflow-hidden rounded-xl shadow-[inset_0_1px_0_0_rgba(255,255,255,0.8),inset_0_0_0_1px_rgba(0,0,0,0.04),0_0_0_1px_rgba(0,0,0,0.10),0_1px_2px_-0.5px_rgba(0,0,0,0.08),0_4px_8px_-2px_rgba(0,0,0,0.08),0_12px_20px_-4px_rgba(0,0,0,0.08)] dark:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.12),inset_0_0_0_1px_rgba(255,255,255,0.08),0_0_0_1px_rgba(0,0,0,0.36),0_1px_1px_-0.5px_rgba(0,0,0,0.22),0_3px_3px_-1.5px_rgba(0,0,0,0.20),0_6px_6px_-3px_rgba(0,0,0,0.16)]`,j={maxWidth:`min(28rem, calc(100cqw - 4ch))`,backgroundColor:`var(--surface-elevated)`,color:`var(--surface-elevated-foreground)`},M=`flex items-center justify-between gap-3 border-b border-[var(--surface-subtle)] px-3 py-2.5`,N=`text-xs font-medium leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,re=`text-xs tabular-nums leading-4 text-muted-foreground md:text-[0.8125rem] md:leading-5`,P=`m-0 list-none divide-y divide-[var(--surface-subtle)] p-0`,F=`${P} max-h-[min(22rem,50vh)] overflow-y-auto`,ie=`${P} w-full`,ae={className:`p-0 rounded-none`,maxHeightClass:`max-h-[46vh]`,disableHorizontal:!0},I=`px-2.5 py-1.5 text-xs leading-4 md:py-2 md:text-[0.8125rem] md:leading-5`,oe=`flex min-w-0 items-center gap-1 text-xs leading-4 text-muted-foreground md:gap-1.5 md:text-[0.8125rem] md:leading-5`,se=`min-w-0 truncate text-xs leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,ce=`inline-flex shrink-0 items-center gap-1 text-xs leading-4 tabular-nums text-muted-foreground md:text-[0.8125rem] md:leading-5`,le=`h-3 w-3 shrink-0 md:h-3.5 md:w-3.5`,ue={in_progress:`text-foreground`,pending:`text-foreground`,completed:`text-muted-foreground line-through`,cancelled:`text-muted-foreground line-through`},L={in_progress:`chat.statusRow.todo.status.inProgress`,pending:`chat.statusRow.todo.status.pending`,completed:`chat.statusRow.todo.status.completed`,cancelled:`chat.statusRow.todo.status.cancelled`},R=e=>{let t=(0,k.c)(26),{todo:n,isActive:r,activeRef:i}=e,{t:a}=d(),o=z.has(n.status)?n.status:`pending`,s=L[o],c;t[0]!==a||t[1]!==s?(c=a(s),t[0]=a,t[1]=s,t[2]=c):c=t[2];let l=c,u;t[3]===o?u=t[4]:(u=o===`in_progress`?(0,A.jsx)(m,{name:`record-circle`,className:`h-3.5 w-3.5 text-[var(--status-info)]`,"aria-hidden":`true`}):o===`completed`?(0,A.jsx)(m,{name:`checkbox-circle`,className:`h-3.5 w-3.5 text-[var(--status-success)]`,"aria-hidden":`true`}):(0,A.jsx)(m,{name:`time`,className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),t[3]=o,t[4]=u);let p=u,v=r?`step`:void 0,y=r&&`bg-[var(--surface-muted)] before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-[var(--status-info)]`,b;t[5]===y?b=t[6]:(b=f(`group relative grid min-w-0 grid-cols-[1rem_minmax(0,1fr)] items-start gap-2.5`,I,y),t[5]=y,t[6]=b);let x;t[7]!==p||t[8]!==l?(x=(0,A.jsx)(h,{asChild:!0,children:(0,A.jsx)(`span`,{className:`flex size-4 items-center justify-center`,"aria-label":l,children:p})}),t[7]=p,t[8]=l,t[9]=x):x=t[9];let S;t[10]===l?S=t[11]:(S=(0,A.jsx)(g,{side:`left`,sideOffset:6,children:l}),t[10]=l,t[11]=S);let C;t[12]!==x||t[13]!==S?(C=(0,A.jsxs)(_,{children:[x,S]}),t[12]=x,t[13]=S,t[14]=C):C=t[14];let w=ue[o],T;t[15]===w?T=t[16]:(T=f(`block whitespace-normal break-words`,w),t[15]=w,t[16]=T);let E;t[17]!==T||t[18]!==n.content?(E=(0,A.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,A.jsx)(`span`,{className:T,children:n.content})}),t[17]=T,t[18]=n.content,t[19]=E):E=t[19];let D;return t[20]!==i||t[21]!==E||t[22]!==v||t[23]!==b||t[24]!==C?(D=(0,A.jsxs)(`li`,{ref:i,"aria-current":v,className:b,children:[C,E]}),t[20]=i,t[21]=E,t[22]=v,t[23]=b,t[24]=C,t[25]=D):D=t[25],D},z=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),B=`image/png`,V=c(`OpenChamberMedia`),H=e=>{let t=e.toLowerCase().split(`;`)[0]?.trim()||B;if(t===`image/jpeg`||t===`image/jpg`)return`jpg`;if(t===`image/webp`)return`webp`;if(t===`image/gif`)return`gif`;if(t===`image/svg+xml`)return`svg`;if(t===`image/png`)return`png`;let n=t.split(`/`)[1];return n&&/^[a-z0-9.+-]+$/i.test(n)?n:`png`},U=(e,t)=>{let n=`image.${H(t)}`,r=(((e||``).trim()||n).split(/[\\/]/).pop()||n).replace(/[^\w.\- ()[\]]+/g,`_`).replace(/^\.+/,``);return r?/\.[a-z0-9]{1,8}$/i.test(r)?r:`${r}.${H(t)}`:n},W=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{if(typeof r.result==`string`){t(r.result);return}n(Error(`Failed to encode image`))},r.onerror=()=>n(r.error??Error(`Failed to encode image`)),r.readAsDataURL(e)}),de=async e=>{let t=await W(e),n=t.indexOf(`,`);return n>=0?t.slice(n+1):t},fe=(e,t)=>{let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.setTimeout(()=>URL.revokeObjectURL(n),1e3)},G=async(e,t)=>{let n=await fetch(e,{signal:t,cache:`no-store`});if(!n.ok)throw Error(`Image fetch failed (${n.status})`);return n.blob()},pe=async(e,t=B)=>{if(!e.naturalWidth||!e.naturalHeight)return null;let n=e.currentSrc||e.src;if(n&&(/^(?:blob:|data:|openchamber-asset:)/i.test(n)||/^https?:/i.test(n)||/^\/api(?=\/|[?#]|$)/.test(n)))try{let e=await G(n);if(e.size>0)return e}catch{}try{let n=document.createElement(`canvas`);n.width=e.naturalWidth,n.height=e.naturalHeight;let r=n.getContext(`2d`);if(!r)return null;r.drawImage(e,0,0);let i=t.startsWith(`image/`)?t:B,a=await new Promise(e=>{n.toBlob(t=>e(t),i===`image/jpg`?`image/jpeg`:i)});return a&&a.size>0?a:null}catch{return null}},me=async(e,t)=>{let n=``;try{return n=await ee(e,t??new AbortController().signal),await G(n,t)}finally{n&&T(n)}},he=async(e,n)=>{let r=e.effectiveDirectory??``,i=null;e.prefetchedBlob&&e.prefetchedBlob.size>0&&(i=e.prefetchedBlob);let a=e.displayUrl?.trim();if(!i&&a)try{i=await G(a,n)}catch{i=null}if(!i){let a=e.sourceUrl.trim();if(!a)throw Error(`Image source is empty`);if(/^(?:data|blob):/i.test(a)||/^https?:/i.test(a)||/^\/api(?=\/|[?#]|$)/.test(a))i=await G(a,n);else{let e=D(a,r);if(E(e))try{i=await me(e.path,n)}catch{let r=await t(`/api/fs/raw`,{method:`GET`,cache:`no-store`,query:{path:e.path},signal:n});if(!r.ok)throw Error(`Image source request failed with status ${r.status}`);i=await r.blob()}else i=await G(e.source,n)}}if(!i||i.size<=0)throw Error(`Image is empty`);let o=(e.mimeType||(i.type&&i.type.startsWith(`image/`)?i.type:``)||B).split(`;`)[0].trim()||B;return{blob:i,filename:U(e.filename,o),mimeType:o}},ge=()=>!o()||l===void 0?!1:l.isPluginAvailable(`OpenChamberMedia`),_e=async(e,t)=>{let{blob:i,filename:a,mimeType:o}=await he(e,t);if(ge()){let e=await de(i);return await V.saveImage({dataBase64:e,mimeType:o,filename:a}),`saved`}if(r()){let e=n()?.vscode;if(e?.saveImage){let t=await W(i);return await e.saveImage({fileName:a,dataUrl:t}),`saved`}}return fe(i,a),`downloaded`},ve=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`),ye=e=>e?Object.entries(e).map(([e,t])=>t==null?``:`${e.startsWith(`--`)?e:e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}:${typeof t==`number`?`${t}px`:t};`).join(``):``,K=(e,t,n)=>{let r=e.querySelector(`pre`);r&&(r.style.margin=`0`,r.style.background=`transparent`,r.style.whiteSpace=t?`pre-wrap`:`pre`,t&&(r.style.wordBreak=`break-word`,r.style.overflowWrap=`break-word`));let i=e.querySelector(`code`);if(i){let e=ye(n);e&&i.setAttribute(`style`,`${i.getAttribute(`style`)??``}${e}`)}},be=e=>`<pre><code>${ve(e)}</code></pre>`,xe=e=>{let t=(0,k.c)(21),{code:n,language:r,className:i,style:a,codeStyle:o,wrap:s}=e,c=s!==void 0&&s,{currentTheme:l}=v(),u=O.useRef(null),d;t[0]===l?d=t[1]:(d=y(l),t[0]=l,t[1]=d);let p=d,m,h;t[2]!==n||t[3]!==o||t[4]!==c?(m=()=>{let e=u.current;e&&(e.innerHTML=be(n),K(e,c,o))},h=[n,c,o],t[2]=n,t[3]=o,t[4]=c,t[5]=m,t[6]=h):(m=t[5],h=t[6]),O.useLayoutEffect(m,h);let g,_;t[7]!==n||t[8]!==o||t[9]!==r||t[10]!==c?(g=()=>{let e=u.current;if(!e)return;let t=!0,i=new AbortController;return w(n,(r||`text`).toLowerCase(),{signal:i.signal,priority:`visible`}).then(n=>{!t||!e||!n||(e.innerHTML=n,K(e,c,o))}),()=>{t=!1,i.abort()}},_=[n,r,c,o],t[7]=n,t[8]=o,t[9]=r,t[10]=c,t[11]=g,t[12]=_):(g=t[11],_=t[12]),O.useEffect(g,_);let b;t[13]===i?b=t[14]:(b=f(`typography-code`,i),t[13]=i,t[14]=b);let x=p,S;t[15]!==a||t[16]!==x?(S={...x,...a},t[15]=a,t[16]=x,t[17]=S):S=t[17];let C;return t[18]!==b||t[19]!==S?(C=(0,A.jsx)(`div`,{ref:u,className:b,style:S}),t[18]=b,t[19]=S,t[20]=C):C=t[20],C},Se=e=>{let t=e.replace(/^<file>\s*\n?/,``).replace(/\n?<\/file>\s*$/,``);return t=t.replace(/^\s*\d{5}\|\s?/gm,``),t.trim()},Ce=(e,t=``)=>{if(typeof e==`string`)return e;if(e==null)return t;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);try{return JSON.stringify(e)}catch{return t}},we=e=>e?e.includes(`<diagnostics`)||e.includes(`<file_diagnostics>`)||e.includes(`LSP errors detected`)||e.includes(`This file has errors`):!1,Te=e=>e?e.replace(/\n{0,2}LSP errors detected[\s\S]*?<diagnostics[^>]*>[\s\S]*?<\/diagnostics>/g,``).replace(/\n{0,2}This file has errors[\s\S]*?<\/file_diagnostics>/g,``).replace(/<diagnostics[^>]*>[\s\S]*?<\/diagnostics>/g,``).replace(/<file_diagnostics>[\s\S]*?<\/file_diagnostics>/g,``).trim():``,Ee=(e,t)=>!e||typeof e!=`object`?String(e):C(e,t||``),q=e=>{if(typeof e==`string`){let t=e.trim();return t.length>0?t:void 0}if(e&&typeof e==`object`){let t=e.patch;if(typeof t==`string`){let e=t.trim();return e.length>0?e:void 0}}},De=e=>{if(!e||typeof e!=`object`)return;let t=q(e.patch)??q(e.diff);if(t)return t;let n=Array.isArray(e.files)?e.files:[];for(let e of n){if(!e||typeof e!=`object`)continue;let t=q(e.patch)??q(e.diff);if(t)return t}},Oe=e=>{if(!e||typeof e!=`string`)return{data:null,isJson:!1};let t=e.trim();if(!t.startsWith(`{`)&&!t.startsWith(`[`)||!t.endsWith(`}`)&&!t.endsWith(`]`)||t.length<2)return{data:null,isJson:!1};try{let e=JSON.parse(t);return typeof e==`object`&&e?{data:e,isJson:!0}:{data:null,isJson:!1}}catch{return{data:null,isJson:!1}}},ke=(e,t,n)=>{let r=Se(e);if((t===`edit`||t===`multiedit`||t===`write`||t===`apply_patch`)&&we(r)&&(r=Te(r)),(t===`edit`||t===`multiedit`||t===`apply_patch`)&&r.trim().length===0){let e=De(n);if(e)return e}return r},Ae=e=>{let t=e.match(/<type>(file|directory)<\/type>/i)?.[1]?.toLowerCase()??`unknown`,n=(e.match(/<content>([\s\S]*?)<\/content>/i)?.[1]??e).replace(/\r\n/g,`
1
+ import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./runtime-fetch-zIalUnbb.js";import{Cn as n,tn as r}from"./persistence-DwRBC4zl.js";import{nt as i,rt as a}from"./vendor-base-ui-CnHfUmDN.js";import{n as o}from"./platform-DQ5_LNKO.js";import{_ as s}from"./useUIStore-CxOoCv7B.js";import{a as c,n as l}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{n as u}from"./vendor-react-DLPElpoQ.js";import{f as d,r as f,t as p}from"./button-B1A-UMjO.js";import{n as m}from"./Icon-B5uh1TBO.js";import{i as h,n as g,t as _}from"./tooltip-C5FMIBsd.js";import{n as v}from"./useThemeSystem-DMzWVJaW.js";import{n as y}from"./markdownTheme-DOfGg-A7.js";import{n as b}from"./MarkdownRenderer-CQHRhqB1.js";import{a as x,n as S,o as C,t as w}from"./markdown-worker-CptoICmq.js";import{a as T,i as E,o as D,t as ee}from"./imageSource-BlAJJUEI.js";import{t as te}from"./vendor-tanstack-react-virtual-tlDgH6PG.js";var O=e(a(),1),k=u(),A=i(),ne=`w-[min(30rem,calc(100cqw-1rem))] min-w-[280px] max-w-full overflow-hidden rounded-xl shadow-[inset_0_1px_0_0_rgba(255,255,255,0.8),inset_0_0_0_1px_rgba(0,0,0,0.04),0_0_0_1px_rgba(0,0,0,0.10),0_1px_2px_-0.5px_rgba(0,0,0,0.08),0_4px_8px_-2px_rgba(0,0,0,0.08),0_12px_20px_-4px_rgba(0,0,0,0.08)] dark:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.12),inset_0_0_0_1px_rgba(255,255,255,0.08),0_0_0_1px_rgba(0,0,0,0.36),0_1px_1px_-0.5px_rgba(0,0,0,0.22),0_3px_3px_-1.5px_rgba(0,0,0,0.20),0_6px_6px_-3px_rgba(0,0,0,0.16)]`,j={maxWidth:`min(28rem, calc(100cqw - 4ch))`,backgroundColor:`var(--surface-elevated)`,color:`var(--surface-elevated-foreground)`},M=`flex items-center justify-between gap-3 border-b border-[var(--surface-subtle)] px-3 py-2.5`,N=`text-xs font-medium leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,re=`text-xs tabular-nums leading-4 text-muted-foreground md:text-[0.8125rem] md:leading-5`,P=`m-0 list-none divide-y divide-[var(--surface-subtle)] p-0`,F=`${P} max-h-[min(22rem,50vh)] overflow-y-auto`,ie=`${P} w-full`,ae={className:`p-0 rounded-none`,maxHeightClass:`max-h-[46vh]`,disableHorizontal:!0},I=`px-2.5 py-1.5 text-xs leading-4 md:py-2 md:text-[0.8125rem] md:leading-5`,oe=`flex min-w-0 items-center gap-1 text-xs leading-4 text-muted-foreground md:gap-1.5 md:text-[0.8125rem] md:leading-5`,se=`min-w-0 truncate text-xs leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,ce=`inline-flex shrink-0 items-center gap-1 text-xs leading-4 tabular-nums text-muted-foreground md:text-[0.8125rem] md:leading-5`,le=`h-3 w-3 shrink-0 md:h-3.5 md:w-3.5`,ue={in_progress:`text-foreground`,pending:`text-foreground`,completed:`text-muted-foreground line-through`,cancelled:`text-muted-foreground line-through`},L={in_progress:`chat.statusRow.todo.status.inProgress`,pending:`chat.statusRow.todo.status.pending`,completed:`chat.statusRow.todo.status.completed`,cancelled:`chat.statusRow.todo.status.cancelled`},R=e=>{let t=(0,k.c)(26),{todo:n,isActive:r,activeRef:i}=e,{t:a}=d(),o=z.has(n.status)?n.status:`pending`,s=L[o],c;t[0]!==a||t[1]!==s?(c=a(s),t[0]=a,t[1]=s,t[2]=c):c=t[2];let l=c,u;t[3]===o?u=t[4]:(u=o===`in_progress`?(0,A.jsx)(m,{name:`record-circle`,className:`h-3.5 w-3.5 text-[var(--status-info)]`,"aria-hidden":`true`}):o===`completed`?(0,A.jsx)(m,{name:`checkbox-circle`,className:`h-3.5 w-3.5 text-[var(--status-success)]`,"aria-hidden":`true`}):(0,A.jsx)(m,{name:`time`,className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),t[3]=o,t[4]=u);let p=u,v=r?`step`:void 0,y=r&&`bg-[var(--surface-muted)] before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-[var(--status-info)]`,b;t[5]===y?b=t[6]:(b=f(`group relative grid min-w-0 grid-cols-[1rem_minmax(0,1fr)] items-start gap-2.5`,I,y),t[5]=y,t[6]=b);let x;t[7]!==p||t[8]!==l?(x=(0,A.jsx)(h,{asChild:!0,children:(0,A.jsx)(`span`,{className:`flex size-4 items-center justify-center`,"aria-label":l,children:p})}),t[7]=p,t[8]=l,t[9]=x):x=t[9];let S;t[10]===l?S=t[11]:(S=(0,A.jsx)(g,{side:`left`,sideOffset:6,children:l}),t[10]=l,t[11]=S);let C;t[12]!==x||t[13]!==S?(C=(0,A.jsxs)(_,{children:[x,S]}),t[12]=x,t[13]=S,t[14]=C):C=t[14];let w=ue[o],T;t[15]===w?T=t[16]:(T=f(`block whitespace-normal break-words`,w),t[15]=w,t[16]=T);let E;t[17]!==T||t[18]!==n.content?(E=(0,A.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,A.jsx)(`span`,{className:T,children:n.content})}),t[17]=T,t[18]=n.content,t[19]=E):E=t[19];let D;return t[20]!==i||t[21]!==E||t[22]!==v||t[23]!==b||t[24]!==C?(D=(0,A.jsxs)(`li`,{ref:i,"aria-current":v,className:b,children:[C,E]}),t[20]=i,t[21]=E,t[22]=v,t[23]=b,t[24]=C,t[25]=D):D=t[25],D},z=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),B=`image/png`,V=c(`OpenChamberMedia`),H=e=>{let t=e.toLowerCase().split(`;`)[0]?.trim()||B;if(t===`image/jpeg`||t===`image/jpg`)return`jpg`;if(t===`image/webp`)return`webp`;if(t===`image/gif`)return`gif`;if(t===`image/svg+xml`)return`svg`;if(t===`image/png`)return`png`;let n=t.split(`/`)[1];return n&&/^[a-z0-9.+-]+$/i.test(n)?n:`png`},U=(e,t)=>{let n=`image.${H(t)}`,r=(((e||``).trim()||n).split(/[\\/]/).pop()||n).replace(/[^\w.\- ()[\]]+/g,`_`).replace(/^\.+/,``);return r?/\.[a-z0-9]{1,8}$/i.test(r)?r:`${r}.${H(t)}`:n},W=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{if(typeof r.result==`string`){t(r.result);return}n(Error(`Failed to encode image`))},r.onerror=()=>n(r.error??Error(`Failed to encode image`)),r.readAsDataURL(e)}),de=async e=>{let t=await W(e),n=t.indexOf(`,`);return n>=0?t.slice(n+1):t},fe=(e,t)=>{let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.setTimeout(()=>URL.revokeObjectURL(n),1e3)},G=async(e,t)=>{let n=await fetch(e,{signal:t,cache:`no-store`});if(!n.ok)throw Error(`Image fetch failed (${n.status})`);return n.blob()},pe=async(e,t=B)=>{if(!e.naturalWidth||!e.naturalHeight)return null;let n=e.currentSrc||e.src;if(n&&(/^(?:blob:|data:|openchamber-asset:)/i.test(n)||/^https?:/i.test(n)||/^\/api(?=\/|[?#]|$)/.test(n)))try{let e=await G(n);if(e.size>0)return e}catch{}try{let n=document.createElement(`canvas`);n.width=e.naturalWidth,n.height=e.naturalHeight;let r=n.getContext(`2d`);if(!r)return null;r.drawImage(e,0,0);let i=t.startsWith(`image/`)?t:B,a=await new Promise(e=>{n.toBlob(t=>e(t),i===`image/jpg`?`image/jpeg`:i)});return a&&a.size>0?a:null}catch{return null}},me=async(e,t)=>{let n=``;try{return n=await ee(e,t??new AbortController().signal),await G(n,t)}finally{n&&T(n)}},he=async(e,n)=>{let r=e.effectiveDirectory??``,i=null;e.prefetchedBlob&&e.prefetchedBlob.size>0&&(i=e.prefetchedBlob);let a=e.displayUrl?.trim();if(!i&&a)try{i=await G(a,n)}catch{i=null}if(!i){let a=e.sourceUrl.trim();if(!a)throw Error(`Image source is empty`);if(/^(?:data|blob):/i.test(a)||/^https?:/i.test(a)||/^\/api(?=\/|[?#]|$)/.test(a))i=await G(a,n);else{let e=D(a,r);if(E(e))try{i=await me(e.path,n)}catch{let r=await t(`/api/fs/raw`,{method:`GET`,cache:`no-store`,query:{path:e.path},signal:n});if(!r.ok)throw Error(`Image source request failed with status ${r.status}`);i=await r.blob()}else i=await G(e.source,n)}}if(!i||i.size<=0)throw Error(`Image is empty`);let o=(e.mimeType||(i.type&&i.type.startsWith(`image/`)?i.type:``)||B).split(`;`)[0].trim()||B;return{blob:i,filename:U(e.filename,o),mimeType:o}},ge=()=>!o()||l===void 0?!1:l.isPluginAvailable(`OpenChamberMedia`),_e=async(e,t)=>{let{blob:i,filename:a,mimeType:o}=await he(e,t);if(ge()){let e=await de(i);return await V.saveImage({dataBase64:e,mimeType:o,filename:a}),`saved`}if(r()){let e=n()?.vscode;if(e?.saveImage){let t=await W(i);return await e.saveImage({fileName:a,dataUrl:t}),`saved`}}return fe(i,a),`downloaded`},ve=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`),ye=e=>e?Object.entries(e).map(([e,t])=>t==null?``:`${e.startsWith(`--`)?e:e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}:${typeof t==`number`?`${t}px`:t};`).join(``):``,K=(e,t,n)=>{let r=e.querySelector(`pre`);r&&(r.style.margin=`0`,r.style.background=`transparent`,r.style.whiteSpace=t?`pre-wrap`:`pre`,t&&(r.style.wordBreak=`break-word`,r.style.overflowWrap=`break-word`));let i=e.querySelector(`code`);if(i){let e=ye(n);e&&i.setAttribute(`style`,`${i.getAttribute(`style`)??``}${e}`)}},be=e=>`<pre><code>${ve(e)}</code></pre>`,xe=e=>{let t=(0,k.c)(21),{code:n,language:r,className:i,style:a,codeStyle:o,wrap:s}=e,c=s!==void 0&&s,{currentTheme:l}=v(),u=O.useRef(null),d;t[0]===l?d=t[1]:(d=y(l),t[0]=l,t[1]=d);let p=d,m,h;t[2]!==n||t[3]!==o||t[4]!==c?(m=()=>{let e=u.current;e&&(e.innerHTML=be(n),K(e,c,o))},h=[n,c,o],t[2]=n,t[3]=o,t[4]=c,t[5]=m,t[6]=h):(m=t[5],h=t[6]),O.useLayoutEffect(m,h);let g,_;t[7]!==n||t[8]!==o||t[9]!==r||t[10]!==c?(g=()=>{let e=u.current;if(!e)return;let t=!0,i=new AbortController;return w(n,(r||`text`).toLowerCase(),{signal:i.signal,priority:`visible`}).then(n=>{!t||!e||!n||(e.innerHTML=n,K(e,c,o))}),()=>{t=!1,i.abort()}},_=[n,r,c,o],t[7]=n,t[8]=o,t[9]=r,t[10]=c,t[11]=g,t[12]=_):(g=t[11],_=t[12]),O.useEffect(g,_);let b;t[13]===i?b=t[14]:(b=f(`typography-code`,i),t[13]=i,t[14]=b);let x=p,S;t[15]!==a||t[16]!==x?(S={...x,...a},t[15]=a,t[16]=x,t[17]=S):S=t[17];let C;return t[18]!==b||t[19]!==S?(C=(0,A.jsx)(`div`,{ref:u,className:b,style:S}),t[18]=b,t[19]=S,t[20]=C):C=t[20],C},Se=e=>{let t=e.replace(/^<file>\s*\n?/,``).replace(/\n?<\/file>\s*$/,``);return t=t.replace(/^\s*\d{5}\|\s?/gm,``),t.trim()},Ce=(e,t=``)=>{if(typeof e==`string`)return e;if(e==null)return t;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);try{return JSON.stringify(e)}catch{return t}},we=e=>e?e.includes(`<diagnostics`)||e.includes(`<file_diagnostics>`)||e.includes(`LSP errors detected`)||e.includes(`This file has errors`):!1,Te=e=>e?e.replace(/\n{0,2}LSP errors detected[\s\S]*?<diagnostics[^>]*>[\s\S]*?<\/diagnostics>/g,``).replace(/\n{0,2}This file has errors[\s\S]*?<\/file_diagnostics>/g,``).replace(/<diagnostics[^>]*>[\s\S]*?<\/diagnostics>/g,``).replace(/<file_diagnostics>[\s\S]*?<\/file_diagnostics>/g,``).trim():``,Ee=(e,t)=>!e||typeof e!=`object`?String(e):C(e,t||``),q=e=>{if(typeof e==`string`){let t=e.trim();return t.length>0?t:void 0}if(e&&typeof e==`object`){let t=e.patch;if(typeof t==`string`){let e=t.trim();return e.length>0?e:void 0}}},De=e=>{if(!e||typeof e!=`object`)return;let t=q(e.patch)??q(e.diff);if(t)return t;let n=Array.isArray(e.files)?e.files:[];for(let e of n){if(!e||typeof e!=`object`)continue;let t=q(e.patch)??q(e.diff);if(t)return t}},Oe=e=>{if(!e||typeof e!=`string`)return{data:null,isJson:!1};let t=e.trim();if(!t.startsWith(`{`)&&!t.startsWith(`[`)||!t.endsWith(`}`)&&!t.endsWith(`]`)||t.length<2)return{data:null,isJson:!1};try{let e=JSON.parse(t);return typeof e==`object`&&e?{data:e,isJson:!0}:{data:null,isJson:!1}}catch{return{data:null,isJson:!1}}},ke=(e,t,n)=>{let r=Se(e);if((t===`edit`||t===`multiedit`||t===`write`||t===`apply_patch`)&&we(r)&&(r=Te(r)),(t===`edit`||t===`multiedit`||t===`apply_patch`)&&r.trim().length===0){let e=De(n);if(e)return e}return r},Ae=e=>{let t=e.match(/<type>(file|directory)<\/type>/i)?.[1]?.toLowerCase()??`unknown`,n=(e.match(/<content>([\s\S]*?)<\/content>/i)?.[1]??e).replace(/\r\n/g,`
2
2
  `).split(`
3
3
  `),r=e=>/\(\s*File has more lines\..*offset.*\)/i.test(e.trim());return{type:t,lines:n.map(e=>{let n=e.trim(),i=n.startsWith(`(`)&&n.endsWith(`)`)||r(n);if(t!==`directory`){let t=e.match(/^(\d+):\s?(.*)$/);if(t){let e=t[2],n=e.trim(),i=n.startsWith(`(`)&&n.endsWith(`)`)||r(n);return{lineNumber:i?null:Number(t[1]),text:e,isInfo:i}}}return{lineNumber:null,text:e,isInfo:i}}).filter((e,t,n)=>{if(e.text.trim().length>0)return!0;let r=n[t-1],i=n[t+1],a=!!(r?.isInfo||i?.isInfo),o=e.lineNumber!==null;return!(a&&o)})}},je=(e,t)=>{try{let n=e.trim().split(`
4
4
  `).filter(Boolean);if(n.length===0)return null;let r=[];return n.forEach(e=>{let t=e.match(/^(\s*)(.+)$/);if(t){let[,e,n]=t,i=Math.floor(e.length/2),a=!n.endsWith(`/`);r.push({name:n.replace(/\/$/,``),depth:i,isFile:a})}}),(0,A.jsx)(`div`,{className:f(`w-full min-w-0 font-mono space-y-0.5`,t?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/30`),style:s.tool.popup,children:r.map((e,t)=>(0,A.jsx)(`div`,{className:`min-w-0`,style:{paddingLeft:`${e.depth*20}px`},children:e.isFile?(0,A.jsx)(`span`,{className:`text-foreground/90 block truncate`,children:e.name}):(0,A.jsxs)(`span`,{className:`font-semibold text-foreground block truncate`,children:[e.name,`/`]})},t))})}catch{return null}},Me={backgroundColor:`var(--status-info)`,opacity:.6},Ne=(e,t,n)=>{try{let r=e.trim().split(`
package/dist/index.html CHANGED
@@ -552,7 +552,7 @@
552
552
  opacity: 0.72;
553
553
  }
554
554
  </style>
555
- <script type="module" crossorigin src="/assets/main-DnUeA6xl.js"></script>
555
+ <script type="module" crossorigin src="/assets/main-BbJQ9Vtx.js"></script>
556
556
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
557
557
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
558
558
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
@@ -572,7 +572,7 @@
572
572
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-CfgOfnZk.js">
573
573
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
574
574
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
575
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CfiNX02L.js">
575
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-B0raYq9L.js">
576
576
  <link rel="stylesheet" crossorigin href="/assets/src-DZ60kHBP.css">
577
577
  </head>
578
578
  <body class="h-full bg-background text-foreground">
@@ -74,7 +74,7 @@
74
74
  }
75
75
  </style>
76
76
 
77
- <script type="module" crossorigin src="/assets/miniChat-COUGQv_j.js"></script>
77
+ <script type="module" crossorigin src="/assets/miniChat-DaZ0MUes.js"></script>
78
78
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
@@ -94,7 +94,7 @@
94
94
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-CfgOfnZk.js">
95
95
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
96
96
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
97
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CfiNX02L.js">
97
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-B0raYq9L.js">
98
98
  <link rel="stylesheet" crossorigin href="/assets/src-DZ60kHBP.css">
99
99
  </head>
100
100
  <body class="h-full bg-background text-foreground">
package/dist/mobile.html CHANGED
@@ -63,7 +63,7 @@
63
63
  })();
64
64
  </script>
65
65
 
66
- <script type="module" crossorigin src="/assets/mobile-C5MOyIJ0.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-ctmwtKIg.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
@@ -83,7 +83,7 @@
83
83
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-CfgOfnZk.js">
84
84
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
85
85
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
86
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CfiNX02L.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-B0raYq9L.js">
87
87
  <link rel="stylesheet" crossorigin href="/assets/src-DZ60kHBP.css">
88
88
  </head>
89
89
  <body class="h-full bg-background text-foreground">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openchambery/web",
3
- "version": "1.19.19-beta.1",
3
+ "version": "1.19.19",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
@@ -59,7 +59,7 @@ Tip event (not a data payload):
59
59
  | Method | Path | Notes |
60
60
  |---|---|---|
61
61
  | `GET` | `/api/question-auto-delegate` | snapshot |
62
- | `POST` | `.../requests/:id/pause` | `{ sessionID, directory, reason: 'interaction'\|'user' }` — bound identity conflicts → 409 |
62
+ | `POST` | `.../requests/:id/pause` | `{ sessionID, directory, reason: 'interaction'\|'user' }` — bound identity conflicts → 409. Directory may be empty; pause still cancels the auto timer. |
63
63
  | `POST` | `.../requests/:id/delegate` | recovers identity via scoped list; allowed when toggle off |
64
64
  | `POST` | `/api/question/:id/reply` | manual: `answers` must be an array (incl. `[]`); never auto text |
65
65
  | `POST` | `/api/question/:id/reject` | SDK body preserved |
@@ -131,6 +131,26 @@ describe('question auto-delegate core — claim / upstream outcomes', () => {
131
131
  core.dispose();
132
132
  });
133
133
 
134
+ it('interaction pause cancels the auto-reply timer even without a directory hint', async () => {
135
+ const io = createIo();
136
+ const core = createQuestionAutoDelegateCore({ io });
137
+ ready(core);
138
+ core.processEvent(asked());
139
+ expect(io.__clock.pendingCount()).toBe(1);
140
+ const paused = await core.pause({
141
+ requestID: 'q1',
142
+ sessionID: 'ses-1',
143
+ directory: '',
144
+ reason: 'interaction',
145
+ });
146
+ expect(paused.outcome).toBe('paused');
147
+ expect(io.__clock.pendingCount()).toBe(0);
148
+ await io.__clock.advance(30_000);
149
+ expect(io.__posts).toHaveLength(0);
150
+ expect(core.snapshot().requests[0]?.state).toBe('paused');
151
+ core.dispose();
152
+ });
153
+
134
154
  it('HTTP 400 definitive reject releases claim and pauses for manual retry (no auto loop)', async () => {
135
155
  let calls = 0;
136
156
  const io = createIo({
@@ -41,16 +41,16 @@ Relay is not a separate link format: it is one transport candidate inside the un
41
41
  Everything a client normally sends to the single OpenChamber origin:
42
42
  - **HTTP** — REST endpoints and proxied OpenCode SDK calls under `/api/*`, plus `/auth/*` and `/health`.
43
43
  - **SSE** — streamed responses opened through `runtimeFetch`, including `/api/openchamber/events` and SDK global SSE. Relay carries these HTTP response body frames through the tunnel.
44
- - **WebSocket** — the endpoints that use a real socket (the global event stream on platforms that support WS, terminal I/O, dictation).
44
+ - **WebSocket** — the endpoints that use a real socket (the global event stream on platforms that support WS, terminal I/O, dictation, and Preview/Browser HMR under `/api/preview/proxy/<id>/...`).
45
45
 
46
- The host dispatcher restricts tunneled traffic to explicit path allowlists (one for HTTP, one for WS).
46
+ The host dispatcher restricts tunneled traffic to explicit path allowlists (one for HTTP, one for WS). WS allowlist is exact-match for app sockets and **prefix** `/api/preview/proxy/` for Vite/dev-server HMR only (`isTunnelWsPathAllowed`).
47
47
 
48
48
  ### Catalog and new HTTP API pitfalls over Relay
49
49
 
50
50
  Private Relay is transparent for allowlisted HTTP paths, so most “works on LAN / Desktop, empty on mobile Relay” bugs are Host routing or client transport-identity mistakes rather than Relay framing bugs:
51
51
 
52
52
  - **Same path, real Host route required.** Clients call the ordinary `/api/...` path through the tunnel. If that route is missing on the Host process currently holding the relay claim (wrong git worktree, stale packaged Desktop build, or a backend that never registered the OpenChamber route before the OpenCode proxy/SPA fallback), the tunnel still returns HTTP 200 with SPA HTML or proxied OpenCode content. Symptom: chat and status work, Provider/model catalog does not.
53
- - **HTTP allowlist is prefix-based for `/api/`.** New REST/SSE APIs under `/api/` do not need a tunnel-host allowlist edit. New **WebSocket** paths still need both `ALLOWED_WS_PATHS` and `isUrlAuthWebSocketPath` (see the `relay-transport` skill). Config sync (`/api/openchamber/config-sync/*`, ticket 05/06) therefore works over Relay without a tunnel-host allowlist change; identity and credential grants remain endpoint concerns (`relay:<serverId>`, pairing-settings / inbound host grant).
53
+ - **HTTP allowlist is prefix-based for `/api/`.** New REST/SSE APIs under `/api/` do not need a tunnel-host allowlist edit. New **WebSocket** paths still need both tunnel-host allowlisting (`isTunnelWsPathAllowed` / exact `ALLOWED_WS_PATHS`, plus the **`/api/preview/proxy/` prefix** for Preview HMR only) and `isUrlAuthWebSocketPath` (see the `relay-transport` skill). Config sync (`/api/openchamber/config-sync/*`, ticket 05/06) therefore works over Relay without a tunnel-host allowlist change; identity and credential grants remain endpoint concerns (`relay:<serverId>`, pairing-settings / inbound host grant).
54
54
  - **Transport identity ≠ runtime key.** After LAN⇄relay swaps, UI catalog loaders commit only when `useConfigStore.catalogTransportIdentity` matches `getRuntimeTransportIdentity()`. `runtimeEndpointReset.ts` must write that transport fingerprint on both full endpoint reset and in-place transport reconnect. Writing `runtimeKey` instead leaves Providers empty because the stable device/instance id is shared across LAN and relay.
55
55
  - **Safe catalog projection stays Host-owned.** Provider credentials never cross the browser; Relay only carries the already-allowlisted `GET /api/config/catalog/providers` JSON. Keep Host projection, client parser bounds, and `partial` rules in sync (empty `release_date` is absent, not partial).
56
56
 
@@ -100,6 +100,8 @@ The E2EE and framing logic exists twice: TypeScript in `packages/ui/src/lib/rela
100
100
 
101
101
  Relay mode plugs into the existing client transport layer rather than a parallel path: `runtime-switch` activates the tunnel singleton, `runtime-fetch` routes runtime requests and product SSE streamed responses through it, `runtime-url` builds browser-consumed URLs, `runtime-socket` opens tunneled WebSockets, and `runtime-auth` mints the URL-scoped token through the tunnel. Direct-URL connections and the Electron realtime-proxy path are unaffected.
102
102
 
103
+ **Electron Preview over Relay:** Chromium cannot load Host loopback pages through the tunnel URL scheme. The desktop client starts a **loopback HTTP origin** (`127.0.0.1` + ephemeral port) in the Electron main process; the Preview iframe loads `/api/preview/proxy/...` from that origin, and the owner renderer `runtimeFetch`es the same path (tunneled). **WebSocket / Vite HMR** uses the same path prefix: the gateway accepts `Upgrade: websocket` only under `/api/preview/proxy/`, notifies the owner renderer, which opens the socket via `openRuntimeWebSocket` after minting `oc_url_token` (never a raw `new WebSocket` against a runtime URL). The host tunnel dispatcher allows that prefix via `isTunnelWsPathAllowed` (exact paths remain for terminal/dictation/events). The Host preview proxy (rewrite, token, SSRF, `rewriteViteClientHmr`) is unchanged. Upstream-app cookies are not available on this path (query-token auth only). See `packages/electron/preview-loopback-gateway.mjs`.
104
+
103
105
  ### Transport identity vs runtime key (do not mix)
104
106
 
105
107
  `runtimeKey` is the stable device/instance id. It stays the same across LAN⇄relay for one paired device. `getRuntimeTransportIdentity()` is the active transport fingerprint (`direct:…` / `relay:…`) and changes when the client switches transports.
@@ -35,6 +35,29 @@ const ALLOWED_WS_PATHS = new Set([
35
35
  '/api/dictation/ws',
36
36
  ]);
37
37
 
38
+ /** Preview/Browser HMR sockets: path is `/api/preview/proxy/<id>/...` (prefix, not exact). */
39
+ const PREVIEW_PROXY_WS_PATH_PREFIX = '/api/preview/proxy/';
40
+
41
+ /**
42
+ * Tunnel WebSocket path allowlist (defense in depth; pairs with isUrlAuthWebSocketPath).
43
+ * Exact paths for terminal/dictation/events; prefix only for preview proxy HMR.
44
+ *
45
+ * @param {unknown} path
46
+ * @returns {boolean}
47
+ */
48
+ export const isTunnelWsPathAllowed = (path) => {
49
+ if (typeof path !== 'string' || !path) return false;
50
+ // Path only (no query) — tunnel open payload already splits query.
51
+ if (ALLOWED_WS_PATHS.has(path)) return true;
52
+ try {
53
+ const pathname = new URL(path, 'http://127.0.0.1').pathname;
54
+ if (ALLOWED_WS_PATHS.has(pathname)) return true;
55
+ return pathname.startsWith(PREVIEW_PROXY_WS_PATH_PREFIX);
56
+ } catch {
57
+ return false;
58
+ }
59
+ };
60
+
38
61
  // Hop-by-hop headers stripped from tunneled requests; `host` is set by fetch
39
62
  // to the loopback origin. content-length is dropped too because the body is
40
63
  // re-chunked through the tunnel and undici computes framing itself.
@@ -320,7 +343,7 @@ export const createTunnelHost = ({
320
343
  void sendAbort(streamId, error?.message ?? 'malformed ws open');
321
344
  return;
322
345
  }
323
- if (!ALLOWED_WS_PATHS.has(open.path)) {
346
+ if (!isTunnelWsPathAllowed(open.path)) {
324
347
  void sendAbort(streamId, 'Path is not allowed through the relay');
325
348
  return;
326
349
  }
@@ -17,7 +17,7 @@ import {
17
17
  encodeJsonPayload,
18
18
  encodeTunnelFrame,
19
19
  } from './tunnel-codec.js';
20
- import { createTunnelHost } from './tunnel-host.js';
20
+ import { createTunnelHost, isTunnelWsPathAllowed } from './tunnel-host.js';
21
21
 
22
22
  const textEncoder = new TextEncoder();
23
23
  const textDecoder = new TextDecoder();
@@ -68,6 +68,72 @@ const waitFor = async (predicate, { timeoutMs = 2000, intervalMs = 5 } = {}) =>
68
68
  throw new Error('waitFor timed out');
69
69
  };
70
70
 
71
+ describe('isTunnelWsPathAllowed', () => {
72
+ it('allows exact terminal/dictation/event sockets and preview proxy prefix', () => {
73
+ expect(isTunnelWsPathAllowed('/api/terminal/ws')).toBe(true);
74
+ expect(isTunnelWsPathAllowed('/api/dictation/ws')).toBe(true);
75
+ expect(isTunnelWsPathAllowed('/api/event/ws')).toBe(true);
76
+ expect(isTunnelWsPathAllowed('/api/global/event/ws')).toBe(true);
77
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/abc123/')).toBe(true);
78
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/abc123/@vite/client')).toBe(true);
79
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/deadbeef01234567')).toBe(true);
80
+ });
81
+
82
+ it('rejects non-allowlisted WS paths', () => {
83
+ expect(isTunnelWsPathAllowed('/api/evil/ws')).toBe(false);
84
+ expect(isTunnelWsPathAllowed('/api/session')).toBe(false);
85
+ expect(isTunnelWsPathAllowed('/api/preview/targets')).toBe(false);
86
+ expect(isTunnelWsPathAllowed('/api/preview/proxy')).toBe(false);
87
+ expect(isTunnelWsPathAllowed('/api/terminal/ws/extra')).toBe(false);
88
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/../session')).toBe(false);
89
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/%2e%2e/evil')).toBe(false);
90
+ expect(isTunnelWsPathAllowed('/api/preview/proxy/../../api/session')).toBe(false);
91
+ expect(isTunnelWsPathAllowed('')).toBe(false);
92
+ expect(isTunnelWsPathAllowed(null)).toBe(false);
93
+ });
94
+ });
95
+
96
+ describe('createTunnelHost WS path allowlist', () => {
97
+ it('aborts WsOpen for disallowed paths and dials preview proxy prefix', async () => {
98
+ FakeWebSocket.reset();
99
+
100
+ /** @type {Uint8Array[]} */
101
+ const outbound = [];
102
+ const host = createTunnelHost({
103
+ connectionId: 'test-conn',
104
+ getLocalPort: () => 9,
105
+ sendFrame: (frame) => {
106
+ outbound.push(frame);
107
+ },
108
+ getBufferedAmount: () => 0,
109
+ createWebSocket: (url, protocols) => new FakeWebSocket(url, protocols),
110
+ });
111
+
112
+ await host.handleFrame(encodeTunnelFrame(
113
+ TunnelFrameType.WsOpen,
114
+ 10,
115
+ encodeJsonPayload({ path: '/api/evil/ws', query: '' }),
116
+ ));
117
+ expect(FakeWebSocket.instances.length).toBe(0);
118
+ await waitFor(() => outbound.some((frame) => decodeTunnelFrame(frame).frameType === TunnelFrameType.StreamAbort));
119
+
120
+ await host.handleFrame(encodeTunnelFrame(
121
+ TunnelFrameType.WsOpen,
122
+ 11,
123
+ encodeJsonPayload({
124
+ path: '/api/preview/proxy/abc123/',
125
+ query: 'oc_preview_token=t&oc_url_token=u',
126
+ }),
127
+ ));
128
+ expect(FakeWebSocket.instances.length).toBe(1);
129
+ expect(FakeWebSocket.instances[0].url).toBe(
130
+ 'ws://127.0.0.1:9/api/preview/proxy/abc123/?oc_preview_token=t&oc_url_token=u',
131
+ );
132
+
133
+ host.close();
134
+ });
135
+ });
136
+
71
137
  describe('createTunnelHost WS fragment ordering', () => {
72
138
  it('keeps large then small WS text messages non-interleaved on one stream', async () => {
73
139
  FakeWebSocket.reset();
@@ -14,6 +14,7 @@ Pairing v2 is implemented by `packages/web/server/lib/client-auth/pairing.js`. I
14
14
  - `packages/web/server/lib/client-auth/pairing.js`: short-lived Pairing v2 sessions and one-time secret redemption into trusted-device client tokens.
15
15
 
16
16
  ## Public exports (ui-auth.js)
17
+ - `isUrlAuthWebSocketPath(pathname)`: true when a WebSocket upgrade may authenticate with `oc_url_token` (exact terminal/dictation/event/realtime-proxy paths, plus prefix `/api/preview/proxy/` for Preview HMR). Keep in sync with tunnel-host `isTunnelWsPathAllowed`.
17
18
  - `createUiAuth({ password, cookieName, sessionTtlMs, readSettingsFromDiskMigrated })`: creates UI auth controller with methods:
18
19
  - `enabled`
19
20
  - `requireAuth(req, res, next)`
@@ -305,7 +305,16 @@ const isUrlAuthReadableHttpPath = (pathname) => {
305
305
  || /^\/api\/projects\/[^/]+\/icon$/.test(pathname);
306
306
  };
307
307
 
308
- const isUrlAuthWebSocketPath = (pathname) => {
308
+ /**
309
+ * Paths that may authenticate a WebSocket upgrade with `oc_url_token`.
310
+ * Keep in sync with tunnel-host `isTunnelWsPathAllowed` for preview proxy prefix
311
+ * and exact terminal/dictation/event sockets (plus realtime-proxy on desktop).
312
+ *
313
+ * @param {unknown} pathname
314
+ * @returns {boolean}
315
+ */
316
+ export const isUrlAuthWebSocketPath = (pathname) => {
317
+ if (typeof pathname !== 'string' || !pathname) return false;
309
318
  return pathname === '/api/event/ws'
310
319
  || pathname === '/api/global/event/ws'
311
320
  || pathname === '/api/openchamber/realtime-proxy/ws'
@@ -18,6 +18,11 @@ const loadCreateUiAuth = async () => {
18
18
  return module.createUiAuth;
19
19
  };
20
20
 
21
+ const loadIsUrlAuthWebSocketPath = async () => {
22
+ const module = await import('./ui-auth.js');
23
+ return module.isUrlAuthWebSocketPath;
24
+ };
25
+
21
26
  const createResponse = () => {
22
27
  let statusCode = 200;
23
28
  let body = null;
@@ -47,6 +52,22 @@ const createResponse = () => {
47
52
  };
48
53
  };
49
54
 
55
+ describe('isUrlAuthWebSocketPath', () => {
56
+ it('allows preview proxy prefix and exact terminal/dictation/event sockets', async () => {
57
+ const isUrlAuthWebSocketPath = await loadIsUrlAuthWebSocketPath();
58
+ expect(isUrlAuthWebSocketPath('/api/preview/proxy/abc123/')).toBe(true);
59
+ expect(isUrlAuthWebSocketPath('/api/preview/proxy/abc123/@vite')).toBe(true);
60
+ expect(isUrlAuthWebSocketPath('/api/terminal/ws')).toBe(true);
61
+ expect(isUrlAuthWebSocketPath('/api/dictation/ws')).toBe(true);
62
+ expect(isUrlAuthWebSocketPath('/api/event/ws')).toBe(true);
63
+ expect(isUrlAuthWebSocketPath('/api/global/event/ws')).toBe(true);
64
+ expect(isUrlAuthWebSocketPath('/api/openchamber/realtime-proxy/ws')).toBe(true);
65
+ expect(isUrlAuthWebSocketPath('/api/evil/ws')).toBe(false);
66
+ expect(isUrlAuthWebSocketPath('/api/preview/proxy')).toBe(false);
67
+ expect(isUrlAuthWebSocketPath('/api/session')).toBe(false);
68
+ });
69
+ });
70
+
50
71
  describe('ui auth client credential seam', () => {
51
72
  it('accepts bearer client credentials when UI password auth is enabled', async () => {
52
73
  const createUiAuth = await loadCreateUiAuth();
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarkstreamRendererImpl-BPbyoQOQ.js","assets/rolldown-runtime-C0FnF6B9.js","assets/vendor-base-ui-CnHfUmDN.js","assets/vendor-react-DLPElpoQ.js","assets/vendor-markstream-react-DX55XLGO.js","assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js","assets/vendor-markstream-core-Cm34iPLL.js","assets/vendor-floating-ui-dom-BHhLtF5l.js","assets/vendor-floating-ui-core-Co1I1lFV.js","assets/vendor-reactuses-core-BnW6GxJt.js","assets/vendor-lodash-es-DfLbG5Af.js","assets/vendor-js-cookie-hSOiFTtX.js","assets/button-B1A-UMjO.js","assets/persistence-DwRBC4zl.js","assets/runtime-switch-LvWDU-SL.js","assets/runtime-auth-D66yq6ie.js","assets/runtime-fetch-zIalUnbb.js","assets/vendor-zustand-B4dlGEM2.js","assets/useUIStore-CxOoCv7B.js","assets/vendor-pathe-vBmvQE8f.js","assets/vendor-tanstack-query-core-BWz0ose6.js","assets/store-BBmfPqaV.js","assets/vendor-class-variance-authority-BLUaYARZ.js","assets/vendor-tailwind-merge-BicNWLTg.js","assets/useMobileNavigationStore-D-y0Rt9A.js","assets/platform-DQ5_LNKO.js","assets/vendor-opencode-sdk-C07HQypa.js","assets/vendor-tanstack-react-query-D7pys_c9.js","assets/vendor-sonner-DVzioF3d.js","assets/useAssistantUIStore-CLPCNoj_.js","assets/vendor-zod-Dzk5kdUU.js","assets/vendor-fuse.js-DB5wDJbI.js","assets/useThemeSystem-DMzWVJaW.js","assets/useRuntimeAPIs-DSLXJybW.js","assets/url-CMQwHq4k.js","assets/useEffectiveDirectory-CuPv_Spa.js","assets/markdownHeightCache-BWYOoF-W.js","assets/dualLimitLru-D8Sphgua.js","assets/MarkdownRendererImpl-Cqx43iX3.js","assets/vendor-katex--B5dHUyk.js","assets/markdownTheme-DOfGg-A7.js","assets/vendor-pierre-diffs-DX7XTPG3.js","assets/vendor-hast-util-to-html-B0p1k5Xa.js","assets/vendor-character-entities-legacy-Wut6vMuj.js","assets/vendor-character-entities-html4-DlN_yAFd.js","assets/vendor-ccount-CyGsA0u7.js","assets/vendor-comma-separated-tokens-B9ouxNNS.js","assets/vendor-oniguruma-to-es-CrHzjjSU.js","assets/vendor-oniguruma-parser-D2DIvhSP.js","assets/vendor-diff-Dq7CZNim.js","assets/vendor-lru_map-DpDied8H.js","assets/markdown-worker-CptoICmq.js","assets/FadeInOnReveal-C6tR_fyF.js","assets/imageSource-BlAJJUEI.js","assets/relay-image-stream-DM7atqJs.js","assets/vendor-morphdom-BbKiNDAu.js","assets/vendor-beautiful-mermaid-DykqIK5D.js","assets/vendor-dompurify-CeJNOzik.js","assets/vendor-marked-WVekxjAN.js","assets/vendor-remend-C3cXc-tf.js","assets/MarkstreamRendererImpl-DKhVy3nF.css"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{a as t}from"./vendor-zustand-B4dlGEM2.js";import{nt as n,rt as r}from"./vendor-base-ui-CnHfUmDN.js";import{o as i}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{n as a}from"./vendor-react-DLPElpoQ.js";import{r as o}from"./button-B1A-UMjO.js";import{i as s,n as c,t as l}from"./markdownHeightCache-BWYOoF-W.js";var u=a(),d=e(r(),1),f=`openchamber:chunk-import-reload`,p=250,m=3e4,h=[/Importing a module script failed/i,/Failed to fetch dynamically imported module/i,/error loading dynamically imported module/i,/Loading chunk \S+ failed/i,/ChunkLoadError/i];function g(e){if(e instanceof Error)return`${e.name}\n${e.message}\n${e.stack??``}`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function _(e){let t=g(e);return h.some(e=>e.test(t))}function v(e){return`1.19.19-beta.1:${g(e).slice(0,500)}`}function y(e){if(typeof window>`u`)return;let t=Date.now(),n=v(e),r=null;try{let e=window.sessionStorage.getItem(f);if(e)try{r=JSON.parse(e)}catch{r=null}}catch{return}let i=typeof r?.timestamp==`number`?r.timestamp:0;if(!(r?.signature===n&&t-i<m)){try{window.sessionStorage.setItem(f,JSON.stringify({signature:n,timestamp:t}))}catch{return}console.error(`[refresh-debug] chunk-import-reload`,{error:g(e).slice(0,1e3)}),window.setTimeout(()=>{window.location.reload()},0)}}async function b(e,t={}){let n=t.retries??1,r;for(let t=0;t<=n;t+=1)try{return await e()}catch(e){if(r=e,!_(e)||t>=n)break;await new Promise(e=>setTimeout(e,p*(t+1)))}throw _(r)&&y(r),r}var x=e=>(0,d.lazy)(()=>b(e)),S=(e,t)=>{try{let n=t??(typeof localStorage>`u`?null:localStorage);return n?n.getItem(e)===`1`:!1}catch{return!1}},C=(e,t)=>{try{let n=t??(typeof localStorage>`u`?null:localStorage);return!n||n.getItem(e)!==`0`}catch{return!0}},w=(e,t)=>{try{typeof localStorage<`u`&&localStorage.setItem(e,t?`1`:`0`)}catch{}},T=`oc:legend-timeline`,E=e=>S(T,e),D=`oc:markstream-react`,O=e=>C(D,e),k=t(e=>({legendTimelineEnabled:E(),setLegendTimelineEnabled:t=>{w(T,t),e({legendTimelineEnabled:t})},markstreamReactEnabled:O(),setMarkstreamReactEnabled:t=>{w(D,t),e({markstreamReactEnabled:t})}})),A=null,j=()=>(A??=i(()=>import(`./MarkstreamRendererImpl-BPbyoQOQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60])).catch(e=>{throw A=null,e}),A),M=()=>{j().catch(()=>void 0)},N=null,P=()=>(N??=i(()=>import(`./MarkdownRendererImpl-Cqx43iX3.js`).then(e=>e.n),__vite__mapDeps([38,1,14,15,16,13,17,2,18,19,3,20,25,26,5,39,9,10,11,12,21,22,23,24,27,28,29,30,31,32,40,41,42,43,44,45,46,47,48,49,50,33,34,51,37,35,52,53,54,36,55,56,57,58,59])).catch(e=>{throw N=null,e}),N),F=()=>{P().catch(()=>void 0),O()&&M()},I=class extends d.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.warn(`[markstream-react] falling back to the current Markdown renderer`,e)}render(){return this.state.hasError?this.props.fallback:this.props.children}},L=d.createContext(!0),R=()=>d.useContext(L),z=n(),B=x(()=>P().then(e=>({default:e.MarkdownRenderer}))),V=x(()=>j().then(e=>({default:e.MarkstreamRenderer}))),H=x(()=>P().then(e=>({default:e.SimpleMarkdownRenderer}))),U=e=>e===`tool`?`markdown-content markdown-tool`:e===`reasoning`?`markdown-content markdown-reasoning`:`markdown-content leading-relaxed`,W=e=>{let t=(0,u.c)(15),n=k(q),r=typeof e.content==`string`?e.content:``,i=typeof e.variant==`string`?e.variant:`assistant`,a;t[0]!==r||t[1]!==n||t[2]!==e.reserveMeasuredHeight||t[3]!==i?(a=e.reserveMeasuredHeight?c(l(r,n?`markstream:${i}`:i)):void 0,t[0]=r,t[1]=n,t[2]=e.reserveMeasuredHeight,t[3]=i,t[4]=a):a=t[4];let d=a,f;t[5]!==e.className||t[6]!==e.variant?(f=o(`relative break-words w-full min-w-0`,U(e.variant),typeof e.className==`string`?e.className:void 0),t[5]=e.className,t[6]=e.variant,t[7]=f):f=t[7];let p;t[8]!==r||t[9]!==e.animated||t[10]!==d?(p=(0,z.jsx)(s,{animated:e.animated,content:r,reservedHeight:d}),t[8]=r,t[9]=e.animated,t[10]=d,t[11]=p):p=t[11];let m;return t[12]!==f||t[13]!==p?(m=(0,z.jsx)(`div`,{className:f,"aria-busy":`true`,"data-markdown-hydration":`deferred`,"data-markdown-ready":`false`,children:p}),t[12]=f,t[13]=p,t[14]=m):m=t[14],m},G=e=>{let t=(0,u.c)(9),n=R(),r=k(J);if(!n&&e.isStreaming!==!0){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(W,{...e,animated:!1,reserveMeasuredHeight:!0}),t[0]=e,t[1]=n),n}let i;t[2]===e?i=t[3]:(i=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e,reserveMeasuredHeight:!0}),children:(0,z.jsx)(B,{...e})}),t[2]=e,t[3]=i);let a=i;if(!r)return a;let o;t[4]===e?o=t[5]:(o=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e,reserveMeasuredHeight:!0}),children:(0,z.jsx)(V,{...e})}),t[4]=e,t[5]=o);let s;return t[6]!==a||t[7]!==o?(s=(0,z.jsx)(I,{fallback:a,children:o}),t[6]=a,t[7]=o,t[8]=s):s=t[8],s},K=e=>{let t=(0,u.c)(4);if(!R()){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(W,{...e,animated:!1}),t[0]=e,t[1]=n),n}let n;return t[2]===e?n=t[3]:(n=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e}),children:(0,z.jsx)(H,{...e})}),t[2]=e,t[3]=n),n};function q(e){return e.markstreamReactEnabled}function J(e){return e.markstreamReactEnabled}export{k as a,F as i,K as n,x as o,L as r,G as t};
@@ -1,10 +0,0 @@
1
- import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{i as n}from"./runtime-switch-LvWDU-SL.js";import{n as r}from"./runtime-fetch-zIalUnbb.js";import{Qt as i,Xt as a,Zt as o,on as s,tn as c}from"./persistence-DwRBC4zl.js";import{nt as l,rt as u}from"./vendor-base-ui-CnHfUmDN.js";import{t as d}from"./platform-DQ5_LNKO.js";import{t as f}from"./useUIStore-CxOoCv7B.js";import{n as p}from"./vendor-react-DLPElpoQ.js";import{n as m}from"./vendor-katex--B5dHUyk.js";import{d as h,n as g,r as _}from"./vendor-reactuses-core-BnW6GxJt.js";import{d as v,f as y,r as b}from"./button-B1A-UMjO.js";import{Pi as x}from"./useMobileNavigationStore-D-y0Rt9A.js";import{t as S}from"./useThemeSystem-DMzWVJaW.js";import{i as C,n as w,s as T,t as E}from"./markdownTheme-DOfGg-A7.js";import{n as ee}from"./useRuntimeAPIs-DSLXJybW.js";import{a as D,i as O,n as k,r as A}from"./url-CMQwHq4k.js";import{d as j,i as M,n as te,s as N,t as P,u as F}from"./markdown-worker-CptoICmq.js";import{n as ne}from"./useEffectiveDirectory-CuPv_Spa.js";import{a as I,c as L,d as R,f as z,i as B,n as re,r as V,u as ie}from"./FadeInOnReveal-C6tR_fyF.js";import{a as H,d as U,f as W,i as ae,l as oe,m as se,o as ce,p as le,t as ue}from"./imageSource-BlAJJUEI.js";import{i as de,r as fe,t as pe}from"./markdownHeightCache-BWYOoF-W.js";import{t as me}from"./dualLimitLru-D8Sphgua.js";import{t as he}from"./vendor-morphdom-BbKiNDAu.js";import{n as ge,t as _e}from"./vendor-beautiful-mermaid-DykqIK5D.js";import{t as G}from"./vendor-dompurify-CeJNOzik.js";import{t as ve}from"./vendor-marked-WVekxjAN.js";import{t as ye}from"./vendor-remend-C3cXc-tf.js";var K=e(u(),1),be=p(),xe=`data-md-stream-fence`,Se=`data-md-stream-line`,Ce=`data-md-stream-src`,we=`data-md-stream-applied`,Te=(e,t)=>{let n=Math.min(e.length,t.length);for(let r=0;r<n;r+=1)if(e[r]!==t[r])return r;return n},Ee=e=>Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.hasAttribute(`data-md-stream-line`)),De=(e,t)=>{let n=document.createElement(`span`);return n.setAttribute(Se,String(t)),n.className=`line`,n.innerHTML=e,n},Oe=(e,t)=>{let n=Ee(e),r=Te(n.map(e=>e.innerHTML),t);if(n.length===0&&e.childNodes.length>0&&t.length>0){e.replaceChildren();for(let n=0;n<t.length;n+=1)n>0&&e.appendChild(document.createTextNode(`
2
- `)),e.appendChild(De(t[n]??``,n));return{reused:0,replaced:0,added:t.length,removed:0}}let i=0;if(r<n.length&&r<t.length){let e=n[r];e&&(e.innerHTML=t[r]??``,e.setAttribute(Se,String(r)),i=1)}let a=0;for(let e=n.length-1;e>=r+i;--e){let t=n[e]?.previousSibling;t?.nodeType===Node.TEXT_NODE&&t.remove(),n[e]?.remove(),a+=1}let o=0;for(let n=r+i;n<t.length;n+=1)n>0&&e.appendChild(document.createTextNode(`
3
- `)),e.appendChild(De(t[n]??``,n)),o+=1;return{reused:r,replaced:i,added:o,removed:a}},ke=e=>{if(e.includes(`data-md-stream-fence=`))return e;let t=e.toLowerCase().lastIndexOf(`<pre`);return t<0?e:`${e.slice(0,t)}${e.slice(t).replace(/<pre\b/i,`<pre ${xe}="true"`)}`},Ae=(e,t)=>{if(!(e instanceof HTMLElement)||!(t instanceof HTMLElement)||e.getAttribute(`data-md-stream-fence`)!==`true`||t.getAttribute(`data-md-stream-fence`)!==`true`)return!1;let n=e.tagName===`CODE`?e:e.querySelector(`code`),r=t.tagName===`CODE`?t:t.querySelector(`code`);return n instanceof HTMLElement&&r instanceof HTMLElement&&n.setAttribute(Ce,r.textContent??``),!0},je=e=>e.getAttribute(`data-md-stream-src`)??e.textContent??``,Me=e=>{let t=e.querySelectorAll(`pre[${xe}="true"]`),n=[];return t.forEach(e=>{let t=e.querySelector(`code`);t instanceof HTMLElement&&n.push(t)}),n},Ne=e=>e.closest(`pre`)?.getAttribute(`data-md-lang`)||e.className.match(/language-([^\s"]+)/)?.[1]||`text`,Pe=async(e,t,n)=>{if(n?.signal?.aborted)return;let r=Me(e);await Promise.all(r.map(async r=>{let i=je(r);if(!i||n?.signal?.aborted||r.getAttribute(`data-md-stream-applied`)===i)return;let a=Ne(r);if(a===`mermaid`)return;let o=await t(i,a,n);if(!(n?.signal?.aborted||!e.contains(r)||je(r)!==i)){if(!o){let e=Ee(r),t=document.createElement(`span`);Oe(r,i.split(`
4
- `).map((n,r)=>{let i=e[r];return i?.textContent===n?i.innerHTML:(t.textContent=n,t.innerHTML)}));return}Oe(r,o),r.setAttribute(we,i),r.removeAttribute(Ce)}}))},Fe=`text`,Ie=/^(\d+):(\d+):(.+)$/,Le={ts:`typescript`,mts:`typescript`,cts:`typescript`,tsx:`tsx`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`jsx`,vue:`vue`,svelte:`svelte`,astro:`astro`,json:`json`,jsonc:`jsonc`,json5:`json5`,jsonl:`json`,ndjson:`json`,geojson:`json`,yaml:`yaml`,yml:`yaml`,toml:`toml`,ini:`ini`,cfg:`ini`,conf:`ini`,properties:`properties`,env:`dotenv`,css:`css`,scss:`scss`,sass:`sass`,less:`less`,styl:`stylus`,html:`html`,htm:`html`,xml:`xml`,svg:`xml`,md:`markdown`,markdown:`markdown`,mdown:`markdown`,mkd:`markdown`,mdx:`mdx`,py:`python`,pyw:`python`,pyi:`python`,rb:`ruby`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,kts:`kotlin`,swift:`swift`,scala:`scala`,c:`c`,h:`c`,cc:`cpp`,cpp:`cpp`,cxx:`cpp`,hpp:`cpp`,hh:`cpp`,m:`objective-c`,mm:`objective-cpp`,cs:`csharp`,fs:`fsharp`,fsx:`fsharp`,vb:`vb`,php:`php`,pl:`perl`,pm:`perl`,lua:`lua`,r:`r`,dart:`dart`,ex:`elixir`,exs:`elixir`,erl:`erlang`,hrl:`erlang`,hs:`haskell`,clj:`clojure`,cljs:`clojure`,cljc:`clojure`,groovy:`groovy`,jl:`julia`,ml:`ocaml`,mli:`ocaml`,zig:`zig`,nix:`nix`,sol:`solidity`,prisma:`prisma`,proto:`proto`,graphql:`graphql`,gql:`graphql`,sql:`sql`,sh:`shellscript`,bash:`shellscript`,zsh:`shellscript`,fish:`shellscript`,ps1:`powershell`,psm1:`powershell`,bat:`bat`,cmd:`bat`,tf:`terraform`,tfvars:`terraform`,hcl:`hcl`,diff:`diff`,patch:`diff`,csv:`csv`,tex:`latex`,vim:`viml`,wgsl:`wgsl`,glsl:`glsl`,wat:`wasm`,mermaid:`mermaid`,mmd:`mermaid`},Re={dockerfile:`docker`,containerfile:`docker`,makefile:`make`,gnumakefile:`make`,"cmakelists.txt":`cmake`,gemfile:`ruby`,rakefile:`ruby`,podfile:`ruby`,".env":`dotenv`,".bashrc":`shellscript`,".zshrc":`shellscript`,".profile":`shellscript`},ze=e=>{let t=e.split(/[\\/]/).pop()?.toLowerCase()??``;if(!t)return Fe;let n=Re[t];if(n)return n;let r=t.lastIndexOf(`.`);return r<=0?Fe:Le[t.slice(r+1)]??Fe},Be=e=>{let t=e?.trim()??``;if(!t)return{lang:Fe,label:Fe,reference:!1};let n=Ie.exec(t);if(!n){let e=t.toLowerCase();return{lang:e,label:e,reference:!1}}let[,r=``,i=``,a=``]=n,o=r===i?r:`${r}-${i}`;return{lang:ze(a),label:`${a}:${o}`,reference:!0}},Ve=e=>e===` `||e===` `||e===`
5
- `||e===`\r`,He=e=>e!==void 0&&e>=`0`&&e<=`9`,Ue=e=>e===`\\`||e===`^`||e===`_`||e===`{`||e===`}`||e===`=`||e===`+`||e===`*`||e===`/`||e===`-`,We=e=>{for(let t=0;t<e.length;t+=1){let n=e[t];if(n!==void 0&&Ue(n))return!0}return!1},Ge=e=>{for(let t=0;t<e.length;t+=1){let n=e[t];if(n===`"`||n===`'`||Ve(n))return!0}return!1},Ke=e=>{let t=0;for(;t<e.length;){let n=e.indexOf(`$`,t);if(n<0)return;let r=e[n+1];if(r===`$`||r!==void 0&&!Ve(r))return n;t=n+1}},qe=e=>{if(e[0]===`$`){if(e[1]===`$`){let t=e.indexOf(`$$`,2);return t<0?void 0:{raw:e.slice(0,t+2),text:e.slice(2,t),display:!0}}if(!(e.length<3||Ve(e[1])))for(let t=1;t<e.length;t+=1){let n=e[t];if(n===`\\`){t+=1;continue}if(n!==`$`)continue;if(e[t+1]===`$`||Ve(e[t-1]))return;if(He(e[t+1]))continue;if(t===1)return;let r=e.slice(1,t);return He(e[1])&&!We(r)&&Ge(r)?void 0:{raw:e.slice(0,t+1),text:r,display:!1}}}},q=e=>e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),Je=e=>{let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)},Ye=e=>`${Je(e.raw)}:${e.mode}:${+!!e.highlight}`,Xe=e=>/^\[[^\]]+\]:\s+\S+/m.test(e)||/^\[\^[^\]]+\]:\s+/m.test(e),Ze=e=>{let t=e.match(/^[ \t]{0,3}(`{3,}|~{3,})/);if(!t)return!1;let n=t[1];if(!n)return!1;let r=n[0],i=n.length,a=e.trimEnd().split(`
6
- `).at(-1)?.trim()??``;return!RegExp(`^[\\t ]{0,3}${r}{${i},}[\\t ]*$`).test(a)},Qe=e=>{try{return ye(e,{linkMode:`text-only`})}catch{return e}},$e=(e,t)=>{let n=t?`live`:`full`;if(Xe(e))return[{raw:e,src:Qe(e),mode:n,highlight:!0}];let r;try{r=ve.lexer(e)}catch{return[{raw:e,src:Qe(e),mode:n,highlight:!0}]}let i=-1;for(let e=r.length-1;e>=0;--e)if(r[e]?.type!==`space`){i=e;break}if(i<0)return[{raw:e,src:Qe(e),mode:n,highlight:!0}];let a=[];for(let e=0;e<r.length;e+=1){let t=r[e];if(!t||t.type===`space`)continue;let o=t.raw??``,s=e===i,c=t.type===`code`&&Ze(o);a.push({raw:o,src:c?o:Qe(o),mode:s?n:`full`,highlight:!c})}return a.length===0?[{raw:e,src:Qe(e),mode:n,highlight:!0}]:a},et=16,tt=new Map,nt=(e,t)=>{let n=`${+!!t}:${e}`,r=tt.get(n);if(r)return tt.delete(n),tt.set(n,r),r;let i=$e(e,t);for(;tt.size>=et;){let e=tt.keys().next().value;if(typeof e!=`string`)break;tt.delete(e)}return tt.set(n,i),i},rt=(e,t,n)=>{try{return m.renderToString(e,{displayMode:n,throwOnError:!1})}catch{return t}},it=ve.use({gfm:!0,breaks:!1,extensions:[{name:`inlineMath`,level:`inline`,start(e){let t=e.indexOf(`\\(`);return t<0?void 0:t},tokenizer(e){let t=/^\\\(([\s\S]+?)\\\)/.exec(e);if(t)return{type:`inlineMath`,raw:t[0],text:t[1]??``}},renderer(e){let t=e;return rt(t.text,t.raw,!1)}},{name:`blockMath`,level:`block`,start(e){let t=e.indexOf(`\\[`);return t<0?void 0:t},tokenizer(e){let t=/^\\\[([\s\S]+?)\\\]/.exec(e);if(t)return{type:`blockMath`,raw:t[0],text:t[1]??``}},renderer(e){let t=e;return rt(t.text,t.raw,!0)}},{name:`dollarMath`,level:`inline`,start(e){return Ke(e)},tokenizer(e){let t=qe(e);if(t)return{type:`dollarMath`,raw:t.raw,text:t.text,display:t.display}},renderer(e){let t=e;return rt(t.text,t.raw,t.display)}}],renderer:{link({href:e,title:t,text:n}){let r=e??``,i=ie(r);if(i)return`<a href="${q(L(i))}" data-openchamber-agent-mention="true" class="text-primary hover:underline" target="_blank" rel="noopener noreferrer">${n}</a>`;let a=R(r);if(a)return`<a href="${q(r)}" data-skill-name="${q(a)}" class="text-primary hover:underline">${n}</a>`;let o=t?` title="${q(t)}"`:``;return`<a href="${q(r)}"${o} class="external-link" target="_blank" rel="noopener noreferrer">${n}</a>`}}}),at=e=>e.replace(/\$\$([\s\S]*?)\$\$/g,(e,t)=>{try{return m.renderToString(t,{displayMode:!0,throwOnError:!1})}catch{return`$$${t}$$`}}),ot=e=>e.indexOf(`$`)===-1?e:e.split(/(<(?:pre|code|kbd)[^>]*>[\s\S]*?<\/(?:pre|code|kbd)>)/gi).map((e,t)=>t%2==1?e:at(e)).join(``),st=e=>ot(it.parse(e)),ct=e=>{let t=st(e.src);return e.highlight?t:ke(t)},lt=/<pre><code(?:\s+class="language-([^"]*)")?>([\s\S]*?)<\/code><\/pre>/g,ut=1200,dt=(e,t)=>{let n=1;for(let r=0;r<e.length;r+=1)if(e.charCodeAt(r)===10&&++n>t)return!0;return!1},ft=e=>e.replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`),pt=e=>e.reference?`data-md-lang="${q(e.lang)}" data-md-label="${q(e.label)}"`:`data-md-lang="${q(e.lang)}"`,mt=async(e,t,n)=>{if(n.isCancelled?.())return null;let r=[...e.matchAll(lt)];if(r.length===0)return e;let i=e;for(let e of r){if(n.isCancelled?.())return null;let[r,a,o]=e,s=Be(a);if(s.lang===`mermaid`&&!s.reference)continue;let c=ft(o??``);if(dt(c,n.lineLimit)){i=i.replace(r,()=>r.replace(`<pre`,`<pre ${pt(s)}`));continue}let l=await t(c,s.lang);if(n.isCancelled?.())return null;if(l){let e=l.replace(/^<pre/,`<pre ${pt(s)}`);i=i.replace(r,()=>e)}}return i},ht=(e,t)=>!t&&e.length<=480&&!e.includes("```"),gt={USE_PROFILES:{html:!0,mathMl:!0,svg:!0},ADD_TAGS:[`svg`,`path`,`g`,`rect`,`line`,`polygon`,`polyline`,`circle`,`ellipse`,`text`,`tspan`,`defs`,`marker`],ADD_ATTR:[`d`,`viewBox`,`preserveAspectRatio`,`xmlns`,`target`,`fill`,`stroke`,`stroke-width`,`transform`,`points`,`x`,`y`,`x1`,`y1`,`x2`,`y2`,`cx`,`cy`,`r`,`rx`,`ry`,`style`],FORBID_TAGS:[`script`],FORBID_CONTENTS:[`script`]},_t=!1,vt=()=>{_t||typeof window>`u`||!G.isSupported||(_t=!0,G.addHook(`uponSanitizeAttribute`,(e,t)=>{if(!(e instanceof HTMLImageElement)||t.attrName!==`src`)return;let n=typeof t.attrValue==`string`?t.attrValue:``;/^file:/i.test(n)&&(e.setAttribute(`data-md-image-source`,n),t.keepAttr=!1)}),G.addHook(`afterSanitizeAttributes`,e=>{e instanceof HTMLAnchorElement&&e.target===`_blank`&&e.setAttribute(`rel`,`noopener noreferrer`)}))},yt=e=>G.isSupported?(vt(),G.sanitize(e,gt)):``,bt=`data-md-sanitize-block`,xt=e=>{if(e.length===0)return[];if(e.length===1)return[yt(e[0])];if(!G.isSupported||typeof document>`u`)return e.map(e=>yt(e));let t=e.map((e,t)=>`<div ${bt}="${t}">${e}</div>`).join(``),n=document.createElement(`div`);n.innerHTML=yt(t);let r=e.map(()=>``);return n.querySelectorAll(`[${bt}]`).forEach(e=>{let t=Number(e.getAttribute(bt));Number.isInteger(t)&&t>=0&&t<r.length&&(r[t]=e.innerHTML)}),r},St=()=>c()?200:ut,Ct=240,wt=16777216,Tt=160,Et=8388608,Dt=new me({maxEntries:Ct,maxBytes:wt}),Ot=new me({maxEntries:Tt,maxBytes:Et}),kt=e=>e.length*2,At=(e,t)=>{Dt.set(e,t,kt(e)+kt(t.hash)+kt(t.html))},jt=async(e,t,n)=>mt(e,(e,r)=>P(e,r,{signal:t,priority:n}),{lineLimit:St(),isCancelled:()=>!!t?.aborted}),Mt=async(e,t,n)=>{if(t?.aborted)return null;let r=ct(e);if(t?.aborted)return null;let i=e.highlight?await jt(r,t,n):r;if(i===null||t?.aborted)return null;let a=yt(i);return t?.aborted?null:a},Nt=e=>`${Je(e)}:${e.length}`,Pt=e=>{let t=Ot.get(Nt(e));return t?.source===e?t.html:void 0},Ft=(e,t)=>{let n=Nt(e);Ot.set(n,{source:e,html:t},kt(n)+kt(e)+kt(t))},It=e=>{if(!e)return[];let t=nt(e,!1),n=Array(t.length).fill(``),r=[],i=[];t.forEach((e,t)=>{let a=Pt(e.src);if(a!==void 0){n[t]=a;return}r.push(t),i.push(ct(e))});let a=xt(i);return r.forEach((e,r)=>{let i=a[r]??``;n[e]=i;let o=t[e]?.src;o!==void 0&&Ft(o,i)}),n},Lt=8,Rt=()=>typeof performance<`u`?performance.now():Date.now(),zt=e=>e?.aborted?Promise.resolve(!1):new Promise(t=>{let n=!1,r=r=>{n||(n=!0,e?.removeEventListener(`abort`,a),t(r))},i=B(()=>{r(!e?.aborted)},{priority:`visible`}),a=()=>{i(),r(!1)};e?.addEventListener(`abort`,a,{once:!0})}),Bt=(e,t)=>{let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(!i)return null;let a=Je(i.raw),o=`${t}:${r}:${i.mode}`,s=Dt.get(o);if(!s||s.hash!==a)return null;n.push({id:Ye(i),html:s.html})}return n},Vt=(e,t,n)=>{let r=xt(t.map(e=>e.html));return t.map((t,i)=>{let a=e[i],o=r[i]??``;return a&&At(`${n}:${i}:${a.mode}`,{hash:Je(a.raw),html:o}),{id:t.id,html:o}})},Ht=async(e,t,n,r)=>{let i=n?`visible`:`background`,a=async(e,n)=>{if(r?.aborted)return null;let a=Je(e.raw),o=Ye(e),s=`${t}:${n}:${e.mode}`,c=Dt.get(s);if(c&&c.hash===a)return{id:o,html:c.html};let l=await Mt(e,r,i);return l===null||r?.aborted?null:(At(s,{hash:a,html:l}),{id:o,html:l})};if(n)return(await Promise.all(e.map(a))).filter(e=>e!==null);let o=[],s=0;for(let t=0;t<e.length&&!r?.aborted;t+=1){let n=e[t];if(!n)continue;if(Rt()>=s){if(!await zt(r))break;s=Rt()+Lt}let i=await a(n,t);i&&o.push(i)}return o},Ut=async(e,t,n,r)=>{if(!e)return[];let i=nt(e,t),a=Bt(i,n);if(a)return a;let o=t?`visible`:`background`,s=[],c=[];for(let e=0;e<i.length;e+=1){let t=i[e];if(!t)continue;let r=Dt.get(`${n}:${e}:${t.mode}`);r&&r.hash===Je(t.raw)||(s.push(t),c.push(e))}if(!ht(e,t)&&s.length>0)try{let e=await M({streaming:t,highlight:!0,highlightLineLimit:St(),signal:r,priority:o,blocks:s});if(r?.aborted)return[];if(e&&e.length===s.length)return Vt(i,i.map((t,r)=>{let i=c.indexOf(r);if(i>=0)return e[i]??{id:Ye(t),html:``,highlight:t.highlight};let a=Dt.get(`${n}:${r}:${t.mode}`);return{id:Ye(t),html:a?.html??``,highlight:t.highlight}}),n)}catch{}return Ht(i,n,t,r)},J=e=>Number.isFinite(e)&&e>0,Wt=e=>{if(typeof e==`number`)return J(e)?e:null;if(typeof e!=`string`)return null;let t=e.trim().match(/^([+-]?(?:(?:\d+\.?\d*)|(?:\.\d+))(?:[eE][+-]?\d+)?)(?:px)?$/);if(!t)return null;let n=Number(t[1]);return J(n)?n:null},Gt=(e,t,n)=>Math.min(n,Math.max(t,e)),Kt=6,qt=1.25,Jt=1.0015,Yt=16,Xt=1e3,Zt=.5,Qt=12,$t=400,en=`[data-markdown="mermaid-block"]`,tn=e=>e.querySelector(en)!==null,nn=e=>[e.x,e.y,e.width,e.height].map(e=>{let t=Number(e.toFixed(Kt));return Object.is(t,-0)?`0`:String(t)}).join(` `),rn=e=>{let t=e.viewBox?.trim().split(/[\s,]+/).map(e=>Number.parseFloat(e));if(t?.length===4){let[e,n,r,i]=t;if(Number.isFinite(e)&&Number.isFinite(n)&&J(r)&&J(i))return{x:e,y:n,width:r,height:i}}let n=Wt(e.width),r=Wt(e.height);return n===null||r===null?null:{x:0,y:0,width:n,height:r}},an=e=>{let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)},on=e=>{let t=e.renderMode||`unknown`,n=e.svgMarkup??``;if(!n){let n=[e.viewBox??``,e.width??``,e.height??``];return n.some(e=>e!==``)?`${t}:bounds:${n.join(`:`)}`:`${t}:no-svg`}return[t,an(n)].join(`:`)},sn=(e,t)=>{if(!J(t.width)||!J(t.height))return e;let n=e.width/e.height,r=t.width/t.height;if(n>r){let t=e.width/r;return{x:e.x,y:e.y-(t-e.height)/2,width:e.width,height:t}}let i=e.height*r;return{x:e.x-(i-e.width)/2,y:e.y,width:i,height:e.height}},cn=({currentBox:e,viewport:t,delta:n})=>!J(t.width)||!J(t.height)||!J(e.width)||!J(e.height)?e:{x:e.x-n.x/t.width*e.width,y:e.y-n.y/t.height*e.height,width:e.width,height:e.height},ln=(e,t,n)=>{let r=e*(t===1?Yt:t===2?J(n)?n:0:1);return Number.isFinite(r)?Gt(r,-1e3,Xt):0},un=e=>{let t=null;for(let n of e){if(!t){t=n;continue}return{center:{x:(t.x+n.x)/2,y:(t.y+n.y)/2},distance:Math.hypot(n.x-t.x,n.y-t.y)}}return null},dn=(e,t)=>{let n=t.x-e.x,r=t.y-e.y;return n*n+r*r>9},fn=({currentBox:e,contentBox:t,viewport:n,pointer:r,zoomFactor:i,minScale:a,maxScale:o})=>{if(!J(n.width)||!J(n.height)||!J(i)||!J(e.width)||!J(e.height)||!J(t.width)||!J(t.height)||!J(a)||!J(o))return e;let s=Math.min(a,o),c=Math.max(a,o),l=sn(t,n),u=Gt(l.width/e.width*i,s,c),d=l.width/u,f=d/(e.width/e.height),p=Gt(r.x/n.width,0,1),m=Gt(r.y/n.height,0,1),h=e.x+p*e.width,g=e.y+m*e.height;return{x:h-p*d,y:g-m*f,width:d,height:f}},pn=({currentBox:e,contentBox:t,viewport:n,previousGesture:r,gesture:i,minScale:a,maxScale:o})=>!J(r.distance)||!J(i.distance)?e:fn({currentBox:cn({currentBox:e,viewport:n,delta:{x:i.center.x-r.center.x,y:i.center.y-r.center.y}}),contentBox:t,viewport:n,pointer:i.center,zoomFactor:i.distance/r.distance,minScale:a,maxScale:o}),mn=new WeakMap,hn=e=>e instanceof HTMLElement?mn.get(e)??null:null,gn=e=>e.querySelector(`[data-markdown="mermaid-viewport"]`)??e.querySelector(`[data-markdown="mermaid"]`),_n=e=>{let t=e.querySelector(`[data-markdown="mermaid"] svg`),n=e.querySelector(`[data-markdown="mermaid"]`);return on({renderMode:e.getAttribute(`data-mermaid-render`),svgMarkup:n?.getAttribute(`data-md-original-svg`)??t?.outerHTML??null,viewBox:t?.getAttribute(`viewBox`),width:t?.getAttribute(`width`),height:t?.getAttribute(`height`)})},vn=e=>{let t=e.getBoundingClientRect();return{width:t.width,height:t.height}},yn=(e,t)=>({x:e.clientX-t.left,y:e.clientY-t.top}),bn=(e,t)=>yn(e,t.getBoundingClientRect()),xn=e=>e instanceof Element&&!!e.closest(`button, a, [role="button"]`),Sn=e=>{let t=gn(e),n=e.querySelector(`[data-markdown="mermaid"] svg`);if(!t||!n)return null;let r=rn({viewBox:n.getAttribute(`viewBox`),width:n.getAttribute(`width`),height:n.getAttribute(`height`)});if(!r)return null;let i=r,a=null,o=null,s=null,c=new Map,l=new Set,u=null,d=null,f=e=>{i=e,n.setAttribute(`viewBox`,nn(e)),n.removeAttribute(`width`),n.removeAttribute(`height`)},p=()=>{f(sn(r,vn(t)))},m=(e,n)=>{f(fn({currentBox:i,contentBox:r,viewport:vn(t),pointer:e,zoomFactor:n,minScale:Zt,maxScale:Qt}))},h=()=>{let e=vn(t);m({x:e.width/2,y:e.height/2},qt)},g=()=>{let e=vn(t);m({x:e.width/2,y:e.height/2},1/qt)},_=e=>{e.preventDefault(),e.stopPropagation();let n=ln(e.deltaY,e.deltaMode,vn(t).height);m(bn(e,t),Jt**+-n)},v=e=>{try{t.setPointerCapture(e),l.add(e)}catch{}},y=e=>{if(l.delete(e))try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},b=()=>{a=null,o=null,s=null,c.clear(),u=null},x=()=>{b(),e.removeAttribute(`data-mermaid-panning`),e.hasAttribute(`data-mermaid-suppress-click`)&&(d=window.setTimeout(()=>{e.removeAttribute(`data-mermaid-suppress-click`),d=null},$t))},S=n=>{if(n.pointerType!==`touch`&&n.button!==0||xn(n.target))return;d!==null&&(window.clearTimeout(d),d=null),e.removeAttribute(`data-mermaid-suppress-click`);let r=bn(n,t);v(n.pointerId),e.setAttribute(`data-mermaid-panning`,`true`),n.pointerType===`touch`?(c.set(n.pointerId,r),c.size>=2?(a=null,o=null,s=null,u=un(c.values()),e.setAttribute(`data-mermaid-suppress-click`,`true`)):(a=n.pointerId,o=r,s=r)):(a=n.pointerId,o=r,s=r),n.preventDefault()},C=n=>{if(n.pointerType===`touch`){if(!c.has(n.pointerId))return;let a=bn(n,t);if(c.set(n.pointerId,a),c.size>=2){let a=un(c.values());u&&a&&f(pn({currentBox:i,contentBox:r,viewport:vn(t),previousGesture:u,gesture:a,minScale:Zt,maxScale:Qt})),u=a,e.setAttribute(`data-mermaid-suppress-click`,`true`),n.preventDefault();return}}if(a!==n.pointerId||!s)return;let l=bn(n,t);f(cn({currentBox:i,viewport:vn(t),delta:{x:l.x-s.x,y:l.y-s.y}})),s=l,o&&dn(o,l)&&e.setAttribute(`data-mermaid-suppress-click`,`true`),n.preventDefault()},w=e=>{if(e.pointerType===`touch`||c.has(e.pointerId)){if(!c.has(e.pointerId))return;if(c.delete(e.pointerId),u=un(c.values()),c.size>0){for(let[e,t]of c){a=e,o=t,s=t;break}c.size>=2&&(a=null,o=null,s=null),y(e.pointerId);return}x(),y(e.pointerId);return}a===e.pointerId&&(x(),y(e.pointerId))},T=()=>{p()};t.addEventListener(`wheel`,_,{passive:!1}),t.addEventListener(`pointerdown`,S),t.addEventListener(`pointermove`,C),t.addEventListener(`pointerup`,w),t.addEventListener(`pointercancel`,w),t.addEventListener(`lostpointercapture`,w),window.addEventListener(`resize`,T);let E=typeof ResizeObserver>`u`?null:new ResizeObserver(T);return E?.observe(t),p(),{zoomIn:h,zoomOut:g,fit:p,cleanup:()=>{t.removeEventListener(`wheel`,_),t.removeEventListener(`pointerdown`,S),t.removeEventListener(`pointermove`,C),t.removeEventListener(`pointerup`,w),t.removeEventListener(`pointercancel`,w),t.removeEventListener(`lostpointercapture`,w),window.removeEventListener(`resize`,T),E?.disconnect(),d!==null&&window.clearTimeout(d);for(let e of Array.from(l))y(e);b(),e.removeAttribute(`data-mermaid-panning`),e.removeAttribute(`data-mermaid-suppress-click`),mn.delete(e)}}},Cn=e=>{let t=new Map,n=new Map,r=()=>{for(let[r,i]of Array.from(t.entries())){let a=_n(r);(!e.contains(r)||a!==n.get(r))&&(i.cleanup(),t.delete(r),n.delete(r))}for(let r of Array.from(e.querySelectorAll(en))){if(t.has(r)||r.querySelector(`[data-markdown="mermaid"] svg`)===null)continue;let e=Sn(r);e&&(t.set(r,e),n.set(r,_n(r)),mn.set(r,e))}};return r(),{refresh:r,cleanup:()=>{for(let e of t.values())e.cleanup();t.clear(),n.clear()}}},wn=new Set([`dockerfile`,`makefile`,`readme`,`license`,`.env`,`.gitignore`,`.npmrc`]),Tn=Array.from(wn).map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),En=e=>le(e),Dn=e=>U(e),On=e=>{if(!e||e.startsWith(`--`)||e.includes(`://`)||/[<>]/.test(e)||/\s{2,}/.test(e))return!1;let t=En(e),n=t.split(`/`).filter(Boolean).pop()??t;if(!n||n===`.`||n===`..`)return!1;let r=n.toLowerCase();return wn.has(r)||r.startsWith(`.`)&&r.length>1?!0:!t.includes(`/`)&&/^\d+\.\d+$/.test(n)?!1:/\.[A-Za-z0-9_-]{1,16}$/.test(n)},kn=e=>{let t=(e||``).trim();return t?((t.startsWith("`")&&t.endsWith("`")||t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`))&&(t=t.slice(1,-1).trim()),t=t.replace(/[.,;!?]+$/g,``),t.endsWith(`)`)&&!t.includes(`(`)&&(t=t.slice(0,-1)),t.endsWith(`]`)&&!t.includes(`[`)&&(t=t.slice(0,-1)),t):``},An=e=>{let t=kn(e);if(!t)return``;let n=t.indexOf(`;`);n>=0&&(t=t.slice(0,n)),t=t.replace(/#.*$/,``);let r=t.match(/^(.*\.[A-Za-z0-9_-]{1,16}):.*$/);r&&(t=r[1]??t);let i=Tn.length>0?t.match(RegExp(`^(.*(?:/|^)(${Tn})):.*$`,`i`)):null;return i&&(t=i[1]??t),kn(t)},jn=e=>{let t=kn(e);if(!t)return null;let n=t.indexOf(`;`),r=n>=0?kn(t.slice(0,n)):t;if(!r)return null;let i=r.match(/^(.*?):(\d+)-(\d+)$/);if(i){let e=An(i[1]??``),t=Number.parseInt(i[2]??``,10),n=Number.parseInt(i[3]??``,10);return!e||!Number.isFinite(t)||!Number.isFinite(n)||n<t?null:{path:e,line:t,endLine:n}}let a=r.match(/^(.*)#L(\d+)(?:C(\d+))?$/i);if(a){let e=An(a[1]??``),t=Number.parseInt(a[2]??``,10),n=a[3]?Number.parseInt(a[3],10):void 0;return!e||!Number.isFinite(t)?null:{path:e,line:t,column:Number.isFinite(n??NaN)?n:void 0}}let o=r.match(/^(.*?):(\d+)(?::(\d+))?$/);if(o){let e=An(o[1]??``),t=Number.parseInt(o[2]??``,10),n=o[3]?Number.parseInt(o[3],10):void 0;return!e||!Number.isFinite(t)?null:{path:e,line:t,column:Number.isFinite(n??NaN)?n:void 0}}let s=An(r);return s?{path:s}:null},Mn=/(?:[A-Za-z]:[\\/])?[\w.\-/@+]*[\w\-/@+]\.[A-Za-z0-9]{1,8}(?::\d+(?:-\d+)?(?::\d+)?)?/g,Nn=`(?:(?:[0-9][\\w.@+\\- 一-鿿]*|[一-鿿][\\w.@+\\- 一-鿿]*)|[\\w.@+\\-一-鿿]+)`,Pn=RegExp(`(?:[A-Za-z]:[\\\\/]|\\.{1,2}\\/|\\/)?(?:${Nn}\\/)+${Nn}\\.[A-Za-z0-9]{1,8}(?::\\d+(?:-\\d+)?(?::\\d+)?)?`,`g`),Fn=`data-openchamber-block-path-token`,In=`[${Fn}]`,Ln=`data-openchamber-file-link`,Rn=`[${Ln}="true"]`,zn=[Ln,`data-openchamber-file-ref`,`data-openchamber-file-path`,`data-openchamber-file-binary`,`title`,`role`,`tabindex`],Bn=`data-openchamber-block-paths-scanned`,Vn=`data-openchamber-paragraph-paths-scanned`,Hn=`pre, code, a, script, style, button, [${Ln}], ${In}`,Un=2e5,Wn=e=>{let t=jn(e);return t?On(t.path):!1},Gn=(e,t)=>{let n=0;for(let r of e){let e=n+r.data.length;if(t<=e)return{node:r,offset:Math.max(0,t-n)};n=e}let r=e.at(-1);return r?{node:r,offset:r.data.length}:null},Kn=e=>{let t=e.querySelectorAll(`pre code`);if(t.length===0)return;let n=e.ownerDocument;if(n)for(let e of Array.from(t)){if(e.getAttribute(Bn)===`true`)continue;if((e.textContent??``).length>Un){e.setAttribute(Bn,`true`);continue}let t=n.createTreeWalker(e,NodeFilter.SHOW_TEXT),r=[],i=t.nextNode();for(;i;)r.push(i),i=t.nextNode();let a=e.textContent??``;if(!a.includes(`.`)){e.setAttribute(Bn,`true`);continue}Mn.lastIndex=0;let o=[],s=Mn.exec(a);for(;s;){let e=s[0];e&&Wn(e)&&o.push({start:s.index,end:s.index+e.length,raw:e}),s=Mn.exec(a)}for(let{start:e,end:t,raw:i}of o.reverse()){let a=Gn(r,e),o=Gn(r,t);if(!a||!o)continue;let s=n.createRange();s.setStart(a.node,a.offset),s.setEnd(o.node,o.offset);let c=n.createElement(`span`);c.setAttribute(Fn,`true`),c.textContent=i,s.deleteContents(),s.insertNode(c)}e.setAttribute(Bn,`true`)}},qn=e=>{let t=e.ownerDocument;if(!t)return;let n=e.querySelectorAll(`p, li, blockquote, h1, h2, h3, h4, h5, h6, td, th`);if(n.length!==0)for(let e of Array.from(n)){if(e.getAttribute(Vn)===`true`)continue;if(e.closest(Hn)){e.setAttribute(Vn,`true`);continue}let n=t.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>{let t=e.parentElement;return!t||t.closest(Hn)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),r=[],i=n.nextNode();for(;i;)r.push(i),i=n.nextNode();if(r.length===0){e.setAttribute(Vn,`true`);continue}let a=r.map(e=>e.data).join(``);if(!a.includes(`/`)||!a.includes(`.`)){e.setAttribute(Vn,`true`);continue}Pn.lastIndex=0;let o=[],s=Pn.exec(a);for(;s;){let e=s[0];if(!e){s=Pn.exec(a);continue}let t=s.index>=2?a.slice(s.index-2,s.index):``;if((s.index>=1?a.charAt(s.index-1):``)===`:`||t===`:/`){s=Pn.exec(a);continue}Wn(e)&&o.push({start:s.index,end:s.index+e.length,raw:e}),s=Pn.exec(a)}for(let{start:e,end:n,raw:i}of o.reverse()){let a=Gn(r,e),o=Gn(r,n);if(!a||!o)continue;let s=t.createRange();s.setStart(a.node,a.offset),s.setEnd(o.node,o.offset);let c=t.createElement(`span`);c.setAttribute(Fn,`true`),c.textContent=i,s.deleteContents(),s.insertNode(c)}e.setAttribute(Vn,`true`)}},Jn=e=>{Kn(e),qn(e)},Yn=(e,t)=>{if(e.getAttribute(`data-openchamber-file-link`)!==`true`)return;let n=(e.getAttribute(`data-openchamber-file-ref`)||e.textContent||``).trim(),r=(t.textContent||``).trim();if(!(!n||n!==r))for(let n of zn){let r=e.getAttribute(n);r===null?t.removeAttribute(n):t.setAttribute(n,r)}},Y=(e,t=`size-3.5`)=>`<svg class="oc-icon ${t}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#oc-${e}"></use></svg>`,Xn={copy:Y(`file-copy`),check:Y(`check`),download:Y(`download`),zoomIn:Y(`add`),zoomOut:Y(`subtract`),fit:Y(`refresh`),textWrap:Y(`text-wrap`),image:Y(`file-image`,`size-10`),imageDownload:Y(`download`,`size-3`),imageLoading:Y(`loader-4`,`size-3.5 animate-spin motion-reduce:animate-none`)},Zn=`p-1 rounded hover:bg-interactive-hover/60 text-muted-foreground hover:text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--interactive-focus-ring)]`,Qn=(e,t)=>{e.innerHTML=t},X=(e,t,n)=>{let r=document.createElement(`button`);return r.type=`button`,r.className=Zn,r.setAttribute(`data-md-action`,n),r.setAttribute(`title`,t),r.setAttribute(`aria-label`,t),Qn(r,Xn[e]),r},$n=(e,t,n)=>{let r=e.querySelector(`[data-md-code-body]`),i=e.querySelector(`pre`),a=e.querySelector(`pre code`),o=e.querySelector(`[data-md-action="toggle-code-wrap"]`);if(e.setAttribute(`data-code-wrap`,t?`true`:`false`),r?.classList.toggle(`overflow-x-auto`,!t),r?.classList.toggle(`overflow-x-hidden`,t),i?.classList.toggle(`whitespace-pre-wrap`,t),i?.classList.toggle(`break-words`,t),a?.classList.toggle(`whitespace-pre-wrap`,t),a?.classList.toggle(`break-words`,t),i&&(i.style.whiteSpace=t?`pre-wrap`:`pre`,i.style.overflowWrap=t?`anywhere`:`normal`),a&&(a.style.whiteSpace=t?`pre-wrap`:`pre`,a.style.overflowWrap=t?`anywhere`:`normal`),o){let e=t?n.disableCodeWrap:n.enableCodeWrap;o.setAttribute(`title`,e),o.setAttribute(`aria-label`,e),o.classList.toggle(`text-foreground`,t),o.classList.toggle(`opacity-100`,t),o.classList.toggle(`text-muted-foreground`,!t),o.classList.toggle(`opacity-65`,!t),o.setAttribute(`aria-pressed`,t?`true`:`false`)}},er=e=>{let t=document.createElement(`div`);t.setAttribute(`data-md-code-line-numbers`,``),t.setAttribute(`aria-hidden`,`true`),t.className=`min-w-8 shrink-0 select-none border-r border-border/50 pr-3 text-right font-mono text-[13px] text-muted-foreground/45`;let n=e.textContent??``,r=Math.max(1,n.endsWith(`
7
- `)?n.split(`
8
- `).length-1:n.split(`
9
- `).length);for(let e=1;e<=r;e+=1){let n=document.createElement(`div`);n.className=`tabular-nums`,n.textContent=String(e),t.appendChild(n)}return t},tr=e=>{let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),r=n.nextNode();for(;r;)t.push(r),r=n.nextNode();return t},nr=(e,t)=>{let n=0;for(let r of e){let e=n+r.data.length;if(t<=e)return{node:r,offset:Math.max(0,t-n)};n=e}let r=e.at(-1);return r?{node:r,offset:r.data.length}:null},rr=(e,t)=>{let n=1/0,r=-1/0;for(let t=0;t<e.length;t+=1){let i=e[t];!i||i.width===0&&i.height===0||(i.top<n&&(n=i.top),i.bottom>r&&(r=i.bottom))}return!Number.isFinite(n)||r<=n?t:Math.max(t,r-n)},ir=e=>Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.classList.contains(`line`)),ar=(e,t,n)=>{e.style.height=`${t}px`,e.style.lineHeight=`${n}px`},or=(e,t,n)=>{let r=document.createRange();r.setStart(e.node,e.offset),r.setEnd(t.node,t.offset);let i=Math.max(rr(r.getClientRects(),n),rr([r.getBoundingClientRect()],n));return r.detach(),i},sr=e=>{let t=e.querySelectorAll(`[data-component="markdown-code"]`);for(let e of Array.from(t)){let t=e.querySelector(`pre code`),n=e.querySelector(`[data-md-code-line-numbers]`);if(!t||!n)continue;let r=Array.from(n.children),i=window.getComputedStyle(t),a=Number.parseFloat(i.lineHeight)||20;n.style.fontFamily=i.fontFamily,n.style.fontSize=i.fontSize,n.style.lineHeight=`${a}px`;let o=ir(t);if(o.length===r.length){let e=o.map(e=>e.getBoundingClientRect()),t=e=>(e?.textContent??``).length===0;for(let n=0;n<r.length;n+=1){let i=r[n],s=o[n],c=e[n];if(!i||!s||!c)continue;if(t(s)){ar(i,a,a);continue}let l=o[n+1],u=e[n+1],d=u&&!t(l)?u.top:c.bottom;ar(i,rr([{top:c.top,bottom:d,width:1,height:d-c.top}],a),a)}continue}let s=t.textContent??``,c=tr(t),l=0;for(let e=0;e<r.length;e+=1){let t=s.indexOf(`
10
- `,l),n=t===-1?s.length:t,i=r[e];if(!i)continue;let o=nr(c,l),u=nr(c,n);!o||!u||l===n?ar(i,a,a):ar(i,or(o,u,a),a),l=n+1}}},cr=e=>{window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>sr(e))})},lr=(e,t,n)=>{let r=e.querySelectorAll(`[data-component="markdown-code"]`);for(let e of Array.from(r)){let r=e.querySelector(`[data-md-code-body]`),i=e.querySelector(`pre`);r&&i&&!r.querySelector(`[data-md-code-line-numbers]`)&&(r.classList.add(`flex`,`gap-3`),r.insertBefore(er(i),i)),$n(e,t,n)}cr(e)},ur=(e,t,n,r)=>{Qn(e,Xn.check),e.setAttribute(`title`,t),e.setAttribute(`aria-label`,t),window.setTimeout(()=>{Qn(e,Xn[n]),e.setAttribute(`title`,r),e.setAttribute(`aria-label`,r)},2e3)},dr=e=>{let t=e.querySelectorAll(`:not(pre) > code`);for(let e of Array.from(t))e.getAttribute(`data-markdown`)!==`inline-code`&&e.setAttribute(`data-markdown`,`inline-code`)},fr=(e,t)=>{let n=e.querySelectorAll(`pre`);for(let e of Array.from(n)){if(e.querySelector(`code.language-mermaid`))continue;let n=e.parentElement;if(!n||n.closest(`[data-component="markdown-code"]`))continue;let r=e.querySelector(`code`)?.className.match(/language-([^\s"]+)/)?.[1],i=e.getAttribute(`data-md-label`)??e.getAttribute(`data-md-lang`)??Be(r).label,a=document.createElement(`div`);a.setAttribute(`data-component`,`markdown-code`),a.className=`my-4 group overflow-clip rounded-2xl border border-border/80 bg-[var(--surface-elevated)]`;let o=document.createElement(`div`);o.className=`flex items-center justify-between border-b border-border/70 px-3 py-1.5`;let s=document.createElement(`span`);s.className=`font-mono text-[13px] text-muted-foreground`,s.textContent=i;let c=X(`copy`,t.labels.copy,`copy-code`),l=X(`textWrap`,t.codeBlockLineWrap?t.labels.disableCodeWrap:t.labels.enableCodeWrap,`toggle-code-wrap`);o.appendChild(s);let u=document.createElement(`div`);u.className=`flex items-center gap-1`,u.appendChild(l),u.appendChild(c),o.appendChild(u);let d=document.createElement(`div`);d.setAttribute(`data-md-code-body`,``),d.className=`px-3 py-2.5 overflow-x-auto`,n.replaceChild(a,e),e.style.margin=`0`,e.style.background=`transparent`,e.classList.add(`min-w-0`,`w-full`,`flex-1`),d.appendChild(e),a.appendChild(o),a.appendChild(d),$n(a,t.codeBlockLineWrap,t.labels)}},pr=e=>{let t=e.querySelectorAll(`table`);for(let e of Array.from(t)){if(e.closest(`[data-markdown="table-wrapper"]`))continue;let t=document.createElement(`div`);t.className=`my-4`,t.setAttribute(`data-markdown`,`table-wrapper`);let n=document.createElement(`div`);n.setAttribute(`data-markdown`,`table-scroll`);let r=e.parentElement;if(r){r.replaceChild(t,e),e.setAttribute(`data-markdown`,`table`);for(let t of Array.from(e.querySelectorAll(`tr`)))t.setAttribute(`data-markdown`,`table-row`);for(let t of Array.from(e.querySelectorAll(`th`)))t.setAttribute(`data-markdown`,`table-header-cell`);for(let t of Array.from(e.querySelectorAll(`td`)))t.setAttribute(`data-markdown`,`table-cell`);n.appendChild(e),t.appendChild(n)}}},mr=(e,t)=>{let n=e.querySelectorAll(`pre > code.language-mermaid`);for(let e of Array.from(n)){let n=e.parentElement;if(!n)continue;let r=(e.textContent??``).replace(/\s+$/,``),i=t.renderMermaid(r),a=document.createElement(`div`);a.setAttribute(`data-markdown`,`mermaid-block`),a.setAttribute(`data-md-source`,r),a.className=`group relative`;let o=document.createElement(`div`);o.setAttribute(`data-markdown`,`mermaid-scroll`);let s=document.createElement(`div`);if(s.setAttribute(`data-markdown`,`mermaid-toolbar`),s.className=`absolute top-1 right-2 flex items-center gap-1 opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition-opacity`,i.svg){a.setAttribute(`data-mermaid-render`,`svg`);let e=document.createElement(`div`);e.setAttribute(`data-markdown`,`mermaid-viewport`);let n=document.createElement(`div`);if(n.setAttribute(`data-markdown`,`mermaid`),n.setAttribute(`data-md-original-svg`,i.svg),n.innerHTML=i.svg,e.appendChild(n),o.appendChild(e),t.mermaidControls.showPanZoomControls&&(s.appendChild(X(`zoomIn`,t.labels.zoomInDiagram,`mermaid-zoom-in`)),s.appendChild(X(`zoomOut`,t.labels.zoomOutDiagram,`mermaid-zoom-out`)),s.appendChild(X(`fit`,t.labels.resetDiagramView,`mermaid-fit`))),t.mermaidControls.copy){let e=X(`copy`,t.labels.copyDiagram,`mermaid-copy`);e.setAttribute(`data-md-source`,r),s.appendChild(e)}if(t.mermaidControls.download){let e=X(`download`,t.labels.downloadDiagram,`mermaid-download`);e.setAttribute(`data-md-svg`,`1`),s.appendChild(e)}}else{a.setAttribute(`data-mermaid-render`,`ascii`);let e=document.createElement(`pre`);if(e.setAttribute(`data-markdown`,`mermaid-ascii`),e.textContent=i.ascii||r,o.appendChild(e),t.mermaidControls.copy){let e=X(`copy`,t.labels.copyDiagram,`mermaid-copy`);e.setAttribute(`data-md-source`,i.ascii||r),s.appendChild(e)}}a.appendChild(o),a.appendChild(s);let c=n.parentElement;c&&c.replaceChild(a,n)}},hr=(e,t)=>{let n=e.querySelectorAll(`a[href]`);for(let e of Array.from(n)){if(e.getAttribute(`data-md-link-decorated`)===`true`||e.getAttribute(`data-openchamber-file-link`)===`true`)continue;let n=e.getAttribute(`href`)??``;if(!A(n))continue;e.setAttribute(`data-md-link-decorated`,`true`);let r=k(n);if(r){let t=document.createElement(`span`);t.className=`mr-1 inline-flex size-[18px] items-center justify-center rounded border border-[var(--border)] bg-[var(--interactive-hover)] align-middle`;let n=document.createElement(`img`);n.setAttribute(`data-md-link-favicon`,`true`),n.src=r,n.alt=``,n.setAttribute(`aria-hidden`,`true`),n.loading=`lazy`,n.decoding=`async`,n.className=`size-3.5 rounded-sm`,n.addEventListener(`error`,()=>t.remove(),{once:!0}),t.appendChild(n),e.parentNode?.insertBefore(t,e)}if(t.onPreviewLoopback&&O(n)){let r=document.createElement(`button`);r.type=`button`,r.className=`ml-1 align-middle ${Zn}`,r.setAttribute(`data-md-action`,`preview-loopback`),r.setAttribute(`data-md-url`,n),r.setAttribute(`title`,t.labels.previewTitle),r.setAttribute(`aria-label`,t.labels.previewLabel),Qn(r,Xn.download),e.parentNode?.insertBefore(r,e.nextSibling)}}},gr=`img:not([data-md-link-favicon="true"])`,_r=`[data-md-image-presentation="true"]`,vr=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="576" height="324" viewBox="0 0 576 324"%3E%3C/svg%3E`,yr=[`block`,`max-w-full`,`rounded-xl`,`border`,`border-border/80`,`bg-[var(--surface-muted)]`,`transition-colors`,`focus-visible:outline`,`focus-visible:outline-2`,`focus-visible:outline-offset-2`,`focus-visible:outline-[var(--interactive-focus-ring)]`],br=[`cursor-pointer`,`hover:bg-interactive-hover/60`],xr=[`aspect-video`,`h-auto`,`w-full`,`max-w-xl`,`object-contain`],Sr=e=>{let t=e.parentElement;if(t?.matches(_r))return t;let n=document.createElement(`span`);n.setAttribute(`data-md-image-presentation`,`true`),n.className=`relative my-4 block w-fit max-w-full`;let r=document.createElement(`span`);r.setAttribute(`data-md-image-placeholder-visual`,`true`),r.setAttribute(`aria-hidden`,`true`),r.className=`pointer-events-none absolute inset-0 flex items-center justify-center text-muted-foreground`;let i=document.createElement(`span`);i.className=`relative flex size-14 items-center justify-center rounded-2xl border border-border/80 bg-[var(--surface-elevated)] shadow-sm`,Qn(i,Xn.image);let a=document.createElement(`span`);a.setAttribute(`data-md-image-download-badge`,`true`),a.className=`absolute -right-1.5 -bottom-1.5 flex size-6 items-center justify-center rounded-full border border-border bg-[var(--surface-elevated)] text-foreground shadow-sm`,Qn(a,Xn.imageDownload);let o=document.createElement(`span`);return o.setAttribute(`data-md-image-loading-badge`,`true`),o.className=`absolute -right-1.5 -bottom-1.5 hidden size-6 items-center justify-center rounded-full border border-border bg-[var(--surface-elevated)] text-foreground shadow-sm`,Qn(o,Xn.imageLoading),i.appendChild(a),i.appendChild(o),r.appendChild(i),t?.replaceChild(n,e),n.appendChild(e),n.appendChild(r),n},Cr=e=>{e.src=vr,e.setAttribute(`data-md-placeholder-source`,vr),e.setAttribute(`data-md-image-state`,`placeholder`),e.classList.add(...xr)},wr=e=>{e.removeAttribute(`data-md-image-state`),e.removeAttribute(`data-md-placeholder-source`),e.removeAttribute(`aria-busy`),e.classList.remove(...xr)},Tr=(e,t)=>{if(!t.imagePreviewEnabled)return;let n=e.querySelectorAll(gr);for(let e of Array.from(n)){let n=e.getAttribute(`data-md-image-source`)??e.getAttribute(`src`)??``,r=ce(n,t.imageEffectiveDirectory);ae(r)&&(e.classList.add(...yr,...br),e.setAttribute(`role`,`button`),e.setAttribute(`tabindex`,`0`),e.setAttribute(`data-md-image-source`,n),Sr(e),Cr(e))}},Er=(e,t)=>{dr(e),mr(e,t),fr(e,t),pr(e),hr(e,t),Tr(e,t),Jn(e)},Dr=(e,t,n)=>{let r=new Blob([t],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)},Or=(e,t)=>{let n=e=>{let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`[data-md-action]`);if(!r)return;let i=r.getAttribute(`data-md-action`)??``;if(i===`copy-code`){let e=r.closest(`[data-component="markdown-code"]`)?.querySelector(`code`)?.textContent??``;e&&v(e).then(()=>ur(r,t.labels.copied,`copy`,t.labels.copy));return}if(i===`toggle-code-wrap`){e.preventDefault(),t.onToggleCodeBlockLineWrap?.();return}if(i===`mermaid-copy`){let e=r.getAttribute(`data-md-source`)??``;e&&v(e).then(()=>ur(r,t.labels.copied,`copy`,t.labels.copyDiagram));return}if(i===`mermaid-zoom-in`||i===`mermaid-zoom-out`||i===`mermaid-fit`){e.preventDefault();let t=hn(r.closest(`[data-markdown="mermaid-block"]`));i===`mermaid-zoom-in`?t?.zoomIn():i===`mermaid-zoom-out`?t?.zoomOut():t?.fit();return}if(i===`mermaid-download`){let e=r.closest(`[data-markdown="mermaid-block"]`)?.querySelector(`[data-markdown="mermaid"]`),t=e?.getAttribute(`data-md-original-svg`)??e?.innerHTML??``;t&&Dr(`diagram.svg`,t,`image/svg+xml;charset=utf-8`);return}if(i===`preview-loopback`){e.preventDefault();let n=r.getAttribute(`data-md-url`)??``;n&&t.onPreviewLoopback?.(n);return}};return e.addEventListener(`click`,n),()=>e.removeEventListener(`click`,n)},kr=`Open file`,Ar=4,jr=1e3,Mr=200,Nr=80,Pr=40,Z=new Map,Fr=new Map,Ir=0,Lr=[],Rr=()=>c()?Mr:jr,zr=()=>c()?Pr:Nr,Br=(e,t)=>{Fr.set(e,t)},Vr=()=>{let e=Z.keys().next().value;typeof e==`string`&&(Z.delete(e),Fr.delete(e))},Hr=(e,t)=>{let n=Rr();for(;Z.size>=n;)Vr();Z.set(e,t)},Ur=e=>{let t=En(e);if(t)return Fr.get(t)},Wr=e=>{if(e.tagName.toLowerCase()===`a`){let t=e.getAttribute(`href`)?.trim();if(t&&Wn(t))return t}return(e.textContent||``).trim()},Gr=(e,t)=>{let n=jn(e);if(!n||!On(n.path))return null;let r=Dn(n.path)?En(n.path):se(t,n.path);return r?{...n,resolvedPath:r}:null},Kr=e=>{let t=En(e);if(!t)return Promise.resolve({exists:!1,isBinary:!1});let n=Z.get(t);if(n)return Z.delete(t),Z.set(t,n),n;let i=new Promise(e=>{let n=()=>{Ir+=1,r(`/api/fs/stat?path=${encodeURIComponent(t)}&optional=true`,{method:`GET`,cache:`no-store`}).then(async n=>{if(!n.ok){let n={exists:!1,isBinary:!1};Br(t,n),e(n);return}let r=await n.json().catch(()=>null),i={exists:r?.exists!==!1,isBinary:r?.isBinary===!0};Br(t,i),e(i)}).catch(()=>{let n={exists:!1,isBinary:!1};Br(t,n),e(n)}).finally(()=>{Ir=Math.max(0,Ir-1),Lr.shift()?.()})};if(Ir<Ar){n();return}Lr.push(n)});return Hr(t,i),i},qr=(e,t)=>{if(!(i()&&o()&&!W(e,t)))return Kr(e);let n=En(e);if(!n)return Promise.resolve({exists:!1,isBinary:!1});let r=Z.get(n);if(r)return Z.delete(n),Z.set(n,r),r;let s=a(e).then(e=>{let t={exists:!0,isBinary:e===!0};return Br(n,t),t});return Hr(n,s),s},Jr=(e,t,n)=>!(!t.exists||n&&t.isBinary&&!j(e)&&!F(e)),Yr=(e,t)=>e||oe(e,t),Xr=async(e,t,n)=>{let r=Gr(e,n.effectiveDirectory);if(!r)return;let i=r.resolvedPath.toLowerCase().endsWith(`.app`);if((t||i)&&!j(r.resolvedPath)&&!F(r.resolvedPath)&&await s(r.resolvedPath))return;if(j(r.resolvedPath)&&n.onShowPopup){let e=r.resolvedPath.split(`/`).filter(Boolean).pop()??r.resolvedPath;n.onShowPopup({open:!0,title:e,content:``,metadata:{tool:`image-preview`,filename:e,mime:N(r.resolvedPath)},image:{url:r.resolvedPath,filename:e,mimeType:N(r.resolvedPath)}});return}let a=Yr(n.effectiveDirectory,r.resolvedPath),o=F(r.resolvedPath);if(n.preferRuntimeEditor&&n.editor&&!o){n.editor.openFile(r.resolvedPath,Number.isFinite(r.line??NaN)?Math.max(1,Math.trunc(r.line)):void 0,Number.isFinite(r.column??NaN)?Math.max(1,Math.trunc(r.column)):void 0);return}W(r.resolvedPath,n.effectiveDirectory)||await I(r.resolvedPath,n.effectiveDirectory);let c=f.getState();if(o){c.openContextFile(a,r.resolvedPath,{viewerMode:`preview`});return}if(Number.isFinite(r.line??NaN)){c.openContextFileAtLine(a,r.resolvedPath,Math.max(1,Math.trunc(r.line)),Number.isFinite(r.column??NaN)?Math.max(1,Math.trunc(r.column)):1);return}c.openContextFile(a,r.resolvedPath)},Zr=async(e,t)=>{await Xr(e.getAttribute(`data-openchamber-file-ref`)||Wr(e),e.getAttribute(`data-openchamber-file-binary`)===`true`,t)},Qr=t({MarkdownRenderer:()=>Ti,SimpleMarkdownRenderer:()=>Ei}),Q=l(),$r=()=>{let e=(0,be.c)(4),t=S(),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=T(!1),e[0]=n):n=e[0];let r=n,i;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(i=T(!0),e[1]=i):i=e[1];let a=i,o;return e[2]===t?.currentTheme?o=e[3]:(o=t?.currentTheme??(typeof window<`u`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?a:r),e[2]=t?.currentTheme,e[3]=o),o},ei=e=>{let t=(0,be.c)(2),{containerRef:n,enabled:r}=e,i;t[0]===r?i=t[1]:(i=e=>{if(r===!1||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;let t=e.target;if(!(t instanceof Element)||t.closest($))return;let n=t.closest(`a[href]`);if(!(n instanceof HTMLAnchorElement)||n.getAttribute(`data-openchamber-file-link`)===`true`)return;let i=n.getAttribute(`href`)??``;A(i)&&(e.preventDefault(),e.stopPropagation(),D(i))},t[0]=r,t[1]=i);let a=g(i);_(`click`,a,n)},$=`img:not([data-md-link-favicon="true"])`,ti=e=>e.getAttribute(`data-md-image-source`)??e.getAttribute(`src`)??``,ni=({containerRef:e,effectiveDirectory:t,onShowPopup:r})=>{let i=K.useRef(null);i.current??=n();let a=i.current,o=!!r,s=g(e=>r?.(e)),c=K.useRef(()=>{}),l=K.useRef(new Map),u=K.useRef(null),d=K.useMemo(()=>e=>c.current(e),[]);return K.useLayoutEffect(()=>{let n=l.current;if(u.current!==null&&(clearTimeout(u.current),u.current=null),c.current=()=>{},!o){for(let[e,t]of n)t.controller?.abort(),t.objectUrl&&H(t.objectUrl),n.delete(e);return}let r=e.current;if(!r)return;let i=e=>{let t=Array.from(r.querySelectorAll($));if(t.indexOf(e)<0)return;let n=t.map(e=>({url:ti(e),filename:e.alt||ti(e)||void 0})).filter(e=>e.url),i=ti(e),a=n.findIndex(e=>e.url===i),o=e.alt||i;s({open:!0,title:o,content:``,metadata:{tool:`image-preview`,filename:o},image:{url:i,filename:o,gallery:n,index:Math.max(0,a)}})},d=e=>{let t=n.get(e);t&&(t.controller?.abort(),t.objectUrl&&H(t.objectUrl),n.delete(e))},f=e=>{let n=ti(e),r=ce(n,t);if(ae(r))return`${a}\n${t}\n${n}`},p=e=>{let t=f(e);if(!t){d(e);return}let r=n.get(e);if(r?.key===t)return r;d(e);let i={key:t};return n.set(e,i),i},m=(e,i)=>{if(i.controller||i.objectUrl||!r.contains(e))return;let a=ti(e),o=ce(a,t);if(!ae(o)){d(e);return}let s=new AbortController;i.controller=s,e.setAttribute(`data-md-image-state`,`loading`),e.setAttribute(`aria-busy`,`true`),ue(o.path,s.signal).then(t=>{let r=n.get(e);if(!r||r!==i||r.controller!==s||s.signal.aborted){H(t);return}r.controller=void 0,r.objectUrl=t,wr(e),e.setAttribute(`data-md-image-state`,`loaded`),e.src=t}).catch(()=>{let t=n.get(e);t===i&&(t.controller=void 0,e.removeAttribute(`aria-busy`),e.setAttribute(`data-md-image-state`,`placeholder`))})};c.current=e=>{for(let[t,r]of n)(!e.contains(t)||f(t)!==r.key)&&d(t);for(let t of Array.from(e.querySelectorAll($))){let e=p(t);e&&!e.objectUrl&&m(t,e)}},c.current(r);let h=e=>{let t=p(e);if(t&&!t.objectUrl){m(e,t);return}i(e)},g=e=>{let n=ti(e);n&&C({sourceUrl:n,displayUrl:e.currentSrc||e.src||void 0,filename:e.alt||n,effectiveDirectory:t})},_=z(),v=e=>ti(e)||e.src||`markdown-image`,y=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest($);if(n){if(_.consumeClick(v(n))){e.preventDefault(),e.stopPropagation();return}e.preventDefault(),e.stopPropagation(),h(n)}},b=e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target;!(t instanceof HTMLImageElement)||!t.matches($)||(e.preventDefault(),e.stopPropagation(),h(t))},x=e=>{if(e.pointerType===`mouse`&&e.button!==0)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest($);n&&_.start({pointerId:e.pointerId,key:v(n),clientX:e.clientX,clientY:e.clientY,onTrigger:()=>g(n)})},S=e=>{_.move(e.pointerId,e.clientX,e.clientY)},w=e=>{_.end(e.pointerId)},T=e=>{_.cancel(e.pointerId)},E=e=>{let t=e.target;if(!(t instanceof Element))return;let n=t.closest($);n&&(e.preventDefault(),e.stopPropagation(),_.openFromContextMenu(v(n),()=>g(n)))};return r.addEventListener(`click`,y),r.addEventListener(`keydown`,b),r.addEventListener(`pointerdown`,x),r.addEventListener(`pointermove`,S),r.addEventListener(`pointerup`,w),r.addEventListener(`pointercancel`,T),r.addEventListener(`contextmenu`,E),()=>{c.current=()=>{},_.reset(),r.removeEventListener(`click`,y),r.removeEventListener(`keydown`,b),r.removeEventListener(`pointerdown`,x),r.removeEventListener(`pointermove`,S),r.removeEventListener(`pointerup`,w),r.removeEventListener(`pointercancel`,T),r.removeEventListener(`contextmenu`,E),u.current=setTimeout(()=>{u.current=null;for(let e of Array.from(n.keys()))r.contains(e)&&Cr(e),d(e)},0)}},[e,t,o,a]),{reconcileMarkdownImageResources:d,transportIdentity:a}},ri={download:!0,copy:!0,showPanZoomControls:!0},ii=!0,ai=e=>{let t=e.match(/^(?:\uFEFF)?(---|\+\+\+)[^\S\r\n]*\r?\n[\s\S]*?\r?\n\1[^\S\r\n]*(?:\r?\n|$)/);return t?e.slice(t[0].length):e},oi=160,si=e=>{let t=(0,be.c)(8),{containerRef:n,effectiveDirectory:r,editor:i,preferRuntimeEditor:a,onShowPopup:o,enabled:s}=e,c=K.useRef(null),l,u;t[0]!==n||t[1]!==i||t[2]!==r||t[3]!==s||t[4]!==o||t[5]!==a?(l=()=>{let e=n.current;if(!e)return;let t=!1,l=x(),u=zr(),d=s,f=Di,p=()=>{let t=e.querySelectorAll(Rn);for(let e of Array.from(t))f(e)};if(!d){p();return}let m=e=>{let n=e===void 0?0:e;if(c.current!==null&&typeof window<`u`&&window.clearTimeout(c.current),typeof window>`u`){h();return}c.current=window.setTimeout(()=>{c.current=null,window.requestAnimationFrame(()=>{t||h()})},n)},h=()=>{let n=e.querySelectorAll(`[data-markdown="inline-code"], a, ${In}`),i=0;for(let a of Array.from(n)){let n=Gr(Wr(a),r);if(!n){f(a);continue}if(i>=u){f(a);continue}i+=1,(a.getAttribute(`data-openchamber-file-link`)!==`true`||a.getAttribute(`data-openchamber-file-path`)!==n.resolvedPath)&&qr(n.resolvedPath,r).then(i=>{if(t||!e.contains(a))return;let o=Wr(a),s=Gr(o,r);if(!(!s||s.resolvedPath!==n.resolvedPath)){if(!Jr(s.resolvedPath,i,l)){f(a);return}a.setAttribute(`data-openchamber-file-link`,`true`),a.setAttribute(`data-openchamber-file-ref`,o),a.setAttribute(`data-openchamber-file-path`,s.resolvedPath),a.setAttribute(`data-openchamber-file-binary`,String(i.isBinary)),a.setAttribute(`title`,kr),a.tagName.toLowerCase()!==`a`&&(a.setAttribute(`role`,`button`),a.setAttribute(`tabindex`,`0`))}})}},g=e=>Zr(e,{effectiveDirectory:r,editor:i,preferRuntimeEditor:a,onShowPopup:o}),_=e=>{let t=e.target;if(!(t instanceof Element)||t.closest($))return;let n=t.closest(Rn);n instanceof HTMLElement&&(e.preventDefault(),e.stopPropagation(),g(n))},v=e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target;!(t instanceof HTMLElement)||t.getAttribute(`data-openchamber-file-link`)!==`true`||(e.preventDefault(),e.stopPropagation(),g(t))};m(oi);let y=new MutationObserver(()=>{m(oi)});return y.observe(e,{childList:!0,subtree:!0}),e.addEventListener(`click`,_),e.addEventListener(`keydown`,v),()=>{t=!0,c.current!==null&&typeof window<`u`&&window.clearTimeout(c.current),c.current=null,y.disconnect(),e.removeEventListener(`click`,_),e.removeEventListener(`keydown`,v)}},u=[n,i,r,o,a,s],t[0]=n,t[1]=i,t[2]=r,t[3]=s,t[4]=o,t[5]=a,t[6]=l,t[7]=u):(l=t[6],u=t[7]),K.useEffect(l,u)},ci=({containerRef:e,onShowPopup:t,enableFullscreen:n,enablePanZoom:r,allowMermaidWheelEvents:i})=>{let a=g(e=>t?.(e)),o=!!t,s=g(t=>{if(!n||!o)return;let r=e.current;if(!r)return;let i=t.target;if(!(i instanceof Element)||i.closest(`button, a, [role="button"]`))return;let s=i.closest(en);if(!s)return;if(s instanceof HTMLElement&&s.hasAttribute(`data-mermaid-suppress-click`)){s.removeAttribute(`data-mermaid-suppress-click`);return}let c=Array.from(r.querySelectorAll(en)).indexOf(s);if(c<0)return;let l=s instanceof HTMLElement?s.getAttribute(`data-md-source`):null;if(!l||l.trim().length===0)return;let u=`Diagram ${c+1}`;a({open:!0,title:u,content:``,metadata:{tool:`mermaid-preview`,filename:u},mermaid:{url:`data:text/plain;charset=utf-8,${encodeURIComponent(l)}`,source:l,filename:u}})}),c=g(e=>{if(i||r)return;let t=e.target;t instanceof Element&&t.closest(`[data-markdown="mermaid-block"]`)&&e.stopPropagation()});_(`click`,s,e),K.useEffect(()=>{let t=e.current;if(t)return t.addEventListener(`wheel`,c,{capture:!0,passive:!0}),()=>{t.removeEventListener(`wheel`,c,!0)}},[e])},li=24,ui=1,di=12,fi=/[\s.,!?;:)\]]/,pi=(e,t)=>{let n=e<=12?2:e<=48?4:e<=96?8:Math.min(24,Math.ceil(e/8));return Math.max(1,Math.round(t/li*n))},mi=(e,t)=>pi(e,t)*(1e3/t),hi=(e,t,n)=>{let r=Math.min(e.length,t+n);for(let t=r;t<Math.min(e.length,r+8);t+=1)if(fi.test(e[t]??``))return t+1;return r},gi=(e,t,n)=>{let[r,i]=K.useState(()=>t?0:e.length),a=K.useRef(r),o=K.useRef(0),s=K.useRef(null);return a.current=r,K.useEffect(()=>{if(!t||typeof window>`u`){o.current=0,s.current=null,i(e.length);return}a.current>e.length&&(a.current=e.length,o.current=0,i(e.length));let r=null,c=t=>{let l=Math.min(a.current,e.length);if(l>=e.length){r=null,s.current=null;return}let u=s.current;if(u===null){s.current=t,r=window.requestAnimationFrame(c);return}let d=Math.min(t-u,100);s.current=t,o.current+=mi(e.length-l,n)*(d/1e3);let f=Math.min(di,Math.floor(o.current));if(f>=ui){o.current-=f;let t=hi(e,l,f);a.current=t,i(t)}r=window.requestAnimationFrame(c)};return a.current<e.length&&(r=window.requestAnimationFrame(c)),()=>{r!==null&&window.cancelAnimationFrame(r)}},[e,t,n]),t?e.slice(0,Math.min(r,e.length)):e},_i=new me({maxEntries:100,maxBytes:8388608}),vi=(e,t)=>{let n=_i.get(e);if(n)return n;let r=t(),i=((r.svg?.length??0)+(r.ascii?.length??0))*2;return _i.set(e,r,e.length*2+i),r},yi=e=>({bg:e.colors.surface.elevated,fg:e.colors.surface.foreground,line:e.colors.interactive.border,accent:e.colors.primary.base,muted:e.colors.surface.mutedForeground,surface:e.colors.surface.muted,border:e.colors.interactive.border,transparent:!0,font:`system-ui, sans-serif`}),bi=(e,t,r,i=ri,a=n(),o=``,s=!1)=>{let{t:c}=y(),l=K.useMemo(()=>({copy:c(`markdownRenderer.code.actions.copyTitle`),copied:c(`markdownRenderer.code.actions.copiedTitle`),enableCodeWrap:c(`markdownRenderer.code.actions.enableWrapTitle`),disableCodeWrap:c(`markdownRenderer.code.actions.disableWrapTitle`),copyDiagram:c(`markdownRenderer.mermaid.actions.copySourceTitle`),downloadDiagram:c(`markdownRenderer.mermaid.actions.downloadSvgTitle`),zoomInDiagram:c(`markdownRenderer.mermaid.actions.zoomInTitle`),zoomOutDiagram:c(`markdownRenderer.mermaid.actions.zoomOutTitle`),resetDiagramView:c(`markdownRenderer.mermaid.actions.resetViewTitle`),previewLabel:c(`terminalView.preview.open`),previewTitle:c(`terminalView.preview.openTitle`)}),[c]),u=f(e=>e.codeBlockLineWrap),d=f(e=>e.setCodeBlockLineWrap),p=g(()=>{d(!f.getState().codeBlockLineWrap)});return K.useMemo(()=>{let n=yi(e),c=f.getState().mermaidRenderingMode,d=e.metadata?.id??`theme`;return{labels:l,mermaidControls:i,codeBlockLineWrap:u,deferCodeLineNumberSync:t,onToggleCodeBlockLineWrap:p,renderMermaid:e=>vi(`${d}:${c}:${e}`,()=>{try{return c===`ascii`?{ascii:_e(e)}:{svg:ge(e,n)}}catch{return{}}}),onPreviewLoopback:r,imageTransportIdentity:a,imageEffectiveDirectory:o,imagePreviewEnabled:s}},[e,l,i,u,t,r,a,o,s])},xi=({containerRef:e,text:t,streaming:n,cacheKey:r,syntaxVars:i,ctx:a,reconcileMarkdownImageResources:o,onRichContentReady:s})=>{K.useEffect(()=>{E()},[]);let c=K.useRef(null),l=g(()=>{s?.()}),u=g(()=>{let t=e.current;if(t){if(!c.current){if(!tn(t))return;c.current=Cn(t);return}c.current.refresh()}});K.useLayoutEffect(()=>{let r=e.current,i=r?.querySelector(`[data-markdown-content]`)??r;if(i&&t&&i.childNodes.length===0){for(let e of It(t)){let t=document.createElement(`div`);t.setAttribute(`data-md-block`,``),t.style.display=`contents`,t.innerHTML=e,Er(t,a),i.appendChild(t)}o(i),n||l()}},[e,a,o,n,t]),K.useEffect(()=>()=>{c.current?.cleanup(),c.current=null},[]),K.useEffect(()=>{let i=e.current;if(!i)return;let s=i.querySelector(`[data-markdown-content]`)??i,c=!0,d=new AbortController,f=()=>{},p=()=>{},m=()=>{if(!c||n||d.signal.aborted)return;s.replaceChildren();let e=document.createElement(`div`);e.setAttribute(`data-md-block`,``),e.setAttribute(`data-md-render-fallback`,`text`),e.style.display=`contents`;let r=document.createElement(`span`);r.style.whiteSpace=`pre-wrap`,r.textContent=t,e.appendChild(r),s.appendChild(e),o(s),l()},h=e=>{if(!c)return;let t=Array.from(s.children);e.forEach((e,n)=>{let r=t[n];if(r||(r=document.createElement(`div`),r.setAttribute(`data-md-block`,``),r.style.display=`contents`,s.appendChild(r)),r.getAttribute(`data-md-id`)===e.id)return;let i=document.createElement(`div`);i.innerHTML=e.html,Er(i,a);let o=tn(r),c=tn(i);he(r,i,{childrenOnly:!0,onBeforeElUpdated:(e,t)=>{if(Ae(e,t))return!1;if(Yn(e,t),e instanceof HTMLImageElement&&t instanceof HTMLImageElement){let n=e.getAttribute(`data-md-image-source`);if(n&&n===t.getAttribute(`data-md-image-source`)){let n=e.getAttribute(`src`);n===null?t.removeAttribute(`src`):t.setAttribute(`src`,n),t.className=e.className;for(let n of[`data-md-image-state`,`data-md-placeholder-source`,`aria-busy`]){let r=e.getAttribute(n);r===null?t.removeAttribute(n):t.setAttribute(n,r)}}}return!e.isEqualNode(t)}}),r.setAttribute(`data-md-id`,e.id),(o||c||tn(r))&&u()});let n=tn(s),r=!1;for(let n=t.length-1;n>=e.length;--n){let e=t[n];e&&tn(e)&&(r=!0),e?.remove()}(r||t.length>e.length&&n)&&u(),o(s),a.deferCodeLineNumberSync||lr(s,a.codeBlockLineWrap,a.labels),Pe(s,te,{signal:d.signal,priority:`visible`}),l()},g=e=>{try{h(e)}catch{m()}},_=()=>{Ut(t,n,r,d.signal).then(e=>{if(c){if(n){g(e);return}p=B(()=>g(e),{priority:`visible`})}}).catch(m)};return n?_():f=B(_,{priority:`visible`}),()=>{c=!1,d.abort(),f(),p()}},[e,t,n,r,a,o]),K.useEffect(()=>{let t=e.current;if(t)return Or(t,a)},[e,a]),K.useEffect(()=>{let t=e.current,n=t?.querySelector(`[data-markdown-content]`)??t;if(n)for(let[e,t]of Object.entries(i))n.style.setProperty(e,t)},[e,i]),K.useEffect(()=>{let t=e.current,n=t?.querySelector(`[data-markdown-content]`)??t;n&&(a.deferCodeLineNumberSync||lr(n,a.codeBlockLineWrap,a.labels))},[e,a.codeBlockLineWrap,a.deferCodeLineNumberSync,a.labels]);let d=K.useRef(null),f=g(()=>{let t=e.current,n=t?.querySelector(`[data-markdown-content]`)??t;n&&(d.current!==null&&window.cancelAnimationFrame(d.current),d.current=window.requestAnimationFrame(()=>{d.current=null,sr(n)}))});h(e,f),K.useEffect(()=>()=>{d.current!==null&&window.cancelAnimationFrame(d.current)},[])},Si=e=>e===`tool`?`markdown-content markdown-tool`:e===`reasoning`?`markdown-content markdown-reasoning`:`markdown-content leading-relaxed`,Ci=e=>{let t=(0,be.c)(4),[n,r]=K.useState(e),i=K.useRef(e),a;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(a=()=>{i.current||(i.current=!0,r(!0))},t[0]=a):a=t[0];let o=g(a),s;return t[1]!==o||t[2]!==n?(s=[n,o],t[1]=o,t[2]=n,t[3]=s):s=t[3],s},wi=(e,t,n)=>{let r=K.useRef(n);r.current=n;let i=K.useRef(t);i.current=t;let a=g(e=>{if(!r.current)return;let t=e[0];if(!t)return;let n=t.borderBoxSize?.[0],a=n?n.blockSize:t.contentRect.height,o=n?n.inlineSize:t.contentRect.width;fe(i.current,a,o)});h(e,a)},Ti=K.memo(e=>{let t=(0,be.c)(52),{content:n,part:r,messageId:i,isAnimated:a,skipFadeIn:o,className:s,isStreaming:c,disableStreamAnimation:l,variant:u,onShowPopup:p,enableFileReferences:m}=e,h=a===void 0||a,_=o!==void 0&&o,v=c!==void 0&&c,y=l!==void 0&&l,x=u===void 0?`assistant`:u,S=m===void 0||m,C=$r(),{editor:T,runtime:E}=ee(),D=K.useRef(null),O=ne()??``,k=f(Oi),A;t[0]!==O||t[1]!==k?(A=e=>{O&&k(O,e)},t[0]=O,t[1]=k,t[2]=A):A=t[2];let j=g(A),M=v&&!y,te;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(te=V(d()),t[3]=te):te=t[3];let N=gi(n,M,te.markdownPaceMs),[P,F]=Ci(M),I;t[4]===p?I=t[5]:(I={containerRef:D,onShowPopup:p,enableFullscreen:ii,enablePanZoom:ri.showPanZoomControls},t[4]=p,t[5]=I),ci(I);let L=S&&!v,R;t[6]!==T||t[7]!==O||t[8]!==p||t[9]!==E.isVSCode||t[10]!==L?(R={containerRef:D,effectiveDirectory:O,editor:T,preferRuntimeEditor:E.isVSCode,onShowPopup:p,enabled:L},t[6]=T,t[7]=O,t[8]=p,t[9]=E.isVSCode,t[10]=L,t[11]=R):R=t[11],si(R);let z;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(z={containerRef:D},t[12]=z):z=t[12],ei(z);let B;t[13]!==O||t[14]!==p?(B={containerRef:D,effectiveDirectory:O,onShowPopup:p},t[13]=O,t[14]=p,t[15]=B):B=t[15];let{reconcileMarkdownImageResources:ie,transportIdentity:H}=ni(B),U;t[16]===C?U=t[17]:(U=w(C),t[16]=C,t[17]=U);let W=U,ae=bi(C,M,O?j:void 0,ri,H,O,!!p),oe=`markdown-${r?.id?`part-${r.id}`:`message-${i}`}`,se;t[18]!==oe||t[19]!==ae||t[20]!==M||t[21]!==N||t[22]!==ie||t[23]!==F||t[24]!==W?(se={containerRef:D,text:N,streaming:M,cacheKey:oe,syntaxVars:W,ctx:ae,reconcileMarkdownImageResources:ie,onRichContentReady:F},t[18]=oe,t[19]=ae,t[20]=M,t[21]=N,t[22]=ie,t[23]=F,t[24]=W,t[25]=se):se=t[25],xi(se);let ce;t[26]!==n||t[27]!==x?(ce=pe(n,x),t[26]=n,t[27]=x,t[28]=ce):ce=t[28],wi(D,ce,P&&!M);let le=!P||void 0,ue;t[29]===s?ue=t[30]:(ue=b(`relative break-words w-full min-w-0`,s),t[29]=s,t[30]=ue);let fe=P?`true`:`false`,me=P?`ready`:`pending`,he;t[31]!==N||t[32]!==P||t[33]!==x?(he=!P&&(0,Q.jsx)(`div`,{className:b(Si(x),`pointer-events-none absolute inset-0 overflow-clip`),children:(0,Q.jsx)(de,{content:N})}),t[31]=N,t[32]=P,t[33]=x,t[34]=he):he=t[34];let ge=!P||void 0,_e;t[35]!==P||t[36]!==x?(_e=b(Si(x),!P&&`invisible`),t[35]=P,t[36]=x,t[37]=_e):_e=t[37];let G;t[38]!==ge||t[39]!==_e?(G=(0,Q.jsx)(`div`,{"aria-hidden":ge,className:_e,"data-markdown-content":!0}),t[38]=ge,t[39]=_e,t[40]=G):G=t[40];let ve;t[41]!==le||t[42]!==ue||t[43]!==fe||t[44]!==me||t[45]!==he||t[46]!==G?(ve=(0,Q.jsxs)(`div`,{"aria-busy":le,className:ue,"data-markdown-ready":fe,"data-markdown-hydration":me,ref:D,children:[he,G]}),t[41]=le,t[42]=ue,t[43]=fe,t[44]=me,t[45]=he,t[46]=G,t[47]=ve):ve=t[47];let ye=ve;if(h){let e;return t[48]!==oe||t[49]!==ye||t[50]!==_?(e=(0,Q.jsx)(re,{skipAnimation:_,children:ye},oe),t[48]=oe,t[49]=ye,t[50]=_,t[51]=e):e=t[51],e}return ye},(e,t)=>e.content===t.content&&e.isStreaming===t.isStreaming&&e.disableStreamAnimation===t.disableStreamAnimation&&e.variant===t.variant&&e.isAnimated===t.isAnimated&&e.skipFadeIn===t.skipFadeIn&&e.className===t.className&&e.messageId===t.messageId&&e.onShowPopup===t.onShowPopup&&e.enableFileReferences===t.enableFileReferences&&e.part?.id===t.part?.id),Ei=K.memo(e=>{let t=(0,be.c)(46),{content:n,className:r,variant:i,disableLinkSafety:a,stripFrontmatter:o,onShowPopup:s,mermaidControls:c,allowMermaidWheelEvents:l,enableFileReferences:u}=e,d=i===void 0?`assistant`:i,f=o!==void 0&&o,p=c===void 0?ri:c,m=l!==void 0&&l,h=u===void 0||u,{editor:g,runtime:_}=ee(),v=$r(),y=K.useRef(null),[x,S]=Ci(!1),C=ne()??``,T;t[0]!==n||t[1]!==f?(T=f?ai(n):n,t[0]=n,t[1]=f,t[2]=T):T=t[2];let E=T,D;t[3]!==m||t[4]!==p.showPanZoomControls||t[5]!==s?(D={containerRef:y,onShowPopup:s,enableFullscreen:ii,enablePanZoom:p.showPanZoomControls,allowMermaidWheelEvents:m},t[3]=m,t[4]=p.showPanZoomControls,t[5]=s,t[6]=D):D=t[6],ci(D);let O;t[7]!==g||t[8]!==C||t[9]!==h||t[10]!==s||t[11]!==_.isVSCode?(O={containerRef:y,effectiveDirectory:C,editor:g,preferRuntimeEditor:_.isVSCode,onShowPopup:s,enabled:h},t[7]=g,t[8]=C,t[9]=h,t[10]=s,t[11]=_.isVSCode,t[12]=O):O=t[12],si(O);let k=!a,A;t[13]===k?A=t[14]:(A={containerRef:y,enabled:k},t[13]=k,t[14]=A),ei(A);let j;t[15]!==C||t[16]!==s?(j={containerRef:y,effectiveDirectory:C,onShowPopup:s},t[15]=C,t[16]=s,t[17]=j):j=t[17];let{reconcileMarkdownImageResources:M,transportIdentity:te}=ni(j),N;t[18]===v?N=t[19]:(N=w(v),t[18]=v,t[19]=N);let P=N,F=bi(v,!1,void 0,p,te,C,!!s),I=`simple:${d}`,L;t[20]!==F||t[21]!==M||t[22]!==E||t[23]!==S||t[24]!==P||t[25]!==I?(L={containerRef:y,text:E,streaming:!1,cacheKey:I,syntaxVars:P,ctx:F,reconcileMarkdownImageResources:M,onRichContentReady:S},t[20]=F,t[21]=M,t[22]=E,t[23]=S,t[24]=P,t[25]=I,t[26]=L):L=t[26],xi(L);let R=!x||void 0,z;t[27]===r?z=t[28]:(z=b(`relative break-words w-full min-w-0`,r),t[27]=r,t[28]=z);let B=x?`true`:`false`,re=x?`ready`:`pending`,V;t[29]!==E||t[30]!==x||t[31]!==d?(V=!x&&(0,Q.jsx)(`div`,{className:b(Si(d),`pointer-events-none absolute inset-0 overflow-clip`),children:(0,Q.jsx)(de,{content:E})}),t[29]=E,t[30]=x,t[31]=d,t[32]=V):V=t[32];let ie=!x||void 0,H;t[33]!==x||t[34]!==d?(H=b(Si(d),!x&&`invisible`),t[33]=x,t[34]=d,t[35]=H):H=t[35];let U;t[36]!==ie||t[37]!==H?(U=(0,Q.jsx)(`div`,{"aria-hidden":ie,className:H,"data-markdown-content":!0}),t[36]=ie,t[37]=H,t[38]=U):U=t[38];let W;return t[39]!==R||t[40]!==z||t[41]!==B||t[42]!==re||t[43]!==V||t[44]!==U?(W=(0,Q.jsxs)(`div`,{"aria-busy":R,className:z,"data-markdown-ready":B,"data-markdown-hydration":re,ref:y,children:[V,U]}),t[39]=R,t[40]=z,t[41]=B,t[42]=re,t[43]=V,t[44]=U,t[45]=W):W=t[45],W},(e,t)=>{let n=e.mermaidControls??ri,r=t.mermaidControls??ri;return e.content===t.content&&e.variant===t.variant&&e.className===t.className&&e.disableLinkSafety===t.disableLinkSafety&&e.stripFrontmatter===t.stripFrontmatter&&e.onShowPopup===t.onShowPopup&&n.download===r.download&&n.copy===r.copy&&n.showPanZoomControls===r.showPanZoomControls&&e.allowMermaidWheelEvents===t.allowMermaidWheelEvents&&e.enableFileReferences===t.enableFileReferences});function Di(e){e.removeAttribute(`data-openchamber-file-link`),e.removeAttribute(`data-openchamber-file-ref`),e.removeAttribute(`data-openchamber-file-path`),e.removeAttribute(`data-openchamber-file-binary`),e.getAttribute(`title`)===`Open file`&&e.removeAttribute(`title`),e.tagName.toLowerCase()!==`a`&&(e.removeAttribute(`role`),e.removeAttribute(`tabindex`))}function Oi(e){return e.openContextPreview}export{Gr as a,qr as c,Rn as d,Wn as f,zr as i,Jr as l,Qr as n,Zr as o,Pn as p,kr as r,Ur as s,Ti as t,Ln as u};
@@ -1,3 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{nt as t,rt as n}from"./vendor-base-ui-CnHfUmDN.js";import{n as r}from"./vendor-react-DLPElpoQ.js";import{a as i,i as a,n as o,o as s,r as c,t as l}from"./vendor-markstream-react-DX55XLGO.js";import{d as u,n as d,r as f}from"./vendor-reactuses-core-BnW6GxJt.js";import{r as p}from"./button-B1A-UMjO.js";import{Pi as m}from"./useMobileNavigationStore-D-y0Rt9A.js";import{t as h}from"./useThemeSystem-DMzWVJaW.js";import{n as g}from"./useRuntimeAPIs-DSLXJybW.js";import{a as _,r as v}from"./url-CMQwHq4k.js";import{n as y}from"./useEffectiveDirectory-CuPv_Spa.js";import{r as b,t as ee}from"./markdownHeightCache-BWYOoF-W.js";import{a as x,c as S,d as C,f as w,i as T,l as E,o as D,p as O,r as k,s as A,t as j}from"./MarkdownRendererImpl-Cqx43iX3.js";var M=e(n(),1),N=`img:not([data-md-link-favicon="true"])`,P=e=>e.getAttribute(`data-md-image-source`)??e.getAttribute(`src`)??``,F=(e,t)=>{if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;let n=e.target;if(!(n instanceof Element))return;let r=n.closest(N);if(r instanceof HTMLImageElement&&t.onShowPopup){let n=e.currentTarget;if(!(n instanceof HTMLElement))return;let i=Array.from(n.querySelectorAll(N)).map(e=>({url:P(e),filename:e.alt||P(e)||void 0})).filter(e=>e.url),a=P(r),o=i.findIndex(e=>e.url===a);if(!a)return;e.preventDefault(),e.stopPropagation(),t.onShowPopup({open:!0,title:r.alt||a,content:``,image:{url:a,filename:r.alt||a,gallery:i,index:o>=0?o:0}});return}if(t.fileReference){let r=n.closest(C);if(r instanceof HTMLElement){e.preventDefault(),e.stopPropagation(),D(r,t.fileReference);return}}let i=n.closest(`a[href]`);if(!(i instanceof HTMLAnchorElement))return;let a=i.getAttribute(`href`)??``;v(a)&&(e.preventDefault(),e.stopPropagation(),_(a))},I=(e,t)=>{if(e.key!==`Enter`&&e.key!==` `||!t.fileReference)return;let n=e.target;if(!(n instanceof Element))return;let r=n.closest(C);!(r instanceof HTMLElement)||r.getAttribute(`data-openchamber-file-link`)!==`true`||(e.preventDefault(),e.stopPropagation(),D(r,t.fileReference))},L=r(),te=(e,t)=>{let n=t>=2?e.slice(t-2,t):``;return(t>=1?e.charAt(t-1):``)===`:`||n===`:/`},R=e=>{if(!e.includes(`/`)||!e.includes(`.`))return[{kind:`text`,value:e}];O.lastIndex=0;let t=[],n=0,r=O.exec(e);for(;r;){let i=r[0];if(!i||te(e,r.index)||!w(i)){r=O.exec(e);continue}r.index>n&&t.push({kind:`text`,value:e.slice(n,r.index)}),t.push({kind:`path`,value:i}),n=r.index+i.length,r=O.exec(e)}return n===0?[{kind:`text`,value:e}]:(n<e.length&&t.push({kind:`text`,value:e.slice(n)}),t)},z=t(),B=M.createContext({enabled:!1,insideLink:!1,isMobileSurface:!1,effectiveDirectory:``,preferRuntimeEditor:!1,slots:{used:0,limit:0}}),V=e=>{let t=(0,L.c)(11),{enabled:n,effectiveDirectory:r,editor:i,preferRuntimeEditor:a,onShowPopup:o,content:s,children:c}=e,l;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(l=m(),t[0]=l):l=t[0];let u;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(u={used:0,limit:T()},t[1]=u):u=t[1];let d;t[2]!==i||t[3]!==r||t[4]!==n||t[5]!==o||t[6]!==a?(d={enabled:n,insideLink:!1,isMobileSurface:l,effectiveDirectory:r,editor:i,preferRuntimeEditor:a,onShowPopup:o,slots:u},t[2]=i,t[3]=r,t[4]=n,t[5]=o,t[6]=a,t[7]=d):d=t[7];let f=d,p;return t[8]!==c||t[9]!==f?(p=(0,z.jsx)(B.Provider,{value:f,children:c}),t[8]=c,t[9]=f,t[10]=p):p=t[10],p},H=({raw:e,children:t})=>{let n=M.useContext(B),r=x(e,n.effectiveDirectory),i=M.useRef(!1);n.enabled&&r&&!i.current&&n.slots.used<n.slots.limit&&(n.slots.used+=1,i.current=!0);let[a,o]=M.useState(r?A(r.resolvedPath)??null:null),s=r?.resolvedPath;if(M.useEffect(()=>{if(!n.enabled||!s||!i.current)return;let e=!1;return S(s,n.effectiveDirectory).then(t=>{e||o(t)}),()=>{e=!0}},[n.enabled,n.effectiveDirectory,s]),!r)return t??e;let c=!!(i.current&&a&&E(r.resolvedPath,a,n.isMobileSurface));return(0,z.jsx)(`span`,{"data-openchamber-block-path-token":`true`,...c?{"data-openchamber-file-link":`true`,"data-openchamber-file-ref":e,"data-openchamber-file-path":r.resolvedPath,"data-openchamber-file-binary":String(a?.isBinary===!0),title:k,...t?{}:{role:`button`,tabIndex:0}}:{},children:t??e})};function U(e){let t=(0,L.c)(12),n=M.useContext(B),r=e.node.content??``;if(!n.enabled||n.insideLink){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(c,{...e}),t[0]=e,t[1]=n),n}let i,a;if(t[2]!==r||t[3]!==e){a=Symbol.for(`react.early_return_sentinel`);bb0:{let n=R(r);if(n.length===1&&n[0]?.kind!==`path`){let n;t[6]===e?n=t[7]:(n=(0,z.jsx)(c,{...e}),t[6]=e,t[7]=n),a=n;break bb0}let o;t[8]===e?o=t[9]:(o=(t,n)=>t.kind===`path`?(0,z.jsx)(H,{raw:t.value},`path-${n}-${t.value}`):(0,z.jsx)(c,{...e,node:{...e.node,content:t.value}},`text-${n}`),t[8]=e,t[9]=o),i=n.map(o)}t[2]=r,t[3]=e,t[4]=i,t[5]=a}else i=t[4],a=t[5];if(a!==Symbol.for(`react.early_return_sentinel`))return a;let o;return t[10]===i?o=t[11]:(o=(0,z.jsx)(z.Fragment,{children:i}),t[10]=i,t[11]=o),o}function W(e){let t=(0,L.c)(7),n=M.useContext(B),r=e.node.code??``;if(!n.enabled||!w(r)){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(a,{...e}),t[0]=e,t[1]=n),n}let i;t[2]===r?i=t[3]:(i=(0,z.jsx)(H,{raw:r}),t[2]=r,t[3]=i);let o;return t[4]!==e||t[5]!==i?(o=(0,z.jsx)(a,{...e,children:i}),t[4]=e,t[5]=i,t[6]=o):o=t[6],o}function G(e){let t=(0,L.c)(12),n=M.useContext(B),r=e.node.href??``,i;t[0]!==n.enabled||t[1]!==r?(i=n.enabled&&w(r),t[0]=n.enabled,t[1]=r,t[2]=i):i=t[2];let a=i,s;t[3]===n?s=t[4]:(s={...n,insideLink:!0},t[3]=n,t[4]=s);let c;t[5]!==a||t[6]!==r||t[7]!==e?(c=a?(0,z.jsx)(H,{raw:r,children:(0,z.jsx)(o,{...e})}):(0,z.jsx)(o,{...e}),t[5]=a,t[6]=r,t[7]=e,t[8]=c):c=t[8];let l;return t[9]!==s||t[10]!==c?(l=(0,z.jsx)(B.Provider,{value:s,children:c}),t[9]=s,t[10]=c,t[11]=l):l=t[11],l}var K=/^[ \t]{0,3}(`{3,}|~{3,})/,q=e=>{if(typeof e!=`string`||e.length===0)return!1;let t=e.split(/\r?\n/,1)[0]??``;return K.test(t)},J=e=>{let t=0,n=0,r=e.match(/[`~]+/g)??[];for(let e of r)e[0]==="`"?t=Math.max(t,e.length):n=Math.max(n,e.length);return t>=3?"`".repeat(Math.max(3,t+1)):n>=3&&t===0?"```":n>=3?`~`.repeat(Math.max(3,n+1)):"```"},Y=e=>{let t=typeof e.raw==`string`?e.raw:``;if(q(t))return t.endsWith(`
2
- `)?t:`${t}\n`;let n=(e.language??``).trim(),r=e.code??``,i=J(r),a=r.endsWith(`
3
- `)?r:`${r}\n`;return e.loading?`${i}${n}\n${a}`:`${i}${n}\n${a}${i}\n`},X=e=>{let t=e.partId?`part-${e.partId}`:`body`,n=e.indexKey!==void 0&&e.indexKey!==null&&String(e.indexKey).length>0?String(e.indexKey):e.language&&e.language.length>0?e.language:`code`;return`${e.messageId}:${t}:code:${n}`},Z=M.createContext({messageId:`markstream`,isStreaming:!1,disableStreamAnimation:!1,variant:`assistant`,enableFileReferences:!0}),ne=()=>M.useContext(Z);function Q(e){let t=(0,L.c)(21),n=ne(),r=e.node.language??``,i=e.node.code??``,a=e.node.raw??``,o=e.node.loading===!0||e.loading===!0,s;t[0]!==i||t[1]!==r||t[2]!==o||t[3]!==a?(s=Y({type:`code_block`,language:r,code:i,raw:a,loading:o}),t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s):s=t[4];let c=s,l=n.isStreaming||e.loading===!0||e.node.loading===!0,u=n.part?.id,d;t[5]!==n.messageId||t[6]!==e.indexKey||t[7]!==e.node.language||t[8]!==u?(d=X({messageId:n.messageId,partId:u,indexKey:e.indexKey,language:e.node.language}),t[5]=n.messageId,t[6]=e.indexKey,t[7]=e.node.language,t[8]=u,t[9]=d):d=t[9];let f=d,p=n.enableFileReferences&&!l,m;t[10]!==c||t[11]!==n.disableStreamAnimation||t[12]!==n.onShowPopup||t[13]!==n.variant||t[14]!==f||t[15]!==l||t[16]!==p?(m=(0,z.jsx)(j,{content:c,messageId:f,isAnimated:!1,skipFadeIn:!0,isStreaming:l,disableStreamAnimation:n.disableStreamAnimation,variant:n.variant,onShowPopup:n.onShowPopup,enableFileReferences:p}),t[10]=c,t[11]=n.disableStreamAnimation,t[12]=n.onShowPopup,t[13]=n.variant,t[14]=f,t[15]=l,t[16]=p,t[17]=m):m=t[17];let h;return t[18]!==f||t[19]!==m?(h=(0,z.jsx)(`div`,{className:`oc-markstream-code-host min-w-0 w-full`,"data-oc-markstream-code":`markdown-impl`,"data-oc-markstream-code-id":f,children:m}),t[18]=f,t[19]=m,t[20]=h):h=t[20],h}var $=!1;function re(e){return e.node?.type===`code_block`?M.createElement(Q,e):M.createElement(U,e)}var ie=()=>{$||($=!0,i({text:re,inline_code:W,link:G,code_block:s(Q,`block`)}))},ae={maxLiveNodes:0,liveNodeBuffer:0,batchRendering:!1,deferNodesUntilVisible:!1,viewportPriority:!1,smoothStreaming:!1,typewriter:!1,fade:!1};ie();var oe=e=>e===`tool`?`markdown-content markdown-tool oc-markstream-host`:e===`reasoning`?`markdown-content markdown-reasoning oc-markstream-host`:`markdown-content leading-relaxed oc-markstream-host`,se=M.memo(({content:e,part:t,messageId:n,className:r,isStreaming:i=!1,disableStreamAnimation:a=!1,variant:o=`assistant`,onShowPopup:s,enableFileReferences:c=!0})=>{let m=h()?.currentTheme.metadata.variant===`dark`,{editor:_,runtime:v}=g(),x=y()??``,S=M.useRef(null),C=t?.id?`oc-ms-${t.id}`:`oc-ms-${n}`,w=ee(e,`markstream:${o}`),T=!i,E=c&&!i,D=E?{effectiveDirectory:x,editor:_,preferRuntimeEditor:v.isVSCode,onShowPopup:s}:void 0,O=M.useMemo(()=>({messageId:n,part:t,isStreaming:i,disableStreamAnimation:a,variant:o,onShowPopup:s,enableFileReferences:c}),[n,t,i,a,o,s,c]),k=M.useRef(T);k.current=T;let A=M.useRef(w);A.current=w;let j=d(e=>{if(!k.current)return;let t=e[0];if(!t)return;let n=t.borderBoxSize?.[0],r=n?n.blockSize:t.contentRect.height,i=n?n.inlineSize:t.contentRect.width;b(A.current,r,i)});u(S,j);let N=d(e=>{F(e,{onShowPopup:s,fileReference:D})}),P=d(e=>{I(e,{fileReference:D})});return f(`click`,N,S),f(`keydown`,P,S),(0,z.jsx)(`div`,{ref:S,className:p(`relative break-words w-full min-w-0`,oe(o),r),"data-markdown-ready":`true`,"data-markdown-hydration":`ready`,"data-oc-markdown-engine":`markstream`,"data-oc-markstream-virtual":`off`,children:(0,z.jsx)(Z.Provider,{value:O,children:(0,z.jsx)(V,{enabled:E,effectiveDirectory:x,editor:_,preferRuntimeEditor:v.isVSCode,onShowPopup:s,content:e,children:(0,z.jsx)(l,{content:e,customId:C,final:!i,isDark:m,codeBlockStream:i,...ae})})})})},(e,t)=>e.content===t.content&&e.isStreaming===t.isStreaming&&e.disableStreamAnimation===t.disableStreamAnimation&&e.variant===t.variant&&e.isAnimated===t.isAnimated&&e.skipFadeIn===t.skipFadeIn&&e.className===t.className&&e.messageId===t.messageId&&e.onShowPopup===t.onShowPopup&&e.enableFileReferences===t.enableFileReferences&&e.part?.id===t.part?.id);export{se as MarkstreamRenderer};