@neuralnomads/codenomad-dev 0.20.0-dev-20260921-63bbdbb1 → 0.20.0-dev-20260922-e68ac524

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 (134) hide show
  1. package/dist/automation/developer-inspection-targets.js +25 -0
  2. package/dist/automation/developer-inspection-targets.js.map +1 -0
  3. package/dist/developer-cdp.js +5 -4
  4. package/dist/developer-cdp.js.map +1 -1
  5. package/dist/developer-cdp.test.js +18 -0
  6. package/dist/developer-cdp.test.js.map +1 -1
  7. package/dist/opencode/session-pruning/navigation-contract.js +1 -0
  8. package/dist/opencode/session-pruning/navigation-contract.js.map +1 -1
  9. package/dist/opencode/session-pruning/navigation.test.js +12 -1
  10. package/dist/opencode/session-pruning/navigation.test.js.map +1 -1
  11. package/dist/opencode/session-pruning/outline-index.js +14 -1
  12. package/dist/opencode/session-pruning/outline-index.js.map +1 -1
  13. package/dist/plugins/session-pruning/plugin.mjs +16 -3
  14. package/dist/server/__tests__/instance-proxy.test.js +32 -0
  15. package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
  16. package/dist/server/http-server.js +1 -1
  17. package/dist/server/http-server.js.map +1 -1
  18. package/dist/server/routes/automation-plugin.js +28 -15
  19. package/dist/server/routes/automation-plugin.js.map +1 -1
  20. package/dist/server/routes/automation-plugin.test.js +10 -6
  21. package/dist/server/routes/automation-plugin.test.js.map +1 -1
  22. package/dist/workspaces/__tests__/git-common-directory.test.js +86 -0
  23. package/dist/workspaces/__tests__/git-common-directory.test.js.map +1 -0
  24. package/dist/workspaces/__tests__/git-worktree-config.test.js +130 -0
  25. package/dist/workspaces/__tests__/git-worktree-config.test.js.map +1 -0
  26. package/dist/workspaces/__tests__/git-worktrees.test.js +49 -1
  27. package/dist/workspaces/__tests__/git-worktrees.test.js.map +1 -1
  28. package/dist/workspaces/__tests__/native-worktree-fixture.js +2 -2
  29. package/dist/workspaces/__tests__/native-worktree-fixture.js.map +1 -1
  30. package/dist/workspaces/git-common-directory.js +18 -0
  31. package/dist/workspaces/git-common-directory.js.map +1 -0
  32. package/dist/workspaces/git-process.js +80 -0
  33. package/dist/workspaces/git-process.js.map +1 -0
  34. package/dist/workspaces/git-worktrees.js +64 -10
  35. package/dist/workspaces/git-worktrees.js.map +1 -1
  36. package/dist/workspaces/native-worktrees.js +24 -9
  37. package/dist/workspaces/native-worktrees.js.map +1 -1
  38. package/package.json +1 -1
  39. package/public/assets/App-BSkmbNUC.js +51 -0
  40. package/public/assets/App-BSkmbNUC.js.map +1 -0
  41. package/public/assets/FilesTab-CznSFRW_.js +3 -0
  42. package/public/assets/{FilesTab-DOOT4Own.js.map → FilesTab-CznSFRW_.js.map} +1 -1
  43. package/public/assets/{GitChangesTab-DqS17ZG_.js → GitChangesTab-DLtyzpX0.js} +3 -3
  44. package/public/assets/{GitChangesTab-DqS17ZG_.js.map → GitChangesTab-DLtyzpX0.js.map} +1 -1
  45. package/public/assets/{SplitFilePanel-DpXPYY4L.js → SplitFilePanel-BHkyIER4.js} +2 -2
  46. package/public/assets/{SplitFilePanel-DpXPYY4L.js.map → SplitFilePanel-BHkyIER4.js.map} +1 -1
  47. package/public/assets/{StatusTab-CynqW2pr.js → StatusTab-BB3L4UEF.js} +2 -2
  48. package/public/assets/{StatusTab-CynqW2pr.js.map → StatusTab-BB3L4UEF.js.map} +1 -1
  49. package/public/assets/{align-justify-C_MrQdWv.js → align-justify-BGcr8Y3G.js} +2 -2
  50. package/public/assets/{align-justify-C_MrQdWv.js.map → align-justify-BGcr8Y3G.js.map} +1 -1
  51. package/public/assets/{bundle-full-CVPoVh_h.js → bundle-full-CwHbX2Tz.js} +2 -2
  52. package/public/assets/{bundle-full-CVPoVh_h.js.map → bundle-full-CwHbX2Tz.js.map} +1 -1
  53. package/public/assets/client-state-CjVIIkWh.js +2 -0
  54. package/public/assets/client-state-CjVIIkWh.js.map +1 -0
  55. package/public/assets/{diff-viewer-BzgxNlWD.js → diff-viewer-FNBCogHl.js} +2 -2
  56. package/public/assets/{diff-viewer-BzgxNlWD.js.map → diff-viewer-FNBCogHl.js.map} +1 -1
  57. package/public/assets/index-AeE49W2c.js +2 -0
  58. package/public/assets/index-AeE49W2c.js.map +1 -0
  59. package/public/assets/index-B875QQLi.js +2 -0
  60. package/public/assets/index-B875QQLi.js.map +1 -0
  61. package/public/assets/index-BhInW6hR.js +3 -0
  62. package/public/assets/index-BhInW6hR.js.map +1 -0
  63. package/public/assets/index-C2jBtFkI.js +2 -0
  64. package/public/assets/{index-CrjSY1y2.js.map → index-C2jBtFkI.js.map} +1 -1
  65. package/public/assets/index-C8zCyB6Z.js +2 -0
  66. package/public/assets/index-C8zCyB6Z.js.map +1 -0
  67. package/public/assets/index-C9vJvaFa.js +2 -0
  68. package/public/assets/index-C9vJvaFa.js.map +1 -0
  69. package/public/assets/index-CLdQSSfU.js +2 -0
  70. package/public/assets/index-CLdQSSfU.js.map +1 -0
  71. package/public/assets/{index-Ce-SrKvP.js → index-CLgpBTF6.js} +2 -2
  72. package/public/assets/{index-Ce-SrKvP.js.map → index-CLgpBTF6.js.map} +1 -1
  73. package/public/assets/index-CaYFZAN4.js +2 -0
  74. package/public/assets/index-CaYFZAN4.js.map +1 -0
  75. package/public/assets/index-ChudAs0f.js +2 -0
  76. package/public/assets/index-ChudAs0f.js.map +1 -0
  77. package/public/assets/index-D292-iMl.js +2 -0
  78. package/public/assets/index-D292-iMl.js.map +1 -0
  79. package/public/assets/index-DYBqUC9X.css +1 -0
  80. package/public/assets/index-Dk3HFhZs.js +2 -0
  81. package/public/assets/index-Dk3HFhZs.js.map +1 -0
  82. package/public/assets/{loading-BWjkEyUD.js → loading-D8BcUQaM.js} +2 -2
  83. package/public/assets/{loading-BWjkEyUD.js.map → loading-D8BcUQaM.js.map} +1 -1
  84. package/public/assets/main-DRbjgAo8.js +42 -0
  85. package/public/assets/main-DRbjgAo8.js.map +1 -0
  86. package/public/assets/{markdown-Bkm0F3oO.js → markdown-CRPEbAqL.js} +4 -4
  87. package/public/assets/{markdown-Bkm0F3oO.js.map → markdown-CRPEbAqL.js.map} +1 -1
  88. package/public/assets/{monaco-viewer-C10fFymA.js → monaco-viewer-CG0aPZ-r.js} +2 -2
  89. package/public/assets/{monaco-viewer-C10fFymA.js.map → monaco-viewer-CG0aPZ-r.js.map} +1 -1
  90. package/public/assets/{startup-state-settings-card-BTfYhHov.js → startup-state-settings-card-CHqS2Pmg.js} +2 -2
  91. package/public/assets/{startup-state-settings-card-BTfYhHov.js.map → startup-state-settings-card-CHqS2Pmg.js.map} +1 -1
  92. package/public/assets/{terminal-square-Dhdgf3hj.js → terminal-square-DhmNJqNG.js} +2 -2
  93. package/public/assets/{terminal-square-Dhdgf3hj.js.map → terminal-square-DhmNJqNG.js.map} +1 -1
  94. package/public/assets/{todo-pfT9OVP8.js → todo-DXJ5kP_Z.js} +2 -2
  95. package/public/assets/{todo-pfT9OVP8.js.map → todo-DXJ5kP_Z.js.map} +1 -1
  96. package/public/assets/{tool-call-ja_vg-Y6.js → tool-call-Bjo9DalZ.js} +5 -5
  97. package/public/assets/{tool-call-ja_vg-Y6.js.map → tool-call-Bjo9DalZ.js.map} +1 -1
  98. package/public/assets/{unified-picker-Bi-fpJBA.js → unified-picker-CxrTM_tY.js} +2 -2
  99. package/public/assets/{unified-picker-Bi-fpJBA.js.map → unified-picker-CxrTM_tY.js.map} +1 -1
  100. package/public/assets/{wrap-text-DJHeAvj4.js → wrap-text-BznZeD4J.js} +2 -2
  101. package/public/assets/{wrap-text-DJHeAvj4.js.map → wrap-text-BznZeD4J.js.map} +1 -1
  102. package/public/index.html +4 -4
  103. package/public/loading.html +4 -4
  104. package/public/sw.js +1 -1
  105. package/public/sw.js.map +1 -1
  106. package/public/assets/App-bGIUQ-dD.js +0 -49
  107. package/public/assets/App-bGIUQ-dD.js.map +0 -1
  108. package/public/assets/FilesTab-DOOT4Own.js +0 -3
  109. package/public/assets/client-state-DHHjx28k.js +0 -2
  110. package/public/assets/client-state-DHHjx28k.js.map +0 -1
  111. package/public/assets/index-B5KIA1QZ.js +0 -2
  112. package/public/assets/index-B5KIA1QZ.js.map +0 -1
  113. package/public/assets/index-BO3LYyge.js +0 -2
  114. package/public/assets/index-BO3LYyge.js.map +0 -1
  115. package/public/assets/index-Bzngra1L.js +0 -3
  116. package/public/assets/index-Bzngra1L.js.map +0 -1
  117. package/public/assets/index-C6-rb6B7.css +0 -1
  118. package/public/assets/index-CI6ZE9xs.js +0 -2
  119. package/public/assets/index-CI6ZE9xs.js.map +0 -1
  120. package/public/assets/index-CSUBS-o9.js +0 -2
  121. package/public/assets/index-CSUBS-o9.js.map +0 -1
  122. package/public/assets/index-Cl4PCYg4.js +0 -2
  123. package/public/assets/index-Cl4PCYg4.js.map +0 -1
  124. package/public/assets/index-CrjSY1y2.js +0 -2
  125. package/public/assets/index-D7SuJgSm.js +0 -2
  126. package/public/assets/index-D7SuJgSm.js.map +0 -1
  127. package/public/assets/index-Daf72P6o.js +0 -2
  128. package/public/assets/index-Daf72P6o.js.map +0 -1
  129. package/public/assets/index-WIaMCSWq.js +0 -2
  130. package/public/assets/index-WIaMCSWq.js.map +0 -1
  131. package/public/assets/index-WsSXkxQ_.js +0 -2
  132. package/public/assets/index-WsSXkxQ_.js.map +0 -1
  133. package/public/assets/main-Hn7UJb2f.js +0 -42
  134. package/public/assets/main-Hn7UJb2f.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{e as yt}from"./git-diff-vendor-CT8HfOQw.js";import{a as bt,b as pt,m as Te,i as ee}from"./index-BhInW6hR.js";import{g as Ne}from"./monaco-viewer-CG0aPZ-r.js";const xe=["codenomad-client-snapshot-v1","codenomad-client-restore-enabled-v1"],_t={isPrimary:!1,restoreEnabled:!1,snapshot:null},ve=Ne("actions"),K=(()=>{const t=new Uint8Array(32);return globalThis.crypto.getRandomValues(t),Array.from(t,e=>e.toString(16).padStart(2,"0")).join("")})();let F=!1;const ne=()=>window.electronAPI;function ht(t,e,n={}){if(bt())return t(ne());if(pt())return ee(e,{accessToken:K,...n})}async function Ce(){if(!Te())return!1;try{const t=await ht(e=>{var n;return(n=e==null?void 0:e.claimClientStateAccess)==null?void 0:n.call(e,K)},"client_state_claim_access");F=pt()||t===!0}catch(t){F=!1,ve.warn("Client state native access claim failed",t)}return F}async function Re(){if(bt()||pt()){if(!await Ce())return _t;const t=await ht(n=>{var r;return(r=n==null?void 0:n.loadClientState)==null?void 0:r.call(n,K)},"client_state_load")??_t;if(!bt())return t;const e=ne();return{...t,partitionProtocolVersion:t.partitionProtocolVersion===1&&typeof(e==null?void 0:e.commitClientStatePartitions)=="function"&&typeof e.loadClientStatePartition=="function"?1:void 0}}try{for(const t of xe)window.localStorage.removeItem(t)}catch{}return _t}async function mt(t,e,n={}){return F?await ht(r=>r&&t(r),e,n)??!1:!1}const ke=t=>mt(e=>{var n;return(n=e.saveClientState)==null?void 0:n.call(e,K,t)},"client_state_save",{snapshot:t}),Me=t=>mt(e=>{var n;return(n=e.commitClientStatePartitions)==null?void 0:n.call(e,K,t)},"client_state_commit_partitions",{payload:t}),Ke=async t=>F?await ht(e=>{var n;return(n=e==null?void 0:e.loadClientStatePartition)==null?void 0:n.call(e,K,t)},"client_state_load_partition",{key:t})??null:null,$t=t=>mt(e=>{var n;return(n=e.setClientStateRestoreEnabled)==null?void 0:n.call(e,K,t)},"client_state_set_restore_enabled",{enabled:t}),Le=()=>mt(t=>{var e;return(e=t.clearClientState)==null?void 0:e.call(t,K)},"client_state_clear");function re(t,e={}){return!pt()||!F?Promise.resolve():ee(t,{accessToken:K,...e})}const Hn=t=>re("client_state_navigation_flushed",{generation:t}),Gn=t=>re("client_state_renderer_flushed",{generation:t}),oe=512,Ot=1024,Pt=4096,ie=256,J=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),ze=t=>t!=="__proto__"&&t!=="constructor"&&t!=="prototype";function M(t,e,n=!1){if(!(typeof t!="string"||t.length>e)&&!(!n&&t.trim().length===0))return t}function se(t){let e="";for(let n=0;n<t.length;n+=32768)e+=String.fromCharCode(...t.subarray(n,n+32768));return btoa(e)}const ce=t=>Uint8Array.from(atob(t),e=>e.charCodeAt(0));function De(t){if(typeof t!="string"||t.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(t))return!1;try{return ce(t),!0}catch{return!1}}const ae=t=>{var e;return typeof t=="string"?(e=t.match(/^data:[^;,]+;base64,([A-Za-z0-9+/]*={0,2})$/))==null?void 0:e[1]:void 0};function Be(t,e){const n=ae(e)??t,r=n instanceof Uint8Array?se(n):n;return De(r)?r:void 0}function Ht(t){if(!(!J(t)||!Number.isSafeInteger(t.line)||Number(t.line)<0)&&!(!Number.isSafeInteger(t.char)||Number(t.char)<0))return{line:Number(t.line),char:Number(t.char)}}function Xe(t,e){if(!J(t))return;if(t.type==="text")return typeof t.value=="string"?{type:"text",value:t.value}:void 0;if(t.type==="agent"){const o=M(t.name,Ot);return o===void 0?void 0:{type:"agent",name:o}}const n=M(t.path,Pt);if(t.type==="file"){const o=M(t.mime,ie);if(n===void 0||o===void 0)return;const c=ae(e)??t.data,a=Be(t.data,e);return c!==void 0&&a===void 0?void 0:a===void 0?{type:"file",path:n,mime:o}:{type:"file",path:n,mime:o,data:a}}if(t.type!=="symbol"||!J(t.range))return;const r=M(t.name,Ot),i=Ht(t.range.start),s=Ht(t.range.end);if(!(n===void 0||r===void 0||!Number.isSafeInteger(t.kind)||!i||!s))return{type:"symbol",path:n,name:r,kind:Number(t.kind),range:{start:i,end:s}}}function Ve(t){if(!J(t)||!["file","text","symbol","agent"].includes(String(t.type)))return;const e=M(t.id,oe),n=M(t.display,Ot),r=M(t.filename,Pt),i=M(t.mediaType,ie),s=Xe(t.source,t.url),o=typeof t.url=="string"&&!t.url.startsWith("data:")?t.url:"",c=M(o,Pt,!0);if(!(!e||!n||!r||!i||!s||s.type!==t.type||c===void 0))return{id:e,type:t.type,display:n,url:c,filename:r,mediaType:i,source:s}}function Dt(t,e,n=[]){if(!J(t))return null;const r=Object.create(null),i=[...new Set(n)],s=new Set(i),o=[...i.flatMap(c=>Object.prototype.hasOwnProperty.call(t,c)?[[c,t[c]]]:[]),...Object.entries(t).filter(([c])=>!s.has(c))];for(const[c,a]of o){if(!ze(c)||!c||c.length>oe||!Array.isArray(a))continue;const w=[];for(const S of a){const g=Ve(S);g&&w.push(g)}w.length&&(r[c]=w)}return{attachments:r,drafts:{...e}}}function Wn(t,e,n=[]){const r=Dt(e,t,n);if(!r||Object.entries(e).some(([i,s])=>{var o;return s.length!==(((o=r.attachments[i])==null?void 0:o.length)??0)}))throw new Error("Draft attachments could not be persisted safely");return r}function Jn(t){let e,n=t.url;if(t.source.type==="file")try{const r=t.source.data===void 0?void 0:ce(t.source.data);e={type:"file",path:t.source.path,mime:t.source.mime,data:r},!n&&t.source.data&&(n=`data:${t.source.mime};base64,${t.source.data}`)}catch{return null}else e=t.source,t.source.type==="text"&&!n&&(n=`data:text/plain;base64,${se(new TextEncoder().encode(t.source.value))}`);return{...t,url:n,source:e}}const Ye=()=>({bytes:16*1024*1024,entries:2e5,indexes:16}),Et=new WeakMap,Ue=new Set(["user","assistant","system","synthetic","skill","shell","compaction","idle","agent-switched","model-switched","location-switched"]),rt=t=>!!t&&typeof t=="object"&&!Array.isArray(t),W=(t,e)=>typeof t=="string"&&t.length>0&&t.length<=e,tt=(t,e=0)=>Number.isSafeInteger(t)&&Number(t)>=e;function qn(t){return t.entries.every(e=>!e.tools||e.toolName!==void 0)}function le(t){if(!rt(t))return;if(Et.has(t))return t;if(t.format!==1||!W(t.directory,4096)||!W(t.projectID,256)||t.revert!==void 0&&!W(t.revert,256)||!Array.isArray(t.entries)||t.entries.length>2e5||!Array.isArray(t.checkpoints)||t.checkpoints.length>512)return;const e=[],n=[],r=new Set;let i=-1,s=-1;for(const a of t.entries){if(!rt(a)||!W(a.id,256)||r.has(a.id)||!tt(a.seq)||a.seq<=i||typeof a.type!="string"||!Ue.has(a.type)||!tt(a.tools)||!tt(a.reasoning)||a.toolName!==void 0&&(typeof a.toolName!="string"||a.toolName.length>256))return;r.add(a.id),i=a.seq,e.push(Object.freeze({id:a.id,seq:i,type:a.type,tools:a.tools,reasoning:a.reasoning,...a.toolName===void 0?{}:{toolName:a.toolName}}))}for(const a of t.checkpoints){if(!rt(a)||a.after!==s||!tt(a.through)||a.through<=s||typeof a.digest!="string"||!/^[a-f0-9]{64}$/.test(a.digest))return;n.push(Object.freeze({after:s,through:a.through,digest:a.digest})),s=a.through}if(!n.length||i>s)return;const o={format:1,directory:t.directory,projectID:t.projectID,...t.revert===void 0?{}:{revert:t.revert},entries:e,checkpoints:n},c=new TextEncoder().encode(JSON.stringify(o)).byteLength;if(!(c>16*1024*1024))return Object.freeze(e),Object.freeze(n),Object.freeze(o),Et.set(o,c),o}function Fe(t,e,n){if(!rt(t))return;const r=Object.create(null),i=[n,...Object.keys(t).filter(s=>s!==n)].filter(s=>!!s);for(const s of i){if(!e.indexes||!e.entries||!e.bytes)break;if(!W(s,256)||["__proto__","constructor","prototype"].includes(s))continue;const o=le(t[s]);if(!o)continue;const c=Et.get(o);c>e.bytes||o.entries.length>e.entries||(r[s]=o,e.bytes-=c,e.entries-=o.entries.length,e.indexes--)}return Object.keys(r).length?r:void 0}const fe=32,$e=64,He=24,Ge=96,We=256,Je=256,qe=256,de=256,jt=4096,ot=512,Ze=4096,ue=32*1024,Qe=1024,tn=96*1024,en=256,Gt=1024,nn="__no_session_draft__";function ye(){return{remaining:tn,scrollSnapshotsRemaining:en,outlines:Ye()}}const L=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),pe=t=>t!=="__proto__"&&t!=="constructor"&&t!=="prototype";function v(t,e,n,r=!1){if(!(typeof t!="string"||t.length>e||t.length>n.remaining)&&!(!r&&t.trim().length===0))return n.remaining-=t.length,t}const z=(t,e,n)=>typeof t=="number"&&Number.isFinite(t)&&t>=e&&t<=n?t:void 0;function it(t,e,n,r,i=()=>!0,s=()=>{},o=[]){if(!L(t))return null;const c=Object.create(null);let a=0;const w=[...new Set(o)],S=new Set(w),g=[...w.flatMap(p=>Object.prototype.hasOwnProperty.call(t,p)?[[p,t[p]]]:[]),...Object.entries(t).filter(([p])=>!S.has(p))];for(const[p,I]of g){if(a>=e)break;if(!pe(p)||!i(I))continue;const b=v(p,de,n),u=r(I);b===void 0||u===void 0||(c[b]=u,a+=1,s())}return c}function he(t,e,n,r,i=[]){return it(t,e,r,s=>v(s,n,r,!0),void 0,void 0,i)}function rn(t,e){if(!L(t))return;const n=z(t.scrollTop,0,1e9),r=z(t.updatedAt,0,Number.MAX_SAFE_INTEGER);if(n===void 0||r===void 0||typeof t.atBottom!="boolean")return;const i={scrollTop:n,atBottom:t.atBottom,updatedAt:r},s=z(t.scrollRatio,0,1),o=z(t.maxScrollTop,0,1e9),c=z(t.anchorOffset,-1e6,1e6),a=t.anchorKey===void 0?void 0:v(t.anchorKey,Qe,e);s!==void 0&&(i.scrollRatio=s),o!==void 0&&(i.maxScrollTop=o),a!==void 0&&(i.anchorKey=a),c!==void 0&&(i.anchorOffset=c),(t.followModeType==="following"||t.followModeType==="escaped")&&(i.followModeType=t.followModeType),typeof t.windowIsLatest=="boolean"&&(i.windowIsLatest=t.windowIsLatest);const w=t.windowCursor===void 0?void 0:v(t.windowCursor,Gt,e);if(w!==void 0&&(i.windowCursor=w),Array.isArray(t.newerCursors)){const S=[];for(const g of t.newerCursors.slice(-32)){if(g===null||g===""){S.push(null);continue}const p=v(g,Gt,e);p!==void 0&&S.push(p)}S.length>0&&(i.newerCursors=S)}return i}function on(t,e){if(!Array.isArray(t))return null;const n=[],r=new Set;for(const i of t.slice(0,qe)){if(typeof i!="string"||r.has(i))continue;const s=v(i,ot,e);s!==void 0&&(r.add(s),n.push(s))}return n}function sn(t,e,n,r){const i=e.priorityDrafts,s=Object.fromEntries(Object.entries(t.drafts??{}).filter(([d])=>!Object.prototype.hasOwnProperty.call(i,d))),o=he(s,Math.max(0,He-Object.keys(i).length),ue,n),c=o?{...i,...o}:null,a=Math.min(Ge,n.scrollSnapshotsRemaining),w=it(t.scrollSnapshots??{},a,n,d=>rn(d,n),void 0,()=>{n.scrollSnapshotsRemaining-=1}),S=it(t.unseenIdleSince??{},We,n,d=>z(d,0,Number.MAX_SAFE_INTEGER)),g=it(t.generationRecovery??{},Je,n,d=>d,d=>d==="working"||d==="interrupted"),p=t.expandedSessionIds===void 0?void 0:on(t.expandedSessionIds,n);if(!c||!w||!S||!g||p===null)return null;const I=Object.fromEntries(Object.entries(t.attachments??{}).filter(([d])=>!e.prioritySessionIds.includes(d))),b=Dt(I,c);if(!b)return null;const u={kind:"workspace",folder:e.folder,drafts:b.drafts,attachments:{...e.priorityAttachments,...b.attachments},scrollSnapshots:w,unseenIdleSince:S,generationRecovery:g};p!==void 0&&(u.expandedSessionIds=p);const h=Fe(t.outlineIndexes,n.outlines,e.activeSessionId);h&&(u.outlineIndexes=h),Number.isInteger(t.occurrence)&&Number(t.occurrence)>=0&&Number(t.occurrence)<fe&&(u.occurrence=Number(t.occurrence));const l=t.projectName===void 0?void 0:v(t.projectName,jt,n),f=t.binaryPath===void 0?void 0:v(t.binaryPath,jt,n);return l!==void 0&&(u.projectName=l),f!==void 0&&(u.binaryPath=f),e.activeParentSessionId!==void 0&&(u.activeParentSessionId=e.activeParentSessionId),e.activeSessionId!==void 0&&(u.activeSessionId=e.activeSessionId),u}function cn(t,e){if(!L(t))return null;const n=t.kind??t.type;if(n==="sidecar"){const c=v(t.sidecarId,ot,e);return c===void 0?null:{kind:n,sidecarId:c}}if(n!=="workspace"&&n!=="instance"||!["drafts","attachments","scrollSnapshots","unseenIdleSince","generationRecovery"].every(c=>L(t[c]??{})))return null;const r=v(t.folder,jt,e);if(r===void 0)return null;const i=t.activeParentSessionId===void 0?void 0:v(t.activeParentSessionId,ot,e),s=t.activeSessionId===void 0?void 0:v(t.activeSessionId,ot,e),o=[s,nn].filter(c=>!!c);return{kind:"workspace",value:t,folder:r,activeParentSessionId:i,activeSessionId:s,prioritySessionIds:o,priorityDrafts:Object.create(null),priorityAttachments:Object.create(null)}}function an(t,e){const n=t.value.drafts??{};if(!L(n))return;for(const o of t.prioritySessionIds){if(!pe(o)||!Object.prototype.hasOwnProperty.call(n,o))continue;const c=e.remaining,a=v(o,de,e),w=v(n[o],ue,e,!0);if(a===void 0||w===void 0){e.remaining=c;continue}t.priorityDrafts[a]=w}const r=t.value.attachments??{};if(!L(r))return;const i=Object.fromEntries(t.prioritySessionIds.filter(o=>Object.prototype.hasOwnProperty.call(r,o)).map(o=>[o,r[o]])),s=Dt(i,t.priorityDrafts,t.prioritySessionIds);s&&(t.priorityDrafts=s.drafts,t.priorityAttachments=s.attachments)}function Tt(t){return me(t,ye())}function me(t,e){if(!L(t)||!Array.isArray(t.tabs)||!Number.isInteger(t.activeTabIndex))return null;const n=Number(t.activeTabIndex),r=t.tabs.slice(0,fe),i=new Map,s=new Map,o=u=>{const h=cn(r[u],e);h&&i.set(u,h)},c=(u,h)=>{const l=i.get(u);if(!l)return;const f=l.kind==="sidecar"?l:sn(l.value,l,e);f&&s.set(u,f)};r.forEach((u,h)=>o(h));const a=[n,...r.map((u,h)=>h).filter(u=>u!==n)];for(const u of a){const h=i.get(u);(h==null?void 0:h.kind)==="workspace"&&an(h,e)}r[n]!==void 0&&c(n),r.forEach((u,h)=>{h!==n&&c(h)});const S=r.flatMap((u,h)=>{const l=i.get(h);return l?[{originalIndex:h,identity:l}]:[]}).flatMap(({originalIndex:u})=>{const h=s.get(u);return h?[{originalIndex:u,tab:h}]:[]});if(t.tabs.length&&!S.length)return null;const g=S.map(({tab:u})=>u),p=S.findIndex(({originalIndex:u})=>u===n),I=S.findIndex(({originalIndex:u})=>u>n),b=g.length?p>=0?p:I>=0?I:g.length-1:-1;return{tabs:g,activeTabIndex:b,...t.homeActive===!0?{homeActive:!0}:{}}}function Bt(t){if(!L(t)||t.version!==void 0&&t.version!==1||!Number.isSafeInteger(t.revision)||Number(t.revision)<0)return null;const e=z(t.savedAt,0,Number.MAX_SAFE_INTEGER);if(e===void 0)return null;const n=ye(),r=t.session===null?null:me(t.session,n);if(t.session!==null&&!r)return null;const i=he(t.layout,$e,Ze,n);return i?{version:1,revision:Number(t.revision),savedAt:e,layout:i,session:r}:null}const ln=new TextEncoder;function Nt(t){return Array.isArray(t)?t.map(Nt):typeof t!="object"||t===null?t:Object.fromEntries(Object.keys(t).sort().map(e=>[e,Nt(t[e])]))}function $(t){const e=JSON.stringify(Nt(t));if(e===void 0)throw new TypeError("Client state partition must be JSON-serializable");return e}async function St(t){const e=await crypto.subtle.digest("SHA-256",ln.encode(t));return Array.from(new Uint8Array(e),n=>n.toString(16).padStart(2,"0")).join("")}const Wt=new WeakMap;function fn(t){let e=Wt.get(t);return e||(e=(async()=>{const n=Object.create(null),r=[];for(let o=0;o<t.entries.length;o+=512){const c=$({format:1,index:o/512,entries:t.entries.slice(o,o+512)}),a=await St(c);n[a]=c,r.push(a)}const{entries:i,...s}=t;return{descriptor:{...s,entryPartitions:r},partitions:n}})(),Object.isFrozen(t)&&Wt.set(t,e)),e}async function dn(t,e,n,r){if(!t||typeof t!="object"||Array.isArray(t))return;const i=t,s=i.entryPartitions;if(!Array.isArray(s)||s.length>391||new Set(s).size!==s.length||!s.every(c=>typeof c=="string"&&/^[a-f0-9]{64}$/.test(c)&&e.has(c)))return;s.forEach(c=>n.add(c));const o=[];for(let c=0;c<s.length;c++){const a=await r(s[c]).catch(()=>null);if(!a||a.format!==1||a.index!==c||!Array.isArray(a.entries)||a.entries.length>512||c<s.length-1&&a.entries.length!==512)return;o.push(...a.entries)}return le({...i,entries:o})}const q=1024*1024,xt=1024*1024,un=4096,Jt=256*1024*1024,yn=512,vt=768*1024,Se=256,we=vt*Se,D=/^[0-9a-f]{64}$/,pn=["layout","partitionKeys","revision","savedAt","sessionPartition","version"],hn=new Set(["__proto__","constructor","prototype"]),X=new TextEncoder,R=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),_=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),et=t=>typeof t=="string"&&t.length>0&&t.length<=yn&&t.trim().length>0&&!hn.has(t);function ge(t){return Array.isArray(t)&&t.every((e,n)=>typeof e=="string"&&D.test(e)&&(n===0||t[n-1]<e))}function C(t,e,n=[]){const r=new Set([...e,...n]);return e.every(i=>_(t,i))&&Object.keys(t).every(i=>r.has(i))}function lt(t,e){try{return $(t)===$(e)}catch{return!1}}function mn(t){let e="";for(let n=0;n<t.length;n+=32768)e+=String.fromCharCode(...t.subarray(n,n+32768));return btoa(e)}const Sn=t=>Uint8Array.from(atob(t),e=>e.charCodeAt(0)),Ct=t=>typeof t=="string"&&t.length%4===0&&/^[A-Za-z0-9+/]*={0,2}$/.test(t);async function qt(t,e){if(!Ct(t)||t.length>we)throw new Error("Client state attachment exceeds the 192 MiB encoded blob limit");const n=[];for(let r=0,i=0;r<t.length||r===0;r+=vt,i+=1)n.push(await e({format:2,index:i,data:t.slice(r,r+vt)}));return n}async function wn(t,e){return Promise.all(t.map(async n=>{let r;return n.source.type==="file"?(r={type:"file",path:n.source.path,mime:n.source.mime},n.source.data!==void 0&&(r.dataPartitions=await qt(n.source.data,e))):n.source.type==="text"?r={type:"text",valuePartitions:await qt(mn(X.encode(n.source.value)),e)}:r=n.source,{...n,source:r}}))}async function Rt(t){const e=Object.create(null),n=async o=>{const c=$(o);if(X.encode(c).byteLength>q)throw new Error("Client state partition exceeds the native size limit");const a=await St(c);return e[a]=c,a},r=t===null?null:{tabs:await Promise.all(t.tabs.map(async o=>{var g;if(o.kind==="sidecar")return{kind:o.kind,sidecarId:o.sidecarId};const c=new Set([...Object.keys(o.drafts),...Object.keys(o.attachments),...Object.keys(o.scrollSnapshots),...Object.keys(o.unseenIdleSince),...Object.keys(o.generationRecovery),...Object.keys(o.outlineIndexes??{})]),a=Object.create(null);for(const p of[...c].sort()){const I={format:2};_(o.drafts,p)&&(I.draft=o.drafts[p]),_(o.attachments,p)&&(I.attachments=await wn(o.attachments[p],n)),_(o.scrollSnapshots,p)&&(I.scrollSnapshot=o.scrollSnapshots[p]),_(o.unseenIdleSince,p)&&(I.unseenIdleSince=o.unseenIdleSince[p]),_(o.generationRecovery,p)&&(I.generationRecovery=o.generationRecovery[p]);const b=(g=o.outlineIndexes)==null?void 0:g[p],u=b?await fn(b):void 0;u&&(I.outline=u.descriptor,Object.assign(e,u.partitions));const h=await n(I),l=(I.attachments??[]).flatMap(f=>{if(!R(f)||!R(f.source))return[];const d=f.source.dataPartitions??f.source.valuePartitions;return Array.isArray(d)?d.filter(O=>typeof O=="string"):[]});a[p]={documentPartition:h,partitionKeys:[...new Set([h,...l,...Object.keys((u==null?void 0:u.partitions)??{})])].sort()}}const w={format:2,sessions:a};o.activeParentSessionId!==void 0&&(w.activeParentSessionId=o.activeParentSessionId),o.activeSessionId!==void 0&&(w.activeSessionId=o.activeSessionId),o.expandedSessionIds!==void 0&&(w.expandedSessionIds=o.expandedSessionIds);const S={kind:o.kind,folder:o.folder,workspacePartition:await n(w)};return o.occurrence!==void 0&&(S.occurrence=o.occurrence),o.projectName!==void 0&&(S.projectName=o.projectName),o.binaryPath!==void 0&&(S.binaryPath=o.binaryPath),S})),activeTabIndex:t.activeTabIndex,...t.homeActive!==void 0?{homeActive:t.homeActive}:{}},i=await n({format:2,session:r}),s=Object.keys(e).sort();return{sessionPartition:i,partitionKeys:s,partitions:Object.fromEntries(s.map(o=>[o,e[o]]))}}async function gn(t){var n;const e=await Rt(t.session);return{root:{version:2,revision:t.revision,savedAt:t.savedAt,layout:t.layout,sessionPartition:e.sessionPartition,partitionKeys:e.partitionKeys,...(n=t.session)!=null&&n.tabs.some(r=>r.kind==="workspace"&&Object.keys(r.outlineIndexes??{}).length)?{extensions:["outline-index-v1"]}:{}},partitions:e.partitions,partitionKeys:e.partitionKeys}}function An(t){if(t.partitionKeys.length>un)return!1;const e=JSON.stringify(t.root);if(e.length>xt)return!1;let n=X.encode(e).byteLength;if(n>xt)return!1;for(const r in t.partitions){if(!_(t.partitions,r))continue;const i=t.partitions[r];if(i.length>q||i.length>Jt-n)return!1;const s=X.encode(i).byteLength;if(s>q||s>Jt-n)return!1;n+=s}return!0}function In(t){if(!R(t)||t.version!==2||typeof t.sessionPartition!="string"||!D.test(t.sessionPartition)||!ge(t.partitionKeys)||!t.partitionKeys.includes(t.sessionPartition)||Object.keys(t).sort().join("\0")!==[...pn,...t.extensions===void 0?[]:["extensions"]].sort().join("\0")||t.extensions!==void 0&&!lt(t.extensions,["outline-index-v1"]))return null;let e;try{e=JSON.stringify(t)}catch{return null}if(X.encode(e).byteLength>xt)return null;const n=Bt({...t,version:1,session:null});return!n||!lt(t,{version:2,revision:n.revision,savedAt:n.savedAt,layout:n.layout,sessionPartition:t.sessionPartition,partitionKeys:t.partitionKeys,...t.extensions===void 0?{}:{extensions:t.extensions}})?null:{root:n,partitionKey:t.sessionPartition,partitionKeys:t.partitionKeys}}function Ae(t){try{return{value:JSON.parse(t)}}catch{return null}}async function _n(t,e,n,r,i){var h;if(!C(t,["format","session"])||$(t)!==r.get(e))return;if(t.session===null){const l=await Rt(null);return Zt(l,e,n,r)?null:void 0}if(!R(t.session)||!C(t.session,["tabs","activeTabIndex"],["homeActive"])||!Array.isArray(t.session.tabs))return;const s=async l=>{if(typeof l!="string"||!D.test(l))return null;let f=r.get(l);if(f===void 0){if(f=await i(l)??void 0,f===void 0||X.encode(f).byteLength>q||await St(f)!==l)return null;r.set(l,f)}const d=Ae(f);return d&&R(d.value)&&$(d.value)===f?d.value:null},o=(l,f)=>{const d=[...new Set(l)].sort();return d.length===f.length&&d.every((O,E)=>O===f[E])},c=async(l,f,d)=>{if(!Array.isArray(l)||!l.length||l.length>Se||!l.every(y=>typeof y=="string"&&D.test(y))||new Set(l).size!==l.length)return null;const O=[];let E=0;for(const[y,m]of l.entries()){if(!f.has(m))return null;d.add(m);const N=await s(m);if(!N||!Ct(N.data))return null;if(N.format===1){if(!C(N,["format","data"]))return null}else if(N.format===2){if(!C(N,["format","index","data"])||N.index!==y)return null}else return null;if(N.data.length>we-E)return null;E+=N.data.length,O.push(N.data)}const A=O.join("");return Ct(A)?A:null},a=async(l,f,d)=>{if(!Array.isArray(l))return null;const O=[];for(const E of l){if(!R(E)||!C(E,["id","type","display","url","filename","mediaType","source"])||!R(E.source))return null;const A=E.source;if(A.type==="file"){if(!C(A,["type","path","mime"],["dataPartitions"]))return null;if(_(A,"dataPartitions")){const y=await c(A.dataPartitions,f,d);if(y===null)return null;O.push({...E,source:{type:A.type,path:A.path,mime:A.mime,data:y}})}else O.push(E);continue}if(A.type==="text"){if(!C(A,["type","valuePartitions"]))return null;const y=await c(A.valuePartitions,f,d);if(y===null)return null;try{const m=new TextDecoder("utf-8",{fatal:!0}).decode(Sn(y));O.push({...E,source:{type:A.type,value:m}})}catch{return null}continue}O.push(E)}return O},w=[],S=new Set([e]);let g=!1,p=!1;for(const l of t.session.tabs){if(!R(l))return;if(l.kind==="sidecar"){if(!C(l,["kind","sidecarId"]))return;w.push({kind:l.kind,sidecarId:l.sidecarId});continue}if(l.kind!=="workspace"||!C(l,["kind","folder","workspacePartition"],["occurrence","projectName","binaryPath"])||typeof l.workspacePartition!="string"||!D.test(l.workspacePartition))return;S.add(l.workspacePartition);const f=await s(l.workspacePartition);if(!f||f.format!==1&&f.format!==2||!C(f,["format","sessions"],["activeParentSessionId","activeSessionId","expandedSessionIds"])||!R(f.sessions)||(p||(p=f.format===1),!Object.keys(f.sessions).every(et)||_(f,"activeParentSessionId")&&!et(f.activeParentSessionId)||_(f,"activeSessionId")&&!et(f.activeSessionId)||_(f,"expandedSessionIds")&&(!Array.isArray(f.expandedSessionIds)||!f.expandedSessionIds.every(et))))return;const d={kind:l.kind,folder:l.folder,drafts:Object.create(null),attachments:Object.create(null),scrollSnapshots:Object.create(null),unseenIdleSince:Object.create(null),generationRecovery:Object.create(null)};for(const y of["occurrence","projectName","binaryPath"])_(l,y)&&(d[y]=l[y]);for(const y of["activeParentSessionId","activeSessionId","expandedSessionIds"])_(f,y)&&(d[y]=f[y]);const O=[];for(const[y,m]of Object.entries(f.sessions)){if(f.format===1){if(typeof m!="string"||!D.test(m))return;O.push({sessionId:y,documentKey:m,partitionKeys:[m]}),S.add(m);continue}if(!R(m)||!C(m,["documentPartition","partitionKeys"])||typeof m.documentPartition!="string"||!D.test(m.documentPartition)||!ge(m.partitionKeys)||!m.partitionKeys.includes(m.documentPartition))return;O.push({sessionId:y,documentKey:m.documentPartition,partitionKeys:m.partitionKeys}),m.partitionKeys.forEach(N=>S.add(N))}const E=typeof f.activeSessionId=="string"?f.activeSessionId:void 0;O.sort((y,m)=>y.sessionId===E?-1:m.sessionId===E?1:y.sessionId.localeCompare(m.sessionId));const A=new Set;for(const{sessionId:y,documentKey:m,partitionKeys:N}of O){const x=await s(m),Yt=new Set(N),At=new Set([m]);if(!(x&&(x.format===1||x.format===2)&&C(x,["format"],["draft","attachments","scrollSnapshot","unseenIdleSince","generationRecovery","outline"])&&Object.keys(x).length>1)){g=!0,A.add(y);continue}const It=_(x,"attachments")?x.format===1?x.attachments:await a(x.attachments,Yt,At):void 0,G=x.outline===void 0?void 0:await dn(x.outline,Yt,At,s);if(x.outline!==void 0&&!G&&(g=!0),_(x,"attachments")&&It===null||!o(At,N)){g=!0,A.add(y);continue}const k={kind:"workspace",folder:"/",drafts:Object.create(null),attachments:Object.create(null),scrollSnapshots:Object.create(null),unseenIdleSince:Object.create(null),generationRecovery:Object.create(null)},Ut=[["draft","drafts"],["scrollSnapshot","scrollSnapshots"],["unseenIdleSince","unseenIdleSince"],["generationRecovery","generationRecovery"]];for(const[Y,je]of Ut)_(x,Y)&&(k[je][y]=x[Y]);It!==void 0&&(k.attachments[y]=It),G&&(k.outlineIndexes={[y]:G});const Ft=(h=Tt({tabs:[k],activeTabIndex:0}))==null?void 0:h.tabs[0];if(!Ft||!lt(k,Ft)){g=!0,A.add(y);continue}for(const[,Y]of Ut)_(k[Y],y)&&(d[Y][y]=k[Y][y]);_(k.attachments,y)&&(d.attachments[y]=k.attachments[y]),G&&(d.outlineIndexes??(d.outlineIndexes=Object.create(null)),d.outlineIndexes[y]=G)}A.has(String(d.activeSessionId))&&delete d.activeSessionId,A.has(String(d.activeParentSessionId))&&delete d.activeParentSessionId,Array.isArray(d.expandedSessionIds)&&(d.expandedSessionIds=d.expandedSessionIds.filter(y=>!A.has(String(y)))),w.push(d)}if(!o(S,n))return;const I={tabs:w,activeTabIndex:t.session.activeTabIndex,..._(t.session,"homeActive")?{homeActive:t.session.homeActive}:{}},b=Tt(I);if(!b||!lt(I,b))return;if(g||p)return b;const u=await Rt(b);return Zt(u,e,n,r)?b:void 0}function Zt(t,e,n,r){return t.sessionPartition!==e||t.partitionKeys.length!==n.length||!t.partitionKeys.every((i,s)=>i===n[s])||t.partitionKeys.length!==r.size?!1:t.partitionKeys.every(i=>r.get(i)===t.partitions[i])}async function bn(t,e,n){const r=In(t);if(!r||e!==1)return null;try{const i=await n(r.partitionKey);if(i===null||X.encode(i).byteLength>q||await St(i)!==r.partitionKey)return null;const s=Ae(i);if(!s)return null;if(R(s.value)&&s.value.format===2){const o=new Map([[r.partitionKey,i]]),c=await _n(s.value,r.partitionKey,r.partitionKeys,o,n);return c===void 0?null:{...r.root,session:c}}return null}catch{return null}}const On=t=>R(t)&&t.version===2,Pn=250,En=3,jn=1024*1024,Tn=64,Nn=256,Xt=4096,xn="opencode-session-",vn=new Set(["__proto__","constructor","prototype"]),[V,ft]=yt(!0),[H,st]=yt(!1),[Cn,Rn]=yt(!1),[kt,Mt]=yt(null);let Kt=!1,nt=null,T=Object.create(null),Ie=0,j=!1,P=!1,ct=null,B=Promise.resolve(),Qt=Promise.resolve(),Z,Lt;const U=new Set;function wt(t,e){try{return e(window.localStorage)}catch{return t}}function _e(t){return t.length>0&&t.length<=Nn&&!vn.has(t)}const te=t=>wt(null,e=>{const n=e.getItem(t);return n!==null&&n.length<=Xt?n:null}),zt=(t,e)=>wt(void 0,n=>n.setItem(t,e));function be(t){const e=new Set(Object.keys(T));for(let n=0;n<t.length;n+=1){const r=t.key(n);r!=null&&r.startsWith(xn)&&e.add(r)}return[...e]}const dt=t=>Object.prototype.hasOwnProperty.call(T,t),ut=()=>Object.keys(T).length>=Tn;function kn(){return wt(!1,t=>{const e=Object.keys(T).length;for(const n of be(t)){if(dt(n))continue;if(ut())break;const r=t.getItem(n);r===null||r.length>Xt||(T[n]=r)}return Object.keys(T).length!==e})}function Vt(){return Kt&&V()&&H()&&!P}const gt=()=>{ct!==null&&clearTimeout(ct),ct=null};function Oe(){if(gt(),!j||!Vt())return B;const t={version:1,revision:++Ie,savedAt:Date.now(),layout:{...T},session:Lt===1?kt():Mn(kt())},e=Bt(t);if(!e)return Promise.reject(new Error("Client snapshot normalization failed"));T={...e.layout},j=!1;const n=B.then(async()=>{try{const r=Lt===1?await gn(e):null;if(r&&!An(r))throw new Error("Client snapshot exceeds the native partition count or size limits");if(!r&&new TextEncoder().encode(JSON.stringify(e)).byteLength>jn)throw new Error("Client snapshot exceeds the V1 1 MiB limit and partition persistence is unavailable");if(!(r?await Me({protocolVersion:1,snapshot:r.root,partitions:r.partitions,partitionKeys:r.partitionKeys}):await ke(e)))throw ft(!1),new Error("Native client state save was rejected");Z=void 0}catch(r){throw j=!0,Z=r,r}});return B=n.catch(()=>{}),n}function Mn(t){return t&&{...t,tabs:t.tabs.map(e=>{if(e.kind!=="workspace")return e;const{outlineIndexes:n,...r}=e;return r})}}function Q(){j=!0,Vt()&&(gt(),ct=setTimeout(()=>void Oe().catch(t=>console.warn("[client-state] failed to save client snapshot",t)),Pn))}function at(t=null,e=!1){T=t?{...t.layout}:Object.create(null),e&&(Ie=(t==null?void 0:t.revision)??0),Rn(t!==null),Mt((t==null?void 0:t.session)??null)}async function Pe(t,e,n=!1){const r=P;let i=j;P="transaction",U.clear(),gt(),j=!1;try{if(await B,i||(i=j),j=!1,!await t())throw n&&ft(!1),new Error(e);wt(void 0,s=>{for(const o of be(s))s.removeItem(o)}),at(),U.clear(),P="snapshot"}catch(s){i||(i=j);for(const o of U)zt(o,T[o]);throw U.clear(),P=r,j=i,j&&Q(),s}}function Ee(t){const e=Qt.then(t);return Qt=e.catch(()=>{}),e}function Kn(t){const e=t===null?null:Tt(t);if(!(t!==null&&e===null)){if(P==="transaction"){Mt(e),j=!0;return}P||!V()||!H()||(Mt(e),Q())}}function Ln(t){if(!_e(t))return null;if(!V())return te(t);if(!H()||P)return null;if(dt(t))return T[t]??null;const e=te(t);return e===null||ut()||(T[t]=e,Q()),e}function zn(t,e){if(!(!_e(t)||e.length>Xt)){if(!V())return zt(t,e);if(P==="transaction"){if(!dt(t)&&ut())return;j||(j=T[t]!==e),T[t]=e,U.add(t);return}!H()||P||!dt(t)&&ut()||(zt(t,e),T[t]!==e&&(T[t]=e,Q()))}}async function Dn(){gt();let t=Z;for(let e=0;e<En;e+=1){for(;;){const n=B;if(await n,n===B)break}if(!j){if(t!==void 0)throw t;return}if(!Vt()){const n=Z??t;if(n!==void 0)throw n;return}try{await Oe(),t=void 0}catch(n){t=n}}if(await B,!!j)throw t??new Error("Client state remained dirty after the final flush attempt")}async function Bn(){await Ee(async()=>{if(!V())throw new Error("Client state is not owned by this window");await Pe(Le,"Native client state clear was rejected",!0)})}async function Xn(t){await Ee(async()=>{if(!(t===H()&&(!t||P===!1))){if(!V())throw new Error("Client state is not owned by this window");if(t){if(!await $t(!0))throw new Error("Native restore preference update was rejected");P=!1,st(!0);return}st(!1);try{await Pe(()=>$t(!1),"Native restore preference update was rejected")}catch(e){throw st(!0),e}}})}function Vn(){return nt||(nt=(async()=>{try{const t=await Re();if(Lt=t.partitionProtocolVersion,ft(t.isPrimary),st(t.restoreEnabled),at(null,!0),j=!1,Z=void 0,P=!1,U.clear(),Kt=!0,!t.isPrimary||!t.restoreEnabled)return;let e;if(On(t.snapshot)){P="snapshot";try{e=await bn(t.snapshot,t.partitionProtocolVersion,Ke)}catch(n){e=null,console.warn("[client-state] failed to load client snapshot partition",n)}e&&(P=!1)}else e=Bt(t.snapshot),P=t.snapshot!==null&&e===null?"snapshot":!1;at(e,!0),!P&&kn()&&Q()}catch(t){Kt=!0,ft(!1),at(),console.warn("[client-state] failed to initialize client state",t)}})(),nt)}const Zn=Object.freeze(Object.defineProperty({__proto__:null,clearRestoredClientState:Bn,clientStateIsPrimary:V,flushClientState:Dn,initializeClientState:Vn,loadedClientSnapshotExists:Cn,loadedRestorableSession:kt,readClientLayoutValue:Ln,restorePreviousStateEnabled:H,setRestorePreviousStateEnabled:Xn,updateRestorableSession:Kn,writeClientLayoutValue:zn},Symbol.toStringTag,{value:"Module"}));export{Jn as a,H as b,V as c,Gn as d,Hn as e,Dn as f,Xn as g,qn as h,Bn as i,Zn as j,kt as l,le as n,Ln as r,Wn as s,Kn as u,zn as w};
2
+ //# sourceMappingURL=client-state-CjVIIkWh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-state-CjVIIkWh.js","sources":["../../../lib/native/client-state.ts","../../../stores/client-state-attachments-codec.ts","../../../stores/session-outline-persistence.ts","../../../stores/client-state-codec.ts","../../../stores/client-state-partition-json.ts","../../../stores/client-state-outline-partitions.ts","../../../stores/client-state-partitions.ts","../../../stores/client-state.ts"],"sourcesContent":["import { invoke } from \"@tauri-apps/api/core\"\nimport { isElectronHost, isLocalWindow, isTauriHost } from \"../runtime-env\"\nimport { getLogger } from \"../logger\"\nconst LEGACY_WEB_KEYS = [\"codenomad-client-snapshot-v1\", \"codenomad-client-restore-enabled-v1\"]\nexport type NativeClientStateLoadResult = {\n isPrimary: boolean\n restoreEnabled: boolean\n snapshot: unknown | null\n partitionProtocolVersion?: 1\n}\nexport type NativeClientStatePartitionCommit = {\n protocolVersion: 1\n snapshot: unknown\n partitions: Record<string, string>\n partitionKeys: string[]\n}\nconst SECONDARY_CLIENT_STATE: NativeClientStateLoadResult = { isPrimary: false, restoreEnabled: false, snapshot: null }\nconst log = getLogger(\"actions\")\nconst accessToken = (() => {\n const bytes = new Uint8Array(32)\n globalThis.crypto.getRandomValues(bytes)\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n})()\nlet nativeAccessClaimed = false\nconst electronApi = () => (window as Window & { electronAPI?: ElectronAPI }).electronAPI\nfunction dispatchNative<T>(electronOperation: (api: ElectronAPI | undefined) => Promise<T> | undefined, command: string, args: Record<string, unknown> = {}): Promise<T> | undefined {\n if (isElectronHost()) return electronOperation(electronApi())\n if (isTauriHost()) return invoke<T>(command, { accessToken, ...args })\n}\nasync function claimNativeClientStateAccess(): Promise<boolean> {\n if (!isLocalWindow()) return false\n try {\n const result = await dispatchNative<boolean | void>((api) => api?.claimClientStateAccess?.(accessToken), \"client_state_claim_access\")\n nativeAccessClaimed = isTauriHost() || result === true\n } catch (error) {\n nativeAccessClaimed = false\n log.warn(\"Client state native access claim failed\", error)\n }\n return nativeAccessClaimed\n}\nexport async function loadNativeClientState(): Promise<NativeClientStateLoadResult> {\n if (isElectronHost() || isTauriHost()) {\n if (!await claimNativeClientStateAccess()) return SECONDARY_CLIENT_STATE\n const loaded = await dispatchNative((api) => api?.loadClientState?.(accessToken), \"client_state_load\") ?? SECONDARY_CLIENT_STATE\n if (!isElectronHost()) return loaded\n const api = electronApi()\n return {\n ...loaded,\n partitionProtocolVersion: loaded.partitionProtocolVersion === 1\n && typeof api?.commitClientStatePartitions === \"function\"\n && typeof api.loadClientStatePartition === \"function\" ? 1 : undefined,\n }\n }\n try {\n for (const key of LEGACY_WEB_KEYS) window.localStorage.removeItem(key)\n } catch {}\n return SECONDARY_CLIENT_STATE\n}\nasync function mutateNativeClientState(electronOperation: (api: ElectronAPI) => Promise<boolean> | undefined, command: string, args: Record<string, unknown> = {}): Promise<boolean> {\n if (!nativeAccessClaimed) return false\n return await dispatchNative((api) => api && electronOperation(api), command, args) ?? false\n}\nexport const saveNativeClientState = (snapshot: unknown): Promise<boolean> =>\n mutateNativeClientState((api) => api.saveClientState?.(accessToken, snapshot), \"client_state_save\", { snapshot })\nexport const commitNativeClientStatePartitions = (payload: NativeClientStatePartitionCommit): Promise<boolean> =>\n mutateNativeClientState((api) => api.commitClientStatePartitions?.(accessToken, payload), \"client_state_commit_partitions\", { payload })\nexport const loadNativeClientStatePartition = async (key: string): Promise<string | null> => {\n if (!nativeAccessClaimed) return null\n return await dispatchNative((api) => api?.loadClientStatePartition?.(accessToken, key), \"client_state_load_partition\", { key }) ?? null\n}\nexport const setNativeRestoreEnabled = (enabled: boolean): Promise<boolean> =>\n mutateNativeClientState((api) => api.setClientStateRestoreEnabled?.(accessToken, enabled), \"client_state_set_restore_enabled\", { enabled })\nexport const clearNativeClientState = (): Promise<boolean> =>\n mutateNativeClientState((api) => api.clearClientState?.(accessToken), \"client_state_clear\")\nfunction acknowledge(command: string, args: Record<string, unknown> = {}): Promise<void> {\n if (!isTauriHost() || !nativeAccessClaimed) return Promise.resolve()\n return invoke(command, { accessToken, ...args })\n}\nexport const acknowledgeNativeClientStateNavigationFlush = (generation: number) =>\n acknowledge(\"client_state_navigation_flushed\", { generation })\nexport const acknowledgeNativeClientStateRendererFlush = (generation: number) =>\n acknowledge(\"client_state_renderer_flushed\", { generation })\n","import type { Attachment, AttachmentSource } from \"../types/attachment\"\n\nexport type RestorableAttachmentSource =\n | { type: \"file\"; path: string; mime: string; data?: string }\n | { type: \"text\"; value: string }\n | { type: \"agent\"; name: string }\n | { type: \"symbol\"; path: string; name: string; kind: number; range: { start: Position; end: Position } }\n\ninterface Position {\n line: number\n char: number\n}\n\nexport interface RestorableAttachment {\n id: string\n type: Attachment[\"type\"]\n display: string\n url: string\n filename: string\n mediaType: string\n source: RestorableAttachmentSource\n}\nconst MAX_ID = 512\nconst MAX_DISPLAY = 1024\nconst MAX_PATH = 4096\nconst MAX_MIME = 256\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst isSafeKey = (value: string) =>\n value !== \"__proto__\" && value !== \"constructor\" && value !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, allowEmpty = false) {\n if (typeof value !== \"string\" || value.length > max) return\n if (!allowEmpty && value.trim().length === 0) return\n return value\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\n\nfunction validBase64(value: unknown): value is string {\n if (typeof value !== \"string\" || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) return false\n try {\n base64ToBytes(value)\n return true\n } catch {\n return false\n }\n}\n\nconst dataUrlPayload = (value: unknown): string | undefined => typeof value === \"string\"\n ? value.match(/^data:[^;,]+;base64,([A-Za-z0-9+/]*={0,2})$/)?.[1]\n : undefined\n\nfunction takeFileData(value: unknown, url: unknown): string | undefined {\n const raw = dataUrlPayload(url) ?? value\n const data = raw instanceof Uint8Array ? bytesToBase64(raw) : raw\n return validBase64(data) ? data : undefined\n}\n\nfunction takePosition(value: unknown): Position | undefined {\n if (!isRecord(value) || !Number.isSafeInteger(value.line) || Number(value.line) < 0) return\n if (!Number.isSafeInteger(value.char) || Number(value.char) < 0) return\n return { line: Number(value.line), char: Number(value.char) }\n}\n\nfunction normalizeSource(\n value: unknown,\n url: unknown,\n): RestorableAttachmentSource | undefined {\n if (!isRecord(value)) return\n if (value.type === \"text\") {\n return typeof value.value === \"string\" ? { type: \"text\", value: value.value } : undefined\n }\n if (value.type === \"agent\") {\n const name = takeString(value.name, MAX_DISPLAY)\n return name === undefined ? undefined : { type: \"agent\", name }\n }\n\n const path = takeString(value.path, MAX_PATH)\n if (value.type === \"file\") {\n const mime = takeString(value.mime, MAX_MIME)\n if (path === undefined || mime === undefined) return\n const rawData = dataUrlPayload(url) ?? value.data\n const data = takeFileData(value.data, url)\n if (rawData !== undefined && data === undefined) return\n return data === undefined ? { type: \"file\", path, mime } : { type: \"file\", path, mime, data }\n }\n if (value.type !== \"symbol\" || !isRecord(value.range)) return\n const name = takeString(value.name, MAX_DISPLAY)\n const start = takePosition(value.range.start)\n const end = takePosition(value.range.end)\n if (path === undefined || name === undefined || !Number.isSafeInteger(value.kind) || !start || !end) return\n return { type: \"symbol\", path, name, kind: Number(value.kind), range: { start, end } }\n}\n\nfunction normalizeAttachment(value: unknown): RestorableAttachment | undefined {\n if (!isRecord(value)) return\n if (![\"file\", \"text\", \"symbol\", \"agent\"].includes(String(value.type))) return\n\n const id = takeString(value.id, MAX_ID)\n const display = takeString(value.display, MAX_DISPLAY)\n const filename = takeString(value.filename, MAX_PATH)\n const mediaType = takeString(value.mediaType, MAX_MIME)\n const source = normalizeSource(value.source, value.url)\n const rawUrl = typeof value.url === \"string\" && !value.url.startsWith(\"data:\") ? value.url : \"\"\n const url = takeString(rawUrl, MAX_PATH, true)\n if (\n !id || !display || !filename || !mediaType || !source ||\n source.type !== value.type || url === undefined\n ) return\n\n return { id, type: value.type as Attachment[\"type\"], display, url, filename, mediaType, source }\n}\n\nexport function normalizeRestorableAttachmentRecord(\n value: unknown,\n drafts: Record<string, string>,\n prioritySessionIds: readonly string[] = [],\n): { attachments: Record<string, RestorableAttachment[]>; drafts: Record<string, string> } | null {\n if (!isRecord(value)) return null\n const attachments: Record<string, RestorableAttachment[]> = Object.create(null)\n const priority = [...new Set(prioritySessionIds)]\n const prioritySet = new Set(priority)\n const entries = [\n ...priority.flatMap((sessionId) => Object.prototype.hasOwnProperty.call(value, sessionId)\n ? [[sessionId, value[sessionId]] as const]\n : []),\n ...Object.entries(value).filter(([sessionId]) => !prioritySet.has(sessionId)),\n ]\n for (const [sessionId, rawAttachments] of entries) {\n if (\n !isSafeKey(sessionId) || !sessionId ||\n sessionId.length > MAX_ID || !Array.isArray(rawAttachments)\n ) continue\n const normalized: RestorableAttachment[] = []\n for (const raw of rawAttachments) {\n const attachment = normalizeAttachment(raw)\n if (attachment) normalized.push(attachment)\n }\n if (normalized.length) attachments[sessionId] = normalized\n }\n return { attachments, drafts: { ...drafts } }\n}\n\nexport function serializeDraftAttachments(\n drafts: Record<string, string>,\n attachments: Record<string, Attachment[]>,\n prioritySessionIds: readonly string[] = [],\n) {\n const normalized = normalizeRestorableAttachmentRecord(attachments, drafts, prioritySessionIds)\n if (!normalized || Object.entries(attachments).some(([sessionId, values]) =>\n values.length !== (normalized.attachments[sessionId]?.length ?? 0))) {\n throw new Error(\"Draft attachments could not be persisted safely\")\n }\n return normalized\n}\n\nexport function hydrateRestorableAttachment(value: RestorableAttachment): Attachment | null {\n let source: AttachmentSource\n let url = value.url\n if (value.source.type === \"file\") {\n try {\n const data = value.source.data === undefined ? undefined : base64ToBytes(value.source.data)\n source = { type: \"file\", path: value.source.path, mime: value.source.mime, data }\n if (!url && value.source.data) url = `data:${value.source.mime};base64,${value.source.data}`\n } catch {\n return null\n }\n } else {\n source = value.source\n if (value.source.type === \"text\" && !url) {\n url = `data:text/plain;base64,${bytesToBase64(new TextEncoder().encode(value.source.value))}`\n }\n }\n return { ...value, url, source }\n}\n","import type { OutlineCheckpoint, OutlineEntry } from \"../../../server/src/opencode/session-pruning/navigation-contract\"\n\nexport interface PersistedOutline {\n format: 1\n directory: string\n projectID: string\n revert?: string\n entries: OutlineEntry[]\n checkpoints: OutlineCheckpoint[]\n}\nexport interface OutlineBudget { bytes: number; entries: number; indexes: number }\nexport const outlineBudget = (): OutlineBudget => ({ bytes: 16 * 1024 * 1024, entries: 200_000, indexes: 16 })\nconst verified = new WeakMap<object, number>()\nconst types = new Set([\"user\", \"assistant\", \"system\", \"synthetic\", \"skill\", \"shell\", \"compaction\", \"idle\", \"agent-switched\", \"model-switched\", \"location-switched\"])\nconst record = (value: unknown): value is Record<string, unknown> => !!value && typeof value === \"object\" && !Array.isArray(value)\nconst string = (value: unknown, max: number): value is string => typeof value === \"string\" && value.length > 0 && value.length <= max\nconst integer = (value: unknown, min = 0): value is number => Number.isSafeInteger(value) && Number(value) >= min\n\nexport function hasCompleteOutlineToolMetadata(value: PersistedOutline): boolean {\n return value.entries.every(entry => !entry.tools || entry.toolName !== undefined)\n}\n\n// Frozen normalized values are reused by scroll/draft captures without repeatedly\n// traversing/hashing thousands of index entries. Raw storage is always validated.\nexport function normalizePersistedOutline(value: unknown): PersistedOutline | undefined {\n if (!record(value)) return\n if (verified.has(value)) return value as unknown as PersistedOutline\n if (value.format !== 1 || !string(value.directory, 4096) || !string(value.projectID, 256)\n || (value.revert !== undefined && !string(value.revert, 256))\n || !Array.isArray(value.entries) || value.entries.length > 200_000\n || !Array.isArray(value.checkpoints) || value.checkpoints.length > 512) return\n const entries: OutlineEntry[] = [], checkpoints: OutlineCheckpoint[] = []\n const ids = new Set<string>()\n let seq = -1, through = -1\n for (const entry of value.entries) {\n if (!record(entry) || !string(entry.id, 256) || ids.has(entry.id) || !integer(entry.seq) || entry.seq <= seq\n || typeof entry.type !== \"string\" || !types.has(entry.type) || !integer(entry.tools) || !integer(entry.reasoning)\n || (entry.toolName !== undefined && (typeof entry.toolName !== \"string\" || entry.toolName.length > 256))) return\n ids.add(entry.id); seq = entry.seq\n entries.push(Object.freeze({ id: entry.id, seq, type: entry.type as OutlineEntry[\"type\"], tools: entry.tools, reasoning: entry.reasoning,\n ...(entry.toolName === undefined ? {} : { toolName: entry.toolName }) }))\n }\n for (const checkpoint of value.checkpoints) {\n if (!record(checkpoint) || checkpoint.after !== through || !integer(checkpoint.through) || checkpoint.through <= through\n || typeof checkpoint.digest !== \"string\" || !/^[a-f0-9]{64}$/.test(checkpoint.digest)) return\n checkpoints.push(Object.freeze({ after: through, through: checkpoint.through, digest: checkpoint.digest }))\n through = checkpoint.through\n }\n if (!checkpoints.length || seq > through) return\n const result: PersistedOutline = { format: 1, directory: value.directory, projectID: value.projectID,\n ...(value.revert === undefined ? {} : { revert: value.revert as string }), entries, checkpoints }\n const bytes = new TextEncoder().encode(JSON.stringify(result)).byteLength\n if (bytes > 16 * 1024 * 1024) return\n Object.freeze(entries); Object.freeze(checkpoints); Object.freeze(result)\n verified.set(result, bytes)\n return result\n}\n\nexport function normalizeOutlineIndexes(value: unknown, budget: OutlineBudget, priority?: string): Record<string, PersistedOutline> | undefined {\n if (!record(value)) return\n const result: Record<string, PersistedOutline> = Object.create(null)\n const keys = [priority, ...Object.keys(value).filter(id => id !== priority)].filter((id): id is string => Boolean(id))\n for (const id of keys) {\n if (!budget.indexes || !budget.entries || !budget.bytes) break\n if (!string(id, 256) || [\"__proto__\", \"constructor\", \"prototype\"].includes(id)) continue\n const index = normalizePersistedOutline(value[id])\n if (!index) continue\n const bytes = verified.get(index)!\n if (bytes > budget.bytes || index.entries.length > budget.entries) continue\n result[id] = index\n budget.bytes -= bytes; budget.entries -= index.entries.length; budget.indexes--\n }\n return Object.keys(result).length ? result : undefined\n}\n","import type { ScrollSnapshot } from \"./message-v2/types\"\nimport { normalizeRestorableAttachmentRecord, type RestorableAttachment } from \"./client-state-attachments-codec\"\nimport type { PersistedGenerationRecovery } from \"./session-generation-recovery\"\nimport { normalizeOutlineIndexes, outlineBudget, type OutlineBudget, type PersistedOutline } from \"./session-outline-persistence\"\n\nexport interface RestorableWorkspaceTabState {\n kind: \"workspace\"; folder: string; occurrence?: number; projectName?: string; binaryPath?: string\n activeParentSessionId?: string; activeSessionId?: string\n drafts: Record<string, string>; attachments: Record<string, RestorableAttachment[]>\n scrollSnapshots: Record<string, ScrollSnapshot>; unseenIdleSince: Record<string, number>\n generationRecovery: Record<string, PersistedGenerationRecovery>\n expandedSessionIds?: string[]\n outlineIndexes?: Record<string, PersistedOutline>\n}\n\nexport interface RestorableSidecarTabState { kind: \"sidecar\"; sidecarId: string }\nexport type RestorableTabState = RestorableWorkspaceTabState | RestorableSidecarTabState\nexport interface RestorableSessionState { tabs: RestorableTabState[]; activeTabIndex: number; homeActive?: boolean }\nexport interface ClientSnapshotV1 {\n version: 1; revision: number; savedAt: number\n layout: Record<string, string>; session: RestorableSessionState | null\n}\n\nconst MAX_TABS = 32, MAX_LAYOUT_ENTRIES = 64, MAX_DRAFTS = 24, MAX_SCROLLS_PER_TAB = 96\nconst MAX_IDLE_MARKERS = 256, MAX_RECOVERY = 256, MAX_EXPANDED = 256, MAX_KEY = 256, MAX_PATH = 4096, MAX_ID = 512\nconst MAX_LAYOUT_VALUE = 4096, MAX_DRAFT = 32 * 1024, MAX_ANCHOR_KEY = 1024\nconst MAX_STRINGS = 96 * 1024, MAX_SCROLLS = 256, MAX_NEWER_CURSORS = 32, MAX_WINDOW_CURSOR = 1024\nconst NO_SESSION_DRAFT_SESSION_ID = \"__no_session_draft__\"\n\ninterface StringBudget { remaining: number; scrollSnapshotsRemaining: number; outlines: OutlineBudget }\n\nfunction createBudget(): StringBudget {\n return { remaining: MAX_STRINGS, scrollSnapshotsRemaining: MAX_SCROLLS, outlines: outlineBudget() }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst safeKey = (key: string) => key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\"\n\nfunction takeString(value: unknown, max: number, budget: StringBudget, allowEmpty = false): string | undefined {\n if (typeof value !== \"string\" || value.length > max || value.length > budget.remaining) return\n if (!allowEmpty && value.trim().length === 0) return\n budget.remaining -= value.length\n return value\n}\n\nconst takeNumber = (value: unknown, min: number, max: number): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= min && value <= max ? value : undefined\n\nfunction normalizeRecord<T>(\n value: unknown, max: number, budget: StringBudget,\n normalize: (value: unknown) => T | undefined,\n accept: (value: unknown) => boolean = () => true,\n accepted: () => void = () => {},\n priorityKeys: readonly string[] = [],\n): Record<string, T> | null {\n if (!isRecord(value)) return null\n const result: Record<string, T> = Object.create(null)\n let count = 0\n const priorities = [...new Set(priorityKeys)]\n const prioritySet = new Set(priorities)\n const entries = [\n ...priorities.flatMap((key) => Object.prototype.hasOwnProperty.call(value, key) ? [[key, value[key]] as const] : []),\n ...Object.entries(value).filter(([key]) => !prioritySet.has(key)),\n ]\n for (const [rawKey, rawValue] of entries) {\n if (count >= max) break\n if (!safeKey(rawKey) || !accept(rawValue)) continue\n const key = takeString(rawKey, MAX_KEY, budget)\n const entry = normalize(rawValue)\n if (key === undefined || entry === undefined) continue\n result[key] = entry\n count += 1\n accepted()\n }\n return result\n}\n\nfunction normalizeStringRecord(\n value: unknown,\n max: number,\n valueMax: number,\n budget: StringBudget,\n priorityKeys: readonly string[] = [],\n) {\n return normalizeRecord(value, max, budget, (entry) => takeString(entry, valueMax, budget, true),\n undefined, undefined, priorityKeys)\n}\n\nfunction normalizeScrollSnapshot(value: unknown, budget: StringBudget): ScrollSnapshot | undefined {\n if (!isRecord(value)) return\n const scrollTop = takeNumber(value.scrollTop, 0, 1_000_000_000)\n const updatedAt = takeNumber(value.updatedAt, 0, Number.MAX_SAFE_INTEGER)\n if (scrollTop === undefined || updatedAt === undefined || typeof value.atBottom !== \"boolean\") return\n const result: ScrollSnapshot = { scrollTop, atBottom: value.atBottom, updatedAt }\n const scrollRatio = takeNumber(value.scrollRatio, 0, 1)\n const maxScrollTop = takeNumber(value.maxScrollTop, 0, 1_000_000_000)\n const anchorOffset = takeNumber(value.anchorOffset, -1_000_000, 1_000_000)\n const anchorKey = value.anchorKey === undefined ? undefined : takeString(value.anchorKey, MAX_ANCHOR_KEY, budget)\n if (scrollRatio !== undefined) result.scrollRatio = scrollRatio\n if (maxScrollTop !== undefined) result.maxScrollTop = maxScrollTop\n if (anchorKey !== undefined) result.anchorKey = anchorKey\n if (anchorOffset !== undefined) result.anchorOffset = anchorOffset\n if (value.followModeType === \"following\" || value.followModeType === \"escaped\") result.followModeType = value.followModeType\n if (typeof value.windowIsLatest === \"boolean\") result.windowIsLatest = value.windowIsLatest\n const windowCursor = value.windowCursor === undefined ? undefined : takeString(value.windowCursor, MAX_WINDOW_CURSOR, budget)\n if (windowCursor !== undefined) result.windowCursor = windowCursor\n if (Array.isArray(value.newerCursors)) {\n const newerCursors: Array<string | null> = []\n for (const entry of value.newerCursors.slice(-MAX_NEWER_CURSORS)) {\n if (entry === null || entry === \"\") {\n newerCursors.push(null)\n continue\n }\n const cursor = takeString(entry, MAX_WINDOW_CURSOR, budget)\n if (cursor === undefined) continue\n newerCursors.push(cursor)\n }\n if (newerCursors.length > 0) result.newerCursors = newerCursors\n }\n return result\n}\n\nfunction normalizeExpandedSessionIds(value: unknown, budget: StringBudget): string[] | null {\n if (!Array.isArray(value)) return null\n const result: string[] = []\n const seen = new Set<string>()\n for (const entry of value.slice(0, MAX_EXPANDED)) {\n if (typeof entry !== \"string\" || seen.has(entry)) continue\n const id = takeString(entry, MAX_ID, budget)\n if (id === undefined) continue\n seen.add(id)\n result.push(id)\n }\n return result\n}\n\nfunction normalizeWorkspaceTab(\n value: Record<string, unknown>,\n identity: WorkspaceIdentity,\n budget: StringBudget,\n _prioritizeDrafts: boolean,\n): RestorableWorkspaceTabState | null {\n const reservedDrafts = identity.priorityDrafts\n const remainingDrafts = Object.fromEntries(Object.entries(value.drafts ?? {})\n .filter(([id]) => !Object.prototype.hasOwnProperty.call(reservedDrafts, id)))\n const additionalDrafts = normalizeStringRecord(\n remainingDrafts,\n Math.max(0, MAX_DRAFTS - Object.keys(reservedDrafts).length),\n MAX_DRAFT,\n budget,\n )\n const drafts = additionalDrafts ? { ...reservedDrafts, ...additionalDrafts } : null\n const scrollLimit = Math.min(MAX_SCROLLS_PER_TAB, budget.scrollSnapshotsRemaining)\n const scrollSnapshots = normalizeRecord(value.scrollSnapshots ?? {}, scrollLimit, budget,\n (entry) => normalizeScrollSnapshot(entry, budget), undefined,\n () => { budget.scrollSnapshotsRemaining -= 1 })\n const unseenIdleSince = normalizeRecord(value.unseenIdleSince ?? {}, MAX_IDLE_MARKERS, budget,\n (entry) => takeNumber(entry, 0, Number.MAX_SAFE_INTEGER))\n const generationRecovery = normalizeRecord<PersistedGenerationRecovery>(\n value.generationRecovery ?? {}, MAX_RECOVERY, budget,\n (entry) => entry as PersistedGenerationRecovery,\n (entry) => entry === \"working\" || entry === \"interrupted\")\n const expandedSessionIds = value.expandedSessionIds === undefined\n ? undefined\n : normalizeExpandedSessionIds(value.expandedSessionIds, budget)\n if (!drafts || !scrollSnapshots || !unseenIdleSince || !generationRecovery || expandedSessionIds === null) return null\n const remainingAttachments = Object.fromEntries(Object.entries(value.attachments ?? {})\n .filter(([id]) => !identity.prioritySessionIds.includes(id)))\n const attachmentResult = normalizeRestorableAttachmentRecord(\n remainingAttachments, drafts,\n )\n if (!attachmentResult) return null\n\n const result: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: identity.folder,\n drafts: attachmentResult.drafts,\n attachments: { ...identity.priorityAttachments, ...attachmentResult.attachments },\n scrollSnapshots, unseenIdleSince, generationRecovery,\n }\n if (expandedSessionIds !== undefined) result.expandedSessionIds = expandedSessionIds\n const outlineIndexes = normalizeOutlineIndexes(value.outlineIndexes, budget.outlines, identity.activeSessionId)\n if (outlineIndexes) result.outlineIndexes = outlineIndexes\n if (Number.isInteger(value.occurrence) && Number(value.occurrence) >= 0 && Number(value.occurrence) < MAX_TABS) {\n result.occurrence = Number(value.occurrence)\n }\n const projectName = value.projectName === undefined ? undefined : takeString(value.projectName, MAX_PATH, budget)\n const binaryPath = value.binaryPath === undefined ? undefined : takeString(value.binaryPath, MAX_PATH, budget)\n if (projectName !== undefined) result.projectName = projectName\n if (binaryPath !== undefined) result.binaryPath = binaryPath\n if (identity.activeParentSessionId !== undefined) result.activeParentSessionId = identity.activeParentSessionId\n if (identity.activeSessionId !== undefined) result.activeSessionId = identity.activeSessionId\n return result\n}\n\ninterface WorkspaceIdentity {\n kind: \"workspace\"; value: Record<string, unknown>; folder: string\n activeParentSessionId?: string; activeSessionId?: string\n prioritySessionIds: string[]; priorityDrafts: Record<string, string>\n priorityAttachments: Record<string, RestorableAttachment[]>\n}\ntype TabIdentity = WorkspaceIdentity | RestorableSidecarTabState\n\nfunction normalizeIdentity(value: unknown, budget: StringBudget): TabIdentity | null {\n if (!isRecord(value)) return null\n const kind = value.kind ?? value.type\n if (kind === \"sidecar\") {\n const sidecarId = takeString(value.sidecarId, MAX_ID, budget)\n return sidecarId === undefined ? null : { kind, sidecarId }\n }\n if (kind !== \"workspace\" && kind !== \"instance\") return null\n if (![\"drafts\", \"attachments\", \"scrollSnapshots\", \"unseenIdleSince\", \"generationRecovery\"]\n .every((key) => isRecord(value[key] ?? {}))) return null\n const folder = takeString(value.folder, MAX_PATH, budget)\n if (folder === undefined) return null\n const activeParentSessionId = value.activeParentSessionId === undefined ? undefined\n : takeString(value.activeParentSessionId, MAX_ID, budget)\n const activeSessionId = value.activeSessionId === undefined ? undefined : takeString(value.activeSessionId, MAX_ID, budget)\n const prioritySessionIds = [activeSessionId, NO_SESSION_DRAFT_SESSION_ID]\n .filter((id): id is string => Boolean(id))\n return {\n kind: \"workspace\", value, folder, activeParentSessionId, activeSessionId,\n prioritySessionIds, priorityDrafts: Object.create(null), priorityAttachments: Object.create(null),\n }\n}\n\nfunction reservePriorityDrafts(identity: WorkspaceIdentity, budget: StringBudget): void {\n const drafts = identity.value.drafts ?? {}\n if (!isRecord(drafts)) return\n for (const rawKey of identity.prioritySessionIds) {\n if (!safeKey(rawKey) || !Object.prototype.hasOwnProperty.call(drafts, rawKey)) continue\n const remaining = budget.remaining\n const key = takeString(rawKey, MAX_KEY, budget)\n const draft = takeString(drafts[rawKey], MAX_DRAFT, budget, true)\n if (key === undefined || draft === undefined) {\n budget.remaining = remaining\n continue\n }\n identity.priorityDrafts[key] = draft\n }\n const attachments = identity.value.attachments ?? {}\n if (!isRecord(attachments)) return\n const priorityAttachments = Object.fromEntries(identity.prioritySessionIds\n .filter((id) => Object.prototype.hasOwnProperty.call(attachments, id))\n .map((id) => [id, attachments[id]]))\n const result = normalizeRestorableAttachmentRecord(\n priorityAttachments,\n identity.priorityDrafts,\n identity.prioritySessionIds,\n )\n if (!result) return\n identity.priorityDrafts = result.drafts\n identity.priorityAttachments = result.attachments\n}\n\nexport function normalizeRestorableSession(value: unknown): RestorableSessionState | null {\n return normalizeSession(value, createBudget())\n}\n\nfunction normalizeSession(value: unknown, budget: StringBudget): RestorableSessionState | null {\n if (!isRecord(value) || !Array.isArray(value.tabs) || !Number.isInteger(value.activeTabIndex)) return null\n const requested = Number(value.activeTabIndex)\n const rawTabs = value.tabs.slice(0, MAX_TABS)\n const identityByIndex = new Map<number, TabIdentity>()\n const normalizedByIndex = new Map<number, RestorableTabState>()\n const normalizeIdentityAt = (originalIndex: number) => {\n const identity = normalizeIdentity(rawTabs[originalIndex], budget)\n if (!identity) return\n identityByIndex.set(originalIndex, identity)\n }\n const normalizeTabAt = (originalIndex: number, prioritizeDrafts: boolean) => {\n const identity = identityByIndex.get(originalIndex)\n if (!identity) return\n const tab = identity.kind === \"sidecar\"\n ? identity\n : normalizeWorkspaceTab(identity.value, identity, budget, prioritizeDrafts)\n if (tab) normalizedByIndex.set(originalIndex, tab)\n }\n rawTabs.forEach((_tab, index) => normalizeIdentityAt(index))\n const priorityOrder = [requested, ...rawTabs.map((_tab, index) => index).filter((index) => index !== requested)]\n for (const index of priorityOrder) {\n const identity = identityByIndex.get(index)\n if (identity?.kind === \"workspace\") reservePriorityDrafts(identity, budget)\n }\n if (rawTabs[requested] !== undefined) normalizeTabAt(requested, true)\n rawTabs.forEach((_tab, index) => {\n if (index !== requested) normalizeTabAt(index, true)\n })\n const identities = rawTabs.flatMap((_tab, originalIndex) => {\n const identity = identityByIndex.get(originalIndex)\n return identity ? [{ originalIndex, identity }] : []\n })\n const normalized = identities.flatMap(({ originalIndex }) => {\n const tab = normalizedByIndex.get(originalIndex)\n return tab ? [{ originalIndex, tab }] : []\n })\n if (value.tabs.length && !normalized.length) return null\n\n const tabs = normalized.map(({ tab }) => tab)\n const surviving = normalized.findIndex(({ originalIndex }) => originalIndex === requested)\n const next = normalized.findIndex(({ originalIndex }) => originalIndex > requested)\n const activeTabIndex = !tabs.length ? -1 : surviving >= 0 ? surviving : next >= 0 ? next : tabs.length - 1\n return { tabs, activeTabIndex, ...(value.homeActive === true ? { homeActive: true } : {}) }\n}\n\nexport function decodeClientSnapshot(value: unknown): ClientSnapshotV1 | null {\n if (!isRecord(value) || (value.version !== undefined && value.version !== 1)\n || !Number.isSafeInteger(value.revision) || Number(value.revision) < 0) return null\n const savedAt = takeNumber(value.savedAt, 0, Number.MAX_SAFE_INTEGER)\n if (savedAt === undefined) return null\n const budget = createBudget()\n const session = value.session === null ? null : normalizeSession(value.session, budget)\n if (value.session !== null && !session) return null\n const layout = normalizeStringRecord(value.layout, MAX_LAYOUT_ENTRIES, MAX_LAYOUT_VALUE, budget)\n return layout ? { version: 1, revision: Number(value.revision), savedAt, layout, session } : null\n}\n\nexport function isFutureClientSnapshot(value: unknown): boolean {\n return isRecord(value) && typeof value.version === \"number\" && Number.isInteger(value.version) && value.version > 2\n}\n","const encoder = new TextEncoder()\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson)\n if (typeof value !== \"object\" || value === null) return value\n return Object.fromEntries(Object.keys(value).sort().map(key => [key, sortJson((value as Record<string, unknown>)[key])]))\n}\nexport function canonicalJson(value: unknown): string {\n const serialized = JSON.stringify(sortJson(value))\n if (serialized === undefined) throw new TypeError(\"Client state partition must be JSON-serializable\")\n return serialized\n}\nexport async function sha256(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", encoder.encode(value))\n return Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, \"0\")).join(\"\")\n}\n","import { canonicalJson, sha256 } from \"./client-state-partition-json\"\nimport { normalizePersistedOutline, type PersistedOutline } from \"./session-outline-persistence\"\n\nconst encoded = new WeakMap<PersistedOutline, Promise<{ descriptor: object; partitions: Record<string, string> }>>()\nexport function encodeOutlinePartitions(value: PersistedOutline) {\n let pending = encoded.get(value)\n if (!pending) {\n pending = (async () => {\n const partitions: Record<string, string> = Object.create(null), entryPartitions: string[] = []\n // Even maximally escaped 256-character IDs fit the native 1 MiB leaf limit.\n for (let offset = 0; offset < value.entries.length; offset += 512) {\n const text = canonicalJson({ format: 1, index: offset / 512, entries: value.entries.slice(offset, offset + 512) })\n const key = await sha256(text)\n partitions[key] = text; entryPartitions.push(key)\n }\n const { entries: _, ...metadata } = value\n return { descriptor: { ...metadata, entryPartitions }, partitions }\n })()\n // Only normalized frozen indexes are memoized across frequent draft/scroll captures.\n if (Object.isFrozen(value)) encoded.set(value, pending)\n }\n return pending\n}\n\nexport async function decodeOutlinePartitions(value: unknown, allowed: ReadonlySet<string>, referenced: Set<string>,\n load: (key: string) => Promise<Record<string, unknown> | null>): Promise<PersistedOutline | undefined> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return\n const descriptor = value as Record<string, unknown>, keys = descriptor.entryPartitions\n if (!Array.isArray(keys) || keys.length > 391 || new Set(keys).size !== keys.length\n || !keys.every(key => typeof key === \"string\" && /^[a-f0-9]{64}$/.test(key) && allowed.has(key))) return\n keys.forEach(key => referenced.add(key))\n const entries: unknown[] = []\n for (let index = 0; index < keys.length; index++) {\n const chunk = await load(keys[index]).catch(() => null)\n if (!chunk || chunk.format !== 1 || chunk.index !== index || !Array.isArray(chunk.entries)\n || chunk.entries.length > 512 || (index < keys.length - 1 && chunk.entries.length !== 512)) return\n entries.push(...chunk.entries)\n }\n return normalizePersistedOutline({ ...descriptor, entries })\n}\n","import { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport type { RestorableAttachment } from \"./client-state-attachments-codec\"\nimport { canonicalJson, sha256 } from \"./client-state-partition-json\"\nexport { canonicalJson, sha256 } from \"./client-state-partition-json\"\nimport { encodeOutlinePartitions, decodeOutlinePartitions } from \"./client-state-outline-partitions\"\n\nconst MAX_PARTITION_BYTES = 1024 * 1024\nconst MAX_ROOT_BYTES = 1024 * 1024\nconst MAX_NATIVE_PARTITIONS = 4096\nconst MAX_NATIVE_COMMIT_BYTES = 256 * 1024 * 1024\nconst MAX_SESSION_ID = 512\nconst BLOB_CHUNK_CHARACTERS = 768 * 1024\nconst MAX_BLOB_CHUNKS = 256\nconst MAX_BLOB_BASE64_CHARACTERS = BLOB_CHUNK_CHARACTERS * MAX_BLOB_CHUNKS\nconst PARTITION_KEY = /^[0-9a-f]{64}$/\nconst ROOT_KEYS = [\"layout\", \"partitionKeys\", \"revision\", \"savedAt\", \"sessionPartition\", \"version\"]\nconst UNSAFE_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst encoder = new TextEncoder()\n\nexport interface ClientSnapshotV2 {\n version: 2\n revision: number\n savedAt: number\n layout: Record<string, string>\n sessionPartition: string\n partitionKeys: string[]\n extensions?: [\"outline-index-v1\"]\n}\n\nexport interface EncodedClientSnapshotV2 {\n root: ClientSnapshotV2\n partitions: Record<string, string>\n partitionKeys: string[]\n}\n\ninterface SessionDocument {\n format: 2\n draft?: string\n attachments?: unknown[]\n scrollSnapshot?: RestorableWorkspaceTabState[\"scrollSnapshots\"][string]\n unseenIdleSince?: number\n generationRecovery?: RestorableWorkspaceTabState[\"generationRecovery\"][string]\n outline?: object\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key)\nconst isSafePersistedSessionId = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= MAX_SESSION_ID\n && value.trim().length > 0 && !UNSAFE_KEYS.has(value)\n\ntype AddPartition = (value: unknown) => Promise<string>\n\nfunction isPartitionKeyArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((key, index) =>\n typeof key === \"string\" && PARTITION_KEY.test(key) && (index === 0 || value[index - 1]! < key))\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, required: readonly string[], optional: readonly string[] = []): boolean {\n const allowed = new Set([...required, ...optional])\n return required.every((key) => hasOwn(value, key)) && Object.keys(value).every((key) => allowed.has(key))\n}\n\nfunction canonicalEquals(left: unknown, right: unknown): boolean {\n try {\n return canonicalJson(left) === canonicalJson(right)\n } catch {\n return false\n }\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\"\n for (let index = 0; index < bytes.length; index += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000))\n }\n return btoa(binary)\n}\n\nconst base64ToBytes = (value: string) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))\nconst validBase64 = (value: unknown): value is string => typeof value === \"string\"\n && value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value)\n\nasync function addBlob(data: string, addPartition: AddPartition): Promise<string[]> {\n if (!validBase64(data) || data.length > MAX_BLOB_BASE64_CHARACTERS) {\n throw new Error(\"Client state attachment exceeds the 192 MiB encoded blob limit\")\n }\n const keys: string[] = []\n for (let offset = 0, index = 0; offset < data.length || offset === 0; offset += BLOB_CHUNK_CHARACTERS, index += 1) {\n keys.push(await addPartition({ format: 2, index, data: data.slice(offset, offset + BLOB_CHUNK_CHARACTERS) }))\n }\n return keys\n}\n\nasync function encodeAttachments(attachments: RestorableAttachment[], addPartition: AddPartition): Promise<unknown[]> {\n return Promise.all(attachments.map(async (attachment) => {\n let source: Record<string, unknown>\n if (attachment.source.type === \"file\") {\n source = { type: \"file\", path: attachment.source.path, mime: attachment.source.mime }\n if (attachment.source.data !== undefined) source.dataPartitions = await addBlob(attachment.source.data, addPartition)\n } else if (attachment.source.type === \"text\") {\n source = {\n type: \"text\",\n valuePartitions: await addBlob(bytesToBase64(encoder.encode(attachment.source.value)), addPartition),\n }\n } else source = attachment.source\n return { ...attachment, source }\n }))\n}\n\nasync function encodeSessionGraph(session: RestorableSessionState | null) {\n const generated: Record<string, string> = Object.create(null)\n const addPartition = async (value: unknown) => {\n const partition = canonicalJson(value)\n if (encoder.encode(partition).byteLength > MAX_PARTITION_BYTES) {\n throw new Error(\"Client state partition exceeds the native size limit\")\n }\n const key = await sha256(partition)\n generated[key] = partition\n return key\n }\n\n const encodedSession = session === null ? null : {\n tabs: await Promise.all(session.tabs.map(async (tab) => {\n if (tab.kind === \"sidecar\") return { kind: tab.kind, sidecarId: tab.sidecarId }\n\n const sessionIds = new Set([\n ...Object.keys(tab.drafts),\n ...Object.keys(tab.attachments),\n ...Object.keys(tab.scrollSnapshots),\n ...Object.keys(tab.unseenIdleSince),\n ...Object.keys(tab.generationRecovery),\n ...Object.keys(tab.outlineIndexes ?? {}),\n ])\n const sessions: Record<string, { documentPartition: string; partitionKeys: string[] }> = Object.create(null)\n for (const sessionId of [...sessionIds].sort()) {\n const document: SessionDocument = { format: 2 }\n if (hasOwn(tab.drafts, sessionId)) document.draft = tab.drafts[sessionId]\n if (hasOwn(tab.attachments, sessionId)) {\n document.attachments = await encodeAttachments(tab.attachments[sessionId]!, addPartition)\n }\n if (hasOwn(tab.scrollSnapshots, sessionId)) document.scrollSnapshot = tab.scrollSnapshots[sessionId]\n if (hasOwn(tab.unseenIdleSince, sessionId)) document.unseenIdleSince = tab.unseenIdleSince[sessionId]\n if (hasOwn(tab.generationRecovery, sessionId)) document.generationRecovery = tab.generationRecovery[sessionId]\n const outline = tab.outlineIndexes?.[sessionId]\n const index = outline ? await encodeOutlinePartitions(outline) : undefined\n if (index) { document.outline = index.descriptor; Object.assign(generated, index.partitions) }\n const documentPartition = await addPartition(document)\n const attachmentPartitions = (document.attachments ?? []).flatMap((attachment) => {\n if (!isRecord(attachment) || !isRecord(attachment.source)) return []\n const keys = attachment.source.dataPartitions ?? attachment.source.valuePartitions\n return Array.isArray(keys) ? keys.filter((key): key is string => typeof key === \"string\") : []\n })\n sessions[sessionId] = {\n documentPartition,\n partitionKeys: [...new Set([documentPartition, ...attachmentPartitions, ...Object.keys(index?.partitions ?? {})])].sort(),\n }\n }\n\n const workspace: Record<string, unknown> = { format: 2, sessions }\n if (tab.activeParentSessionId !== undefined) workspace.activeParentSessionId = tab.activeParentSessionId\n if (tab.activeSessionId !== undefined) workspace.activeSessionId = tab.activeSessionId\n if (tab.expandedSessionIds !== undefined) workspace.expandedSessionIds = tab.expandedSessionIds\n const shell: Record<string, unknown> = {\n kind: tab.kind,\n folder: tab.folder,\n workspacePartition: await addPartition(workspace),\n }\n if (tab.occurrence !== undefined) shell.occurrence = tab.occurrence\n if (tab.projectName !== undefined) shell.projectName = tab.projectName\n if (tab.binaryPath !== undefined) shell.binaryPath = tab.binaryPath\n return shell\n })),\n activeTabIndex: session.activeTabIndex,\n ...(session.homeActive !== undefined ? { homeActive: session.homeActive } : {}),\n }\n const sessionPartition = await addPartition({ format: 2, session: encodedSession })\n const partitionKeys = Object.keys(generated).sort()\n return {\n sessionPartition,\n partitionKeys,\n partitions: Object.fromEntries(partitionKeys.map((key) => [key, generated[key]!])),\n }\n}\n\nexport async function encodeClientSnapshotV2(snapshot: ClientSnapshotV1): Promise<EncodedClientSnapshotV2> {\n const graph = await encodeSessionGraph(snapshot.session)\n return {\n root: {\n version: 2,\n revision: snapshot.revision,\n savedAt: snapshot.savedAt,\n layout: snapshot.layout,\n sessionPartition: graph.sessionPartition,\n partitionKeys: graph.partitionKeys,\n ...(snapshot.session?.tabs.some(tab => tab.kind === \"workspace\" && Object.keys(tab.outlineIndexes ?? {}).length)\n ? { extensions: [\"outline-index-v1\"] as [\"outline-index-v1\"] } : {}),\n },\n partitions: graph.partitions,\n partitionKeys: graph.partitionKeys,\n }\n}\n\nexport function canCommitClientSnapshotV2(encoded: EncodedClientSnapshotV2): boolean {\n if (encoded.partitionKeys.length > MAX_NATIVE_PARTITIONS) return false\n const root = JSON.stringify(encoded.root)\n if (root.length > MAX_ROOT_BYTES) return false\n let commitBytes = encoder.encode(root).byteLength\n if (commitBytes > MAX_ROOT_BYTES) return false\n for (const key in encoded.partitions) {\n if (!hasOwn(encoded.partitions, key)) continue\n const partition = encoded.partitions[key]!\n if (partition.length > MAX_PARTITION_BYTES || partition.length > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n const partitionBytes = encoder.encode(partition).byteLength\n if (partitionBytes > MAX_PARTITION_BYTES || partitionBytes > MAX_NATIVE_COMMIT_BYTES - commitBytes) return false\n commitBytes += partitionBytes\n }\n return true\n}\n\nfunction decodeRoot(value: unknown): { root: ClientSnapshotV1; partitionKey: string; partitionKeys: string[] } | null {\n if (!isRecord(value) || value.version !== 2 || typeof value.sessionPartition !== \"string\"\n || !PARTITION_KEY.test(value.sessionPartition)\n || !isPartitionKeyArray(value.partitionKeys)\n || !value.partitionKeys.includes(value.sessionPartition)\n || Object.keys(value).sort().join(\"\\0\") !== [...ROOT_KEYS, ...(value.extensions === undefined ? [] : [\"extensions\"])].sort().join(\"\\0\")\n || (value.extensions !== undefined && !canonicalEquals(value.extensions, [\"outline-index-v1\"]))) return null\n let serialized: string\n try {\n serialized = JSON.stringify(value)\n } catch {\n return null\n }\n if (encoder.encode(serialized).byteLength > MAX_ROOT_BYTES) return null\n const root = decodeClientSnapshot({ ...value, version: 1, session: null })\n if (!root || !canonicalEquals(value, {\n version: 2,\n revision: root.revision,\n savedAt: root.savedAt,\n layout: root.layout,\n sessionPartition: value.sessionPartition,\n partitionKeys: value.partitionKeys,\n ...(value.extensions === undefined ? {} : { extensions: value.extensions }),\n })) return null\n return { root, partitionKey: value.sessionPartition, partitionKeys: value.partitionKeys }\n}\n\nfunction parseJson(value: string): { value: unknown } | null {\n try {\n return { value: JSON.parse(value) as unknown }\n } catch {\n return null\n }\n}\n\nasync function decodeGraph(\n manifest: Record<string, unknown>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<RestorableSessionState | null | undefined> {\n if (!hasExactKeys(manifest, [\"format\", \"session\"]) || canonicalJson(manifest) !== loaded.get(rootKey)) return\n if (manifest.session === null) {\n const reencoded = await encodeSessionGraph(null)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? null : undefined\n }\n if (!isRecord(manifest.session)\n || !hasExactKeys(manifest.session, [\"tabs\", \"activeTabIndex\"], [\"homeActive\"])\n || !Array.isArray(manifest.session.tabs)) return\n\n const loadCanonical = async (key: unknown): Promise<Record<string, unknown> | null> => {\n if (typeof key !== \"string\" || !PARTITION_KEY.test(key)) return null\n let partition = loaded.get(key)\n if (partition === undefined) {\n partition = await loadPartition(key) ?? undefined\n if (partition === undefined || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== key) return null\n loaded.set(key, partition)\n }\n const parsed = parseJson(partition)\n return parsed && isRecord(parsed.value) && canonicalJson(parsed.value) === partition ? parsed.value : null\n }\n\n const sameKeys = (left: Iterable<string>, right: readonly string[]) => {\n const sorted = [...new Set(left)].sort()\n return sorted.length === right.length && sorted.every((key, index) => key === right[index])\n }\n const loadBlob = async (keys: unknown, allowed: ReadonlySet<string>, referenced: Set<string>) => {\n if (!Array.isArray(keys) || !keys.length || keys.length > MAX_BLOB_CHUNKS\n || !keys.every((key) => typeof key === \"string\" && PARTITION_KEY.test(key))\n || new Set(keys).size !== keys.length) return null\n const chunks: string[] = []\n let length = 0\n for (const [index, key] of (keys as string[]).entries()) {\n if (!allowed.has(key)) return null\n referenced.add(key)\n const chunk = await loadCanonical(key)\n if (!chunk || !validBase64(chunk.data)) return null\n if (chunk.format === 1) {\n if (!hasExactKeys(chunk, [\"format\", \"data\"])) return null\n } else if (chunk.format === 2) {\n if (!hasExactKeys(chunk, [\"format\", \"index\", \"data\"]) || chunk.index !== index) return null\n } else return null\n if (chunk.data.length > MAX_BLOB_BASE64_CHARACTERS - length) return null\n length += chunk.data.length\n chunks.push(chunk.data)\n }\n const data = chunks.join(\"\")\n return validBase64(data) ? data : null\n }\n const decodeAttachments = async (\n value: unknown,\n allowed: ReadonlySet<string>,\n referenced: Set<string>,\n ): Promise<unknown[] | null> => {\n if (!Array.isArray(value)) return null\n const result: unknown[] = []\n for (const attachment of value) {\n if (!isRecord(attachment) || !hasExactKeys(attachment,\n [\"id\", \"type\", \"display\", \"url\", \"filename\", \"mediaType\", \"source\"]) || !isRecord(attachment.source)) return null\n const source = attachment.source\n if (source.type === \"file\") {\n if (!hasExactKeys(source, [\"type\", \"path\", \"mime\"], [\"dataPartitions\"])) return null\n if (hasOwn(source, \"dataPartitions\")) {\n const data = await loadBlob(source.dataPartitions, allowed, referenced)\n if (data === null) return null\n result.push({ ...attachment, source: { type: source.type, path: source.path, mime: source.mime, data } })\n } else result.push(attachment)\n continue\n }\n if (source.type === \"text\") {\n if (!hasExactKeys(source, [\"type\", \"valuePartitions\"])) return null\n const data = await loadBlob(source.valuePartitions, allowed, referenced)\n if (data === null) return null\n try {\n const value = new TextDecoder(\"utf-8\", { fatal: true }).decode(base64ToBytes(data))\n result.push({ ...attachment, source: { type: source.type, value } })\n } catch {\n return null\n }\n continue\n }\n result.push(attachment)\n }\n return result\n }\n\n const tabs: unknown[] = []\n const declaredGraph = new Set([rootKey])\n let degraded = false\n let legacyGraph = false\n for (const shell of manifest.session.tabs) {\n if (!isRecord(shell)) return\n if (shell.kind === \"sidecar\") {\n if (!hasExactKeys(shell, [\"kind\", \"sidecarId\"])) return\n tabs.push({ kind: shell.kind, sidecarId: shell.sidecarId })\n continue\n }\n if (shell.kind !== \"workspace\"\n || !hasExactKeys(shell, [\"kind\", \"folder\", \"workspacePartition\"], [\"occurrence\", \"projectName\", \"binaryPath\"])) return\n if (typeof shell.workspacePartition !== \"string\" || !PARTITION_KEY.test(shell.workspacePartition)) return\n declaredGraph.add(shell.workspacePartition)\n const workspace = await loadCanonical(shell.workspacePartition)\n if (!workspace || (workspace.format !== 1 && workspace.format !== 2)\n || !hasExactKeys(workspace, [\"format\", \"sessions\"],\n [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"])\n || !isRecord(workspace.sessions)) return\n legacyGraph ||= workspace.format === 1\n if (!Object.keys(workspace.sessions).every(isSafePersistedSessionId)\n || (hasOwn(workspace, \"activeParentSessionId\") && !isSafePersistedSessionId(workspace.activeParentSessionId))\n || (hasOwn(workspace, \"activeSessionId\") && !isSafePersistedSessionId(workspace.activeSessionId))\n || (hasOwn(workspace, \"expandedSessionIds\") && (!Array.isArray(workspace.expandedSessionIds)\n || !workspace.expandedSessionIds.every(isSafePersistedSessionId)))) return\n\n const tab: Record<string, unknown> = {\n kind: shell.kind,\n folder: shell.folder,\n drafts: Object.create(null),\n attachments: Object.create(null),\n scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null),\n generationRecovery: Object.create(null),\n }\n for (const key of [\"occurrence\", \"projectName\", \"binaryPath\"] as const) {\n if (hasOwn(shell, key)) tab[key] = shell[key]\n }\n for (const key of [\"activeParentSessionId\", \"activeSessionId\", \"expandedSessionIds\"] as const) {\n if (hasOwn(workspace, key)) tab[key] = workspace[key]\n }\n const entries: Array<{ sessionId: string; documentKey: string; partitionKeys: string[] }> = []\n for (const [sessionId, rawEntry] of Object.entries(workspace.sessions)) {\n if (workspace.format === 1) {\n if (typeof rawEntry !== \"string\" || !PARTITION_KEY.test(rawEntry)) return\n entries.push({ sessionId, documentKey: rawEntry, partitionKeys: [rawEntry] })\n declaredGraph.add(rawEntry)\n continue\n }\n if (!isRecord(rawEntry) || !hasExactKeys(rawEntry, [\"documentPartition\", \"partitionKeys\"])\n || typeof rawEntry.documentPartition !== \"string\" || !PARTITION_KEY.test(rawEntry.documentPartition)\n || !isPartitionKeyArray(rawEntry.partitionKeys)\n || !rawEntry.partitionKeys.includes(rawEntry.documentPartition)) return\n entries.push({ sessionId, documentKey: rawEntry.documentPartition, partitionKeys: rawEntry.partitionKeys })\n rawEntry.partitionKeys.forEach((key) => declaredGraph.add(key))\n }\n const activeId = typeof workspace.activeSessionId === \"string\" ? workspace.activeSessionId : undefined\n entries.sort((left, right) => left.sessionId === activeId ? -1 : right.sessionId === activeId ? 1\n : left.sessionId.localeCompare(right.sessionId))\n const dropped = new Set<string>()\n for (const { sessionId, documentKey, partitionKeys } of entries) {\n const document = await loadCanonical(documentKey)\n const allowed = new Set(partitionKeys)\n const referenced = new Set([documentKey])\n const validDocument = document && (document.format === 1 || document.format === 2)\n && hasExactKeys(document, [\"format\"],\n [\"draft\", \"attachments\", \"scrollSnapshot\", \"unseenIdleSince\", \"generationRecovery\", \"outline\"])\n && Object.keys(document).length > 1\n if (!validDocument) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const decodedAttachments = !hasOwn(document, \"attachments\") ? undefined : document.format === 1\n ? document.attachments\n : await decodeAttachments(document.attachments, allowed, referenced)\n const outline = document.outline === undefined ? undefined\n : await decodeOutlinePartitions(document.outline, allowed, referenced, loadCanonical)\n if (document.outline !== undefined && !outline) degraded = true\n if ((hasOwn(document, \"attachments\") && decodedAttachments === null)\n || !sameKeys(referenced, partitionKeys)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n const leaf: RestorableWorkspaceTabState = {\n kind: \"workspace\", folder: \"/\",\n drafts: Object.create(null), attachments: Object.create(null), scrollSnapshots: Object.create(null),\n unseenIdleSince: Object.create(null), generationRecovery: Object.create(null),\n }\n const fields = [\n [\"draft\", \"drafts\"],\n [\"scrollSnapshot\", \"scrollSnapshots\"],\n [\"unseenIdleSince\", \"unseenIdleSince\"],\n [\"generationRecovery\", \"generationRecovery\"],\n ] as const\n for (const [documentField, stateField] of fields) {\n if (hasOwn(document, documentField)) (leaf[stateField] as Record<string, unknown>)[sessionId] = document[documentField]\n }\n if (decodedAttachments !== undefined) leaf.attachments[sessionId] = decodedAttachments as RestorableAttachment[]\n if (outline) leaf.outlineIndexes = { [sessionId]: outline }\n const normalizedLeaf = normalizeRestorableSession({ tabs: [leaf], activeTabIndex: 0 })?.tabs[0]\n if (!normalizedLeaf || !canonicalEquals(leaf, normalizedLeaf)) {\n degraded = true\n dropped.add(sessionId)\n continue\n }\n for (const [, stateField] of fields) {\n if (hasOwn(leaf[stateField], sessionId)) {\n (tab[stateField] as Record<string, unknown>)[sessionId] = leaf[stateField][sessionId]\n }\n }\n if (hasOwn(leaf.attachments, sessionId)) {\n (tab.attachments as Record<string, unknown>)[sessionId] = leaf.attachments[sessionId]\n }\n if (outline) {\n tab.outlineIndexes ??= Object.create(null)\n ;(tab.outlineIndexes as Record<string, unknown>)[sessionId] = outline\n }\n }\n if (dropped.has(String(tab.activeSessionId))) delete tab.activeSessionId\n if (dropped.has(String(tab.activeParentSessionId))) delete tab.activeParentSessionId\n if (Array.isArray(tab.expandedSessionIds)) {\n tab.expandedSessionIds = tab.expandedSessionIds.filter((sessionId) => !dropped.has(String(sessionId)))\n }\n tabs.push(tab)\n }\n\n if (!sameKeys(declaredGraph, persistedKeys)) return\n\n const reconstructed: unknown = {\n tabs,\n activeTabIndex: manifest.session.activeTabIndex,\n ...(hasOwn(manifest.session, \"homeActive\") ? { homeActive: manifest.session.homeActive } : {}),\n }\n const normalized = normalizeRestorableSession(reconstructed)\n if (!normalized || !canonicalEquals(reconstructed, normalized)) return\n if (degraded || legacyGraph) return normalized\n const reencoded = await encodeSessionGraph(normalized)\n return graphMatches(reencoded, rootKey, persistedKeys, loaded) ? normalized : undefined\n}\n\nfunction graphMatches(\n reencoded: Awaited<ReturnType<typeof encodeSessionGraph>>,\n rootKey: string,\n persistedKeys: readonly string[],\n loaded: Map<string, string>,\n): boolean {\n if (reencoded.sessionPartition !== rootKey\n || reencoded.partitionKeys.length !== persistedKeys.length\n || !reencoded.partitionKeys.every((key, index) => key === persistedKeys[index])\n || reencoded.partitionKeys.length !== loaded.size) return false\n return reencoded.partitionKeys.every((key) => loaded.get(key) === reencoded.partitions[key])\n}\n\nexport async function decodeClientSnapshotV2(\n value: unknown,\n partitionProtocolVersion: 1 | undefined,\n loadPartition: (key: string) => Promise<string | null>,\n): Promise<ClientSnapshotV1 | null> {\n const decoded = decodeRoot(value)\n if (!decoded || partitionProtocolVersion !== 1) return null\n try {\n const partition = await loadPartition(decoded.partitionKey)\n if (partition === null || encoder.encode(partition).byteLength > MAX_PARTITION_BYTES\n || await sha256(partition) !== decoded.partitionKey) return null\n const parsed = parseJson(partition)\n if (!parsed) return null\n if (isRecord(parsed.value) && parsed.value.format === 2) {\n const loaded = new Map([[decoded.partitionKey, partition]])\n const session = await decodeGraph(parsed.value, decoded.partitionKey, decoded.partitionKeys, loaded, loadPartition)\n return session === undefined ? null : { ...decoded.root, session }\n }\n return null\n } catch {\n return null\n }\n}\n\nexport const isClientSnapshotV2 = (value: unknown): boolean => isRecord(value) && value.version === 2\n","import { createSignal } from \"solid-js\"\nimport { clearNativeClientState, commitNativeClientStatePartitions, loadNativeClientState, loadNativeClientStatePartition,\n saveNativeClientState, setNativeRestoreEnabled } from \"../lib/native/client-state\"\nimport { decodeClientSnapshot, normalizeRestorableSession } from \"./client-state-codec\"\nimport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState } from \"./client-state-codec\"\nimport { canCommitClientSnapshotV2, decodeClientSnapshotV2, encodeClientSnapshotV2, isClientSnapshotV2 } from \"./client-state-partitions\"\nimport type { ClientSnapshotV2 } from \"./client-state-partitions\"\nexport type { ClientSnapshotV1, RestorableSessionState, RestorableSidecarTabState, RestorableTabState, RestorableWorkspaceTabState }\nexport type { ClientSnapshotV2 }\nconst SAVE_DEBOUNCE_MS = 250\nconst FLUSH_MAX_ATTEMPTS = 3\nconst MAX_V1_SNAPSHOT_BYTES = 1024 * 1024\nconst MAX_LAYOUT_ENTRIES = 64\nconst MAX_LAYOUT_KEY_LENGTH = 256\nconst MAX_LAYOUT_VALUE_LENGTH = 4096\nconst LEGACY_LAYOUT_KEY_PREFIX = \"opencode-session-\"\nconst UNSAFE_LAYOUT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\nconst [clientStateIsPrimary, setClientStateIsPrimary] = createSignal(true)\nconst [restorePreviousStateEnabled, setRestorePreviousStateEnabledSignal] = createSignal(false)\nconst [loadedClientSnapshotExists, setLoadedClientSnapshotExists] = createSignal(false)\nconst [loadedRestorableSession, setLoadedRestorableSession] = createSignal<RestorableSessionState | null>(null)\nlet initialized = false\nlet initialization: Promise<void> | null = null\nlet layout: Record<string, string> = Object.create(null)\nlet revision = 0\nlet dirty = false\nlet writeBlock: false | \"snapshot\" | \"transaction\" = false\nlet saveTimer: ReturnType<typeof setTimeout> | null = null\nlet writeQueue: Promise<void> = Promise.resolve()\nlet destructiveQueue: Promise<void> = Promise.resolve()\nlet lastSaveError: unknown\nlet partitionProtocolVersion: 1 | undefined\nconst transactionLayoutWrites = new Set<string>()\nfunction useLocalStorage<T>(fallback: T, operation: (storage: Storage) => T): T {\n try {\n return operation(window.localStorage)\n } catch {\n return fallback\n }\n}\n\nfunction isValidLayoutKey(key: string): boolean {\n return key.length > 0 && key.length <= MAX_LAYOUT_KEY_LENGTH && !UNSAFE_LAYOUT_KEYS.has(key)\n}\nconst readLegacyLayoutValue = (key: string) =>\n useLocalStorage<string | null>(null, (storage) => {\n const value = storage.getItem(key)\n return value !== null && value.length <= MAX_LAYOUT_VALUE_LENGTH ? value : null\n })\nconst writeLegacyLayoutValue = (key: string, value: string) =>\n useLocalStorage(undefined, (storage) => storage.setItem(key, value))\nfunction legacyLayoutKeys(storage: Storage): string[] {\n const keys = new Set(Object.keys(layout))\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index)\n if (key?.startsWith(LEGACY_LAYOUT_KEY_PREFIX)) keys.add(key)\n }\n return [...keys]\n}\nconst hasLayoutKey = (key: string) => Object.prototype.hasOwnProperty.call(layout, key)\nconst layoutIsFull = () => Object.keys(layout).length >= MAX_LAYOUT_ENTRIES\n\nfunction migrateLegacyLayoutValues(): boolean {\n return useLocalStorage(false, (storage) => {\n const previousSize = Object.keys(layout).length\n for (const key of legacyLayoutKeys(storage)) {\n if (hasLayoutKey(key)) continue\n if (layoutIsFull()) break\n const value = storage.getItem(key)\n if (value === null || value.length > MAX_LAYOUT_VALUE_LENGTH) continue\n layout[key] = value\n }\n return Object.keys(layout).length !== previousSize\n })\n}\n\nfunction canWriteSnapshot(): boolean {\n return initialized && clientStateIsPrimary() && restorePreviousStateEnabled() && !writeBlock\n}\nconst cancelSaveTimer = () => {\n if (saveTimer !== null) clearTimeout(saveTimer)\n saveTimer = null\n}\n\nfunction enqueuePendingSave(): Promise<void> {\n cancelSaveTimer()\n if (!dirty || !canWriteSnapshot()) return writeQueue\n const snapshot: ClientSnapshotV1 = {\n version: 1,\n revision: ++revision,\n savedAt: Date.now(),\n layout: { ...layout },\n session: partitionProtocolVersion === 1 ? loadedRestorableSession() : withoutOutlineIndexes(loadedRestorableSession()),\n }\n const normalizedSnapshot = decodeClientSnapshot(snapshot)\n if (!normalizedSnapshot) return Promise.reject(new Error(\"Client snapshot normalization failed\"))\n layout = { ...normalizedSnapshot.layout }\n dirty = false\n const saveAttempt = writeQueue.then(async () => {\n try {\n const partitioned = partitionProtocolVersion === 1 ? await encodeClientSnapshotV2(normalizedSnapshot) : null\n if (partitioned && !canCommitClientSnapshotV2(partitioned)) {\n throw new Error(\"Client snapshot exceeds the native partition count or size limits\")\n }\n if (!partitioned && new TextEncoder().encode(JSON.stringify(normalizedSnapshot)).byteLength > MAX_V1_SNAPSHOT_BYTES) {\n throw new Error(\"Client snapshot exceeds the V1 1 MiB limit and partition persistence is unavailable\")\n }\n const accepted = partitioned\n ? await commitNativeClientStatePartitions({\n protocolVersion: 1,\n snapshot: partitioned.root,\n partitions: partitioned.partitions,\n partitionKeys: partitioned.partitionKeys,\n })\n : await saveNativeClientState(normalizedSnapshot)\n if (!accepted) {\n setClientStateIsPrimary(false)\n throw new Error(\"Native client state save was rejected\")\n }\n lastSaveError = undefined\n } catch (error) {\n dirty = true\n lastSaveError = error\n throw error\n }\n })\n writeQueue = saveAttempt.catch(() => undefined)\n return saveAttempt\n}\n\nfunction withoutOutlineIndexes(state: RestorableSessionState | null): RestorableSessionState | null {\n return state && { ...state, tabs: state.tabs.map(tab => {\n if (tab.kind !== \"workspace\") return tab\n const { outlineIndexes: _, ...rest } = tab\n return rest\n }) }\n}\n\nfunction scheduleSave() {\n dirty = true\n if (!canWriteSnapshot()) return\n cancelSaveTimer()\n saveTimer = setTimeout(() => void enqueuePendingSave()\n .catch((error) => console.warn(\"[client-state] failed to save client snapshot\", error)), SAVE_DEBOUNCE_MS)\n}\nfunction resetLoadedState(snapshot: ClientSnapshotV1 | null = null, resetRevision = false) {\n layout = snapshot ? { ...snapshot.layout } : Object.create(null)\n if (resetRevision) revision = snapshot?.revision ?? 0\n setLoadedClientSnapshotExists(snapshot !== null)\n setLoadedRestorableSession(snapshot?.session ?? null)\n}\nasync function executeDestructiveTransaction(operation: () => Promise<boolean>, rejectedMessage: string, loseOwnershipOnRejection = false): Promise<void> {\n const previousWriteBlock = writeBlock\n let retryDirty = dirty\n writeBlock = \"transaction\"\n transactionLayoutWrites.clear()\n cancelSaveTimer()\n dirty = false\n try {\n await writeQueue\n retryDirty ||= dirty\n dirty = false\n if (!await operation()) {\n if (loseOwnershipOnRejection) setClientStateIsPrimary(false)\n throw new Error(rejectedMessage)\n }\n useLocalStorage(undefined, (storage) => {\n for (const key of legacyLayoutKeys(storage)) storage.removeItem(key)\n })\n resetLoadedState()\n transactionLayoutWrites.clear()\n writeBlock = \"snapshot\"\n } catch (error) {\n retryDirty ||= dirty\n for (const key of transactionLayoutWrites) writeLegacyLayoutValue(key, layout[key]!)\n transactionLayoutWrites.clear()\n writeBlock = previousWriteBlock\n dirty = retryDirty\n if (dirty) scheduleSave()\n throw error\n }\n}\nfunction runDestructiveTransition(operation: () => Promise<void>): Promise<void> {\n const transition = destructiveQueue.then(operation)\n destructiveQueue = transition.catch(() => undefined)\n return transition\n}\nexport function updateRestorableSession(state: RestorableSessionState | null): void {\n const normalized = state === null ? null : normalizeRestorableSession(state)\n if (state !== null && normalized === null) return\n if (writeBlock === \"transaction\") {\n setLoadedRestorableSession(normalized)\n dirty = true\n return\n }\n if (writeBlock || !clientStateIsPrimary() || !restorePreviousStateEnabled()) return\n setLoadedRestorableSession(normalized)\n scheduleSave()\n}\n\nexport function readClientLayoutValue(key: string): string | null {\n if (!isValidLayoutKey(key)) return null\n if (!clientStateIsPrimary()) return readLegacyLayoutValue(key)\n if (!restorePreviousStateEnabled() || writeBlock) return null\n if (hasLayoutKey(key)) return layout[key] ?? null\n const legacyValue = readLegacyLayoutValue(key)\n if (legacyValue === null || layoutIsFull()) return legacyValue\n layout[key] = legacyValue\n scheduleSave()\n return legacyValue\n}\n\nexport function writeClientLayoutValue(key: string, value: string): void {\n if (!isValidLayoutKey(key) || value.length > MAX_LAYOUT_VALUE_LENGTH) return\n if (!clientStateIsPrimary()) return writeLegacyLayoutValue(key, value)\n if (writeBlock === \"transaction\") {\n if (!hasLayoutKey(key) && layoutIsFull()) return\n dirty ||= layout[key] !== value\n layout[key] = value\n transactionLayoutWrites.add(key)\n return\n }\n if (!restorePreviousStateEnabled() || writeBlock) return\n if (!hasLayoutKey(key) && layoutIsFull()) return\n writeLegacyLayoutValue(key, value)\n if (layout[key] === value) return\n layout[key] = value\n scheduleSave()\n}\n\nexport async function flushClientState(): Promise<void> {\n cancelSaveTimer()\n let lastError = lastSaveError\n for (let attempts = 0; attempts < FLUSH_MAX_ATTEMPTS; attempts += 1) {\n while (true) {\n const pending = writeQueue\n await pending\n if (pending === writeQueue) break\n }\n if (!dirty) {\n if (lastError !== undefined) throw lastError\n return\n }\n if (!canWriteSnapshot()) {\n const writeError = lastSaveError ?? lastError\n if (writeError !== undefined) throw writeError\n return\n }\n try {\n await enqueuePendingSave()\n lastError = undefined\n } catch (error) {\n lastError = error\n }\n }\n await writeQueue\n if (!dirty) return\n throw lastError ?? new Error(\"Client state remained dirty after the final flush attempt\")\n}\n\nexport async function clearRestoredClientState(): Promise<void> {\n await runDestructiveTransition(async () => {\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n await executeDestructiveTransaction(clearNativeClientState, \"Native client state clear was rejected\", true)\n })\n}\n\nexport async function setRestorePreviousStateEnabled(enabled: boolean): Promise<void> {\n await runDestructiveTransition(async () => {\n if (enabled === restorePreviousStateEnabled() && (!enabled || writeBlock === false)) return\n if (!clientStateIsPrimary()) throw new Error(\"Client state is not owned by this window\")\n if (enabled) {\n if (!await setNativeRestoreEnabled(true)) throw new Error(\"Native restore preference update was rejected\")\n writeBlock = false\n setRestorePreviousStateEnabledSignal(true)\n return\n }\n setRestorePreviousStateEnabledSignal(false)\n try {\n await executeDestructiveTransaction(() => setNativeRestoreEnabled(false), \"Native restore preference update was rejected\")\n } catch (error) {\n setRestorePreviousStateEnabledSignal(true)\n throw error\n }\n })\n}\n\nexport function initializeClientState(): Promise<void> {\n if (initialization) return initialization\n initialization = (async () => {\n try {\n const loaded = await loadNativeClientState()\n partitionProtocolVersion = loaded.partitionProtocolVersion\n setClientStateIsPrimary(loaded.isPrimary)\n setRestorePreviousStateEnabledSignal(loaded.restoreEnabled)\n resetLoadedState(null, true)\n dirty = false\n lastSaveError = undefined\n writeBlock = false\n transactionLayoutWrites.clear()\n initialized = true\n if (!loaded.isPrimary || !loaded.restoreEnabled) return\n let snapshot: ClientSnapshotV1 | null\n if (isClientSnapshotV2(loaded.snapshot)) {\n writeBlock = \"snapshot\"\n try {\n snapshot = await decodeClientSnapshotV2(\n loaded.snapshot,\n loaded.partitionProtocolVersion,\n loadNativeClientStatePartition,\n )\n } catch (error) {\n snapshot = null\n console.warn(\"[client-state] failed to load client snapshot partition\", error)\n }\n if (snapshot) writeBlock = false\n } else {\n snapshot = decodeClientSnapshot(loaded.snapshot)\n writeBlock = loaded.snapshot !== null && snapshot === null ? \"snapshot\" : false\n }\n resetLoadedState(snapshot, true)\n if (!writeBlock && migrateLegacyLayoutValues()) scheduleSave()\n } catch (error) {\n initialized = true\n setClientStateIsPrimary(false)\n resetLoadedState()\n console.warn(\"[client-state] failed to initialize client state\", error)\n }\n })()\n return initialization\n}\n\nexport { clientStateIsPrimary, loadedClientSnapshotExists, loadedRestorableSession, restorePreviousStateEnabled }\n"],"names":["LEGACY_WEB_KEYS","SECONDARY_CLIENT_STATE","log","getLogger","accessToken","bytes","byte","nativeAccessClaimed","electronApi","dispatchNative","electronOperation","command","args","isElectronHost","isTauriHost","invoke","claimNativeClientStateAccess","isLocalWindow","result","api","_a","error","loadNativeClientState","loaded","key","mutateNativeClientState","saveNativeClientState","snapshot","commitNativeClientStatePartitions","payload","loadNativeClientStatePartition","setNativeRestoreEnabled","enabled","clearNativeClientState","acknowledge","acknowledgeNativeClientStateNavigationFlush","generation","acknowledgeNativeClientStateRendererFlush","MAX_ID","MAX_DISPLAY","MAX_PATH","MAX_MIME","isRecord","value","isSafeKey","takeString","max","allowEmpty","bytesToBase64","binary","index","base64ToBytes","character","validBase64","dataUrlPayload","takeFileData","url","raw","data","takePosition","normalizeSource","name","path","mime","rawData","start","end","normalizeAttachment","id","display","filename","mediaType","source","rawUrl","normalizeRestorableAttachmentRecord","drafts","prioritySessionIds","attachments","priority","prioritySet","entries","sessionId","rawAttachments","normalized","attachment","serializeDraftAttachments","values","hydrateRestorableAttachment","outlineBudget","verified","types","record","string","integer","min","hasCompleteOutlineToolMetadata","entry","normalizePersistedOutline","checkpoints","ids","seq","through","checkpoint","normalizeOutlineIndexes","budget","keys","MAX_TABS","MAX_LAYOUT_ENTRIES","MAX_DRAFTS","MAX_SCROLLS_PER_TAB","MAX_IDLE_MARKERS","MAX_RECOVERY","MAX_EXPANDED","MAX_KEY","MAX_LAYOUT_VALUE","MAX_DRAFT","MAX_ANCHOR_KEY","MAX_STRINGS","MAX_SCROLLS","MAX_WINDOW_CURSOR","NO_SESSION_DRAFT_SESSION_ID","createBudget","safeKey","takeNumber","normalizeRecord","normalize","accept","accepted","priorityKeys","count","priorities","rawKey","rawValue","normalizeStringRecord","valueMax","normalizeScrollSnapshot","scrollTop","updatedAt","scrollRatio","maxScrollTop","anchorOffset","anchorKey","windowCursor","newerCursors","cursor","normalizeExpandedSessionIds","seen","normalizeWorkspaceTab","identity","_prioritizeDrafts","reservedDrafts","remainingDrafts","additionalDrafts","scrollLimit","scrollSnapshots","unseenIdleSince","generationRecovery","expandedSessionIds","remainingAttachments","attachmentResult","outlineIndexes","projectName","binaryPath","normalizeIdentity","kind","sidecarId","folder","activeParentSessionId","activeSessionId","reservePriorityDrafts","remaining","draft","priorityAttachments","normalizeRestorableSession","normalizeSession","requested","rawTabs","identityByIndex","normalizedByIndex","normalizeIdentityAt","originalIndex","normalizeTabAt","prioritizeDrafts","tab","_tab","priorityOrder","tabs","surviving","next","activeTabIndex","decodeClientSnapshot","savedAt","session","layout","encoder","sortJson","canonicalJson","serialized","sha256","digest","encoded","encodeOutlinePartitions","pending","partitions","entryPartitions","offset","text","_","metadata","decodeOutlinePartitions","allowed","referenced","load","descriptor","chunk","MAX_PARTITION_BYTES","MAX_ROOT_BYTES","MAX_NATIVE_PARTITIONS","MAX_NATIVE_COMMIT_BYTES","MAX_SESSION_ID","BLOB_CHUNK_CHARACTERS","MAX_BLOB_CHUNKS","MAX_BLOB_BASE64_CHARACTERS","PARTITION_KEY","ROOT_KEYS","UNSAFE_KEYS","hasOwn","isSafePersistedSessionId","isPartitionKeyArray","hasExactKeys","required","optional","canonicalEquals","left","right","addBlob","addPartition","encodeAttachments","encodeSessionGraph","generated","partition","encodedSession","sessionIds","sessions","document","outline","documentPartition","attachmentPartitions","workspace","shell","sessionPartition","partitionKeys","encodeClientSnapshotV2","graph","canCommitClientSnapshotV2","root","commitBytes","partitionBytes","decodeRoot","parseJson","decodeGraph","manifest","rootKey","persistedKeys","loadPartition","reencoded","graphMatches","loadCanonical","parsed","sameKeys","sorted","loadBlob","chunks","length","decodeAttachments","declaredGraph","degraded","legacyGraph","rawEntry","activeId","dropped","documentKey","decodedAttachments","leaf","fields","documentField","stateField","normalizedLeaf","reconstructed","decodeClientSnapshotV2","partitionProtocolVersion","decoded","isClientSnapshotV2","SAVE_DEBOUNCE_MS","FLUSH_MAX_ATTEMPTS","MAX_V1_SNAPSHOT_BYTES","MAX_LAYOUT_KEY_LENGTH","MAX_LAYOUT_VALUE_LENGTH","LEGACY_LAYOUT_KEY_PREFIX","UNSAFE_LAYOUT_KEYS","clientStateIsPrimary","setClientStateIsPrimary","createSignal","restorePreviousStateEnabled","setRestorePreviousStateEnabledSignal","loadedClientSnapshotExists","setLoadedClientSnapshotExists","loadedRestorableSession","setLoadedRestorableSession","initialized","initialization","revision","dirty","writeBlock","saveTimer","writeQueue","destructiveQueue","lastSaveError","transactionLayoutWrites","useLocalStorage","fallback","operation","isValidLayoutKey","readLegacyLayoutValue","storage","writeLegacyLayoutValue","legacyLayoutKeys","hasLayoutKey","layoutIsFull","migrateLegacyLayoutValues","previousSize","canWriteSnapshot","cancelSaveTimer","enqueuePendingSave","withoutOutlineIndexes","normalizedSnapshot","saveAttempt","partitioned","state","rest","scheduleSave","resetLoadedState","resetRevision","executeDestructiveTransaction","rejectedMessage","loseOwnershipOnRejection","previousWriteBlock","retryDirty","runDestructiveTransition","transition","updateRestorableSession","readClientLayoutValue","legacyValue","writeClientLayoutValue","flushClientState","lastError","attempts","writeError","clearRestoredClientState","setRestorePreviousStateEnabled","initializeClientState"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ap as _,t as b,i as x,u as E,m as V,h as B}from"./monaco-viewer-C10fFymA.js";import{c as L,d as F,k as p,a as D,S as T,E as z,D as G,C as $,G as U}from"./git-diff-vendor-CT8HfOQw.js";import{bu as N,at as K}from"./main-Hn7UJb2f.js";import"./fast-diff-vendor-DgdwVvTQ.js";import"./highlight-vendor-8FKMu9os.js";import"./index-Bzngra1L.js";var q=b("<div>"),O=b("<div class=tool-call-diff-viewer>"),P=b("<pre class=tool-call-diff-fallback>");const j=B("session");U();function I(e,s,o){const a=window.getComputedStyle(o),i=document.createElement("span");i.textContent=s||"",i.style.position="absolute",i.style.visibility="hidden",i.style.pointerEvents="none",i.style.display="inline-block",i.style.width="auto",i.style.maxWidth="none",i.style.whiteSpace="nowrap",i.style.fontFamily=a.fontFamily,i.style.fontSize=a.fontSize,i.style.fontWeight=a.fontWeight,i.style.fontStyle=a.fontStyle,i.style.letterSpacing=a.letterSpacing,i.style.fontVariant=a.fontVariant,i.style.textTransform=a.textTransform,i.style.lineHeight=a.lineHeight,e.appendChild(i);const f=Math.ceil(i.getBoundingClientRect().width);return i.remove(),f}function M(e,s,o=40){const a=s.reduce((l,n)=>Math.max(l,I(e,n.text,n.source)),0),i=s.reduce((l,n)=>Math.max(l,n.text.length),1),f=Math.round(i*7+4);return Math.max(2,Math.min(o,a>0?a+2:f))}function J(e,s){const o=e.querySelector(".unified-diff-table-wrapper"),a=e.querySelector(".unified-diff-table"),i=e.querySelector(".unified-diff-table-num-col"),f=e.querySelectorAll(".diff-line-num"),l=e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper"),n=[];a&&(s?(a.classList.add("table-fixed"),a.style.tableLayout="fixed",a.style.width="100%",a.style.minWidth="100%"):(a.classList.remove("table-fixed"),a.style.tableLayout="auto",a.style.width="max-content",a.style.minWidth="100%")),f.forEach(r=>{var v,k;const c=r.querySelector("[data-line-old-num]"),m=r.querySelector("[data-line-new-num]"),W=r.querySelector(".shrink-0"),S=r.querySelector(":scope > .flex"),C=r.querySelector(":scope > .tool-call-diff-compact-line-number"),y=((v=c==null?void 0:c.textContent)==null?void 0:v.trim())??"",w=((k=m==null?void 0:m.textContent)==null?void 0:k.trim())??"",H=w.length>0&&w!=="0",R=y.length>0&&y!=="0",g=H?w:R?y:w||y;S&&(S.style.display="none"),W&&(W.style.display="none"),c&&(c.style.display="none",c.style.width="auto"),m&&(m.style.display="none",m.style.width="auto"),r.style.paddingLeft="1px",r.style.paddingRight="1px",r.style.textAlign="left";const u=C??document.createElement("span");u.className="tool-call-diff-compact-line-number",u.textContent=g,u.setAttribute("aria-hidden",g?"false":"true"),C||r.appendChild(u),n.push({gutter:r,label:u,text:g})});const t=M(e,n.map(r=>({text:r.text,source:r.label}))),d=`${t}px`,h=`${Math.max(8,t-10)}px`;o&&(o.style.setProperty("--diff-aside-width",h),o.style.setProperty("--diff-aside-width--",h)),i&&(i.style.width=d),n.forEach(({gutter:r,label:c})=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,c.style.width="auto",c.style.maxWidth="none"}),l.forEach(r=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,r.style.paddingLeft="0",r.style.paddingRight="0"})}function Q(e){const s=e.querySelector(".old-diff-table-wrapper"),o=e.querySelector(".new-diff-table-wrapper"),a=Array.from(e.querySelectorAll(".diff-line-old-num, .diff-line-new-num")),i=Array.from(e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper")),f=a.map(t=>({cell:t,span:t.querySelector("[data-line-num]")})).filter(t=>!!t.span),n=`${M(e,f.map(({span:t})=>{var d;return{text:((d=t.textContent)==null?void 0:d.trim())??"",source:t}}),64)}px`;[s,o].forEach(t=>{t&&t.style.setProperty("--diff-aside-width",n)}),a.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="2px",t.style.paddingRight="2px",t.style.textAlign="left",t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),f.forEach(({span:t})=>{t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),i.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="0",t.style.paddingRight="0"})}function A(e,s,o=!1){if(s==="unified"){J(e,o);return}s==="split"&&Q(e)}function ne(e){const s=L(()=>{const f=_(e.diffText);if(!f)return null;const l=N(e.filePath)||"text",n=e.filePath||"diff";return{oldFile:{fileName:n,fileLang:l},newFile:{fileName:n,fileLang:l},hunks:[f]}});let o,a;const i=L(()=>s()?`${e.theme}|${e.mode}|${e.wrap?"wrap":"nowrap"}|${e.diffText}`:"");return F(()=>{var n;if(e.cachedHtml){o&&A(o,e.mode,!!e.wrap),(n=e.onRendered)==null||n.call(e);return}const l=i();l&&o&&a!==l&&requestAnimationFrame(()=>{var d;if(!o)return;A(o,e.mode,!!e.wrap);const t=o.innerHTML;t&&(a=l,e.cacheEntryParams&&K(e.cacheEntryParams,{text:e.diffText,html:t,theme:e.theme,mode:e.mode,wrap:e.wrap}),(d=e.onRendered)==null||d.call(e))})}),(()=>{var f=O();return x(f,p(T,{get when(){return e.cachedHtml},get fallback(){return(()=>{var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,x(l,p(T,{get when(){return s()},get fallback(){return(()=>{var t=P();return x(t,()=>e.diffText),t})()},children:t=>p(z,{fallback:d=>(j.warn("Failed to render diff view",d),(()=>{var h=P();return x(h,()=>e.diffText),h})()),get children(){return p(G,{get data(){return t()},get diffViewMode(){return V(()=>e.mode==="split")()?$.Split:$.Unified},get diffViewTheme(){return e.theme},diffViewHighlight:!0,get diffViewWrap(){return!!e.wrap},diffViewFontSize:13})}})})),l})()},get children(){var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,D(()=>l.innerHTML=e.cachedHtml),l}})),f})()}export{ne as ToolCallDiffViewer};
2
- //# sourceMappingURL=diff-viewer-BzgxNlWD.js.map
1
+ import{ap as _,t as b,i as x,u as E,m as V,g as B}from"./monaco-viewer-CG0aPZ-r.js";import{c as L,d as F,k as p,a as D,S as T,E as z,D as G,C as $,G as U}from"./git-diff-vendor-CT8HfOQw.js";import{bu as N,au as K}from"./main-DRbjgAo8.js";import"./fast-diff-vendor-DgdwVvTQ.js";import"./highlight-vendor-8FKMu9os.js";import"./index-BhInW6hR.js";var q=b("<div>"),O=b("<div class=tool-call-diff-viewer>"),P=b("<pre class=tool-call-diff-fallback>");const j=B("session");U();function I(e,s,o){const a=window.getComputedStyle(o),i=document.createElement("span");i.textContent=s||"",i.style.position="absolute",i.style.visibility="hidden",i.style.pointerEvents="none",i.style.display="inline-block",i.style.width="auto",i.style.maxWidth="none",i.style.whiteSpace="nowrap",i.style.fontFamily=a.fontFamily,i.style.fontSize=a.fontSize,i.style.fontWeight=a.fontWeight,i.style.fontStyle=a.fontStyle,i.style.letterSpacing=a.letterSpacing,i.style.fontVariant=a.fontVariant,i.style.textTransform=a.textTransform,i.style.lineHeight=a.lineHeight,e.appendChild(i);const f=Math.ceil(i.getBoundingClientRect().width);return i.remove(),f}function M(e,s,o=40){const a=s.reduce((l,n)=>Math.max(l,I(e,n.text,n.source)),0),i=s.reduce((l,n)=>Math.max(l,n.text.length),1),f=Math.round(i*7+4);return Math.max(2,Math.min(o,a>0?a+2:f))}function J(e,s){const o=e.querySelector(".unified-diff-table-wrapper"),a=e.querySelector(".unified-diff-table"),i=e.querySelector(".unified-diff-table-num-col"),f=e.querySelectorAll(".diff-line-num"),l=e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper"),n=[];a&&(s?(a.classList.add("table-fixed"),a.style.tableLayout="fixed",a.style.width="100%",a.style.minWidth="100%"):(a.classList.remove("table-fixed"),a.style.tableLayout="auto",a.style.width="max-content",a.style.minWidth="100%")),f.forEach(r=>{var v,k;const c=r.querySelector("[data-line-old-num]"),m=r.querySelector("[data-line-new-num]"),W=r.querySelector(".shrink-0"),S=r.querySelector(":scope > .flex"),C=r.querySelector(":scope > .tool-call-diff-compact-line-number"),y=((v=c==null?void 0:c.textContent)==null?void 0:v.trim())??"",w=((k=m==null?void 0:m.textContent)==null?void 0:k.trim())??"",H=w.length>0&&w!=="0",R=y.length>0&&y!=="0",g=H?w:R?y:w||y;S&&(S.style.display="none"),W&&(W.style.display="none"),c&&(c.style.display="none",c.style.width="auto"),m&&(m.style.display="none",m.style.width="auto"),r.style.paddingLeft="1px",r.style.paddingRight="1px",r.style.textAlign="left";const h=C??document.createElement("span");h.className="tool-call-diff-compact-line-number",h.textContent=g,h.setAttribute("aria-hidden",g?"false":"true"),C||r.appendChild(h),n.push({gutter:r,label:h,text:g})});const t=M(e,n.map(r=>({text:r.text,source:r.label}))),d=`${t}px`,u=`${Math.max(8,t-10)}px`;o&&(o.style.setProperty("--diff-aside-width",u),o.style.setProperty("--diff-aside-width--",u)),i&&(i.style.width=d),n.forEach(({gutter:r,label:c})=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,c.style.width="auto",c.style.maxWidth="none"}),l.forEach(r=>{r.style.width=d,r.style.minWidth=d,r.style.maxWidth=d,r.style.paddingLeft="0",r.style.paddingRight="0"})}function Q(e){const s=e.querySelector(".old-diff-table-wrapper"),o=e.querySelector(".new-diff-table-wrapper"),a=Array.from(e.querySelectorAll(".diff-line-old-num, .diff-line-new-num")),i=Array.from(e.querySelectorAll(".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper")),f=a.map(t=>({cell:t,span:t.querySelector("[data-line-num]")})).filter(t=>!!t.span),n=`${M(e,f.map(({span:t})=>{var d;return{text:((d=t.textContent)==null?void 0:d.trim())??"",source:t}}),64)}px`;[s,o].forEach(t=>{t&&t.style.setProperty("--diff-aside-width",n)}),a.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="2px",t.style.paddingRight="2px",t.style.textAlign="left",t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),f.forEach(({span:t})=>{t.style.whiteSpace="nowrap",t.style.overflowWrap="normal",t.style.wordBreak="normal"}),i.forEach(t=>{t.style.width=n,t.style.minWidth=n,t.style.maxWidth=n,t.style.paddingLeft="0",t.style.paddingRight="0"})}function A(e,s,o=!1){if(s==="unified"){J(e,o);return}s==="split"&&Q(e)}function ne(e){const s=L(()=>{const f=_(e.diffText);if(!f)return null;const l=N(e.filePath)||"text",n=e.filePath||"diff";return{oldFile:{fileName:n,fileLang:l},newFile:{fileName:n,fileLang:l},hunks:[f]}});let o,a;const i=L(()=>s()?`${e.theme}|${e.mode}|${e.wrap?"wrap":"nowrap"}|${e.diffText}`:"");return F(()=>{var n;if(e.cachedHtml){o&&A(o,e.mode,!!e.wrap),(n=e.onRendered)==null||n.call(e);return}const l=i();l&&o&&a!==l&&requestAnimationFrame(()=>{var d;if(!o)return;A(o,e.mode,!!e.wrap);const t=o.innerHTML;t&&(a=l,e.cacheEntryParams&&K(e.cacheEntryParams,{text:e.diffText,html:t,theme:e.theme,mode:e.mode,wrap:e.wrap}),(d=e.onRendered)==null||d.call(e))})}),(()=>{var f=O();return x(f,p(T,{get when(){return e.cachedHtml},get fallback(){return(()=>{var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,x(l,p(T,{get when(){return s()},get fallback(){return(()=>{var t=P();return x(t,()=>e.diffText),t})()},children:t=>p(z,{fallback:d=>(j.warn("Failed to render diff view",d),(()=>{var u=P();return x(u,()=>e.diffText),u})()),get children(){return p(G,{get data(){return t()},get diffViewMode(){return V(()=>e.mode==="split")()?$.Split:$.Unified},get diffViewTheme(){return e.theme},diffViewHighlight:!0,get diffViewWrap(){return!!e.wrap},diffViewFontSize:13})}})})),l})()},get children(){var l=q(),n=o;return typeof n=="function"?E(n,l):o=l,D(()=>l.innerHTML=e.cachedHtml),l}})),f})()}export{ne as ToolCallDiffViewer};
2
+ //# sourceMappingURL=diff-viewer-FNBCogHl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff-viewer-BzgxNlWD.js","sources":["../../../components/diff-viewer.tsx"],"sourcesContent":["import { createMemo, Show, createEffect } from \"solid-js\"\nimport { DiffView, DiffModeEnum } from \"@git-diff-view/solid\"\nimport \"@git-diff-view/solid/styles/diff-view-pure.css\"\nimport { disableCache } from \"@git-diff-view/core\"\nimport type { DiffHighlighterLang } from \"@git-diff-view/core\"\nimport { ErrorBoundary } from \"solid-js\"\nimport { getLanguageFromPath } from \"../lib/text-render-utils\"\nimport { normalizeDiffText } from \"../lib/diff-utils\"\nimport { setCacheEntry } from \"../lib/global-cache\"\nimport type { CacheEntryParams } from \"../lib/global-cache\"\nimport type { DiffViewMode } from \"../stores/preferences\"\nimport { getLogger } from \"../lib/logger\"\nconst log = getLogger(\"session\")\n\n\ndisableCache()\n\ninterface ToolCallDiffViewerProps {\n diffText: string\n filePath?: string\n theme: \"light\" | \"dark\"\n mode: DiffViewMode\n wrap?: boolean\n onRendered?: () => void\n cachedHtml?: string\n cacheEntryParams?: CacheEntryParams\n}\n\ntype DiffData = {\n oldFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }\n newFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }\n hunks: string[]\n}\n\nfunction measureTextWidth(container: HTMLElement, text: string, source: HTMLElement) {\n const computed = window.getComputedStyle(source)\n const probe = document.createElement(\"span\")\n probe.textContent = text || \"\"\n probe.style.position = \"absolute\"\n probe.style.visibility = \"hidden\"\n probe.style.pointerEvents = \"none\"\n probe.style.display = \"inline-block\"\n probe.style.width = \"auto\"\n probe.style.maxWidth = \"none\"\n probe.style.whiteSpace = \"nowrap\"\n probe.style.fontFamily = computed.fontFamily\n probe.style.fontSize = computed.fontSize\n probe.style.fontWeight = computed.fontWeight\n probe.style.fontStyle = computed.fontStyle\n probe.style.letterSpacing = computed.letterSpacing\n probe.style.fontVariant = computed.fontVariant\n probe.style.textTransform = computed.textTransform\n probe.style.lineHeight = computed.lineHeight\n container.appendChild(probe)\n const width = Math.ceil(probe.getBoundingClientRect().width)\n probe.remove()\n return width\n}\n\nfunction computeCompactWidth(\n container: HTMLElement,\n entries: Array<{ text: string; source: HTMLElement }>,\n maxWidthPx = 40,\n) {\n const measuredLabelWidthPx = entries.reduce((max, entry) => {\n return Math.max(max, measureTextWidth(container, entry.text, entry.source))\n }, 0)\n const fallbackTextLength = entries.reduce((max, entry) => Math.max(max, entry.text.length), 1)\n const fallbackWidthPx = Math.round(fallbackTextLength * 7 + 4)\n return Math.max(2, Math.min(maxWidthPx, measuredLabelWidthPx > 0 ? measuredLabelWidthPx + 2 : fallbackWidthPx))\n}\n\nfunction applyCompactUnifiedGutter(container: HTMLElement, wrap: boolean) {\n const tableWrapper = container.querySelector<HTMLElement>(\".unified-diff-table-wrapper\")\n const table = container.querySelector<HTMLTableElement>(\".unified-diff-table\")\n const numberCol = container.querySelector<HTMLTableColElement>(\".unified-diff-table-num-col\")\n const gutterRows = container.querySelectorAll<HTMLElement>(\".diff-line-num\")\n const hunkGutters = container.querySelectorAll<HTMLElement>(\".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper\")\n const entries: Array<{ gutter: HTMLElement; label: HTMLElement; text: string }> = []\n\n if (table) {\n if (wrap) {\n table.classList.add(\"table-fixed\")\n table.style.tableLayout = \"fixed\"\n table.style.width = \"100%\"\n table.style.minWidth = \"100%\"\n } else {\n table.classList.remove(\"table-fixed\")\n table.style.tableLayout = \"auto\"\n table.style.width = \"max-content\"\n table.style.minWidth = \"100%\"\n }\n }\n\n gutterRows.forEach((gutter) => {\n const oldSpan = gutter.querySelector<HTMLElement>(\"[data-line-old-num]\")\n const newSpan = gutter.querySelector<HTMLElement>(\"[data-line-new-num]\")\n const spacer = gutter.querySelector<HTMLElement>(\".shrink-0\")\n const flexWrapper = gutter.querySelector<HTMLElement>(\":scope > .flex\")\n const currentLabel = gutter.querySelector<HTMLElement>(\":scope > .tool-call-diff-compact-line-number\")\n\n const oldText = oldSpan?.textContent?.trim() ?? \"\"\n const newText = newSpan?.textContent?.trim() ?? \"\"\n const hasUsableNew = newText.length > 0 && newText !== \"0\"\n const hasUsableOld = oldText.length > 0 && oldText !== \"0\"\n const visibleText = hasUsableNew ? newText : hasUsableOld ? oldText : newText || oldText\n\n if (flexWrapper) flexWrapper.style.display = \"none\"\n if (spacer) spacer.style.display = \"none\"\n if (oldSpan) { oldSpan.style.display = \"none\"; oldSpan.style.width = \"auto\" }\n if (newSpan) { newSpan.style.display = \"none\"; newSpan.style.width = \"auto\" }\n\n gutter.style.paddingLeft = \"1px\"\n gutter.style.paddingRight = \"1px\"\n gutter.style.textAlign = \"left\"\n\n const label = currentLabel ?? document.createElement(\"span\")\n label.className = \"tool-call-diff-compact-line-number\"\n label.textContent = visibleText\n label.setAttribute(\"aria-hidden\", visibleText ? \"false\" : \"true\")\n if (!currentLabel) gutter.appendChild(label)\n\n entries.push({ gutter, label, text: visibleText })\n })\n\n const gutterWidthPx = computeCompactWidth(container, entries.map((entry) => ({ text: entry.text, source: entry.label })))\n const gutterWidth = `${gutterWidthPx}px`\n const compactAsideWidth = `${Math.max(8, gutterWidthPx - 10)}px`\n\n if (tableWrapper) {\n tableWrapper.style.setProperty(\"--diff-aside-width\", compactAsideWidth)\n tableWrapper.style.setProperty(\"--diff-aside-width--\", compactAsideWidth)\n }\n if (numberCol) {\n numberCol.style.width = gutterWidth\n }\n\n entries.forEach(({ gutter, label }) => {\n gutter.style.width = gutterWidth\n gutter.style.minWidth = gutterWidth\n gutter.style.maxWidth = gutterWidth\n label.style.width = \"auto\"\n label.style.maxWidth = \"none\"\n })\n\n hunkGutters.forEach((gutter) => {\n gutter.style.width = gutterWidth\n gutter.style.minWidth = gutterWidth\n gutter.style.maxWidth = gutterWidth\n gutter.style.paddingLeft = \"0\"\n gutter.style.paddingRight = \"0\"\n })\n}\n\nfunction applyCompactSplitGutter(container: HTMLElement) {\n const oldWrapper = container.querySelector<HTMLElement>(\".old-diff-table-wrapper\")\n const newWrapper = container.querySelector<HTMLElement>(\".new-diff-table-wrapper\")\n const numberCells = Array.from(container.querySelectorAll<HTMLElement>(\".diff-line-old-num, .diff-line-new-num\"))\n const hunkActions = Array.from(container.querySelectorAll<HTMLElement>(\".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper\"))\n const numberSpans = numberCells\n .map((cell) => ({ cell, span: cell.querySelector<HTMLElement>(\"[data-line-num]\") }))\n .filter((entry): entry is { cell: HTMLElement; span: HTMLElement } => Boolean(entry.span))\n\n const gutterWidthPx = computeCompactWidth(\n container,\n numberSpans.map(({ span }) => ({ text: span.textContent?.trim() ?? \"\", source: span })),\n 64,\n )\n const gutterWidth = `${gutterWidthPx}px`\n\n ;[oldWrapper, newWrapper].forEach((wrapper) => {\n if (wrapper) {\n wrapper.style.setProperty(\"--diff-aside-width\", gutterWidth)\n }\n })\n\n numberCells.forEach((cell) => {\n cell.style.width = gutterWidth\n cell.style.minWidth = gutterWidth\n cell.style.maxWidth = gutterWidth\n cell.style.paddingLeft = \"2px\"\n cell.style.paddingRight = \"2px\"\n cell.style.textAlign = \"left\"\n cell.style.whiteSpace = \"nowrap\"\n cell.style.overflowWrap = \"normal\"\n cell.style.wordBreak = \"normal\"\n })\n\n numberSpans.forEach(({ span }) => {\n span.style.whiteSpace = \"nowrap\"\n span.style.overflowWrap = \"normal\"\n span.style.wordBreak = \"normal\"\n })\n\n hunkActions.forEach((cell) => {\n cell.style.width = gutterWidth\n cell.style.minWidth = gutterWidth\n cell.style.maxWidth = gutterWidth\n cell.style.paddingLeft = \"0\"\n cell.style.paddingRight = \"0\"\n })\n}\n\nfunction applyCompactDiffLayout(container: HTMLElement, mode: DiffViewMode, wrap = false) {\n if (mode === \"unified\") {\n applyCompactUnifiedGutter(container, wrap)\n return\n }\n if (mode === \"split\") {\n applyCompactSplitGutter(container)\n }\n}\n\nexport function ToolCallDiffViewer(props: ToolCallDiffViewerProps) {\n const diffData = createMemo<DiffData | null>(() => {\n const normalized = normalizeDiffText(props.diffText)\n if (!normalized) {\n return null\n }\n \n const language = getLanguageFromPath(props.filePath) || \"text\"\n const fileName = props.filePath || \"diff\"\n \n return {\n oldFile: {\n fileName,\n fileLang: (language || \"text\") as DiffHighlighterLang | null,\n },\n newFile: {\n fileName,\n fileLang: (language || \"text\") as DiffHighlighterLang | null,\n },\n hunks: [normalized],\n }\n })\n \n let diffContainerRef: HTMLDivElement | undefined\n let lastCapturedKey: string | undefined\n \n const contextKey = createMemo(() => {\n const data = diffData()\n if (!data) return \"\"\n return `${props.theme}|${props.mode}|${props.wrap ? \"wrap\" : \"nowrap\"}|${props.diffText}`\n })\n \n createEffect(() => {\n const cachedHtml = props.cachedHtml\n if (cachedHtml) {\n if (diffContainerRef) {\n applyCompactDiffLayout(diffContainerRef, props.mode, Boolean(props.wrap))\n }\n // When we are given cached HTML, we rely on the caller's cache\n // and simply notify once rendered.\n props.onRendered?.()\n return\n }\n \n const key = contextKey()\n if (!key) return\n if (!diffContainerRef) return\n if (lastCapturedKey === key) return\n\n requestAnimationFrame(() => {\n if (!diffContainerRef) return\n applyCompactDiffLayout(diffContainerRef, props.mode, Boolean(props.wrap))\n const markup = diffContainerRef.innerHTML\n if (!markup) return\n lastCapturedKey = key\n if (props.cacheEntryParams) {\n setCacheEntry(props.cacheEntryParams, {\n text: props.diffText,\n html: markup,\n theme: props.theme,\n mode: props.mode,\n wrap: props.wrap,\n })\n }\n props.onRendered?.()\n })\n })\n\n\n return (\n <div class=\"tool-call-diff-viewer\">\n <Show\n when={props.cachedHtml}\n fallback={\n <div ref={diffContainerRef}>\n <Show\n when={diffData()}\n fallback={<pre class=\"tool-call-diff-fallback\">{props.diffText}</pre>}\n >\n {(data) => (\n <ErrorBoundary fallback={(error) => {\n log.warn(\"Failed to render diff view\", error)\n return <pre class=\"tool-call-diff-fallback\">{props.diffText}</pre>\n }}>\n <DiffView\n data={data()}\n diffViewMode={props.mode === \"split\" ? DiffModeEnum.Split : DiffModeEnum.Unified}\n diffViewTheme={props.theme}\n diffViewHighlight\n diffViewWrap={Boolean(props.wrap)}\n diffViewFontSize={13}\n />\n </ErrorBoundary>\n )}\n </Show>\n </div>\n }\n >\n <div ref={diffContainerRef} innerHTML={props.cachedHtml} />\n </Show>\n </div>\n )\n}\n"],"names":["log","getLogger","disableCache","measureTextWidth","container","text","source","computed","window","getComputedStyle","probe","document","createElement","textContent","style","position","visibility","pointerEvents","display","width","maxWidth","whiteSpace","fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","fontVariant","textTransform","lineHeight","appendChild","Math","ceil","getBoundingClientRect","remove","computeCompactWidth","entries","maxWidthPx","measuredLabelWidthPx","reduce","max","entry","fallbackTextLength","length","fallbackWidthPx","round","min","applyCompactUnifiedGutter","wrap","tableWrapper","querySelector","table","numberCol","gutterRows","querySelectorAll","hunkGutters","classList","add","tableLayout","minWidth","forEach","gutter","oldSpan","newSpan","spacer","flexWrapper","currentLabel","oldText","trim","newText","hasUsableNew","hasUsableOld","visibleText","paddingLeft","paddingRight","textAlign","label","className","setAttribute","push","gutterWidthPx","map","gutterWidth","compactAsideWidth","setProperty","applyCompactSplitGutter","oldWrapper","newWrapper","numberCells","Array","from","hunkActions","numberSpans","cell","span","filter","Boolean","wrapper","overflowWrap","wordBreak","applyCompactDiffLayout","mode","ToolCallDiffViewer","props","diffData","createMemo","normalized","normalizeDiffText","diffText","language","getLanguageFromPath","filePath","fileName","oldFile","fileLang","newFile","hunks","diffContainerRef","lastCapturedKey","contextKey","theme","createEffect","cachedHtml","onRendered","key","requestAnimationFrame","markup","innerHTML","cacheEntryParams","setCacheEntry","html","_el$","_tmpl$2","_$insert","_$createComponent","Show","when","fallback","_el$3","_tmpl$","_ref$2","_$use","_el$4","_tmpl$3","children","data","ErrorBoundary","error","warn","_el$5","DiffView","diffViewMode","_$memo","DiffModeEnum","Split","Unified","diffViewTheme","diffViewHighlight","diffViewWrap","diffViewFontSize","_el$2","_ref$","_$effect"],"mappings":"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"}
1
+ {"version":3,"file":"diff-viewer-FNBCogHl.js","sources":["../../../components/diff-viewer.tsx"],"sourcesContent":["import { createMemo, Show, createEffect } from \"solid-js\"\nimport { DiffView, DiffModeEnum } from \"@git-diff-view/solid\"\nimport \"@git-diff-view/solid/styles/diff-view-pure.css\"\nimport { disableCache } from \"@git-diff-view/core\"\nimport type { DiffHighlighterLang } from \"@git-diff-view/core\"\nimport { ErrorBoundary } from \"solid-js\"\nimport { getLanguageFromPath } from \"../lib/text-render-utils\"\nimport { normalizeDiffText } from \"../lib/diff-utils\"\nimport { setCacheEntry } from \"../lib/global-cache\"\nimport type { CacheEntryParams } from \"../lib/global-cache\"\nimport type { DiffViewMode } from \"../stores/preferences\"\nimport { getLogger } from \"../lib/logger\"\nconst log = getLogger(\"session\")\n\n\ndisableCache()\n\ninterface ToolCallDiffViewerProps {\n diffText: string\n filePath?: string\n theme: \"light\" | \"dark\"\n mode: DiffViewMode\n wrap?: boolean\n onRendered?: () => void\n cachedHtml?: string\n cacheEntryParams?: CacheEntryParams\n}\n\ntype DiffData = {\n oldFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }\n newFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }\n hunks: string[]\n}\n\nfunction measureTextWidth(container: HTMLElement, text: string, source: HTMLElement) {\n const computed = window.getComputedStyle(source)\n const probe = document.createElement(\"span\")\n probe.textContent = text || \"\"\n probe.style.position = \"absolute\"\n probe.style.visibility = \"hidden\"\n probe.style.pointerEvents = \"none\"\n probe.style.display = \"inline-block\"\n probe.style.width = \"auto\"\n probe.style.maxWidth = \"none\"\n probe.style.whiteSpace = \"nowrap\"\n probe.style.fontFamily = computed.fontFamily\n probe.style.fontSize = computed.fontSize\n probe.style.fontWeight = computed.fontWeight\n probe.style.fontStyle = computed.fontStyle\n probe.style.letterSpacing = computed.letterSpacing\n probe.style.fontVariant = computed.fontVariant\n probe.style.textTransform = computed.textTransform\n probe.style.lineHeight = computed.lineHeight\n container.appendChild(probe)\n const width = Math.ceil(probe.getBoundingClientRect().width)\n probe.remove()\n return width\n}\n\nfunction computeCompactWidth(\n container: HTMLElement,\n entries: Array<{ text: string; source: HTMLElement }>,\n maxWidthPx = 40,\n) {\n const measuredLabelWidthPx = entries.reduce((max, entry) => {\n return Math.max(max, measureTextWidth(container, entry.text, entry.source))\n }, 0)\n const fallbackTextLength = entries.reduce((max, entry) => Math.max(max, entry.text.length), 1)\n const fallbackWidthPx = Math.round(fallbackTextLength * 7 + 4)\n return Math.max(2, Math.min(maxWidthPx, measuredLabelWidthPx > 0 ? measuredLabelWidthPx + 2 : fallbackWidthPx))\n}\n\nfunction applyCompactUnifiedGutter(container: HTMLElement, wrap: boolean) {\n const tableWrapper = container.querySelector<HTMLElement>(\".unified-diff-table-wrapper\")\n const table = container.querySelector<HTMLTableElement>(\".unified-diff-table\")\n const numberCol = container.querySelector<HTMLTableColElement>(\".unified-diff-table-num-col\")\n const gutterRows = container.querySelectorAll<HTMLElement>(\".diff-line-num\")\n const hunkGutters = container.querySelectorAll<HTMLElement>(\".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper\")\n const entries: Array<{ gutter: HTMLElement; label: HTMLElement; text: string }> = []\n\n if (table) {\n if (wrap) {\n table.classList.add(\"table-fixed\")\n table.style.tableLayout = \"fixed\"\n table.style.width = \"100%\"\n table.style.minWidth = \"100%\"\n } else {\n table.classList.remove(\"table-fixed\")\n table.style.tableLayout = \"auto\"\n table.style.width = \"max-content\"\n table.style.minWidth = \"100%\"\n }\n }\n\n gutterRows.forEach((gutter) => {\n const oldSpan = gutter.querySelector<HTMLElement>(\"[data-line-old-num]\")\n const newSpan = gutter.querySelector<HTMLElement>(\"[data-line-new-num]\")\n const spacer = gutter.querySelector<HTMLElement>(\".shrink-0\")\n const flexWrapper = gutter.querySelector<HTMLElement>(\":scope > .flex\")\n const currentLabel = gutter.querySelector<HTMLElement>(\":scope > .tool-call-diff-compact-line-number\")\n\n const oldText = oldSpan?.textContent?.trim() ?? \"\"\n const newText = newSpan?.textContent?.trim() ?? \"\"\n const hasUsableNew = newText.length > 0 && newText !== \"0\"\n const hasUsableOld = oldText.length > 0 && oldText !== \"0\"\n const visibleText = hasUsableNew ? newText : hasUsableOld ? oldText : newText || oldText\n\n if (flexWrapper) flexWrapper.style.display = \"none\"\n if (spacer) spacer.style.display = \"none\"\n if (oldSpan) { oldSpan.style.display = \"none\"; oldSpan.style.width = \"auto\" }\n if (newSpan) { newSpan.style.display = \"none\"; newSpan.style.width = \"auto\" }\n\n gutter.style.paddingLeft = \"1px\"\n gutter.style.paddingRight = \"1px\"\n gutter.style.textAlign = \"left\"\n\n const label = currentLabel ?? document.createElement(\"span\")\n label.className = \"tool-call-diff-compact-line-number\"\n label.textContent = visibleText\n label.setAttribute(\"aria-hidden\", visibleText ? \"false\" : \"true\")\n if (!currentLabel) gutter.appendChild(label)\n\n entries.push({ gutter, label, text: visibleText })\n })\n\n const gutterWidthPx = computeCompactWidth(container, entries.map((entry) => ({ text: entry.text, source: entry.label })))\n const gutterWidth = `${gutterWidthPx}px`\n const compactAsideWidth = `${Math.max(8, gutterWidthPx - 10)}px`\n\n if (tableWrapper) {\n tableWrapper.style.setProperty(\"--diff-aside-width\", compactAsideWidth)\n tableWrapper.style.setProperty(\"--diff-aside-width--\", compactAsideWidth)\n }\n if (numberCol) {\n numberCol.style.width = gutterWidth\n }\n\n entries.forEach(({ gutter, label }) => {\n gutter.style.width = gutterWidth\n gutter.style.minWidth = gutterWidth\n gutter.style.maxWidth = gutterWidth\n label.style.width = \"auto\"\n label.style.maxWidth = \"none\"\n })\n\n hunkGutters.forEach((gutter) => {\n gutter.style.width = gutterWidth\n gutter.style.minWidth = gutterWidth\n gutter.style.maxWidth = gutterWidth\n gutter.style.paddingLeft = \"0\"\n gutter.style.paddingRight = \"0\"\n })\n}\n\nfunction applyCompactSplitGutter(container: HTMLElement) {\n const oldWrapper = container.querySelector<HTMLElement>(\".old-diff-table-wrapper\")\n const newWrapper = container.querySelector<HTMLElement>(\".new-diff-table-wrapper\")\n const numberCells = Array.from(container.querySelectorAll<HTMLElement>(\".diff-line-old-num, .diff-line-new-num\"))\n const hunkActions = Array.from(container.querySelectorAll<HTMLElement>(\".diff-line-hunk-action, .diff-line-widget-wrapper, .diff-line-extend-wrapper\"))\n const numberSpans = numberCells\n .map((cell) => ({ cell, span: cell.querySelector<HTMLElement>(\"[data-line-num]\") }))\n .filter((entry): entry is { cell: HTMLElement; span: HTMLElement } => Boolean(entry.span))\n\n const gutterWidthPx = computeCompactWidth(\n container,\n numberSpans.map(({ span }) => ({ text: span.textContent?.trim() ?? \"\", source: span })),\n 64,\n )\n const gutterWidth = `${gutterWidthPx}px`\n\n ;[oldWrapper, newWrapper].forEach((wrapper) => {\n if (wrapper) {\n wrapper.style.setProperty(\"--diff-aside-width\", gutterWidth)\n }\n })\n\n numberCells.forEach((cell) => {\n cell.style.width = gutterWidth\n cell.style.minWidth = gutterWidth\n cell.style.maxWidth = gutterWidth\n cell.style.paddingLeft = \"2px\"\n cell.style.paddingRight = \"2px\"\n cell.style.textAlign = \"left\"\n cell.style.whiteSpace = \"nowrap\"\n cell.style.overflowWrap = \"normal\"\n cell.style.wordBreak = \"normal\"\n })\n\n numberSpans.forEach(({ span }) => {\n span.style.whiteSpace = \"nowrap\"\n span.style.overflowWrap = \"normal\"\n span.style.wordBreak = \"normal\"\n })\n\n hunkActions.forEach((cell) => {\n cell.style.width = gutterWidth\n cell.style.minWidth = gutterWidth\n cell.style.maxWidth = gutterWidth\n cell.style.paddingLeft = \"0\"\n cell.style.paddingRight = \"0\"\n })\n}\n\nfunction applyCompactDiffLayout(container: HTMLElement, mode: DiffViewMode, wrap = false) {\n if (mode === \"unified\") {\n applyCompactUnifiedGutter(container, wrap)\n return\n }\n if (mode === \"split\") {\n applyCompactSplitGutter(container)\n }\n}\n\nexport function ToolCallDiffViewer(props: ToolCallDiffViewerProps) {\n const diffData = createMemo<DiffData | null>(() => {\n const normalized = normalizeDiffText(props.diffText)\n if (!normalized) {\n return null\n }\n \n const language = getLanguageFromPath(props.filePath) || \"text\"\n const fileName = props.filePath || \"diff\"\n \n return {\n oldFile: {\n fileName,\n fileLang: (language || \"text\") as DiffHighlighterLang | null,\n },\n newFile: {\n fileName,\n fileLang: (language || \"text\") as DiffHighlighterLang | null,\n },\n hunks: [normalized],\n }\n })\n \n let diffContainerRef: HTMLDivElement | undefined\n let lastCapturedKey: string | undefined\n \n const contextKey = createMemo(() => {\n const data = diffData()\n if (!data) return \"\"\n return `${props.theme}|${props.mode}|${props.wrap ? \"wrap\" : \"nowrap\"}|${props.diffText}`\n })\n \n createEffect(() => {\n const cachedHtml = props.cachedHtml\n if (cachedHtml) {\n if (diffContainerRef) {\n applyCompactDiffLayout(diffContainerRef, props.mode, Boolean(props.wrap))\n }\n // When we are given cached HTML, we rely on the caller's cache\n // and simply notify once rendered.\n props.onRendered?.()\n return\n }\n \n const key = contextKey()\n if (!key) return\n if (!diffContainerRef) return\n if (lastCapturedKey === key) return\n\n requestAnimationFrame(() => {\n if (!diffContainerRef) return\n applyCompactDiffLayout(diffContainerRef, props.mode, Boolean(props.wrap))\n const markup = diffContainerRef.innerHTML\n if (!markup) return\n lastCapturedKey = key\n if (props.cacheEntryParams) {\n setCacheEntry(props.cacheEntryParams, {\n text: props.diffText,\n html: markup,\n theme: props.theme,\n mode: props.mode,\n wrap: props.wrap,\n })\n }\n props.onRendered?.()\n })\n })\n\n\n return (\n <div class=\"tool-call-diff-viewer\">\n <Show\n when={props.cachedHtml}\n fallback={\n <div ref={diffContainerRef}>\n <Show\n when={diffData()}\n fallback={<pre class=\"tool-call-diff-fallback\">{props.diffText}</pre>}\n >\n {(data) => (\n <ErrorBoundary fallback={(error) => {\n log.warn(\"Failed to render diff view\", error)\n return <pre class=\"tool-call-diff-fallback\">{props.diffText}</pre>\n }}>\n <DiffView\n data={data()}\n diffViewMode={props.mode === \"split\" ? DiffModeEnum.Split : DiffModeEnum.Unified}\n diffViewTheme={props.theme}\n diffViewHighlight\n diffViewWrap={Boolean(props.wrap)}\n diffViewFontSize={13}\n />\n </ErrorBoundary>\n )}\n </Show>\n </div>\n }\n >\n <div ref={diffContainerRef} innerHTML={props.cachedHtml} />\n </Show>\n </div>\n )\n}\n"],"names":["log","getLogger","disableCache","measureTextWidth","container","text","source","computed","window","getComputedStyle","probe","document","createElement","textContent","style","position","visibility","pointerEvents","display","width","maxWidth","whiteSpace","fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","fontVariant","textTransform","lineHeight","appendChild","Math","ceil","getBoundingClientRect","remove","computeCompactWidth","entries","maxWidthPx","measuredLabelWidthPx","reduce","max","entry","fallbackTextLength","length","fallbackWidthPx","round","min","applyCompactUnifiedGutter","wrap","tableWrapper","querySelector","table","numberCol","gutterRows","querySelectorAll","hunkGutters","classList","add","tableLayout","minWidth","forEach","gutter","oldSpan","newSpan","spacer","flexWrapper","currentLabel","oldText","trim","newText","hasUsableNew","hasUsableOld","visibleText","paddingLeft","paddingRight","textAlign","label","className","setAttribute","push","gutterWidthPx","map","gutterWidth","compactAsideWidth","setProperty","applyCompactSplitGutter","oldWrapper","newWrapper","numberCells","Array","from","hunkActions","numberSpans","cell","span","filter","Boolean","wrapper","overflowWrap","wordBreak","applyCompactDiffLayout","mode","ToolCallDiffViewer","props","diffData","createMemo","normalized","normalizeDiffText","diffText","language","getLanguageFromPath","filePath","fileName","oldFile","fileLang","newFile","hunks","diffContainerRef","lastCapturedKey","contextKey","theme","createEffect","cachedHtml","onRendered","key","requestAnimationFrame","markup","innerHTML","cacheEntryParams","setCacheEntry","html","_el$","_tmpl$2","_$insert","_$createComponent","Show","when","fallback","_el$3","_tmpl$","_ref$2","_$use","_el$4","_tmpl$3","children","data","ErrorBoundary","error","warn","_el$5","DiffView","diffViewMode","_$memo","DiffModeEnum","Split","Unified","diffViewTheme","diffViewHighlight","diffViewWrap","diffViewFontSize","_el$2","_ref$","_$effect"],"mappings":"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"}