@openchambery/web 2.1.10-beta.4 → 2.1.10-beta.5

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 (52) hide show
  1. package/dist/assets/{AssistantView-b4ehjorA.js → AssistantView-BkZkCbPP.js} +3 -3
  2. package/dist/assets/{DiagramView-BaGHUm0-.js → DiagramView-BxBDxnUp.js} +1 -1
  3. package/dist/assets/{ImageLoadingPlaceholder-DEpMJXzV.js → ImageLoadingPlaceholder-CP-dbqDu.js} +1 -1
  4. package/dist/assets/{LoadingImage-BAT9D9wN.js → LoadingImage-B9bc2pgC.js} +1 -1
  5. package/dist/assets/{MarkdownRenderer-CFVvfuhR.js → MarkdownRenderer-Dqz0-0_t.js} +2 -2
  6. package/dist/assets/{MarkdownRendererImpl-jmqHuDQZ.js → MarkdownRendererImpl-2H9_SrEr.js} +1 -1
  7. package/dist/assets/{MarkstreamRendererImpl-DPOZ9qu8.js → MarkstreamRendererImpl-DdXlG6DK.js} +1 -1
  8. package/dist/assets/{MobileDetailNavigation-BIoz1Npe.js → MobileDetailNavigation-DFQUWnA0.js} +1 -1
  9. package/dist/assets/{MobileShareBridge-J0mniNpy.js → MobileShareBridge-CZqToy1R.js} +2 -2
  10. package/dist/assets/{MobileTabPageHeader-BCh8oQ6e.js → MobileTabPageHeader-uTPUQMLv.js} +1 -1
  11. package/dist/assets/{MultiRunWindow-DDlBWa0m.js → MultiRunWindow-DUv0_O4w.js} +1 -1
  12. package/dist/assets/{SettingsView-D52TGtCB.js → SettingsView-DtUJbFq2.js} +1 -1
  13. package/dist/assets/{SettingsWindow-C2AHpt9S.js → SettingsWindow-sjrhrwha.js} +1 -1
  14. package/dist/assets/{TerminalView-J0dHlg0u.js → TerminalView-ba3ZkP-P.js} +1 -1
  15. package/dist/assets/ToolOutputDialog--B094m2_.js +10 -0
  16. package/dist/assets/{appThemeRegistry-C8bq_-cg.js → appThemeRegistry-CBnaUhsy.js} +1 -1
  17. package/dist/assets/{assistant-attachment-cache-B2UAUHUZ.js → assistant-attachment-cache-CecNXB7z.js} +1 -1
  18. package/dist/assets/{fileMentionTouchSelection-C8hotsbV.js → fileMentionTouchSelection-BYozqlxY.js} +1 -1
  19. package/dist/assets/{gitApi-etcbFClL.js → gitApi-B8rjVia4.js} +1 -1
  20. package/dist/assets/{image-loading-Bj11k4gM.js → image-loading-CnAqJpZd.js} +1 -1
  21. package/dist/assets/{insertionBoundaries-B42nWZi5.js → insertionBoundaries-BUDLVE_K.js} +1 -1
  22. package/dist/assets/{main-QSpW8-bh.js → main-CucIMAxR.js} +4 -4
  23. package/dist/assets/{main-DRvqRoHG.js → main-DadoVO4A.js} +2 -2
  24. package/dist/assets/{mcpQueries-CqXmLf7u.js → mcpQueries-DdXNoxm5.js} +1 -1
  25. package/dist/assets/{miniChat-CVVkf6qd.js → miniChat-BWFZe7j-.js} +2 -2
  26. package/dist/assets/{mobile-C3YKq4-C.js → mobile-BC-jMvYW.js} +2 -2
  27. package/dist/assets/{multirun-D8Ii4AuB.js → multirun-CW2FTAEN.js} +1 -1
  28. package/dist/assets/{projectMeta-6tg2sJJq.js → projectMeta-_Q4YSFGk.js} +1 -1
  29. package/dist/assets/relay-image-stream-CqgxIcA5.js +2 -0
  30. package/dist/assets/{renderElectronMiniChatApp-B52l6XWX.js → renderElectronMiniChatApp-YBx-HM8p.js} +2 -2
  31. package/dist/assets/{renderMobileApp-G6v2GZNC.js → renderMobileApp-Yp4PRhWF.js} +6 -6
  32. package/dist/assets/{runtimeConfig-DHT_B7ZP.js → runtimeConfig-g_-L1K8Q.js} +1 -1
  33. package/dist/assets/{runtimeEndpointReset-DyJRGL5Y.js → runtimeEndpointReset-St6iQkvr.js} +1 -1
  34. package/dist/assets/{sessionChangeSummary-BM6atDrR.js → sessionChangeSummary-Bcqg-Cez.js} +1 -1
  35. package/dist/assets/{sessionLookup-CZ26KqA-.js → sessionLookup-DeeMjpDs.js} +1 -1
  36. package/dist/assets/{speechSettingsQueries-8iZjJmXu.js → speechSettingsQueries-DLwTtatv.js} +2 -2
  37. package/dist/assets/{useAppFontEffects-BRHGEFRm.js → useAppFontEffects-D8Ddmpu7.js} +5 -5
  38. package/dist/assets/{useDesktopWindowControlsLayout-g2wk-J1P.js → useDesktopWindowControlsLayout-DzsPDdF5.js} +1 -1
  39. package/dist/assets/{useEffectiveDirectory-C5trBWhE.js → useEffectiveDirectory-4aOSY7oK.js} +1 -1
  40. package/dist/assets/{useMobileNavigationStore-BnxWwj5z.js → useMobileNavigationStore-BJ8xydmv.js} +3 -3
  41. package/dist/assets/useWorkerHighlightedLines-Cf2w4zbJ.js +7 -0
  42. package/dist/index.html +2 -2
  43. package/dist/mini-chat.html +2 -2
  44. package/dist/mobile.html +2 -2
  45. package/package.json +1 -1
  46. package/server/lib/fs/DOCUMENTATION.md +6 -0
  47. package/server/lib/fs/raw-video.test.js +41 -0
  48. package/server/lib/fs/routes.js +15 -1
  49. package/server/lib/relay/relay-server.e2e.test.ts +28 -5
  50. package/dist/assets/ToolOutputDialog-GWRtb7zV.js +0 -10
  51. package/dist/assets/relay-image-stream-SV0lH6aG.js +0 -2
  52. package/dist/assets/useWorkerHighlightedLines-D3P0ms_2.js +0 -7
@@ -0,0 +1,7 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./runtime-fetch-WgH0pROs.js";import{Mn as n,ln as r}from"./persistence-BKszKaoQ.js";import{it as i,rt as a}from"./vendor-base-ui-CdzJ6My_.js";import{n as o}from"./platform-CgwxwfA4.js";import{v as s}from"./useUIStore-CEqU9Ujv.js";import{n as c}from"./vendor-react-BP2cRVqX.js";import{a as l,n as u}from"./vendor-aparajita-capacitor-secure-storage-xol_6BsB.js";import{n as d}from"./vendor-reactuses-core-BpfIZ1tg.js";import{f,r as p,t as m}from"./button-CWSs9Baz.js";import{Rr as h}from"./useMobileNavigationStore-BJ8xydmv.js";import{n as g}from"./useThemeSystem-8jhE4Zyk.js";import{n as _}from"./Icon-BCFeHDWx.js";import{i as v,n as y,t as b}from"./tooltip-CV6dvLBp.js";import{i as x,o as S}from"./image-loading-CnAqJpZd.js";import{t as C}from"./MobileResizableSheet-Bs4gAbDr.js";import{i as w}from"./appThemeRegistry-CBnaUhsy.js";import{n as T}from"./MarkdownRenderer-Dqz0-0_t.js";import{n as E,o as D,s as ee,t as te}from"./markdown-worker-DFNZ3KJ_.js";import{n as ne,r as re}from"./markdownTheme-Y4nBAXal.js";import{r as ie}from"./relay-image-stream-CqgxIcA5.js";import{t as O}from"./vendor-tanstack-react-virtual-B_EO--9t.js";var k=e(i(),1),A=c(),j=a(),ae=`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)]`,oe={maxWidth:`min(28rem, calc(100cqw - 4ch))`,backgroundColor:`var(--surface-elevated)`,color:`var(--surface-elevated-foreground)`},se=`flex items-center justify-between gap-3 border-b border-[var(--surface-subtle)] px-3 py-2.5`,ce=`text-xs font-medium leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,M=`text-xs tabular-nums leading-4 text-muted-foreground md:text-[0.8125rem] md:leading-5`,N=`m-0 list-none divide-y divide-[var(--surface-subtle)] p-0`,P=`${N} max-h-[min(22rem,50vh)] overflow-y-auto`,le=`${N} w-full`,ue={className:`p-0 rounded-none`,maxHeightClass:`max-h-[46vh]`,disableHorizontal:!0},F=`px-2.5 py-1.5 text-xs leading-4 md:py-2 md:text-[0.8125rem] md:leading-5`,de=`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`,fe=`min-w-0 truncate text-xs leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,I=`inline-flex shrink-0 items-center gap-1 text-xs leading-4 tabular-nums text-muted-foreground md:text-[0.8125rem] md:leading-5`,L=`h-3 w-3 shrink-0 md:h-3.5 md:w-3.5`,R={in_progress:`text-foreground`,pending:`text-foreground`,completed:`text-muted-foreground line-through`,cancelled:`text-muted-foreground line-through`},z={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`},B=e=>{let t=(0,A.c)(26),{todo:n,isActive:r,activeRef:i}=e,{t:a}=f(),o=V.has(n.status)?n.status:`pending`,s=z[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,j.jsx)(_,{name:`record-circle`,className:`h-3.5 w-3.5 text-[var(--status-info)]`,"aria-hidden":`true`}):o===`completed`?(0,j.jsx)(_,{name:`checkbox-circle`,className:`h-3.5 w-3.5 text-[var(--status-success)]`,"aria-hidden":`true`}):(0,j.jsx)(_,{name:`time`,className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),t[3]=o,t[4]=u);let d=u,m=r?`step`:void 0,h=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)]`,g;t[5]===h?g=t[6]:(g=p(`group relative grid min-w-0 grid-cols-[1rem_minmax(0,1fr)] items-start gap-2.5`,F,h),t[5]=h,t[6]=g);let x;t[7]!==d||t[8]!==l?(x=(0,j.jsx)(v,{asChild:!0,children:(0,j.jsx)(`span`,{className:`flex size-4 items-center justify-center`,"aria-label":l,children:d})}),t[7]=d,t[8]=l,t[9]=x):x=t[9];let S;t[10]===l?S=t[11]:(S=(0,j.jsx)(y,{side:`left`,sideOffset:6,children:l}),t[10]=l,t[11]=S);let C;t[12]!==x||t[13]!==S?(C=(0,j.jsxs)(b,{children:[x,S]}),t[12]=x,t[13]=S,t[14]=C):C=t[14];let w=R[o],T;t[15]===w?T=t[16]:(T=p(`block whitespace-normal break-words`,w),t[15]=w,t[16]=T);let E;t[17]!==T||t[18]!==n.content?(E=(0,j.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,j.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]!==m||t[23]!==g||t[24]!==C?(D=(0,j.jsxs)(`li`,{ref:i,"aria-current":m,className:g,children:[C,E]}),t[20]=i,t[21]=E,t[22]=m,t[23]=g,t[24]=C,t[25]=D):D=t[25],D},V=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),H=`image/png`,U=l(`OpenChamberMedia`),W=e=>{let t=e.toLowerCase().split(`;`)[0]?.trim()||H;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`;if(t===`video/quicktime`)return`mov`;let n=t.split(`/`)[1];return n&&/^[a-z0-9.+-]+$/i.test(n)?n:`png`},pe=(e,t)=>{let n=`${t.startsWith(`video/`)?`video`:`image`}.${W(t)}`,r=(((e||``).trim()||n).split(/[\\/]/).pop()||n).replace(/[^\w.\- ()[\]]+/g,`_`).replace(/^\.+/,``);return r?/\.[a-z0-9]{1,8}$/i.test(r)?r:`${r}.${W(t)}`:n},G=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)}),me=async e=>{let t=await G(e),n=t.indexOf(`,`);return n>=0?t.slice(n+1):t},he=(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)},K=async(e,n)=>{if(e.startsWith(`openchamber-asset:`)){let t=await ie(e,n);if(t)return t;if(o())throw Error(`Image display stream is no longer available`)}let r=await(/^\/api(?=\/|[?#]|$)/.test(e)?t(e,{signal:n,cache:`no-store`}):fetch(e,{signal:n,cache:`no-store`}));if(!r.ok)throw Error(`Image fetch failed (${r.status})`);return r.blob()},ge=async(e,n)=>{let r=await t(`/api/fs/raw`,{query:{path:e},signal:n});if(!r.ok)throw Error(`Image source request failed (${r.status})`);return r.blob()},_e=async(e,t)=>{let n=e.effectiveDirectory??``,r=null;e.prefetchedBlob&&e.prefetchedBlob.size>0&&(r=e.prefetchedBlob);let i=e.displayUrl?.trim();if(!r&&i)try{r=await K(i,t)}catch{t?.throwIfAborted(),r=null}if(!r){let i=e.sourceUrl.trim();if(!i)throw Error(`Image source is empty`);if(/^(?:data|blob):/i.test(i)||/^https?:/i.test(i)||/^\/api(?=\/|[?#]|$)/.test(i))r=await K(i,t);else{let e=S(i,n);r=x(e)?await ge(e.path,t):await K(e.source,t)}}if(!r||r.size<=0)throw Error(`Image is empty`);let a=(e.mimeType||(r.type&&/^(image|video)\//.test(r.type)?r.type:``)||(e.kind===`video`?`video/mp4`:``)||H).split(`;`)[0].trim()||H;return{blob:r,filename:pe(e.filename,a),mimeType:a}},ve=()=>!o()||u===void 0?!1:u.isPluginAvailable(`OpenChamberMedia`),ye=async(e,t)=>{let{blob:i,filename:a,mimeType:o}=await _e(e,t);if(ve()){let t=await me(i);if(e.kind===`video`){if((await U.saveFile({dataBase64:t,mimeType:o,filename:a}))?.cancelled)throw new DOMException(`Save cancelled`,`AbortError`);return`saved`}return await U.saveImage({dataBase64:t,mimeType:o,filename:a}),`saved`}if(r()){if(e.kind===`video`){let t=S(e.sourceUrl,e.effectiveDirectory??``),r=n()?.files;if(x(t)&&r?.downloadFile)return await r.downloadFile(t.path),`saved`;throw Error(`Video download is unavailable for this source in VS Code`)}let t=n()?.vscode;if(t?.saveImage){let e=await G(i);return await t.saveImage({fileName:a,dataUrl:e}),`saved`}}return he(i,a),`downloaded`};function be({abovePreview:e=!1}){let{t}=f(),[n,r]=k.useState(null),[i,a]=k.useState(!1),s=k.useRef(null),c=!!n;k.useEffect(()=>re(e=>{r(e),a(!1)}),[]);let l=d(e=>{e||(r(null),a(!1))});w({id:`image-save-actions`,active:c,layer:`overlay`,onBack:()=>(l(!1),!0),surfaceRef:s});let u=d(async()=>{if(!(!n||i)){a(!0);try{await ye(n),h.success(t(n.kind===`video`?`filesView.editor.saved`:`chat.image.actions.saveSuccess`)),r(null)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){a(!1);return}h.error(t(n.kind===`video`?`filesView.toast.saveFailed`:`chat.image.actions.saveFailed`)),a(!1);return}a(!1)}});if(!n)return null;let p=n.filename?.trim()||t(`chat.image.actions.sheetTitle`),g=n.kind===`video`?t(`filesView.editor.saveFile`):o()?t(`chat.image.actions.saveToPhotos`):t(`chat.image.actions.saveImage`);return(0,j.jsx)(`div`,{ref:s,children:(0,j.jsx)(C,{id:`image-save-actions-sheet`,className:e?`z-[90]`:void 0,open:c,onOpenChange:l,title:(0,j.jsx)(`h2`,{className:`truncate typography-ui-label font-semibold`,children:p}),ariaLabel:p,closeAriaLabel:t(`mobile.surface.closeAria`),resizeAriaLabel:t(`mobile.sessions.sheet.resizeAria`),fitContent:!0,children:(0,j.jsx)(`div`,{className:`flex min-h-0 flex-col overflow-y-auto overscroll-contain px-3 pb-3`,children:(0,j.jsx)(`div`,{className:`overflow-hidden rounded-2xl bg-[var(--surface-muted)]`,"data-page-scroll-lock":`true`,children:(0,j.jsxs)(m,{type:`button`,variant:`ghost`,size:`lg`,className:`h-auto min-h-12 w-full justify-start gap-3 rounded-none supports-[corner-shape:squircle]:rounded-none px-4 border-b border-[var(--surface-subtle)] last:border-b-0`,"data-mobile-press-feedback":`none`,disabled:i,onClick:()=>{u()},children:[(0,j.jsx)(_,{name:i?`loader-4`:`download`,className:i?`size-5 animate-spin`:`size-5`}),(0,j.jsx)(`span`,{className:`truncate`,children:i?t(`chat.image.actions.saving`):g})]})})})})})}var xe=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`),Se=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(``):``,q=(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=Se(n);e&&i.setAttribute(`style`,`${i.getAttribute(`style`)??``}${e}`)}},Ce=e=>`<pre><code>${xe(e)}</code></pre>`,we=e=>{let t=(0,A.c)(21),{code:n,language:r,className:i,style:a,codeStyle:o,wrap:s}=e,c=s!==void 0&&s,{currentTheme:l}=g(),u=k.useRef(null),d;t[0]===l?d=t[1]:(d=ne(l),t[0]=l,t[1]=d);let f=d,m,h;t[2]!==n||t[3]!==o||t[4]!==c?(m=()=>{let e=u.current;e&&(e.innerHTML=Ce(n),q(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]),k.useLayoutEffect(m,h);let _,v;t[7]!==n||t[8]!==o||t[9]!==r||t[10]!==c?(_=()=>{let e=u.current;if(!e)return;let t=!0,i=new AbortController;return te(n,(r||`text`).toLowerCase(),{signal:i.signal,priority:`visible`}).then(n=>{!t||!e||!n||(e.innerHTML=n,q(e,c,o))}),()=>{t=!1,i.abort()}},v=[n,r,c,o],t[7]=n,t[8]=o,t[9]=r,t[10]=c,t[11]=_,t[12]=v):(_=t[11],v=t[12]),k.useEffect(_,v);let y;t[13]===i?y=t[14]:(y=p(`typography-code`,i),t[13]=i,t[14]=y);let b=f,x;t[15]!==a||t[16]!==b?(x={...b,...a},t[15]=a,t[16]=b,t[17]=x):x=t[17];let S;return t[18]!==y||t[19]!==x?(S=(0,j.jsx)(`div`,{ref:u,className:y,style:x}),t[18]=y,t[19]=x,t[20]=S):S=t[20],S},Te=e=>{let t=e.replace(/^<file>\s*\n?/,``).replace(/\n?<\/file>\s*$/,``);return t=t.replace(/^\s*\d{5}\|\s?/gm,``),t.trim()},Ee=(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}},De=e=>e?e.includes(`<diagnostics`)||e.includes(`<file_diagnostics>`)||e.includes(`LSP errors detected`)||e.includes(`This file has errors`):!1,Oe=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():``,ke=(e,t)=>!e||typeof e!=`object`?String(e):ee(e,t||``),J=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}}},Ae=e=>{if(!e||typeof e!=`object`)return;let t=J(e.patch)??J(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=J(e.patch)??J(e.diff);if(t)return t}},je=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}}},Me=(e,t,n)=>{let r=Te(e);if((t===`edit`||t===`multiedit`||t===`write`||t===`apply_patch`)&&De(r)&&(r=Oe(r)),(t===`edit`||t===`multiedit`||t===`apply_patch`)&&r.trim().length===0){let e=Ae(n);if(e)return e}return r},Ne=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
+ `).split(`
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)})}},Pe=(e,t)=>{try{let n=e.trim().split(`
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,j.jsx)(`div`,{className:p(`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,j.jsx)(`div`,{className:`min-w-0`,style:{paddingLeft:`${e.depth*20}px`},children:e.isFile?(0,j.jsx)(`span`,{className:`text-foreground/90 block truncate`,children:e.name}):(0,j.jsxs)(`span`,{className:`font-semibold text-foreground block truncate`,children:[e.name,`/`]})},t))})}catch{return null}},Fe={backgroundColor:`var(--status-info)`,opacity:.6},Ie=(e,t,n)=>{try{let r=e.trim().split(`
5
+ `).filter(Boolean);if(r.length===0)return null;let i={};return r.forEach(e=>{let t=e.match(/^(.+?):(\d+):(.*)$/)||e.match(/^(.+?):(.*)$/);if(t){let[,e,n,r]=t,a=r===void 0?``:n,o=r===void 0?n:r;i[e]||(i[e]=[]),i[e].push({lineNum:a,content:o})}}),(0,j.jsxs)(`div`,{className:p(`space-y-2 w-full min-w-0`,n?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/30`),style:s.tool.popup,children:[(0,j.jsxs)(`div`,{className:`typography-meta text-muted-foreground mb-2`,children:[`Found `,r.length,` match`,r.length===1?``:`es`]}),Object.entries(i).map(([e,n])=>(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsx)(`div`,{className:p(`font-medium text-muted-foreground`,t?`typography-micro`:`typography-code`),children:e}),(0,j.jsx)(`div`,{className:`pl-4 space-y-1`,children:n.map((e,n)=>!e.lineNum&&!e.content?null:(0,j.jsxs)(`div`,{className:p(`flex items-start gap-2 min-w-0`,t?`typography-micro`:`typography-code`),children:[(0,j.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full flex-shrink-0 mt-1.5`,style:Fe}),(0,j.jsxs)(`div`,{className:`flex gap-2 min-w-0 flex-1`,children:[e.lineNum&&(0,j.jsxs)(`span`,{className:`text-muted-foreground font-mono whitespace-nowrap`,children:[`Line `,e.lineNum,`:`]}),(0,j.jsx)(`span`,{className:`text-foreground font-mono break-words flex-1`,children:e.content||`\xA0`})]})]},n))})]},e))]})}catch{return null}},Le={backgroundColor:`var(--status-info)`,opacity:.6},Re=(e,t,n)=>{try{let r=e.trim().split(`
6
+ `).filter(Boolean);if(r.length===0)return null;let i={};r.forEach(e=>{let t=e.lastIndexOf(`/`),n=t>0?e.substring(0,t):`/`,r=t>=0?e.substring(t+1):e;i[n]||(i[n]=[]),i[n].push(r)});let a=Object.keys(i).sort();return(0,j.jsxs)(`div`,{className:p(`space-y-2 w-full min-w-0`,n?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/30`),style:s.tool.popup,children:[(0,j.jsxs)(`div`,{className:`typography-meta text-muted-foreground mb-2`,children:[`Found `,r.length,` file`,r.length===1?``:`s`]}),a.map(e=>(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:p(`font-medium text-muted-foreground`,t?`typography-micro`:`typography-code`),children:[e,`/`]}),(0,j.jsx)(`div`,{className:p(`pl-4 grid gap-1`,t?`grid-cols-1`:`grid-cols-2`),children:i[e].sort().map(e=>(0,j.jsxs)(`div`,{className:p(`flex items-center gap-2 min-w-0`,t?`typography-micro`:`typography-code`),children:[(0,j.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full flex-shrink-0`,style:Le}),(0,j.jsx)(`span`,{className:`text-foreground font-mono truncate`,children:e})]},e))})]},e))]})}catch{return null}},ze=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),Be=(e,t,n)=>{try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let r=t.filter(e=>!!e&&typeof e==`object`&&typeof e.content==`string`&&typeof e.status==`string`&&ze.has(e.status));if(r.length===0)return null;let i=r.find(e=>e.status===`in_progress`)??null;return(0,j.jsx)(`ul`,{className:n?.listClassName??P,children:r.map((e,t)=>(0,j.jsx)(B,{todo:e,isActive:e===i},e.id??`todo-${t}`))})}catch{return null}},Ve=(e,t)=>{try{return(0,j.jsx)(`div`,{className:p(`typography-code max-w-none w-full min-w-0`,t?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/20`),style:s.tool.popup,children:(0,j.jsx)(T,{content:e,variant:`tool`})})}catch{return null}},He=e=>{let t=e.split(`
7
+ `),n=``,r=[],i=0;for(;i<t.length;){let e=t[i];if(e.startsWith(`Index:`)||e.startsWith(`===`)||e.startsWith(`---`)||e.startsWith(`+++`)){e.startsWith(`Index:`)&&(n=e.split(` `)[1].split(`/`).pop()||`file`),i++;continue}if(e.startsWith(`@@`)){let a=e.match(/@@ -(\d+),\d+ \+(\d+),\d+ @@/),o=a?parseInt(a[1]):0,s=a?parseInt(a[2]):0,c=[],l=o,u=s,d=i+1;for(;d<t.length&&!t[d].startsWith(`@@`)&&!t[d].startsWith(`Index:`);){let e=t[d];e.startsWith(`+`)?(c.push({type:`added`,lineNumber:u,content:e.substring(1)}),u++):e.startsWith(`-`)?(c.push({type:`removed`,lineNumber:l,content:e.substring(1)}),l++):e.startsWith(` `)&&(c.push({type:`context`,lineNumber:u,content:e.substring(1)}),l++,u++),d++}r.push({file:n,oldStart:o,newStart:s,lines:c}),i=d;continue}i++}return r},Ue=(e,t,n)=>D(t,e,n),We={maxDepth:50,maxNodes:1e5,initiallyExpandedDepth:2};function Ge(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e==`object`?`object`:typeof e==`string`?`string`:typeof e==`number`?`number`:typeof e==`boolean`?`boolean`:`null`}function Ke(e){if(e.length===0)return`root`;let t=`root`;for(let n of e)/^\d+$/.test(n)?t+=`[${n}]`:t+=`.${n}`;return t}var Y=0;function X(e,t,n,r,i){if(Y>=i.maxNodes)return null;Y++;let a=Ge(e),o=Ke(n),s=a===`object`||a===`array`,c={id:o,key:t,value:e,type:a,depth:r,path:n,isExpandable:s};if(s&&r<i.maxDepth){let t=a===`array`?e.map((e,t)=>[String(t),e]):Object.entries(e);c.childCount=t.length,c.children=[];for(let[e,a]of t){let t=X(a,e,[...n,e],r+1,i);t&&c.children.push(t)}}else s&&(c.childCount=a===`array`?e.length:Object.keys(e).length);return c}function qe(e,t){let n={...We,...t};Y=0;try{let t=e.trim();return t?X(JSON.parse(t),`root`,[],0,n):null}catch{return null}}function Je(e,t){if(!e)return[];let n=[];function r(e){let i=!t.has(e.id);if(n.push({node:e,isExpanded:i}),e.isExpandable&&i&&e.children)for(let t of e.children)r(t)}return r(e),n}function Ye(e){if(!e)return[];let t=[];function n(e){if(e.isExpandable&&(t.push(e.id),e.children))for(let t of e.children)n(t)}return n(e),t}function Xe(e,t){if(!e)return[];let n=[];function r(e){if(e.isExpandable&&e.depth>=t&&n.push(e.id),e.children)for(let t of e.children)r(t)}return r(e),n}var Z=[`var(--syntax-key)`,`color-mix(in oklch, var(--syntax-key) 85%, var(--syntax-string))`,`color-mix(in oklch, var(--syntax-key) 70%, var(--syntax-number))`,`color-mix(in oklch, var(--syntax-key) 55%, var(--syntax-function))`,`color-mix(in oklch, var(--syntax-key) 40%, var(--syntax-type))`,`color-mix(in oklch, var(--syntax-key) 30%, var(--syntax-keyword))`];function Ze(e){return Z[e%Z.length]}function Qe(e){switch(e.type){case`string`:return`var(--syntax-string)`;case`number`:return`var(--syntax-number)`;case`boolean`:return`var(--syntax-keyword)`;case`null`:return`var(--syntax-comment)`;default:return`var(--surface-foreground)`}}function Q(e){switch(e.type){case`string`:{let t=e.value;return t.length>60?`"${t.slice(0,57)}..."`:`"${t}"`}case`number`:case`boolean`:return String(e.value);case`null`:return`null`;case`object`:return`{${e.childCount??0} ${e.childCount===1?`item`:`items`}}`;case`array`:return`[${e.childCount??0}]`;default:return String(e.value)}}function $e(e){if(e.type===`object`){let t=e.children?.map(e=>e.key).slice(0,3)??[],n=(e.childCount??0)>3?`, ...`:``;return`{ ${t.map(e=>`"${e}": ...`).join(`, `)}${n} }`}if(e.type===`array`){let t=e.childCount??0;return t<=3?`[${e.children?.map(e=>Q(e)).join(`, `)??``}]`:`[${t} items]`}return Q(e)}var $=k.memo(e=>{let t=(0,A.c)(29),{flatNode:n,onToggle:r,onCopyPath:i}=e,{node:a,isExpanded:o}=n,s=a.depth*20,c;t[0]!==a.id||t[1]!==r?(c=()=>{r(a.id)},t[0]=a.id,t[1]=r,t[2]=c):c=t[2];let l=c,u;t[3]!==a.id||t[4]!==i?(u=e=>{i&&(e.preventDefault(),i(a.id))},t[3]=a.id,t[4]=i,t[5]=u):u=t[5];let d=u,f;t[6]===a.depth?f=t[7]:(f=Ze(a.depth),t[6]=a.depth,t[7]=f);let p=f,m;t[8]===a?m=t[9]:(m=Qe(a),t[8]=a,t[9]=m);let h=m,g=a.isExpandable&&a.children&&a.children.length>0,v=`${s+8}px`,y;t[10]===v?y=t[11]:(y={paddingLeft:v},t[10]=v,t[11]=y);let b;t[12]!==l||t[13]!==g||t[14]!==o?(b=g?(0,j.jsx)(`button`,{type:`button`,onClick:l,className:`mr-1 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm hover:bg-[var(--interactive-hover)] text-muted-foreground`,children:o?(0,j.jsx)(_,{name:`arrow-down-s`,className:`h-3 w-3`}):(0,j.jsx)(_,{name:`arrow-right-s`,className:`h-3 w-3`})}):(0,j.jsx)(`span`,{className:`mr-1 w-4`}),t[12]=l,t[13]=g,t[14]=o,t[15]=b):b=t[15];let x;t[16]!==p||t[17]!==a.key?(x=a.key!==`root`&&(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`mr-1 font-semibold`,style:{color:p},children:/^\d+$/.test(a.key)?a.key:`"${a.key}"`}),(0,j.jsx)(`span`,{className:`mr-1 text-[var(--surface-foreground)]`,children:`:`})]}),t[16]=p,t[17]=a.key,t[18]=x):x=t[18];let S;t[19]!==o||t[20]!==a||t[21]!==h?(S=a.isExpandable?o?(0,j.jsx)(`span`,{className:`text-[var(--surface-foreground)]`,children:a.type===`object`?`{`:`[`}):(0,j.jsx)(`span`,{style:{color:`var(--surface-mutedForeground)`},children:$e(a)}):(0,j.jsx)(`span`,{style:{color:h},children:Q(a)}),t[19]=o,t[20]=a,t[21]=h,t[22]=S):S=t[22];let C;return t[23]!==d||t[24]!==y||t[25]!==b||t[26]!==x||t[27]!==S?(C=(0,j.jsxs)(`div`,{className:`flex items-center py-0.5 px-2 hover:bg-[var(--surface-hover)] rounded-sm cursor-default font-mono text-xs leading-5 whitespace-nowrap`,style:y,onContextMenu:d,children:[b,x,S]}),t[23]=d,t[24]=y,t[25]=b,t[26]=x,t[27]=S,t[28]=C):C=t[28],C});$.displayName=`JsonRow`;var et=200,tt=22,nt=k.forwardRef(function({data:e,className:t,maxHeight:n=`100%`,initiallyExpandedDepth:r=2,onCopyPath:i},a){let o=k.useMemo(()=>{try{return JSON.stringify(e)}catch{return null}},[e]),s=k.useMemo(()=>o?qe(o):null,[o]),[c,l]=k.useState(()=>s?new Set(Xe(s,r)):new Set),u=k.useMemo(()=>Je(s,c),[s,c]),d=u.length>et,f=k.useRef(null),p=O({count:u.length,enabled:d,getScrollElement:()=>f.current,estimateSize:()=>tt,overscan:20,getItemKey:e=>u[e]?.node.id??e}),m=k.useCallback(e=>{l(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),h=k.useCallback(()=>{l(new Set)},[]),g=k.useCallback(()=>{s&&l(new Set(Ye(s)))},[s]);return k.useImperativeHandle(a,()=>({expandAll:h,collapseAll:g}),[h,g]),s?d?(0,j.jsx)(`div`,{ref:f,className:t,style:{maxHeight:n,overflow:`auto`},children:(0,j.jsx)(`div`,{style:{height:p.getTotalSize(),position:`relative`},children:p.getVirtualItems().map(e=>{let t=u[e.index];return t?(0,j.jsx)(`div`,{"data-index":e.index,ref:p.measureElement,style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${e.start}px)`},children:(0,j.jsx)($,{flatNode:t,onToggle:m,onCopyPath:i})},t.node.id):null})})}):(0,j.jsx)(`div`,{ref:f,className:t,style:{maxHeight:n,overflow:`auto`},children:u.map(e=>(0,j.jsx)($,{flatNode:e,onToggle:m,onCopyPath:i},e.node.id))}):null}),rt=e=>{let t=(0,A.c)(12),{mode:n,onModeChange:r,className:i}=e,a;t[0]!==n||t[1]!==r?(a=e=>{e.stopPropagation(),r(n===`side-by-side`?`unified`:`side-by-side`)},t[0]=n,t[1]=r,t[2]=a):a=t[2];let o=a,s;t[3]===i?s=t[4]:(s=p(`h-5 w-5 p-0 opacity-60 hover:opacity-100`,i),t[3]=i,t[4]=s);let c=n===`side-by-side`?`Switch to unified view`:`Switch to side-by-side view`,l;t[5]===n?l=t[6]:(l=n===`side-by-side`?(0,j.jsx)(_,{name:`align-justify`,className:`h-3 w-3`}):(0,j.jsx)(_,{name:`layout-column`,className:`h-3 w-3`}),t[5]=n,t[6]=l);let u;return t[7]!==o||t[8]!==s||t[9]!==c||t[10]!==l?(u=(0,j.jsx)(m,{size:`sm`,variant:`ghost`,className:s,onClick:o,title:c,children:l}),t[7]=o,t[8]=s,t[9]=c,t[10]=l,t[11]=u):u=t[11],u},it=(e,t)=>{let n=(0,A.c)(4),[r,i]=k.useState(null),a,o;return n[0]!==e||n[1]!==t?(a=()=>{let n=!0,r=new AbortController;return i(null),E(e,(t||`text`).toLowerCase(),{signal:r.signal,priority:`visible`}).then(e=>{n&&i(e)}),()=>{n=!1,r.abort()}},o=[e,t],n[0]=e,n[1]=t,n[2]=a,n[3]=o):(a=n[2],o=n[3]),k.useEffect(a,o),r};export{le as A,P as C,L as D,de as E,fe as O,ce as S,oe as T,be as _,Ue as a,se as b,He as c,Ie as d,Pe as f,we as g,je as h,Ee as i,ue as j,I as k,Ne as l,Ve as m,rt as n,Me as o,Be as p,nt as r,ke as s,it as t,Re as u,B as v,F as w,M as x,ae as y};
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-DRvqRoHG.js"></script>
555
+ <script type="module" crossorigin src="/assets/main-DadoVO4A.js"></script>
556
556
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
557
557
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-BpCQ-dPr.js">
558
558
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-CMiMO5Yj.js">
@@ -572,7 +572,7 @@
572
572
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-rxsMWL0o.js">
573
573
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
574
574
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-KNLHDj7G.js">
575
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-DHT_B7ZP.js">
575
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-g_-L1K8Q.js">
576
576
  <link rel="stylesheet" crossorigin href="/assets/src-B1YRV5EQ.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-CVVkf6qd.js"></script>
77
+ <script type="module" crossorigin src="/assets/miniChat-BWFZe7j-.js"></script>
78
78
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-BpCQ-dPr.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-CMiMO5Yj.js">
@@ -94,7 +94,7 @@
94
94
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-rxsMWL0o.js">
95
95
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
96
96
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-KNLHDj7G.js">
97
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-DHT_B7ZP.js">
97
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-g_-L1K8Q.js">
98
98
  <link rel="stylesheet" crossorigin href="/assets/src-B1YRV5EQ.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-C3YKq4-C.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-BC-jMvYW.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-BpCQ-dPr.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-CMiMO5Yj.js">
@@ -83,7 +83,7 @@
83
83
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-rxsMWL0o.js">
84
84
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
85
85
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-KNLHDj7G.js">
86
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-DHT_B7ZP.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-g_-L1K8Q.js">
87
87
  <link rel="stylesheet" crossorigin href="/assets/src-B1YRV5EQ.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": "2.1.10-beta.4",
3
+ "version": "2.1.10-beta.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
@@ -35,6 +35,12 @@ Own filesystem API behavior for the web server runtime, including file operation
35
35
  - `index.js` no longer owns FS route handlers or FS exec job state.
36
36
 
37
37
  ## Notes for contributors
38
+ - `/api/fs/raw` serves video MIME types (MP4/M4V/MOV/WebM/OGV) using Express's
39
+ streamed `sendFile` after the existing path authorization/realpath checks.
40
+ Explicit Range requests and HEAD use the same path: 206/Content-Range,
41
+ suffix/open-ended reads, 416 and disconnect cancellation are transport-neutral.
42
+ `raw-video.test.js` exercises the real route; the compiled Relay E2E test checks
43
+ that authorized ranges retain metadata/bytes across the encrypted tunnel.
38
44
  - Keep filesystem policy (read access, workspace root checks for mutations, error mapping, exec timeout behavior) inside this module, not in the composition root.
39
45
  - Optional `GET /api/fs/read` responses retain their `text/plain` body and set `x-openchamber-file-exists` to `true` or `false` so empty files remain distinguishable from missing files.
40
46
  - If adding new `/api/fs/*` endpoints, add them in `routes.js` and extend this document.
@@ -0,0 +1,41 @@
1
+ import { afterEach, expect, test } from 'vitest';
2
+ import express from 'express';
3
+ import * as fs from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+ import { registerFsRoutes } from './routes.js';
7
+
8
+ const cleanups = [];
9
+ afterEach(async () => { for (const cleanup of cleanups.splice(0).reverse()) await cleanup(); });
10
+
11
+ test('raw video supports first-byte probing, tail seeking, HEAD and unsatisfiable ranges', async () => {
12
+ const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'oc-video-range-'));
13
+ cleanups.push(() => fs.rm(directory, { recursive: true, force: true }));
14
+ const file = path.join(directory, 'clip.mov');
15
+ await fs.writeFile(file, Buffer.from('0123456789'));
16
+ const app = express();
17
+ registerFsRoutes({ get: (route, handler) => { if (route === '/api/fs/raw') app.get(route, handler); }, post() {}, put() {} }, {
18
+ os, path, fsPromises: fs, spawn() {}, crypto: globalThis.crypto,
19
+ normalizeDirectoryPath: value => value, resolveProjectDirectory: async () => ({ directory }),
20
+ buildAugmentedPath: () => '', resolveGitBinaryForSpawn: () => 'git', openchamberUserConfigRoot: directory,
21
+ });
22
+ const server = app.listen(0, '127.0.0.1');
23
+ await new Promise(resolve => server.once('listening', resolve));
24
+ cleanups.push(() => new Promise(resolve => { server.close(resolve); server.closeAllConnections(); }));
25
+ const url = `http://127.0.0.1:${server.address().port}/api/fs/raw?path=${encodeURIComponent(file)}`;
26
+ for (const [range, expected, contentRange] of [['bytes=0-1', '01', 'bytes 0-1/10'], ['bytes=7-', '789', 'bytes 7-9/10'], ['bytes=-3', '789', 'bytes 7-9/10']]) {
27
+ const response = await fetch(url, { headers: { Range: range } });
28
+ expect(response.status).toBe(206);
29
+ expect(response.headers.get('content-type')).toBe('video/quicktime');
30
+ expect(response.headers.get('content-range')).toBe(contentRange);
31
+ expect(response.headers.get('accept-ranges')).toBe('bytes');
32
+ expect(await response.text()).toBe(expected);
33
+ }
34
+ const head = await fetch(url, { method: 'HEAD' });
35
+ expect(head.status).toBe(200);
36
+ expect(head.headers.get('content-length')).toBe('10');
37
+ expect(await head.text()).toBe('');
38
+ const invalid = await fetch(url, { headers: { Range: 'bytes=20-' } });
39
+ expect(invalid.status).toBe(416);
40
+ expect(invalid.headers.get('content-range')).toBe('bytes */10');
41
+ });
@@ -109,6 +109,10 @@ const FILE_MIME_MAP = Object.freeze({
109
109
  '.eot': 'application/vnd.ms-fontobject',
110
110
  '.mp3': 'audio/mpeg',
111
111
  '.mp4': 'video/mp4',
112
+ '.m4v': 'video/mp4',
113
+ '.mov': 'video/quicktime',
114
+ '.webm': 'video/webm',
115
+ '.ogv': 'video/ogg',
112
116
  '.png': 'image/png',
113
117
  '.jpg': 'image/jpeg',
114
118
  '.jpeg': 'image/jpeg',
@@ -885,6 +889,11 @@ export const registerFsRoutes = (app, dependencies) => {
885
889
  '.bmp': 'image/bmp',
886
890
  '.avif': 'image/avif',
887
891
  '.pdf': 'application/pdf',
892
+ '.mp4': 'video/mp4',
893
+ '.m4v': 'video/mp4',
894
+ '.mov': 'video/quicktime',
895
+ '.webm': 'video/webm',
896
+ '.ogv': 'video/ogg',
888
897
  };
889
898
  const mimeType = mimeMap[ext] || 'application/octet-stream';
890
899
 
@@ -900,11 +909,16 @@ export const registerFsRoutes = (app, dependencies) => {
900
909
  res.setHeader('Content-Disposition', `attachment; filename="${fallback}"; filename*=UTF-8''${encoded}`);
901
910
  }
902
911
 
903
- const content = await fsPromises.readFile(canonicalPath);
904
912
  res.setHeader('Cache-Control', 'no-store');
905
913
  if (resolved.granted) {
906
914
  res.setHeader('Referrer-Policy', 'no-referrer');
907
915
  }
916
+ if (mimeType.startsWith('video/') || req.headers?.range || req.method === 'HEAD') {
917
+ // Path authorization above remains authoritative; Express owns range parsing,
918
+ // 206/416, stream backpressure and cancellation when the player seeks away.
919
+ return res.type(mimeType).sendFile(canonicalPath, { acceptRanges: true, dotfiles: 'allow', cacheControl: false });
920
+ }
921
+ const content = await fsPromises.readFile(canonicalPath);
908
922
  return res.type(mimeType).send(content);
909
923
  } catch (error) {
910
924
  const err = error;
@@ -4,6 +4,7 @@ import { spawn, type ChildProcess } from 'node:child_process';
4
4
  import crypto from 'node:crypto';
5
5
  import { once } from 'node:events';
6
6
  import { mkdtemp, rm } from 'node:fs/promises';
7
+ import * as fsPromises from 'node:fs/promises';
7
8
  import http from 'node:http';
8
9
  import net from 'node:net';
9
10
  import os from 'node:os';
@@ -25,7 +26,8 @@ import { setRuntimeBearerToken } from '../../../../ui/src/lib/runtime-auth.ts';
25
26
  import { adoptRelayTunnel, deactivateRelayTunnel } from '../../../../ui/src/lib/relay/runtime-tunnel.ts';
26
27
  import { acquireRuntimeImage } from '../../../../ui/src/lib/runtime-image-cache.ts';
27
28
  import { NATIVE_RELAY_ASSET_BRIDGE_KEY } from '../../../../ui/src/lib/relay/native-asset-bridge.ts';
28
- import { resetRelayImageStreamForTests } from '../../../../ui/src/lib/relay/relay-image-stream.ts';
29
+ import { readRelayImageDisplayBlob, resetRelayImageStreamForTests } from '../../../../ui/src/lib/relay/relay-image-stream.ts';
30
+ import { registerFsRoutes } from '../fs/routes.js';
29
31
  import { runtimeFetch } from '../../../../ui/src/lib/runtime-fetch.ts';
30
32
  import { registerTtsRoutes } from '../tts/routes.js';
31
33
  import { createDictationRuntime } from '../dictation/runtime.js';
@@ -156,6 +158,15 @@ const readBody = async (req: http.IncomingMessage) => {
156
158
  };
157
159
 
158
160
  const startOrigin = async () => {
161
+ const mediaDirectory = await mkdtemp(path.join(os.tmpdir(), 'relay-video-'));
162
+ const videoPath = path.join(mediaDirectory, 'clip.mp4');
163
+ await fsPromises.writeFile(videoPath, Buffer.from('0123456789'));
164
+ const rawFiles = express();
165
+ registerFsRoutes({ get: (route: string, handler: express.RequestHandler) => { if (route === '/api/fs/raw') rawFiles.get(route, handler); }, post() {}, put() {} }, {
166
+ fsPromises, os, path, spawn, crypto: globalThis.crypto, normalizeDirectoryPath: (value: string) => value,
167
+ resolveProjectDirectory: async () => ({ directory: mediaDirectory }), buildAugmentedPath: () => '',
168
+ resolveGitBinaryForSpawn: () => 'git', openchamberUserConfigRoot: mediaDirectory,
169
+ });
159
170
  const bearerRequests: string[] = [];
160
171
  const observedOrigins: string[] = [];
161
172
  const sockets = new Set<net.Socket>();
@@ -236,6 +247,7 @@ const startOrigin = async () => {
236
247
  if (pathname === '/api/fs/raw' && req.method === 'GET') {
237
248
  await uiAuth.requireAuth(req, res, () => {
238
249
  const filePath = new URL(req.url ?? '/', 'http://origin').searchParams.get('path');
250
+ if (filePath === videoPath) { rawFiles(req, rawRes); return; }
239
251
  if (filePath !== '/remote/icons-zoom.png' || !req.headers['x-openchamber-relay-connection']) {
240
252
  res.status(404).end(); return;
241
253
  }
@@ -289,7 +301,7 @@ const startOrigin = async () => {
289
301
  await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));
290
302
  const port = (server.address() as net.AddressInfo).port;
291
303
  return {
292
- port, bearerRequests, observedOrigins, getHostSubscriptions: () => hostSubscriptions,
304
+ port, videoPath, bearerRequests, observedOrigins, getHostSubscriptions: () => hostSubscriptions,
293
305
  stop: async () => {
294
306
  dictation.stop();
295
307
  for (const client of wss.clients) client.terminate();
@@ -297,6 +309,7 @@ const startOrigin = async () => {
297
309
  await Promise.race([new Promise<void>((resolve) => wss.close(() => resolve())), wait(1_000)]);
298
310
  await Promise.race([new Promise<void>((resolve) => server.close(() => resolve())), wait(1_000)]);
299
311
  uiAuth.dispose();
312
+ await rm(mediaDirectory, { recursive: true, force: true });
300
313
  },
301
314
  };
302
315
  };
@@ -386,9 +399,9 @@ describe('private relay compiled-process boundary', () => {
386
399
  vi.stubEnv('OPENCHAMBER_DATA_DIR', path.join(temp, 'host-data'));
387
400
  const binary = path.join(temp, 'openchamber-relay');
388
401
  let relay: Awaited<ReturnType<typeof startCompiledRelay>> | undefined;
389
- let origin: Awaited<ReturnType<typeof startOrigin>> | undefined;
390
- let host: ReturnType<typeof startRelayHost> | undefined;
391
- let client: ReturnType<typeof createRelayTunnelClient> | undefined;
402
+ let origin: Awaited<ReturnType<typeof startOrigin>> | undefined = undefined;
403
+ let host: ReturnType<typeof startRelayHost> | undefined = undefined;
404
+ let client: ReturnType<typeof createRelayTunnelClient> | undefined = undefined;
392
405
  cleanup = async () => {
393
406
  const results = await Promise.allSettled([Promise.resolve(client?.close()), Promise.resolve(host?.stop()), origin?.stop(), stopRelay(relay)]);
394
407
  await rm(temp, { recursive: true, force: true });
@@ -608,9 +621,19 @@ describe('private relay compiled-process boundary', () => {
608
621
  expect(image.url).toMatch(/^openchamber-asset:\/\/v\//);
609
622
  await eventually(() => ended, 'relay image did not finish writing to native bridge');
610
623
  expect(Buffer.concat(received)).toEqual(previewPng);
624
+ const savedImage = await readRelayImageDisplayBlob(image.url);
625
+ expect(Buffer.from(await savedImage!.arrayBuffer())).toEqual(previewPng);
611
626
  image.release();
612
627
  await eventually(() => released, 'native image lease was not released');
613
628
  }
629
+ for (const [range, expectedRange, bytes] of [['bytes=0-1', 'bytes 0-1/10', '01'], ['bytes=7-', 'bytes 7-9/10', '789']]) {
630
+ const response = await runtimeFetch('/api/fs/raw', { query: { path: origin.videoPath }, headers: { Range: range } });
631
+ expect(response.status).toBe(206);
632
+ expect(response.headers.get('content-range')).toBe(expectedRange);
633
+ expect(response.headers.get('accept-ranges')).toBe('bytes');
634
+ expect(response.headers.get('content-type')).toBe('video/mp4');
635
+ expect(await response.text()).toBe(bytes);
636
+ }
614
637
  } finally {
615
638
  resetRelayImageStreamForTests();
616
639
  Reflect.deleteProperty(globalThis, NATIVE_RELAY_ASSET_BRIDGE_KEY);
@@ -1,10 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./runtime-fetch-WgH0pROs.js";import{it as n,nt as r,rt as i}from"./vendor-base-ui-CdzJ6My_.js";import{_ as a}from"./useUIStore-CEqU9Ujv.js";import{n as o}from"./vendor-react-BP2cRVqX.js";import{s}from"./vendor-tanstack-react-query-CdqCAt40.js";import{a as c,i as l}from"./vendor-pierre-diffs-DPBtNDJ5.js";import{n as u}from"./vendor-reactuses-core-BpfIZ1tg.js";import{f as d,r as f,t as p}from"./button-CWSs9Baz.js";import{n as m,t as h}from"./useThemeSystem-8jhE4Zyk.js";import{n as g}from"./Icon-BCFeHDWx.js";import{n as _,t as v}from"./dialog-BMa16qrs.js";import{i as y,l as b,o as x,s as S,v as C}from"./image-loading-Bj11k4gM.js";import{f as w}from"./MobileResizableSheet-Bs4gAbDr.js";import{i as T,t as E}from"./appThemeRegistry-C8bq_-cg.js";import{n as D,o as O}from"./MarkdownRenderer-CFVvfuhR.js";import{l as k}from"./markdown-worker-DFNZ3KJ_.js";import{n as A}from"./useEffectiveDirectory-C5trBWhE.js";import{a as j,i as M,n as N}from"./markdownTheme-Y4nBAXal.js";import{t as P}from"./ImageLoadingPlaceholder-DEpMJXzV.js";import{_ as F,d as I,f as L,g as R,h as ee,l as z,m as B,n as V,p as H,r as U,s as W,t as G,u as te}from"./useWorkerHighlightedLines-D3P0ms_2.js";import{t as K}from"./vendor-tanstack-react-virtual-B_EO--9t.js";var q=o(),J=e(n(),1),Y=i(),X=80,Z=20,ne=J.memo(e=>{let t=(0,q.c)(26),{lines:n,language:r,maxHeight:i,showLineNumbers:a,lineStyles:o}=e,s=i===void 0?`60vh`:i,c=a===void 0||a,{currentTheme:l}=m(),u;t[0]===l?u=t[1]:(u=N(l),t[0]=l,t[1]=u);let d=u,f;t[2]===n?f=t[3]:(f=n.map(ie).join(`
2
- `),t[2]=n,t[3]=f);let p=G(f,r);if(!(n.length>X)){let e=d,r;t[4]!==s||t[5]!==e?(r={...e,maxHeight:s,overflow:`auto`},t[4]=s,t[5]=e,t[6]=r):r=t[6];let i;if(t[7]!==p||t[8]!==o||t[9]!==n||t[10]!==c){let e;t[12]!==p||t[13]!==o||t[14]!==c?(e=(e,t)=>(0,Y.jsx)(Q,{line:e,html:p?.[t],showLineNumbers:c,style:o?.(e)},t),t[12]=p,t[13]=o,t[14]=c,t[15]=e):e=t[15],i=n.map(e),t[7]=p,t[8]=o,t[9]=n,t[10]=c,t[11]=i}else i=t[11];let a;return t[16]!==r||t[17]!==i?(a=(0,Y.jsx)(`div`,{className:`typography-code font-mono w-full min-w-0`,style:r,children:i}),t[16]=r,t[17]=i,t[18]=a):a=t[18],a}let h;return t[19]!==p||t[20]!==o||t[21]!==n||t[22]!==s||t[23]!==c||t[24]!==d?(h=(0,Y.jsx)(re,{lines:n,highlighted:p,syntaxVars:d,maxHeight:s,showLineNumbers:c,lineStyles:o}),t[19]=p,t[20]=o,t[21]=n,t[22]=s,t[23]=c,t[24]=d,t[25]=h):h=t[25],h});ne.displayName=`VirtualizedCodeBlock`;var re=J.memo(({lines:e,highlighted:t,syntaxVars:n,maxHeight:r,showLineNumbers:i,lineStyles:a})=>{let o=J.useRef(null),s=`min(${e.length*Z}px, ${r})`,c=K({count:e.length,getScrollElement:()=>o.current,estimateSize:()=>Z,overscan:20}),l=c.getVirtualItems();return(0,Y.jsx)(`div`,{ref:o,className:`typography-code font-mono w-full min-w-0`,style:{...n,height:s,maxHeight:r,overflow:`auto`},children:(0,Y.jsx)(`div`,{style:{height:c.getTotalSize(),position:`relative`},children:l.map(n=>{let r=e[n.index];return r?(0,Y.jsx)(`div`,{"data-index":n.index,ref:c.measureElement,style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${n.start}px)`},children:(0,Y.jsx)(Q,{line:r,html:t?.[n.index],showLineNumbers:i,style:a?.(r)})},n.index):null})})})});re.displayName=`VirtualizedRows`;var Q=J.memo(e=>{let t=(0,q.c)(12),{line:n,html:r,showLineNumbers:i,style:a}=e,o;t[0]!==n.isInfo||t[1]!==n.lineNumber||t[2]!==i?(o=i&&(0,Y.jsx)(`span`,{className:`w-10 flex-shrink-0 text-right pr-3 select-none border-r mr-3 -my-0.5 py-0.5`,style:{color:`var(--tools-edit-line-number)`,borderColor:`var(--tools-border)`},children:!n.isInfo&&n.lineNumber!=null?n.lineNumber:``}),t[0]=n.isInfo,t[1]=n.lineNumber,t[2]=i,t[3]=o):o=t[3];let s;t[4]!==r||t[5]!==n.isInfo||t[6]!==n.text?(s=(0,Y.jsx)(`div`,{className:`flex-1 min-w-0`,children:n.isInfo?(0,Y.jsx)(`div`,{className:`whitespace-pre-wrap break-words text-muted-foreground/70 italic`,children:n.text}):r===void 0?(0,Y.jsx)(`div`,{className:`whitespace-pre`,children:n.text}):(0,Y.jsx)(`div`,{className:`whitespace-pre`,dangerouslySetInnerHTML:{__html:r}})}),t[4]=r,t[5]=n.isInfo,t[6]=n.text,t[7]=s):s=t[7];let c;return t[8]!==a||t[9]!==o||t[10]!==s?(c=(0,Y.jsxs)(`div`,{className:`typography-code font-mono flex w-full min-w-0`,style:a,children:[o,s]}),t[8]=a,t[9]=o,t[10]=s,t[11]=c):c=t[11],c});Q.displayName=`VirtualizedCodeBlock.Row`;function ie(e){return e.text}var ae=J.memo(function({jsonString:e,className:t,maxHeight:n=`100%`,initiallyExpandedDepth:r=2}){let{t:i}=d(),a=J.useRef(null),[o,s]=J.useState(null),c=J.useMemo(()=>{try{let t=e.trim();if(!t)return s(i(`jsonTreeView.error.emptyJson`)),null;let n=JSON.parse(t);return s(null),n}catch(e){return s(e instanceof Error?e.message:i(`jsonTreeView.error.invalidJson`)),null}},[e,i]),l=J.useCallback(()=>{a.current?.expandAll()},[]),u=J.useCallback(()=>{a.current?.collapseAll()},[]);return o?(0,Y.jsx)(`div`,{className:t,children:(0,Y.jsxs)(`div`,{className:`rounded-md border border-[var(--interactive-border)] bg-[var(--syntax-base-background)] p-4`,children:[(0,Y.jsx)(`div`,{className:`mb-1 font-medium text-[var(--surface-foreground)]`,children:i(`jsonTreeView.error.invalidJsonTitle`)}),(0,Y.jsx)(`div`,{className:`font-mono text-xs text-[var(--surface-mutedForeground)]`,children:o})]})}):c===null?null:(0,Y.jsxs)(`div`,{className:t,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1 border-b border-[var(--interactive-border)] px-2 py-1`,children:[(0,Y.jsxs)(p,{variant:`ghost`,size:`xs`,onClick:l,className:`gap-1 text-xs text-muted-foreground`,children:[(0,Y.jsx)(g,{name:`arrow-down-s`,className:`h-3 w-3`}),i(`jsonTreeView.actions.expandAll`)]}),(0,Y.jsxs)(p,{variant:`ghost`,size:`xs`,onClick:u,className:`gap-1 text-xs text-muted-foreground`,children:[(0,Y.jsx)(g,{name:`arrow-up-s`,className:`h-3 w-3`}),i(`jsonTreeView.actions.collapseAll`)]})]}),(0,Y.jsx)(`div`,{className:`bg-[var(--syntax-base-background)] py-1`,style:{maxHeight:n,overflow:`auto`},children:(0,Y.jsx)(U,{ref:a,data:c,maxHeight:n,initiallyExpandedDepth:r})})]})}),oe=class extends Error{key;params;constructor(e,t){super(e),this.name=`MermaidLoadFailure`,this.key=e,this.params=t}},se=(e,t)=>new oe(e,t),ce=e=>e instanceof oe,le=e=>e+1,ue=(e,t)=>e===t,de=e=>{let t=e.indexOf(`,`);if(t<0)throw se(`chat.toolOutputDialog.mermaid.dataUrlMalformed`);let n=e.slice(0,t).toLowerCase(),r=e.slice(t+1);return n.includes(`;base64`)?atob(r):decodeURIComponent(r)},fe=e=>Promise.resolve().then(()=>de(e)),pe=1,me=56,he=(e,t,n)=>Math.min(n,Math.max(t,e)),ge=({isMobile:e,pointerType:t,cancelled:n,moved:r,suppressTap:i,targetWasCanvas:a,start:o,end:s,startScale:c,hasMultipleImages:l})=>{if(n||i)return`none`;let u={x:s.x-o.x,y:s.y-o.y},d=Math.hypot(u.x,u.y),f=t!==`mouse`;if(e&&f&&c<=1.01&&Math.abs(u.x)>=me&&Math.abs(u.x)>Math.abs(u.y)*1.2)return l?u.x<0?`next`:`previous`:`none`;let p=!r&&d<=10;return e&&f&&p||!e&&t===`mouse`&&p&&a?`close`:`none`},_e=(e,t)=>{if(e.width<=0||e.height<=0||t.width<=0||t.height<=0)return{width:1,height:1};let n=Math.min(t.width/e.width,t.height/e.height);return{width:Math.max(1,e.width*n),height:Math.max(1,e.height*n)}},ve=(e,t)=>{let n=t.minScale??pe,r=t.maxScale??5,i=he(e.scale,n,r),a=Math.max(0,(t.image.width*i-t.viewport.width)/2),o=Math.max(0,(t.image.height*i-t.viewport.height)/2);return{scale:i,x:he(e.x,-a,a),y:he(e.y,-o,o)}},ye=(e,t,n,r,i)=>{let a=he(t,i.minScale??pe,i.maxScale??5),o=a/e.scale;return ve({scale:a,x:n.x-r.x-(n.x-r.x-e.x)*o,y:n.y-r.y-(n.y-r.y-e.y)*o},i)},be=(e,t,n)=>ve({...e,x:e.x+t.x,y:e.y+t.y},n),xe=(e,t,n,r,i,a)=>{let o=he(r,a.minScale??pe,a.maxScale??5),s=o/e.scale;return ve({scale:o,x:n.x-i.x-(t.x-i.x-e.x)*s,y:n.y-i.y-(t.y-i.y-e.y)*s},a)},Se=500,Ce=24,we=(e,t={})=>{let n=t.target??(typeof document>`u`?null:document);if(!n)return()=>{};let r=t.durationMs??Se,i=t.maxDistance??Ce,a=!0,o,s=()=>{a&&(a=!1,n.removeEventListener(`click`,c,!0),o!==void 0&&globalThis.clearTimeout(o))},c=t=>{let n=t;typeof n.clientX==`number`&&typeof n.clientY==`number`&&(Math.hypot(n.clientX-e.x,n.clientY-e.y)>i||(s(),t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()))};return n.addEventListener(`click`,c,!0),o=globalThis.setTimeout(s,r),s},Te=(e,t,n={})=>{we(e,n),t()},Ee=e(r(),1);function De(e,t,n,r,i){let a=e instanceof HTMLImageElement?e:e.querySelector(`img`);if(!a||!t.complete||!t.naturalWidth||!t.animate)return;let o=t.getBoundingClientRect(),s=a.getBoundingClientRect();if(!o.width||!o.height||!s.width||!s.height)return;let c=getComputedStyle(a),l=t.naturalWidth/t.naturalHeight,u=c.objectFit===`cover`?Math.max(s.width,s.height*l):Math.min(s.width,s.height*l),d=u/l,f=c.objectPosition.split(` `);if(!f.every(e=>e.endsWith(`%`)))return;let p=(s.width-u)*parseFloat(f[0])/100,m=(s.height-d)*parseFloat(f[1]??f[0])/100,h=s.left,g=s.top,_=s.right,v=s.bottom,y=c.borderRadius;for(let e=a.parentElement;e;e=e.parentElement){let t=getComputedStyle(e),n=e.getBoundingClientRect();[`hidden`,`clip`,`auto`,`scroll`].includes(t.overflowX)&&(h=Math.max(h,n.left),_=Math.min(_,n.right)),[`hidden`,`clip`,`auto`,`scroll`].includes(t.overflowY)&&(g=Math.max(g,n.top),v=Math.min(v,n.bottom)),n.width===s.width&&n.height===s.height&&t.borderRadius!==`0px`&&(y=t.borderRadius)}if(_<=h||v<=g)return;let b=document.createElement(`div`);b.dataset.mediaCropAnimation=``,b.setAttribute(`aria-hidden`,`true`),Object.assign(b.style,{position:`fixed`,left:`0`,top:`0`,overflow:`hidden`,pointerEvents:`none`,zIndex:`51`,contain:`paint`});let x=document.createElement(`img`);x.src=t.currentSrc||t.src,x.alt=``,Object.assign(x.style,{display:`block`,width:`${o.width}px`,height:`${o.height}px`,maxWidth:`none`,transformOrigin:`0 0`}),b.append(x),document.body.append(b);let S={transform:`translate(${o.left}px, ${o.top}px)`,width:`${o.width}px`,height:`${o.height}px`,borderRadius:`0px`},C={transform:`translate(${h}px, ${g}px)`,width:`${_-h}px`,height:`${v-g}px`,borderRadius:y},w={transform:`translate(0px, 0px) scale(1)`},T={transform:`translate(${s.left+p-h}px, ${s.top+m-g}px) scale(${u/o.width})`},E={duration:280,easing:`cubic-bezier(0.2, 0, 0, 1)`,fill:`both`},D=t.style.visibility;t.style.visibility=`hidden`;let O=[b.animate(r?[S,C]:[C,S],E),x.animate(r?[w,T]:[T,w],E),n.animate({opacity:r?[1,0]:[0,1]},E)],k=!1,A=(e=!1)=>{b.remove(),t.style.visibility=D,O.forEach((t,n)=>{(!e||n!==2)&&t.cancel()})};return Promise.all(O.map(e=>e.finished)).then(()=>{k||(A(r),i())},()=>{k||(A(),i())}),()=>{k=!0,A()}}function $(e,t,n,r,i=()=>{}){let a=e?.getBoundingClientRect(),o=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;if(!o&&e?.isConnected&&t instanceof HTMLImageElement&&n&&a?.width&&a.height&&a.bottom>0&&a.top<window.innerHeight&&a.right>0&&a.left<window.innerWidth){let a=De(e,t,n,r,i);if(a)return a}if(!document.startViewTransition||o||!e?.isConnected||!t||!n||!a?.width||!a.height||a.bottom<=0||a.top>=window.innerHeight||a.right<=0||a.left>=window.innerWidth){if(!n?.animate||o)return i(),()=>{};let e=n.animate({opacity:r?[1,0]:[0,1]},{duration:150,fill:`forwards`}),t=!1;return e.finished.then(()=>{t||i()},()=>{}),()=>{t=!0,e.cancel()}}let s=e.style.viewTransitionName,c=t.style.viewTransitionName,l=n.style.visibility,u=!1,d=`oc-media-preview`;e.style.viewTransitionName=r?`none`:d,t.style.viewTransitionName=r?d:`none`,r||(n.style.visibility=`hidden`);let f=document.startViewTransition(()=>{u||(e.style.viewTransitionName=r?d:`none`,t.style.viewTransitionName=r?`none`:d,n.style.visibility=r?`hidden`:l)}),p=()=>{e.style.viewTransitionName=s,t.style.viewTransitionName=c,n.style.visibility=l};f.ready.catch(()=>{});let m=()=>{u||(p(),i())};return f.finished.then(m,m),()=>{u=!0,f.skipTransition(),p()}}function Oe(e){let t=(0,q.c)(12),{onClose:n,isMobile:r,size:i}=e,{t:a}=d(),o;t[0]!==r||t[1]!==i?(o=r?{top:`calc(var(--oc-safe-area-top, 0px) + 0.5rem)`,right:`calc(var(--oc-safe-area-right, 0px) + 0.75rem)`}:{top:i?`calc(50% - ${i.height/2}px + 0.5rem)`:`0.5rem`,right:i?`calc(50% - ${i.width/2}px + 0.5rem)`:`0.5rem`},t[0]=r,t[1]=i,t[2]=o):o=t[2];let s;t[3]===a?s=t[4]:(s=a(`dialog.common.actions.close`),t[3]=a,t[4]=s);let c;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,Y.jsx)(g,{name:`close`,className:`size-5`}),t[5]=c):c=t[5];let l;t[6]!==n||t[7]!==s?(l=(0,Y.jsx)(p,{variant:`mobileGlass`,size:`mobileIcon`,"aria-label":s,onClick:n,children:c}),t[6]=n,t[7]=s,t[8]=l):l=t[8];let u;return t[9]!==o||t[10]!==l?(u=(0,Y.jsx)(`div`,{className:`absolute right-3 z-20`,style:o,children:l}),t[9]=o,t[10]=l,t[11]=u):u=t[11],u}function ke(e){let t=(0,q.c)(28),{open:n,title:r,kind:i,source:a,isMobile:o,onOpenChange:s,children:c}=e,l=J.useRef(null),d=J.useId(),f=J.useRef(null),p=J.useRef(!1),[m,h]=J.useState(!1),g;t[0]!==s||t[1]!==a?(g=()=>{if(p.current)return;p.current=!0,f.current?.();let e=l.current?.querySelector(`[data-preview-transition-target]`)??null;f.current=$(e?.dataset.previewReturn===`false`?void 0:a,e,l.current,!0,()=>{h(!0),s(!1)})},t[0]=s,t[1]=a,t[2]=g):g=t[2];let _=u(g),v=`${i}-preview`,y=n&&!m&&o,b;t[3]!==_||t[4]!==v||t[5]!==y?(b={id:v,active:y,layer:`overlay`,onBack:_,surfaceRef:l},t[3]=_,t[4]=v,t[5]=y,t[6]=b):b=t[6],T(b);let x,S;if(t[7]!==_||t[8]!==m||t[9]!==o||t[10]!==d||t[11]!==n||t[12]!==a?(x=()=>{if(!n){h(!1),p.current=!1;return}if(m)return;let e=l.current,t=document.activeElement instanceof HTMLElement?document.activeElement:null,r=o?w.add({id:d,onClose:_},document.body):void 0;return e?.querySelector(`button`)?.focus({preventScroll:!0}),f.current=$(a,e?.querySelector(`[data-preview-transition-target]`)??null,e,!1),()=>{f.current?.(),f.current=null,p.current=!1,r?.(),t?.isConnected&&t.focus({preventScroll:!0})}},S=[m,n,a,o,d,_],t[7]=_,t[8]=m,t[9]=o,t[10]=d,t[11]=n,t[12]=a,t[13]=x,t[14]=S):(x=t[13],S=t[14]),J.useLayoutEffect(x,S),!n||m||typeof document>`u`)return null;let C=o?`var(--oc-media-preview-background)`:`color-mix(in srgb, var(--oc-media-preview-background) ${i===`mermaid`?90:70}%, transparent)`,E;t[15]===C?E=t[16]:(E={backgroundColor:C,color:`var(--oc-media-preview-foreground)`},t[15]=C,t[16]=E);let D;t[17]===_?D=t[18]:(D=e=>{if(!e.currentTarget.contains(e.target)||(e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),_()),e.key!==`Tab`))return;let t=Array.from(e.currentTarget.querySelectorAll(`button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex="0"]`)),n=t[0],r=t.at(-1);e.shiftKey&&document.activeElement===n?(e.preventDefault(),r?.focus()):!e.shiftKey&&document.activeElement===r&&(e.preventDefault(),n?.focus())},t[17]=_,t[18]=D);let O;t[19]!==c||t[20]!==_?(O=c(_),t[19]=c,t[20]=_,t[21]=O):O=t[21];let k;return t[22]!==i||t[23]!==O||t[24]!==E||t[25]!==D||t[26]!==r?(k=(0,Ee.createPortal)((0,Y.jsx)(`div`,{ref:l,role:`dialog`,"aria-modal":`true`,"aria-label":r,"data-media-preview":i,"data-page-scroll-lock":`true`,tabIndex:-1,className:`fixed inset-0 z-[80] overflow-hidden select-none`,style:E,onClick:Ae,onKeyDown:D,children:O}),document.body),t[22]=i,t[23]=O,t[24]=E,t[25]=D,t[26]=r,t[27]=k):k=t[27],k}function Ae(e){e.stopPropagation()}function je(e){let n=(0,q.c)(56),{video:r,onClose:i,isMobile:a}=e,{t:o}=d(),c=A()??``,l=b(),f,m;n[0]!==c||n[1]!==r.url?(f=x(r.url,c),m=y(f)?f.path:``,n[0]=c,n[1]=r.url,n[2]=f,n[3]=m):(f=n[2],m=n[3]);let h=m,_=/^\/api(?=\/|[?#]|$)/.test(r.url)?r.url:``,v=!!(h||_),S;n[4]!==c||n[5]!==l||n[6]!==r.url?(S=[`video-preview`,l,c,r.url],n[4]=c,n[5]=l,n[6]=r.url,n[7]=S):S=n[7];let C;n[8]!==h||n[9]!==_?(C=async e=>{let{signal:n}=e,r=await t(_||`/api/fs/raw`,{query:h?{path:h}:void 0,signal:n});if(!r.ok)throw Error(`Video request failed (${r.status})`);return r.blob()},n[8]=h,n[9]=_,n[10]=C):C=n[10];let w;n[11]!==v||n[12]!==S||n[13]!==C?(w={queryKey:S,enabled:v,gcTime:0,staleTime:1/0,retry:!1,queryFn:C},n[11]=v,n[12]=S,n[13]=C,n[14]=w):w=n[14];let T=s(w),[E,D]=J.useState(null),O,k;n[15]===T.data?(O=n[16],k=n[17]):(O=()=>{if(!T.data)return;let e=URL.createObjectURL(T.data);return D({blob:T.data,url:e}),()=>URL.revokeObjectURL(e)},k=[T.data],n[15]=T.data,n[16]=O,n[17]=k),J.useEffect(O,k);let N=v?E?.blob===T.data?E?.url:``:f.source,[P,F]=J.useState(),I=T.isError||!!(N&&P===N),L;n[18]===Symbol.for(`react.memo_cache_sentinel`)?(L=j(),n[18]=L):L=n[18];let R=L,ee;n[19]===Symbol.for(`react.memo_cache_sentinel`)?(ee=()=>()=>R.reset(),n[19]=ee):ee=n[19];let z;n[20]===r.url?z=n[21]:(z=[R,r.url],n[20]=r.url,n[21]=z),J.useEffect(ee,z);let B;n[22]!==c||n[23]!==T.data||n[24]!==N||n[25]!==r.filename||n[26]!==r.mimeType||n[27]!==r.url?(B=()=>{M({kind:`video`,sourceUrl:r.url,displayUrl:N,filename:r.filename,mimeType:r.mimeType,effectiveDirectory:c,prefetchedBlob:T.data})},n[22]=c,n[23]=T.data,n[24]=N,n[25]=r.filename,n[26]=r.mimeType,n[27]=r.url,n[28]=B):B=n[28];let V=u(B),H;n[29]!==a||n[30]!==i?(H=(0,Y.jsx)(Oe,{onClose:i,isMobile:a}),n[29]=a,n[30]=i,n[31]=H):H=n[31];let U;n[32]!==I||n[33]!==N||n[34]!==o?(U=!N&&!I&&(0,Y.jsx)(`p`,{role:`status`,children:o(`common.loading`)}),n[32]=I,n[33]=N,n[34]=o,n[35]=U):U=n[35];let W;n[36]!==I||n[37]!==o?(W=I&&(0,Y.jsx)(`p`,{role:`alert`,children:o(`filesView.error.readFileFailed`)}),n[36]=I,n[37]=o,n[38]=W):W=n[38];let G;n[39]!==V||n[40]!==N||n[41]!==r.filename||n[42]!==r.url?(G=N&&(0,Y.jsx)(`video`,{src:N,controls:!0,playsInline:!0,preload:`metadata`,"aria-label":r.filename,className:`max-h-[80dvh] w-full max-w-5xl object-contain`,onError:()=>F(N),onContextMenu:e=>{e.preventDefault(),R.openFromContextMenu(r.url,V)},onPointerDown:e=>{if(!e.isPrimary){R.reset();return}e.button===0&&R.start({pointerId:e.pointerId,key:r.url,clientX:e.clientX,clientY:e.clientY,onTrigger:V})},onPointerMove:e=>R.move(e.pointerId,e.clientX,e.clientY),onPointerUp:e=>R.end(e.pointerId),onPointerCancel:e=>R.cancel(e.pointerId),onPointerLeave:e=>R.cancel(e.pointerId),onClickCapture:e=>{R.consumeClick(r.url)&&(e.preventDefault(),e.stopPropagation())}},N),n[39]=V,n[40]=N,n[41]=r.filename,n[42]=r.url,n[43]=G):G=n[43];let te;n[44]===Symbol.for(`react.memo_cache_sentinel`)?(te=(0,Y.jsx)(g,{name:`download`,className:`size-4`}),n[44]=te):te=n[44];let K;n[45]===o?K=n[46]:(K=o(`filesView.editor.saveFile`),n[45]=o,n[46]=K);let X;n[47]!==V||n[48]!==K?(X=(0,Y.jsxs)(p,{variant:`secondary`,size:`sm`,onClick:V,children:[te,K]}),n[47]=V,n[48]=K,n[49]=X):X=n[49];let Z;return n[50]!==H||n[51]!==U||n[52]!==W||n[53]!==G||n[54]!==X?(Z=(0,Y.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 p-4`,children:[H,U,W,G,X]}),n[50]=H,n[51]=U,n[52]=W,n[53]=G,n[54]=X,n[55]=Z):Z=n[55],Z}var Me=500,Ne=400,Pe=(e,t)=>new oe(e,t),Fe=e=>{let t=`h-3.5 w-3.5 flex-shrink-0`,n=e.toLowerCase();return n===`reasoning`?(0,Y.jsx)(g,{name:`brain-ai-3`,className:t}):n===`image-preview`?(0,Y.jsx)(g,{name:`file-image`,className:t}):n===`mermaid-preview`?(0,Y.jsx)(g,{name:`file-list-2`,className:t}):n===`edit`||n===`multiedit`||n===`apply_patch`||n===`str_replace`||n===`str_replace_based_edit_tool`?(0,Y.jsx)(g,{name:`pencil-ai`,className:t}):n===`write`||n===`create`||n===`file_write`||n===`read`||n===`view`||n===`file_read`||n===`cat`?(0,Y.jsx)(g,{name:`file-pdf`,className:t}):n===`bash`||n===`shell`||n===`cmd`||n===`terminal`?(0,Y.jsx)(g,{name:`terminal-box`,className:t}):n===`list`||n===`ls`||n===`dir`||n===`list_files`?(0,Y.jsx)(g,{name:`folder-6`,className:t}):n===`search`||n===`grep`||n===`find`||n===`ripgrep`?(0,Y.jsx)(g,{name:`search`,className:t}):n===`glob`?(0,Y.jsx)(g,{name:`file-search`,className:t}):n===`fetch`||n===`curl`||n===`wget`||n===`webfetch`?(0,Y.jsx)(g,{name:`global`,className:t}):n===`web-search`||n===`websearch`||n===`search_web`||n===`google`||n===`bing`||n===`duckduckgo`?(0,Y.jsx)(g,{name:`search`,className:t}):n===`todowrite`||n===`todoread`?(0,Y.jsx)(g,{name:`list-check-3`,className:t}):n.startsWith(`git`)?(0,Y.jsx)(g,{name:`git-branch`,className:t}):(0,Y.jsx)(g,{name:`tools`,className:t})},Ie={style:{background:`transparent`,backgroundColor:`transparent`,fontSize:`inherit`}},Le={download:!1,copy:!1,showPanZoomControls:!0},Re=`
3
- [data-diff-header],
4
- [data-diff] {
5
- [data-separator] {
6
- height: 24px !important;
7
- }
8
- }
9
- `,ze={hunkLineCount:50,lineHeight:24,diffHeaderHeight:44,hunkSeparatorHeight:24,spacing:0},Be=()=>{let e=(0,q.c)(22),t=h(),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=C(!1),e[0]=n):n=e[0];let r=n,i;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(i=C(!0),e[1]=i):i=e[1];let a=i,o;e[2]===t?.availableThemes?o=e[3]:(o=()=>t?.availableThemes??[r,a],e[2]=t?.availableThemes,e[3]=o),t?.availableThemes;let s;e[4]===o?s=e[5]:(s=o(),e[4]=o,e[5]=s);let c=s,l=t?.lightThemeId??r.metadata.id,u=t?.darkThemeId??a.metadata.id,d;e[6]!==c||e[7]!==l?(d=c.find(e=>e.metadata.id===l)??r,e[6]=c,e[7]=l,e[8]=d):d=e[8];let f=d,p;e[9]!==c||e[10]!==u?(p=c.find(e=>e.metadata.id===u)??a,e[9]=c,e[10]=u,e[11]=p):p=e[11];let m=p,g,_;e[12]!==m||e[13]!==f?(g=()=>{E(f),E(m)},_=[m,f],e[12]=m,e[13]=f,e[14]=g,e[15]=_):(g=e[14],_=e[15]),J.useEffect(g,_);let v=t?.currentTheme.metadata.variant??`light`,y;e[16]!==m.metadata.id||e[17]!==f.metadata.id?(y={light:f.metadata.id,dark:m.metadata.id},e[16]=m.metadata.id,e[17]=f.metadata.id,e[18]=y):y=e[18];let b=v===`dark`?`dark`:`light`,x;return e[19]!==y||e[20]!==b?(x={theme:y,themeType:b},e[19]=y,e[20]=b,e[21]=x):x=e[21],x},Ve=()=>({width:typeof window<`u`?window.innerWidth:0,height:typeof window<`u`?window.innerHeight:0}),He=e=>{let t=(0,q.c)(3),[n,r]=J.useState(Ve),i,a;return t[0]===e?(i=t[1],a=t[2]):(i=()=>{if(!e||typeof window>`u`)return;let t=()=>{r(Ve())};return t(),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`resize`,t)}},a=[e],t[0]=e,t[1]=i,t[2]=a),J.useEffect(i,a),n},Ue=({popup:e,onOpenChange:t,isMobile:n})=>{let{t:r}=d(),i=h(),a=A()??``,o=J.useMemo(()=>{let t=e.image;if(!t)return[];let n=Array.isArray(t.gallery)?t.gallery.filter(e=>!!e?.url):[];return n.length>0?n:[{url:t.url,mimeType:t.mimeType,filename:t.filename,size:t.size}]},[e.image]),[s,c]=J.useState(()=>{let t=e.image?.index??o.findIndex(t=>t.url===e.image?.url);return t>=0&&t<o.length?t:0}),l=e.previewSource instanceof HTMLImageElement?e.previewSource:void 0,m=l?.naturalWidth&&l.naturalHeight?{width:l.naturalWidth,height:l.naturalHeight}:null,[_,v]=J.useState(m),[y,b]=J.useState(!!m),x=e.open,C=He(e.open),w=J.useRef(null),T=J.useRef(null),E=J.useRef(null),D=J.useRef(null),O=J.useRef({scale:1,x:0,y:0}),k=J.useRef({image:{width:1,height:1},viewport:{width:1,height:1},maxScale:5}),j=J.useRef(new Map),N=J.useRef(null),F=J.useRef(null),I=J.useRef(null),L=J.useRef(null),R=J.useRef(0);J.useEffect(()=>{e.open&&(R.current=typeof performance<`u`?performance.now():Date.now())},[e.open]);let ee=u(()=>(typeof performance<`u`?performance.now():Date.now())-R.current<Ne),z=u(()=>{let e=N.current;e?.longPressTimer&&(clearTimeout(e.longPressTimer),e.longPressTimer=null)});J.useEffect(()=>{if(!e.open||o.length===0)return;let t=typeof e.image?.index==`number`?e.image.index:-1;if(t>=0&&t<o.length){c(t);return}let n=e.image?.url?o.findIndex(t=>t.url===e.image?.url):-1;c(n>=0?n:0)},[o,e.image?.index,e.image?.url,e.open]);let B=o[s]??o[0]??e.image,V=S(B?.url??``,a,`preview`),H=V.source||(B?.url===e.image?.url?l?.currentSrc:``)||``,U=`${V.key}\n${H}`,[W,G]=J.useState(``),te=!!(V.error||W===U),K=u(()=>G(U)),q=B?.filename||e.title,X=o.length>1,Z=u(()=>{let t=B?.url??e.image?.url??``;if(!t&&!H)return;let n=B?.mimeType||e.image?.mimeType,r=B?.filename||e.image?.filename||e.title;M({sourceUrl:t||H,displayUrl:H||void 0,filename:r,mimeType:n,effectiveDirectory:a})}),ne=u(()=>{o.length<=1||c(e=>(e-1+o.length)%o.length)}),re=u(()=>{o.length<=1||c(e=>(e+1)%o.length)}),Q=J.useMemo(()=>{let e={width:Math.max(1,C.width*(n?1:.8)),height:Math.max(1,C.height*(n?1:.95))};return _?_e(_,e):e},[_,n,C.height,C.width]),ie=J.useMemo(()=>({image:Q,viewport:{width:Math.max(1,C.width),height:Math.max(1,C.height)},maxScale:5}),[Q,C.height,C.width]),ae=u((e,t=!1)=>{let n=ve(e,k.current);O.current=n,L.current={transform:n,animate:t},!(I.current!==null||typeof window>`u`)&&(I.current=window.requestAnimationFrame(()=>{I.current=null;let e=L.current;L.current=null,e&&(E.current&&(E.current.style.transition=e.animate?`transform 180ms cubic-bezier(0.22, 1, 0.36, 1)`:`none`,E.current.style.transform=`translate3d(${e.transform.x}px, ${e.transform.y}px, 0) scale(${e.transform.scale})`),D.current&&(D.current.textContent=`${Math.round(e.transform.scale*100)}%`),w.current&&(w.current.style.cursor=e.transform.scale>1?`grab`:`zoom-in`))}))}),oe=u((e=!0)=>{ae({scale:1,x:0,y:0},e)}),se=u(()=>({x:k.current.viewport.width/2,y:k.current.viewport.height/2})),ce=u((e,t,n=!1)=>{ae(ye(O.current,e,t,se(),k.current),n)}),le=u(e=>{if(O.current.scale>1.01){oe(!0);return}ce(2,e,!0)}),ue=u(e=>{if(!(n||e.defaultPrevented)){if(e.key===`+`||e.key===`=`){e.preventDefault(),ce(O.current.scale*1.4,se(),!0);return}if(e.key===`-`||e.key===`_`){e.preventDefault(),ce(O.current.scale/1.4,se(),!0);return}if(e.key===`0`){e.preventDefault(),oe(!0);return}if(e.key===`ArrowLeft`&&X){e.preventDefault(),ne();return}e.key===`ArrowRight`&&X&&(e.preventDefault(),re())}});J.useEffect(()=>{if(e.open)return window.addEventListener(`keydown`,ue),()=>{window.removeEventListener(`keydown`,ue)}},[e.open]),J.useEffect(()=>{I.current!==null&&window.cancelAnimationFrame(I.current),I.current=null,L.current=null;let t=B?.url===e.image?.url?l:void 0;v(t?.naturalWidth&&t.naturalHeight?{width:t.naturalWidth,height:t.naturalHeight}:null),b(!!t?.naturalWidth),O.current={scale:1,x:0,y:0},j.current.clear(),N.current?.longPressTimer&&clearTimeout(N.current.longPressTimer),N.current=null,F.current=null,E.current&&(E.current.style.transform=`translate3d(0, 0, 0) scale(1)`),D.current&&(D.current.textContent=`100%`)},[B?.url,H,e.image?.url,l]),J.useLayoutEffect(()=>{k.current=ie;let e=ve(O.current,k.current);O.current=e,E.current&&(E.current.style.transition=`none`,E.current.style.transform=`translate3d(${e.x}px, ${e.y}px, 0) scale(${e.scale})`)},[ie]),J.useEffect(()=>()=>{I.current!==null&&window.cancelAnimationFrame(I.current),I.current=null,L.current=null;let e=N.current;e?.longPressTimer&&(clearTimeout(e.longPressTimer),e.longPressTimer=null)},[]);let de=u(e=>{if(n)return;e.preventDefault();let t={x:e.clientX,y:e.clientY},r=Math.exp(-e.deltaY*.002);ce(O.current.scale*r,t)});J.useEffect(()=>{let e=w.current;if(!(!x||n||!e))return e.addEventListener(`wheel`,de,{passive:!1}),()=>e.removeEventListener(`wheel`,de)},[n,x]);let fe=u(e=>{n||(e.preventDefault(),le({x:e.clientX,y:e.clientY}))}),pe=u(e=>{e.preventDefault(),e.stopPropagation()}),me=u(e=>{e.pointerType!==`mouse`&&e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId);let t={x:e.clientX,y:e.clientY};if(j.current.set(e.pointerId,{point:t,pointerType:e.pointerType}),j.current.size===1){if(N.current={pointerId:e.pointerId,pointerType:e.pointerType,start:t,transform:O.current,moved:!1,targetWasCanvas:e.target===e.currentTarget,suppressTap:!1,longPressTimer:null,longPressTriggered:!1},e.pointerType!==`mouse`||O.current.scale<=1.01){let t=N.current;t.longPressTimer=setTimeout(()=>{!N.current||N.current.pointerId!==e.pointerId||N.current.moved||(N.current.longPressTriggered=!0,N.current.suppressTap=!0,Z())},Me)}w.current&&O.current.scale>1&&(w.current.style.cursor=`grabbing`);return}z(),N.current&&(N.current.suppressTap=!0,N.current.longPressTriggered=!1);let n=Array.from(j.current.values()).slice(0,2).map(e=>e.point),r=n[1].x-n[0].x,i=n[1].y-n[0].y;F.current={distance:Math.max(1,Math.hypot(r,i)),midpoint:{x:(n[0].x+n[1].x)/2,y:(n[0].y+n[1].y)/2},transform:O.current},N.current&&(N.current.suppressTap=!0)}),he=u(e=>{if(!j.current.has(e.pointerId))return;e.preventDefault();let t={x:e.clientX,y:e.clientY};if(j.current.set(e.pointerId,{point:t,pointerType:e.pointerType}),j.current.size>=2&&F.current){z();let e=Array.from(j.current.values()).slice(0,2).map(e=>e.point),t=e[1].x-e[0].x,n=e[1].y-e[0].y,r={x:(e[0].x+e[1].x)/2,y:(e[0].y+e[1].y)/2},i=F.current.transform.scale*Math.hypot(t,n)/F.current.distance;ae(xe(F.current.transform,F.current.midpoint,r,i,se(),k.current));return}let n=N.current;if(!n||n.pointerId!==e.pointerId)return;let r={x:t.x-n.start.x,y:t.y-n.start.y};Math.hypot(r.x,r.y)>10&&(n.moved=!0,z()),n.transform.scale>1.01&&ae(be(n.transform,r,k.current))}),Se=u((e,r)=>{let i=N.current,a=j.current.get(e.pointerId)?{x:e.clientX,y:e.clientY}:void 0;if(j.current.delete(e.pointerId),i?.pointerId===e.pointerId&&(z(),a&&!i.longPressTriggered)){let e=ge({isMobile:n,pointerType:i.pointerType,cancelled:r,moved:i.moved||Math.hypot(a.x-i.start.x,a.y-i.start.y)>10,suppressTap:i.suppressTap,targetWasCanvas:i.targetWasCanvas,start:i.start,end:a,startScale:i.transform.scale,hasMultipleImages:X});if(e===`next`&&re(),e===`previous`&&ne(),e===`close`){if(ee())return;if(n&&i.pointerType!==`mouse`){Te(a,()=>t(!1));return}t(!1)}}if(j.current.size===1){let[e,t]=Array.from(j.current.entries())[0];N.current={pointerId:e,pointerType:t.pointerType,start:t.point,transform:O.current,moved:!1,targetWasCanvas:!1,suppressTap:!0,longPressTimer:null,longPressTriggered:!1},F.current=null}else j.current.size===0&&(N.current=null,F.current=null,w.current&&(w.current.style.cursor=O.current.scale>1?`grab`:`zoom-in`));e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId)}),Ce=u(e=>{if(e.preventDefault(),e.stopPropagation(),z(),N.current){if(N.current.longPressTriggered)return;N.current.suppressTap=!0,N.current.longPressTriggered=!0}Z()}),we=u(e=>{let t=e.currentTarget;t.naturalWidth>0&&t.naturalHeight>0&&v(e=>e?.width===t.naturalWidth&&e.height===t.naturalHeight?e:{width:t.naturalWidth,height:t.naturalHeight}),b(!0)});if(!x||!B||typeof document>`u`)return null;let Ee=i?.currentTheme.metadata.variant===`dark`,De=Ee?`border-foreground/15 bg-foreground/10 text-foreground`:`border-background/15 bg-background/10 text-background`,$=Ee?`text-foreground hover:bg-foreground/15 hover:text-foreground`:`text-background hover:bg-background/15 hover:text-background`;return(0,Y.jsxs)(`div`,{ref:T,className:`absolute inset-0 overflow-hidden select-none`,tabIndex:-1,onClick:pe,children:[(0,Y.jsx)(Oe,{onClose:()=>t(!1),isMobile:n,size:Q}),(0,Y.jsxs)(`div`,{ref:w,className:`absolute inset-0 flex items-center justify-center overflow-hidden touch-none [overscroll-behavior:none]`,onDoubleClick:n?void 0:fe,onContextMenu:Ce,onPointerDown:me,onPointerMove:he,onPointerUp:e=>Se(e,!1),onPointerCancel:e=>Se(e,!0),onLostPointerCapture:e=>Se(e,!0),children:[!y&&!te&&(0,Y.jsx)(`div`,{className:`pointer-events-none absolute inset-0 flex items-center justify-center`,role:`status`,children:(0,Y.jsx)(P,{className:`aspect-square w-64 max-w-[80vw] rounded-xl`})}),te?(0,Y.jsx)(`p`,{role:`status`,className:`px-6 text-center typography-ui-label`,children:r(`filesView.error.readFileFailed`)}):(0,Y.jsx)(`img`,{ref:E,"data-preview-transition-target":``,"data-preview-return":B?.url===e.image?.url,src:H||void 0,alt:q??``,className:f(`block max-w-none object-contain will-change-transform`,y?`opacity-100`:`opacity-0`),style:{width:`${Q.width}px`,height:`${Q.height}px`},loading:`lazy`,draggable:!1,onLoad:we,onError:K})]}),(0,Y.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 z-10 flex justify-center px-2 pb-2`,children:(0,Y.jsxs)(`div`,{className:f(`pointer-events-auto flex h-10 items-center gap-0.5 rounded-full border px-1 shadow-lg backdrop-blur-xl`,De),onPointerDown:e=>e.stopPropagation(),onDoubleClick:e=>e.stopPropagation(),children:[X&&(0,Y.jsx)(p,{variant:`ghost`,size:`icon`,className:f(`size-8 rounded-full`,$),onClick:ne,"aria-label":r(`chat.toolOutputDialog.image.previousAria`),title:r(`chat.toolOutputDialog.image.previousAria`),children:(0,Y.jsx)(g,{name:`arrow-left-s`,className:`size-5`})}),X&&(0,Y.jsxs)(`span`,{className:`min-w-10 px-1 text-center typography-micro tabular-nums opacity-80`,children:[s+1,` / `,o.length]}),X&&(0,Y.jsx)(p,{variant:`ghost`,size:`icon`,className:f(`size-8 rounded-full`,$),onClick:re,"aria-label":r(`chat.toolOutputDialog.image.nextAria`),title:r(`chat.toolOutputDialog.image.nextAria`),children:(0,Y.jsx)(g,{name:`arrow-right-s`,className:`size-5`})}),X&&(0,Y.jsx)(`span`,{className:`mx-0.5 h-4 w-px bg-current opacity-15`,"aria-hidden":`true`}),(0,Y.jsx)(p,{variant:`ghost`,size:`icon`,className:f(`size-8 rounded-full`,$),onClick:()=>ce(O.current.scale/1.4,se(),!0),"aria-label":r(`chat.toolOutputDialog.image.zoomOutAria`),title:r(`chat.toolOutputDialog.image.zoomOutAria`),children:(0,Y.jsx)(g,{name:`subtract`,className:`size-4`})}),(0,Y.jsxs)(p,{variant:`ghost`,size:`sm`,className:f(`h-8 min-w-14 rounded-full px-2 tabular-nums`,$),onClick:()=>oe(!0),"aria-label":r(`chat.toolOutputDialog.image.resetZoomAria`),title:r(`chat.toolOutputDialog.image.resetZoomAria`),children:[(0,Y.jsx)(g,{name:`restart`,className:`size-3.5`}),(0,Y.jsx)(`span`,{ref:D,children:`100%`})]}),(0,Y.jsx)(p,{variant:`ghost`,size:`icon`,className:f(`size-8 rounded-full`,$),onClick:()=>ce(O.current.scale*1.4,se(),!0),"aria-label":r(`chat.toolOutputDialog.image.zoomInAria`),title:r(`chat.toolOutputDialog.image.zoomInAria`),children:(0,Y.jsx)(g,{name:`add`,className:`size-4`})}),(0,Y.jsx)(p,{variant:`ghost`,size:`icon`,className:f(`size-8 rounded-full`,$),onClick:Z,"aria-label":r(`chat.image.actions.saveImage`),children:(0,Y.jsx)(g,{name:`download`,className:`size-4`})})]})})]})},We=J.memo(e=>{let t=(0,q.c)(7),{popup:n,diffViewMode:r,pierreThemeConfig:i}=e,a=n.content||``,o=r===`unified`?`unified`:`split`,s;t[0]!==i.theme||t[1]!==i.themeType||t[2]!==o?(s={diffStyle:o,diffIndicators:`none`,hunkSeparators:`line-info-basic`,lineDiffType:`none`,disableFileHeader:!0,maxLineDiffLength:1e3,expansionLineCount:20,overflow:`wrap`,theme:i.theme,themeType:i.themeType,unsafeCSS:Re},t[0]=i.theme,t[1]=i.themeType,t[2]=o,t[3]=s):s=t[3];let c;return t[4]!==a||t[5]!==s?(c=(0,Y.jsx)(`div`,{className:`typography-code`,children:(0,Y.jsx)(l,{patch:a,metrics:ze,options:s,className:`block w-full`})}),t[4]=a,t[5]=s,t[6]=c):c=t[6],c});We.displayName=`DialogUnifiedDiff`;var Ge=J.memo(e=>{let t=(0,q.c)(29),{popup:n,pierreThemeConfig:r}=e,i;t[0]===n.content?i=t[1]:(i=z(n.content),t[0]=n.content,t[1]=i);let a=i,o=n.metadata?.input,s;t[2]===o?s=t[3]:(s=typeof o==`object`&&o?o:{},t[2]=o,t[3]=s);let l=s,u=typeof l.offset==`number`?l.offset:0,d=typeof l.file_path==`string`?l.file_path:typeof l.filePath==`string`?l.filePath:typeof l.path==`string`?l.path:`read-output`,f;t[4]===a.lines?f=t[5]:(f=a.lines.map(Je).join(`
10
- `),t[4]=a.lines,t[5]=f);let p=f,m;t[6]!==d||t[7]!==n.language?(m=n.language||k(d)||`text`,t[6]=d,t[7]=n.language,t[8]=m):m=t[8];let h=m,g;t[9]===a.lines?g=t[10]:(g=a.lines.some(Ye),t[9]=a.lines,t[10]=g);let _=g,v;if(t[11]!==_||t[12]!==u||t[13]!==a.lines||t[14]!==a.type){v=[];let e=u;for(let t of a.lines){t.lineNumber!==null&&(e=t.lineNumber);let n=a.type===`file`&&!_&&t.lineNumber===null&&!t.isInfo,r=t.lineNumber??(n?e+1:null);typeof r==`number`&&(e=r),v.push({text:t.text,lineNumber:r,isInfo:t.isInfo})}t[11]=_,t[12]=u,t[13]=a.lines,t[14]=a.type,t[15]=v}else v=t[15];let y=v;if(a.type===`file`){let e=h||void 0,n;t[16]!==p||t[17]!==d||t[18]!==e?(n={name:d,contents:p,lang:e},t[16]=p,t[17]=d,t[18]=e,t[19]=n):n=t[19];let i;t[20]!==r.theme||t[21]!==r.themeType?(i={disableFileHeader:!0,overflow:`wrap`,theme:r.theme,themeType:r.themeType},t[20]=r.theme,t[21]=r.themeType,t[22]=i):i=t[22];let a;return t[23]!==n||t[24]!==i?(a=(0,Y.jsx)(c,{file:n,options:i,className:`block w-full`}),t[23]=n,t[24]=i,t[25]=a):a=t[25],a}let b;return t[26]!==y||t[27]!==h?(b=(0,Y.jsx)(ne,{lines:y,language:h,maxHeight:`70vh`}),t[26]=y,t[27]=h,t[28]=b):b=t[28],b});Ge.displayName=`DialogReadContent`;var Ke=({popup:e,onOpenChange:n,isMobile:r})=>{let{t:i}=d(),a=h(),o=J.useMemo(()=>a?.currentTheme.metadata.variant===`dark`?a.currentTheme:a?.availableThemes.find(e=>e.metadata.id===a.darkThemeId&&e.metadata.variant===`dark`)??C(!0),[a?.currentTheme,a?.availableThemes,a?.darkThemeId]),[s,c]=J.useState(e.mermaid?.source||``),[l,u]=J.useState(e.mermaid?.source?`ready`:`idle`),[f,p]=J.useState(``),m=J.useRef(0),_=J.useCallback(e=>{let t=e.trim();if(!t.toLowerCase().startsWith(`file://`))return null;let n=e=>{if(!e||/[\0\r\n]/.test(e))return!1;let t=e.replace(/\\/g,`/`);return t.split(`/`).filter(Boolean).includes(`..`)?!1:t.startsWith(`/`)?!0:/^[A-Za-z]:\//.test(t)},r=e=>e.replace(/%([0-9A-Fa-f]{2})/g,(e,t)=>{let n=Number.parseInt(t,16);return Number.isFinite(n)?String.fromCharCode(n):`%${t}`});if(typeof URL.canParse==`function`&&URL.canParse(t)){let e=r(new URL(t).pathname||``);return/^\/[A-Za-z]:\//.test(e)&&(e=e.slice(1)),n(e)?e:null}let i=t.replace(/^file:\/\//i,``),a=r(i);return n(a)?a:n(i)?i:null},[]),v=J.useCallback(async()=>{let n=e.mermaid,r=le(m.current);if(m.current=r,!n?.url){u(`error`),p(i(`chat.toolOutputDialog.mermaid.missingSource`));return}if(n.source){c(n.source),u(`ready`),p(``);return}u(`loading`),p(``);let a;if(n.url.startsWith(`data:`))a=fe(n.url);else if(n.url.toLowerCase().startsWith(`file://`)){let e=_(n.url);a=e?t(`/api/fs/raw`,{query:{path:e}}).then(e=>e.ok?e.text():Promise.reject(Pe(`chat.toolOutputDialog.mermaid.readFileFailedWithStatus`,{status:e.status}))):Promise.reject(Pe(`chat.toolOutputDialog.mermaid.invalidLocalPath`))}else{let e=typeof URL.canParse==`function`&&URL.canParse(n.url,window.location.origin)?new URL(n.url,window.location.origin):null;a=!e||e.protocol!==`http:`&&e.protocol!==`https:`?Promise.reject(Pe(`chat.toolOutputDialog.mermaid.unsupportedUrlProtocol`)):fetch(e.toString()).then(e=>e.ok?e.text():Promise.reject(Pe(`chat.toolOutputDialog.mermaid.loadFailedWithStatus`,{status:e.status})))}await a.then(e=>{ue(m.current,r)&&(c(e),u(`ready`))}).catch(e=>{ue(m.current,r)&&(u(`error`),p(ce(e)?i(e.key,e.params):i(`chat.toolOutputDialog.mermaid.loadFailed`)))})},[_,e.mermaid,i]);J.useEffect(()=>{!e.open||!e.mermaid||v()},[v,e.mermaid,e.open]);let y=`\`\`\`mermaid\n${s}\n\`\`\``;return!e.open||typeof document>`u`?null:(0,Y.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center`,onClick:e=>{e.target===e.currentTarget&&n(!1)},children:(0,Y.jsxs)(`div`,{"data-mermaid-preview":`true`,"data-preview-transition-target":``,className:`relative flex min-h-0 flex-col overflow-hidden`,style:{width:r?`100%`:`80%`,height:r?`100%`:`95%`},onMouseDown:e=>e.stopPropagation(),children:[(0,Y.jsx)(Oe,{onClose:()=>n(!1),isMobile:r}),(0,Y.jsx)(`div`,{className:`relative min-h-0 flex-1 overflow-hidden`,children:(0,Y.jsxs)(`div`,{className:`h-full overflow-hidden`,children:[l===`loading`&&(0,Y.jsxs)(`div`,{className:`h-full min-h-28 flex items-center justify-center gap-2 text-muted-foreground typography-meta`,children:[(0,Y.jsx)(g,{name:`loader-4`,className:`h-4 w-4 animate-spin`}),(0,Y.jsx)(`span`,{children:i(`chat.toolOutputDialog.mermaid.loading`)})]}),l===`error`&&(0,Y.jsxs)(`div`,{className:`rounded-xl border p-3 space-y-3`,style:{backgroundColor:`var(--status-error-background)`,borderColor:`var(--status-error-border)`},children:[(0,Y.jsx)(`p`,{className:`typography-markdown`,style:{color:`var(--status-error)`},children:f||i(`chat.toolOutputDialog.mermaid.renderFailed`)}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>{v()},className:`px-3 py-1.5 rounded-lg typography-meta border transition-colors hover:bg-[var(--interactive-hover)]`,style:{borderColor:`var(--interactive-border)`,color:`var(--surface-foreground)`},children:i(`chat.toolOutputDialog.mermaid.retry`)})]}),l===`ready`&&(0,Y.jsx)(`div`,{className:`h-full`,children:(0,Y.jsx)(D,{content:y,variant:`tool`,allowMermaidWheelEvents:!0,className:`markdown-mermaid-fullscreen h-full`,mermaidControls:Le,mermaidTheme:o,enableFileReferences:!1})})]})})]})})},qe=e=>{let t=(0,q.c)(52),{popup:n,onOpenChange:r,isMobile:i}=e,{t:o}=d(),[s,l]=J.useState(`unified`),u=Be(),p;t[0]===n.open?p=t[1]:(p=()=>{n.open&&l(`unified`)},t[0]=n.open,t[1]=p);let m;t[2]!==n.open||t[3]!==n.title?(m=[n.open,n.title],t[2]=n.open,t[3]=n.title,t[4]=m):m=t[4],J.useEffect(p,m);let h=n.video??(n.image&&O(n.image.url,n.image.mimeType)?n.image:void 0);if(n.image||n.mermaid||h){let e=h?`video`:n.image?`image`:`mermaid`,a;t[5]!==i||t[6]!==n||t[7]!==h?(a=e=>(0,Y.jsxs)(Y.Fragment,{children:[h?(0,Y.jsx)(je,{video:h,onClose:e,isMobile:i}):n.image?(0,Y.jsx)(Ue,{popup:n,onOpenChange:e,isMobile:i}):(0,Y.jsx)(Ke,{popup:n,onOpenChange:e,isMobile:i}),(0,Y.jsx)(F,{abovePreview:!0})]}),t[5]=i,t[6]=n,t[7]=h,t[8]=a):a=t[8];let o;return t[9]!==i||t[10]!==r||t[11]!==n.open||t[12]!==n.previewSource||t[13]!==n.title||t[14]!==e||t[15]!==a?(o=(0,Y.jsx)(ke,{open:n.open,title:n.title,kind:e,source:n.previewSource,isMobile:i,onOpenChange:r,children:a}),t[9]=i,t[10]=r,t[11]=n.open,t[12]=n.previewSource,t[13]=n.title,t[14]=e,t[15]=a,t[16]=o):o=t[16],o}let y=n.open,b=i?`w-[95vw] max-w-[95vw]`:`max-w-5xl`,x=i?`[&>button]:right-1`:`[&>button]:top-2.5 [&>button]:right-4`,S;t[17]!==b||t[18]!==x?(S=f(`overflow-hidden flex flex-col min-h-0 pt-3 pb-4 px-4 gap-1`,`[&>button]:top-1.5`,b,x),t[17]=b,t[18]=x,t[19]=S):S=t[19];let C;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(C={maxHeight:`90vh`},t[20]=C):C=t[20];let w;t[21]===n.metadata?w=t[22]:(w=n.metadata?.tool?Fe(n.metadata.tool):(0,Y.jsx)(g,{name:`tools`,className:`h-3.5 w-3.5 text-foreground flex-shrink-0`}),t[21]=n.metadata,t[22]=w);let T;t[23]===n.title?T=t[24]:(T=(0,Y.jsx)(`span`,{className:`break-words flex-1 leading-tight`,children:n.title}),t[23]=n.title,t[24]=T);let E;t[25]!==s||t[26]!==n.isDiff?(E=n.isDiff&&(0,Y.jsx)(V,{mode:s,onModeChange:l,className:`mr-8 flex-shrink-0`}),t[25]=s,t[26]=n.isDiff,t[27]=E):E=t[27];let A;t[28]!==E||t[29]!==w||t[30]!==T?(A=(0,Y.jsx)(`div`,{className:`flex-shrink-0 pb-1`,children:(0,Y.jsxs)(`div`,{className:`flex items-start gap-2 text-foreground typography-ui-header font-semibold`,children:[w,T,E]})}),t[28]=E,t[29]=w,t[30]=T,t[31]=A):A=t[31];let j;t[32]!==u||t[33]!==n.metadata?(j=n.metadata?.input&&typeof n.metadata.input==`object`&&Object.keys(n.metadata.input).length>0&&n.metadata?.tool!==`todowrite`&&n.metadata?.tool!==`todoread`&&n.metadata?.tool!==`apply_patch`?(()=>{let e=n.metadata,t=e.input,r=e=>{let n=t[e];return typeof n==`string`?n:typeof n==`number`?String(n):null};return(0,Y.jsxs)(`div`,{className:`border-b border-border/20 p-4 -mx-3`,children:[(0,Y.jsx)(`div`,{className:`typography-markdown font-medium text-muted-foreground mb-2 px-3`,children:e.tool===`bash`||e.tool===`shell`?`Command:`:e.tool===`task`||e.tool===`subagent`?`Task Details:`:`Input:`}),(e.tool===`bash`||e.tool===`shell`)&&r(`command`)?(0,Y.jsx)(`div`,{className:`tool-input-surface bg-transparent rounded-xl border border-border/20 mx-3`,children:(0,Y.jsx)(R,{language:`bash`,code:r(`command`),style:a.getPopupStyles(),codeStyle:Ie.style,wrap:!0})}):(e.tool===`task`||e.tool===`subagent`)&&r(`prompt`)?(0,Y.jsxs)(`div`,{className:`tool-input-surface bg-transparent rounded-xl border border-border/20 font-mono whitespace-pre-wrap text-foreground/90 mx-3`,style:a.getPopupStyles(),children:[r(`description`)?`Task: ${r(`description`)}\n`:``,r(`subagent_type`)||r(`agent`)?`Agent Type: ${r(`subagent_type`)||r(`agent`)}\n`:``,`Instructions:\n${r(`prompt`)}`]}):e.tool===`write`&&r(`content`)?(0,Y.jsx)(`div`,{className:`tool-input-surface bg-transparent rounded-xl border border-border/20 mx-3`,children:(0,Y.jsx)(c,{file:{name:r(`filePath`)||r(`file_path`)||`new-file`,contents:r(`content`),lang:k(r(`filePath`)||r(`file_path`)||``)||void 0},options:{disableFileHeader:!0,overflow:`wrap`,theme:u.theme,themeType:u.themeType},className:`block w-full`})}):(0,Y.jsx)(`div`,{className:`tool-input-surface bg-transparent rounded-xl border border-border/20 font-mono whitespace-pre-wrap text-foreground/90 mx-3`,style:a.getPopupStyles(),children:W(t,e.tool)})]})})():null,t[32]=u,t[33]=n.metadata,t[34]=j):j=t[34];let M;t[35]!==s||t[36]!==i||t[37]!==u||t[38]!==n||t[39]!==o?(M=n.isDiff?(0,Y.jsx)(We,{popup:n,diffViewMode:s,pierreThemeConfig:u}):n.content?(0,Y.jsx)(`div`,{className:`p-4`,children:(()=>{let e=n.metadata?.tool;return e===`todowrite`||e===`todoread`?H(n.content)||(0,Y.jsx)(R,{language:`json`,code:n.content,style:a.getPopupContainerStyles(),codeStyle:Ie.style,wrap:!0}):e===`list`?L(n.content)||(0,Y.jsx)(`pre`,{className:`typography-markdown bg-muted/30 p-2 rounded-xl border border-border/20 font-mono whitespace-pre-wrap`,children:n.content}):e===`grep`?I(n.content,i)||(0,Y.jsx)(`pre`,{className:`typography-code bg-muted/30 p-2 rounded-xl border border-border/20 font-mono whitespace-pre-wrap`,children:n.content}):e===`glob`?te(n.content,i)||(0,Y.jsx)(`pre`,{className:`typography-code bg-muted/30 p-2 rounded-xl border border-border/20 font-mono whitespace-pre-wrap`,children:n.content}):e===`task`||e===`subagent`||e===`reasoning`?(0,Y.jsx)(`div`,{className:e===`reasoning`?`text-muted-foreground/70`:``,children:(0,Y.jsx)(D,{content:n.content,variant:`tool`})}):e===`web-search`||e===`websearch`||e===`search_web`?B(n.content)||(0,Y.jsx)(R,{language:`text`,code:n.content,style:a.getPopupContainerStyles(),codeStyle:Ie.style,wrap:!0}):e===`read`?(0,Y.jsx)(Ge,{popup:n,pierreThemeConfig:u}):(n.content?ee(n.content):{data:null,isJson:!1}).isJson?(0,Y.jsx)(ae,{jsonString:n.content,initiallyExpandedDepth:3,maxHeight:`70vh`}):(0,Y.jsx)(R,{language:n.language||`text`,code:n.content,style:a.getPopupContainerStyles(),codeStyle:Ie.style,wrap:!0})})()}):(0,Y.jsxs)(`div`,{className:`p-8 text-muted-foreground typography-ui-header`,children:[(0,Y.jsx)(`div`,{className:`mb-2`,children:o(`chat.toolOutputDialog.commandCompleted`)}),(0,Y.jsx)(`div`,{className:`typography-meta`,children:o(`chat.toolOutputDialog.noOutputProduced`)})]}),t[35]=s,t[36]=i,t[37]=u,t[38]=n,t[39]=o,t[40]=M):M=t[40];let N;t[41]!==j||t[42]!==M?(N=(0,Y.jsx)(`div`,{className:`flex-1 min-h-0 rounded-xl border border-border/30 bg-muted/10 overflow-hidden`,children:(0,Y.jsxs)(`div`,{className:`tool-output-surface h-full max-h-[75vh] overflow-y-auto px-3 pr-4`,children:[j,M]})}),t[41]=j,t[42]=M,t[43]=N):N=t[43];let P;t[44]!==A||t[45]!==N||t[46]!==S?(P=(0,Y.jsxs)(_,{className:S,style:C,children:[A,N]}),t[44]=A,t[45]=N,t[46]=S,t[47]=P):P=t[47];let z;return t[48]!==r||t[49]!==n.open||t[50]!==P?(z=(0,Y.jsx)(v,{open:y,onOpenChange:r,children:P}),t[48]=r,t[49]=n.open,t[50]=P,t[51]=z):z=t[51],z};function Je(e){return e.text}function Ye(e){return e.lineNumber!==null}export{qe as default};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-aparajita-capacitor-secure-storage-xol_6BsB.js","assets/rolldown-runtime-hePW80VL.js"])))=>i.map(i=>d[i]);
2
- import{c as e,i as t}from"./runtime-switch-CMiMO5Yj.js";import{n}from"./runtime-fetch-WgH0pROs.js";import{o as r}from"./vendor-aparajita-capacitor-secure-storage-xol_6BsB.js";var i=`__openchamberNativeRelayAssetBridge`,a=e=>typeof e==`function`,o=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return a(t.openAsset)&&a(t.writeChunk)&&a(t.endAsset)&&a(t.abortAsset)&&a(t.releaseAsset)},s=()=>{let e=globalThis[i];return o(e)?e:null},c=e=>{if(typeof Buffer<`u`)return Buffer.from(e).toString(`base64`);let t=``,n=32768;for(let r=0;r<e.byteLength;r+=n){let i=Math.min(r+n,e.byteLength),a=``;for(let t=r;t<i;t++)a+=String.fromCharCode(e[t]);t+=a}return btoa(t)},l=e=>({openAsset:async({mimeType:t})=>{let n=await e.create({mimeType:t});if(!n?.assetId||!n?.url)throw Error(`Desktop virtualAsset.create returned an incomplete result`);return{assetId:n.assetId,url:n.url}},writeChunk:async(t,n)=>{let r=n.byteOffset===0&&n.byteLength===n.buffer.byteLength?n:n.slice();await e.push(t,r)},endAsset:async t=>{await e.finish(t)},abortAsset:async t=>{try{await e.cancel(t)}catch{}},releaseAsset:async t=>{try{await e.cancel(t)}catch{}}}),u=e=>({openAsset:async({assetId:t,mimeType:n})=>{let r=await e.create({assetId:t,mime:n});if(!r?.url)throw Error(`Capacitor virtual asset create returned no url`);return{assetId:r.assetId||t,url:r.url}},writeChunk:async(t,n)=>{await e.append({assetId:t,chunk:c(n)})},endAsset:async t=>{await e.finish({assetId:t})},abortAsset:async t=>{try{await e.cancel({assetId:t})}catch{}},releaseAsset:async t=>{try{await e.cancel({assetId:t})}catch{}}}),d=()=>{if(typeof window>`u`)return null;let e=window.__OPENCHAMBER_DESKTOP__?.virtualAsset;return!e||!a(e.create)||!a(e.push)||!a(e.finish)||!a(e.cancel)?null:e},f=null,p=async()=>{if(typeof window>`u`)return null;let e=window.Capacitor;if(!e||typeof e.isNativePlatform!=`function`||!e.isNativePlatform())return null;let t=e.Plugins?.OpenChamberVirtualAsset;if(t&&typeof t==`object`&&a(t.create)&&a(t.append)&&a(t.finish)&&a(t.cancel))return t;try{let{registerPlugin:e}=await r(async()=>{let{registerPlugin:e}=await import(`./vendor-aparajita-capacitor-secure-storage-xol_6BsB.js`).then(e=>e.i);return{registerPlugin:e}},__vite__mapDeps([0,1])),t=e(`OpenChamberVirtualAsset`);if(a(t.create)&&a(t.append)&&a(t.finish)&&a(t.cancel))return t}catch{}return null},m=async()=>{let e=s();if(e)return e;let t=d();if(t)return l(t);f??=p();let n=await f;return n?u(n):null},h=()=>{if(typeof window>`u`)return null;let e=window.__OPENCHAMBER_DESKTOP__?.imageCache;return e&&a(e.acquire)&&a(e.append)&&a(e.commit)&&a(e.release)?e:null},g=3e5,_=33554432,v=524288,y=new Map,b=new Map,x=new Set,S=0,C=null,w=0,T=()=>x.size+S,E=()=>(w+=1,`ria_${(typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`${Date.now().toString(36)}${Math.random().toString(36).slice(2,12)}`).replace(/-/g,``).slice(0,24)}_${(w%1e6).toString(36)}`),D=e=>{e.ttlTimer!==null&&(clearTimeout(e.ttlTimer),e.ttlTimer=null)},O=e=>{D(e),y.delete(e.url),b.delete(e.assetId),x.delete(e.assetId)},k=async e=>{try{await e()}catch{}},A=async(e,t={})=>{if(e.released)return;if(e.released=!0,O(e),e.kind===`blob`){try{URL.revokeObjectURL(e.url)}catch{}return}let n=e.bridge;n&&(t.abort&&await k(()=>n.abortAsset(e.assetId,t.reason)),await k(()=>n.releaseAsset(e.assetId)))},j=e=>{D(e),!(e.retainCount>0)&&(e.ttlTimer=setTimeout(()=>{A(e,{abort:!0,reason:`ttl-expired`})},g))},M=e=>{if(!e)return!1;let t=y.get(e);return!!(t&&!t.released)},N=e=>{let t=y.get(e);return!t||t.released?!1:(t.retainCount+=1,D(t),!0)},P=e=>{let t=y.get(e);!t||t.released||(t.retainCount=Math.max(0,t.retainCount-1),t.retainCount===0&&j(t))},F=async e=>{for(;T()>=6;){if(e.aborted)throw e.reason instanceof Error?e.reason:Error(`aborted`);await new Promise((t,n)=>{let r=()=>{clearTimeout(i),n(e.reason instanceof Error?e.reason:Error(`aborted`))},i=setTimeout(()=>{e.removeEventListener(`abort`,r),t()},25);e.addEventListener(`abort`,r,{once:!0})})}},I=async e=>{for(;;)if(await F(e),T()<6){S+=1;return}},L=()=>{S=Math.max(0,S-1)},R=e=>{let t=e.headers.get(`content-type`)?.split(`;`)[0]?.trim().toLowerCase();return t&&t.startsWith(`image/`)?t:`image/png`},z=async(e,t,n,r)=>{if(await I(n),n.aborted)throw L(),n.reason instanceof Error?n.reason:Error(`aborted`);let i=t.body;if(!i||typeof i.getReader!=`function`)throw L(),Error(`Image response body is not readable`);let a=E(),o=R(t),s;try{s=await e.openAsset({assetId:a,mimeType:o})}catch(e){throw L(),e}if(!s?.url||typeof s.url!=`string`||!s.assetId)throw L(),await k(()=>e.abortAsset(a,`invalid-open`)),Error(`Native asset bridge returned an incomplete open result`);x.add(s.assetId),L();let c={assetId:s.assetId,url:s.url,kind:`native`,transportIdentity:r,ttlTimer:null,retainCount:0,released:!1,byteLength:0,bridge:e};return y.set(s.url,c),b.set(s.assetId,c),j(c),B(e,i,c,n,r),s.url},B=(e,n,r,i,a)=>{let o=n.getReader(),s=()=>{o.cancel().catch(()=>void 0),A(r,{abort:!0,reason:`aborted`})};return i.addEventListener(`abort`,s,{once:!0}),(async()=>{let n=[],c=0,l=e=>{if(e<=0)return new Uint8Array;if(n.length===1&&n[0].byteLength===e)return c=0,n.pop();let t=new Uint8Array(e),r=0;for(;r<e&&n.length>0;){let i=n[0],a=e-r;i.byteLength<=a?(t.set(i,r),r+=i.byteLength,n.shift()):(t.set(i.subarray(0,a),r),n[0]=i.subarray(a),r+=a)}return c-=r,t},u=()=>{n.length=0,c=0},d=()=>{if(i.aborted||r.released)throw i.reason instanceof Error?i.reason:Error(`aborted`);if(t()!==a)throw Error(`Runtime transport changed during image stream`)},f=async t=>{for(;c>0&&(t||c>=524288);){d();let t=l(Math.min(c,v));await e.writeChunk(r.assetId,t)}};try{for(;;){d();let{done:e,value:t}=await o.read();if(e)break;if(!(!t||t.byteLength===0)){if(r.byteLength+=t.byteLength,r.byteLength>33554432)throw Error(`Image exceeds maximum size of ${_} bytes`);n.push(t),c+=t.byteLength,c>=524288&&await f(!1)}}d(),await f(!0),d(),await e.endAsset(r.assetId),x.delete(r.assetId)}catch(e){u(),await A(r,{abort:!0,reason:e instanceof Error?e.message:`stream-failed`})}finally{i.removeEventListener(`abort`,s)}})().catch(()=>{})},V=async(e,n,r)=>{let i=await e.blob();if(n.aborted)throw n.reason instanceof Error?n.reason:Error(`aborted`);if(i.size>33554432)throw Error(`Image exceeds maximum size of ${_} bytes`);if(t()!==r)throw Error(`Runtime transport changed during image load`);let a=URL.createObjectURL(i),o={assetId:E(),url:a,kind:`blob`,transportIdentity:r,ttlTimer:null,retainCount:0,released:!1,byteLength:i.size,bridge:null};return y.set(a,o),b.set(o.assetId,o),j(o),a},H=async(e,n,r={})=>{if(Y(),n.aborted)throw n.reason instanceof Error?n.reason:Error(`aborted`);if(!(e instanceof Blob))throw Error(`Verified display requires a Blob`);if(e.size>33554432)throw Error(`Image exceeds maximum size of ${_} bytes`);let i=t(),a=U(e,r.mimeType),o=await m();return o?G(o,e,a,n,i):W(e,n,i)},U=(e,t)=>{let n=(t||e.type||``).split(`;`)[0]?.trim().toLowerCase();return n&&n.startsWith(`image/`)?n:n||`image/png`},W=async(e,n,r)=>{if(n.aborted)throw n.reason instanceof Error?n.reason:Error(`aborted`);if(t()!==r)throw Error(`Runtime transport changed during image load`);let i=URL.createObjectURL(e),a={assetId:E(),url:i,kind:`blob`,transportIdentity:r,ttlTimer:null,retainCount:0,released:!1,byteLength:e.size,bridge:null};return y.set(i,a),b.set(a.assetId,a),j(a),i},G=async(e,n,r,i,a)=>{if(await I(i),i.aborted)throw L(),i.reason instanceof Error?i.reason:Error(`aborted`);if(t()!==a)throw L(),Error(`Runtime transport changed during image load`);let o=E(),s;try{s=await e.openAsset({assetId:o,mimeType:r})}catch(e){throw L(),e}if(!s?.url||typeof s.url!=`string`||!s.assetId)throw L(),await k(()=>e.abortAsset(o,`invalid-open`)),Error(`Native asset bridge returned an incomplete open result`);x.add(s.assetId),L();let c={assetId:s.assetId,url:s.url,kind:`native`,transportIdentity:a,ttlTimer:null,retainCount:0,released:!1,byteLength:n.size,bridge:e};y.set(s.url,c),b.set(s.assetId,c),j(c);try{if(i.aborted)throw i.reason instanceof Error?i.reason:Error(`aborted`);if(t()!==a)throw Error(`Runtime transport changed during image load`);let r=new Uint8Array(await n.arrayBuffer());if(i.aborted)throw i.reason instanceof Error?i.reason:Error(`aborted`);let o=0;for(;o<r.byteLength;){if(i.aborted||c.released)throw i.reason instanceof Error?i.reason:Error(`aborted`);if(t()!==a)throw Error(`Runtime transport changed during image load`);let n=Math.min(o+v,r.byteLength);await e.writeChunk(s.assetId,r.subarray(o,n)),o=n}return await e.endAsset(s.assetId),x.delete(s.assetId),s.url}catch(e){throw await A(c,{abort:!0,reason:e instanceof Error?e.message:`verified-blob-failed`}),e}},K=async(e,r)=>{Y();let i=t(),a=await n(`/api/fs/raw`,{method:`GET`,cache:`no-store`,query:{path:e},signal:r});if(!a.ok)throw Error(`Image source request failed with status ${a.status}`);let o=await m();return o?z(o,a,r,i):V(a,r,i)},q=e=>{if(!e)return;let t=y.get(e);if(t){A(t,{abort:!0,reason:`released`});return}if(e.startsWith(`blob:`))try{URL.revokeObjectURL(e)}catch{}},J=(e=`cleared`)=>{let t=Array.from(y.values());for(let n of t)A(n,{abort:!0,reason:e});x.clear(),S=0},Y=()=>{C||typeof window>`u`||(C=e(()=>{J(`transport-changed`)}))};export{N as a,h as c,q as i,M as n,K as o,P as r,H as s,_ as t};
@@ -1,7 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./runtime-fetch-WgH0pROs.js";import{Mn as n,ln as r}from"./persistence-BKszKaoQ.js";import{it as i,rt as a}from"./vendor-base-ui-CdzJ6My_.js";import{n as o}from"./platform-CgwxwfA4.js";import{v as s}from"./useUIStore-CEqU9Ujv.js";import{n as c}from"./vendor-react-BP2cRVqX.js";import{a as l,n as u}from"./vendor-aparajita-capacitor-secure-storage-xol_6BsB.js";import{n as d}from"./vendor-reactuses-core-BpfIZ1tg.js";import{f,r as p,t as m}from"./button-CWSs9Baz.js";import{Rr as h}from"./useMobileNavigationStore-BnxWwj5z.js";import{n as g}from"./useThemeSystem-8jhE4Zyk.js";import{n as _}from"./Icon-BCFeHDWx.js";import{i as v,n as y,t as b}from"./tooltip-CV6dvLBp.js";import{a as x,i as S,o as C,t as w}from"./image-loading-Bj11k4gM.js";import{t as T}from"./MobileResizableSheet-Bs4gAbDr.js";import{i as E}from"./appThemeRegistry-C8bq_-cg.js";import{n as D}from"./MarkdownRenderer-CFVvfuhR.js";import{n as ee,o as te,s as ne,t as re}from"./markdown-worker-DFNZ3KJ_.js";import{n as ie,r as ae}from"./markdownTheme-Y4nBAXal.js";import{t as oe}from"./vendor-tanstack-react-virtual-B_EO--9t.js";var O=e(i(),1),k=c(),A=a(),se=`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)`},ce=`flex items-center justify-between gap-3 border-b border-[var(--surface-subtle)] px-3 py-2.5`,le=`text-xs font-medium leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,ue=`text-xs tabular-nums leading-4 text-muted-foreground md:text-[0.8125rem] md:leading-5`,M=`m-0 list-none divide-y divide-[var(--surface-subtle)] p-0`,N=`${M} max-h-[min(22rem,50vh)] overflow-y-auto`,de=`${M} w-full`,fe={className:`p-0 rounded-none`,maxHeightClass:`max-h-[46vh]`,disableHorizontal:!0},P=`px-2.5 py-1.5 text-xs leading-4 md:py-2 md:text-[0.8125rem] md:leading-5`,pe=`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`,F=`min-w-0 truncate text-xs leading-4 text-foreground md:text-[0.8125rem] md:leading-5`,I=`inline-flex shrink-0 items-center gap-1 text-xs leading-4 tabular-nums text-muted-foreground md:text-[0.8125rem] md:leading-5`,L=`h-3 w-3 shrink-0 md:h-3.5 md:w-3.5`,R={in_progress:`text-foreground`,pending:`text-foreground`,completed:`text-muted-foreground line-through`,cancelled:`text-muted-foreground line-through`},z={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`},B=e=>{let t=(0,k.c)(26),{todo:n,isActive:r,activeRef:i}=e,{t:a}=f(),o=me.has(n.status)?n.status:`pending`,s=z[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)(_,{name:`record-circle`,className:`h-3.5 w-3.5 text-[var(--status-info)]`,"aria-hidden":`true`}):o===`completed`?(0,A.jsx)(_,{name:`checkbox-circle`,className:`h-3.5 w-3.5 text-[var(--status-success)]`,"aria-hidden":`true`}):(0,A.jsx)(_,{name:`time`,className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),t[3]=o,t[4]=u);let d=u,m=r?`step`:void 0,h=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)]`,g;t[5]===h?g=t[6]:(g=p(`group relative grid min-w-0 grid-cols-[1rem_minmax(0,1fr)] items-start gap-2.5`,P,h),t[5]=h,t[6]=g);let x;t[7]!==d||t[8]!==l?(x=(0,A.jsx)(v,{asChild:!0,children:(0,A.jsx)(`span`,{className:`flex size-4 items-center justify-center`,"aria-label":l,children:d})}),t[7]=d,t[8]=l,t[9]=x):x=t[9];let S;t[10]===l?S=t[11]:(S=(0,A.jsx)(y,{side:`left`,sideOffset:6,children:l}),t[10]=l,t[11]=S);let C;t[12]!==x||t[13]!==S?(C=(0,A.jsxs)(b,{children:[x,S]}),t[12]=x,t[13]=S,t[14]=C):C=t[14];let w=R[o],T;t[15]===w?T=t[16]:(T=p(`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]!==m||t[23]!==g||t[24]!==C?(D=(0,A.jsxs)(`li`,{ref:i,"aria-current":m,className:g,children:[C,E]}),t[20]=i,t[21]=E,t[22]=m,t[23]=g,t[24]=C,t[25]=D):D=t[25],D},me=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),V=`image/png`,H=l(`OpenChamberMedia`),U=e=>{let t=e.toLowerCase().split(`;`)[0]?.trim()||V;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`;if(t===`video/quicktime`)return`mov`;let n=t.split(`/`)[1];return n&&/^[a-z0-9.+-]+$/i.test(n)?n:`png`},he=(e,t)=>{let n=`${t.startsWith(`video/`)?`video`:`image`}.${U(t)}`,r=(((e||``).trim()||n).split(/[\\/]/).pop()||n).replace(/[^\w.\- ()[\]]+/g,`_`).replace(/^\.+/,``);return r?/\.[a-z0-9]{1,8}$/i.test(r)?r:`${r}.${U(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)}),ge=async e=>{let t=await W(e),n=t.indexOf(`,`);return n>=0?t.slice(n+1):t},_e=(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,n)=>{let r=await(/^\/api(?=\/|[?#]|$)/.test(e)?t(e,{signal:n,cache:`no-store`}):fetch(e,{signal:n,cache:`no-store`}));if(!r.ok)throw Error(`Image fetch failed (${r.status})`);return r.blob()},ve=async(e,t)=>{let n=``;try{return n=await w(e,t??new AbortController().signal),await G(n,t)}finally{n&&x(n)}},ye=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 o=C(a,r);if(S(o))if(e.kind===`video`){let e=await t(`/api/fs/raw`,{query:{path:o.path},signal:n});if(!e.ok)throw Error(`Media request failed (${e.status})`);i=await e.blob()}else try{i=await ve(o.path,n)}catch{let e=await t(`/api/fs/raw`,{method:`GET`,cache:`no-store`,query:{path:o.path},signal:n});if(!e.ok)throw Error(`Image source request failed with status ${e.status}`);i=await e.blob()}else i=await G(o.source,n)}}if(!i||i.size<=0)throw Error(`Image is empty`);let o=(e.mimeType||(i.type&&/^(image|video)\//.test(i.type)?i.type:``)||(e.kind===`video`?`video/mp4`:``)||V).split(`;`)[0].trim()||V;return{blob:i,filename:he(e.filename,o),mimeType:o}},be=()=>!o()||u===void 0?!1:u.isPluginAvailable(`OpenChamberMedia`),xe=async(e,t)=>{let{blob:i,filename:a,mimeType:o}=await ye(e,t);if(be()){let t=await ge(i);if(e.kind===`video`){if((await H.saveFile({dataBase64:t,mimeType:o,filename:a}))?.cancelled)throw new DOMException(`Save cancelled`,`AbortError`);return`saved`}return await H.saveImage({dataBase64:t,mimeType:o,filename:a}),`saved`}if(r()){if(e.kind===`video`){let t=C(e.sourceUrl,e.effectiveDirectory??``),r=n()?.files;if(S(t)&&r?.downloadFile)return await r.downloadFile(t.path),`saved`;throw Error(`Video download is unavailable for this source in VS Code`)}let t=n()?.vscode;if(t?.saveImage){let e=await W(i);return await t.saveImage({fileName:a,dataUrl:e}),`saved`}}return _e(i,a),`downloaded`};function Se({abovePreview:e=!1}){let{t}=f(),[n,r]=O.useState(null),[i,a]=O.useState(!1),s=O.useRef(null),c=!!n;O.useEffect(()=>ae(e=>{r(e),a(!1)}),[]);let l=d(e=>{e||(r(null),a(!1))});E({id:`image-save-actions`,active:c,layer:`overlay`,onBack:()=>(l(!1),!0),surfaceRef:s});let u=d(async()=>{if(!(!n||i)){a(!0);try{await xe(n),h.success(t(n.kind===`video`?`filesView.editor.saved`:`chat.image.actions.saveSuccess`)),r(null)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){a(!1);return}h.error(t(n.kind===`video`?`filesView.toast.saveFailed`:`chat.image.actions.saveFailed`)),a(!1);return}a(!1)}});if(!n)return null;let p=n.filename?.trim()||t(`chat.image.actions.sheetTitle`),g=n.kind===`video`?t(`filesView.editor.saveFile`):o()?t(`chat.image.actions.saveToPhotos`):t(`chat.image.actions.saveImage`);return(0,A.jsx)(`div`,{ref:s,children:(0,A.jsx)(T,{id:`image-save-actions-sheet`,className:e?`z-[90]`:void 0,open:c,onOpenChange:l,title:(0,A.jsx)(`h2`,{className:`truncate typography-ui-label font-semibold`,children:p}),ariaLabel:p,closeAriaLabel:t(`mobile.surface.closeAria`),resizeAriaLabel:t(`mobile.sessions.sheet.resizeAria`),fitContent:!0,children:(0,A.jsx)(`div`,{className:`flex min-h-0 flex-col overflow-y-auto overscroll-contain px-3 pb-3`,children:(0,A.jsx)(`div`,{className:`overflow-hidden rounded-2xl bg-[var(--surface-muted)]`,"data-page-scroll-lock":`true`,children:(0,A.jsxs)(m,{type:`button`,variant:`ghost`,size:`lg`,className:`h-auto min-h-12 w-full justify-start gap-3 rounded-none supports-[corner-shape:squircle]:rounded-none px-4 border-b border-[var(--surface-subtle)] last:border-b-0`,"data-mobile-press-feedback":`none`,disabled:i,onClick:()=>{u()},children:[(0,A.jsx)(_,{name:i?`loader-4`:`download`,className:i?`size-5 animate-spin`:`size-5`}),(0,A.jsx)(`span`,{className:`truncate`,children:i?t(`chat.image.actions.saving`):g})]})})})})})}var Ce=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`),we=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=we(n);e&&i.setAttribute(`style`,`${i.getAttribute(`style`)??``}${e}`)}},Te=e=>`<pre><code>${Ce(e)}</code></pre>`,Ee=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}=g(),u=O.useRef(null),d;t[0]===l?d=t[1]:(d=ie(l),t[0]=l,t[1]=d);let f=d,m,h;t[2]!==n||t[3]!==o||t[4]!==c?(m=()=>{let e=u.current;e&&(e.innerHTML=Te(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 _,v;t[7]!==n||t[8]!==o||t[9]!==r||t[10]!==c?(_=()=>{let e=u.current;if(!e)return;let t=!0,i=new AbortController;return re(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()}},v=[n,r,c,o],t[7]=n,t[8]=o,t[9]=r,t[10]=c,t[11]=_,t[12]=v):(_=t[11],v=t[12]),O.useEffect(_,v);let y;t[13]===i?y=t[14]:(y=p(`typography-code`,i),t[13]=i,t[14]=y);let b=f,x;t[15]!==a||t[16]!==b?(x={...b,...a},t[15]=a,t[16]=b,t[17]=x):x=t[17];let S;return t[18]!==y||t[19]!==x?(S=(0,A.jsx)(`div`,{ref:u,className:y,style:x}),t[18]=y,t[19]=x,t[20]=S):S=t[20],S},De=e=>{let t=e.replace(/^<file>\s*\n?/,``).replace(/\n?<\/file>\s*$/,``);return t=t.replace(/^\s*\d{5}\|\s?/gm,``),t.trim()},Oe=(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}},ke=e=>e?e.includes(`<diagnostics`)||e.includes(`<file_diagnostics>`)||e.includes(`LSP errors detected`)||e.includes(`This file has errors`):!1,Ae=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():``,q=(e,t)=>!e||typeof e!=`object`?String(e):ne(e,t||``),J=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}}},je=e=>{if(!e||typeof e!=`object`)return;let t=J(e.patch)??J(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=J(e.patch)??J(e.diff);if(t)return t}},Me=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}}},Ne=(e,t,n)=>{let r=De(e);if((t===`edit`||t===`multiedit`||t===`write`||t===`apply_patch`)&&ke(r)&&(r=Ae(r)),(t===`edit`||t===`multiedit`||t===`apply_patch`)&&r.trim().length===0){let e=je(n);if(e)return e}return r},Pe=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
- `).split(`
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)})}},Fe=(e,t)=>{try{let n=e.trim().split(`
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:p(`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}},Ie={backgroundColor:`var(--status-info)`,opacity:.6},Le=(e,t,n)=>{try{let r=e.trim().split(`
5
- `).filter(Boolean);if(r.length===0)return null;let i={};return r.forEach(e=>{let t=e.match(/^(.+?):(\d+):(.*)$/)||e.match(/^(.+?):(.*)$/);if(t){let[,e,n,r]=t,a=r===void 0?``:n,o=r===void 0?n:r;i[e]||(i[e]=[]),i[e].push({lineNum:a,content:o})}}),(0,A.jsxs)(`div`,{className:p(`space-y-2 w-full min-w-0`,n?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/30`),style:s.tool.popup,children:[(0,A.jsxs)(`div`,{className:`typography-meta text-muted-foreground mb-2`,children:[`Found `,r.length,` match`,r.length===1?``:`es`]}),Object.entries(i).map(([e,n])=>(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsx)(`div`,{className:p(`font-medium text-muted-foreground`,t?`typography-micro`:`typography-code`),children:e}),(0,A.jsx)(`div`,{className:`pl-4 space-y-1`,children:n.map((e,n)=>!e.lineNum&&!e.content?null:(0,A.jsxs)(`div`,{className:p(`flex items-start gap-2 min-w-0`,t?`typography-micro`:`typography-code`),children:[(0,A.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full flex-shrink-0 mt-1.5`,style:Ie}),(0,A.jsxs)(`div`,{className:`flex gap-2 min-w-0 flex-1`,children:[e.lineNum&&(0,A.jsxs)(`span`,{className:`text-muted-foreground font-mono whitespace-nowrap`,children:[`Line `,e.lineNum,`:`]}),(0,A.jsx)(`span`,{className:`text-foreground font-mono break-words flex-1`,children:e.content||`\xA0`})]})]},n))})]},e))]})}catch{return null}},Re={backgroundColor:`var(--status-info)`,opacity:.6},ze=(e,t,n)=>{try{let r=e.trim().split(`
6
- `).filter(Boolean);if(r.length===0)return null;let i={};r.forEach(e=>{let t=e.lastIndexOf(`/`),n=t>0?e.substring(0,t):`/`,r=t>=0?e.substring(t+1):e;i[n]||(i[n]=[]),i[n].push(r)});let a=Object.keys(i).sort();return(0,A.jsxs)(`div`,{className:p(`space-y-2 w-full min-w-0`,n?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/30`),style:s.tool.popup,children:[(0,A.jsxs)(`div`,{className:`typography-meta text-muted-foreground mb-2`,children:[`Found `,r.length,` file`,r.length===1?``:`s`]}),a.map(e=>(0,A.jsxs)(`div`,{className:`space-y-1`,children:[(0,A.jsxs)(`div`,{className:p(`font-medium text-muted-foreground`,t?`typography-micro`:`typography-code`),children:[e,`/`]}),(0,A.jsx)(`div`,{className:p(`pl-4 grid gap-1`,t?`grid-cols-1`:`grid-cols-2`),children:i[e].sort().map(e=>(0,A.jsxs)(`div`,{className:p(`flex items-center gap-2 min-w-0`,t?`typography-micro`:`typography-code`),children:[(0,A.jsx)(`div`,{className:`w-1.5 h-1.5 rounded-full flex-shrink-0`,style:Re}),(0,A.jsx)(`span`,{className:`text-foreground font-mono truncate`,children:e})]},e))})]},e))]})}catch{return null}},Be=new Set([`in_progress`,`pending`,`completed`,`cancelled`]),Ve=(e,t,n)=>{try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let r=t.filter(e=>!!e&&typeof e==`object`&&typeof e.content==`string`&&typeof e.status==`string`&&Be.has(e.status));if(r.length===0)return null;let i=r.find(e=>e.status===`in_progress`)??null;return(0,A.jsx)(`ul`,{className:n?.listClassName??N,children:r.map((e,t)=>(0,A.jsx)(B,{todo:e,isActive:e===i},e.id??`todo-${t}`))})}catch{return null}},He=(e,t)=>{try{return(0,A.jsx)(`div`,{className:p(`typography-code max-w-none w-full min-w-0`,t?.unstyled?null:`p-3 bg-muted/20 rounded-xl border border-border/20`),style:s.tool.popup,children:(0,A.jsx)(D,{content:e,variant:`tool`})})}catch{return null}},Ue=e=>{let t=e.split(`
7
- `),n=``,r=[],i=0;for(;i<t.length;){let e=t[i];if(e.startsWith(`Index:`)||e.startsWith(`===`)||e.startsWith(`---`)||e.startsWith(`+++`)){e.startsWith(`Index:`)&&(n=e.split(` `)[1].split(`/`).pop()||`file`),i++;continue}if(e.startsWith(`@@`)){let a=e.match(/@@ -(\d+),\d+ \+(\d+),\d+ @@/),o=a?parseInt(a[1]):0,s=a?parseInt(a[2]):0,c=[],l=o,u=s,d=i+1;for(;d<t.length&&!t[d].startsWith(`@@`)&&!t[d].startsWith(`Index:`);){let e=t[d];e.startsWith(`+`)?(c.push({type:`added`,lineNumber:u,content:e.substring(1)}),u++):e.startsWith(`-`)?(c.push({type:`removed`,lineNumber:l,content:e.substring(1)}),l++):e.startsWith(` `)&&(c.push({type:`context`,lineNumber:u,content:e.substring(1)}),l++,u++),d++}r.push({file:n,oldStart:o,newStart:s,lines:c}),i=d;continue}i++}return r},We=(e,t,n)=>te(t,e,n),Ge={maxDepth:50,maxNodes:1e5,initiallyExpandedDepth:2};function Ke(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e==`object`?`object`:typeof e==`string`?`string`:typeof e==`number`?`number`:typeof e==`boolean`?`boolean`:`null`}function qe(e){if(e.length===0)return`root`;let t=`root`;for(let n of e)/^\d+$/.test(n)?t+=`[${n}]`:t+=`.${n}`;return t}var Y=0;function X(e,t,n,r,i){if(Y>=i.maxNodes)return null;Y++;let a=Ke(e),o=qe(n),s=a===`object`||a===`array`,c={id:o,key:t,value:e,type:a,depth:r,path:n,isExpandable:s};if(s&&r<i.maxDepth){let t=a===`array`?e.map((e,t)=>[String(t),e]):Object.entries(e);c.childCount=t.length,c.children=[];for(let[e,a]of t){let t=X(a,e,[...n,e],r+1,i);t&&c.children.push(t)}}else s&&(c.childCount=a===`array`?e.length:Object.keys(e).length);return c}function Je(e,t){let n={...Ge,...t};Y=0;try{let t=e.trim();return t?X(JSON.parse(t),`root`,[],0,n):null}catch{return null}}function Ye(e,t){if(!e)return[];let n=[];function r(e){let i=!t.has(e.id);if(n.push({node:e,isExpanded:i}),e.isExpandable&&i&&e.children)for(let t of e.children)r(t)}return r(e),n}function Xe(e){if(!e)return[];let t=[];function n(e){if(e.isExpandable&&(t.push(e.id),e.children))for(let t of e.children)n(t)}return n(e),t}function Ze(e,t){if(!e)return[];let n=[];function r(e){if(e.isExpandable&&e.depth>=t&&n.push(e.id),e.children)for(let t of e.children)r(t)}return r(e),n}var Z=[`var(--syntax-key)`,`color-mix(in oklch, var(--syntax-key) 85%, var(--syntax-string))`,`color-mix(in oklch, var(--syntax-key) 70%, var(--syntax-number))`,`color-mix(in oklch, var(--syntax-key) 55%, var(--syntax-function))`,`color-mix(in oklch, var(--syntax-key) 40%, var(--syntax-type))`,`color-mix(in oklch, var(--syntax-key) 30%, var(--syntax-keyword))`];function Qe(e){return Z[e%Z.length]}function $e(e){switch(e.type){case`string`:return`var(--syntax-string)`;case`number`:return`var(--syntax-number)`;case`boolean`:return`var(--syntax-keyword)`;case`null`:return`var(--syntax-comment)`;default:return`var(--surface-foreground)`}}function Q(e){switch(e.type){case`string`:{let t=e.value;return t.length>60?`"${t.slice(0,57)}..."`:`"${t}"`}case`number`:case`boolean`:return String(e.value);case`null`:return`null`;case`object`:return`{${e.childCount??0} ${e.childCount===1?`item`:`items`}}`;case`array`:return`[${e.childCount??0}]`;default:return String(e.value)}}function et(e){if(e.type===`object`){let t=e.children?.map(e=>e.key).slice(0,3)??[],n=(e.childCount??0)>3?`, ...`:``;return`{ ${t.map(e=>`"${e}": ...`).join(`, `)}${n} }`}if(e.type===`array`){let t=e.childCount??0;return t<=3?`[${e.children?.map(e=>Q(e)).join(`, `)??``}]`:`[${t} items]`}return Q(e)}var $=O.memo(e=>{let t=(0,k.c)(29),{flatNode:n,onToggle:r,onCopyPath:i}=e,{node:a,isExpanded:o}=n,s=a.depth*20,c;t[0]!==a.id||t[1]!==r?(c=()=>{r(a.id)},t[0]=a.id,t[1]=r,t[2]=c):c=t[2];let l=c,u;t[3]!==a.id||t[4]!==i?(u=e=>{i&&(e.preventDefault(),i(a.id))},t[3]=a.id,t[4]=i,t[5]=u):u=t[5];let d=u,f;t[6]===a.depth?f=t[7]:(f=Qe(a.depth),t[6]=a.depth,t[7]=f);let p=f,m;t[8]===a?m=t[9]:(m=$e(a),t[8]=a,t[9]=m);let h=m,g=a.isExpandable&&a.children&&a.children.length>0,v=`${s+8}px`,y;t[10]===v?y=t[11]:(y={paddingLeft:v},t[10]=v,t[11]=y);let b;t[12]!==l||t[13]!==g||t[14]!==o?(b=g?(0,A.jsx)(`button`,{type:`button`,onClick:l,className:`mr-1 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm hover:bg-[var(--interactive-hover)] text-muted-foreground`,children:o?(0,A.jsx)(_,{name:`arrow-down-s`,className:`h-3 w-3`}):(0,A.jsx)(_,{name:`arrow-right-s`,className:`h-3 w-3`})}):(0,A.jsx)(`span`,{className:`mr-1 w-4`}),t[12]=l,t[13]=g,t[14]=o,t[15]=b):b=t[15];let x;t[16]!==p||t[17]!==a.key?(x=a.key!==`root`&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`mr-1 font-semibold`,style:{color:p},children:/^\d+$/.test(a.key)?a.key:`"${a.key}"`}),(0,A.jsx)(`span`,{className:`mr-1 text-[var(--surface-foreground)]`,children:`:`})]}),t[16]=p,t[17]=a.key,t[18]=x):x=t[18];let S;t[19]!==o||t[20]!==a||t[21]!==h?(S=a.isExpandable?o?(0,A.jsx)(`span`,{className:`text-[var(--surface-foreground)]`,children:a.type===`object`?`{`:`[`}):(0,A.jsx)(`span`,{style:{color:`var(--surface-mutedForeground)`},children:et(a)}):(0,A.jsx)(`span`,{style:{color:h},children:Q(a)}),t[19]=o,t[20]=a,t[21]=h,t[22]=S):S=t[22];let C;return t[23]!==d||t[24]!==y||t[25]!==b||t[26]!==x||t[27]!==S?(C=(0,A.jsxs)(`div`,{className:`flex items-center py-0.5 px-2 hover:bg-[var(--surface-hover)] rounded-sm cursor-default font-mono text-xs leading-5 whitespace-nowrap`,style:y,onContextMenu:d,children:[b,x,S]}),t[23]=d,t[24]=y,t[25]=b,t[26]=x,t[27]=S,t[28]=C):C=t[28],C});$.displayName=`JsonRow`;var tt=200,nt=22,rt=O.forwardRef(function({data:e,className:t,maxHeight:n=`100%`,initiallyExpandedDepth:r=2,onCopyPath:i},a){let o=O.useMemo(()=>{try{return JSON.stringify(e)}catch{return null}},[e]),s=O.useMemo(()=>o?Je(o):null,[o]),[c,l]=O.useState(()=>s?new Set(Ze(s,r)):new Set),u=O.useMemo(()=>Ye(s,c),[s,c]),d=u.length>tt,f=O.useRef(null),p=oe({count:u.length,enabled:d,getScrollElement:()=>f.current,estimateSize:()=>nt,overscan:20,getItemKey:e=>u[e]?.node.id??e}),m=O.useCallback(e=>{l(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),h=O.useCallback(()=>{l(new Set)},[]),g=O.useCallback(()=>{s&&l(new Set(Xe(s)))},[s]);return O.useImperativeHandle(a,()=>({expandAll:h,collapseAll:g}),[h,g]),s?d?(0,A.jsx)(`div`,{ref:f,className:t,style:{maxHeight:n,overflow:`auto`},children:(0,A.jsx)(`div`,{style:{height:p.getTotalSize(),position:`relative`},children:p.getVirtualItems().map(e=>{let t=u[e.index];return t?(0,A.jsx)(`div`,{"data-index":e.index,ref:p.measureElement,style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${e.start}px)`},children:(0,A.jsx)($,{flatNode:t,onToggle:m,onCopyPath:i})},t.node.id):null})})}):(0,A.jsx)(`div`,{ref:f,className:t,style:{maxHeight:n,overflow:`auto`},children:u.map(e=>(0,A.jsx)($,{flatNode:e,onToggle:m,onCopyPath:i},e.node.id))}):null}),it=e=>{let t=(0,k.c)(12),{mode:n,onModeChange:r,className:i}=e,a;t[0]!==n||t[1]!==r?(a=e=>{e.stopPropagation(),r(n===`side-by-side`?`unified`:`side-by-side`)},t[0]=n,t[1]=r,t[2]=a):a=t[2];let o=a,s;t[3]===i?s=t[4]:(s=p(`h-5 w-5 p-0 opacity-60 hover:opacity-100`,i),t[3]=i,t[4]=s);let c=n===`side-by-side`?`Switch to unified view`:`Switch to side-by-side view`,l;t[5]===n?l=t[6]:(l=n===`side-by-side`?(0,A.jsx)(_,{name:`align-justify`,className:`h-3 w-3`}):(0,A.jsx)(_,{name:`layout-column`,className:`h-3 w-3`}),t[5]=n,t[6]=l);let u;return t[7]!==o||t[8]!==s||t[9]!==c||t[10]!==l?(u=(0,A.jsx)(m,{size:`sm`,variant:`ghost`,className:s,onClick:o,title:c,children:l}),t[7]=o,t[8]=s,t[9]=c,t[10]=l,t[11]=u):u=t[11],u},at=(e,t)=>{let n=(0,k.c)(4),[r,i]=O.useState(null),a,o;return n[0]!==e||n[1]!==t?(a=()=>{let n=!0,r=new AbortController;return i(null),ee(e,(t||`text`).toLowerCase(),{signal:r.signal,priority:`visible`}).then(e=>{n&&i(e)}),()=>{n=!1,r.abort()}},o=[e,t],n[0]=e,n[1]=t,n[2]=a,n[3]=o):(a=n[2],o=n[3]),O.useEffect(a,o),r};export{de as A,N as C,L as D,pe as E,F as O,le as S,j as T,Se as _,We as a,ce as b,Ue as c,Le as d,Fe as f,Ee as g,Me as h,Oe as i,fe as j,I as k,Pe as l,He as m,it as n,Ne as o,Ve as p,rt as r,q as s,at as t,ze as u,B as v,P as w,ue as x,se as y};