@davmash/bygone 0.10.1 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +64 -0
  3. package/bin/bygone.js +18 -1
  4. package/cli/commandSpec.js +22 -2
  5. package/cli/completions.js +30 -8
  6. package/cli/correspondence.js +71 -0
  7. package/cli/dependencies.js +62 -0
  8. package/cli/evidence.js +67 -0
  9. package/cli/present.js +61 -16
  10. package/cli/tour.js +18 -1
  11. package/cli/tourExport.js +1 -1
  12. package/completions/_bygone +15 -3
  13. package/completions/bygone +13 -5
  14. package/completions/bygone.fish +9 -0
  15. package/docs/change-tour-format.md +60 -6
  16. package/docs/correspondence.md +259 -0
  17. package/docs/dependencies.md +94 -0
  18. package/docs/evidence-review.md +163 -0
  19. package/docs/generating-change-tours.md +3 -0
  20. package/docs/present.md +3 -0
  21. package/docs/product-surface.md +2 -1
  22. package/docs/releasing.md +11 -0
  23. package/docs/vscode-integration.md +183 -0
  24. package/media/diff.worker.js +10 -9
  25. package/media/webview.css +1 -1
  26. package/media/webview.js +167 -167
  27. package/out/changeCorrespondence.js +739 -0
  28. package/out/changeTour.js +1366 -967
  29. package/out/dependencyGraph.js +213939 -0
  30. package/out/gitComparison.js +4 -0
  31. package/out/requirements.js +427 -0
  32. package/out/reviewDependencies.js +669 -0
  33. package/out/reviewWorkspace.js +1129 -0
  34. package/out/standalone-main.js +3382 -1341
  35. package/out/tourCoverage.js +1852 -1448
  36. package/package.json +2 -2
  37. package/schemas/change-tour-source.schema.json +48 -3
  38. package/web/export-runtime.json +6 -6
  39. package/web/index.html +13 -0
  40. package/web/presenter.css +81 -0
  41. package/web/web-host.js +23 -20
package/web/web-host.js CHANGED
@@ -1,17 +1,18 @@
1
- "use strict";(()=>{function dt(e,t){let o=new Map,a=t.map(i=>{let s=new Set(i);for(let l of i){let f=l.split("/");for(let p=1;p<f.length;p++)s.add(f.slice(0,p).join("/"))}return s});for(let i of e){let s=i.split("/");for(let l=0;l<s.length;l++){let f=s.slice(0,l+1).join("/");if(o.has(f))continue;let p=a.map(m=>m.has(f));o.set(f,{relativePath:f,displayName:s[l],depth:l,isDirectory:l<s.length-1,sides:p,status:p.every(Boolean)?"modified":p.length!==2?"partial":p[0]?"left-only":"right-only"})}}return[...o.values()].sort((i,s)=>{let l=i.relativePath.split("/"),f=s.relativePath.split("/");for(let p=0;p<Math.min(l.length,f.length);p++)if(l[p]!==f[p])return Number(p<f.length-1||s.isDirectory)-Number(p<l.length-1||i.isDirectory)||l[p].localeCompare(f[p]);return l.length-f.length})}function Qt(e,t){let o="overview"in t?t.overview:void 0,a=(o?.path||"").split("/").filter(I=>I&&I!==".").join("/"),i=I=>!a||I.startsWith(`${a}/`),s=[e.range.baseRef,e.range.headRef],l,f=[];if(t.kind==="stacked-diff"||t.kind==="deconstructed-diff"){let I=t.kind==="stacked-diff"?t.stack:t.panels,T=o?.comparison?I.findIndex(x=>x.id===o.comparison?.from):0,v=o?.comparison?I.findIndex(x=>x.id===o.comparison?.to):I.length-1;if(!I[T]||!I[v]||T===v)throw new Error(`Scene ${t.id} has invalid overview comparison endpoints.`);s=[I[T].label,I[v].label],l=t.files.flatMap(x=>{if(!i(x.path))return[];let N=x.panels[T],B=x.panels[v];if(!N||!B)return[];if(N.exists===B.exists&&N.content===B.content)return[];let M=N.exists?B.exists?"modified":"deleted":"added";return[{id:`${t.id}-overview-${x.path}`,kind:"text-diff",title:x.path,path:x.path,changeKind:M,leftContent:N.content,rightContent:B.content,leftLabel:s[0],rightLabel:s[1],summary:"",bullets:[],tags:[],takeaway:"",additions:0,deletions:0}]})}else l=e.files.filter(I=>I.kind==="text-diff"&&i(I.path)),f=e.files.filter(I=>I.kind==="omitted"&&i(I.path));let p=[...l,...f],m=new Map(p.map(I=>[I.path,I])),y=[new Set(p.filter(I=>I.changeKind!=="added").map(I=>I.path)),new Set(p.filter(I=>I.changeKind!=="deleted").map(I=>I.path))],b=dt(p.map(I=>I.path),y).map(I=>{let T=m.get(I.relativePath);return!T||I.isDirectory?I:{...I,gitChangeKind:T.changeKind,...T.previousPath?{previousPath:T.previousPath}:{},...T.kind==="omitted"?{relationSummary:`Unavailable: ${T.reason}`}:{}}}),E=a?` / ${a}/`:"";return{entries:b,files:l,labels:[s[0]+E,s[1]+E],omitted:f}}function en(e,t){if(t.kind==="title"||t.kind==="chapter"||t.kind==="conclusion")return"narrative";let o=e.scenes[t.sceneIndex];return!o||o.kind==="discussion"?"narrative":t.kind==="step"||o.kind==="text-diff"?"evidence":o.overview?"overview":"preview"}function fe(e,t,o="",a){let i=en(e,t);if(i==="narrative")return null;let s=e.scenes[t.sceneIndex],l=i==="overview",f="steps"in s?s.steps[t.kind==="step"?t.stepIndex:0]:void 0,p=[e.range.mergeBaseOid,e.range.headOid],m=[lt(e.range.baseRef,p[0]),lt(e.range.headRef,p[1])],y=s.kind==="deconstructed-diff"?"synthetic":"real";if(s.kind==="stacked-diff"||s.kind==="deconstructed-diff"){let I=s.kind==="stacked-diff"?s.stack:s.panels,T=a??(f&&"pairIndex"in f?f.pairIndex:0),v=l?s.overview?.comparison?I.findIndex(N=>N.id===s.overview?.comparison?.from):0:T,x=l?s.overview?.comparison?I.findIndex(N=>N.id===s.overview?.comparison?.to):I.length-1:T+1;if(!I[v]||!I[x])throw new Error(`Scene ${s.id} has unavailable comparison endpoints.`);s.kind==="stacked-diff"?(p=[s.stack[v].oid,s.stack[x].oid],m=[lt(I[v].label,p[0]),lt(I[x].label,p[1])]):(p=[I[v].id,I[x].id],m=[I[v].label,I[x].label])}let b=l?`Directory: ${"overview"in s&&s.overview?.path||"/"} (authored inventory)`:s.kind==="text-diff"?s.path:f&&"diff"in f?f.diff.path:f&&"file"in f?f.file:"",E=l?Qt(e,s):null;return{kind:y,labels:m,scope:b,overview:l,comparisonKey:JSON.stringify(y==="real"?[y,...p]:[y,o,e.generatedAt,e.range.mergeBaseOid,e.range.headOid,s.id,...p]),scopeKey:JSON.stringify([b,...E?[...E.files,...E.omitted].map(I=>I.path).sort():[]])}}function eo(e,t){let o=[e.range.mergeBaseOid,e.range.headOid];return{kind:"real",comparisonKey:JSON.stringify(["real",...o]),labels:[lt(e.range.baseRef,o[0]),lt(e.range.headRef,o[1])],scope:t,scopeKey:JSON.stringify([t]),overview:!1}}function ut(e){return`${e.kind==="synthetic"?"Explanation stages":"Comparison"}: ${e.labels.join(" \u2192 ")} \xB7 ${e.scope}`}function qn(e,t){if(!e)return ut(t);if(e.kind!==t.kind)return`${t.kind==="synthetic"?"Switching to explanation stages":"Switching to real revisions"}. ${ut(t)}`;if(e.comparisonKey!==t.comparisonKey)return`${t.kind==="synthetic"?"Explanation stages changed":"Revision comparison changed"}: ${e.labels.join(" \u2192 ")} to ${t.labels.join(" \u2192 ")} \xB7 ${t.scope}`;let o=e.scopeKey!==t.scopeKey?`${e.overview||t.overview?"view":"file"} changed from ${e.scope} to ${t.scope}`:`same ${t.overview?"directory view":"file"}: ${t.scope}`;return`Same ${t.kind==="synthetic"?"explanation stages":"revision comparison"}; ${o} \xB7 ${t.labels.join(" \u2192 ")}`}function lt(e,t){return e===t||e===t.slice(0,7)?t.slice(0,7):`${e} (${t.slice(0,7)})`}function Fe(e,t){if(t.kind==="chapter"){let a=e.chapters.findIndex(i=>i.id===t.chapterId);return e.chapters[a].title}let o=e.scenes[t.sceneIndex];return t.kind==="step"&&"steps"in o?o.steps[t.stepIndex].title:o.title}function to(e,t){let o=e.scenes[t];return o.kind==="discussion"?[]:("steps"in o?o.steps.flatMap((i,s)=>"image"in i&&i.image?[]:[{kind:"step",key:`step:${o.id}:${i.id}`,sceneIndex:t,stepIndex:s}]):[{kind:"scene",key:`scene:${o.id}`,sceneIndex:t,stepIndex:0}]).map(i=>fe(e,i)).filter(Boolean)}function Rt(e){let t=e.scenes.map((i,s)=>({sceneIndex:s,title:Fe(e,{kind:"scene",key:`scene:${i.id}`,sceneIndex:s,stepIndex:0}),purpose:i.summary,evidence:ps(e,s)})),o=(e.chapters||[]).map((i,s)=>{let l=t.filter(T=>i.sceneIds.includes(e.scenes[T.sceneIndex].id)),f=l.flatMap(T=>to(e,T.sceneIndex)),p=[...f];for(let T of l){let v=e.scenes[T.sceneIndex];if("overview"in v&&v.overview&&!(v.kind==="walkthrough"&&v.steps.every(x=>x.image))){let x=fe(e,{kind:"scene",key:`scene:${v.id}`,sceneIndex:T.sceneIndex,stepIndex:0});x&&p.push(x)}}let m=p.filter((T,v)=>p.findIndex(x=>x.comparisonKey===T.comparisonKey)===v),y=[...new Set(f.map(T=>T.scope))],b=l.reduce((T,v)=>{let x=e.scenes[v.sceneIndex];return T+("steps"in x?x.steps.length:0)},0),E=y.length?`Focus files: ${y.join(", ")}.`:"No code steps; this chapter uses discussion or images.",I=m.map(T=>`${T.kind==="synthetic"?"Constructed stages":"Revisions"}: ${T.labels.join(" \u2192 ")}.`).join(" ");return{chapterIndex:s,chapterId:i.id,title:i.title,...i.summary?{summary:i.summary}:{},evidence:`${l.length} ${l.length===1?"scene":"scenes"} \xB7 ${b} ${b===1?"step":"steps"}. ${E}${I?` ${I}`:""}`,scenes:l}}),a=e.scenes.reduce((i,s)=>i+("steps"in s?s.steps.length:0),0);return{summary:`${o.length} ${o.length===1?"chapter":"chapters"} \u2192 ${t.length} ${t.length===1?"scene":"scenes"} \u2192 ${a} ${a===1?"step":"steps"}. Chapters group topics; scenes explain one idea; steps show the evidence.`,chapters:o,scenes:t}}function ps(e,t){let o=e.scenes[t];if(o.kind==="discussion")return"Discussion: pause to connect the findings. No code comparison is displayed.";if(o.kind==="walkthrough"&&o.steps.every(b=>b.image))return`${o.steps.length} images in reading order. Each step explains what to notice in its image.`;let a=o.kind==="walkthrough"?o.steps.filter(b=>b.image).length:0,i=to(e,t),s=i.map(b=>b.scope).filter((b,E,I)=>E===0||b!==I[E-1]),l=i.filter((b,E)=>E===0||b.comparisonKey!==i[E-1].comparisonKey),f=`${"steps"in o?`${o.steps.length} ${o.steps.length===1?"step":"steps"}. `:""}${s.length===1?"File":"Files in order"}: ${s.join(" \u2192 ")}.`,p=`${o.kind==="deconstructed-diff"?"Explanation stages (constructed, not commits)":"Revisions"}: ${l.map(b=>b.labels.join(" \u2192 ")).join("; then ")}.`,m="overview"in o&&o.overview?fe(e,{kind:"scene",key:`scene:${o.id}`,sceneIndex:t,stepIndex:0}):null;return`${m?`Starts with a directory overview${m.comparisonKey!==i[0]?.comparisonKey?` (${m.labels.join(" \u2192 ")})`:""}, then follows the evidence. `:""}${f} ${p}${a?` Also includes ${a} image ${a===1?"step":"steps"}.`:""}`}function tn(e,t,o){let a=e.scenes[t];if(!("steps"in a))return"";let i=a.steps[o],s=`Step ${o+1} of ${a.steps.length}.`;if("image"in i&&i.image)return`${s} Image: ${i.title}.`;let l={kind:"step",key:`step:${a.id}:${i.id}`,sceneIndex:t,stepIndex:o},f=fe(e,l),p=o>0&&!(a.kind==="walkthrough"&&a.steps[o-1].image)?fe(e,{...l,stepIndex:o-1}):null;if(!p)return`${s} Evidence in ${f.scope}.`;let m=p.comparisonKey!==f.comparisonKey,y=p.scope!==f.scope,b=f.kind==="synthetic"?"explanation stages":"revisions",E=m?`Switch ${b} to ${f.labels.join(" \u2192 ")}.`:`Keep the same ${b}.`;return`${s} ${E} ${y?`Move from ${p.scope} to ${f.scope}.`:`Continue in ${f.scope}.`}`}function We(e,t){if(!e.currentPath||t!==-1&&t!==1)return null;let o=e.paths.indexOf(e.currentPath);if(o<0)return null;for(let a=o+t;a>=0&&a<e.paths.length;a+=t)if(!e.changedPaths||e.changedPaths.has(e.paths[a]))return e.paths[a];return null}function ms(e){return{canGoPrevious:We(e,-1)!==null,canGoNext:We(e,1)!==null}}function no(e,t,o){if(e.type==="returnToDirectory")return o?{path:null}:null;if(e.type==="openDirectoryEntry")return typeof e.relativePath=="string"&&t.paths.includes(e.relativePath)?{path:e.relativePath}:null;if(e.type==="navigateFile"&&(e.direction==="previous"||e.direction==="next")){let a=We(t,e.direction==="previous"?-1:1);return a===null?null:{path:a}}return null}function nn(e,t){return{type:"showDirectoryDiff",labels:e,leftLabel:e[0],rightLabel:e[e.length-1],entries:t,canMutate:!1}}function jn(e,t){return e.slice(0,-1).map((o,a)=>({leftIndex:a,rightIndex:a+1,...t?{diffModel:t(o,e[a+1])}:{}}))}function rn(e,t){let{files:o,...a}=e;return{type:"showMultiDiff",...a,pairs:jn(a.panels,t),fileNavigation:ms(o)}}function ro(e,t){let o=t.displayed||[],a=s=>({active:s===t.active,selected:s!==null&&t.selected.includes(s),panelNumber:o.indexOf(s)+1||void 0}),i=e.map((s,l)=>({kind:"history-entry",index:l,commit:s.commit,label:`${s.shortCommit} ${s.summary}`.trim(),meta:s.timestamp||"",summary:s.summary,timestamp:s.timestamp,author:s.author,authorEmail:s.authorEmail,message:s.message,parents:s.parents||(s.parentCommit?[s.parentCommit]:[]),selectionEnabled:t.selectionEnabled,...a(s.commit),...t.changed?{changesFile:t.changed.has(s.commit)}:{},...t.tourCommits?{inTour:t.tourCommits.has(s.commit)}:{}}));return o.forEach((s,l)=>{s===void 0||i.some(f=>f.commit===s)||i.push({kind:"panel-revision",index:-l-1,commit:s,label:t.missingRevisionLabel(s),meta:"",summary:"",timestamp:void 0,author:void 0,authorEmail:void 0,message:void 0,parents:[],selectionEnabled:!!t.missingRevisionSelectionEnabled,...a(s)})}),i}function oo(){let e,t;function o(){t?.close(),t?.remove(),e?.remove(),t=e=void 0,document.body.classList.remove("tour-image-active")}function a(i,s){o(),e=document.createElement("figure"),e.className="tour-image-evidence";let l=document.createElement("figcaption"),f=document.createElement("span");f.textContent=s;let p=document.createElement("button");p.type="button",p.textContent="Expand image";let m=document.createElement("img");m.src=i.dataUrl,m.alt=i.alt,m.addEventListener("error",()=>{f.textContent=`${s} \u2014 image could not be decoded`}),l.append(f,p),e.append(l,m),document.getElementById("container").append(e),document.body.classList.add("tour-image-active"),p.addEventListener("click",()=>{t?.remove(),t=document.createElement("dialog"),t.className="tour-image-dialog",t.setAttribute("aria-label",s);let y=document.createElement("button");y.type="button",y.textContent="Close image",y.addEventListener("click",()=>t.close()),t.append(y,m.cloneNode()),document.body.append(t),t.showModal()})}return{show:a,clear:o,isVisible:()=>!!e}}var gs=/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/,Wn=["part","chapter","scene","step"];function De(e,t){let o=e.get(t);if(!o||o.length>4096||/[\u0000-\u001f\u007f]/.test(o))throw new Error(`Invalid or missing ${t}.`);return o}function io(e){if(!e||e.startsWith("/")||e.includes("\\")||e.includes("\0")||e.split("/").some(t=>!t||t==="."||t===".."))throw new Error("Expected a repository-relative path without traversal.");return e}function Kn(e,t,o=[]){for(let a of e.keys()){if(!t.includes(a))throw new Error(`Unsupported link field: ${a}.`);if(!o.includes(a)&&e.getAll(a).length!==1)throw new Error(`Duplicate link field: ${a}.`)}}function so(e){let t=new URL(e);if(t.protocol!=="file:"||t.hostname||t.search||t.hash||t.username||t.password||!t.pathname.startsWith("/"))throw new Error("Links require a local file URL.");return e}function ao(e){let t=De(e,"part"),o=t==="title"||t==="conclusion"?[]:t==="chapter"?["chapter"]:t==="scene"?["scene"]:t==="step"?["scene","step"]:null;if(!o)throw new Error(`Unsupported document part: ${t}.`);for(let a of Wn.filter(i=>i!=="part"))if(e.has(a)&&!o.includes(a))throw new Error(`${a} is incompatible with ${t}.`);return Object.fromEntries([["part",t],...o.map(a=>[a,De(e,a)])])}function Gn(e){if(e.length>16384||/%(?![\da-f]{2})/i.test(e))throw new Error("Invalid or oversized Bygone link.");let t=new URL(e);if(t.protocol!=="bygone:"||t.hostname!=="open"||t.pathname!=="/v1"||t.username||t.password||t.port||t.hash)throw new Error("Unsupported Bygone link address or version.");let o=t.searchParams,a=De(o,"kind"),i=so(De(o,"repo"));if(a==="tour"){Kn(o,["kind","repo","tour","mode",...Wn]);let m=De(o,"mode");if(m!=="historical"&&m!=="deconstructed")throw new Error("Unsupported authored tour mode.");let y=De(o,"tour");return/^[a-z][a-z\d+.-]*:/i.test(y)?so(y):io(y),{kind:a,repo:i,tour:y,mode:m,focus:ao(o)}}if(a!=="compare")throw new Error("Unsupported Bygone link kind.");Kn(o,["kind","repo","rev","file","revision","line"],["rev"]);let s=o.getAll("rev");if(s.length!==2||s.some(m=>!gs.test(m))||s[0]===s[1])throw new Error("Comparison links require two distinct full commit IDs in order.");let l=o.has("file")?io(De(o,"file")):void 0,f=o.has("revision")?De(o,"revision"):void 0;if(f&&(!l||!s.includes(f)))throw new Error("Code focus requires a file and one of the comparison revisions.");let p=o.has("line")?Number(De(o,"line")):void 0;if(p!==void 0&&(!f||!Number.isSafeInteger(p)||p<1))throw new Error("Line focus requires a revision and positive line number.");return{kind:a,repo:i,revisions:s,...l?{file:l}:{},...f?{revision:f}:{},...p!==void 0?{line:p}:{}}}function co(e){let t=new URL("bygone://open/v1");if(t.searchParams.set("kind",e.kind),t.searchParams.set("repo",e.repo),e.kind==="tour"){t.searchParams.set("tour",e.tour),t.searchParams.set("mode",e.mode);for(let[o,a]of Object.entries(e.focus))t.searchParams.set(o,a)}else{for(let o of e.revisions)t.searchParams.append("rev",o);for(let o of["file","revision","line"])e[o]!==void 0&&t.searchParams.set(o,String(e[o]))}return Gn(t.href),t.href}function ys(e,t){if(e.tours){let a=e.tours[t];if(!a)throw new Error(`This tour has no ${t} mode.`);return a}let o=e.scenes.some(a=>a.kind==="deconstructed-diff");if(t==="deconstructed"&&o||t==="historical"&&!o)return e;if(t==="historical"&&e.zoom?.final.scenes.some(a=>a.kind==="walkthrough"))return e.zoom.final;throw new Error(`This tour has no ${t} mode.`)}function Vn(e,t,o){let a=ys(e,t);if(o.part==="title")return{key:"title",sceneIndex:0,stepIndex:0};if(o.part==="conclusion"){if(!a.conclusion)throw new Error("Conclusion is unavailable in this tour mode.");return{key:"conclusion",sceneIndex:-1,stepIndex:0}}if(o.part==="chapter"){let f=a.chapters.find(m=>m.id===o.chapter),p=a.scenes.findIndex(m=>m.id===f?.sceneIds[0]);if(!f||p<0)throw new Error(`Chapter is unavailable: ${o.chapter}.`);return{key:f.summary?.trim()?`chapter:${f.id}`:`scene:${a.scenes[p].id}`,sceneIndex:p,stepIndex:0}}let i=a.scenes.findIndex(f=>f.id===o.scene);if(i<0)throw new Error(`Scene is unavailable: ${o.scene}.`);let s=a.scenes[i];if(o.part==="scene")return{key:`scene:${s.id}`,sceneIndex:i,stepIndex:0};let l="steps"in s?s.steps.findIndex(f=>f.id===o.step):-1;if(l<0)throw new Error(`Step is unavailable: ${o.step}.`);return{key:`step:${s.id}:${o.step}`,sceneIndex:i,stepIndex:l}}function Ze(e,t){return`#${new URLSearchParams({location:"1",mode:e,...t})}`}function Jn(e){if(!e)return null;if(e.length>16384||/%(?![\da-f]{2})/i.test(e))throw new Error("Oversized tour location.");let t=new URLSearchParams(e.replace(/^#/,""));if(Kn(t,["location","mode",...Wn]),t.get("location")!=="1")throw new Error("Unsupported tour location version.");let o=t.get("mode");if(o!=="historical"&&o!=="deconstructed")throw new Error("Unsupported tour location mode.");return{mode:o,focus:ao(t)}}function Me(){}Me.prototype={diff:function(t,o){var a,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s=i.callback;typeof i=="function"&&(s=i,i={}),this.options=i;var l=this;function f(n){return s?(setTimeout(function(){s(void 0,n)},0),!0):n}t=this.castInput(t),o=this.castInput(o),t=this.removeEmpty(this.tokenize(t)),o=this.removeEmpty(this.tokenize(o));var p=o.length,m=t.length,y=1,b=p+m;i.maxEditLength&&(b=Math.min(b,i.maxEditLength));var E=(a=i.timeout)!==null&&a!==void 0?a:1/0,I=Date.now()+E,T=[{oldPos:-1,lastComponent:void 0}],v=this.extractCommon(T[0],o,t,0);if(T[0].oldPos+1>=m&&v+1>=p)return f([{value:this.join(o),count:o.length}]);var x=-1/0,N=1/0;function B(){for(var n=Math.max(x,-y);n<=Math.min(N,y);n+=2){var F=void 0,V=T[n-1],O=T[n+1];V&&(T[n-1]=void 0);var j=!1;if(O){var J=O.oldPos-n;j=O&&0<=J&&J<p}var oe=V&&V.oldPos+1<m;if(!j&&!oe){T[n]=void 0;continue}if(!oe||j&&V.oldPos+1<O.oldPos?F=l.addToPath(O,!0,void 0,0):F=l.addToPath(V,void 0,!0,1),v=l.extractCommon(F,o,t,n),F.oldPos+1>=m&&v+1>=p)return f(ws(l,F.lastComponent,o,t,l.useLongestToken));T[n]=F,F.oldPos+1>=m&&(N=Math.min(N,n-1)),v+1>=p&&(x=Math.max(x,n+1))}y++}if(s)(function n(){setTimeout(function(){if(y>b||Date.now()>I)return s();B()||n()},0)})();else for(;y<=b&&Date.now()<=I;){var M=B();if(M)return M}},addToPath:function(t,o,a,i){var s=t.lastComponent;return s&&s.added===o&&s.removed===a?{oldPos:t.oldPos+i,lastComponent:{count:s.count+1,added:o,removed:a,previousComponent:s.previousComponent}}:{oldPos:t.oldPos+i,lastComponent:{count:1,added:o,removed:a,previousComponent:s}}},extractCommon:function(t,o,a,i){for(var s=o.length,l=a.length,f=t.oldPos,p=f-i,m=0;p+1<s&&f+1<l&&this.equals(o[p+1],a[f+1]);)p++,f++,m++;return m&&(t.lastComponent={count:m,previousComponent:t.lastComponent}),t.oldPos=f,p},equals:function(t,o){return this.options.comparator?this.options.comparator(t,o):t===o||this.options.ignoreCase&&t.toLowerCase()===o.toLowerCase()},removeEmpty:function(t){for(var o=[],a=0;a<t.length;a++)t[a]&&o.push(t[a]);return o},castInput:function(t){return t},tokenize:function(t){return t.split("")},join:function(t){return t.join("")}};function ws(e,t,o,a,i){for(var s=[],l;t;)s.push(t),l=t.previousComponent,delete t.previousComponent,t=l;s.reverse();for(var f=0,p=s.length,m=0,y=0;f<p;f++){var b=s[f];if(b.removed){if(b.value=e.join(a.slice(y,y+b.count)),y+=b.count,f&&s[f-1].added){var I=s[f-1];s[f-1]=s[f],s[f]=I}}else{if(!b.added&&i){var E=o.slice(m,m+b.count);E=E.map(function(v,x){var N=a[y+x];return N.length>v.length?N:v}),b.value=e.join(E)}else b.value=e.join(o.slice(m,m+b.count));m+=b.count,b.added||(y+=b.count)}}var T=s[p-1];return p>1&&typeof T.value=="string"&&(T.added||T.removed)&&e.equals("",T.value)&&(s[p-2].value+=T.value,s.pop()),s}var bs=new Me;function fo(e,t,o){return bs.diff(e,t,o)}var lo=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,uo=/\S/,Xn=new Me;Xn.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!uo.test(e)&&!uo.test(t)};Xn.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),o=0;o<t.length-1;o++)!t[o+1]&&t[o+2]&&lo.test(t[o])&&lo.test(t[o+2])&&(t[o]+=t[o+2],t.splice(o+1,2),o--);return t};function ho(e,t,o){return Xn.diff(e,t,o)}var Zn=new Me;Zn.tokenize=function(e){this.options.stripTrailingCr&&(e=e.replace(/\r\n/g,`
2
- `));var t=[],o=e.split(/(\n|\r\n)/);o[o.length-1]||o.pop();for(var a=0;a<o.length;a++){var i=o[a];a%2&&!this.options.newlineIsToken?t[t.length-1]+=i:(this.options.ignoreWhitespace&&(i=i.trim()),t.push(i))}return t};function po(e,t,o){return Zn.diff(e,t,o)}var vs=new Me;vs.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var xs=new Me;xs.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function on(e){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?on=function(t){return typeof t}:on=function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},on(e)}var ks=Object.prototype.toString,Pt=new Me;Pt.useLongestToken=!0;Pt.tokenize=Zn.tokenize;Pt.castInput=function(e){var t=this.options,o=t.undefinedReplacement,a=t.stringifyReplacer,i=a===void 0?function(s,l){return typeof l>"u"?o:l}:a;return typeof e=="string"?e:JSON.stringify(Yn(e,null,null,i),i," ")};Pt.equals=function(e,t){return Me.prototype.equals.call(Pt,e.replace(/,([\r\n])/g,"$1"),t.replace(/,([\r\n])/g,"$1"))};function Yn(e,t,o,a,i){t=t||[],o=o||[],a&&(e=a(i,e));var s;for(s=0;s<t.length;s+=1)if(t[s]===e)return o[s];var l;if(ks.call(e)==="[object Array]"){for(t.push(e),l=new Array(e.length),o.push(l),s=0;s<e.length;s+=1)l[s]=Yn(e[s],t,o,a,i);return t.pop(),o.pop(),l}if(e&&e.toJSON&&(e=e.toJSON()),on(e)==="object"&&e!==null){t.push(e),l={},o.push(l);var f=[],p;for(p in e)e.hasOwnProperty(p)&&f.push(p);for(f.sort(),s=0;s<f.length;s+=1)p=f[s],l[p]=Yn(e[p],t,o,a,p);t.pop(),o.pop()}else l=e;return l}var sn=new Me;sn.tokenize=function(e){return e.slice()};sn.join=sn.removeEmpty=function(e){return e};function mo(e,t,o){return sn.diff(e,t,o)}function go(e){let t=e.manifest,o=e.history,a=[t.range.mergeBaseOid,t.range.headOid],i=p=>{let m=o?.commits.find(y=>y.oid===p);if(!m)throw new Error(`Revision ${p} is outside this export.`);return m},s=(p,m)=>{if(i(p),!o.paths.includes(m))throw new Error(`File ${m} is outside this export.`);let y=o.snapshots[p][m];if(y?.omitted)throw new Error(`${m}: ${y.omitted}`);return y?e.texts[y.blob]:null},l=p=>{let m=new Set,y=b=>{m.has(b)||!o.commits.some(E=>E.oid===b)||(m.add(b),i(b).parents.forEach(y))};return y(p),m},f=(p,m)=>po(p||"",m||"").reduce((y,b)=>(b.added&&(y.additions+=b.count),b.removed&&(y.deletions+=b.count),y),{additions:0,deletions:0});return async(p,m)=>{if(p==="changed-files"){if(!o)throw new Error("Git history is not included in this Minimal export.");let E=m.commits;if(!Array.isArray(E))throw new Error("Expected displayed revisions.");E.filter(T=>T!==null).forEach(i);let I=o.paths.filter(T=>{let v=E.map(x=>x===null?void 0:o.snapshots[x][T]);return v.some(x=>JSON.stringify(x)!==JSON.stringify(v[0]))});return{paths:I,...m.includeFiles?{files:o.paths.filter(T=>E.some(v=>v!==null&&o.snapshots[v][T])).map(T=>{let v=E.map(x=>x===null?null:o.snapshots[x][T]).find(x=>x?.omitted);return{kind:v?"omitted":"text-diff",path:T,changeKind:I.includes(T)?"modified":"unchanged",...v?{reason:v.omitted}:{}}})}:{},...m.includeEntries?{entries:dt(I,E.map(T=>new Set(T===null?[]:o.paths.filter(v=>o.snapshots[T][v]))))}:{}}}if(p==="compare-many"){let E=m.commits;if(!Array.isArray(E)||E.length<2||new Set(E).size!==E.length)throw new Error("Select at least two different included revisions.");if(!o){if(E.length!==2||E.some((x,N)=>x!==a[N]))throw new Error("Minimal exports support only the fixed base \u2192 head comparison.");if(m.path&&!t.files.some(x=>x.path===m.path||x.previousPath===m.path))throw new Error("File is outside the exported scope.");let v=t.files.filter(x=>!m.path||x.path===m.path||x.previousPath===m.path).map(x=>({...x,comparisonPanels:E.map((N,B)=>({id:`compare-${N}`,commit:N,editable:!1,path:B===0&&x.previousPath||x.path,label:B===0?x.leftLabel:x.rightLabel,content:(B===0?x.leftContent:x.rightContent)||""}))}));return{commits:E,files:v,entries:dt(v.map(x=>x.path),E.map((x,N)=>new Set(v.filter(B=>N===0?B.changeKind!=="added":B.changeKind!=="deleted").map(B=>B.path))))}}if(E.forEach(i),m.path&&!o.paths.includes(m.path))throw new Error("File is outside the exported scope.");let T=(m.path?[m.path]:o.paths).flatMap(v=>{let x=E.map(n=>o.snapshots[n][v]);if(!m.path&&x.every(n=>JSON.stringify(n)===JSON.stringify(x[0])))return[];let N=x.find(n=>n?.omitted),B=x.map(n=>n?.blob?e.texts[n.blob]:""),M=B.slice(1).reduce((n,F,V)=>{let O=f(B[V],F);return{additions:n.additions+O.additions,deletions:n.deletions+O.deletions}},{additions:0,deletions:0});return[{kind:N?"omitted":"text-diff",path:v,...M,...N?{reason:N.omitted}:{},changeKind:x[0]?x.at(-1)?"modified":"deleted":"added",comparisonPanels:E.map((n,F)=>({id:`compare-${n}`,commit:n,path:v,label:`${v} @ ${n.slice(0,7)}${x[F]?"":" (absent)"}`,content:B[F],editable:!1}))}]});return{commits:E,files:T,entries:dt(T.map(v=>v.path),E.map(v=>new Set(T.filter(x=>o.snapshots[v][x.path]).map(x=>x.path))))}}if(!o)throw new Error("Git history is not included in this Minimal export.");let y=m.commit||t.range.headOid,b=i(y);if(p==="list"){let E=l(y),I=o.commits.filter(T=>E.has(T.oid));if(m.path){if(!o.paths.includes(m.path))throw new Error("File is outside the exported scope.");I=I.filter(T=>{let v=o.snapshots[T.parents[0]];return!v||JSON.stringify(o.snapshots[T.oid][m.path])!==JSON.stringify(v[m.path])})}return{entries:I,selectedIndex:I.length?0:-1,selectedCommit:I[0]?.oid||null}}if(p==="diff"){let E=b.parents[0]||null;if(E&&!o.snapshots[E])throw new Error("The parent revision is outside this export. Compare two included revisions instead.");let I=E?s(E,m.path):null,T=s(y,m.path);return{commit:y,parentCommit:E,path:m.path,leftContent:I||"",rightContent:T||"",leftLabel:`${m.path} @ ${E?.slice(0,7)||"empty"}`,rightLabel:`${m.path} @ ${y.slice(0,7)}`}}throw new Error(`Unsupported export operation: ${p}.`)}}var Is=2e4,Ss=100,ln=Bo("BYGONE_MAX_INLINE_HIGHLIGHT_LINE_LENGTH",Is),Ro=Bo("BYGONE_DIFF_TIMEOUT_MS",Ss);function we(e,t,o={}){let a=bo(e),i=bo(t);if(e===t)return wo(a);if(a.length===i.length&&a.every((v,x)=>v===i[x])){let v=wo(a),x=e.match(/[^\n]*\n|[^\n]+$/g)||[],N=t.match(/[^\n]*\n|[^\n]+$/g)||[];return a.forEach((B,M)=>{x[M]!==N[M]&&(v.leftLines[M].kind=v.rows[M].left.kind="removed",v.rightLines[M].kind=v.rows[M].right.kind="added",v.leftLines[M].inlineDetail=v.rightLines[M].inlineDetail="line-ending",v.blocks.push(Ft("replace",M,M+1,M,M+1)))}),v.blocks=yo(v.blocks),v.hasChanges=!0,v.formattingOnly=!0,v}let s=Cs(a,i),l=mo(s.left,s.right,{timeout:o.timeoutMs??Ro});if(!l)return Ts(a,i);let f=l.map(v=>({...v,value:v.value.map(x=>s.lines[x])})),p=[],m=[],y=[],b=[],E=1,I=1;for(let v=0;v<f.length;v++){let x=f[v],N=x.removed?x.value:[],B=x.added?x.value:[];if(!x.added&&!x.removed){for(let M of x.value)m.push(Te("context",M,E)),y.push(Te("context",M,I)),p.push(Qe(Ce("context",M,E++),Ce("context",M,I++)));continue}if(x.removed&&v+1<f.length&&f[v+1].added){let M=f[v+1],n=$s(N,M.value,E,I,p,m,y,b);E=n.left,I=n.right,v++;continue}if(x.removed){let M=m.length,n=y.length;for(let F of N)m.push(Te("removed",F,E)),p.push(Qe(Ce("removed",F,E++),ht()));b.push(Ft("delete",M,m.length,n,y.length));continue}if(x.added){let M=m.length,n=y.length;for(let F of B)y.push(Te("added",F,I)),p.push(Qe(ht(),Ce("added",F,I++)));b.push(Ft("insert",M,m.length,n,y.length))}}let T=p.some(v=>v.left.kind!=="context"||v.right.kind!=="context");return Po({rows:p,leftLines:m,rightLines:y,blocks:yo(b),reflows:b.filter(v=>v.reflow),hasChanges:T,quality:"exact"})}function Po(e){for(let t of e.blocks)if(t.kind==="replace")for(let o of["left","right"])for(let a=t[`${o}Start`];a<t[`${o}End`];a++){let i=e[`${o}Lines`][a];i.kind!=="context"&&!i.segments&&(i.inlineDetail="omitted")}return e}function yo(e){let t=[],o=!1;for(let i of e){let s=i.kind!=="replace",l=t[t.length-1];s&&o&&l.leftEnd===i.leftStart&&l.rightEnd===i.rightStart?(l.leftEnd=i.leftEnd,l.rightEnd=i.rightEnd,l.leftEnd>l.leftStart&&l.rightEnd>l.rightStart&&(l.kind="replace")):t.push({...i}),o=s}let a=[];for(let i of t){let s={...i};delete s.reflow;let l=a[a.length-1];l?.kind===s.kind&&l.leftEnd===s.leftStart&&l.rightEnd===s.rightStart?(l.leftEnd=s.leftEnd,l.rightEnd=s.rightEnd):a.push(s)}return a}function Cs(e,t){let o=new Map,a=[],i=s=>{let l=o.get(s);if(l!==void 0)return l;let f=a.length;return o.set(s,f),a.push(s),f};return{left:e.map(i),right:t.map(i),lines:a}}function wo(e){return{rows:e.map((t,o)=>Qe(Ce("context",t,o+1),Ce("context",t,o+1))),leftLines:e.map((t,o)=>Te("context",t,o+1)),rightLines:e.map((t,o)=>Te("context",t,o+1)),blocks:[],hasChanges:!1,quality:"exact"}}function Ts(e,t){let o=e.map((l,f)=>Te("removed",l,f+1)),a=t.map((l,f)=>Te("added",l,f+1)),i=[...e.map((l,f)=>Qe(Ce("removed",l,f+1),ht())),...t.map((l,f)=>Qe(ht(),Ce("added",l,f+1)))],s="replace";return e.length===0?s="insert":t.length===0&&(s="delete"),Po({rows:i,leftLines:o,rightLines:a,blocks:i.length===0?[]:[Ft(s,0,e.length,0,t.length)],hasChanges:i.length>0,quality:"fallback"})}function bo(e){if(e.length===0)return[];let t=e.replace(/\r\n/g,`
1
+ "use strict";(()=>{function ht(e,t){let o=new Map,c=t.map(i=>{let s=new Set(i);for(let l of i){let f=l.split("/");for(let h=1;h<f.length;h++)s.add(f.slice(0,h).join("/"))}return s});for(let i of e){let s=i.split("/");for(let l=0;l<s.length;l++){let f=s.slice(0,l+1).join("/");if(o.has(f))continue;let h=c.map(m=>m.has(f));o.set(f,{relativePath:f,displayName:s[l],depth:l,isDirectory:l<s.length-1,sides:h,status:h.every(Boolean)?"modified":h.length!==2?"partial":h[0]?"left-only":"right-only"})}}return[...o.values()].sort((i,s)=>{let l=i.relativePath.split("/"),f=s.relativePath.split("/");for(let h=0;h<Math.min(l.length,f.length);h++)if(l[h]!==f[h])return Number(h<f.length-1||s.isDirectory)-Number(h<l.length-1||i.isDirectory)||l[h].localeCompare(f[h]);return l.length-f.length})}function nn(e,t){let o="overview"in t?t.overview:void 0,c=(o?.path||"").split("/").filter(x=>x&&x!==".").join("/"),i=x=>!c||x.startsWith(`${c}/`),s=[e.range.baseRef,e.range.headRef],l,f=[];if(t.kind==="stacked-diff"||t.kind==="deconstructed-diff"){let x=t.kind==="stacked-diff"?t.stack:t.panels,C=o?.comparison?x.findIndex(I=>I.id===o.comparison?.from):0,S=o?.comparison?x.findIndex(I=>I.id===o.comparison?.to):x.length-1;if(!x[C]||!x[S]||C===S)throw new Error(`Scene ${t.id} has invalid overview comparison endpoints.`);s=[x[C].label,x[S].label],l=t.files.flatMap(I=>{if(!i(I.path))return[];let $=I.panels[C],D=I.panels[S];if(!$||!D)return[];if($.exists===D.exists&&$.content===D.content)return[];let A=$.exists?D.exists?"modified":"deleted":"added";return[{id:`${t.id}-overview-${I.path}`,kind:"text-diff",title:I.path,path:I.path,changeKind:A,leftContent:$.content,rightContent:D.content,leftLabel:s[0],rightLabel:s[1],summary:"",bullets:[],tags:[],takeaway:"",additions:0,deletions:0}]})}else l=e.files.filter(x=>x.kind==="text-diff"&&i(x.path)),f=e.files.filter(x=>x.kind==="omitted"&&i(x.path));let h=[...l,...f],m=new Map(h.map(x=>[x.path,x])),w=[new Set(h.filter(x=>x.changeKind!=="added").map(x=>x.path)),new Set(h.filter(x=>x.changeKind!=="deleted").map(x=>x.path))],v=ht(h.map(x=>x.path),w).map(x=>{let C=m.get(x.relativePath);return!C||x.isDirectory?x:{...x,gitChangeKind:C.changeKind,...C.previousPath?{previousPath:C.previousPath}:{},...C.kind==="omitted"?{relationSummary:`Unavailable: ${C.reason}`}:{}}}),k=c?` / ${c}/`:"";return{entries:v,files:l,labels:[s[0]+k,s[1]+k],omitted:f}}function rn(e,t){if(t.kind==="title"||t.kind==="chapter"||t.kind==="conclusion")return"narrative";let o=e.scenes[t.sceneIndex];return!o||o.kind==="discussion"?"narrative":t.kind==="step"||o.kind==="text-diff"?"evidence":o.overview?"overview":"preview"}function me(e,t,o="",c){let i=rn(e,t);if(i==="narrative")return null;let s=e.scenes[t.sceneIndex],l=i==="overview",f="steps"in s?s.steps[t.kind==="step"?t.stepIndex:0]:void 0,h=[e.range.mergeBaseOid,e.range.headOid],m=[mt(e.range.baseRef,h[0]),mt(e.range.headRef,h[1])],w=s.kind==="deconstructed-diff"?"synthetic":"real";if(s.kind==="stacked-diff"||s.kind==="deconstructed-diff"){let x=s.kind==="stacked-diff"?s.stack:s.panels,C=c??(f&&"pairIndex"in f?f.pairIndex:0),S=l?s.overview?.comparison?x.findIndex($=>$.id===s.overview?.comparison?.from):0:C,I=l?s.overview?.comparison?x.findIndex($=>$.id===s.overview?.comparison?.to):x.length-1:C+1;if(!x[S]||!x[I])throw new Error(`Scene ${s.id} has unavailable comparison endpoints.`);s.kind==="stacked-diff"?(h=[s.stack[S].oid,s.stack[I].oid],m=[mt(x[S].label,h[0]),mt(x[I].label,h[1])]):(h=[x[S].id,x[I].id],m=[x[S].label,x[I].label])}let v=l?`Directory: ${"overview"in s&&s.overview?.path||"/"} (authored inventory)`:s.kind==="text-diff"?s.path:f&&"diff"in f?f.diff.path:f&&"file"in f?f.file:"",k=l?nn(e,s):null;return{kind:w,labels:m,scope:v,overview:l,comparisonKey:JSON.stringify(w==="real"?[w,...h]:[w,o,e.generatedAt,e.range.mergeBaseOid,e.range.headOid,s.id,...h]),scopeKey:JSON.stringify([v,...k?[...k.files,...k.omitted].map(x=>x.path).sort():[]])}}function lo(e,t){let o=[e.range.mergeBaseOid,e.range.headOid];return{kind:"real",comparisonKey:JSON.stringify(["real",...o]),labels:[mt(e.range.baseRef,o[0]),mt(e.range.headRef,o[1])],scope:t,scopeKey:JSON.stringify([t]),overview:!1}}function gt(e){return`${e.kind==="synthetic"?"Explanation stages":"Comparison"}: ${e.labels.join(" \u2192 ")} \xB7 ${e.scope}`}function Gn(e,t){if(!e)return gt(t);if(e.kind!==t.kind)return`${t.kind==="synthetic"?"Switching to explanation stages":"Switching to real revisions"}. ${gt(t)}`;if(e.comparisonKey!==t.comparisonKey)return`${t.kind==="synthetic"?"Explanation stages changed":"Revision comparison changed"}: ${e.labels.join(" \u2192 ")} to ${t.labels.join(" \u2192 ")} \xB7 ${t.scope}`;let o=e.scopeKey!==t.scopeKey?`${e.overview||t.overview?"view":"file"} changed from ${e.scope} to ${t.scope}`:`same ${t.overview?"directory view":"file"}: ${t.scope}`;return`Same ${t.kind==="synthetic"?"explanation stages":"revision comparison"}; ${o} \xB7 ${t.labels.join(" \u2192 ")}`}function mt(e,t){return e===t||e===t.slice(0,7)?t.slice(0,7):`${e} (${t.slice(0,7)})`}function Be(e,t){if(t.kind==="chapter"){let c=e.chapters.findIndex(i=>i.id===t.chapterId);return e.chapters[c].title}let o=e.scenes[t.sceneIndex];return t.kind==="step"&&"steps"in o?o.steps[t.stepIndex].title:o.title}function uo(e,t){let o=e.scenes[t];return o.kind==="discussion"?[]:("steps"in o?o.steps.flatMap((i,s)=>"image"in i&&i.image?[]:[{kind:"step",key:`step:${o.id}:${i.id}`,sceneIndex:t,stepIndex:s}]):[{kind:"scene",key:`scene:${o.id}`,sceneIndex:t,stepIndex:0}]).map(i=>me(e,i)).filter(Boolean)}function Mt(e){let t=e.scenes.map((i,s)=>({sceneIndex:s,title:Be(e,{kind:"scene",key:`scene:${i.id}`,sceneIndex:s,stepIndex:0}),purpose:i.summary,evidence:Ts(e,s)})),o=(e.chapters||[]).map((i,s)=>{let l=t.filter(C=>i.sceneIds.includes(e.scenes[C.sceneIndex].id)),f=l.flatMap(C=>uo(e,C.sceneIndex)),h=[...f];for(let C of l){let S=e.scenes[C.sceneIndex];if("overview"in S&&S.overview&&!(S.kind==="walkthrough"&&S.steps.every(I=>I.image))){let I=me(e,{kind:"scene",key:`scene:${S.id}`,sceneIndex:C.sceneIndex,stepIndex:0});I&&h.push(I)}}let m=h.filter((C,S)=>h.findIndex(I=>I.comparisonKey===C.comparisonKey)===S),w=[...new Set(f.map(C=>C.scope))],v=l.reduce((C,S)=>{let I=e.scenes[S.sceneIndex];return C+("steps"in I?I.steps.length:0)},0),k=w.length?`Focus files: ${w.join(", ")}.`:"No code steps; this chapter uses discussion or images.",x=m.map(C=>`${C.kind==="synthetic"?"Constructed stages":"Revisions"}: ${C.labels.join(" \u2192 ")}.`).join(" ");return{chapterIndex:s,chapterId:i.id,title:i.title,...i.summary?{summary:i.summary}:{},evidence:`${l.length} ${l.length===1?"scene":"scenes"} \xB7 ${v} ${v===1?"step":"steps"}. ${k}${x?` ${x}`:""}`,scenes:l}}),c=e.scenes.reduce((i,s)=>i+("steps"in s?s.steps.length:0),0);return{summary:`${o.length} ${o.length===1?"chapter":"chapters"} \u2192 ${t.length} ${t.length===1?"scene":"scenes"} \u2192 ${c} ${c===1?"step":"steps"}. Chapters group topics; scenes explain one idea; steps show the evidence.`,chapters:o,scenes:t}}function Ts(e,t){let o=e.scenes[t];if(o.kind==="discussion")return"Discussion: pause to connect the findings. No code comparison is displayed.";if(o.kind==="walkthrough"&&o.steps.every(v=>v.image))return`${o.steps.length} images in reading order. Each step explains what to notice in its image.`;let c=o.kind==="walkthrough"?o.steps.filter(v=>v.image).length:0,i=uo(e,t),s=i.map(v=>v.scope).filter((v,k,x)=>k===0||v!==x[k-1]),l=i.filter((v,k)=>k===0||v.comparisonKey!==i[k-1].comparisonKey),f=`${"steps"in o?`${o.steps.length} ${o.steps.length===1?"step":"steps"}. `:""}${s.length===1?"File":"Files in order"}: ${s.join(" \u2192 ")}.`,h=`${o.kind==="deconstructed-diff"?"Explanation stages (constructed, not commits)":"Revisions"}: ${l.map(v=>v.labels.join(" \u2192 ")).join("; then ")}.`,m="overview"in o&&o.overview?me(e,{kind:"scene",key:`scene:${o.id}`,sceneIndex:t,stepIndex:0}):null;return`${m?`Starts with a directory overview${m.comparisonKey!==i[0]?.comparisonKey?` (${m.labels.join(" \u2192 ")})`:""}, then follows the evidence. `:""}${f} ${h}${c?` Also includes ${c} image ${c===1?"step":"steps"}.`:""}`}function on(e,t,o){let c=e.scenes[t];if(!("steps"in c))return"";let i=c.steps[o],s=`Step ${o+1} of ${c.steps.length}.`;if("image"in i&&i.image)return`${s} Image: ${i.title}.`;let l={kind:"step",key:`step:${c.id}:${i.id}`,sceneIndex:t,stepIndex:o},f=me(e,l),h=o>0&&!(c.kind==="walkthrough"&&c.steps[o-1].image)?me(e,{...l,stepIndex:o-1}):null;if(!h)return`${s} Evidence in ${f.scope}.`;let m=h.comparisonKey!==f.comparisonKey,w=h.scope!==f.scope,v=f.kind==="synthetic"?"explanation stages":"revisions",k=m?`Switch ${v} to ${f.labels.join(" \u2192 ")}.`:`Keep the same ${v}.`;return`${s} ${k} ${w?`Move from ${h.scope} to ${f.scope}.`:`Continue in ${f.scope}.`}`}function Ye(e,t){if(!e.currentPath||t!==-1&&t!==1)return null;let o=e.paths.indexOf(e.currentPath);if(o<0)return null;for(let c=o+t;c>=0&&c<e.paths.length;c+=t)if(!e.changedPaths||e.changedPaths.has(e.paths[c]))return e.paths[c];return null}function $s(e){return{canGoPrevious:Ye(e,-1)!==null,canGoNext:Ye(e,1)!==null}}function fo(e,t,o){if(e.type==="returnToDirectory")return o?{path:null}:null;if(e.type==="openDirectoryEntry")return typeof e.relativePath=="string"&&t.paths.includes(e.relativePath)?{path:e.relativePath}:null;if(e.type==="navigateFile"&&(e.direction==="previous"||e.direction==="next")){let c=Ye(t,e.direction==="previous"?-1:1);return c===null?null:{path:c}}return null}function sn(e,t){return{type:"showDirectoryDiff",labels:e,leftLabel:e[0],rightLabel:e[e.length-1],entries:t,canMutate:!1}}function Vn(e,t){return e.slice(0,-1).map((o,c)=>({leftIndex:c,rightIndex:c+1,...t?{diffModel:t(o,e[c+1])}:{}}))}function an(e,t){let{files:o,...c}=e;return{type:"showMultiDiff",...c,pairs:Vn(c.panels,t),fileNavigation:$s(o)}}function po(e,t){let o=t.displayed||[],c=s=>({active:s===t.active,selected:s!==null&&t.selected.includes(s),panelNumber:o.indexOf(s)+1||void 0}),i=e.map((s,l)=>({kind:"history-entry",index:l,commit:s.commit,label:`${s.shortCommit} ${s.summary}`.trim(),meta:s.timestamp||"",summary:s.summary,timestamp:s.timestamp,author:s.author,authorEmail:s.authorEmail,message:s.message,parents:s.parents||(s.parentCommit?[s.parentCommit]:[]),selectionEnabled:t.selectionEnabled,...c(s.commit),...t.changed?{changesFile:t.changed.has(s.commit)}:{},...t.tourCommits?{inTour:t.tourCommits.has(s.commit)}:{}}));return o.forEach((s,l)=>{s===void 0||i.some(f=>f.commit===s)||i.push({kind:"panel-revision",index:-l-1,commit:s,label:t.missingRevisionLabel(s),meta:"",summary:"",timestamp:void 0,author:void 0,authorEmail:void 0,message:void 0,parents:[],selectionEnabled:!!t.missingRevisionSelectionEnabled,...c(s)})}),i}function ho(){let e,t;function o(){t?.close(),t?.remove(),e?.remove(),t=e=void 0,document.body.classList.remove("tour-image-active")}function c(i,s){o(),e=document.createElement("figure"),e.className="tour-image-evidence";let l=document.createElement("figcaption"),f=document.createElement("span");f.textContent=s;let h=document.createElement("button");h.type="button",h.textContent="Expand image";let m=document.createElement("img");m.src=i.dataUrl,m.alt=i.alt,m.addEventListener("error",()=>{f.textContent=`${s} \u2014 image could not be decoded`}),l.append(f,h),e.append(l,m),document.getElementById("container").append(e),document.body.classList.add("tour-image-active"),h.addEventListener("click",()=>{t?.remove(),t=document.createElement("dialog"),t.className="tour-image-dialog",t.setAttribute("aria-label",s);let w=document.createElement("button");w.type="button",w.textContent="Close image",w.addEventListener("click",()=>t.close()),t.append(w,m.cloneNode()),document.body.append(t),t.showModal()})}return{show:c,clear:o,isVisible:()=>!!e}}var As=/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/,Yn=["part","chapter","scene","step"];function Ue(e,t){let o=e.get(t);if(!o||o.length>4096||/[\u0000-\u001f\u007f]/.test(o))throw new Error(`Invalid or missing ${t}.`);return o}function mo(e){if(!e||e.startsWith("/")||e.includes("\\")||e.includes("\0")||e.split("/").some(t=>!t||t==="."||t===".."))throw new Error("Expected a repository-relative path without traversal.");return e}function Jn(e,t,o=[]){for(let c of e.keys()){if(!t.includes(c))throw new Error(`Unsupported link field: ${c}.`);if(!o.includes(c)&&e.getAll(c).length!==1)throw new Error(`Duplicate link field: ${c}.`)}}function go(e){let t=new URL(e);if(t.protocol!=="file:"||t.hostname||t.search||t.hash||t.username||t.password||!t.pathname.startsWith("/"))throw new Error("Links require a local file URL.");return e}function yo(e){let t=Ue(e,"part"),o=t==="title"||t==="conclusion"?[]:t==="chapter"?["chapter"]:t==="scene"?["scene"]:t==="step"?["scene","step"]:null;if(!o)throw new Error(`Unsupported document part: ${t}.`);for(let c of Yn.filter(i=>i!=="part"))if(e.has(c)&&!o.includes(c))throw new Error(`${c} is incompatible with ${t}.`);return Object.fromEntries([["part",t],...o.map(c=>[c,Ue(e,c)])])}function Xn(e){if(e.length>16384||/%(?![\da-f]{2})/i.test(e))throw new Error("Invalid or oversized Bygone link.");let t=new URL(e);if(t.protocol!=="bygone:"||t.hostname!=="open"||t.pathname!=="/v1"||t.username||t.password||t.port||t.hash)throw new Error("Unsupported Bygone link address or version.");let o=t.searchParams,c=Ue(o,"kind"),i=go(Ue(o,"repo"));if(c==="tour"){Jn(o,["kind","repo","tour","mode",...Yn]);let m=Ue(o,"mode");if(m!=="historical"&&m!=="deconstructed")throw new Error("Unsupported authored tour mode.");let w=Ue(o,"tour");return/^[a-z][a-z\d+.-]*:/i.test(w)?go(w):mo(w),{kind:c,repo:i,tour:w,mode:m,focus:yo(o)}}if(c!=="compare")throw new Error("Unsupported Bygone link kind.");Jn(o,["kind","repo","rev","file","revision","line"],["rev"]);let s=o.getAll("rev");if(s.length!==2||s.some(m=>!As.test(m))||s[0]===s[1])throw new Error("Comparison links require two distinct full commit IDs in order.");let l=o.has("file")?mo(Ue(o,"file")):void 0,f=o.has("revision")?Ue(o,"revision"):void 0;if(f&&(!l||!s.includes(f)))throw new Error("Code focus requires a file and one of the comparison revisions.");let h=o.has("line")?Number(Ue(o,"line")):void 0;if(h!==void 0&&(!f||!Number.isSafeInteger(h)||h<1))throw new Error("Line focus requires a revision and positive line number.");return{kind:c,repo:i,revisions:s,...l?{file:l}:{},...f?{revision:f}:{},...h!==void 0?{line:h}:{}}}function bo(e){let t=new URL("bygone://open/v1");if(t.searchParams.set("kind",e.kind),t.searchParams.set("repo",e.repo),e.kind==="tour"){t.searchParams.set("tour",e.tour),t.searchParams.set("mode",e.mode);for(let[o,c]of Object.entries(e.focus))t.searchParams.set(o,c)}else{for(let o of e.revisions)t.searchParams.append("rev",o);for(let o of["file","revision","line"])e[o]!==void 0&&t.searchParams.set(o,String(e[o]))}return Xn(t.href),t.href}function Ls(e,t){if(e.tours){let c=e.tours[t];if(!c)throw new Error(`This tour has no ${t} mode.`);return c}let o=e.scenes.some(c=>c.kind==="deconstructed-diff");if(t==="deconstructed"&&o||t==="historical"&&!o)return e;if(t==="historical"&&e.zoom?.final.scenes.some(c=>c.kind==="walkthrough"))return e.zoom.final;throw new Error(`This tour has no ${t} mode.`)}function Zn(e,t,o){let c=Ls(e,t);if(o.part==="title")return{key:"title",sceneIndex:0,stepIndex:0};if(o.part==="conclusion"){if(!c.conclusion)throw new Error("Conclusion is unavailable in this tour mode.");return{key:"conclusion",sceneIndex:-1,stepIndex:0}}if(o.part==="chapter"){let f=c.chapters.find(m=>m.id===o.chapter),h=c.scenes.findIndex(m=>m.id===f?.sceneIds[0]);if(!f||h<0)throw new Error(`Chapter is unavailable: ${o.chapter}.`);return{key:f.summary?.trim()?`chapter:${f.id}`:`scene:${c.scenes[h].id}`,sceneIndex:h,stepIndex:0}}let i=c.scenes.findIndex(f=>f.id===o.scene);if(i<0)throw new Error(`Scene is unavailable: ${o.scene}.`);let s=c.scenes[i];if(o.part==="scene")return{key:`scene:${s.id}`,sceneIndex:i,stepIndex:0};let l="steps"in s?s.steps.findIndex(f=>f.id===o.step):-1;if(l<0)throw new Error(`Step is unavailable: ${o.step}.`);return{key:`step:${s.id}:${o.step}`,sceneIndex:i,stepIndex:l}}function nt(e,t){return`#${new URLSearchParams({location:"1",mode:e,...t})}`}function Qn(e){if(!e)return null;if(e.length>16384||/%(?![\da-f]{2})/i.test(e))throw new Error("Oversized tour location.");let t=new URLSearchParams(e.replace(/^#/,""));if(Jn(t,["location","mode",...Yn]),t.get("location")!=="1")throw new Error("Unsupported tour location version.");let o=t.get("mode");if(o!=="historical"&&o!=="deconstructed")throw new Error("Unsupported tour location mode.");return{mode:o,focus:yo(t)}}function ze(){}ze.prototype={diff:function(t,o){var c,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s=i.callback;typeof i=="function"&&(s=i,i={}),this.options=i;var l=this;function f(n){return s?(setTimeout(function(){s(void 0,n)},0),!0):n}t=this.castInput(t),o=this.castInput(o),t=this.removeEmpty(this.tokenize(t)),o=this.removeEmpty(this.tokenize(o));var h=o.length,m=t.length,w=1,v=h+m;i.maxEditLength&&(v=Math.min(v,i.maxEditLength));var k=(c=i.timeout)!==null&&c!==void 0?c:1/0,x=Date.now()+k,C=[{oldPos:-1,lastComponent:void 0}],S=this.extractCommon(C[0],o,t,0);if(C[0].oldPos+1>=m&&S+1>=h)return f([{value:this.join(o),count:o.length}]);var I=-1/0,$=1/0;function D(){for(var n=Math.max(I,-w);n<=Math.min($,w);n+=2){var N=void 0,V=C[n-1],O=C[n+1];V&&(C[n-1]=void 0);var _=!1;if(O){var J=O.oldPos-n;_=O&&0<=J&&J<h}var te=V&&V.oldPos+1<m;if(!_&&!te){C[n]=void 0;continue}if(!te||_&&V.oldPos+1<O.oldPos?N=l.addToPath(O,!0,void 0,0):N=l.addToPath(V,void 0,!0,1),S=l.extractCommon(N,o,t,n),N.oldPos+1>=m&&S+1>=h)return f(Ns(l,N.lastComponent,o,t,l.useLongestToken));C[n]=N,N.oldPos+1>=m&&($=Math.min($,n-1)),S+1>=h&&(I=Math.max(I,n+1))}w++}if(s)(function n(){setTimeout(function(){if(w>v||Date.now()>x)return s();D()||n()},0)})();else for(;w<=v&&Date.now()<=x;){var A=D();if(A)return A}},addToPath:function(t,o,c,i){var s=t.lastComponent;return s&&s.added===o&&s.removed===c?{oldPos:t.oldPos+i,lastComponent:{count:s.count+1,added:o,removed:c,previousComponent:s.previousComponent}}:{oldPos:t.oldPos+i,lastComponent:{count:1,added:o,removed:c,previousComponent:s}}},extractCommon:function(t,o,c,i){for(var s=o.length,l=c.length,f=t.oldPos,h=f-i,m=0;h+1<s&&f+1<l&&this.equals(o[h+1],c[f+1]);)h++,f++,m++;return m&&(t.lastComponent={count:m,previousComponent:t.lastComponent}),t.oldPos=f,h},equals:function(t,o){return this.options.comparator?this.options.comparator(t,o):t===o||this.options.ignoreCase&&t.toLowerCase()===o.toLowerCase()},removeEmpty:function(t){for(var o=[],c=0;c<t.length;c++)t[c]&&o.push(t[c]);return o},castInput:function(t){return t},tokenize:function(t){return t.split("")},join:function(t){return t.join("")}};function Ns(e,t,o,c,i){for(var s=[],l;t;)s.push(t),l=t.previousComponent,delete t.previousComponent,t=l;s.reverse();for(var f=0,h=s.length,m=0,w=0;f<h;f++){var v=s[f];if(v.removed){if(v.value=e.join(c.slice(w,w+v.count)),w+=v.count,f&&s[f-1].added){var x=s[f-1];s[f-1]=s[f],s[f]=x}}else{if(!v.added&&i){var k=o.slice(m,m+v.count);k=k.map(function(S,I){var $=c[w+I];return $.length>S.length?$:S}),v.value=e.join(k)}else v.value=e.join(o.slice(m,m+v.count));m+=v.count,v.added||(w+=v.count)}}var C=s[h-1];return h>1&&typeof C.value=="string"&&(C.added||C.removed)&&e.equals("",C.value)&&(s[h-2].value+=C.value,s.pop()),s}var Rs=new ze;function xo(e,t,o){return Rs.diff(e,t,o)}var wo=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,vo=/\S/,tr=new ze;tr.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!vo.test(e)&&!vo.test(t)};tr.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),o=0;o<t.length-1;o++)!t[o+1]&&t[o+2]&&wo.test(t[o])&&wo.test(t[o+2])&&(t[o]+=t[o+2],t.splice(o+1,2),o--);return t};function ko(e,t,o){return tr.diff(e,t,o)}var nr=new ze;nr.tokenize=function(e){this.options.stripTrailingCr&&(e=e.replace(/\r\n/g,`
2
+ `));var t=[],o=e.split(/(\n|\r\n)/);o[o.length-1]||o.pop();for(var c=0;c<o.length;c++){var i=o[c];c%2&&!this.options.newlineIsToken?t[t.length-1]+=i:(this.options.ignoreWhitespace&&(i=i.trim()),t.push(i))}return t};function Eo(e,t,o){return nr.diff(e,t,o)}var Ps=new ze;Ps.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var Fs=new ze;Fs.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function cn(e){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?cn=function(t){return typeof t}:cn=function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},cn(e)}var Ds=Object.prototype.toString,Ot=new ze;Ot.useLongestToken=!0;Ot.tokenize=nr.tokenize;Ot.castInput=function(e){var t=this.options,o=t.undefinedReplacement,c=t.stringifyReplacer,i=c===void 0?function(s,l){return typeof l>"u"?o:l}:c;return typeof e=="string"?e:JSON.stringify(er(e,null,null,i),i," ")};Ot.equals=function(e,t){return ze.prototype.equals.call(Ot,e.replace(/,([\r\n])/g,"$1"),t.replace(/,([\r\n])/g,"$1"))};function er(e,t,o,c,i){t=t||[],o=o||[],c&&(e=c(i,e));var s;for(s=0;s<t.length;s+=1)if(t[s]===e)return o[s];var l;if(Ds.call(e)==="[object Array]"){for(t.push(e),l=new Array(e.length),o.push(l),s=0;s<e.length;s+=1)l[s]=er(e[s],t,o,c,i);return t.pop(),o.pop(),l}if(e&&e.toJSON&&(e=e.toJSON()),cn(e)==="object"&&e!==null){t.push(e),l={},o.push(l);var f=[],h;for(h in e)e.hasOwnProperty(h)&&f.push(h);for(f.sort(),s=0;s<f.length;s+=1)h=f[s],l[h]=er(e[h],t,o,c,h);t.pop(),o.pop()}else l=e;return l}var dn=new ze;dn.tokenize=function(e){return e.slice()};dn.join=dn.removeEmpty=function(e){return e};function rr(e,t,o){return dn.diff(e,t,o)}function Io(e){let t=e.manifest,o=e.history,c=[t.range.mergeBaseOid,t.range.headOid],i=h=>{let m=o?.commits.find(w=>w.oid===h);if(!m)throw new Error(`Revision ${h} is outside this export.`);return m},s=(h,m)=>{if(i(h),!o.paths.includes(m))throw new Error(`File ${m} is outside this export.`);let w=o.snapshots[h][m];if(w?.omitted)throw new Error(`${m}: ${w.omitted}`);return w?e.texts[w.blob]:null},l=h=>{let m=new Set,w=v=>{m.has(v)||!o.commits.some(k=>k.oid===v)||(m.add(v),i(v).parents.forEach(w))};return w(h),m},f=(h,m)=>Eo(h||"",m||"").reduce((w,v)=>(v.added&&(w.additions+=v.count),v.removed&&(w.deletions+=v.count),w),{additions:0,deletions:0});return async(h,m)=>{if(h==="changed-files"){if(!o)throw new Error("Git history is not included in this Minimal export.");let k=m.commits;if(!Array.isArray(k))throw new Error("Expected displayed revisions.");k.filter(C=>C!==null).forEach(i);let x=o.paths.filter(C=>{let S=k.map(I=>I===null?void 0:o.snapshots[I][C]);return S.some(I=>JSON.stringify(I)!==JSON.stringify(S[0]))});return{paths:x,...m.includeFiles?{files:o.paths.filter(C=>k.some(S=>S!==null&&o.snapshots[S][C])).map(C=>{let S=k.map(I=>I===null?null:o.snapshots[I][C]).find(I=>I?.omitted);return{kind:S?"omitted":"text-diff",path:C,changeKind:x.includes(C)?"modified":"unchanged",...S?{reason:S.omitted}:{}}})}:{},...m.includeEntries?{entries:ht(x,k.map(C=>new Set(C===null?[]:o.paths.filter(S=>o.snapshots[C][S]))))}:{}}}if(h==="compare-many"){let k=m.commits;if(!Array.isArray(k)||k.length<2||new Set(k).size!==k.length)throw new Error("Select at least two different included revisions.");if(!o){if(k.length!==2||k.some((I,$)=>I!==c[$]))throw new Error("Minimal exports support only the fixed base \u2192 head comparison.");if(m.path&&!t.files.some(I=>I.path===m.path||I.previousPath===m.path))throw new Error("File is outside the exported scope.");let S=t.files.filter(I=>!m.path||I.path===m.path||I.previousPath===m.path).map(I=>({...I,comparisonPanels:k.map(($,D)=>({id:`compare-${$}`,commit:$,editable:!1,path:D===0&&I.previousPath||I.path,label:D===0?I.leftLabel:I.rightLabel,content:(D===0?I.leftContent:I.rightContent)||""}))}));return{commits:k,files:S,entries:ht(S.map(I=>I.path),k.map((I,$)=>new Set(S.filter(D=>$===0?D.changeKind!=="added":D.changeKind!=="deleted").map(D=>D.path))))}}if(k.forEach(i),m.path&&!o.paths.includes(m.path))throw new Error("File is outside the exported scope.");let C=(m.path?[m.path]:o.paths).flatMap(S=>{let I=k.map(n=>o.snapshots[n][S]);if(!m.path&&I.every(n=>JSON.stringify(n)===JSON.stringify(I[0])))return[];let $=I.find(n=>n?.omitted),D=I.map(n=>n?.blob?e.texts[n.blob]:""),A=D.slice(1).reduce((n,N,V)=>{let O=f(D[V],N);return{additions:n.additions+O.additions,deletions:n.deletions+O.deletions}},{additions:0,deletions:0});return[{kind:$?"omitted":"text-diff",path:S,...A,...$?{reason:$.omitted}:{},changeKind:I[0]?I.at(-1)?"modified":"deleted":"added",comparisonPanels:k.map((n,N)=>({id:`compare-${n}`,commit:n,path:S,label:`${S} @ ${n.slice(0,7)}${I[N]?"":" (absent)"}`,content:D[N],editable:!1}))}]});return{commits:k,files:C,entries:ht(C.map(S=>S.path),k.map(S=>new Set(C.filter(I=>o.snapshots[S][I.path]).map(I=>I.path))))}}if(!o)throw new Error("Git history is not included in this Minimal export.");let w=m.commit||t.range.headOid,v=i(w);if(h==="list"){let k=l(w),x=o.commits.filter(C=>k.has(C.oid));if(m.path){if(!o.paths.includes(m.path))throw new Error("File is outside the exported scope.");x=x.filter(C=>{let S=o.snapshots[C.parents[0]];return!S||JSON.stringify(o.snapshots[C.oid][m.path])!==JSON.stringify(S[m.path])})}return{entries:x,selectedIndex:x.length?0:-1,selectedCommit:x[0]?.oid||null}}if(h==="diff"){let k=v.parents[0]||null;if(k&&!o.snapshots[k])throw new Error("The parent revision is outside this export. Compare two included revisions instead.");let x=k?s(k,m.path):null,C=s(w,m.path);return{commit:w,parentCommit:k,path:m.path,leftContent:x||"",rightContent:C||"",leftLabel:`${m.path} @ ${k?.slice(0,7)||"empty"}`,rightLabel:`${m.path} @ ${w.slice(0,7)}`}}throw new Error(`Unsupported export operation: ${h}.`)}}var Os=2e4,Bs=100,pn=Wo("BYGONE_MAX_INLINE_HIGHLIGHT_LINE_LENGTH",Os),zo=Wo("BYGONE_DIFF_TIMEOUT_MS",Bs);function ke(e,t,o={}){let c=To(e),i=To(t);if(e===t)return Co(c);if(c.length===i.length&&c.every((x,C)=>x===i[C])){let x=Co(c),C=e.match(/[^\n]*\n|[^\n]+$/g)||[],S=t.match(/[^\n]*\n|[^\n]+$/g)||[];return c.forEach((I,$)=>{C[$]!==S[$]&&(x.leftLines[$].kind=x.rows[$].left.kind="removed",x.rightLines[$].kind=x.rows[$].right.kind="added",x.leftLines[$].inlineDetail=x.rightLines[$].inlineDetail="line-ending",x.blocks.push(Bt("replace",$,$+1,$,$+1)))}),x.blocks=So(x.blocks),x.hasChanges=!0,x.formattingOnly=!0,x}let s=Us(c,i,o.timeoutMs??zo);if(!s)return qs(c,i);let l=[],f=[],h=[],m=[],w=1,v=1;for(let x=0;x<s.length;x++){let C=s[x],S=C.removed?C.value:[],I=C.added?C.value:[];if(!C.added&&!C.removed){for(let $ of C.value)f.push(Re("context",$,w)),h.push(Re("context",$,v)),l.push(rt(Ne("context",$,w++),Ne("context",$,v++)));continue}if(C.removed&&x+1<s.length&&s[x+1].added){let $=s[x+1],D=Hs(S,$.value,w,v,l,f,h,m);w=D.left,v=D.right,x++;continue}if(C.removed){let $=f.length,D=h.length;for(let A of S)f.push(Re("removed",A,w)),l.push(rt(Ne("removed",A,w++),bt()));m.push(Bt("delete",$,f.length,D,h.length));continue}if(C.added){let $=f.length,D=h.length;for(let A of I)h.push(Re("added",A,v)),l.push(rt(bt(),Ne("added",A,v++)));m.push(Bt("insert",$,f.length,D,h.length))}}let k=l.some(x=>x.left.kind!=="context"||x.right.kind!=="context");return qo({rows:l,leftLines:f,rightLines:h,blocks:So(m),reflows:m.filter(x=>x.reflow),hasChanges:k,quality:"exact"})}function qo(e){for(let t of e.blocks)if(t.kind==="replace")for(let o of["left","right"])for(let c=t[`${o}Start`];c<t[`${o}End`];c++){let i=e[`${o}Lines`][c];i.kind!=="context"&&!i.segments&&(i.inlineDetail="omitted")}return e}function So(e){let t=[],o=!1;for(let i of e){let s=i.kind!=="replace",l=t[t.length-1];s&&o&&l.leftEnd===i.leftStart&&l.rightEnd===i.rightStart?(l.leftEnd=i.leftEnd,l.rightEnd=i.rightEnd,l.leftEnd>l.leftStart&&l.rightEnd>l.rightStart&&(l.kind="replace")):t.push({...i}),o=s}let c=[];for(let i of t){let s={...i};delete s.reflow;let l=c[c.length-1];l?.kind===s.kind&&l.leftEnd===s.leftStart&&l.rightEnd===s.rightStart?(l.leftEnd=s.leftEnd,l.rightEnd=s.rightEnd):c.push(s)}return c}function Us(e,t,o){let c=Date.now()+o,i=C=>C.flatMap((S,I)=>{let $=Ce(S);return yt($)?[{key:$,index:I}]:[]}),s=i(e),l=i(t),f=rr(s.map(C=>C.key),l.map(C=>C.key),{timeout:c-Date.now()});if(!f)return;let h=[],m=0,w=0,v=(C,S)=>{if(m===C&&w===S)return!0;let I=zs(e.slice(m,C),t.slice(w,S)),$=rr(I.left,I.right,{timeout:c-Date.now()});return $?(h.push(...$.map(D=>({...D,value:D.value.map(A=>I.lines[A])}))),!0):!1},k=0,x=0;for(let C of f){if(C.removed){k+=C.value.length;continue}if(C.added){x+=C.value.length;continue}for(let S=0;S<C.value.length;S++){let I=s[k++].index,$=l[x++].index;if(!v(I,$))return;let D=e[I],A=t[$];D===A?h.push({value:[D]}):h.push({removed:!0,value:[D]},{added:!0,value:[A]}),m=I+1,w=$+1}}return v(e.length,t.length)?h:void 0}function zs(e,t){let o=new Map,c=[],i=s=>{let l=o.get(s);if(l!==void 0)return l;let f=c.length;return o.set(s,f),c.push(s),f};return{left:e.map(i),right:t.map(i),lines:c}}function Co(e){return{rows:e.map((t,o)=>rt(Ne("context",t,o+1),Ne("context",t,o+1))),leftLines:e.map((t,o)=>Re("context",t,o+1)),rightLines:e.map((t,o)=>Re("context",t,o+1)),blocks:[],hasChanges:!1,quality:"exact"}}function qs(e,t){let o=e.map((l,f)=>Re("removed",l,f+1)),c=t.map((l,f)=>Re("added",l,f+1)),i=[...e.map((l,f)=>rt(Ne("removed",l,f+1),bt())),...t.map((l,f)=>rt(bt(),Ne("added",l,f+1)))],s="replace";return e.length===0?s="insert":t.length===0&&(s="delete"),qo({rows:i,leftLines:o,rightLines:c,blocks:i.length===0?[]:[Bt(s,0,e.length,0,t.length)],hasChanges:i.length>0,quality:"fallback"})}function To(e){if(e.length===0)return[];let t=e.replace(/\r\n/g,`
3
3
  `).split(`
4
- `);return t[t.length-1]===""&&t.pop(),t}function $s(e,t,o,a,i,s,l,f){let p=fn(e,t),m=p.filter(O=>O.left!==void 0&&O.right!==void 0&&tr(O.left,O.right)).length,y=!p.some(O=>O.reflow)&&Ns(e,t,m),b=p.flatMap(O=>O.reflow||O.left===void 0||O.right===void 0||tr(O.left,O.right)?[O]:[{left:O.left},{right:O.right}]),E=[];for(let O=0;O<b.length;){let j=b[O];if(j.reflow||j.left!==void 0&&j.right!==void 0){E.push(j),O++;continue}let J=O;for(;O<b.length&&!b[O].reflow&&(b[O].left===void 0||b[O].right===void 0);)O++;let oe=b.slice(J,O),Q=oe.filter(de=>de.left!==void 0),ie=oe.filter(de=>de.right!==void 0);if(Q.length===1&&ie.length===1)E.push({left:Q[0].left,right:ie[0].right});else for(let de of oe)E.push(de)}let I=o,T=a,v=[],x=[],N=()=>{Xs(v,x),v=[],x=[]},B,M=!1,n=s.length,F=l.length,V=()=>{if(!B)return;let O=Ft(B,n,s.length,F,l.length);M&&(O.reflow=!0),f.push(O)};for(let{left:O,right:j,reflow:J}of E){(J||O!==void 0&&j!==void 0)&&N();let oe=y||J||O!==void 0&&j!==void 0?"replace":O!==void 0?"delete":"insert";(B!==oe||M!==!!J||J?.start)&&(V(),B=oe,M=!!J,n=s.length,F=l.length);let Q,ie;O!==void 0&&(Q=Te("removed",O,I),s.push(Q)),j!==void 0&&(ie=Te("added",j,T),l.push(ie)),J?(Q&&(Q.segments=J.leftSegments),ie&&(ie.segments=J.rightSegments)):Q&&ie?Ys(Q,ie):y&&(Q&&Lo(Q),ie&&Lo(ie)),!J&&(O===void 0||j===void 0)&&(Q&&v.push(Q),ie&&x.push(ie)),i.push(Qe(O===void 0?ht():Ce("removed",O,I++),j===void 0?ht():Ce("added",j,T++)))}return V(),N(),{left:I,right:T}}function tr(e,t){if(!e.trim()&&!t.trim()||hn(e,t).eligible)return!0;let a=Dt(e);if(a&&a===Dt(t))return!0;let i=new Set(Ot($e(e)).filter(vo));return Ot($e(t)).some(s=>i.has(s)&&vo(s))}var As=new Set(["and","are","for","from","into","that","the","this","to","with"]);function vo(e){return e.length>=3&&/^[\p{L}\p{N}_$]+$/u.test(e)&&!As.has(e)}function Ns(e,t,o){if(o===0)return!1;let a=Math.max(e.length,t.length);if(a<=2||o*2>=a)return!0;let i=[...e,...t].map(Ls);return i[0]!==null&&i.every(s=>s===i[0])}function Ls(e){let t=e.trimStart();return/^[-*+]\s+/.test(t)?"bullet":/^\d+[.)]\s+/.test(t)?"ordered":/^>\s+/.test(t)?"quote":null}var Fo=1e4,nr=2e3,Rs=.52,Ps=.35,Do=.38,Fs=.33,Mo=.86,un=.08,an=.05,cn=-.12,xo=5e3,Ds=2e3,Ms=5e7,ko=4,Os=8,Qn=4;function Eo(e){let t=[];for(let o=0;o<e.length;o++){let a=e[o],i=[a],s=a.match(/^(\s*)(?:[\w-]+:\s+|[-*+]\s+)(\S.*)$/);if(s&&!/^[|>\[{]/.test(s[2]))for(;o+1<e.length;){let l=e[o+1];if(!l.trim()||l.length-l.trimStart().length<=s[1].length||/^\s*(?:[\w-]+:|[-*+]\s|\d+[.)]\s|#)/.test(l))break;i.push(l),o++}t.push(i.join(`
5
- `))}return t}function fn(e,t){if([...e,...t].some(i=>i.includes(`
6
- `)))return er(e,t);let o=Eo(e),a=Eo(t);return o.length===e.length&&a.length===t.length?er(e,t):er(o,a).flatMap(i=>{let s=i.left?.split(`
4
+ `);return t[t.length-1]===""&&t.pop(),t}function Hs(e,t,o,c,i,s,l,f){let h=mn(e,t),m=h.filter(O=>O.left!==void 0&&O.right!==void 0&&sr(O.left,O.right)).length,w=!h.some(O=>O.reflow)&&js(e,t,m),v=h.flatMap(O=>O.reflow||O.left===void 0||O.right===void 0||sr(O.left,O.right)?[O]:[{left:O.left},{right:O.right}]),k=[];for(let O=0;O<v.length;){let _=v[O];if(_.reflow||_.left!==void 0&&_.right!==void 0){k.push(_),O++;continue}let J=O;for(;O<v.length&&!v[O].reflow&&(v[O].left===void 0||v[O].right===void 0);)O++;let te=v.slice(J,O),X=te.filter(ce=>ce.left!==void 0),ne=te.filter(ce=>ce.right!==void 0);if(X.length===1&&ne.length===1)k.push({left:X[0].left,right:ne[0].right});else for(let ce of te)k.push(ce)}let x=o,C=c,S=[],I=[],$=()=>{ua(S,I),S=[],I=[]},D,A=!1,n=s.length,N=l.length,V=()=>{if(!D)return;let O=Bt(D,n,s.length,N,l.length);A&&(O.reflow=!0),f.push(O)};for(let{left:O,right:_,reflow:J}of k){(J||O!==void 0&&_!==void 0)&&$();let te=w||J||O!==void 0&&_!==void 0?"replace":O!==void 0?"delete":"insert";(D!==te||A!==!!J||J?.start)&&(V(),D=te,A=!!J,n=s.length,N=l.length);let X,ne;O!==void 0&&(X=Re("removed",O,x),s.push(X)),_!==void 0&&(ne=Re("added",_,C),l.push(ne)),J?(X&&(X.segments=J.leftSegments),ne&&(ne.segments=J.rightSegments)):X&&ne?la(X,ne):w&&(X&&Uo(X),ne&&Uo(ne)),!J&&(O===void 0||_===void 0)&&(X&&S.push(X),ne&&I.push(ne)),i.push(rt(O===void 0?bt():Ne("removed",O,x++),_===void 0?bt():Ne("added",_,C++)))}return V(),$(),{left:x,right:C}}function sr(e,t){if(!e.trim()&&!t.trim()||yn(e,t).eligible)return!0;let c=Ut(e);if(c&&c===Ut(t))return!0;let i=new Set(zt(Ce(e)).filter($o));return zt(Ce(t)).some(s=>i.has(s)&&$o(s))}var _s=new Set(["and","are","for","from","into","that","the","this","to","with"]);function $o(e){return e.length>=3&&/^[\p{L}\p{N}_$]+$/u.test(e)&&!_s.has(e)}function js(e,t,o){if(o===0)return!1;let c=Math.max(e.length,t.length);if(c<=2||o*2>=c)return!0;let i=[...e,...t].map(Ks);return i[0]!==null&&i.every(s=>s===i[0])}function Ks(e){let t=e.trimStart();return/^[-*+]\s+/.test(t)?"bullet":/^\d+[.)]\s+/.test(t)?"ordered":/^>\s+/.test(t)?"quote":null}var Ho=1e4,ar=2e3,Ws=.52,Gs=.35,_o=.38,Vs=.33,jo=.86,hn=.08,ln=.05,un=-.12,Ao=5e3,Js=2e3,Ys=5e7,Lo=4,Xs=8,or=4;function No(e){let t=[];for(let o=0;o<e.length;o++){let c=e[o],i=[c],s=c.match(/^(\s*)(?:[\w-]+:\s+|[-*+]\s+)(\S.*)$/);if(s&&!/^[|>\[{]/.test(s[2]))for(;o+1<e.length;){let l=e[o+1];if(!l.trim()||l.length-l.trimStart().length<=s[1].length||/^\s*(?:[\w-]+:|[-*+]\s|\d+[.)]\s|#)/.test(l))break;i.push(l),o++}t.push(i.join(`
5
+ `))}return t}function mn(e,t){if([...e,...t].some(i=>i.includes(`
6
+ `)))return ir(e,t);let o=No(e),c=No(t);return o.length===e.length&&c.length===t.length?ir(e,t):ir(o,c).flatMap(i=>{let s=i.left?.split(`
7
7
  `)||[],l=i.right?.split(`
8
- `)||[];if(!s.length||!l.length)return[...s.map(b=>({left:b})),...l.map(b=>({right:b}))];if(s.length===1&&l.length===1)return[i];let p=ar(i.left,i.right)||sr(i.left,i.right),m=p&&ft(p.leftSegments),y=p&&ft(p.rightSegments);return Array.from({length:Math.max(s.length,l.length)},(b,E)=>({left:s[E],right:l[E],reflow:{start:E===0,leftSegments:m?.[E],rightSegments:y?.[E]}}))})}function er(e,t){if(e.length===0)return t.map(v=>({right:v}));if(t.length===0)return e.map(v=>({left:v}));let o=0;for(;o<Math.min(e.length,t.length)&&e[o].trim()===t[o].trim();)o++;if(o)return[...e.slice(0,o).map((v,x)=>({left:v,right:t[x]})),...fn(e.slice(o),t.slice(o))];let a=1,i=1,s=e[0].trim().replace(/\s+/g," "),l=t[0].trim().replace(/\s+/g," ");for(;s&&l&&s!==l;)if(l.startsWith(s+" ")&&a<e.length)s+=" "+e[a++].trim().replace(/\s+/g," ");else if(s.startsWith(l+" ")&&i<t.length)l+=" "+t[i++].trim().replace(/\s+/g," ");else break;if(s===l&&(a>1||i>1)&&![...e,...t].some(v=>v.includes(`
9
- `))){let v=ar(e.slice(0,a).join(`
8
+ `)||[];if(!s.length||!l.length)return[...s.map(v=>({left:v})),...l.map(v=>({right:v}))];if(s.length===1&&l.length===1)return[i];let h=fr(i.left,i.right)||ur(i.left,i.right),m=h&&ot(h.leftSegments),w=h&&ot(h.rightSegments);return Array.from({length:Math.max(s.length,l.length)},(v,k)=>({left:s[k],right:l[k],reflow:{start:k===0,leftSegments:m?.[k],rightSegments:w?.[k]}}))})}function ir(e,t){if(e.length===0)return t.map(S=>({right:S}));if(t.length===0)return e.map(S=>({left:S}));let o=0;for(;o<Math.min(e.length,t.length)&&e[o].trim()===t[o].trim();)o++;if(o)return[...e.slice(0,o).map((S,I)=>({left:S,right:t[I]})),...mn(e.slice(o),t.slice(o))];let c=1,i=1,s=e[0].trim().replace(/\s+/g," "),l=t[0].trim().replace(/\s+/g," ");for(;s&&l&&s!==l;)if(l.startsWith(s+" ")&&c<e.length)s+=" "+e[c++].trim().replace(/\s+/g," ");else if(s.startsWith(l+" ")&&i<t.length)l+=" "+t[i++].trim().replace(/\s+/g," ");else break;if(s===l&&(c>1||i>1)&&![...e,...t].some(S=>S.includes(`
9
+ `))){let S=fr(e.slice(0,c).join(`
10
10
  `),t.slice(0,i).join(`
11
- `));if(v){let x=ft(v.leftSegments),N=ft(v.rightSegments);return[...Array.from({length:Math.max(a,i)},(B,M)=>({left:M<a?e[M]:void 0,right:M<i?t[M]:void 0,reflow:{start:M===0,leftSegments:x[M],rightSegments:N[M]}})),...fn(e.slice(a),t.slice(i))]}}let f=e.reduce((v,x)=>v+Math.min(x.length,nr),0),p=t.reduce((v,x)=>v+Math.min(x.length,nr),0);if(f*p>Ms)return Io(e,t,!0);if(e.length===1&&t.length===1){let v=hn(e[0],t[0]);return!e[0].trim()&&!t[0].trim()||(v.eligible||v.score>=Ps)&&tr(e[0],t[0])&&or(e[0],t[0])&&Mt($e(e[0]))&&Mt($e(t[0]))?[{left:e[0],right:t[0]}]:[{left:e[0]},{right:t[0]}]}if(e.length*t.length>Fo)return Io(e,t);let m=Bs(e,t),y=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(Number.NEGATIVE_INFINITY)),b=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(null));y[0][0]=0;for(let v=1;v<=e.length;v++)y[v][0]=y[v-1][0]+cn,b[v][0]="left";for(let v=1;v<=t.length;v++)y[0][v]=y[0][v-1]+cn,b[0][v]="right";for(let v=1;v<=e.length;v++)for(let x=1;x<=t.length;x++){let N=m[v-1][x-1],M=[{move:"left",score:y[v-1][x]+cn},{move:"right",score:y[v][x-1]+cn},{move:"match",score:N===null?Number.NEGATIVE_INFINITY:y[v-1][x-1]+N}].reduce((n,F)=>F.score>n.score?F:n);y[v][x]=M.score,b[v][x]=M.move}let E=[],I=e.length,T=t.length;for(;I>0||T>0;){let v=b[I][T];v==="match"?E.push({left:e[--I],right:t[--T]}):v==="left"?E.push({left:e[--I]}):E.push({right:t[--T]})}return E.reverse()}function hn(e,t){let o=$e(e),a=$e(t),i=Mt(o),s=Mt(a);if(i&&s&&o===a)return{score:1,eligible:!0,characterSimilarity:1,tokenSimilarity:1,lengthSimilarity:1};if(!i||!s)return{score:0,eligible:!1,characterSimilarity:0,tokenSimilarity:0,lengthSimilarity:0};let l=Ot(o),f=Ot(a),p=B=>B.length<=nr?B:[0,Math.floor(B.length/2)-300,B.length-600].map(M=>B.slice(M,M+600)).join(" "),m=Js(p(o),p(a)),y=Gs(l,f),b=Math.min(o.length,a.length)/Math.max(o.length,a.length),E=Vs(l,f),I=B=>B.match(/^(?:(?:const|let|var)\s+)?([\p{L}_$][\p{L}\p{N}_$.-]*\s*(?::|=(?!=)))\s*/u)?.[1].replace(/\s+/g,""),T=I(o),v=T&&T===I(a)?.12:0,x=Math.min(1,m*.52+y*.32+b*.1+E*.06+v),N=v>0||m>=.52||y>=.45||m>=.48&&y>=.28;return{score:x,eligible:N&&x>=Rs,characterSimilarity:m,tokenSimilarity:y,lengthSimilarity:b}}function Bs(e,t){let o=e.map(v=>t.map(x=>hn(v,x))),a=Oo(e,t),i=o.map(v=>rr(v)),s=t.map((v,x)=>rr(o.map(N=>N[x]))),l=o.map((v,x)=>v.map((N,B)=>{if(a.has(`${x}:${B}`))return Math.max(N.score,1);if(!N.eligible)return null;let M=i[x],n=s[B],F=N.score===M.best&&N.score===n.best,V=N.score>=Mo?un/2:un,O=M.best-M.second>=V,j=n.best-n.second>=V;return F&&O&&j?N.score:null}));if(Math.max(e.length,t.length)>Os||Math.abs(e.length-t.length)>Qn)return l;let f=(v,x,N)=>v.score>=Do&&or(e[x],t[N])&&Math.abs(x-N)<=Qn,p=o.map((v,x)=>dn(v,(N,B)=>f(N,x,B))),m=t.map((v,x)=>dn(o.map(N=>N[x]),(N,B)=>f(N,B,x))),y=(v,x,N)=>v.score>=Fs&&or(e[x],t[N])&&Math.abs(x-N)<=Qn,b=o.map((v,x)=>dn(v,(N,B)=>y(N,x,B))),E=t.map((v,x)=>dn(o.map(N=>N[x]),(N,B)=>y(N,B,x))),I=(v,x)=>{let N=o[v][x];if(!f(N,v,x))return!1;let B=p[v],M=m[x];return N.score===B.best&&N.score===M.best&&B.best-B.second>=an&&M.best-M.second>=an},T=(v,x)=>{let N=o[v][x];if(!y(N,v,x))return!1;let B=b[v],M=E[x];return N.score===B.best&&N.score===M.best&&B.best-B.second>=an&&M.best-M.second>=an};return l.map((v,x)=>v.map((N,B)=>{if(N!==null)return N;let M=I(x,B)&&(Us(l,x,B)||zs(o,x,B,I)),n=Hs(o,x,B,(F,V)=>y(o[F][V],F,V),T);return!M&&!n?null:o[x][B].score}))}function Us(e,t,o){return t>0&&o>0&&e[t-1][o-1]!==null||t+1<e.length&&o+1<e[t+1].length&&e[t+1][o+1]!==null}function zs(e,t,o,a){return t>0&&o>0&&a(t-1,o-1)||t+1<e.length&&o+1<e[t+1].length&&a(t+1,o+1)}function Hs(e,t,o,a,i){let s=t,l=o;for(;s>0&&l>0&&a(s-1,l-1);)s--,l--;let f=t,p=o,m=e[t][o].score,y=1;for(;f+1<e.length&&p+1<e[f+1].length&&a(f+1,p+1);)f++,p++,m+=e[f][p].score,y++;for(let b=t-1,E=o-1;b>=s&&E>=l;b--,E--)m+=e[b][E].score,y++;return y>=3&&m/y>=Do&&i(s,l)&&i(f,p)}function dn(e,t){let o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;return e.forEach((i,s)=>{t(i,s)&&(i.score>o?(a=o,o=i.score):i.score>a&&(a=i.score))}),{best:o,second:a}}function rr(e){let t=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let a of e)a.eligible&&(a.score>t?(o=t,t=a.score):a.score>o&&(o=a.score));return{best:t,second:o}}function Io(e,t,o=!1){let a=_s(e,t,o);if(a.length===0)return[...e.map(f=>({left:f})),...t.map(f=>({right:f}))];let i=[],s=0,l=0;for(let f of a)Ao(i,e.slice(s,f.leftIndex),t.slice(l,f.rightIndex)),i.push({left:e[f.leftIndex],right:t[f.rightIndex]}),s=f.leftIndex+1,l=f.rightIndex+1;return Ao(i,e.slice(s),t.slice(l)),i}function _s(e,t,o){let a=qs(e,t,o);if(a===null)return[];let i=Oo(e,t),s=a.map(({leftIndex:y,rightIndex:b,exact:E})=>({leftIndex:y,rightIndex:b,exact:E,structural:i.has(`${y}:${b}`),match:hn(e[y],t[b])})).filter(y=>y.exact||y.structural||y.match.eligible),l=To(s,"leftIndex"),f=To(s,"rightIndex"),p=s.filter(y=>{if(y.exact||y.structural)return!0;let b=l.get(y.leftIndex),E=f.get(y.rightIndex);if(!b||!E||y.match.score!==b.best||y.match.score!==E.best)return!1;let I=y.match.score>=Mo?un/2:un;return b.best-b.second>=I&&E.best-E.second>=I}),m=Ks(p,t.length);return m.length<=Ds?m:[]}function qs(e,t,o){let a=So(e,$e),i=So(t,$e),s=new Map;for(let[p,m]of a){let y=i.get(p);if(!Mt(p)||m.length!==1||y?.length!==1)continue;let b=m[0],E=y[0];if(s.set(`${b}:${E}`,{leftIndex:b,rightIndex:E,exact:!0}),s.size>xo)return null}if(o)return[...s.values()];let l=Co(e),f=Co(t);for(let[p,m]of l){let y=f.get(p);if(!(!y||m.length>ko||y.length>ko))for(let b of m)for(let E of y){let I=`${b}:${E}`;if(!s.has(I)&&(s.set(I,{leftIndex:b,rightIndex:E,exact:!1}),s.size>xo))return null}}return[...s.values()]}function So(e,t){let o=new Map;return e.forEach((a,i)=>{let s=t(a),l=o.get(s)??[];l.push(i),o.set(s,l)}),o}function Co(e){let t=new Map;return e.forEach((o,a)=>{let i=new Set(Ot($e(o)).filter(js));for(let s of i){let l=t.get(s)??[];l.push(a),t.set(s,l)}}),t}function js(e){return e.length>=2&&/[\p{L}\p{N}_$]/u.test(e)}function To(e,t){let o=new Map;for(let a of e){let i=o.get(a[t])??[];i.push(a.match),o.set(a[t],i)}return new Map([...o].map(([a,i])=>[a,rr(i)]))}function Ks(e,t){let o=[...e].sort((m,y)=>m.leftIndex-y.leftIndex||m.rightIndex-y.rightIndex),a=new Array(t+2).fill(0),i=new Array(t+2).fill(-1),s=new Array(o.length).fill(0),l=new Array(o.length).fill(-1);for(let m=0;m<o.length;){let y=m+1;for(;y<o.length&&o[y].leftIndex===o[m].leftIndex;)y++;for(let b=m;b<y;b++){let E=$o(a,i,o[b].rightIndex),I=o[b].exact||o[b].structural?.5:0;s[b]=E.score+o[b].match.score+I,l[b]=E.candidateIndex}for(let b=m;b<y;b++)Ws(a,i,o[b].rightIndex+1,s[b],b);m=y}let f=$o(a,i,t+1),p=[];for(let m=f.candidateIndex;m>=0;m=l[m])p.push({leftIndex:o[m].leftIndex,rightIndex:o[m].rightIndex});return p.reverse()}function $o(e,t,o){let a=0,i=-1;for(let s=o;s>0;s-=s&-s)e[s]>a&&(a=e[s],i=t[s]);return{score:a,candidateIndex:i}}function Ws(e,t,o,a,i){for(let s=o;s<e.length;s+=s&-s)a>e[s]&&(e[s]=a,t[s]=i)}function Ao(e,t,o){if(t.length*o.length<=Fo){e.push(...fn(t,o));return}e.push(...t.map(a=>({left:a}))),e.push(...o.map(a=>({right:a})))}function $e(e){return e.trim().replace(/\s+/g," ")}function Oo(e,t){let o=No(e),a=No(t),i=new Set;for(let[s,l]of o){let f=a.get(s);l.length===1&&f?.length===1&&i.add(`${l[0]}:${f[0]}`)}return i}function No(e){let t=new Map;return e.forEach((o,a)=>{let i=Dt(o);if(!i)return;let s=t.get(i)??[];s.push(a),t.set(i,s)}),t}function or(e,t){let o=Dt(e),a=Dt(t);return!o||!a?o===a:o.split(":",1)[0]===a.split(":",1)[0]}function Dt(e){let t=$e(e),o=[["function",/^(?:(?:export|default)\s+)*(?:async\s+)?function\s*\*?\s*([\p{L}_$][\p{L}\p{N}_$]*)\s*\(/u],["function",/^(?:async\s+)?def\s+([\p{L}_][\p{L}\p{N}_]*)\s*\(/u],["function",/^(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+([\p{L}_][\p{L}\p{N}_]*)\s*(?:<[^>]*>)?\s*\(/u],["function",/^func\s+(?:\([^)]*\)\s*)?([\p{L}_][\p{L}\p{N}_]*)\s*\(/u],["class",/^(?:(?:export|default|abstract|public)\s+)*class\s+([\p{L}_$][\p{L}\p{N}_$]*)\b/u]];for(let[a,i]of o){let s=t.match(i);if(s)return`${a}:${s[1]}`}return null}function Mt(e){return e.length<3?!1:/[\p{L}\p{N}_$]/u.test(e)&&!/^[\s()[\]{};,.:+\-*/=>|&!?'"`]+$/.test(e)}function Ot(e){return e.toLowerCase().match(/[\p{L}_$][\p{L}\p{N}_$]*|\p{N}+(?:\.\p{N}+)?|[^\s\p{L}\p{N}_$]/gu)??[]}function Gs(e,t){if(e.length+t.length===0)return 1;let o=new Map;e.forEach(i=>o.set(i,(o.get(i)??0)+1));let a=0;for(let i of t){let s=o.get(i)??0;s>0&&(a++,o.set(i,s-1))}return 2*a/(e.length+t.length)}function Vs(e,t){if(e.length===0||t.length===0)return 0;let o=e[0]===t[0]?.5:0,a=e[e.length-1]===t[t.length-1]?.5:0;return o+a}function Js(e,t){let o=e.length+t.length;return o===0?1:2*fo(e,t).filter(i=>!i.added&&!i.removed).reduce((i,s)=>i+s.value.length,0)/o}function Ys(e,t){let o=ar(e.content,t.content);if(o){e.segments=o.leftSegments,t.segments=o.rightSegments;return}let a=sr(e.content,t.content);a&&(e.segments=a.leftSegments,t.segments=a.rightSegments)}function Xs(e,t){if(!e.length||!t.length||e.length===1&&t.length===1)return;let o=y=>y.reduce((b,E)=>b+E.content.length+1,-1);if(o(e)>ln||o(t)>ln)return;let a=e.map(y=>y.content).join(`
12
- `),i=t.map(y=>y.content).join(`
13
- `),s=sr(a,i);if(!s)return;let{leftSegments:l,rightSegments:f}=s,p=ft(l),m=ft(f);e.forEach((y,b)=>{y.segments=p[b]}),t.forEach((y,b)=>{y.segments=m[b]})}function Lo(e){/[^\s]/.test(e.content)&&(e.segments=[{kind:e.kind,text:e.content,emphasis:!0}])}var ir=new Intl.Segmenter(void 0,{granularity:"grapheme"});function Zs(e,t){if(e===t)return e?[{value:e}]:[];let o=Array.from(ir.segment(e),f=>f.segment),a=Array.from(ir.segment(t),f=>f.segment),i=Math.min(o.length,a.length),s=0,l=0;for(;s<i&&o[s]===a[s];)s++;for(;l<i&&o[o.length-l-1]===a[a.length-l-1];)l++;return l===i&&s<i&&(s=0),l=Math.min(l,i-s),[{value:o.slice(0,s).join("")},{value:o.slice(s,o.length-l).join(""),removed:!0},{value:a.slice(s,a.length-l).join(""),added:!0},{value:l?o.slice(-l).join(""):""}].filter(f=>f.value.length>0)}function Qs(e,t){let o=ho(e,t,{timeout:Ro,maxEditLength:2e3});if(!o)return;let a=b=>new Set([...Array.from(ir.segment(b),E=>E.index),b.length]),i=a(e),s=a(t),l=[],f=0,p=0,m="",y="";for(let b=0;b<o.length;){let E=o[b];if(!E.added&&!E.removed)m+=E.value,y+=E.value,f+=E.value.length,p+=E.value.length,b++;else for(;b<o.length&&(o[b].added||o[b].removed);){let I=o[b++];I.removed?(m+=I.value,f+=I.value.length):(y+=I.value,p+=I.value.length)}if(i.has(f)&&s.has(p)){for(let I of Zs(m,y)){let T=l[l.length-1];T&&T.added===I.added&&T.removed===I.removed?T.value+=I.value:l.push(I)}m="",y=""}}return l}function sr(e,t){if(e.length>ln||t.length>ln)return;let o=Qs(e,t);if(!o)return;let a=[],i=[],s=!1;for(let l of o){let f=l.value;if(!l.added&&!l.removed){let m={kind:"context",text:f,emphasis:!1};a.push(m),i.push(m);continue}let p=f.length>0;s=s||p,l.removed&&a.push({kind:"removed",text:f,emphasis:p}),l.added&&i.push({kind:"added",text:f,emphasis:p})}return{leftSegments:a,rightSegments:i,hasInlineChanges:s}}function ar(e,t){let o=e.split(/(\S+)/),a=t.split(/(\S+)/);if(o.length!==a.length||o.some((f,p)=>p%2===1&&f!==a[p]))return;let i=[],s=[],l=(f,p,m)=>{if(!m)return;let y=f[f.length-1];y?.kind===p?y.text+=m:f.push({kind:p,text:m,emphasis:p!=="context"})};return o.forEach((f,p)=>{let m=a[p],y=0;if(p>0)for(;y<Math.min(f.length,m.length)&&f[y]===m[y];)y++;let b=0;for(;b<Math.min(f.length,m.length)-y&&f[f.length-b-1]===m[m.length-b-1];)b++;if(p===0)for(;y<Math.min(f.length,m.length)-b&&f[y]===m[y];)y++;l(i,"context",f.slice(0,y)),l(s,"context",m.slice(0,y)),l(i,"removed",f.slice(y,f.length-b)),l(s,"added",m.slice(y,m.length-b)),l(i,"context",f.slice(f.length-b)),l(s,"context",m.slice(m.length-b))}),{leftSegments:i,rightSegments:s}}function ft(e){let t=[[]];for(let o of e)o.text.split(`
14
- `).forEach((a,i)=>{i>0&&t.push([]),a&&t[t.length-1].push({...o,text:a})});return t}function ht(){return{kind:"placeholder",content:"",lineNumber:null}}function Ce(e,t,o){return{kind:e,content:t,lineNumber:o}}function Te(e,t,o){return{kind:e,content:t,lineNumber:o}}function Qe(e,t){return{left:e,right:t}}function Ft(e,t,o,a,i){return{kind:e,leftStart:t,leftEnd:o,rightStart:a,rightEnd:i}}function Bo(e,t){let o=typeof process<"u"?process.env?.[e]:void 0,a=Number.parseInt(o??"",10);return Number.isFinite(a)&&a>0?a:t}function Uo(){return{leftFileName:"test-file-1.js",rightFileName:"test-file-2.js",leftContent:`// Test File 1 - Example JavaScript Code
11
+ `));if(S){let I=ot(S.leftSegments),$=ot(S.rightSegments);return[...Array.from({length:Math.max(c,i)},(D,A)=>({left:A<c?e[A]:void 0,right:A<i?t[A]:void 0,reflow:{start:A===0,leftSegments:I[A],rightSegments:$[A]}})),...mn(e.slice(c),t.slice(i))]}}let f=e.reduce((S,I)=>S+Math.min(I.length,ar),0),h=t.reduce((S,I)=>S+Math.min(I.length,ar),0);if(f*h>Ys)return Ro(e,t,!0);if(e.length===1&&t.length===1){let S=yn(e[0],t[0]);return!e[0].trim()&&!t[0].trim()||(S.eligible||S.score>=Gs)&&sr(e[0],t[0])&&dr(e[0],t[0])&&yt(Ce(e[0]))&&yt(Ce(t[0]))?[{left:e[0],right:t[0]}]:[{left:e[0]},{right:t[0]}]}if(e.length*t.length>Ho)return Ro(e,t);let m=Zs(e,t),w=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(Number.NEGATIVE_INFINITY)),v=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(null));w[0][0]=0;for(let S=1;S<=e.length;S++)w[S][0]=w[S-1][0]+un,v[S][0]="left";for(let S=1;S<=t.length;S++)w[0][S]=w[0][S-1]+un,v[0][S]="right";for(let S=1;S<=e.length;S++)for(let I=1;I<=t.length;I++){let $=m[S-1][I-1],A=[{move:"left",score:w[S-1][I]+un},{move:"right",score:w[S][I-1]+un},{move:"match",score:$===null?Number.NEGATIVE_INFINITY:w[S-1][I-1]+$}].reduce((n,N)=>N.score>n.score?N:n);w[S][I]=A.score,v[S][I]=A.move}let k=[],x=e.length,C=t.length;for(;x>0||C>0;){let S=v[x][C];S==="match"?k.push({left:e[--x],right:t[--C]}):S==="left"?k.push({left:e[--x]}):k.push({right:t[--C]})}return k.reverse()}function yn(e,t){let o=Ce(e),c=Ce(t),i=yt(o),s=yt(c);if(i&&s&&o===c)return{score:1,eligible:!0,characterSimilarity:1,tokenSimilarity:1,lengthSimilarity:1};if(!i||!s)return{score:0,eligible:!1,characterSimilarity:0,tokenSimilarity:0,lengthSimilarity:0};let l=zt(o),f=zt(c),h=D=>D.length<=ar?D:[0,Math.floor(D.length/2)-300,D.length-600].map(A=>D.slice(A,A+600)).join(" "),m=da(h(o),h(c)),w=aa(l,f),v=Math.min(o.length,c.length)/Math.max(o.length,c.length),k=ca(l,f),x=D=>D.match(/^(?:(?:const|let|var)\s+)?([\p{L}_$][\p{L}\p{N}_$.-]*\s*(?::|=(?!=)))\s*/u)?.[1].replace(/\s+/g,""),C=x(o),S=C&&C===x(c)?.12:0,I=Math.min(1,m*.52+w*.32+v*.1+k*.06+S),$=S>0||m>=.52||w>=.45||m>=.48&&w>=.28;return{score:I,eligible:$&&I>=Ws,characterSimilarity:m,tokenSimilarity:w,lengthSimilarity:v}}function Zs(e,t){let o=e.map(S=>t.map(I=>yn(S,I))),c=Ko(e,t),i=o.map(S=>cr(S)),s=t.map((S,I)=>cr(o.map($=>$[I]))),l=o.map((S,I)=>S.map(($,D)=>{if(c.has(`${I}:${D}`))return Math.max($.score,1);if(!$.eligible)return null;let A=i[I],n=s[D],N=$.score===A.best&&$.score===n.best,V=$.score>=jo?hn/2:hn,O=A.best-A.second>=V,_=n.best-n.second>=V;return N&&O&&_?$.score:null}));if(Math.max(e.length,t.length)>Xs||Math.abs(e.length-t.length)>or)return l;let f=(S,I,$)=>S.score>=_o&&dr(e[I],t[$])&&Math.abs(I-$)<=or,h=o.map((S,I)=>fn(S,($,D)=>f($,I,D))),m=t.map((S,I)=>fn(o.map($=>$[I]),($,D)=>f($,D,I))),w=(S,I,$)=>S.score>=Vs&&dr(e[I],t[$])&&Math.abs(I-$)<=or,v=o.map((S,I)=>fn(S,($,D)=>w($,I,D))),k=t.map((S,I)=>fn(o.map($=>$[I]),($,D)=>w($,D,I))),x=(S,I)=>{let $=o[S][I];if(!f($,S,I))return!1;let D=h[S],A=m[I];return $.score===D.best&&$.score===A.best&&D.best-D.second>=ln&&A.best-A.second>=ln},C=(S,I)=>{let $=o[S][I];if(!w($,S,I))return!1;let D=v[S],A=k[I];return $.score===D.best&&$.score===A.best&&D.best-D.second>=ln&&A.best-A.second>=ln};return l.map((S,I)=>S.map(($,D)=>{if($!==null)return $;let A=x(I,D)&&(Qs(l,I,D)||ea(o,I,D,x)),n=ta(o,I,D,(N,V)=>w(o[N][V],N,V),C);return!A&&!n?null:o[I][D].score}))}function Qs(e,t,o){return t>0&&o>0&&e[t-1][o-1]!==null||t+1<e.length&&o+1<e[t+1].length&&e[t+1][o+1]!==null}function ea(e,t,o,c){return t>0&&o>0&&c(t-1,o-1)||t+1<e.length&&o+1<e[t+1].length&&c(t+1,o+1)}function ta(e,t,o,c,i){let s=t,l=o;for(;s>0&&l>0&&c(s-1,l-1);)s--,l--;let f=t,h=o,m=e[t][o].score,w=1;for(;f+1<e.length&&h+1<e[f+1].length&&c(f+1,h+1);)f++,h++,m+=e[f][h].score,w++;for(let v=t-1,k=o-1;v>=s&&k>=l;v--,k--)m+=e[v][k].score,w++;return w>=3&&m/w>=_o&&i(s,l)&&i(f,h)}function fn(e,t){let o=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY;return e.forEach((i,s)=>{t(i,s)&&(i.score>o?(c=o,o=i.score):i.score>c&&(c=i.score))}),{best:o,second:c}}function cr(e){let t=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let c of e)c.eligible&&(c.score>t?(o=t,t=c.score):c.score>o&&(o=c.score));return{best:t,second:o}}function Ro(e,t,o=!1){let c=na(e,t,o);if(c.length===0)return[...e.map(f=>({left:f})),...t.map(f=>({right:f}))];let i=[],s=0,l=0;for(let f of c)Oo(i,e.slice(s,f.leftIndex),t.slice(l,f.rightIndex)),i.push({left:e[f.leftIndex],right:t[f.rightIndex]}),s=f.leftIndex+1,l=f.rightIndex+1;return Oo(i,e.slice(s),t.slice(l)),i}function na(e,t,o){let c=ra(e,t,o);if(c===null)return[];let i=Ko(e,t),s=c.map(({leftIndex:w,rightIndex:v,exact:k})=>({leftIndex:w,rightIndex:v,exact:k,structural:i.has(`${w}:${v}`),match:yn(e[w],t[v])})).filter(w=>w.exact||w.structural||w.match.eligible),l=Do(s,"leftIndex"),f=Do(s,"rightIndex"),h=s.filter(w=>{if(w.exact||w.structural)return!0;let v=l.get(w.leftIndex),k=f.get(w.rightIndex);if(!v||!k||w.match.score!==v.best||w.match.score!==k.best)return!1;let x=w.match.score>=jo?hn/2:hn;return v.best-v.second>=x&&k.best-k.second>=x}),m=ia(h,t.length);return m.length<=Js?m:[]}function ra(e,t,o){let c=Po(e,Ce),i=Po(t,Ce),s=new Map;for(let[h,m]of c){let w=i.get(h);if(!yt(h)||m.length!==1||w?.length!==1)continue;let v=m[0],k=w[0];if(s.set(`${v}:${k}`,{leftIndex:v,rightIndex:k,exact:!0}),s.size>Ao)return null}if(o)return[...s.values()];let l=Fo(e),f=Fo(t);for(let[h,m]of l){let w=f.get(h);if(!(!w||m.length>Lo||w.length>Lo))for(let v of m)for(let k of w){let x=`${v}:${k}`;if(!s.has(x)&&(s.set(x,{leftIndex:v,rightIndex:k,exact:!1}),s.size>Ao))return null}}return[...s.values()]}function Po(e,t){let o=new Map;return e.forEach((c,i)=>{let s=t(c),l=o.get(s)??[];l.push(i),o.set(s,l)}),o}function Fo(e){let t=new Map;return e.forEach((o,c)=>{let i=new Set(zt(Ce(o)).filter(oa));for(let s of i){let l=t.get(s)??[];l.push(c),t.set(s,l)}}),t}function oa(e){return e.length>=2&&/[\p{L}\p{N}_$]/u.test(e)}function Do(e,t){let o=new Map;for(let c of e){let i=o.get(c[t])??[];i.push(c.match),o.set(c[t],i)}return new Map([...o].map(([c,i])=>[c,cr(i)]))}function ia(e,t){let o=[...e].sort((m,w)=>m.leftIndex-w.leftIndex||m.rightIndex-w.rightIndex),c=new Array(t+2).fill(0),i=new Array(t+2).fill(-1),s=new Array(o.length).fill(0),l=new Array(o.length).fill(-1);for(let m=0;m<o.length;){let w=m+1;for(;w<o.length&&o[w].leftIndex===o[m].leftIndex;)w++;for(let v=m;v<w;v++){let k=Mo(c,i,o[v].rightIndex),x=o[v].exact||o[v].structural?.5:0;s[v]=k.score+o[v].match.score+x,l[v]=k.candidateIndex}for(let v=m;v<w;v++)sa(c,i,o[v].rightIndex+1,s[v],v);m=w}let f=Mo(c,i,t+1),h=[];for(let m=f.candidateIndex;m>=0;m=l[m])h.push({leftIndex:o[m].leftIndex,rightIndex:o[m].rightIndex});return h.reverse()}function Mo(e,t,o){let c=0,i=-1;for(let s=o;s>0;s-=s&-s)e[s]>c&&(c=e[s],i=t[s]);return{score:c,candidateIndex:i}}function sa(e,t,o,c,i){for(let s=o;s<e.length;s+=s&-s)c>e[s]&&(e[s]=c,t[s]=i)}function Oo(e,t,o){if(t.length*o.length<=Ho){e.push(...mn(t,o));return}e.push(...t.map(c=>({left:c}))),e.push(...o.map(c=>({right:c})))}function Ce(e){return e.trim().replace(/\s+/g," ")}function Ko(e,t){let o=Bo(e),c=Bo(t),i=new Set;for(let[s,l]of o){let f=c.get(s);l.length===1&&f?.length===1&&i.add(`${l[0]}:${f[0]}`)}return i}function Bo(e){let t=new Map;return e.forEach((o,c)=>{let i=Ut(o);if(!i)return;let s=t.get(i)??[];s.push(c),t.set(i,s)}),t}function dr(e,t){let o=Ut(e),c=Ut(t);return!o||!c?o===c:o.split(":",1)[0]===c.split(":",1)[0]}function Ut(e){let t=Ce(e),o=[["function",/^(?:(?:export|default)\s+)*(?:async\s+)?function\s*\*?\s*([\p{L}_$][\p{L}\p{N}_$]*)\s*\(/u],["function",/^(?:async\s+)?def\s+([\p{L}_][\p{L}\p{N}_]*)\s*\(/u],["function",/^(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+([\p{L}_][\p{L}\p{N}_]*)\s*(?:<[^>]*>)?\s*\(/u],["function",/^func\s+(?:\([^)]*\)\s*)?([\p{L}_][\p{L}\p{N}_]*)\s*\(/u],["class",/^(?:(?:export|default|abstract|public)\s+)*class\s+([\p{L}_$][\p{L}\p{N}_$]*)\b/u]];for(let[c,i]of o){let s=t.match(i);if(s)return`${c}:${s[1]}`}return null}function yt(e){return e.length<3?!1:/[\p{L}\p{N}_$]/u.test(e)&&!/^[\s()[\]{};,.:+\-*/=>|&!?'"`]+$/.test(e)}function zt(e){return e.toLowerCase().match(/[\p{L}_$][\p{L}\p{N}_$]*|\p{N}+(?:\.\p{N}+)?|[^\s\p{L}\p{N}_$]/gu)??[]}function aa(e,t){if(e.length+t.length===0)return 1;let o=new Map;e.forEach(i=>o.set(i,(o.get(i)??0)+1));let c=0;for(let i of t){let s=o.get(i)??0;s>0&&(c++,o.set(i,s-1))}return 2*c/(e.length+t.length)}function ca(e,t){if(e.length===0||t.length===0)return 0;let o=e[0]===t[0]?.5:0,c=e[e.length-1]===t[t.length-1]?.5:0;return o+c}function da(e,t){let o=e.length+t.length;return o===0?1:2*xo(e,t).filter(i=>!i.added&&!i.removed).reduce((i,s)=>i+s.value.length,0)/o}function la(e,t){let o=fr(e.content,t.content);if(o){e.segments=o.leftSegments,t.segments=o.rightSegments;return}let c=ur(e.content,t.content);c&&(e.segments=c.leftSegments,t.segments=c.rightSegments)}function ua(e,t){if(!e.length||!t.length||e.length===1&&t.length===1)return;let o=w=>w.reduce((v,k)=>v+k.content.length+1,-1);if(o(e)>pn||o(t)>pn)return;let c=e.map(w=>w.content).join(`
12
+ `),i=t.map(w=>w.content).join(`
13
+ `),s=ur(c,i);if(!s)return;let{leftSegments:l,rightSegments:f}=s,h=ot(l),m=ot(f);e.forEach((w,v)=>{w.segments=h[v]}),t.forEach((w,v)=>{w.segments=m[v]})}function Uo(e){/[^\s]/.test(e.content)&&(e.segments=[{kind:e.kind,text:e.content,emphasis:!0}])}var lr=new Intl.Segmenter(void 0,{granularity:"grapheme"});function fa(e,t){if(e===t)return e?[{value:e}]:[];let o=Array.from(lr.segment(e),f=>f.segment),c=Array.from(lr.segment(t),f=>f.segment),i=Math.min(o.length,c.length),s=0,l=0;for(;s<i&&o[s]===c[s];)s++;for(;l<i&&o[o.length-l-1]===c[c.length-l-1];)l++;return l===i&&s<i&&(s=0),l=Math.min(l,i-s),[{value:o.slice(0,s).join("")},{value:o.slice(s,o.length-l).join(""),removed:!0},{value:c.slice(s,c.length-l).join(""),added:!0},{value:l?o.slice(-l).join(""):""}].filter(f=>f.value.length>0)}function pa(e,t){let o=ko(e,t,{timeout:zo,maxEditLength:2e3});if(!o)return;let c=v=>new Set([...Array.from(lr.segment(v),k=>k.index),v.length]),i=c(e),s=c(t),l=[],f=0,h=0,m="",w="";for(let v=0;v<o.length;){let k=o[v];if(!k.added&&!k.removed)m+=k.value,w+=k.value,f+=k.value.length,h+=k.value.length,v++;else for(;v<o.length&&(o[v].added||o[v].removed);){let x=o[v++];x.removed?(m+=x.value,f+=x.value.length):(w+=x.value,h+=x.value.length)}if(i.has(f)&&s.has(h)){for(let x of fa(m,w)){let C=l[l.length-1];C&&C.added===x.added&&C.removed===x.removed?C.value+=x.value:l.push(x)}m="",w=""}}return l}function ur(e,t){if(e.length>pn||t.length>pn)return;let o=pa(e,t);if(!o)return;let c=[],i=[],s=!1;for(let l of o){let f=l.value;if(!l.added&&!l.removed){let m={kind:"context",text:f,emphasis:!1};c.push(m),i.push(m);continue}let h=f.length>0;s=s||h,l.removed&&c.push({kind:"removed",text:f,emphasis:h}),l.added&&i.push({kind:"added",text:f,emphasis:h})}return{leftSegments:gn(c),rightSegments:gn(i),hasInlineChanges:s}}function fr(e,t){let o=e.split(/(\S+)/),c=t.split(/(\S+)/);if(o.length!==c.length||o.some((f,h)=>h%2===1&&f!==c[h]))return;let i=[],s=[],l=(f,h,m)=>{if(!m)return;let w=f[f.length-1];w?.kind===h?w.text+=m:f.push({kind:h,text:m,emphasis:h!=="context"})};return o.forEach((f,h)=>{let m=c[h],w=0;if(h>0)for(;w<Math.min(f.length,m.length)&&f[w]===m[w];)w++;let v=0;for(;v<Math.min(f.length,m.length)-w&&f[f.length-v-1]===m[m.length-v-1];)v++;if(h===0)for(;w<Math.min(f.length,m.length)-v&&f[w]===m[w];)w++;l(i,"context",f.slice(0,w)),l(s,"context",m.slice(0,w)),l(i,"removed",f.slice(w,f.length-v)),l(s,"added",m.slice(w,m.length-v)),l(i,"context",f.slice(f.length-v)),l(s,"context",m.slice(m.length-v))}),{leftSegments:gn(i),rightSegments:gn(s)}}function gn(e){let t=[];return ot(e).forEach((o,c)=>{c>0&&t.push({kind:"context",text:`
14
+ `,emphasis:!1});let i=o.map(m=>m.text).join(""),s=i.match(/^[\t ]*/u)[0].length,l=0,f=0,h="context";for(let m of o){if(l>=s)break;m.emphasis&&(f+=Math.min(m.text.length,s-l),h=m.kind),l+=m.text.length}f&&t.push({kind:h,text:i.slice(0,f),emphasis:!0}),s>f&&t.push({kind:"context",text:i.slice(f,s),emphasis:!1}),l=0;for(let m of o){let w=Math.max(0,s-l);w<m.text.length&&t.push({...m,text:m.text.slice(w)}),l+=m.text.length}}),t}function ot(e){let t=[[]];for(let o of e)o.text.split(`
15
+ `).forEach((c,i)=>{i>0&&t.push([]),c&&t[t.length-1].push({...o,text:c})});return t}function bt(){return{kind:"placeholder",content:"",lineNumber:null}}function Ne(e,t,o){return{kind:e,content:t,lineNumber:o}}function Re(e,t,o){return{kind:e,content:t,lineNumber:o}}function rt(e,t){return{left:e,right:t}}function Bt(e,t,o,c,i){return{kind:e,leftStart:t,leftEnd:o,rightStart:c,rightEnd:i}}function Wo(e,t){let o=typeof process<"u"?process.env?.[e]:void 0,c=Number.parseInt(o??"",10);return Number.isFinite(c)&&c>0?c:t}function Go(){return{leftFileName:"test-file-1.js",rightFileName:"test-file-2.js",leftContent:`// Test File 1 - Example JavaScript Code
15
16
  const fs = require('fs');
16
17
  const path = require('path');
17
18
 
@@ -155,10 +156,12 @@ if (require.main === module) {
155
156
  }
156
157
 
157
158
  module.exports = FileProcessor;
158
- `}}function pn(e,t,o){for(let a of["opening","conclusion"]){let i=e[a];if(i===void 0)continue;if(Number(t)<5)throw new Error(`${o}.${a} requires version 5.`);if(!i||typeof i!="object"||Array.isArray(i))throw new Error(`${o}.${a} must be an object.`);let s=i;for(let l of Object.keys(s))if(!["title","summary","bullets"].includes(l))throw new Error(`${o}.${a}.${l} is unsupported.`);for(let l of["title","summary"])cr(s[l],`${o}.${a}.${l}`);if(s.bullets!==void 0){if(!Array.isArray(s.bullets))throw new Error(`${o}.${a}.bullets must be an array.`);s.bullets.forEach((l,f)=>cr(l,`${o}.${a}.bullets[${f}]`))}}}function dr(e,t,o){if(e!==void 0){if(t<5){if(e&&typeof e=="object"&&"purpose"in e)throw new Error(`${o}.purpose requires version 5.`);return}cr(e?.purpose,`${o}.purpose`)}}function cr(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`)}function ea(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ta(e){return typeof e=="string"&&e.length>0&&!/[\\\x00-\x1f:]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")}function zo(e,t){if(e===void 0)return;if(!ea(e)||!ta(e.path)||typeof e.alt!="string"||!e.alt.trim()||typeof e.revision!="string"||!/^[a-f0-9]{40,64}$/.test(e.revision)||typeof e.dataUrl!="string"||!e.dataUrl.startsWith("data:image/png;base64,"))throw new Error(`${t} must contain pinned, embedded PNG evidence and alt text.`);let o=e.dataUrl.slice(22);if(o.length/4*3-(o.endsWith("==")?2:o.endsWith("=")?1:0)>8388608||o.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(o))throw new Error(`${t} must be a PNG of at most 8 MiB.`);let i=Uint8Array.from(atob(o.slice(0,44)),s=>s.charCodeAt(0));na(i,t)}function na(e,t){let o=[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82];if(e.length<33||o.some((l,f)=>e[f]!==l))throw new Error(`${t} must be a PNG with an IHDR header.`);let a=new DataView(e.buffer,e.byteOffset,e.byteLength),i=a.getUint32(16),s=a.getUint32(20);if(!i||!s||i>16384||s>16384||i*s>64*1024*1024)throw new Error(`${t} exceeds the PNG dimension limit.`)}function mn(e,t){if(e!==void 0){if(!Ho(e))throw new Error(`${t} must be an object.`);_o(e,["audience"],t),ra(e.audience,`${t}.audience`)}}function ra(e,t){if(e!==void 0){if(!Ho(e))throw new Error(`${t} must be an object.`);if(_o(e,["codebase","language","domain","readingDemand","purpose","scope","estimatedMinutes"],t),typeof e.codebase!="string"||!["none","some","maintainer"].includes(e.codebase))throw new Error(`${t}.codebase must be none, some, or maintainer.`);if(typeof e.language!="string"||!["none","basic","fluent","advanced"].includes(e.language))throw new Error(`${t}.language must be none, basic, fluent, or advanced.`);if(e.domain!==void 0&&ia(e.domain,`${t}.domain`),typeof e.readingDemand!="string"||!["general","technical","specialist"].includes(e.readingDemand))throw new Error(`${t}.readingDemand must be general, technical, or specialist.`);if(typeof e.purpose!="string"||!["overview","explanation","review"].includes(e.purpose))throw new Error(`${t}.purpose must be overview, explanation, or review.`);if(oa(e.scope,`${t}.scope`),e.estimatedMinutes!==void 0&&(typeof e.estimatedMinutes!="number"||!Number.isFinite(e.estimatedMinutes)||e.estimatedMinutes<=0))throw new Error(`${t}.estimatedMinutes must be a finite positive number.`)}}function Ho(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function oa(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`)}function ia(e,t){if(!Array.isArray(e)||e.some(o=>typeof o!="string"||o.trim().length===0))throw new Error(`${t} must be an array of strings.`)}function _o(e,t,o){let a=Object.keys(e).filter(i=>!t.includes(i));if(a.length>0)throw new Error(`${o} contains unknown field${a.length===1?"":"s"}: ${a.join(", ")}`)}function qo(e,t){if(e!==void 0){if(!lr(e))throw new Error(`${t} must be an object.`);if(ur(e,["id","text","status","source","confidence"],t),et(e.id,`${t}.id`),et(e.text,`${t}.text`),e.status!==void 0&&!["fulfilled","gap"].includes(String(e.status)))throw new Error(`${t}.status must be fulfilled or gap.`);if(aa(e.source,`${t}.source`),e.confidence!==void 0&&!["high","medium","low"].includes(String(e.confidence)))throw new Error(`${t}.confidence must be high, medium, or low.`)}}function pt(e,t,o={}){if(e!==void 0){if(!lr(e))throw new Error(`${t} must be an object.`);if(ur(e,["kind","path","comparison","purpose"],t),e.kind!=="directory-diff")throw new Error(`${t}.kind must be directory-diff.`);if(e.purpose!==void 0&&et(e.purpose,`${t}.purpose`),e.path!==void 0&&sa(e.path,`${t}.path`),e.comparison!==void 0){if(o.allowComparison===!1)throw new Error(`${t}.comparison is not supported for walkthrough scenes; use the fixed base-to-head comparison.`);if(!lr(e.comparison))throw new Error(`${t}.comparison must be an object.`);if(ur(e.comparison,["from","to"],`${t}.comparison`),et(e.comparison.from,`${t}.comparison.from`),et(e.comparison.to,`${t}.comparison.to`),e.comparison.from===e.comparison.to)throw new Error(`${t}.comparison.from and to must identify distinct endpoints.`);if(o.endpointIds!==void 0){for(let a of[e.comparison.from,e.comparison.to])if(!o.endpointIds.includes(a))throw new Error(`${t}.comparison endpoint ${a} is not defined by this scene.`)}}}}function sa(e,t){if(et(e,t),e.includes("\\"))throw new Error(`${t} must use a relative POSIX directory path without backslashes.`);if(e.startsWith("/")||/^[A-Za-z]:/.test(e))throw new Error(`${t} must be relative to the repository root.`);if(e.split("/").some(o=>o===".."))throw new Error(`${t} must not contain parent-directory traversal.`)}function lr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function et(e,t){if(typeof e!="string"||e.length===0)throw new Error(`${t} must be a non-empty string.`)}function aa(e,t){e!==void 0&&et(e,t)}function ur(e,t,o){let a=Object.keys(e).filter(i=>!t.includes(i));if(a.length>0)throw new Error(`${o} contains unknown field${a.length===1?"":"s"}: ${a.join(", ")}`)}var fr=5;function Ko(e,t={}){if(W(e)&&Number.isInteger(e.version)&&Number(e.version)>fr)throw new Error(`This tour uses manifest format version ${e.version}, but this version of Bygone supports up to version ${fr}. Upgrade Bygone to open it.`);if(W(e)&&e.version===3)throw new Error("Tour manifest format version 3 is retired. Remove the review block, set source version to 4, and recompile the tour.");if(!W(e)||e.version!==1&&e.version!==2&&e.version!==4&&e.version!==fr)throw new Error("Unsupported or missing change-tour manifest version.");if("review"in e)throw new Error("Change-tour manifests do not support the review field. Put observations in scene and step narrative.");if(pn(e,e.version,"manifest"),G(e.title,"title"),G(e.generatedAt,"generatedAt"),e.windowTitle!==void 0&&G(e.windowTitle,"windowTitle"),e.sourceUrl!==void 0&&G(e.sourceUrl,"sourceUrl"),!W(e.range))throw new Error("Change-tour manifest range must be an object.");for(let i of["baseRef","headRef","mergeBaseOid","headOid"])G(e.range[i],`range.${i}`);if(!W(e.summary))throw new Error("Change-tour manifest summary must be an object.");for(let i of["changedFiles","includedScenes","additions","deletions","commitCount"])ce(e.summary[i],`summary.${i}`);if(gt(e.summary.omittedFiles,"summary.omittedFiles"),!Array.isArray(e.commits)||!Array.isArray(e.chapters)||!Array.isArray(e.scenes))throw new Error("Change-tour manifest commits, chapters, and scenes must be arrays.");if(e.files!==void 0&&!Array.isArray(e.files))throw new Error("Change-tour manifest files must be an array.");let o=new Set;for(let[i,s]of e.scenes.entries()){if(mt(s,i,e.version),o.has(s.id))throw new Error(`Duplicate change-tour scene id: ${s.id}`);o.add(s.id)}for(let[i,s]of e.chapters.entries()){if(!W(s))throw new Error(`chapters[${i}] must be an object.`);G(s.id,`chapters[${i}].id`),G(s.title,`chapters[${i}].title`),pr(s.summary,e.version,`chapters[${i}].summary`),gt(s.sceneIds,`chapters[${i}].sceneIds`);for(let l of s.sceneIds)if(!o.has(l))throw new Error(`Chapter references unknown scene id: ${l}`)}if(e.summary.includedScenes!==e.scenes.length)throw new Error("summary.includedScenes must match the number of scenes.");if(e.details!==void 0){if(e.version!==5)throw new Error("details requires manifest version 5.");mn(e.details,"details")}let a=e.files===void 0?pa(e.scenes):e.files.map((i,s)=>(ha(i,s),i));if(e.files!==void 0&&e.summary.changedFiles!==a.length)throw new Error("summary.changedFiles must match the number of files.");if(e.authoringCoverage!==void 0&&ca(e.authoringCoverage,e.version),e.tours!==void 0){if(e.version!==4&&e.version!==5)throw new Error("Independent tours require manifest version 4.");da(e.tours,e.version)}return e.version!==1&&la(e,e.version,!!t.exported),{...e,files:a}}function ca(e,t){if(!W(e)||!W(e.walkthrough)||!Array.isArray(e.explanationAssignments))throw new Error("authoringCoverage must contain walkthrough and explanationAssignments.");let o=t>=2?"final":"tour";if(e.walkthrough.scope!==o)throw new Error(`authoringCoverage.walkthrough.scope must be ${o}.`);if(ce(e.walkthrough.coveredUnits,"authoringCoverage.walkthrough.coveredUnits"),ce(e.walkthrough.includedUnits,"authoringCoverage.walkthrough.includedUnits"),jo(e.walkthrough.coveragePercent,"authoringCoverage.walkthrough.coveragePercent"),e.walkthrough.coveredUnits>e.walkthrough.includedUnits)throw new Error("authoringCoverage.walkthrough.coveredUnits must not exceed includedUnits.");for(let[a,i]of e.explanationAssignments.entries()){let s=`authoringCoverage.explanationAssignments[${a}]`;if(!W(i))throw new Error(`${s} must be an object.`);if(G(i.sceneId,`${s}.sceneId`),ce(i.assignedUnits,`${s}.assignedUnits`),ce(i.excludedUnits,`${s}.excludedUnits`),ce(i.completeUnits,`${s}.completeUnits`),ce(i.totalUnits,`${s}.totalUnits`),jo(i.assignmentPercent,`${s}.assignmentPercent`),i.assignedUnits+i.excludedUnits!==i.completeUnits||i.completeUnits>i.totalUnits)throw new Error(`${s} contains inconsistent unit counts.`)}}function da(e,t){if(!W(e))throw new Error("Change-tour manifest tours must be an object.");if(e.historical===void 0&&e.deconstructed===void 0)throw new Error("Change-tour manifest tours must contain a historical or deconstructed tour.");for(let o of["historical","deconstructed"]){let a=e[o];if(a===void 0)continue;if(!W(a)||!Array.isArray(a.chapters)||!Array.isArray(a.scenes)||a.chapters.length===0||a.scenes.length===0)throw new Error(`Change-tour manifest tours.${o} must contain non-empty chapters and scenes arrays.`);pn(a,t,`tours.${o}`);let i=new Set,s=!1;for(let[l,f]of a.scenes.entries()){if(mt(f,l,t),i.has(f.id))throw new Error(`Duplicate ${o} tour scene id: ${f.id}`);if(i.add(f.id),f.kind==="deconstructed-diff"&&(s=!0),o==="historical"&&f.kind==="deconstructed-diff")throw new Error("Historical tours cannot contain synthetic deconstructed scenes.")}if(a.details!==void 0){if(t!==5)throw new Error(`tours.${o}.details requires manifest version 5.`);mn(a.details,`tours.${o}.details`)}if(o==="deconstructed"&&!s)throw new Error("Deconstructed tours must contain a constructed deconstructed-diff scene.");for(let[l,f]of a.chapters.entries()){if(!W(f))throw new Error(`tours.${o}.chapters[${l}] must be an object.`);G(f.id,`tours.${o}.chapters[${l}].id`),G(f.title,`tours.${o}.chapters[${l}].title`),pr(f.summary,t,`tours.${o}.chapters[${l}].summary`),gt(f.sceneIds,`tours.${o}.chapters[${l}].sceneIds`);for(let p of f.sceneIds)if(!i.has(p))throw new Error(`tours.${o} chapter references unknown scene id: ${p}`)}}}function la(e,t,o){if(!o&&(!W(e.repository)||typeof e.repository.root!="string"||!e.repository.root))throw new Error("A v2 tour requires its originating repository.root.");if(!W(e.zoom)||!Array.isArray(e.zoom.revisions)||!W(e.zoom.final))throw new Error("A v2 tour requires zoom metadata and real revision evidence.");let a=e.scenes,i=e.zoom.revisions,s=new Set;for(let[b,E]of i.entries()){if(mt(E,b,t),E.kind!=="stacked-diff")throw new Error("zoom.revisions must contain real stacked-diff scenes.");if(s.has(E.id))throw new Error(`Duplicate zoom revision scene: ${E.id}`);s.add(E.id);let I=e.range;if(E.stack[0].oid!==I.mergeBaseOid||E.stack[E.stack.length-1].oid!==I.headOid)throw new Error(`Revision scene ${E.id} endpoints must match the final diff range.`)}for(let b of a){if(b.kind!=="deconstructed-diff"&&b.kind!=="stacked-diff")continue;let E=i.find(I=>I.id===b.id);if(!E)throw new Error(`Scene ${b.id} is missing its real revision evidence.`);if(b.kind==="deconstructed-diff"&&(E.stack[0].oid!==b.realRange.baseOid||E.stack[E.stack.length-1].oid!==b.realRange.targetOid))throw new Error(`Deconstructed scene ${b.id} real stack endpoints must match its explanation range.`)}let l=a.some(b=>b.kind==="deconstructed-diff"),f=i.some(b=>b.stack.length>2),p=l?"explanation":f?"revisions":"final",m=[...l?["explanation"]:[],...f?["revisions"]:[],"final","history"];if(e.zoom.authoredDepth!==p||JSON.stringify(e.zoom.modes)!==JSON.stringify(m))throw new Error("zoom depth and modes must match the maximum authored depth.");if(!Array.isArray(e.files))throw new Error("A v2 tour requires final endpoint file evidence.");if(!Array.isArray(e.zoom.final.scenes)||!Array.isArray(e.zoom.final.chapters))throw new Error("A v2 tour requires a non-stacked final tour.");let y=new Set;for(let[b,E]of e.zoom.final.scenes.entries()){if(mt(E,b,t),E.kind==="stacked-diff"||E.kind==="deconstructed-diff")throw new Error("zoom.final must contain only non-stacked scenes.");if(y.has(E.id))throw new Error(`Duplicate final tour scene: ${E.id}`);y.add(E.id)}for(let[b,E]of e.zoom.final.chapters.entries()){if(!W(E)||!Array.isArray(E.sceneIds))throw new Error(`zoom.final.chapters[${b}] must contain sceneIds.`);G(E.id,`zoom.final.chapters[${b}].id`),G(E.title,`zoom.final.chapters[${b}].title`),pr(E.summary,t,`zoom.final.chapters[${b}].summary`);for(let I of E.sceneIds)if(G(I,`zoom.final.chapters[${b}].sceneIds`),!y.has(I))throw new Error(`Final tour chapter references unknown scene: ${I}`)}}function mt(e,t,o){if(!W(e)||!["text-diff","discussion","walkthrough","stacked-diff","deconstructed-diff"].includes(String(e.kind)))throw new Error(`scenes[${t}] must be a text-diff, discussion, walkthrough, stacked-diff, or deconstructed-diff scene.`);for(let a of["id","title"])G(e[a],`scenes[${t}].${a}`);if(e.overview!==void 0&&o<4)throw new Error(`scenes[${t}].overview requires manifest version 4.`);if(dr(e.overview,o,`scenes[${t}].overview`),ma(e,`scenes[${t}]`),e.kind==="discussion"){pt(e.overview,`scenes[${t}].overview`,{allowComparison:!1});return}if(e.kind==="walkthrough"){if(pt(e.overview,`scenes[${t}].overview`,{allowComparison:!1}),!Array.isArray(e.steps)||e.steps.length===0)throw new Error(`scenes[${t}].steps must be a non-empty array.`);for(let[a,i]of e.steps.entries()){let s=`scenes[${t}].steps[${a}]`;if(!W(i)||!W(i.focus)||!W(i.diff))throw new Error(`${s} must contain focus and diff objects.`);for(let l of["id","title","body"])G(i[l],`${s}.${l}`);if(i.depth!==void 0&&!["mentioned","explained","contextualized"].includes(String(i.depth)))throw new Error(`${s}.depth must be mentioned, explained, or contextualized.`);if(qo(i.requirement,`${s}.requirement`),zo(i.image,`${s}.image`),hr(i.focus,`${s}.focus`),mt(i.diff,t,o),i.diff.kind!=="text-diff")throw new Error(`${s}.diff must be a text-diff scene.`);if(i.connection!==void 0){if(!W(i.connection))throw new Error(`${s}.connection must be an object.`);G(i.connection.id,`${s}.connection.id`),G(i.connection.label,`${s}.connection.label`),hr(i.connection.from,`${s}.connection.from`),hr(i.connection.to,`${s}.connection.to`)}}return}if(e.kind==="stacked-diff"){ua(e,t),pt(e.overview,`scenes[${t}].overview`,{endpointIds:e.stack.map(a=>a.id)});return}if(e.kind==="deconstructed-diff"){fa(e,t),pt(e.overview,`scenes[${t}].overview`,{endpointIds:e.panels.map(a=>a.id)});return}pt(e.overview,`scenes[${t}].overview`,{allowComparison:!1});for(let a of["path","leftLabel","rightLabel","leftContent","rightContent"])G(e[a],`scenes[${t}].${a}`);e.previousPath!==void 0&&G(e.previousPath,`scenes[${t}].previousPath`),G(e.changeKind,`scenes[${t}].changeKind`),ce(e.additions,`scenes[${t}].additions`),ce(e.deletions,`scenes[${t}].deletions`),e.focusChangeIndex!==void 0&&ce(e.focusChangeIndex,`scenes[${t}].focusChangeIndex`)}function ua(e,t){if(!Array.isArray(e.stack)||e.stack.length<2||e.stack.length>6)throw new Error(`scenes[${t}].stack must contain between 2 and 6 revisions.`);for(let[o,a]of e.stack.entries()){if(!W(a))throw new Error(`scenes[${t}].stack[${o}] must be an object.`);for(let i of["id","ref","oid","label"])G(a[i],`scenes[${t}].stack[${o}].${i}`)}Wo(e.files,e.stack.length,t),Go(e.steps,e.stack.length,t,!1)}function fa(e,t){if(e.stageLabel!=="Explanation stages")throw new Error(`scenes[${t}].stageLabel must be Explanation stages.`);if(!W(e.realRange))throw new Error(`scenes[${t}].realRange must be an object.`);for(let a of["baseRef","targetRef","baseOid","targetOid"])G(e.realRange[a],`scenes[${t}].realRange.${a}`);if(!Array.isArray(e.panels)||e.panels.length<2||e.panels.length>13)throw new Error(`scenes[${t}].panels must contain a baseline and between 1 and 12 stages.`);let o=e.panels;for(let[a,i]of o.entries()){if(!W(i))throw new Error(`scenes[${t}].panels[${a}] must be an object.`);for(let l of["id","label","role"])G(i[l],`scenes[${t}].panels[${a}].${l}`);let s=a===0?"baseline":"stage";if(i.role!==s)throw new Error(`scenes[${t}].panels[${a}].role must be ${s}.`);a>0&&G(i.stageId,`scenes[${t}].panels[${a}].stageId`)}if(Wo(e.files,o.length,t),Go(e.steps,o.length,t,!0),Array.isArray(e.steps)){let a=-1;e.steps.forEach((i,s)=>{if(!W(i))return;let l=Number(i.pairIndex);if(l<a)throw new Error(`scenes[${t}].steps must remain grouped in explanation stage order.`);if(a=l,i.stageId!==void 0&&G(i.stageId,`scenes[${t}].steps[${s}].stageId`),i.stageIndex!==void 0&&ce(i.stageIndex,`scenes[${t}].steps[${s}].stageIndex`),i.focusIndex!==void 0&&ce(i.focusIndex,`scenes[${t}].steps[${s}].focusIndex`),i.focusCount!==void 0&&Bt(i.focusCount,`scenes[${t}].steps[${s}].focusCount`),i.stageIndex!==void 0&&Number(i.stageIndex)!==l)throw new Error(`scenes[${t}].steps[${s}].stageIndex must match pairIndex.`);if(i.focusIndex!==void 0&&i.focusCount!==void 0&&Number(i.focusIndex)>=Number(i.focusCount))throw new Error(`scenes[${t}].steps[${s}].focusIndex must be less than focusCount.`)});for(let i=0;i<o.length-1;i+=1){let s=o[i+1],l=e.steps.filter(m=>W(m)&&Number(m.pairIndex)===i);if(!W(s)||l.length===0)throw new Error(`scenes[${t}].steps must cover every explanation stage.`);let f=l[0],p=W(f)?f.id:void 0;if(l.some(m=>W(m)?(m.stageId??p)!==s.stageId:!0))throw new Error(`scenes[${t}].panels must align with explanation stage ids.`)}}}function Wo(e,t,o){if(!Array.isArray(e)||e.length===0)throw new Error(`scenes[${o}].files must be non-empty.`);for(let[a,i]of e.entries()){if(!W(i))throw new Error(`scenes[${o}].files[${a}] must be an object.`);if(G(i.path,`scenes[${o}].files[${a}].path`),!Array.isArray(i.panels)||i.panels.length!==t)throw new Error(`scenes[${o}].files[${a}].panels must match panel count.`);for(let[s,l]of i.panels.entries()){if(!W(l))throw new Error(`scenes[${o}].files[${a}].panels[${s}] must be an object.`);for(let f of["id","label","content"])G(l[f],`scenes[${o}].files[${a}].panels[${s}].${f}`);if(l.path!==void 0&&G(l.path,`scenes[${o}].files[${a}].panels[${s}].path`),typeof l.exists!="boolean")throw new Error(`scenes[${o}].files[${a}].panels[${s}].exists must be boolean.`)}}}function Go(e,t,o,a){if(!Array.isArray(e)||e.length===0)throw new Error(`scenes[${o}].steps must be non-empty.`);for(let[i,s]of e.entries()){if(!W(s))throw new Error(`scenes[${o}].steps[${i}] must be an object.`);for(let l of["id","title","body","file","side"])G(s[l],`scenes[${o}].steps[${i}].${l}`);if(ce(s.pairIndex,`scenes[${o}].steps[${i}].pairIndex`),Number(s.pairIndex)>=t-1)throw new Error(`scenes[${o}].steps[${i}].pairIndex is outside the panels.`);if(a&&(gt(s.introducedHunks,`scenes[${o}].steps[${i}].introducedHunks`),s.introducedHunks.length===0))throw new Error(`scenes[${o}].steps[${i}].introducedHunks must be non-empty.`);if(s.side!=="left"&&s.side!=="right")throw new Error(`scenes[${o}].steps[${i}].side must be left or right.`);s.startLine!==void 0&&Bt(s.startLine,`scenes[${o}].steps[${i}].startLine`),s.endLine!==void 0&&Bt(s.endLine,`scenes[${o}].steps[${i}].endLine`)}}function ha(e,t){if(!W(e))throw new Error(`files[${t}] must be an object.`);if(e.kind==="text-diff"){mt(e,t,1);return}if(e.kind!=="omitted")throw new Error(`files[${t}].kind must be text-diff or omitted.`);for(let o of["id","title","path","changeKind","reason"])G(e[o],`files[${t}].${o}`);e.previousPath!==void 0&&G(e.previousPath,`files[${t}].previousPath`),ce(e.additions,`files[${t}].additions`),ce(e.deletions,`files[${t}].deletions`)}function pa(e){let t=new Map;for(let o of e){if(o.kind==="text-diff"){t.has(o.path)||t.set(o.path,o);continue}if(o.kind==="walkthrough")for(let a of o.steps)t.has(a.diff.path)||t.set(a.diff.path,a.diff)}return[...t.values()].sort((o,a)=>o.path.localeCompare(a.path))}function hr(e,t){if(!W(e))throw new Error(`${t} must be an object.`);for(let o of["id","path","revision","excerpt"])G(e[o],`${t}.${o}`);if(e.revision!=="base"&&e.revision!=="head")throw new Error(`${t}.revision must be base or head.`);if(Bt(e.startLine,`${t}.startLine`),Bt(e.endLine,`${t}.endLine`),Number(e.endLine)<Number(e.startLine))throw new Error(`${t}.endLine must not precede startLine.`)}function ma(e,t){G(e.summary,`${t}.summary`),gt(e.bullets,`${t}.bullets`),gt(e.tags,`${t}.tags`),G(e.takeaway,`${t}.takeaway`)}function pr(e,t,o){if(e!==void 0){if(t<5)throw new Error(`${o} requires manifest version 5.`);if(typeof e!="string"||!e.trim())throw new Error(`${o} must be a non-empty string.`)}}function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function G(e,t){if(typeof e!="string")throw new Error(`${t} must be a string.`)}function gt(e,t){if(!Array.isArray(e)||e.some(o=>typeof o!="string"))throw new Error(`${t} must be an array of strings.`)}function ce(e,t){if(!Number.isInteger(e)||Number(e)<0)throw new Error(`${t} must be a non-negative integer.`)}function jo(e,t){if(typeof e!="number"||!Number.isFinite(e)||e<0||e>100)throw new Error(`${t} must be a number from 0 to 100.`)}function Bt(e,t){if(!Number.isInteger(e)||Number(e)<1)throw new Error(`${t} must be a positive integer.`)}var ga=new Set(["modified-here","created-here","deleted-here"]);function mr(e,t){let o=e.panels[t],a=e.panels[t+1];return!o||!a?"unchanged-here":o.exists&&a.exists?o.content===a.content?"unchanged-here":"modified-here":!o.exists&&a.exists?"created-here":o.exists&&!a.exists?"deleted-here":e.panels.slice(0,t).some(l=>l.exists)?"already-deleted":(e.panels.slice(t+2).some(l=>l.exists),"not-created-yet")}function Vo(e,t,o,a){let i=new Set(e.filter(l=>ga.has(mr(l,t))).map(l=>l.path)),s=We({paths:e.map(l=>l.path),currentPath:o,changedPaths:i},a);return s?{pairIndex:t,fileIndex:e.findIndex(l=>l.path===s),path:s}:null}function gr(e,t,o){let a=e.findIndex(f=>f.id===t),i=a>=0?a:0,s=e[i];if(!s||s.kind!=="walkthrough"&&s.kind!=="stacked-diff"&&s.kind!=="deconstructed-diff"||!o)return{sceneIndex:i,stepIndex:0};let l=s.steps.findIndex(f=>f.id===o);return{sceneIndex:i,stepIndex:l>=0?l:0}}function Jo(e,t,o){let a=We({paths:e.filter(i=>i.kind==="text-diff").map(i=>i.path),currentPath:t},o);return a?{fileIndex:e.findIndex(i=>i.path===a),path:a}:null}var Zo=240;function Qo(e,t,o){let a=[],i=(l,f,p)=>{f&&a.push({source:{field:l,...p===void 0?{}:{itemIndex:p}},text:f})},s=l=>{l.forEach(f=>{i("route-title",f.title,f.sceneIndex)})};if(t.kind==="title"||t.kind==="conclusion"){let l=t.kind==="title"?e.opening:e.conclusion;if(t.kind==="title"&&i("document-title",e.title),i("passage-title",l?.title),i("summary",l?.summary),l?.bullets?.forEach((f,p)=>i("bullet",f,p)),t.kind==="title"){let f=Rt(e);f.chapters.forEach(p=>{i("route-chapter",p.title,p.chapterIndex)}),f.chapters.length||s(f.scenes)}}else if(t.kind==="chapter"){let l=Rt(e).chapters.find(f=>f.chapterId===t.chapterId);i("chapter",l.title),i("summary",l.summary)}else{let l=e.scenes[t.sceneIndex];if(t.kind==="scene")i("scene-title",Fe(e,{kind:"scene",key:`scene:${l.id}`,sceneIndex:t.sceneIndex,stepIndex:0})),i("summary",l.summary),l.bullets.forEach((f,p)=>i("bullet",f,p)),Xo(l)||i("takeaway",l.takeaway),"overview"in l&&i("overview-purpose",l.overview?.purpose);else if(Xo(l)){let f=l.steps[t.stepIndex];o.entry==="playback-start"&&i("scene-title",Fe(e,{kind:"scene",key:`scene:${l.id}`,sceneIndex:t.sceneIndex,stepIndex:0})),o.entry==="playback-start"&&l.kind==="deconstructed-diff"&&!f.body&&i("stage-title",l.panels[l.steps[t.stepIndex].pairIndex+1].label),i("step-title",Fe(e,t)),i("step-orientation",tn(e,t.sceneIndex,t.stepIndex)),i("step-body",f.body),"connection"in f&&i("connection",f.connection?.label),t.stepIndex===l.steps.length-1&&i("takeaway",l.takeaway)}}return{id:t.key,readingKey:t.key,segments:a.flatMap(l=>ba(t.key,l,o.segmentLimit??Zo))}}function ya(e,t=Zo){if(!Number.isInteger(t)||t<40)throw new Error("Narration segment limit must be an integer of at least 40 characters.");return va(e).flatMap(a=>xa(e,a.startOffset,a.endOffset,t))}function wa(e){return e.replace(/https?:\/\/\S+/giu," ").replace(/\b(?=[0-9a-f]{7,40}\b)(?=[0-9a-f]*\d)[0-9a-f]+\b/giu," ").replace(/[`*_~]/gu,"").replace(/([\p{Ll}\d])(\p{Lu})/gu,"$1 $2").replace(/([\p{Lu}])(\p{Lu}\p{Ll})/gu,"$1 $2").replace(/\s+/gu," ").trim()}function ba(e,t,o){let a=t.source.itemIndex===void 0?t.source.field:`${t.source.field}-${t.source.itemIndex}`;return ya(t.text,o).map((i,s)=>({id:`${e}:${a}:${s}`,text:i.text,speechText:wa(i.text),source:t.source,startOffset:i.startOffset,endOffset:i.endOffset})).filter(i=>i.speechText.length>0)}function va(e){let t=[],o=0;for(let a=0;a<e.length;a+=1){if(!".!?".includes(e[a]))continue;let i=a+1;for(;i<e.length&&`"'\u201D\u2019)]}`.includes(e[i]);)i+=1;i<e.length&&!/\s/u.test(e[i])||(gn(e,t,o,i),o=i)}return gn(e,t,o,e.length),t}function xa(e,t,o,a){let i=[],s=t;for(;o-s>a;){let l=s+a,f=s+Math.floor(a*.55),p=Yo(e,f,l,/[;,:—–-]/u);p<=s&&(p=Yo(e,f,l,/\s/u)),p<=s&&(p=l),gn(e,i,s,p),s=p}return gn(e,i,s,o),i}function Yo(e,t,o,a){for(let i=o;i>=t;i-=1)if(a.test(e[i]))return i+1;return-1}function gn(e,t,o,a){let i=o,s=a;for(;i<s&&/\s/u.test(e[i]);)i+=1;for(;s>i&&/\s/u.test(e[s-1]);)s-=1;i<s&&t.push({text:e.slice(i,s),startOffset:i,endOffset:s})}function Xo(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}function ei(e){let t=[{kind:"title",key:"title",sceneIndex:0,stepIndex:0,...e.opening?{authored:!0}:{}}],o=new Map;for(let i of e.chapters)for(let s of i.sceneIds)o.has(s)||o.set(s,i.id);let a=new Set;return e.scenes.forEach((i,s)=>{let l=o.get(i.id);e.chapters.find(p=>p.id===l)?.summary?.trim()&&l&&!a.has(l)&&(t.push({kind:"chapter",key:`chapter:${l}`,chapterId:l,sceneIndex:s,stepIndex:0}),a.add(l)),t.push({kind:"scene",key:`scene:${i.id}`,...l?{chapterId:l}:{},sceneIndex:s,stepIndex:0}),ka(i)&&i.steps.forEach((p,m)=>{t.push({kind:"step",key:`step:${i.id}:${p.id}`,sceneIndex:s,stepIndex:m})})}),e.conclusion&&t.push({kind:"conclusion",key:"conclusion",sceneIndex:-1,stepIndex:0}),t}function Ut(e,t,o,a=!1){if(o!==-1&&o!==1)return null;let i=e.findIndex(s=>s.key===t);if(i<0)return null;for(let s=i+o;s>=0&&s<e.length;s+=o){let l=e[s];if(!a||l.kind==="step"||l.kind==="conclusion"||l.kind==="title")return l}return null}function tt(e){return e.scenes.length>0&&e.scenes.every(t=>t.kind==="walkthrough"&&t.steps.length>0&&t.steps.every(o=>!!o.image))}function yn(e,t,o,a=null){if(a==="conclusion")return e.find(s=>s.kind==="conclusion")??null;if(a==="tour")return e.find(s=>s.kind==="title")??null;let i=e.findIndex(s=>s.kind==="scene"&&s.sceneIndex===t);if(i<0)return null;if(a==="overview")return e[i]??null;if(a==="chapter"){let s=e[i];return s.kind!=="scene"?null:e.find(l=>l.kind==="chapter"&&l.chapterId===s.chapterId)??s}return e.find(s=>s.kind==="step"&&s.sceneIndex===t&&s.stepIndex===o)??e[i]??null}function ka(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}var wn=class{constructor(t,o){this.engine=t;this.callbacks=o;this.generation=0;this.continuous=!0;this.currentState={kind:"idle"}}get state(){return this.currentState}get engaged(){return this.currentState.kind==="playing"||this.currentState.kind==="paused"}start(t,o=!0){if(this.resetEngine(),this.continuous=o,t.segments.length===0){this.finishUnit(t);return}this.callbacks.claimAudio(),this.setState({kind:"playing",unit:t,segmentIndex:0}),this.speakCurrent()}togglePause(){if(this.currentState.kind==="playing"){this.engine.pause();let o={kind:"paused",unit:this.currentState.unit,segmentIndex:this.currentState.segmentIndex,pendingStart:!1};this.setState(o),this.callbacks.onSegmentChange(o.unit.segments[o.segmentIndex]||null,!0);return}if(this.currentState.kind!=="paused")return;this.callbacks.claimAudio();let t=this.currentState;this.setState({kind:"playing",unit:t.unit,segmentIndex:t.segmentIndex}),t.pendingStart?this.speakCurrent():(this.engine.resume(),this.callbacks.onSegmentChange(t.unit.segments[t.segmentIndex]||null,!1))}stop(){this.resetEngine(),this.setState({kind:"idle"}),this.callbacks.onSegmentChange(null,!1)}pauseForExternalOwner(){this.currentState.kind==="playing"&&this.togglePause()}canSkipSegment(t){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return!1;let o=this.currentState.segmentIndex+t;return o>=0&&o<this.currentState.unit.segments.length?!0:this.callbacks.canNavigateUnit(this.currentState.unit,t)}skipSegment(t){if(!this.canSkipSegment(t))return!1;let o=this.currentState,a=o.kind==="paused",i=o.unit,s=o.segmentIndex+t;if(s<0||s>=i.segments.length){let l=this.callbacks.navigateUnit(i,t);if(!l||l.segments.length===0)return!1;i=l,s=t<0?i.segments.length-1:0}return this.resetEngine(),a?(this.setState({kind:"paused",unit:i,segmentIndex:s,pendingStart:!0}),this.callbacks.onSegmentChange(i.segments[s]||null,!0)):(this.setState({kind:"playing",unit:i,segmentIndex:s}),this.speakCurrent()),!0}followLinearNavigation(t){this.currentState.kind==="playing"?this.start(t,this.continuous):this.currentState.kind==="paused"&&this.preparePaused(t)}followDirectNavigation(t){this.engaged&&this.preparePaused(t)}interruptForExploration(){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return;let t=this.currentState;this.resetEngine(),this.setState({kind:"paused",unit:t.unit,segmentIndex:t.segmentIndex,pendingStart:!0}),this.callbacks.onSegmentChange(t.unit.segments[t.segmentIndex]||null,!0)}dispose(){this.stop()}preparePaused(t){this.resetEngine(),this.setState({kind:"paused",unit:t,segmentIndex:0,pendingStart:!0}),this.callbacks.onSegmentChange(t.segments[0]||null,!0)}speakCurrent(){if(this.currentState.kind!=="playing")return;let t=this.generation,o=this.currentState.unit.segments[this.currentState.segmentIndex];if(!o){this.finishUnit(this.currentState.unit);return}this.callbacks.onSegmentChange(o,!1),this.engine.speak(o,{onEnd:()=>{if(t!==this.generation||this.currentState.kind!=="playing")return;let a=this.currentState.segmentIndex+1;a<this.currentState.unit.segments.length?(this.setState({kind:"playing",unit:this.currentState.unit,segmentIndex:a}),this.speakCurrent()):this.finishUnit(this.currentState.unit)},onError:a=>{t===this.generation&&(this.setState({kind:"error",message:a}),this.callbacks.onSegmentChange(null,!1))}})}finishUnit(t){if(this.continuous){let o=this.callbacks.navigateUnit(t,1);if(o){if(this.generation+=1,o.segments.length===0){this.finishUnit(o);return}this.setState({kind:"playing",unit:o,segmentIndex:0}),this.speakCurrent();return}}this.setState({kind:"completed"}),this.callbacks.onSegmentChange(null,!1)}resetEngine(){this.generation+=1,this.engine.cancel()}setState(t){this.currentState=t,this.callbacks.onStateChange(t)}};function ti(e,t,o="all",a=300){let i=t.trim().toLocaleLowerCase();if(!i||a<=0)return[];let s=[];if(o!=="code"){for(let[f,p]of[["title",e.opening],["conclusion",e.conclusion]]){let m=p&&yr([p.title,p.summary,...p.bullets||[]],i);m&&p&&s.push({kind:"narrative",sceneIndex:f==="title"?0:-1,readingKey:f,label:p.title,preview:m})}let l=new Map;for(let f of e.chapters){let p=e.scenes.findIndex(m=>f.sceneIds.includes(m.id));p>=0&&f.summary?.toLocaleLowerCase().includes(i)&&s.push({kind:"narrative",sceneIndex:p,readingKey:`chapter:${f.id}`,label:f.title,preview:f.summary})}e.chapters.forEach(f=>f.sceneIds.forEach(p=>l.set(p,f.title))),e.scenes.forEach((f,p)=>{let m=[l.get(f.id),f.title,f.summary,"overview"in f?f.overview?.purpose:void 0,...f.bullets,...f.tags,f.takeaway],y=yr(m,i);y&&s.push({kind:"narrative",sceneIndex:p,label:f.title,preview:y}),Ia(f)&&f.steps.forEach((b,E)=>{let I=yr([b.title,b.body,"connection"in b?b.connection?.label:void 0],i);I&&s.push({kind:"narrative",sceneIndex:p,stepIndex:E,label:`${f.title} \xB7 ${b.title}`,preview:I})})})}if(o!=="narrative"&&s.length<a)for(let l=0;l<e.files.length;l+=1){let f=e.files[l];if(f.kind==="text-diff"){for(let[p,m]of[[0,f.leftContent],[1,f.rightContent]])for(let y of Ea(m,i))if(s.push({kind:"code",fileIndex:l,sideIndex:p,label:`${f.path} \xB7 ${p===0?"base":"head"}`,...y}),s.length>=a)return s}}return s.slice(0,a)}function yr(e,t){return e.find(o=>o?.toLocaleLowerCase().includes(t))}function Ea(e,t){let o=[];return e.replace(/\r\n/g,`
159
+ `}}function Vo(e){let t=()=>{throw new Error("Invalid pinned symbol tour evidence.")};(!e||typeof e!="object")&&t();let o=e;(typeof o.id!="string"||!o.id.trim()||!o.range||![o.range.baseOid,o.range.headOid].every(i=>typeof i=="string"&&/^[0-9a-f]{40,64}$/.test(i))||!["inferred","unmatched","ambiguous"].includes(o.status)||o.behavior!=="unassessed"||!o.context)&&t(),+!!o.before+ +!!o.after!==(o.status==="inferred"?2:1)&&t();for(let[i,s]of[[o.before,o.context.leftContent],[o.after,o.context.rightContent]]){if(typeof s!="string"&&t(),!i){s!==""&&t();continue}(typeof i.id!="string"||!i.id||typeof i.name!="string"||!i.name||typeof i.kind!="string"||!i.kind||typeof i.path!="string"||i.path.includes("\0")||i.path.startsWith("/")||i.path.includes("\\")||i.path.split("/").some(l=>!l||l==="."||l==="..")||typeof i.digest!="string"||!/^[0-9a-f]{64}$/.test(i.digest)||!Number.isSafeInteger(i.start)||!Number.isSafeInteger(i.end)||i.start<0||i.end<=i.start||i.end>s.length||s.slice(i.start,i.end)!==i.text||i.startLine!==s.slice(0,i.start).split(`
160
+ `).length||i.endLine!==s.slice(0,i.end-1).split(`
161
+ `).length)&&t()}}function bn(e,t,o){for(let c of["opening","conclusion"]){let i=e[c];if(i===void 0)continue;if(Number(t)<5)throw new Error(`${o}.${c} requires version 5.`);if(!i||typeof i!="object"||Array.isArray(i))throw new Error(`${o}.${c} must be an object.`);let s=i;for(let l of Object.keys(s))if(!["title","summary","bullets"].includes(l))throw new Error(`${o}.${c}.${l} is unsupported.`);for(let l of["title","summary"])pr(s[l],`${o}.${c}.${l}`);if(s.bullets!==void 0){if(!Array.isArray(s.bullets))throw new Error(`${o}.${c}.bullets must be an array.`);s.bullets.forEach((l,f)=>pr(l,`${o}.${c}.bullets[${f}]`))}}}function hr(e,t,o){if(e!==void 0){if(t<5){if(e&&typeof e=="object"&&"purpose"in e)throw new Error(`${o}.purpose requires version 5.`);return}pr(e?.purpose,`${o}.purpose`)}}function pr(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`)}function ha(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ma(e){return typeof e=="string"&&e.length>0&&!/[\\\x00-\x1f:]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")}function Jo(e,t){if(e===void 0)return;if(!ha(e)||!ma(e.path)||typeof e.alt!="string"||!e.alt.trim()||typeof e.revision!="string"||!/^[a-f0-9]{40,64}$/.test(e.revision)||typeof e.dataUrl!="string"||!e.dataUrl.startsWith("data:image/png;base64,"))throw new Error(`${t} must contain pinned, embedded PNG evidence and alt text.`);let o=e.dataUrl.slice(22);if(o.length/4*3-(o.endsWith("==")?2:o.endsWith("=")?1:0)>8388608||o.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(o))throw new Error(`${t} must be a PNG of at most 8 MiB.`);let i=Uint8Array.from(atob(o.slice(0,44)),s=>s.charCodeAt(0));ga(i,t)}function ga(e,t){let o=[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82];if(e.length<33||o.some((l,f)=>e[f]!==l))throw new Error(`${t} must be a PNG with an IHDR header.`);let c=new DataView(e.buffer,e.byteOffset,e.byteLength),i=c.getUint32(16),s=c.getUint32(20);if(!i||!s||i>16384||s>16384||i*s>64*1024*1024)throw new Error(`${t} exceeds the PNG dimension limit.`)}function wn(e,t){if(e!==void 0){if(!Yo(e))throw new Error(`${t} must be an object.`);Xo(e,["audience"],t),ya(e.audience,`${t}.audience`)}}function ya(e,t){if(e!==void 0){if(!Yo(e))throw new Error(`${t} must be an object.`);if(Xo(e,["codebase","language","domain","readingDemand","purpose","scope","estimatedMinutes"],t),typeof e.codebase!="string"||!["none","some","maintainer"].includes(e.codebase))throw new Error(`${t}.codebase must be none, some, or maintainer.`);if(typeof e.language!="string"||!["none","basic","fluent","advanced"].includes(e.language))throw new Error(`${t}.language must be none, basic, fluent, or advanced.`);if(e.domain!==void 0&&wa(e.domain,`${t}.domain`),typeof e.readingDemand!="string"||!["general","technical","specialist"].includes(e.readingDemand))throw new Error(`${t}.readingDemand must be general, technical, or specialist.`);if(typeof e.purpose!="string"||!["overview","explanation","review"].includes(e.purpose))throw new Error(`${t}.purpose must be overview, explanation, or review.`);if(ba(e.scope,`${t}.scope`),e.estimatedMinutes!==void 0&&(typeof e.estimatedMinutes!="number"||!Number.isFinite(e.estimatedMinutes)||e.estimatedMinutes<=0))throw new Error(`${t}.estimatedMinutes must be a finite positive number.`)}}function Yo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ba(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`)}function wa(e,t){if(!Array.isArray(e)||e.some(o=>typeof o!="string"||o.trim().length===0))throw new Error(`${t} must be an array of strings.`)}function Xo(e,t,o){let c=Object.keys(e).filter(i=>!t.includes(i));if(c.length>0)throw new Error(`${o} contains unknown field${c.length===1?"":"s"}: ${c.join(", ")}`)}function Zo(e,t){if(e!==void 0){if(!mr(e))throw new Error(`${t} must be an object.`);if(gr(e,["id","text","status","source","confidence"],t),it(e.id,`${t}.id`),it(e.text,`${t}.text`),e.status!==void 0&&!["fulfilled","gap"].includes(String(e.status)))throw new Error(`${t}.status must be fulfilled or gap.`);if(xa(e.source,`${t}.source`),e.confidence!==void 0&&!["high","medium","low"].includes(String(e.confidence)))throw new Error(`${t}.confidence must be high, medium, or low.`)}}function wt(e,t,o={}){if(e!==void 0){if(!mr(e))throw new Error(`${t} must be an object.`);if(gr(e,["kind","path","comparison","purpose"],t),e.kind!=="directory-diff")throw new Error(`${t}.kind must be directory-diff.`);if(e.purpose!==void 0&&it(e.purpose,`${t}.purpose`),e.path!==void 0&&va(e.path,`${t}.path`),e.comparison!==void 0){if(o.allowComparison===!1)throw new Error(`${t}.comparison is not supported for walkthrough scenes; use the fixed base-to-head comparison.`);if(!mr(e.comparison))throw new Error(`${t}.comparison must be an object.`);if(gr(e.comparison,["from","to"],`${t}.comparison`),it(e.comparison.from,`${t}.comparison.from`),it(e.comparison.to,`${t}.comparison.to`),e.comparison.from===e.comparison.to)throw new Error(`${t}.comparison.from and to must identify distinct endpoints.`);if(o.endpointIds!==void 0){for(let c of[e.comparison.from,e.comparison.to])if(!o.endpointIds.includes(c))throw new Error(`${t}.comparison endpoint ${c} is not defined by this scene.`)}}}}function va(e,t){if(it(e,t),e.includes("\\"))throw new Error(`${t} must use a relative POSIX directory path without backslashes.`);if(e.startsWith("/")||/^[A-Za-z]:/.test(e))throw new Error(`${t} must be relative to the repository root.`);if(e.split("/").some(o=>o===".."))throw new Error(`${t} must not contain parent-directory traversal.`)}function mr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function it(e,t){if(typeof e!="string"||e.length===0)throw new Error(`${t} must be a non-empty string.`)}function xa(e,t){e!==void 0&&it(e,t)}function gr(e,t,o){let c=Object.keys(e).filter(i=>!t.includes(i));if(c.length>0)throw new Error(`${o} contains unknown field${c.length===1?"":"s"}: ${c.join(", ")}`)}var yr=6;function ei(e,t={}){if(Y(e)&&Number.isInteger(e.version)&&Number(e.version)>yr)throw new Error(`This tour uses manifest format version ${e.version}, but this version of Bygone supports up to version ${yr}. Upgrade Bygone to open it.`);if(Y(e)&&e.version===3)throw new Error("Tour manifest format version 3 is retired. Remove the review block, set source version to 4, and recompile the tour.");if(!Y(e)||e.version!==1&&e.version!==2&&e.version!==4&&e.version!==5&&e.version!==yr)throw new Error("Unsupported or missing change-tour manifest version.");if("review"in e)throw new Error("Change-tour manifests do not support the review field. Put observations in scene and step narrative.");if(bn(e,e.version,"manifest"),ee(e.title,"title"),ee(e.generatedAt,"generatedAt"),e.windowTitle!==void 0&&ee(e.windowTitle,"windowTitle"),e.sourceUrl!==void 0&&ee(e.sourceUrl,"sourceUrl"),!Y(e.range))throw new Error("Change-tour manifest range must be an object.");for(let s of["baseRef","headRef","mergeBaseOid","headOid"])ee(e.range[s],`range.${s}`);if(!Y(e.summary))throw new Error("Change-tour manifest summary must be an object.");for(let s of["changedFiles","includedScenes","additions","deletions","commitCount"])he(e.summary[s],`summary.${s}`);if(xt(e.summary.omittedFiles,"summary.omittedFiles"),!Array.isArray(e.commits)||!Array.isArray(e.chapters)||!Array.isArray(e.scenes))throw new Error("Change-tour manifest commits, chapters, and scenes must be arrays.");if(e.files!==void 0&&!Array.isArray(e.files))throw new Error("Change-tour manifest files must be an array.");let o=new Set;for(let[s,l]of e.scenes.entries()){if(vt(l,s,e.version),o.has(l.id))throw new Error(`Duplicate change-tour scene id: ${l.id}`);o.add(l.id)}for(let[s,l]of e.chapters.entries()){if(!Y(l))throw new Error(`chapters[${s}] must be an object.`);ee(l.id,`chapters[${s}].id`),ee(l.title,`chapters[${s}].title`),wr(l.summary,e.version,`chapters[${s}].summary`),xt(l.sceneIds,`chapters[${s}].sceneIds`);for(let f of l.sceneIds)if(!o.has(f))throw new Error(`Chapter references unknown scene id: ${f}`)}if(e.summary.includedScenes!==e.scenes.length)throw new Error("summary.includedScenes must match the number of scenes.");if(e.details!==void 0){if(e.version<5)throw new Error("details requires manifest version 5.");wn(e.details,"details")}let c=e.files===void 0?$a(e.scenes):e.files.map((s,l)=>(Ta(s,l),s));if(e.files!==void 0&&e.summary.changedFiles!==c.length)throw new Error("summary.changedFiles must match the number of files.");if(e.authoringCoverage!==void 0&&ka(e.authoringCoverage,e.version),e.tours!==void 0){if(e.version!==4&&e.version!==5&&e.version!==6)throw new Error("Independent tours require manifest version 4.");Ea(e.tours,e.version)}e.version!==1&&Ia(e,e.version,!!t.exported);let i=[e.scenes,...Y(e.zoom)&&Y(e.zoom.final)?[e.zoom.final.scenes]:[],...Y(e.tours)?Object.values(e.tours).flatMap(s=>Y(s)?[s.scenes]:[]):[]];for(let s of i)for(let l of s)if(l.kind==="walkthrough"){for(let f of l.steps)if(f.symbol){let h=f.symbol;if(h.range.baseOid!==e.range.mergeBaseOid||h.range.headOid!==e.range.headOid)throw new Error("Symbol tour evidence revisions do not match the tour.");let m=f.focus.revision==="base"?h.before:h.after;if(!m||m.path!==f.focus.path||f.focus.startLine<m.startLine||f.focus.endLine>m.endLine)throw new Error("Symbol stop focus must lie within its selected declaration.")}}return{...e,files:c}}function ka(e,t){if(!Y(e)||!Y(e.walkthrough)||!Array.isArray(e.explanationAssignments))throw new Error("authoringCoverage must contain walkthrough and explanationAssignments.");let o=t>=2?"final":"tour";if(e.walkthrough.scope!==o)throw new Error(`authoringCoverage.walkthrough.scope must be ${o}.`);if(he(e.walkthrough.coveredUnits,"authoringCoverage.walkthrough.coveredUnits"),he(e.walkthrough.includedUnits,"authoringCoverage.walkthrough.includedUnits"),Qo(e.walkthrough.coveragePercent,"authoringCoverage.walkthrough.coveragePercent"),e.walkthrough.coveredUnits>e.walkthrough.includedUnits)throw new Error("authoringCoverage.walkthrough.coveredUnits must not exceed includedUnits.");for(let[c,i]of e.explanationAssignments.entries()){let s=`authoringCoverage.explanationAssignments[${c}]`;if(!Y(i))throw new Error(`${s} must be an object.`);if(ee(i.sceneId,`${s}.sceneId`),he(i.assignedUnits,`${s}.assignedUnits`),he(i.excludedUnits,`${s}.excludedUnits`),he(i.completeUnits,`${s}.completeUnits`),he(i.totalUnits,`${s}.totalUnits`),Qo(i.assignmentPercent,`${s}.assignmentPercent`),i.assignedUnits+i.excludedUnits!==i.completeUnits||i.completeUnits>i.totalUnits)throw new Error(`${s} contains inconsistent unit counts.`)}}function Ea(e,t){if(!Y(e))throw new Error("Change-tour manifest tours must be an object.");if(e.historical===void 0&&e.deconstructed===void 0)throw new Error("Change-tour manifest tours must contain a historical or deconstructed tour.");for(let o of["historical","deconstructed"]){let c=e[o];if(c===void 0)continue;if(!Y(c)||!Array.isArray(c.chapters)||!Array.isArray(c.scenes)||c.chapters.length===0||c.scenes.length===0)throw new Error(`Change-tour manifest tours.${o} must contain non-empty chapters and scenes arrays.`);bn(c,t,`tours.${o}`);let i=new Set,s=!1;for(let[l,f]of c.scenes.entries()){if(vt(f,l,t),i.has(f.id))throw new Error(`Duplicate ${o} tour scene id: ${f.id}`);if(i.add(f.id),f.kind==="deconstructed-diff"&&(s=!0),o==="historical"&&f.kind==="deconstructed-diff")throw new Error("Historical tours cannot contain synthetic deconstructed scenes.")}if(c.details!==void 0){if(t<5)throw new Error(`tours.${o}.details requires manifest version 5.`);wn(c.details,`tours.${o}.details`)}if(o==="deconstructed"&&!s)throw new Error("Deconstructed tours must contain a constructed deconstructed-diff scene.");for(let[l,f]of c.chapters.entries()){if(!Y(f))throw new Error(`tours.${o}.chapters[${l}] must be an object.`);ee(f.id,`tours.${o}.chapters[${l}].id`),ee(f.title,`tours.${o}.chapters[${l}].title`),wr(f.summary,t,`tours.${o}.chapters[${l}].summary`),xt(f.sceneIds,`tours.${o}.chapters[${l}].sceneIds`);for(let h of f.sceneIds)if(!i.has(h))throw new Error(`tours.${o} chapter references unknown scene id: ${h}`)}}}function Ia(e,t,o){if(!o&&(!Y(e.repository)||typeof e.repository.root!="string"||!e.repository.root))throw new Error("A v2 tour requires its originating repository.root.");if(!Y(e.zoom)||!Array.isArray(e.zoom.revisions)||!Y(e.zoom.final))throw new Error("A v2 tour requires zoom metadata and real revision evidence.");let c=e.scenes,i=e.zoom.revisions,s=new Set;for(let[v,k]of i.entries()){if(vt(k,v,t),k.kind!=="stacked-diff")throw new Error("zoom.revisions must contain real stacked-diff scenes.");if(s.has(k.id))throw new Error(`Duplicate zoom revision scene: ${k.id}`);s.add(k.id);let x=e.range;if(k.stack[0].oid!==x.mergeBaseOid||k.stack[k.stack.length-1].oid!==x.headOid)throw new Error(`Revision scene ${k.id} endpoints must match the final diff range.`)}for(let v of c){if(v.kind!=="deconstructed-diff"&&v.kind!=="stacked-diff")continue;let k=i.find(x=>x.id===v.id);if(!k)throw new Error(`Scene ${v.id} is missing its real revision evidence.`);if(v.kind==="deconstructed-diff"&&(k.stack[0].oid!==v.realRange.baseOid||k.stack[k.stack.length-1].oid!==v.realRange.targetOid))throw new Error(`Deconstructed scene ${v.id} real stack endpoints must match its explanation range.`)}let l=c.some(v=>v.kind==="deconstructed-diff"),f=i.some(v=>v.stack.length>2),h=l?"explanation":f?"revisions":"final",m=[...l?["explanation"]:[],...f?["revisions"]:[],"final","history"];if(e.zoom.authoredDepth!==h||JSON.stringify(e.zoom.modes)!==JSON.stringify(m))throw new Error("zoom depth and modes must match the maximum authored depth.");if(!Array.isArray(e.files))throw new Error("A v2 tour requires final endpoint file evidence.");if(!Array.isArray(e.zoom.final.scenes)||!Array.isArray(e.zoom.final.chapters))throw new Error("A v2 tour requires a non-stacked final tour.");let w=new Set;for(let[v,k]of e.zoom.final.scenes.entries()){if(vt(k,v,t),k.kind==="stacked-diff"||k.kind==="deconstructed-diff")throw new Error("zoom.final must contain only non-stacked scenes.");if(w.has(k.id))throw new Error(`Duplicate final tour scene: ${k.id}`);w.add(k.id)}for(let[v,k]of e.zoom.final.chapters.entries()){if(!Y(k)||!Array.isArray(k.sceneIds))throw new Error(`zoom.final.chapters[${v}] must contain sceneIds.`);ee(k.id,`zoom.final.chapters[${v}].id`),ee(k.title,`zoom.final.chapters[${v}].title`),wr(k.summary,t,`zoom.final.chapters[${v}].summary`);for(let x of k.sceneIds)if(ee(x,`zoom.final.chapters[${v}].sceneIds`),!w.has(x))throw new Error(`Final tour chapter references unknown scene: ${x}`)}}function vt(e,t,o){if(!Y(e)||!["text-diff","discussion","walkthrough","stacked-diff","deconstructed-diff"].includes(String(e.kind)))throw new Error(`scenes[${t}] must be a text-diff, discussion, walkthrough, stacked-diff, or deconstructed-diff scene.`);for(let c of["id","title"])ee(e[c],`scenes[${t}].${c}`);if(e.overview!==void 0&&o<4)throw new Error(`scenes[${t}].overview requires manifest version 4.`);if(hr(e.overview,o,`scenes[${t}].overview`),Aa(e,`scenes[${t}]`),e.kind==="discussion"){wt(e.overview,`scenes[${t}].overview`,{allowComparison:!1});return}if(e.kind==="walkthrough"){if(wt(e.overview,`scenes[${t}].overview`,{allowComparison:!1}),!Array.isArray(e.steps)||e.steps.length===0)throw new Error(`scenes[${t}].steps must be a non-empty array.`);for(let[c,i]of e.steps.entries()){let s=`scenes[${t}].steps[${c}]`;if(!Y(i)||!Y(i.focus)||!Y(i.diff))throw new Error(`${s} must contain focus and diff objects.`);for(let l of["id","title","body"])ee(i[l],`${s}.${l}`);if(i.depth!==void 0&&!["mentioned","explained","contextualized"].includes(String(i.depth)))throw new Error(`${s}.depth must be mentioned, explained, or contextualized.`);if(Zo(i.requirement,`${s}.requirement`),Jo(i.image,`${s}.image`),i.symbol!==void 0){if(o<6)throw new Error(`${s}.symbol requires manifest version 6.`);if(i.image||i.connection)throw new Error(`${s}.symbol cannot combine with image or connection.`);Vo(i.symbol)}if(br(i.focus,`${s}.focus`),vt(i.diff,t,o),i.diff.kind!=="text-diff")throw new Error(`${s}.diff must be a text-diff scene.`);if(i.connection!==void 0){if(!Y(i.connection))throw new Error(`${s}.connection must be an object.`);ee(i.connection.id,`${s}.connection.id`),ee(i.connection.label,`${s}.connection.label`),br(i.connection.from,`${s}.connection.from`),br(i.connection.to,`${s}.connection.to`)}}return}if(e.kind==="stacked-diff"){Sa(e,t),wt(e.overview,`scenes[${t}].overview`,{endpointIds:e.stack.map(c=>c.id)});return}if(e.kind==="deconstructed-diff"){Ca(e,t),wt(e.overview,`scenes[${t}].overview`,{endpointIds:e.panels.map(c=>c.id)});return}wt(e.overview,`scenes[${t}].overview`,{allowComparison:!1});for(let c of["path","leftLabel","rightLabel","leftContent","rightContent"])ee(e[c],`scenes[${t}].${c}`);e.previousPath!==void 0&&ee(e.previousPath,`scenes[${t}].previousPath`),ee(e.changeKind,`scenes[${t}].changeKind`),he(e.additions,`scenes[${t}].additions`),he(e.deletions,`scenes[${t}].deletions`),e.focusChangeIndex!==void 0&&he(e.focusChangeIndex,`scenes[${t}].focusChangeIndex`)}function Sa(e,t){if(!Array.isArray(e.stack)||e.stack.length<2||e.stack.length>6)throw new Error(`scenes[${t}].stack must contain between 2 and 6 revisions.`);for(let[o,c]of e.stack.entries()){if(!Y(c))throw new Error(`scenes[${t}].stack[${o}] must be an object.`);for(let i of["id","ref","oid","label"])ee(c[i],`scenes[${t}].stack[${o}].${i}`)}ti(e.files,e.stack.length,t),ni(e.steps,e.stack.length,t,!1)}function Ca(e,t){if(e.stageLabel!=="Explanation stages")throw new Error(`scenes[${t}].stageLabel must be Explanation stages.`);if(!Y(e.realRange))throw new Error(`scenes[${t}].realRange must be an object.`);for(let c of["baseRef","targetRef","baseOid","targetOid"])ee(e.realRange[c],`scenes[${t}].realRange.${c}`);if(!Array.isArray(e.panels)||e.panels.length<2||e.panels.length>13)throw new Error(`scenes[${t}].panels must contain a baseline and between 1 and 12 stages.`);let o=e.panels;for(let[c,i]of o.entries()){if(!Y(i))throw new Error(`scenes[${t}].panels[${c}] must be an object.`);for(let l of["id","label","role"])ee(i[l],`scenes[${t}].panels[${c}].${l}`);let s=c===0?"baseline":"stage";if(i.role!==s)throw new Error(`scenes[${t}].panels[${c}].role must be ${s}.`);c>0&&ee(i.stageId,`scenes[${t}].panels[${c}].stageId`)}if(ti(e.files,o.length,t),ni(e.steps,o.length,t,!0),Array.isArray(e.steps)){let c=-1;e.steps.forEach((i,s)=>{if(!Y(i))return;let l=Number(i.pairIndex);if(l<c)throw new Error(`scenes[${t}].steps must remain grouped in explanation stage order.`);if(c=l,i.stageId!==void 0&&ee(i.stageId,`scenes[${t}].steps[${s}].stageId`),i.stageIndex!==void 0&&he(i.stageIndex,`scenes[${t}].steps[${s}].stageIndex`),i.focusIndex!==void 0&&he(i.focusIndex,`scenes[${t}].steps[${s}].focusIndex`),i.focusCount!==void 0&&qt(i.focusCount,`scenes[${t}].steps[${s}].focusCount`),i.stageIndex!==void 0&&Number(i.stageIndex)!==l)throw new Error(`scenes[${t}].steps[${s}].stageIndex must match pairIndex.`);if(i.focusIndex!==void 0&&i.focusCount!==void 0&&Number(i.focusIndex)>=Number(i.focusCount))throw new Error(`scenes[${t}].steps[${s}].focusIndex must be less than focusCount.`)});for(let i=0;i<o.length-1;i+=1){let s=o[i+1],l=e.steps.filter(m=>Y(m)&&Number(m.pairIndex)===i);if(!Y(s)||l.length===0)throw new Error(`scenes[${t}].steps must cover every explanation stage.`);let f=l[0],h=Y(f)?f.id:void 0;if(l.some(m=>Y(m)?(m.stageId??h)!==s.stageId:!0))throw new Error(`scenes[${t}].panels must align with explanation stage ids.`)}}}function ti(e,t,o){if(!Array.isArray(e)||e.length===0)throw new Error(`scenes[${o}].files must be non-empty.`);for(let[c,i]of e.entries()){if(!Y(i))throw new Error(`scenes[${o}].files[${c}] must be an object.`);if(ee(i.path,`scenes[${o}].files[${c}].path`),!Array.isArray(i.panels)||i.panels.length!==t)throw new Error(`scenes[${o}].files[${c}].panels must match panel count.`);for(let[s,l]of i.panels.entries()){if(!Y(l))throw new Error(`scenes[${o}].files[${c}].panels[${s}] must be an object.`);for(let f of["id","label","content"])ee(l[f],`scenes[${o}].files[${c}].panels[${s}].${f}`);if(l.path!==void 0&&ee(l.path,`scenes[${o}].files[${c}].panels[${s}].path`),typeof l.exists!="boolean")throw new Error(`scenes[${o}].files[${c}].panels[${s}].exists must be boolean.`)}}}function ni(e,t,o,c){if(!Array.isArray(e)||e.length===0)throw new Error(`scenes[${o}].steps must be non-empty.`);for(let[i,s]of e.entries()){if(!Y(s))throw new Error(`scenes[${o}].steps[${i}] must be an object.`);for(let l of["id","title","body","file","side"])ee(s[l],`scenes[${o}].steps[${i}].${l}`);if(he(s.pairIndex,`scenes[${o}].steps[${i}].pairIndex`),Number(s.pairIndex)>=t-1)throw new Error(`scenes[${o}].steps[${i}].pairIndex is outside the panels.`);if(c&&(xt(s.introducedHunks,`scenes[${o}].steps[${i}].introducedHunks`),s.introducedHunks.length===0))throw new Error(`scenes[${o}].steps[${i}].introducedHunks must be non-empty.`);if(s.side!=="left"&&s.side!=="right")throw new Error(`scenes[${o}].steps[${i}].side must be left or right.`);s.startLine!==void 0&&qt(s.startLine,`scenes[${o}].steps[${i}].startLine`),s.endLine!==void 0&&qt(s.endLine,`scenes[${o}].steps[${i}].endLine`)}}function Ta(e,t){if(!Y(e))throw new Error(`files[${t}] must be an object.`);if(e.kind==="text-diff"){vt(e,t,1);return}if(e.kind!=="omitted")throw new Error(`files[${t}].kind must be text-diff or omitted.`);for(let o of["id","title","path","changeKind","reason"])ee(e[o],`files[${t}].${o}`);e.previousPath!==void 0&&ee(e.previousPath,`files[${t}].previousPath`),he(e.additions,`files[${t}].additions`),he(e.deletions,`files[${t}].deletions`)}function $a(e){let t=new Map;for(let o of e){if(o.kind==="text-diff"){t.has(o.path)||t.set(o.path,o);continue}if(o.kind==="walkthrough")for(let c of o.steps)t.has(c.diff.path)||t.set(c.diff.path,c.diff)}return[...t.values()].sort((o,c)=>o.path.localeCompare(c.path))}function br(e,t){if(!Y(e))throw new Error(`${t} must be an object.`);for(let o of["id","path","revision","excerpt"])ee(e[o],`${t}.${o}`);if(e.revision!=="base"&&e.revision!=="head")throw new Error(`${t}.revision must be base or head.`);if(qt(e.startLine,`${t}.startLine`),qt(e.endLine,`${t}.endLine`),Number(e.endLine)<Number(e.startLine))throw new Error(`${t}.endLine must not precede startLine.`)}function Aa(e,t){ee(e.summary,`${t}.summary`),xt(e.bullets,`${t}.bullets`),xt(e.tags,`${t}.tags`),ee(e.takeaway,`${t}.takeaway`)}function wr(e,t,o){if(e!==void 0){if(t<5)throw new Error(`${o} requires manifest version 5.`);if(typeof e!="string"||!e.trim())throw new Error(`${o} must be a non-empty string.`)}}function Y(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ee(e,t){if(typeof e!="string")throw new Error(`${t} must be a string.`)}function xt(e,t){if(!Array.isArray(e)||e.some(o=>typeof o!="string"))throw new Error(`${t} must be an array of strings.`)}function he(e,t){if(!Number.isInteger(e)||Number(e)<0)throw new Error(`${t} must be a non-negative integer.`)}function Qo(e,t){if(typeof e!="number"||!Number.isFinite(e)||e<0||e>100)throw new Error(`${t} must be a number from 0 to 100.`)}function qt(e,t){if(!Number.isInteger(e)||Number(e)<1)throw new Error(`${t} must be a positive integer.`)}var La=new Set(["modified-here","created-here","deleted-here"]);function vr(e,t){let o=e.panels[t],c=e.panels[t+1];return!o||!c?"unchanged-here":o.exists&&c.exists?o.content===c.content?"unchanged-here":"modified-here":!o.exists&&c.exists?"created-here":o.exists&&!c.exists?"deleted-here":e.panels.slice(0,t).some(l=>l.exists)?"already-deleted":(e.panels.slice(t+2).some(l=>l.exists),"not-created-yet")}function ri(e,t,o,c){let i=new Set(e.filter(l=>La.has(vr(l,t))).map(l=>l.path)),s=Ye({paths:e.map(l=>l.path),currentPath:o,changedPaths:i},c);return s?{pairIndex:t,fileIndex:e.findIndex(l=>l.path===s),path:s}:null}function xr(e,t,o){let c=e.findIndex(f=>f.id===t),i=c>=0?c:0,s=e[i];if(!s||s.kind!=="walkthrough"&&s.kind!=="stacked-diff"&&s.kind!=="deconstructed-diff"||!o)return{sceneIndex:i,stepIndex:0};let l=s.steps.findIndex(f=>f.id===o);return{sceneIndex:i,stepIndex:l>=0?l:0}}function oi(e,t,o){let c=Ye({paths:e.filter(i=>i.kind==="text-diff").map(i=>i.path),currentPath:t},o);return c?{fileIndex:e.findIndex(i=>i.path===c),path:c}:null}var ai=240;function ci(e,t,o){let c=[],i=(l,f,h)=>{f&&c.push({source:{field:l,...h===void 0?{}:{itemIndex:h}},text:f})},s=l=>{l.forEach(f=>{i("route-title",f.title,f.sceneIndex)})};if(t.kind==="title"||t.kind==="conclusion"){let l=t.kind==="title"?e.opening:e.conclusion;if(t.kind==="title"&&i("document-title",e.title),i("passage-title",l?.title),i("summary",l?.summary),l?.bullets?.forEach((f,h)=>i("bullet",f,h)),t.kind==="title"){let f=Mt(e);f.chapters.forEach(h=>{i("route-chapter",h.title,h.chapterIndex)}),f.chapters.length||s(f.scenes)}}else if(t.kind==="chapter"){let l=Mt(e).chapters.find(f=>f.chapterId===t.chapterId);i("chapter",l.title),i("summary",l.summary)}else{let l=e.scenes[t.sceneIndex];if(t.kind==="scene")i("scene-title",Be(e,{kind:"scene",key:`scene:${l.id}`,sceneIndex:t.sceneIndex,stepIndex:0})),i("summary",l.summary),l.bullets.forEach((f,h)=>i("bullet",f,h)),si(l)||i("takeaway",l.takeaway),"overview"in l&&i("overview-purpose",l.overview?.purpose);else if(si(l)){let f=l.steps[t.stepIndex];o.entry==="playback-start"&&i("scene-title",Be(e,{kind:"scene",key:`scene:${l.id}`,sceneIndex:t.sceneIndex,stepIndex:0})),o.entry==="playback-start"&&l.kind==="deconstructed-diff"&&!f.body&&i("stage-title",l.panels[l.steps[t.stepIndex].pairIndex+1].label),i("step-title",Be(e,t)),i("step-orientation",on(e,t.sceneIndex,t.stepIndex)),i("step-body",f.body),"connection"in f&&i("connection",f.connection?.label),t.stepIndex===l.steps.length-1&&i("takeaway",l.takeaway)}}return{id:t.key,readingKey:t.key,segments:c.flatMap(l=>Pa(t.key,l,o.segmentLimit??ai))}}function Na(e,t=ai){if(!Number.isInteger(t)||t<40)throw new Error("Narration segment limit must be an integer of at least 40 characters.");return Fa(e).flatMap(c=>Da(e,c.startOffset,c.endOffset,t))}function Ra(e){return e.replace(/https?:\/\/\S+/giu," ").replace(/\b(?=[0-9a-f]{7,40}\b)(?=[0-9a-f]*\d)[0-9a-f]+\b/giu," ").replace(/[`*_~]/gu,"").replace(/([\p{Ll}\d])(\p{Lu})/gu,"$1 $2").replace(/([\p{Lu}])(\p{Lu}\p{Ll})/gu,"$1 $2").replace(/\s+/gu," ").trim()}function Pa(e,t,o){let c=t.source.itemIndex===void 0?t.source.field:`${t.source.field}-${t.source.itemIndex}`;return Na(t.text,o).map((i,s)=>({id:`${e}:${c}:${s}`,text:i.text,speechText:Ra(i.text),source:t.source,startOffset:i.startOffset,endOffset:i.endOffset})).filter(i=>i.speechText.length>0)}function Fa(e){let t=[],o=0;for(let c=0;c<e.length;c+=1){if(!".!?".includes(e[c]))continue;let i=c+1;for(;i<e.length&&`"'\u201D\u2019)]}`.includes(e[i]);)i+=1;i<e.length&&!/\s/u.test(e[i])||(vn(e,t,o,i),o=i)}return vn(e,t,o,e.length),t}function Da(e,t,o,c){let i=[],s=t;for(;o-s>c;){let l=s+c,f=s+Math.floor(c*.55),h=ii(e,f,l,/[;,:—–-]/u);h<=s&&(h=ii(e,f,l,/\s/u)),h<=s&&(h=l),vn(e,i,s,h),s=h}return vn(e,i,s,o),i}function ii(e,t,o,c){for(let i=o;i>=t;i-=1)if(c.test(e[i]))return i+1;return-1}function vn(e,t,o,c){let i=o,s=c;for(;i<s&&/\s/u.test(e[i]);)i+=1;for(;s>i&&/\s/u.test(e[s-1]);)s-=1;i<s&&t.push({text:e.slice(i,s),startOffset:i,endOffset:s})}function si(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}function di(e){let t=[{kind:"title",key:"title",sceneIndex:0,stepIndex:0,...e.opening?{authored:!0}:{}}],o=new Map;for(let i of e.chapters)for(let s of i.sceneIds)o.has(s)||o.set(s,i.id);let c=new Set;return e.scenes.forEach((i,s)=>{let l=o.get(i.id);e.chapters.find(h=>h.id===l)?.summary?.trim()&&l&&!c.has(l)&&(t.push({kind:"chapter",key:`chapter:${l}`,chapterId:l,sceneIndex:s,stepIndex:0}),c.add(l)),t.push({kind:"scene",key:`scene:${i.id}`,...l?{chapterId:l}:{},sceneIndex:s,stepIndex:0}),Ma(i)&&i.steps.forEach((h,m)=>{t.push({kind:"step",key:`step:${i.id}:${h.id}`,sceneIndex:s,stepIndex:m})})}),e.conclusion&&t.push({kind:"conclusion",key:"conclusion",sceneIndex:-1,stepIndex:0}),t}function Ht(e,t,o,c=!1){if(o!==-1&&o!==1)return null;let i=e.findIndex(s=>s.key===t);if(i<0)return null;for(let s=i+o;s>=0&&s<e.length;s+=o){let l=e[s];if(!c||l.kind==="step"||l.kind==="conclusion"||l.kind==="title")return l}return null}function st(e){return e.scenes.length>0&&e.scenes.every(t=>t.kind==="walkthrough"&&t.steps.length>0&&t.steps.every(o=>!!o.image))}function xn(e,t,o,c=null){if(c==="conclusion")return e.find(s=>s.kind==="conclusion")??null;if(c==="tour")return e.find(s=>s.kind==="title")??null;let i=e.findIndex(s=>s.kind==="scene"&&s.sceneIndex===t);if(i<0)return null;if(c==="overview")return e[i]??null;if(c==="chapter"){let s=e[i];return s.kind!=="scene"?null:e.find(l=>l.kind==="chapter"&&l.chapterId===s.chapterId)??s}return e.find(s=>s.kind==="step"&&s.sceneIndex===t&&s.stepIndex===o)??e[i]??null}function Ma(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}var kn=class{constructor(t,o){this.engine=t;this.callbacks=o;this.generation=0;this.continuous=!0;this.currentState={kind:"idle"}}get state(){return this.currentState}get engaged(){return this.currentState.kind==="playing"||this.currentState.kind==="paused"}start(t,o=!0){if(this.resetEngine(),this.continuous=o,t.segments.length===0){this.finishUnit(t);return}this.callbacks.claimAudio(),this.setState({kind:"playing",unit:t,segmentIndex:0}),this.speakCurrent()}togglePause(){if(this.currentState.kind==="playing"){this.engine.pause();let o={kind:"paused",unit:this.currentState.unit,segmentIndex:this.currentState.segmentIndex,pendingStart:!1};this.setState(o),this.callbacks.onSegmentChange(o.unit.segments[o.segmentIndex]||null,!0);return}if(this.currentState.kind!=="paused")return;this.callbacks.claimAudio();let t=this.currentState;this.setState({kind:"playing",unit:t.unit,segmentIndex:t.segmentIndex}),t.pendingStart?this.speakCurrent():(this.engine.resume(),this.callbacks.onSegmentChange(t.unit.segments[t.segmentIndex]||null,!1))}stop(){this.resetEngine(),this.setState({kind:"idle"}),this.callbacks.onSegmentChange(null,!1)}pauseForExternalOwner(){this.currentState.kind==="playing"&&this.togglePause()}canSkipSegment(t){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return!1;let o=this.currentState.segmentIndex+t;return o>=0&&o<this.currentState.unit.segments.length?!0:this.callbacks.canNavigateUnit(this.currentState.unit,t)}skipSegment(t){if(!this.canSkipSegment(t))return!1;let o=this.currentState,c=o.kind==="paused",i=o.unit,s=o.segmentIndex+t;if(s<0||s>=i.segments.length){let l=this.callbacks.navigateUnit(i,t);if(!l||l.segments.length===0)return!1;i=l,s=t<0?i.segments.length-1:0}return this.resetEngine(),c?(this.setState({kind:"paused",unit:i,segmentIndex:s,pendingStart:!0}),this.callbacks.onSegmentChange(i.segments[s]||null,!0)):(this.setState({kind:"playing",unit:i,segmentIndex:s}),this.speakCurrent()),!0}followLinearNavigation(t){this.currentState.kind==="playing"?this.start(t,this.continuous):this.currentState.kind==="paused"&&this.preparePaused(t)}followDirectNavigation(t){this.engaged&&this.preparePaused(t)}interruptForExploration(){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return;let t=this.currentState;this.resetEngine(),this.setState({kind:"paused",unit:t.unit,segmentIndex:t.segmentIndex,pendingStart:!0}),this.callbacks.onSegmentChange(t.unit.segments[t.segmentIndex]||null,!0)}dispose(){this.stop()}preparePaused(t){this.resetEngine(),this.setState({kind:"paused",unit:t,segmentIndex:0,pendingStart:!0}),this.callbacks.onSegmentChange(t.segments[0]||null,!0)}speakCurrent(){if(this.currentState.kind!=="playing")return;let t=this.generation,o=this.currentState.unit.segments[this.currentState.segmentIndex];if(!o){this.finishUnit(this.currentState.unit);return}this.callbacks.onSegmentChange(o,!1),this.engine.speak(o,{onEnd:()=>{if(t!==this.generation||this.currentState.kind!=="playing")return;let c=this.currentState.segmentIndex+1;c<this.currentState.unit.segments.length?(this.setState({kind:"playing",unit:this.currentState.unit,segmentIndex:c}),this.speakCurrent()):this.finishUnit(this.currentState.unit)},onError:c=>{t===this.generation&&(this.setState({kind:"error",message:c}),this.callbacks.onSegmentChange(null,!1))}})}finishUnit(t){if(this.continuous){let o=this.callbacks.navigateUnit(t,1);if(o){if(this.generation+=1,o.segments.length===0){this.finishUnit(o);return}this.setState({kind:"playing",unit:o,segmentIndex:0}),this.speakCurrent();return}}this.setState({kind:"completed"}),this.callbacks.onSegmentChange(null,!1)}resetEngine(){this.generation+=1,this.engine.cancel()}setState(t){this.currentState=t,this.callbacks.onStateChange(t)}};function li(e,t,o="all",c=300){let i=t.trim().toLocaleLowerCase();if(!i||c<=0)return[];let s=[];if(o!=="code"){for(let[f,h]of[["title",e.opening],["conclusion",e.conclusion]]){let m=h&&kr([h.title,h.summary,...h.bullets||[]],i);m&&h&&s.push({kind:"narrative",sceneIndex:f==="title"?0:-1,readingKey:f,label:h.title,preview:m})}let l=new Map;for(let f of e.chapters){let h=e.scenes.findIndex(m=>f.sceneIds.includes(m.id));h>=0&&f.summary?.toLocaleLowerCase().includes(i)&&s.push({kind:"narrative",sceneIndex:h,readingKey:`chapter:${f.id}`,label:f.title,preview:f.summary})}e.chapters.forEach(f=>f.sceneIds.forEach(h=>l.set(h,f.title))),e.scenes.forEach((f,h)=>{let m=[l.get(f.id),f.title,f.summary,"overview"in f?f.overview?.purpose:void 0,...f.bullets,...f.tags,f.takeaway],w=kr(m,i);w&&s.push({kind:"narrative",sceneIndex:h,label:f.title,preview:w}),Ba(f)&&f.steps.forEach((v,k)=>{let x=kr([v.title,v.body,"connection"in v?v.connection?.label:void 0],i);x&&s.push({kind:"narrative",sceneIndex:h,stepIndex:k,label:`${f.title} \xB7 ${v.title}`,preview:x})})})}if(o!=="narrative"&&s.length<c)for(let l=0;l<e.files.length;l+=1){let f=e.files[l];if(f.kind==="text-diff"){for(let[h,m]of[[0,f.leftContent],[1,f.rightContent]])for(let w of Oa(m,i))if(s.push({kind:"code",fileIndex:l,sideIndex:h,label:`${f.path} \xB7 ${h===0?"base":"head"}`,...w}),s.length>=c)return s}}return s.slice(0,c)}function kr(e,t){return e.find(o=>o?.toLocaleLowerCase().includes(t))}function Oa(e,t){let o=[];return e.replace(/\r\n/g,`
159
162
  `).split(`
160
- `).forEach((a,i)=>{let s=a.toLocaleLowerCase(),l=0;for(;l<=s.length-t.length;){let f=s.indexOf(t,l);if(f<0)break;o.push({lineNumber:i+1,startColumn:f+1,endColumn:f+t.length+1,preview:a}),l=f+Math.max(t.length,1)}}),o}function Ia(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}function wr(e,t){return Sa(e,0,t)}function Sa(e,t,o){let a=e?.blocks[t],i=o==="left"?e?.leftLines:e?.rightLines;if(!a||!i?.length)return;let s=o==="left"?a.leftStart:a.rightStart,l=o==="left"?a.leftEnd:a.rightEnd,f=i.slice(s,l),p=f[0]?.lineNumber??i[Math.min(s,i.length-1)]?.lineNumber;if(Number.isInteger(p))return{startLine:p,endLine:f.at(-1)?.lineNumber??p}}function ni(e,t,o,a){let i=[];return e.scenes.forEach((s,l)=>{s.kind==="walkthrough"&&s.steps.forEach((f,p)=>{f.diff.path===t&&i.push({side:f.focus.revision==="base"?"left":"right",startLine:f.focus.startLine,endLine:f.focus.endLine,label:`${s.title} \xB7 ${f.title}: ${f.body}`,active:l===o&&p===a,jumpTarget:{sceneIndex:l,stepIndex:p}})})}),i}function ri(e,t,o,a,i){let s=[];return e.scenes.forEach((l,f)=>{f!==o||l.kind!=="stacked-diff"&&l.kind!=="deconstructed-diff"||l.steps.forEach((p,m)=>{if(p.file!==t)return;let y=p.startLine===void 0?i?.(p.pairIndex,p.side):{startLine:p.startLine,endLine:p.endLine??p.startLine};if(!y)return;let b=p.pairIndex+(p.side==="right"?1:0);s.push({pairIndex:p.pairIndex,panelIndex:b,side:p.side,startLine:y.startLine,endLine:y.endLine,label:`${l.title} \xB7 ${p.title}: ${p.body}`,active:f===o&&m===a,jumpTarget:{sceneIndex:f,stepIndex:m}})})}),s}function Ca(e,t=120){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function oi(e,t="Bygone"){let o=e?.windowTitle?.trim()||e?.title?.trim();return o?Ca(o):`${t} Tour`}function Ta(){return{sceneIndex:0,stepIndex:0,path:null}}var bn=class{constructor(t){this.mode=t;this.cursors=new Map}depart(t){return this.cursors.set(this.mode,t),t}enter(t,o){this.mode=t;let a=this.cursors.get(t);return a?{location:a,restore:!0}:{location:o??Ta(),restore:!1}}};function ii(e,t){let o=new Map;for(let l of t)o.has(l)||o.set(l,o.size);let a=e?.commits,i=Array.isArray(a)?a:[e?.from,e?.to],s=[...new Set(i.filter(l=>typeof l=="string"&&o.has(l)))];if(s.length<2)throw new Error("Select at least two revisions to compare.");return s.sort((l,f)=>o.get(l)-o.get(f)),{commits:s,...typeof e?.path=="string"&&e.path?{path:e.path}:{}}}var $a=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i,Aa="bygone-tour-skill.md";function ai(e,t={},o={}){let a=e==="deconstructed"?"deconstructed":"historical",i=br(t.repository),s=si(t.paths),f=i!==void 0&&Array.isArray(t.paths)&&t.paths.length===0?["."]:s.length>0?s:null,p=si(t.revisions),m=Na(i,p,t.rangeStatus),y=t.rangeStatus||"unavailable",b=[La(o),`Create a v5 ${a} tour.`,`Repository: ${JSON.stringify(i??null)}`,`Selected paths: ${JSON.stringify(f)}`,`Base: ${JSON.stringify(m?p[0]:null)}`,`Head: ${JSON.stringify(m?p[1]:null)}`,"Additional context: (optional)"];return m||b.push(`Warning: range status ${JSON.stringify(y)} is not an exact committed range; choose revisions in Compare. Do not silently substitute a merge-base, swap endpoints, or drop revisions.`,`All revisions: ${JSON.stringify(p)}`),b.join(`
161
- `)}function Na(e,t,o){return o==="exact"&&!!e&&t.length===2&&t.every(a=>$a.test(a))}function La(e){let t=br(e.path);if(t)return`Read and follow the Bygone tour skill at ${JSON.stringify(t)}.`;let o=br(e.name)||Aa;return`Read and follow the Bygone tour skill in attached ${JSON.stringify(o)}.`}function si(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").filter(t=>t.length>0):[]}function br(e){return typeof e=="string"&&e.trim().length>0?e:void 0}var ci=`---
163
+ `).forEach((c,i)=>{let s=c.toLocaleLowerCase(),l=0;for(;l<=s.length-t.length;){let f=s.indexOf(t,l);if(f<0)break;o.push({lineNumber:i+1,startColumn:f+1,endColumn:f+t.length+1,preview:c}),l=f+Math.max(t.length,1)}}),o}function Ba(e){return e.kind==="walkthrough"||e.kind==="stacked-diff"||e.kind==="deconstructed-diff"}function Er(e,t){return Ua(e,0,t)}function Ua(e,t,o){let c=e?.blocks[t],i=o==="left"?e?.leftLines:e?.rightLines;if(!c||!i?.length)return;let s=o==="left"?c.leftStart:c.rightStart,l=o==="left"?c.leftEnd:c.rightEnd,f=i.slice(s,l),h=f[0]?.lineNumber??i[Math.min(s,i.length-1)]?.lineNumber;if(Number.isInteger(h))return{startLine:h,endLine:f.at(-1)?.lineNumber??h}}function ui(e,t,o,c){let i=[];return e.scenes.forEach((s,l)=>{s.kind==="walkthrough"&&s.steps.forEach((f,h)=>{f.diff.path===t&&i.push({side:f.focus.revision==="base"?"left":"right",startLine:f.focus.startLine,endLine:f.focus.endLine,label:`${s.title} \xB7 ${f.title}: ${f.body}`,active:l===o&&h===c,jumpTarget:{sceneIndex:l,stepIndex:h}})})}),i}function fi(e,t,o,c,i){let s=[];return e.scenes.forEach((l,f)=>{f!==o||l.kind!=="stacked-diff"&&l.kind!=="deconstructed-diff"||l.steps.forEach((h,m)=>{if(h.file!==t)return;let w=h.startLine===void 0?i?.(h.pairIndex,h.side):{startLine:h.startLine,endLine:h.endLine??h.startLine};if(!w)return;let v=h.pairIndex+(h.side==="right"?1:0);s.push({pairIndex:h.pairIndex,panelIndex:v,side:h.side,startLine:w.startLine,endLine:w.endLine,label:`${l.title} \xB7 ${h.title}: ${h.body}`,active:f===o&&m===c,jumpTarget:{sceneIndex:f,stepIndex:m}})})}),s}function za(e,t=120){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function pi(e,t="Bygone"){let o=e?.windowTitle?.trim()||e?.title?.trim();return o?za(o):`${t} Tour`}function qa(){return{sceneIndex:0,stepIndex:0,path:null}}var En=class{constructor(t){this.mode=t;this.cursors=new Map}depart(t){return this.cursors.set(this.mode,t),t}enter(t,o){this.mode=t;let c=this.cursors.get(t);return c?{location:c,restore:!0}:{location:o??qa(),restore:!1}}};function hi(e,t){let o=new Map;for(let l of t)o.has(l)||o.set(l,o.size);let c=e?.commits,i=Array.isArray(c)?c:[e?.from,e?.to],s=[...new Set(i.filter(l=>typeof l=="string"&&o.has(l)))];if(s.length<2)throw new Error("Select at least two revisions to compare.");return s.sort((l,f)=>o.get(l)-o.get(f)),{commits:s,...typeof e?.path=="string"&&e.path?{path:e.path}:{}}}var Ha=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i,_a="bygone-tour-skill.md";function gi(e,t={},o={}){let c=e==="deconstructed"?"deconstructed":"historical",i=Ir(t.repository),s=mi(t.paths),f=i!==void 0&&Array.isArray(t.paths)&&t.paths.length===0?["."]:s.length>0?s:null,h=mi(t.revisions),m=ja(i,h,t.rangeStatus),w=t.rangeStatus||"unavailable",v=[Ka(o),`Create a v5 ${c} tour.`,`Repository: ${JSON.stringify(i??null)}`,`Selected paths: ${JSON.stringify(f)}`,`Base: ${JSON.stringify(m?h[0]:null)}`,`Head: ${JSON.stringify(m?h[1]:null)}`,"Additional context: (optional)"];return m||v.push(`Warning: range status ${JSON.stringify(w)} is not an exact committed range; choose revisions in Compare. Do not silently substitute a merge-base, swap endpoints, or drop revisions.`,`All revisions: ${JSON.stringify(h)}`),v.join(`
164
+ `)}function ja(e,t,o){return o==="exact"&&!!e&&t.length===2&&t.every(c=>Ha.test(c))}function Ka(e){let t=Ir(e.path);if(t)return`Read and follow the Bygone tour skill at ${JSON.stringify(t)}.`;let o=Ir(e.name)||_a;return`Read and follow the Bygone tour skill in attached ${JSON.stringify(o)}.`}function mi(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").filter(t=>t.length>0):[]}function Ir(e){return typeof e=="string"&&e.trim().length>0?e:void 0}var yi=`---
162
165
  name: pr-tour-guide
163
166
  description: Create, repair, validate, and present Bygone code-change tours grounded in Git evidence. Use for requested guided walkthroughs of commits, branches, or pull requests, .bygone tour documents, and Bygone tour context extraction. General review preparation or documentation work does not require a tour.
164
167
  ---
@@ -587,7 +590,7 @@ or pushed. Do not turn the handoff into an inventory of every scene and step.
587
590
 
588
591
  Bygone establishes that cited evidence exists at the pinned revision, not that
589
592
  the narrative interpretation or implementation is correct.
590
- `;var di=`# Expectations and reader feedback
593
+ `;var bi=`# Expectations and reader feedback
591
594
 
592
595
  Read this reference for optional audience fields or when a reader supplies a
593
596
  captured Bygone concern. General writing and review workflows can use this
@@ -644,9 +647,9 @@ Independent modes describe their own readers. These fields set expectations;
644
647
  they are not quality grades. Language expertise, codebase familiarity, and prose
645
648
  reading demand are distinct. Do not invent an audience or reading-time estimate
646
649
  merely to populate Tour details.
647
- `;var hi=ci.replace("(references/expectations-and-feedback.md)","(#expectations-and-reader-feedback)")+`
650
+ `;var ki=yi.replace("(references/expectations-and-feedback.md)","(#expectations-and-reader-feedback)")+`
648
651
 
649
- `+di,xn=["history","compare","historical","deconstructed"],vn={history:"History",compare:"Compare",historical:"Historical tour",deconstructed:"Deconstructed tour"},Fa={historical:"No Historical tour is available. Copy a prompt for your coding agent and read or customize its Markdown instructions.",deconstructed:"No Deconstructed tour is available. Copy a prompt for your coding agent and read or customize its Markdown instructions."},Da=new Set(["exact","none","multiple","uncommitted","reversed","divergent","unavailable"]),Ma=0;function pi({container:e,content:t,send:o}={}){if(!e||typeof e.appendChild!="function")throw new TypeError("createWorkspaceControls requires a DOM container.");let a=e.ownerDocument||globalThis.document;if(!a||typeof a.createElement!="function")throw new TypeError("createWorkspaceControls requires a browser document.");let i=typeof o=="function"?o:()=>{},s=++Ma,l=a.createElement("section");l.className="workspace-controls",l.setAttribute("data-workspace-controls","true");let f=a.createElement("nav");f.className="workspace-mode-strip",f.setAttribute("role","tablist"),f.setAttribute("aria-label","Workspace views"),l.appendChild(f);let p=a.createElement("div");p.className="workspace-mode-descriptions",p.setAttribute("aria-hidden","true"),l.appendChild(p);let m=new Map,y=new Map;for(let R of xn){let U=a.createElement("button");U.type="button",U.className="workspace-mode-button",U.id=`bygone-workspace-${s}-${R}-tab`,U.setAttribute("role","tab"),U.setAttribute("data-workspace-mode",R),U.textContent=vn[R];let K=a.createElement("span");K.className="workspace-mode-description visually-hidden";let re=`bygone-workspace-${s}-${R}-description`;K.id=re,p.appendChild(K),U.setAttribute("aria-describedby",re),m.set(R,U),y.set(R,K),f.appendChild(U)}let b=a.createElement("div");b.className="workspace-status",b.setAttribute("role","status"),b.setAttribute("aria-live","polite"),b.setAttribute("aria-atomic","true"),l.appendChild(b);let E=a.createElement("span");E.className="workspace-revision-context",l.appendChild(E);let I=t||e;I.id||(I.id=`bygone-workspace-${s}-view`),I.setAttribute("role","tabpanel");let T=a.createElement("section");T.className="workspace-empty-view",T.setAttribute("data-workspace-empty-tour",""),T.hidden=!0;let v=a.createElement("h2"),x=a.createElement("p"),N=a.createElement("div");N.className="workspace-empty-actions";let B=Oe(a,"Create tour\u2026","create-tour"),M=Oe(a,"Open existing tour\u2026","open-tour");N.append(B,M),T.append(v,x,N),I.appendChild(T);let n=Oa(a,s);l.appendChild(n.dialog),e.appendChild(l);let F=li(),V=!1,O=null,j=null,J=!1,oe="",Q=new Map,ie=new Map;for(let[R,U]of m)U.addEventListener("click",()=>{V||U.disabled||R!==F.mode&&i({type:"workspaceMode",mode:R})}),U.addEventListener("keydown",K=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(K.key))return;let le=[...m.values()].filter(Ge=>!Ge.disabled),Ue=le.indexOf(U),ze=K.key==="Home"?0:K.key==="End"?le.length-1:(Ue+(K.key==="ArrowRight"?1:-1)+le.length)%le.length;K.preventDefault(),le[ze]?.focus(),le[ze]?.click()});return B.addEventListener("click",()=>kn(F.mode,B)),M.addEventListener("click",()=>i({type:"workspaceOpenTour",kind:F.mode})),n.textarea.addEventListener("input",()=>{if(!O)return;let R=Le(O);R.text=n.textarea.value,R.edited=!0}),n.copyButton.addEventListener("click",()=>{if(!O)return;let R=ee(O);Ne(R.text)}),n.resetButton.addEventListener("click",()=>{if(!O)return;let R=Le(O,{reset:!0});n.textarea.value=R.text,Ae(),n.textarea.focus()}),n.saveSkillButton.addEventListener("click",()=>{if(F.nativeSkillFiles){i({type:"workspaceSkillSave"});return}let R=rt(),U=URL.createObjectURL(new Blob([R.text],{type:"text/markdown;charset=utf-8"})),K=a.createElement("a");K.href=U,K.download=R.name||"bygone-tour-skill.md",K.click(),setTimeout(()=>URL.revokeObjectURL(U),1e3),Be("Markdown downloaded. Edit your copy, then choose Use my copy. Attach it alongside the prompt when your agent cannot read local files.")}),n.chooseSkillButton.addEventListener("click",()=>{F.nativeSkillFiles?i({type:"workspaceSkillChoose"}):n.skillFile.click()}),n.skillFile.addEventListener("change",async()=>{let R=n.skillFile.files?.[0],U=F.sessionId;if(n.skillFile.value="",!!R)try{if(!R.name.toLowerCase().endsWith(".md")||R.size>1024*1024)throw new Error("Choose a Markdown file smaller than 1 MiB.");let K=await R.text();if(!K.trim())throw new Error("The instructions file is empty.");if(ie.set(U,{name:R.name,text:K}),V||F.sessionId!==U)return;Ae(),Be("Custom instructions selected. Attach this Markdown file with the prompt.")}catch(K){!V&&F.sessionId===U&&Be(`Could not load instructions: ${K.message}`)}}),n.openExistingButton.addEventListener("click",()=>{if(!O)return;ee(O);let R=O;be(),i({type:"workspaceOpenTour",kind:R})}),n.chooseCompareButton.addEventListener("click",()=>{O&&(ee(O),be(),i({type:"workspaceMode",mode:"compare"}))}),n.closeButton.addEventListener("click",()=>be()),n.dialog.addEventListener("cancel",R=>{R.preventDefault(),be()}),n.dialog.addEventListener("close",()=>{O=null,oe="",J||se()}),de(),{update:de,destroy:wt};function de(R){if(V)return;let U=li(R);U.sessionId!==F.sessionId&&he()&&be(),Ht(U),O&&U.status!==F.status&&(oe=U.status),F=U,X(),zt(),ne(),O&&Ae()}function wt(){V||(V=!0,be(),typeof l.remove=="function"?l.remove():l.parentNode?.removeChild(l),m.clear(),y.clear(),T.remove(),Q.clear(),ie.clear())}function X(){for(let R of xn){let U=m.get(R),K=y.get(R),re=ui(R,F),le=F.mode===R,Ue=(R==="historical"||R==="deconstructed")&&!re,ze=Ue&&!F.canCreateTours,Ge=R==="history"&&F.history.enabled===!1,ve=R==="compare"&&F.compare.enabled===!1,Ve=R==="history"?F.history.label:R==="compare"?F.compare.label:F.modeLabels[R]||vn[R],vt=ze?F.unavailableTourReason:Ue?`No ${Ve} yet. Open this view to create or open a tour.`:Ge?F.history.reason||"History is unavailable for this workspace.":ve?F.compare.reason||"Compare is unavailable for this workspace.":le?`${Ve} is the current workspace mode.`:`Switch to ${Ve}.`;U.textContent=Ve,U.title=vt,U.setAttribute("aria-label",Ve),U.setAttribute("aria-description",vt),K.textContent=vt,U.classList.toggle("is-active",le),U.classList.toggle("is-missing",Ue),U.classList.toggle("is-unavailable",Ge||ve||ze),U.disabled=Ge||ve||ze,U.setAttribute("aria-selected",String(le)),U.setAttribute("aria-controls",I.id),le&&I.setAttribute("aria-labelledby",U.id)}}function zt(){let R=F.mode,U=["historical","deconstructed"].includes(R)&&!ui(R,F);if(T.hidden=!U,B.hidden=!F.canCreateTours,M.hidden=!F.canOpenTours,U){let K=F.modeLabels[R]||vn[R];v.textContent=`No ${K} yet`,x.textContent="Create a tour with your coding agent, or open one you already have."}}function ne(){b.textContent=F.status||"",b.hidden=!F.status,E.textContent=F.revisionContext,E.hidden=!F.revisionContext}function kn(R,U){if(!(V||R!=="historical"&&R!=="deconstructed")){if(O=R,j=U,oe=F.status||"",Ae(),typeof n.dialog.showModal=="function")try{n.dialog.showModal()}catch{n.dialog.setAttribute("open","")}else n.dialog.setAttribute("open","");n.textarea.focus()}}function be(){if(!he()){O=null,se();return}J=!0;try{typeof n.dialog.close=="function"?n.dialog.close():n.dialog.removeAttribute("open"),O=null,oe=""}finally{J=!1,se()}}function se(){let R=j;if(j=null,!(!R||typeof R.focus!="function")&&R.isConnected!==!1)try{R.focus()}catch{}}function he(){return n.dialog.open===!0||n.dialog.hasAttribute("open")}function Ae(){if(!O)return;let R=Le(O),U=rt();n.title.textContent=`${vn[O]} prompt`,n.description.textContent=Fa[O],n.context.textContent=`Current context: ${fi(F.promptContext)}`,R.skillKey!==bt()?(n.draftNotice.hidden=!1,n.draftNotice.textContent="The selected instructions changed. Your edited prompt was preserved; use Reset prompt to reference the selected file, or update its reference yourself."):R.contextKey!==vr(F.promptContext)?(n.draftNotice.hidden=!1,n.draftNotice.textContent=`This draft is based on earlier workspace context: ${R.contextSummary}. Review the repository, revision boundaries, and selected paths before copying.`):(n.draftNotice.hidden=!0,n.draftNotice.textContent=""),n.textarea.value=R.text,n.skillText.value=U.text,n.skillReference.textContent=U.path?`Instructions: ${U.path}. Local agents can read this path; for browser chats, save and attach a copy.`:`Instructions: ${U.name||"bygone-tour-skill.md"} (attachment). Download and attach it with the prompt; browsers do not expose its full local path.`,n.status.textContent=oe,n.status.hidden=!oe}function Ne(R){let U=a.defaultView?.navigator?.clipboard||globalThis.navigator?.clipboard;if(!U||typeof U.writeText!="function"){Be("Could not copy the prompt: clipboard access is unavailable.");return}Promise.resolve().then(()=>U.writeText(R)).then(()=>Be("Prompt copied to the clipboard.")).catch(K=>{let re=K instanceof Error&&K.message?` ${K.message}`:"";Be(`Could not copy the prompt.${re}`)})}function Be(R){oe=R,n.status.textContent=R,n.status.hidden=!R}function ee(R){let U=Le(R);return U.text=n.textarea.value,U.edited=!0,U}function Le(R,{reset:U=!1}={}){let K=Q.get(F.sessionId)||new Map;Q.set(F.sessionId,K);let re=K.get(R);return(U||!re||!re.edited&&re.skillKey!==bt())&&K.set(R,{text:ai(R,F.promptContext,rt()),skillKey:bt(),contextKey:vr(F.promptContext),contextSummary:fi(F.promptContext),edited:!1}),K.get(R)}function rt(){return F.tourSkill||ie.get(F.sessionId)||{name:"bygone-tour-skill.md",text:hi}}function bt(){let R=rt();return JSON.stringify([R.path||"",R.name||"",R.text])}function Ht(R){let U=Q.get(R.sessionId);if(U)for(let K of U.values())K.contextChanged=K.contextKey!==vr(R.promptContext)}}function Oa(e,t){let o=e.createElement("dialog");o.className="workspace-prompt-dialog",o.setAttribute("aria-modal","true");let a=e.createElement("h2");a.id=`bygone-workspace-${t}-prompt-title`,o.setAttribute("aria-labelledby",a.id),o.appendChild(a);let i=e.createElement("p");i.className="workspace-prompt-description",i.id=`bygone-workspace-${t}-prompt-description`,o.setAttribute("aria-describedby",i.id),o.appendChild(i);let s=e.createElement("p");s.className="workspace-prompt-context",o.appendChild(s);let l=e.createElement("p");l.className="workspace-prompt-draft-notice",l.setAttribute("role","status"),l.hidden=!0,o.appendChild(l);let f=e.createElement("label");f.className="workspace-prompt-label";let p=e.createElement("textarea");p.id=`bygone-workspace-${t}-prompt-textarea`,p.rows=9,p.spellcheck=!1,p.setAttribute("aria-label","Tour authoring prompt draft"),f.textContent="Prompt draft",f.appendChild(p),o.appendChild(f);let m=e.createElement("p");m.className="workspace-prompt-context",o.appendChild(m);let y=e.createElement("details"),b=e.createElement("summary");b.textContent="Read instructions (Markdown)";let E=e.createElement("textarea");E.readOnly=!0,E.rows=12,E.setAttribute("aria-label","Tour skill Markdown instructions"),y.append(b,E),o.appendChild(y);let I=e.createElement("div");I.className="workspace-prompt-actions";let T=Oe(e,"Save an editable copy","workspace-skill-save"),v=Oe(e,"Use my copy","workspace-skill-choose"),x=e.createElement("input");x.type="file",x.accept=".md,text/markdown",x.hidden=!0,I.append(T,v,x),o.appendChild(I);let N=e.createElement("p");N.className="workspace-prompt-status",N.setAttribute("role","status"),N.setAttribute("aria-live","polite"),N.setAttribute("aria-atomic","true"),N.hidden=!0,o.appendChild(N);let B=e.createElement("div");B.className="workspace-prompt-actions";let M=Oe(e,"Copy prompt","workspace-prompt-copy"),n=Oe(e,"Reset prompt","workspace-prompt-reset"),F=Oe(e,"Open existing tour","workspace-prompt-open"),V=Oe(e,"Choose revisions in Compare","workspace-prompt-compare"),O=Oe(e,"Close","workspace-prompt-close");return B.append(M,n,F,V,O),o.appendChild(B),{dialog:o,title:a,description:i,context:s,draftNotice:l,textarea:p,skillText:E,skillReference:m,saveSkillButton:T,chooseSkillButton:v,skillFile:x,status:N,copyButton:M,resetButton:n,openExistingButton:F,chooseCompareButton:V,closeButton:O}}function Oe(e,t,o){let a=e.createElement("button");return a.type="button",a.textContent=t,a.title=t,a.setAttribute("data-workspace-prompt-action",o),a}function li(e={}){let t=xn.includes(e?.mode)?e.mode:"compare",o=e?.history&&typeof e.history=="object"?{enabled:e.history.enabled!==!1,label:nt(e.history.label,"History"),reason:nt(e.history.reason,"")}:{enabled:!0,label:"History",reason:""},a=e?.compare&&typeof e.compare=="object"?{enabled:e.compare.enabled!==!1,label:nt(e.compare.label,"Compare"),reason:nt(e.compare.reason,"")}:{enabled:!0,label:"Compare",reason:""},i=Array.isArray(e?.availableTours)?e.availableTours.filter(s=>s==="historical"||s==="deconstructed"):null;return{sessionId:Ua(e?.sessionId),mode:t,modeLabels:e?.modeLabels&&typeof e.modeLabels=="object"?Object.fromEntries(xn.filter(s=>typeof e.modeLabels[s]=="string").map(s=>[s,e.modeLabels[s]])):{},history:o,compare:a,availableTours:i,canCreateTours:e?.canCreateTours!==!1,canOpenTours:e?.canOpenTours!==!1,unavailableTourReason:nt(e?.unavailableTourReason,"This tour is unavailable in this workspace."),revisionContext:nt(e?.revisionContext,""),nativeSkillFiles:e?.nativeSkillFiles===!0,tourSkill:e?.tourSkill&&typeof e.tourSkill.path=="string"?{path:e.tourSkill.path,text:typeof e.tourSkill.text=="string"?e.tourSkill.text:hi}:null,promptContext:Ba(e?.promptContext),status:nt(e?.status,"")}}function Ba(e){let t=e&&typeof e=="object"?e:{};return{...typeof t.repository=="string"?{repository:t.repository}:{},...Array.isArray(t.paths)?{paths:t.paths.filter(o=>typeof o=="string")}:{},...Array.isArray(t.revisions)?{revisions:t.revisions.filter(o=>typeof o=="string")}:{},...Da.has(t.rangeStatus)?{rangeStatus:t.rangeStatus}:{},...typeof t.reason=="string"?{reason:t.reason}:{}}}function ui(e,t){return e==="history"?t.history.enabled!==!1:e==="compare"?t.compare.enabled!==!1:t.availableTours?t.availableTours.includes(e):t.mode===e}function vr(e){return JSON.stringify({repository:e.repository||"",paths:Array.isArray(e.paths)?e.paths:[],revisions:Array.isArray(e.revisions)?e.revisions:[],rangeStatus:e.rangeStatus||"",reason:e.reason||""})}function fi(e){let t=e.repository||"(not resolved)",o=Array.isArray(e.paths)&&e.paths.length>0?e.paths.join(", "):e.repository&&Array.isArray(e.paths)?". (repository root; full requested scope)":"(scope not supplied)",a=Array.isArray(e.revisions)&&e.revisions.length>0?e.revisions.join(", "):"(none reported)";return`repository ${t}; paths ${o}; revisions ${a}; range ${e.rangeStatus||"unavailable"}`}function Ua(e){return typeof e=="string"||typeof e=="number"?String(e):"default"}function nt(e,t){return typeof e=="string"?e:t}function mi(e,t){let o={folders:new Map,files:[]};e.forEach((i,s)=>{let l=t(i).split("/"),f=l.pop(),p=o,m="";for(let y of l)m=m?`${m}/${y}`:y,p.folders.has(y)||p.folders.set(y,{name:y,path:m,folders:new Map,files:[]}),p=p.folders.get(y);p.files.push({item:i,index:s,name:f})});let a=i=>{i.folders=[...i.folders.values()].sort((s,l)=>s.name.localeCompare(l.name)),i.files.sort((s,l)=>s.name.localeCompare(l.name)),i.folders.forEach(a)};return a(o),o}function kr(e,t,o=[]){let a=[],i=/\[([^\]\n]+)\]\(((?:https?:\/\/|bygone:\/\/)(?:[^\s()]|\([^\s()]*\))+)\)/gu,s=0;for(let l of t.matchAll(i)){if(l.index>0&&t[l.index-1]==="!")continue;let f;try{f=new URL(l[2])}catch{continue}if(f.protocol==="bygone:")try{Gn(f.href)}catch{continue}else if(f.protocol!=="https:"&&f.protocol!=="http:")continue;a.push(...xr(e,t,s,l.index,o));let p=e.createElement("a");p.href=f.href,p.target="_blank",p.rel="noopener noreferrer";let m=l.index+1;p.replaceChildren(...xr(e,t,m,m+l[1].length,o)),a.push(p),s=l.index+l[0].length}return a.push(...xr(e,t,s,t.length,o)),a}function xr(e,t,o,a,i){let s=[],l=o;for(let f of i){let p=Math.max(o,f.startOffset),m=Math.min(a,f.endOffset);if(p>=m)continue;p>l&&s.push(e.createTextNode(t.slice(l,p)));let y=e.createElement("span");y.className="tour-narration-segment",y.dataset.narrationSegmentId=f.id,y.textContent=t.slice(p,m),s.push(y),l=m}return l<a&&s.push(e.createTextNode(t.slice(l,a))),s}function yt(e,t){let o=document.createElement(e);return o.textContent=t,o}function gi(e,t){e.replaceChildren();let o=t?.details?.audience;if(e.hidden=!o,!o)return;e.append(yt("h2","Audience")),e.append(yt("p",`${o.purpose[0].toUpperCase()+o.purpose.slice(1)}${o.estimatedMinutes?` \xB7 about ${o.estimatedMinutes} min`:""}`)),e.append(yt("p",o.scope));let a=document.createElement("details");a.append(yt("summary","Assumed familiarity"));let i=document.createElement("dl");for(let[s,l]of[["Codebase",{none:"New to this codebase",some:"Some familiarity",maintainer:"Maintainer"}[o.codebase]],["Language",{none:"No prior knowledge",basic:"Basic",fluent:"Fluent",advanced:"Advanced"}[o.language]],["Reading demand",o.readingDemand],["Prerequisites",o.domain?.join("; ")||"None specified"]])i.append(yt("dt",s),yt("dd",l));a.append(i),e.append(a)}function yi(e,t,o){let a=t.kind==="scene"||t.kind==="step"?e.scenes[t.sceneIndex]:void 0,i=t.kind==="step"&&a&&"steps"in a?a.steps[t.stepIndex]:void 0,s=t.kind==="chapter"?e.chapters.find(y=>y.id===t.chapterId):a?e.chapters.find(y=>y.sceneIds.includes(a.id)):void 0,l=t.kind==="title"?e.opening:t.kind==="conclusion"?e.conclusion:t.kind==="chapter"?s:i??a,f=a?.kind==="deconstructed-diff"&&i&&"pairIndex"in i&&!i.body?a.steps.find(y=>y.pairIndex===i.pairIndex&&y.body):void 0,p=fe(e,t,o.mode),m={title:e.title,sourceUrl:e.sourceUrl,mode:o.mode,location:o.location,range:e.range,audience:e.details?.audience,opening:e.opening,section:{kind:t.kind,chapter:s?.id,scene:a?.id,step:i?.id},passage:l&&Object.fromEntries(Object.entries(l).filter(([y])=>["title","summary","body","bullets","takeaway","requirement","overview"].includes(y))),sceneContext:i&&a?{title:a.title,summary:a.summary,takeaway:a.takeaway,overview:"overview"in a?a.overview:void 0}:void 0,sceneRange:a?.kind==="deconstructed-diff"?a.realRange:void 0,stageExplanation:f&&{id:f.id,title:f.title,body:f.body},authoredEvidence:p,displayedEvidence:o.displayedEvidence===void 0?fe(e,t,o.mode,o.activePairIndex):o.displayedEvidence,focus:i&&("focus"in i?i.focus:{path:i.file,pairIndex:i.pairIndex,side:i.side,startLine:i.startLine,endLine:i.endLine}),connection:i&&"connection"in i?i.connection:void 0,image:i&&"image"in i&&i.image?{path:i.image.path,revision:i.image.revision,alt:i.image.alt,displayed:o.imageVisible}:void 0};return JSON.stringify(m,null,2)}function wi(e,t,o){return`${e==="explain"?"Help me understand this tour passage.":"Help me evaluate this change."}
652
+ `+bi,Sn=["history","compare","historical","deconstructed"],In={history:"History",compare:"Compare",historical:"Historical tour",deconstructed:"Deconstructed tour"},Va={historical:"No Historical tour is available. Copy a prompt for your coding agent and read or customize its Markdown instructions.",deconstructed:"No Deconstructed tour is available. Copy a prompt for your coding agent and read or customize its Markdown instructions."},Ja=new Set(["exact","none","multiple","uncommitted","reversed","divergent","unavailable"]),Ya=0;function Ei({container:e,content:t,send:o}={}){if(!e||typeof e.appendChild!="function")throw new TypeError("createWorkspaceControls requires a DOM container.");let c=e.ownerDocument||globalThis.document;if(!c||typeof c.createElement!="function")throw new TypeError("createWorkspaceControls requires a browser document.");let i=typeof o=="function"?o:()=>{},s=++Ya,l=c.createElement("section");l.className="workspace-controls",l.setAttribute("data-workspace-controls","true");let f=c.createElement("nav");f.className="workspace-mode-strip",f.setAttribute("role","tablist"),f.setAttribute("aria-label","Workspace views"),l.appendChild(f);let h=c.createElement("div");h.className="workspace-mode-descriptions",h.setAttribute("aria-hidden","true"),l.appendChild(h);let m=new Map,w=new Map;for(let B of Sn){let j=c.createElement("button");j.type="button",j.className="workspace-mode-button",j.id=`bygone-workspace-${s}-${B}-tab`,j.setAttribute("role","tab"),j.setAttribute("data-workspace-mode",B),j.textContent=In[B];let G=c.createElement("span");G.className="workspace-mode-description visually-hidden";let de=`bygone-workspace-${s}-${B}-description`;G.id=de,h.appendChild(G),j.setAttribute("aria-describedby",de),m.set(B,j),w.set(B,G),f.appendChild(j)}let v=c.createElement("div");v.className="workspace-status",v.setAttribute("role","status"),v.setAttribute("aria-live","polite"),v.setAttribute("aria-atomic","true"),l.appendChild(v);let k=c.createElement("span");k.className="workspace-revision-context",l.appendChild(k);let x=t||e;x.id||(x.id=`bygone-workspace-${s}-view`),x.setAttribute("role","tabpanel");let C=c.createElement("section");C.className="workspace-empty-view",C.setAttribute("data-workspace-empty-tour",""),C.hidden=!0;let S=c.createElement("h2"),I=c.createElement("p"),$=c.createElement("div");$.className="workspace-empty-actions";let D=qe(c,"Create tour\u2026","create-tour"),A=qe(c,"Open existing tour\u2026","open-tour");$.append(D,A),C.append(S,I,$),x.appendChild(C);let n=Xa(c,s);l.appendChild(n.dialog),e.appendChild(l);let N=wi(),V=!1,O=null,_=null,J=!1,te="",X=new Map,ne=new Map;for(let[B,j]of m)j.addEventListener("click",()=>{V||j.disabled||B!==N.mode&&i({type:"workspaceMode",mode:B})}),j.addEventListener("keydown",G=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(G.key))return;let ae=[...m.values()].filter(Ze=>!Ze.disabled),je=ae.indexOf(j),De=G.key==="Home"?0:G.key==="End"?ae.length-1:(je+(G.key==="ArrowRight"?1:-1)+ae.length)%ae.length;G.preventDefault(),ae[De]?.focus(),ae[De]?.click()});return D.addEventListener("click",()=>Cn(N.mode,D)),A.addEventListener("click",()=>i({type:"workspaceOpenTour",kind:N.mode})),n.textarea.addEventListener("input",()=>{if(!O)return;let B=Xe(O);B.text=n.textarea.value,B.edited=!0}),n.copyButton.addEventListener("click",()=>{if(!O)return;let B=oe(O);Ee(B.text)}),n.resetButton.addEventListener("click",()=>{if(!O)return;let B=Xe(O,{reset:!0});n.textarea.value=B.text,Pe(),n.textarea.focus()}),n.saveSkillButton.addEventListener("click",()=>{if(N.nativeSkillFiles){i({type:"workspaceSkillSave"});return}let B=Fe(),j=URL.createObjectURL(new Blob([B.text],{type:"text/markdown;charset=utf-8"})),G=c.createElement("a");G.href=j,G.download=B.name||"bygone-tour-skill.md",G.click(),setTimeout(()=>URL.revokeObjectURL(j),1e3),_e("Markdown downloaded. Edit your copy, then choose Use my copy. Attach it alongside the prompt when your agent cannot read local files.")}),n.chooseSkillButton.addEventListener("click",()=>{N.nativeSkillFiles?i({type:"workspaceSkillChoose"}):n.skillFile.click()}),n.skillFile.addEventListener("change",async()=>{let B=n.skillFile.files?.[0],j=N.sessionId;if(n.skillFile.value="",!!B)try{if(!B.name.toLowerCase().endsWith(".md")||B.size>1024*1024)throw new Error("Choose a Markdown file smaller than 1 MiB.");let G=await B.text();if(!G.trim())throw new Error("The instructions file is empty.");if(ne.set(j,{name:B.name,text:G}),V||N.sessionId!==j)return;Pe(),_e("Custom instructions selected. Attach this Markdown file with the prompt.")}catch(G){!V&&N.sessionId===j&&_e(`Could not load instructions: ${G.message}`)}}),n.openExistingButton.addEventListener("click",()=>{if(!O)return;oe(O);let B=O;Te(),i({type:"workspaceOpenTour",kind:B})}),n.chooseCompareButton.addEventListener("click",()=>{O&&(oe(O),Te(),i({type:"workspaceMode",mode:"compare"}))}),n.closeButton.addEventListener("click",()=>Te()),n.dialog.addEventListener("cancel",B=>{B.preventDefault(),Te()}),n.dialog.addEventListener("close",()=>{O=null,te="",J||le()}),ce(),{update:ce,destroy:He};function ce(B){if(V)return;let j=wi(B);j.sessionId!==N.sessionId&&ge()&&Te(),Tn(j),O&&j.status!==N.status&&(te=j.status),N=j,Q(),_t(),se(),O&&Pe()}function He(){V||(V=!0,Te(),typeof l.remove=="function"?l.remove():l.parentNode?.removeChild(l),m.clear(),w.clear(),C.remove(),X.clear(),ne.clear())}function Q(){for(let B of Sn){let j=m.get(B),G=w.get(B),de=vi(B,N),ae=N.mode===B,je=(B==="historical"||B==="deconstructed")&&!de,De=je&&!N.canCreateTours,Ze=B==="history"&&N.history.enabled===!1,It=B==="compare"&&N.compare.enabled===!1,be=B==="history"?N.history.label:B==="compare"?N.compare.label:N.modeLabels[B]||In[B],St=De?N.unavailableTourReason:je?`No ${be} yet. Open this view to create or open a tour.`:Ze?N.history.reason||"History is unavailable for this workspace.":It?N.compare.reason||"Compare is unavailable for this workspace.":ae?`${be} is the current workspace mode.`:`Switch to ${be}.`;j.textContent=be,j.title=St,j.setAttribute("aria-label",be),j.setAttribute("aria-description",St),G.textContent=St,j.classList.toggle("is-active",ae),j.classList.toggle("is-missing",je),j.classList.toggle("is-unavailable",Ze||It||De),j.disabled=Ze||It||De,j.setAttribute("aria-selected",String(ae)),j.setAttribute("aria-controls",x.id),ae&&x.setAttribute("aria-labelledby",j.id)}}function _t(){let B=N.mode,j=["historical","deconstructed"].includes(B)&&!vi(B,N);if(C.hidden=!j,D.hidden=!N.canCreateTours,A.hidden=!N.canOpenTours,j){let G=N.modeLabels[B]||In[B];S.textContent=`No ${G} yet`,I.textContent="Create a tour with your coding agent, or open one you already have."}}function se(){v.textContent=N.status||"",v.hidden=!N.status,k.textContent=N.revisionContext,k.hidden=!N.revisionContext}function Cn(B,j){if(!(V||B!=="historical"&&B!=="deconstructed")){if(O=B,_=j,te=N.status||"",Pe(),typeof n.dialog.showModal=="function")try{n.dialog.showModal()}catch{n.dialog.setAttribute("open","")}else n.dialog.setAttribute("open","");n.textarea.focus()}}function Te(){if(!ge()){O=null,le();return}J=!0;try{typeof n.dialog.close=="function"?n.dialog.close():n.dialog.removeAttribute("open"),O=null,te=""}finally{J=!1,le()}}function le(){let B=_;if(_=null,!(!B||typeof B.focus!="function")&&B.isConnected!==!1)try{B.focus()}catch{}}function ge(){return n.dialog.open===!0||n.dialog.hasAttribute("open")}function Pe(){if(!O)return;let B=Xe(O),j=Fe();n.title.textContent=`${In[O]} prompt`,n.description.textContent=Va[O],n.context.textContent=`Current context: ${xi(N.promptContext)}`,B.skillKey!==Et()?(n.draftNotice.hidden=!1,n.draftNotice.textContent="The selected instructions changed. Your edited prompt was preserved; use Reset prompt to reference the selected file, or update its reference yourself."):B.contextKey!==Sr(N.promptContext)?(n.draftNotice.hidden=!1,n.draftNotice.textContent=`This draft is based on earlier workspace context: ${B.contextSummary}. Review the repository, revision boundaries, and selected paths before copying.`):(n.draftNotice.hidden=!0,n.draftNotice.textContent=""),n.textarea.value=B.text,n.skillText.value=j.text,n.skillReference.textContent=j.path?`Instructions: ${j.path}. Local agents can read this path; for browser chats, save and attach a copy.`:`Instructions: ${j.name||"bygone-tour-skill.md"} (attachment). Download and attach it with the prompt; browsers do not expose its full local path.`,n.status.textContent=te,n.status.hidden=!te}function Ee(B){let j=c.defaultView?.navigator?.clipboard||globalThis.navigator?.clipboard;if(!j||typeof j.writeText!="function"){_e("Could not copy the prompt: clipboard access is unavailable.");return}Promise.resolve().then(()=>j.writeText(B)).then(()=>_e("Prompt copied to the clipboard.")).catch(G=>{let de=G instanceof Error&&G.message?` ${G.message}`:"";_e(`Could not copy the prompt.${de}`)})}function _e(B){te=B,n.status.textContent=B,n.status.hidden=!B}function oe(B){let j=Xe(B);return j.text=n.textarea.value,j.edited=!0,j}function Xe(B,{reset:j=!1}={}){let G=X.get(N.sessionId)||new Map;X.set(N.sessionId,G);let de=G.get(B);return(j||!de||!de.edited&&de.skillKey!==Et())&&G.set(B,{text:gi(B,N.promptContext,Fe()),skillKey:Et(),contextKey:Sr(N.promptContext),contextSummary:xi(N.promptContext),edited:!1}),G.get(B)}function Fe(){return N.tourSkill||ne.get(N.sessionId)||{name:"bygone-tour-skill.md",text:ki}}function Et(){let B=Fe();return JSON.stringify([B.path||"",B.name||"",B.text])}function Tn(B){let j=X.get(B.sessionId);if(j)for(let G of j.values())G.contextChanged=G.contextKey!==Sr(B.promptContext)}}function Xa(e,t){let o=e.createElement("dialog");o.className="workspace-prompt-dialog",o.setAttribute("aria-modal","true");let c=e.createElement("h2");c.id=`bygone-workspace-${t}-prompt-title`,o.setAttribute("aria-labelledby",c.id),o.appendChild(c);let i=e.createElement("p");i.className="workspace-prompt-description",i.id=`bygone-workspace-${t}-prompt-description`,o.setAttribute("aria-describedby",i.id),o.appendChild(i);let s=e.createElement("p");s.className="workspace-prompt-context",o.appendChild(s);let l=e.createElement("p");l.className="workspace-prompt-draft-notice",l.setAttribute("role","status"),l.hidden=!0,o.appendChild(l);let f=e.createElement("label");f.className="workspace-prompt-label";let h=e.createElement("textarea");h.id=`bygone-workspace-${t}-prompt-textarea`,h.rows=9,h.spellcheck=!1,h.setAttribute("aria-label","Tour authoring prompt draft"),f.textContent="Prompt draft",f.appendChild(h),o.appendChild(f);let m=e.createElement("p");m.className="workspace-prompt-context",o.appendChild(m);let w=e.createElement("details"),v=e.createElement("summary");v.textContent="Read instructions (Markdown)";let k=e.createElement("textarea");k.readOnly=!0,k.rows=12,k.setAttribute("aria-label","Tour skill Markdown instructions"),w.append(v,k),o.appendChild(w);let x=e.createElement("div");x.className="workspace-prompt-actions";let C=qe(e,"Save an editable copy","workspace-skill-save"),S=qe(e,"Use my copy","workspace-skill-choose"),I=e.createElement("input");I.type="file",I.accept=".md,text/markdown",I.hidden=!0,x.append(C,S,I),o.appendChild(x);let $=e.createElement("p");$.className="workspace-prompt-status",$.setAttribute("role","status"),$.setAttribute("aria-live","polite"),$.setAttribute("aria-atomic","true"),$.hidden=!0,o.appendChild($);let D=e.createElement("div");D.className="workspace-prompt-actions";let A=qe(e,"Copy prompt","workspace-prompt-copy"),n=qe(e,"Reset prompt","workspace-prompt-reset"),N=qe(e,"Open existing tour","workspace-prompt-open"),V=qe(e,"Choose revisions in Compare","workspace-prompt-compare"),O=qe(e,"Close","workspace-prompt-close");return D.append(A,n,N,V,O),o.appendChild(D),{dialog:o,title:c,description:i,context:s,draftNotice:l,textarea:h,skillText:k,skillReference:m,saveSkillButton:C,chooseSkillButton:S,skillFile:I,status:$,copyButton:A,resetButton:n,openExistingButton:N,chooseCompareButton:V,closeButton:O}}function qe(e,t,o){let c=e.createElement("button");return c.type="button",c.textContent=t,c.title=t,c.setAttribute("data-workspace-prompt-action",o),c}function wi(e={}){let t=Sn.includes(e?.mode)?e.mode:"compare",o=e?.history&&typeof e.history=="object"?{enabled:e.history.enabled!==!1,label:at(e.history.label,"History"),reason:at(e.history.reason,"")}:{enabled:!0,label:"History",reason:""},c=e?.compare&&typeof e.compare=="object"?{enabled:e.compare.enabled!==!1,label:at(e.compare.label,"Compare"),reason:at(e.compare.reason,"")}:{enabled:!0,label:"Compare",reason:""},i=Array.isArray(e?.availableTours)?e.availableTours.filter(s=>s==="historical"||s==="deconstructed"):null;return{sessionId:Qa(e?.sessionId),mode:t,modeLabels:e?.modeLabels&&typeof e.modeLabels=="object"?Object.fromEntries(Sn.filter(s=>typeof e.modeLabels[s]=="string").map(s=>[s,e.modeLabels[s]])):{},history:o,compare:c,availableTours:i,canCreateTours:e?.canCreateTours!==!1,canOpenTours:e?.canOpenTours!==!1,unavailableTourReason:at(e?.unavailableTourReason,"This tour is unavailable in this workspace."),revisionContext:at(e?.revisionContext,""),nativeSkillFiles:e?.nativeSkillFiles===!0,tourSkill:e?.tourSkill&&typeof e.tourSkill.path=="string"?{path:e.tourSkill.path,text:typeof e.tourSkill.text=="string"?e.tourSkill.text:ki}:null,promptContext:Za(e?.promptContext),status:at(e?.status,"")}}function Za(e){let t=e&&typeof e=="object"?e:{};return{...typeof t.repository=="string"?{repository:t.repository}:{},...Array.isArray(t.paths)?{paths:t.paths.filter(o=>typeof o=="string")}:{},...Array.isArray(t.revisions)?{revisions:t.revisions.filter(o=>typeof o=="string")}:{},...Ja.has(t.rangeStatus)?{rangeStatus:t.rangeStatus}:{},...typeof t.reason=="string"?{reason:t.reason}:{}}}function vi(e,t){return e==="history"?t.history.enabled!==!1:e==="compare"?t.compare.enabled!==!1:t.availableTours?t.availableTours.includes(e):t.mode===e}function Sr(e){return JSON.stringify({repository:e.repository||"",paths:Array.isArray(e.paths)?e.paths:[],revisions:Array.isArray(e.revisions)?e.revisions:[],rangeStatus:e.rangeStatus||"",reason:e.reason||""})}function xi(e){let t=e.repository||"(not resolved)",o=Array.isArray(e.paths)&&e.paths.length>0?e.paths.join(", "):e.repository&&Array.isArray(e.paths)?". (repository root; full requested scope)":"(scope not supplied)",c=Array.isArray(e.revisions)&&e.revisions.length>0?e.revisions.join(", "):"(none reported)";return`repository ${t}; paths ${o}; revisions ${c}; range ${e.rangeStatus||"unavailable"}`}function Qa(e){return typeof e=="string"||typeof e=="number"?String(e):"default"}function at(e,t){return typeof e=="string"?e:t}function Ii(e,t){let o={folders:new Map,files:[]};e.forEach((i,s)=>{let l=t(i).split("/"),f=l.pop(),h=o,m="";for(let w of l)m=m?`${m}/${w}`:w,h.folders.has(w)||h.folders.set(w,{name:w,path:m,folders:new Map,files:[]}),h=h.folders.get(w);h.files.push({item:i,index:s,name:f})});let c=i=>{i.folders=[...i.folders.values()].sort((s,l)=>s.name.localeCompare(l.name)),i.files.sort((s,l)=>s.name.localeCompare(l.name)),i.folders.forEach(c)};return c(o),o}function Tr(e,t,o=[]){let c=[],i=/\[([^\]\n]+)\]\(((?:https?:\/\/|bygone:\/\/)(?:[^\s()]|\([^\s()]*\))+)\)/gu,s=0;for(let l of t.matchAll(i)){if(l.index>0&&t[l.index-1]==="!")continue;let f;try{f=new URL(l[2])}catch{continue}if(f.protocol==="bygone:")try{Xn(f.href)}catch{continue}else if(f.protocol!=="https:"&&f.protocol!=="http:")continue;c.push(...Cr(e,t,s,l.index,o));let h=e.createElement("a");h.href=f.href,h.target="_blank",h.rel="noopener noreferrer";let m=l.index+1;h.replaceChildren(...Cr(e,t,m,m+l[1].length,o)),c.push(h),s=l.index+l[0].length}return c.push(...Cr(e,t,s,t.length,o)),c}function Cr(e,t,o,c,i){let s=[],l=o;for(let f of i){let h=Math.max(o,f.startOffset),m=Math.min(c,f.endOffset);if(h>=m)continue;h>l&&s.push(e.createTextNode(t.slice(l,h)));let w=e.createElement("span");w.className="tour-narration-segment",w.dataset.narrationSegmentId=f.id,w.textContent=t.slice(h,m),s.push(w),l=m}return l<c&&s.push(e.createTextNode(t.slice(l,c))),s}function kt(e,t){let o=document.createElement(e);return o.textContent=t,o}function Si(e,t){e.replaceChildren();let o=t?.details?.audience;if(e.hidden=!o,!o)return;e.append(kt("h2","Audience")),e.append(kt("p",`${o.purpose[0].toUpperCase()+o.purpose.slice(1)}${o.estimatedMinutes?` \xB7 about ${o.estimatedMinutes} min`:""}`)),e.append(kt("p",o.scope));let c=document.createElement("details");c.append(kt("summary","Assumed familiarity"));let i=document.createElement("dl");for(let[s,l]of[["Codebase",{none:"New to this codebase",some:"Some familiarity",maintainer:"Maintainer"}[o.codebase]],["Language",{none:"No prior knowledge",basic:"Basic",fluent:"Fluent",advanced:"Advanced"}[o.language]],["Reading demand",o.readingDemand],["Prerequisites",o.domain?.join("; ")||"None specified"]])i.append(kt("dt",s),kt("dd",l));c.append(i),e.append(c)}function Ci(e,t,o){let c=t.kind==="scene"||t.kind==="step"?e.scenes[t.sceneIndex]:void 0,i=t.kind==="step"&&c&&"steps"in c?c.steps[t.stepIndex]:void 0,s=t.kind==="chapter"?e.chapters.find(w=>w.id===t.chapterId):c?e.chapters.find(w=>w.sceneIds.includes(c.id)):void 0,l=t.kind==="title"?e.opening:t.kind==="conclusion"?e.conclusion:t.kind==="chapter"?s:i??c,f=c?.kind==="deconstructed-diff"&&i&&"pairIndex"in i&&!i.body?c.steps.find(w=>w.pairIndex===i.pairIndex&&w.body):void 0,h=me(e,t,o.mode),m={title:e.title,sourceUrl:e.sourceUrl,mode:o.mode,location:o.location,range:e.range,audience:e.details?.audience,opening:e.opening,section:{kind:t.kind,chapter:s?.id,scene:c?.id,step:i?.id},passage:l&&Object.fromEntries(Object.entries(l).filter(([w])=>["title","summary","body","bullets","takeaway","requirement","overview"].includes(w))),sceneContext:i&&c?{title:c.title,summary:c.summary,takeaway:c.takeaway,overview:"overview"in c?c.overview:void 0}:void 0,sceneRange:c?.kind==="deconstructed-diff"?c.realRange:void 0,stageExplanation:f&&{id:f.id,title:f.title,body:f.body},authoredEvidence:h,displayedEvidence:o.displayedEvidence===void 0?me(e,t,o.mode,o.activePairIndex):o.displayedEvidence,focus:i&&("focus"in i?i.focus:{path:i.file,pairIndex:i.pairIndex,side:i.side,startLine:i.startLine,endLine:i.endLine}),connection:i&&"connection"in i?i.connection:void 0,image:i&&"image"in i&&i.image?{path:i.image.path,revision:i.image.revision,alt:i.image.alt,displayed:o.imageVisible}:void 0};return JSON.stringify(m,null,2)}function Ti(e,t,o){return`${e==="explain"?"Help me understand this tour passage.":"Help me evaluate this change."}
650
653
 
651
654
  My concern:
652
655
  ${t.trim()||"(No additional note; start with the captured passage.)"}
@@ -659,10 +662,10 @@ Captured tour context (a snapshot, not proof of current workspace state; synthet
659
662
  ${o}
660
663
 
661
664
  Verify the pinned and current implementation revisions before acting. If authorized implementation changes affect the tour, revisit its claims and refresh evidence for the intended committed range; do not present working-tree edits as committed evidence. Use the pr-tour-guide skill when authoring or repairing a Bygone tour, if available. The location may require the original repository/server or exported HTML file.
662
- `}function bi(e,t){let o=t(),a=document.createElement("dialog");a.className="tour-feedback-dialog",a.setAttribute("aria-labelledby","tour-feedback-title");let i=document.createElement("h2");i.id="tour-feedback-title",i.textContent=e==="explain"?"Explain this":"Question this change";let s=document.createElement("p");s.textContent="Describe what is unclear or seems wrong. Copy the request and paste it into your coding agent.";let l=document.createElement("label");l.htmlFor="tour-feedback-concern",l.textContent="Your question or concern";let f=document.createElement("textarea");f.id="tour-feedback-concern",f.rows=3;let p=document.createElement("details"),m=document.createElement("summary");m.textContent="Review the captured context";let y=document.createElement("pre");y.textContent=o,p.append(m,y);let b=document.createElement("textarea");b.readOnly=!0,b.rows=8,b.hidden=!0,b.setAttribute("aria-label","Request to copy manually");let E=document.createElement("p");E.setAttribute("role","status");let I=document.createElement("div");I.className="tour-feedback-actions";let T=document.createElement("button");T.type="button",T.textContent="Copy request";let v=document.createElement("button");v.type="button",v.textContent="Close",v.addEventListener("click",()=>a.close()),f.addEventListener("input",()=>{b.hidden=!0,E.textContent=""}),T.addEventListener("click",async()=>{let x=wi(e,f.value,o);T.disabled=!0,f.readOnly=!0;try{await navigator.clipboard.writeText(x),E.textContent="Copied. Paste into your agent to continue."}catch{b.value=x,b.hidden=!1,b.focus(),b.select(),E.textContent="Clipboard unavailable. Copy the selected request manually."}finally{T.disabled=!1,f.readOnly=!1}}),I.append(T,v),a.append(i,s,l,f,p,b,E,I),a.addEventListener("close",()=>a.remove(),{once:!0}),document.body.append(a),a.showModal(),f.focus()}(function(){let t=oo(),o=window.__BYGONE_EXPORT__,a=o?go(o):null,i={getItem(r){try{return window.localStorage.getItem(r)}catch{return null}},setItem(r,c){try{window.localStorage.setItem(r,c)}catch{}},removeItem(r){try{window.localStorage.removeItem(r)}catch{}}},s=!1,l=!1,f=0,p=Promise.resolve(),m=Promise.resolve(),y="bygone.tourSidebarWidth",b=240,E=600,I="bygone.tourNarrativeHeight",T=180,v=180,x="bygone.tourNarrationVoice",N="bygone.tourNarrationRate",B=new Set([.75,1,1.25,1.5,2]),M="speechSynthesis"in window&&"SpeechSynthesisUtterance"in window,n={mode:"empty",left:null,right:null,comparisonId:0,tour:null,authoredTour:null,zoom:null,zoomSwitching:!1,historyCommit:null,historyEntries:[],fileHistoryCache:new Map,displayedPanels:[],historyPath:null,historyPanels:[],historyFocus:null,historyDiff:null,historyChangedFiles:new Set,historyFiles:null,compare:null,comparisonFocus:null,comparisonCommits:[],comparisonDraftCommits:[],activeSceneIndex:-1,activeStepIndex:0,sceneIntroVisible:!1,narrativeParent:null,readingKey:"title",directoryEvidence:null,activeTourFilePath:null,tourFocusFilePath:null,tourSidebarWidth:Ki(),tourSidebarHidden:!1,tourNarrativeHeight:Gi(),tourNavigatorTab:"tour",showAllFiles:!1,showAllTourFiles:!1,collapsedFileFolders:new Set,revealedFilePath:null,narrationVoiceURI:i.getItem(x)||"",narrationRate:Di(),narrationVoices:[],renderedNarrationUnit:null,workspacePromptStatus:"",historyPrefix:"/history/"},F=null,V=null,O=null,j=[],J=new Map,oe=new Set,Q=null,ie=null,de=new URLSearchParams(window.location.search).get("workspaceEmbedded")==="1",wt=null,X=new wn(Mi(),{claimAudio:Hi,onStateChange:An,onSegmentChange:_i,canNavigateUnit:Ui,navigateUnit:zi});window.__BYGONE_HOST__={environment:"web",linkPreviews:!o,editorWorkerUrl:o?.workers.editor||"/media/editor.worker.js",diffWorkerUrl:o?.workers.diff||"/media/diff.worker.js",postMessage(r){Ri(r)}},window.addEventListener("message",r=>{if(!de||r.source!==window.parent||r.origin!=="null")return;let c=r.data;!c||typeof c!="object"||c.type!=="bygoneWorkspaceTourMode"||c.mode!=="historical"&&c.mode!=="deconstructed"||(wt=c.mode,!(!n.zoom||n.zoom.mode===c.mode||!K().includes(c.mode))&&_e(c.mode).catch(ae))});function zt(){if(Pi(),de){let r=document.getElementById("tour-mode-tabs"),c=document.getElementById("tour-mode-description");r&&(r.hidden=!0),c&&(c.hidden=!0)}Ie("Browser host ready.")}document.readyState!=="loading"?queueMicrotask(zt):window.addEventListener("DOMContentLoaded",zt,{once:!0});function ne(r){(r.type==="showDiff"||r.type==="showMultiDiff"||r.type==="showDirectoryDiff")&&(t.clear(),r={...r,renderRequestId:++he},n.mode==="tour"&&(n.displayedPanels=r.type==="showMultiDiff"?r.panels:n.zoom?.mode==="history"?n.historyPanels:Ci(),r.history||(r.history=Ir()),ve(),it()),se&&(Ae=r.renderRequestId)),window.dispatchEvent(new window.CustomEvent("bygone:host-message",{detail:r}))}let kn=0,be=new Map,se=null,he=0,Ae=null;function Ne(){n.zoomSwitching||(se=null)}function Be(){return new Promise(r=>{let c=++kn,u=h=>{be.delete(c);let g=n.tour?.scenes[n.activeSceneIndex],w=h?.activeMultiPairIndex,k=g&&Re(g)?At(g):[],S=h?.editorStates?.[h.activeMultiPanelId||h.activePaneSide];r({sceneIndex:n.activeSceneIndex,stepIndex:n.activeStepIndex,path:n.activeTourFilePath,view:n.zoom?.mode==="compare"&&!n.activeTourFilePath?"directory":"file",line:S?.selection?.startLineNumber,commit:(n.zoom?.mode==="history"?n.historyCommit:k[w+1]?.oid)||n.authoredTour.range.headOid,navigation:h,focusId:document.activeElement?.id,narrativeParent:n.narrativeParent,sceneIntroVisible:n.sceneIntroVisible,narrativeScroll:document.getElementById("tour-narrative-content")?.scrollTop||0,readingKey:n.readingKey,navigatorTab:n.tourNavigatorTab})},d=window.setTimeout(()=>u(null),1e3);be.set(c,h=>{window.clearTimeout(d),u(h)}),ne({type:"captureNavigationState",requestId:c})})}let ee=0;function Le(r=n.authoredTour){if(r.tours||!r.scenes.some(u=>u.kind==="deconstructed-diff"))return null;let c=r.zoom?.final;return c?.scenes.some(u=>u.kind==="walkthrough")?c:null}let rt={history:"History",compare:"Compare",historical:"Historical tour",deconstructed:"Deconstructed tour"},bt={history:"Explore commits and choose revisions to compare.",compare:"Inspect the changes between selected revisions.",historical:"Actual revisions, with explanations of updates, reversals, and decisions.",deconstructed:"The change broken into constructed stages for explanation."};function Ht(r){return r==="historical"&&Le()?"Final tour":rt[r]}function R(r){return r==="historical"&&Le()?"The authored walkthrough of the completed endpoint diff.":bt[r]}function U(r=n.authoredTour){if(r.tours)return r.tours;if(!r.scenes.some(d=>d.kind==="deconstructed-diff"))return{historical:{scenes:r.scenes,chapters:r.chapters,opening:r.opening,conclusion:r.conclusion,details:r.details}};let u=Le(r);return{...u?{historical:u}:{},deconstructed:{scenes:r.scenes,chapters:r.chapters,opening:r.opening,conclusion:r.conclusion,details:r.details}}}function K(){return[...re()?["history"]:[],...o||re()?["compare"]:[],...o?Object.keys(U()).filter(r=>U()[r]):["historical","deconstructed"]]}function re(r=n.authoredTour){return o?o.profile==="full":Number(r?.version)>=2}function le(){return o?"Git history is not included in this Minimal export.":"History is unavailable for legacy v1 tours; open a version 2 tour to browse commit history."}function Ue(){return"Compare is unavailable for legacy v1 tours because this tour has no history backend."}function ze(){if(F)return;let r=document.getElementById("tour-mode-controls");if(!r)return;let c=document.getElementById("tour-mode-tabs"),u=document.getElementById("tour-mode-description"),d=document.getElementById("tour-mode-status");c&&(c.hidden=!0),u&&(u.hidden=!0),d&&(d.hidden=!0),V=document.createElement("div"),V.id="workspace-mode-controls",r.prepend(V),document.body.prepend(r);let h=document.createElement("div");h.id="workspace-view";for(let g of["tour-narrative","tour-narrative-resizer","container"]){let w=document.getElementById(g);w&&h.appendChild(w)}document.body.appendChild(h),new ResizeObserver(()=>{document.documentElement.style.setProperty("--workspace-toolbar-height",`${r.offsetHeight}px`)}).observe(r),F=pi({container:V,content:h,send:Ge})}function Ge(r){if(!(!r||typeof r!="object")){if(r.type==="workspaceMode"&&["history","compare","historical","deconstructed"].includes(r.mode)){_e(r.mode).catch(ae);return}r.type==="workspaceOpenTour"&&(r.kind==="historical"||r.kind==="deconstructed")&&Si()}}function ve(){if(!n.zoom||(ze(),!F))return;V.hidden=de;let r=document.getElementById("tour-mode-tabs"),c=document.getElementById("tour-mode-description");r&&(r.dataset.workspaceModeLabel=Ht(n.zoom.mode)),c&&(c.textContent=R(n.zoom.mode));let u=re();F.update({sessionId:Ve(),mode:n.zoom.mode,modeLabels:{historical:Ht("historical")},history:{enabled:u,label:"History",...u?{}:{reason:le()}},compare:{enabled:!!o||u,label:"Compare",...u?{}:{reason:Ue()}},availableTours:Object.keys(U()).filter(d=>d==="historical"||d==="deconstructed"),canCreateTours:!o,canOpenTours:!o,unavailableTourReason:"This tour is not included in the export.",revisionContext:[n.authoredTour?.range?.baseRef||n.authoredTour?.range?.mergeBaseOid,n.authoredTour?.range?.headRef||n.authoredTour?.range?.headOid].filter(Boolean).map(d=>/^[0-9a-f]{40}$/i.test(d)?d.slice(0,7):d).join(" \u2192 "),promptContext:vt(),status:n.workspacePromptStatus})}function Ve(){let r=n.authoredTour;return[r?.repository?.root||"",r?.range?.mergeBaseOid||"",r?.range?.headOid||""].join("\0")||"browser-workspace"}function vt(){let r=n.authoredTour,c=r?.range,u=Array.isArray(n.displayedPanels)?n.displayedPanels:[],d=_t(n.zoom?.mode==="compare"&&n.compare?.commits?n.compare.commits:u.map(S=>S?.commit)),h=u.length>0?d:_t([c?.mergeBaseOid,c?.headOid]),g=_t(u.map(S=>S?.path)),w=g.length>0?g:_t(n.tour?.files?.map(S=>S?.path)),k=vi(h,r);return{...typeof r?.repository?.root=="string"?{repository:r.repository.root}:{},...w.length>0?{paths:w}:{},...h.length>0?{revisions:h}:{},rangeStatus:k.status,...k.reason?{reason:k.reason}:{}}}function vi(r,c){if(r.length===0)return{status:"none",reason:"The browser view has no selected committed revisions."};if(r.length>2)return{status:"multiple",reason:"The displayed comparison contains more than two revision panels."};if(r.length!==2)return{status:"unavailable",reason:"The browser view could not resolve both comparison boundaries."};if(r.some(h=>/^(WORKTREE|INDEX)$/i.test(h)))return{status:"uncommitted",reason:"The browser comparison includes a live working or staged state."};if(!r.every(h=>/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i.test(h)))return{status:"unavailable",reason:"The browser comparison does not expose two full revision identifiers."};let u=c?.range?.mergeBaseOid,d=c?.range?.headOid;return r[0]===u&&r[1]===d?{status:"exact",reason:"The manifest validates its merge-base/head range."}:r[0]===d&&r[1]===u?{status:"reversed",reason:"The selected revisions reverse the manifest merge-base/head range."}:{status:"unavailable",reason:"The browser manifest validates only its merge-base/head pair; this displayed pair needs deliberate Compare selection or backend Git validation."}}function _t(r){return[...new Set(r.filter(c=>typeof c=="string"&&c.trim()).map(c=>c.trim()))]}function Je(r){n.workspacePromptStatus=r,ve()}function xi(r){try{let c=new URL(r,window.location.href).pathname,u="/tour.json";if(c.endsWith(u))return`${c.slice(0,-u.length)||""}/history/`}catch{}return"/history/"}function ki(){return new Promise(r=>{let c=document.createElement("input");c.type="file",c.accept=".bygone,.yaml,.yml,application/yaml,text/yaml",c.hidden=!0,document.body.appendChild(c);let u=d=>{c.remove(),r(d||null)};c.addEventListener("change",()=>u(c.files?.[0])),c.addEventListener("cancel",()=>u(null)),c.click()})}function Ei(r){let c=n.authoredTour;if(!c)return!1;let u=c.repository?.root,d=c.range?.mergeBaseOid,h=c.range?.headOid,g=typeof r.repository=="string"?r.repository:"",w=typeof r.range?.mergeBaseOid=="string"?r.range.mergeBaseOid:"",k=typeof r.range?.headOid=="string"?r.range.headOid:"";return!!(u&&g&&u!==g||d&&w&&d!==w||h&&k&&h!==k)}function Ii(r){let c=typeof r.repository=="string"&&r.repository?r.repository:"(server-selected repository)",u=typeof r.range?.mergeBaseOid=="string"&&r.range.mergeBaseOid?r.range.mergeBaseOid:"(unknown base)",d=typeof r.range?.headOid=="string"&&r.range.headOid?r.range.headOid:"(unknown head)",h=n.authoredTour?.repository?.root||"(current repository unavailable)",g=n.authoredTour?.range?.mergeBaseOid||"(unknown base)",w=n.authoredTour?.range?.headOid||"(unknown head)";return["Open this authored tour from the server?",`Repository: ${c}`,`Range: ${u} \u2192 ${d}`,`Current browser range: ${h}, ${g} \u2192 ${w}`,"This loads the server-validated tour and does not change a local repository."].join(`
663
- `)}async function Si(){if(o){Ie("This export contains a fixed snapshot. Open other tours in Bygone.");return}try{let r=await ki();if(!r)return;if(r.size>1024*1024)throw new Error("Choose an authored .bygone or .yaml file no larger than 1 MiB.");let c=typeof r.name=="string"?r.name.toLowerCase():"";if(!/\.(?:bygone|ya?ml)$/.test(c))throw new Error("Choose an authored .bygone or .yaml file.");let u=await r.text(),d=(k=!1)=>fetch("/tour/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:u,convertToV4:k})}),h=await d(),g=await h.json().catch(()=>({}));if(h.status===409&&g.conversion){if(!window.confirm(`${g.conversion.message}
665
+ `}function $i(e,t){let o=t(),c=document.createElement("dialog");c.className="tour-feedback-dialog",c.setAttribute("aria-labelledby","tour-feedback-title");let i=document.createElement("h2");i.id="tour-feedback-title",i.textContent=e==="explain"?"Explain this":"Question this change";let s=document.createElement("p");s.textContent="Describe what is unclear or seems wrong. Copy the request and paste it into your coding agent.";let l=document.createElement("label");l.htmlFor="tour-feedback-concern",l.textContent="Your question or concern";let f=document.createElement("textarea");f.id="tour-feedback-concern",f.rows=3;let h=document.createElement("details"),m=document.createElement("summary");m.textContent="Review the captured context";let w=document.createElement("pre");w.textContent=o,h.append(m,w);let v=document.createElement("textarea");v.readOnly=!0,v.rows=8,v.hidden=!0,v.setAttribute("aria-label","Request to copy manually");let k=document.createElement("p");k.setAttribute("role","status");let x=document.createElement("div");x.className="tour-feedback-actions";let C=document.createElement("button");C.type="button",C.textContent="Copy request";let S=document.createElement("button");S.type="button",S.textContent="Close",S.addEventListener("click",()=>c.close()),f.addEventListener("input",()=>{v.hidden=!0,k.textContent=""}),C.addEventListener("click",async()=>{let I=Ti(e,f.value,o);C.disabled=!0,f.readOnly=!0;try{await navigator.clipboard.writeText(I),k.textContent="Copied. Paste into your agent to continue."}catch{v.value=I,v.hidden=!1,v.focus(),v.select(),k.textContent="Clipboard unavailable. Copy the selected request manually."}finally{C.disabled=!1,f.readOnly=!1}}),x.append(C,S),c.append(i,s,l,f,h,v,k,x),c.addEventListener("close",()=>c.remove(),{once:!0}),document.body.append(c),c.showModal(),f.focus()}function $r(e,{all:t=!1,includeUnmatched:o=!0,query:c=""}={}){let i=new Map,s=new Map,l=new Map,f=new Map(e.relations.map(A=>[A.sourceId,A])),h=new Map(e.relations.map(A=>[A.destinationId,A])),m=new Set(e.unresolved.flatMap(A=>[...A.sourceIds,...A.destinationIds])),w=A=>(i.has(A)||i.set(A,{key:`file:${A}`,path:A,children:[],type:"file"}),i.get(A)),v=(A,n,N,V)=>{let O=new Map;for(let _ of A){let J={key:`${V}:${_.id}`,entry:_,relation:n.get(_.id),side:V,type:"symbol",children:[],ambiguous:m.has(_.id)};N.set(_.id,J),O.has(_.path)||O.set(_.path,[]),O.get(_.path).push(J)}for(let[_,J]of O){J.sort((X,ne)=>X.entry.start-ne.entry.start||ne.entry.end-X.entry.end||X.entry.id.localeCompare(ne.entry.id));let te=[];for(let X=0;X<J.length;){let ne=J[X],ce=[];for(;X<J.length&&J[X].entry.start===ne.entry.start&&J[X].entry.end===ne.entry.end;)ce.push(J[X++]);for(;te.length&&(te.at(-1)[0].entry.end<ne.entry.end||te.at(-1)[0].entry.end<=ne.entry.start);)te.pop();let He=w(_);for(let Q=te.length-1;Q>=0;Q--)if(te[Q].length===1){He=te[Q][0];break}for(let Q of ce)Q.parent=He;te.push(ce)}}};v(e.symbols.before,f,s,"before"),v(e.symbols.after,h,l,"after");for(let A of l.values())A.after=A.entry,A.before=A.relation&&s.get(A.relation.sourceId).entry,A.parent.children.push(A);let k=new Map;for(let A of s.values()){let n=[];for(let N=A;N?.type==="symbol"&&!k.has(N.key);N=N.parent)n.push(N);for(;n.length;){let N=n.pop(),V=N.parent.type==="file"?N.parent:k.get(N.parent.key),O=N.relation&&l.get(N.relation.destinationId);if(O&&O.parent===V)k.set(N.key,O);else{let _={...N,before:N.entry,after:O?.entry,sourceReference:!!O,parent:V,children:[]};V.children.push(_),k.set(N.key,_)}}}for(let A of[...l.values(),...k.values()]){if(!A.relation){A.changed=!0;continue}let n=s.get(A.relation.sourceId),N=l.get(A.relation.destinationId),V=n.parent.type==="file"?N.parent.type==="file"&&n.parent.path===N.parent.path:n.parent.relation?.destinationId===N.parent.entry?.id;A.changed=A.relation.pathChanged||A.relation.nameChanged||!A.relation.rawEqual||!V}let x=[...i.values()].sort((A,n)=>A.path.localeCompare(n.path)),C=[],S=[...x];for(;S.length;){let A=S.pop();A.children.sort((n,N)=>n.entry.start-N.entry.start||n.key.localeCompare(N.key)),C.push(A),S.push(...A.children)}let I=c.trim().toLowerCase(),$=new Set,D=new Set;for(let A of C.reverse()){A.children=A.children.filter(N=>N.visible);let n=A.type==="symbol"&&(t||A.changed)&&(A.relation||o)&&`${A.before?.name||""} ${A.after?.name||""} ${A.entry.path} ${A.before?.path||""} ${A.after?.path||""}`.toLowerCase().includes(I);A.visible=n||A.children.length>0,A.context=!n,n&&(A.relation?$.add(A.relation.id):D.add(A.entry.id))}return{files:x.filter(A=>A.visible),matchingRelations:$.size,matchingUnmatched:D.size}}var ec=[["outside","Outside analysis","path exclusions","Files excluded from this search. Unchanged files may also be outside its scope."],["syntax","Syntax not inventoried","syntax records","Syntax the independent inventory did not turn into symbols. These records are not a count of missing functions."],["rejected","Engine candidates rejected","engine records","Producer containers that could not be accepted against the independent inventory. One record may cover two endpoints."],["unmatched","No accepted match","symbols","Unmatched does not establish an addition or deletion. Ambiguous groups list competing endpoints without choosing an origin."],["relationship","Other detected relationships","relationship records","Extraction or inline evidence can be inspected at its endpoints, but is not navigable as an accepted continuation."],["problem","Analysis problems","problem records","Recorded parser or engine problems. Partial searches can omit competing origins."]],tc={"unsupported-language":"Language is outside the supported inventory.","non-regular-file":"Path is not a regular source file.","destructured-binding":"Destructured binding is not inventoried as an independent symbol.","unsupported-class-member":"Class member form is not inventoried.","namespace-members-not-enumerated":"Members inside this namespace are not enumerated.","unmodeled-top-level-statement":"Top-level statement is not inventoried; callbacks inside it have no independent symbol.","python-lambda-not-inventoried":"Python lambda is not inventoried as an independent symbol.","python-binding-not-inventoried":"Python binding is outside the declaration inventory.","python-top-level-expression-not-inventoried":"Python top-level expression is outside the declaration inventory.","unresolved-container":"One or both engine containers could not be resolved to an independent symbol.","invalid-container-range":"Engine range, text, or digest failed source validation.","no-inventoried-container":"No inventoried container of the required kind in this file.","container-name-mismatch":"Engine name does not match an eligible inventoried declaration.","container-boundary-mismatch":"Engine boundaries do not match an eligible declaration range.","multiple-inventory-containers":"More than one inventory container matches these boundaries.","resolved-container":"This endpoint resolves; the other endpoint prevented acceptance.","engine-skipped-document":"Engine did not process this inventoried document.","parser-diagnostic":"Inventory parser reported a problem.","engine-incomplete":"Engine analysis did not finish completely.","engine-truncated":"Engine output was truncated.","invalid-statement-range":"An engine statement mapping failed source validation.","invalid-unmapped-range":"An engine unmapped statement failed source validation.","repeated-exact-occurrences":"Repeated identical declarations leave competing origins.","conflicting-continuations":"Candidates compete for the same continuation.","incomplete-analysis":"Candidate withheld because the search was incomplete.","no-per-symbol-explanation":"No accepted match. The producer supplied no per-symbol explanation.","no-candidate-supplied":"No continuation candidate was supplied for this inventoried symbol. The engine gave no explanation; origins outside the search remain unknown.","candidate-endpoint-rejected":"An engine candidate named this symbol, but its other endpoint failed inventory validation. See Engine candidates rejected.","relationship-without-continuation":"Only extraction or inline evidence was supplied; no continuation was accepted.","ambiguous-symbol":"Symbol belongs to an unresolved candidate group below.",extract:"Extraction relationship detected; behavior unassessed.",inline:"Inline relationship detected; behavior unassessed."},Ar=e=>tc[e]||`Recorded reason: ${e}`;function Ai(e){let t=new Set(e.relations.flatMap(m=>[m.sourceId,m.destinationId])),o=new Set(e.unresolved.flatMap(m=>[...m.sourceIds,...m.destinationIds])),c=new Map;for(let m of["before","after"])for(let w of e.symbols[m])c.set(w.id,{...w,side:m});let i=m=>{let w=c.get(m);return{path:w.path,side:w.side,line:w.startLine,symbolId:m}},s=new Map((e.diagnostics?.records||[]).filter(m=>m.category==="unmatched").flatMap(m=>m.locations.filter(w=>w.symbolId).map(w=>[w.symbolId,m]))),l=[...c.values()].filter(m=>!t.has(m.id)).map(m=>({reason:o.has(m.id)?"ambiguous-symbol":s.get(m.id)?.reason||"no-per-symbol-explanation",locations:[i(m.id)]})),f=(e.diagnostics?.records||[]).filter(m=>m.category==="unmatched"&&m.reason==="repeated-exact-occurrences"),h=e.unresolved.map(m=>{let w=[...m.sourceIds,...m.destinationIds],v=f.find(k=>k.reason===m.reason&&w.every(x=>k.locations.some(C=>C.symbolId===x)));return{reason:m.reason,message:v?.message||"Ambiguous group: inspect each competing endpoint.",locations:v?.locations||w.map(i)}});return ec.map(([m,w,v,k])=>({category:m,title:w,description:k,count:m==="unmatched"?`${l.length} ${v} \xB7 ${h.length} ambiguous groups`:e.diagnostics?`${e.diagnostics.records.filter(x=>x.category===m).length} ${v}`:"details unavailable",records:m==="unmatched"?[...l,...h]:(e.diagnostics?.records||[]).filter(x=>x.category===m)}))}(function(){let t=ho(),o=window.__BYGONE_EXPORT__,c=o?Io(o):null,i={getItem(r){try{return window.localStorage.getItem(r)}catch{return null}},setItem(r,a){try{window.localStorage.setItem(r,a)}catch{}},removeItem(r){try{window.localStorage.removeItem(r)}catch{}}},s=!1,l=!1,f=0,h=Promise.resolve(),m=Promise.resolve(),w="bygone.tourSidebarWidth",v=240,k=600,x="bygone.tourNarrativeHeight",C=180,S=180,I="bygone.tourNarrationVoice",$="bygone.tourNarrationRate",D=new Set([.75,1,1.25,1.5,2]),A="speechSynthesis"in window&&"SpeechSynthesisUtterance"in window,n={mode:"empty",left:null,right:null,comparisonId:0,tour:null,authoredTour:null,zoom:null,zoomSwitching:!1,historyCommit:null,historyEntries:[],fileHistoryCache:new Map,displayedPanels:[],historyPath:null,historyPanels:[],historyFocus:null,historyDiff:null,historyChangedFiles:new Set,historyFiles:null,compare:null,comparisonFocus:null,comparisonCommits:[],comparisonDraftCommits:[],activeSceneIndex:-1,activeStepIndex:0,sceneIntroVisible:!1,narrativeParent:null,readingKey:"title",directoryEvidence:null,activeTourFilePath:null,tourFocusFilePath:null,tourSidebarWidth:ns(),tourSidebarHidden:!1,tourNarrativeHeight:os(),tourNavigatorTab:"tour",showAllFiles:!1,showAllTourFiles:!1,collapsedFileFolders:new Set,revealedFilePath:null,narrationVoiceURI:i.getItem(I)||"",narrationRate:Wi(),narrationVoices:[],renderedNarrationUnit:null,workspacePromptStatus:"",correspondence:null,collapsedSymbolNodes:new Set,activeCorrespondenceId:null,symbolSelection:null,expandedFileSymbols:new Set,historyPrefix:"/history/"},N=null,V=null,O=null,_=[],J=new Map,te=new Set,X=null,ne=null,ce=new URLSearchParams(window.location.search).get("workspaceEmbedded")==="1",He=null,Q=new kn(Gi(),{claimAudio:Zi,onStateChange:Fn,onSegmentChange:Qi,canNavigateUnit:Yi,navigateUnit:Xi});window.__BYGONE_HOST__={environment:"web",linkPreviews:!o,editorWorkerUrl:o?.workers.editor||"/media/editor.worker.js",diffWorkerUrl:o?.workers.diff||"/media/diff.worker.js",postMessage(r){_i(r)}},window.addEventListener("message",r=>{if(!ce||r.source!==window.parent||r.origin!=="null")return;let a=r.data;!a||typeof a!="object"||a.type!=="bygoneWorkspaceTourMode"||a.mode!=="historical"&&a.mode!=="deconstructed"||(He=a.mode,!(!n.zoom||n.zoom.mode===a.mode||!de().includes(a.mode))&&We(a.mode).catch(fe))});function _t(){if(ji(),ce){let r=document.getElementById("tour-mode-tabs"),a=document.getElementById("tour-mode-description");r&&(r.hidden=!0),a&&(a.hidden=!0)}Le("Browser host ready.")}document.readyState!=="loading"?queueMicrotask(_t):window.addEventListener("DOMContentLoaded",_t,{once:!0});function se(r){(r.type==="showDiff"||r.type==="showMultiDiff"||r.type==="showDirectoryDiff")&&(t.clear(),r={...r,renderRequestId:++ge},n.mode==="tour"&&!r.correspondenceView&&(n.displayedPanels=r.type==="showMultiDiff"?r.panels:n.zoom?.mode==="history"?n.historyPanels:Oi(),r.history||(r.history=Nr()),be(),dt()),le&&(Pe=r.renderRequestId)),window.dispatchEvent(new window.CustomEvent("bygone:host-message",{detail:r}))}let Cn=0,Te=new Map,le=null,ge=0,Pe=null;function Ee(){n.zoomSwitching||(le=null)}function _e(){return new Promise(r=>{let a=++Cn,u=p=>{Te.delete(a);let g=n.tour?.scenes[n.activeSceneIndex],y=p?.activeMultiPairIndex,b=g&&Me(g)?Ft(g):[],E=p?.editorStates?.[p.activeMultiPanelId||p.activePaneSide];r({sceneIndex:n.activeSceneIndex,stepIndex:n.activeStepIndex,path:n.activeTourFilePath,view:n.zoom?.mode==="compare"&&!n.activeTourFilePath?"directory":"file",line:E?.selection?.startLineNumber,commit:(n.zoom?.mode==="history"?n.historyCommit:b[y+1]?.oid)||n.authoredTour.range.headOid,navigation:p,focusId:document.activeElement?.id,narrativeParent:n.narrativeParent,sceneIntroVisible:n.sceneIntroVisible,narrativeScroll:document.getElementById("tour-narrative-content")?.scrollTop||0,readingKey:n.readingKey,navigatorTab:n.tourNavigatorTab})},d=window.setTimeout(()=>u(null),1e3);Te.set(a,p=>{window.clearTimeout(d),u(p)}),se({type:"captureNavigationState",requestId:a})})}let oe=0,Xe=0;function Fe(r=n.authoredTour){if(r.tours||!r.scenes.some(u=>u.kind==="deconstructed-diff"))return null;let a=r.zoom?.final;return a?.scenes.some(u=>u.kind==="walkthrough")?a:null}let Et={history:"History",compare:"Compare",historical:"Historical tour",deconstructed:"Deconstructed tour"},Tn={history:"Explore commits and choose revisions to compare.",compare:"Inspect the changes between selected revisions.",historical:"Actual revisions, with explanations of updates, reversals, and decisions.",deconstructed:"The change broken into constructed stages for explanation."};function B(r){return r==="historical"&&Fe()?"Final tour":Et[r]}function j(r){return r==="historical"&&Fe()?"The authored walkthrough of the completed endpoint diff.":Tn[r]}function G(r=n.authoredTour){if(r.tours)return r.tours;if(!r.scenes.some(d=>d.kind==="deconstructed-diff"))return{historical:{scenes:r.scenes,chapters:r.chapters,opening:r.opening,conclusion:r.conclusion,details:r.details}};let u=Fe(r);return{...u?{historical:u}:{},deconstructed:{scenes:r.scenes,chapters:r.chapters,opening:r.opening,conclusion:r.conclusion,details:r.details}}}function de(){return[...ae()?["history"]:[],...o||ae()?["compare"]:[],...o?Object.keys(G()).filter(r=>G()[r]):["historical","deconstructed"]]}function ae(r=n.authoredTour){return o?o.profile==="full":Number(r?.version)>=2}function je(){return o?"Git history is not included in this Minimal export.":"History is unavailable for legacy v1 tours; open a version 2 tour to browse commit history."}function De(){return"Compare is unavailable for legacy v1 tours because this tour has no history backend."}function Ze(){if(N)return;let r=document.getElementById("tour-mode-controls");if(!r)return;let a=document.getElementById("tour-mode-tabs"),u=document.getElementById("tour-mode-description"),d=document.getElementById("tour-mode-status");a&&(a.hidden=!0),u&&(u.hidden=!0),d&&(d.hidden=!0),V=document.createElement("div"),V.id="workspace-mode-controls",r.prepend(V),document.body.prepend(r);let p=document.createElement("div");p.id="workspace-view";for(let g of["tour-narrative","tour-narrative-resizer","container"]){let y=document.getElementById(g);y&&p.appendChild(y)}document.body.appendChild(p),new ResizeObserver(()=>{document.documentElement.style.setProperty("--workspace-toolbar-height",`${r.offsetHeight}px`)}).observe(r),N=Ei({container:V,content:p,send:It})}function It(r){if(!(!r||typeof r!="object")){if(r.type==="workspaceMode"&&["history","compare","historical","deconstructed"].includes(r.mode)){We(r.mode).catch(fe);return}r.type==="workspaceOpenTour"&&(r.kind==="historical"||r.kind==="deconstructed")&&Mi()}}function be(){if(!n.zoom||(Ze(),!N))return;V.hidden=ce;let r=document.getElementById("tour-mode-tabs"),a=document.getElementById("tour-mode-description");r&&(r.dataset.workspaceModeLabel=B(n.zoom.mode)),a&&(a.textContent=j(n.zoom.mode));let u=ae();N.update({sessionId:St(),mode:n.zoom.mode,modeLabels:{historical:B("historical")},history:{enabled:u,label:"History",...u?{}:{reason:je()}},compare:{enabled:!!o||u,label:"Compare",...u?{}:{reason:De()}},availableTours:Object.keys(G()).filter(d=>d==="historical"||d==="deconstructed"),canCreateTours:!o,canOpenTours:!o,unavailableTourReason:"This tour is not included in the export.",revisionContext:[n.authoredTour?.range?.baseRef||n.authoredTour?.range?.mergeBaseOid,n.authoredTour?.range?.headRef||n.authoredTour?.range?.headOid].filter(Boolean).map(d=>/^[0-9a-f]{40}$/i.test(d)?d.slice(0,7):d).join(" \u2192 "),promptContext:Li(),status:n.workspacePromptStatus})}function St(){let r=n.authoredTour;return[r?.repository?.root||"",r?.range?.mergeBaseOid||"",r?.range?.headOid||""].join("\0")||"browser-workspace"}function Li(){let r=n.authoredTour,a=r?.range,u=Array.isArray(n.displayedPanels)?n.displayedPanels:[],d=jt(n.zoom?.mode==="compare"&&n.compare?.commits?n.compare.commits:u.map(E=>E?.commit)),p=u.length>0?d:jt([a?.mergeBaseOid,a?.headOid]),g=jt(u.map(E=>E?.path)),y=g.length>0?g:jt(n.tour?.files?.map(E=>E?.path)),b=Ni(p,r);return{...typeof r?.repository?.root=="string"?{repository:r.repository.root}:{},...y.length>0?{paths:y}:{},...p.length>0?{revisions:p}:{},rangeStatus:b.status,...b.reason?{reason:b.reason}:{}}}function Ni(r,a){if(r.length===0)return{status:"none",reason:"The browser view has no selected committed revisions."};if(r.length>2)return{status:"multiple",reason:"The displayed comparison contains more than two revision panels."};if(r.length!==2)return{status:"unavailable",reason:"The browser view could not resolve both comparison boundaries."};if(r.some(p=>/^(WORKTREE|INDEX)$/i.test(p)))return{status:"uncommitted",reason:"The browser comparison includes a live working or staged state."};if(!r.every(p=>/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i.test(p)))return{status:"unavailable",reason:"The browser comparison does not expose two full revision identifiers."};let u=a?.range?.mergeBaseOid,d=a?.range?.headOid;return r[0]===u&&r[1]===d?{status:"exact",reason:"The manifest validates its merge-base/head range."}:r[0]===d&&r[1]===u?{status:"reversed",reason:"The selected revisions reverse the manifest merge-base/head range."}:{status:"unavailable",reason:"The browser manifest validates only its merge-base/head pair; this displayed pair needs deliberate Compare selection or backend Git validation."}}function jt(r){return[...new Set(r.filter(a=>typeof a=="string"&&a.trim()).map(a=>a.trim()))]}function Qe(r){n.workspacePromptStatus=r,be()}function Ri(r){try{let a=new URL(r,window.location.href).pathname,u="/tour.json";if(a.endsWith(u))return`${a.slice(0,-u.length)||""}/history/`}catch{}return"/history/"}function Pi(){return new Promise(r=>{let a=document.createElement("input");a.type="file",a.accept=".bygone,.yaml,.yml,application/yaml,text/yaml",a.hidden=!0,document.body.appendChild(a);let u=d=>{a.remove(),r(d||null)};a.addEventListener("change",()=>u(a.files?.[0])),a.addEventListener("cancel",()=>u(null)),a.click()})}function Fi(r){let a=n.authoredTour;if(!a)return!1;let u=a.repository?.root,d=a.range?.mergeBaseOid,p=a.range?.headOid,g=typeof r.repository=="string"?r.repository:"",y=typeof r.range?.mergeBaseOid=="string"?r.range.mergeBaseOid:"",b=typeof r.range?.headOid=="string"?r.range.headOid:"";return!!(u&&g&&u!==g||d&&y&&d!==y||p&&b&&p!==b)}function Di(r){let a=typeof r.repository=="string"&&r.repository?r.repository:"(server-selected repository)",u=typeof r.range?.mergeBaseOid=="string"&&r.range.mergeBaseOid?r.range.mergeBaseOid:"(unknown base)",d=typeof r.range?.headOid=="string"&&r.range.headOid?r.range.headOid:"(unknown head)",p=n.authoredTour?.repository?.root||"(current repository unavailable)",g=n.authoredTour?.range?.mergeBaseOid||"(unknown base)",y=n.authoredTour?.range?.headOid||"(unknown head)";return["Open this authored tour from the server?",`Repository: ${a}`,`Range: ${u} \u2192 ${d}`,`Current browser range: ${p}, ${g} \u2192 ${y}`,"This loads the server-validated tour and does not change a local repository."].join(`
666
+ `)}async function Mi(){if(o){Le("This export contains a fixed snapshot. Open other tours in Bygone.");return}try{let r=await Pi();if(!r)return;if(r.size>1024*1024)throw new Error("Choose an authored .bygone or .yaml file no larger than 1 MiB.");let a=typeof r.name=="string"?r.name.toLowerCase():"";if(!/\.(?:bygone|ya?ml)$/.test(a))throw new Error("Choose an authored .bygone or .yaml file.");let u=await r.text(),d=(b=!1)=>fetch("/tour/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:u,convertToV4:b})}),p=await d(),g=await p.json().catch(()=>({}));if(p.status===409&&g.conversion){if(!window.confirm(`${g.conversion.message}
664
667
 
665
668
  ${g.conversion.detail}
666
669
 
667
- The converted copy will be downloaded after opening.`)){Je("Tour conversion canceled.");return}h=await d(!0),g=await h.json().catch(()=>({}))}if(!h.ok)throw new Error(g.error||`Tour upload failed (${h.status}).`);if(!g||typeof g.manifestUrl!="string"||!g.manifestUrl)throw new Error("Tour upload did not return a manifest URL.");if(Ei(g)&&!window.confirm(Ii(g))){Je("Kept the current tour.");return}if(!await Dr(g.manifestUrl)){Je("Could not load the uploaded tour.");return}if(typeof g.convertedSource=="string"){let k=URL.createObjectURL(new Blob([g.convertedSource],{type:"application/yaml"})),S=document.createElement("a");S.href=k,S.download=`${r.name.replace(/(?:\.bygone)?\.ya?ml$|\.bygone$/i,"")}.v4.bygone`,document.body.appendChild(S),S.click(),S.remove(),setTimeout(()=>URL.revokeObjectURL(k),1e3)}Je("")}catch(r){Je(`Could not open existing tour: ${r instanceof Error?r.message:String(r)}`)}}function Y(){return!n.zoom||!!U()[n.zoom.mode]}function xt(r){let c=n.authoredTour;if(U()[r])return{...c,opening:void 0,conclusion:void 0,details:void 0,...U()[r]};let u=r==="compare"&&n.compare?[...new Map([...n.compare.inventory||c.files,...n.compare.files].map(d=>[d.path,d])).values()]:r==="history"&&n.historyFiles||c.files;return{...c,opening:void 0,conclusion:void 0,details:void 0,scenes:[],chapters:[],files:u}}function ot(){let r=document.getElementById("tour-mode-controls");if(r.hidden=!n.zoom||de,!n.zoom)return;ve();let c=document.getElementById("tour-mode-tabs"),u=document.getElementById("tour-mode-description");c&&(c.hidden=!0),u&&(u.hidden=!0);let d=n.zoom.mode==="history",h=re();document.getElementById("tour-history-controls").hidden=!h||n.zoom.mode==="compare",document.getElementById("tour-compare-controls").hidden=!h||n.zoom.mode!=="compare";let g=["historical","deconstructed"].includes(n.zoom.mode)&&!U()[n.zoom.mode];document.body.classList.toggle("workspace-empty-tour",g),document.body.classList.toggle("tour-derived-mode",!Y()),Y()||document.body.classList.remove("tour-discussion");for(let w of["tour-history-parent","tour-history-base"])document.getElementById(w).hidden=!d;it()}function it(){let r=n.comparisonDraftCommits,c=r.length,u=re(),d=[...new Set(In())],h=S=>S.length===c&&S.every(P=>r.includes(P)),g=n.zoom?.mode==="compare"&&h(n.compare?.commits||[]);for(let S of["history","compare"])document.getElementById(`tour-${S}-count`).textContent=`${c} selected`,document.getElementById(`tour-${S}-hint`).textContent=c<2?"Select 2+ revisions":g?"Selection applied":S==="compare"?"Unapplied selection":"Ready to compare",document.getElementById(`tour-${S}-clear`).disabled=!c,document.getElementById(`tour-${S}-reset`).disabled=!d.length||h(d);document.getElementById("tour-history-compare").disabled=c<2||!u;let w=document.getElementById("tour-compare-apply");w.disabled=c<2||!u||g,w.title=g?"These revisions are already displayed":"Apply the selected revisions";let k=document.getElementById("tour-compare-scope");k.textContent=n.compare?.path||"All changed files",k.title=n.compare?.path?`File scope: ${n.compare.path}`:"Comparing across all changed files",document.getElementById("tour-compare-all").hidden=!n.compare?.path;for(let S of["tour-history-parent","tour-history-base"])document.getElementById(S).disabled=!re()||!n.historyCommit}function En(){return[...new Set([...[...n.historyEntries].reverse().map(r=>r.commit),n.authoredTour.range.mergeBaseOid,...n.authoredTour.commits.map(r=>r.oid),n.authoredTour.range.headOid])]}function Er(r){return ii(r,En())}async function pe(r,c,u=n.historyPrefix,d=n.authoredTour){if(a)return a(r,c);if(!re(d))throw new Error(le());let h=await fetch(`${u||"/history/"}${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}),g=await h.json();if(!h.ok)throw new Error(g.error||`History request failed (${h.status}).`);return g}function ae(r){let c=r instanceof Error?r.message:String(r),u=document.getElementById("tour-mode-status");u&&(u.textContent=c),F&&Je(c)}function In(){return n.displayedPanels.map(r=>r.commit).filter(Boolean)}function Ci(){let r=n.tour?.scenes[n.activeSceneIndex],c=n.zoom?.mode==="compare"?n.comparisonCommits:[n.authoredTour.range.mergeBaseOid,n.authoredTour.range.headOid];if(n.directoryEvidence&&Re(r)){let u=At(r),d=r.overview?.comparison;c=r.kind==="deconstructed-diff"?[]:[(d?u.find(h=>h.id===d.from):u[0])?.oid,(d?u.find(h=>h.id===d.to):u.at(-1))?.oid]}return["left","right"].map((u,d)=>({id:u,commit:c[d]}))}function Ir(){let r=n.displayedPanels.map(c=>c.commit);return{...kt(Cn({commits:In()}),r,null),navigatorOnly:!0}}async function Ti(r){if(!r||!n.zoom||!re())return[];if(!n.fileHistoryCache.has(r)){let c=pe("list",{path:r,commit:n.authoredTour.range.headOid}).then(u=>u.entries);n.fileHistoryCache.set(r,c),c.catch(()=>n.fileHistoryCache.delete(r))}return n.fileHistoryCache.get(r)}async function $i(r,c){try{let u=await Ti(r);if(c!==he)return;ne({type:"updateCommitMarkers",changedCommits:u.map(d=>d.commit),path:r})}catch(u){c===he&&ae(u)}}async function Ye(r,c,u=!0){if(c=c||n.historyCommit||n.authoredTour.range.headOid,!r)return Ai(c,u);let d=++ee,h=n.historyEntries,g=h.find(A=>A.commit===c);if(n.historyPath===r&&n.historyCommit===c&&n.historyPanels.length){await jt();return}let w=await pe("diff",{path:r,commit:c,head:n.authoredTour.range.headOid});if(d!==ee||n.zoom.mode!=="history")return;if(u&&n.historyPanels.length&&n.historyCommit===c){let A=await Promise.all(n.historyPanels.map(async z=>{let _=z.commit===c?{rightContent:w.rightContent,path:w.path}:z.commit===w.parentCommit?{rightContent:w.leftContent,path:w.previousPath||w.path}:z.commit?await pe("diff",{path:r,commit:z.commit,head:n.authoredTour.range.headOid}):{rightContent:"",path:r};return{...z,content:_.rightContent,path:_.path}}));if(d!==ee||n.zoom.mode!=="history")return;n.historyPanels=A,n.historyPath=r,n.historyDiff=w,await jt(),ye();return}let k=h.findIndex(A=>A.commit===c),P=(k>=0?h[k+1]:null)?.commit||w.parentCommit,L=P&&P!==w.parentCommit?(await pe("diff",{path:r,commit:P,head:n.authoredTour.range.headOid})).rightContent:w.leftContent;if(d!==ee||n.zoom.mode!=="history")return;n.historyPath=r,n.historyCommit=c;let $=Math.max(2,n.historyPanels.length);n.historyDiff=w;let D=(A,z,_)=>({id:`history-${A||"empty"}`,commit:A,content:z,label:_,path:w.path,editable:!1});for(n.historyPanels=[D(P,L,P?.slice(0,7)||"Empty tree"),D(c,w.rightContent,g?`${g.shortCommit} ${g.summary}`:c.slice(0,7))],n.historyFocus=`history-${c}`;n.historyPanels.length<$;){let A=qt(n.historyPanels[0],"left");if(!A)break;let z=await pe("diff",{path:r,commit:A.commit,head:n.authoredTour.range.headOid});if(d!==ee||n.zoom.mode!=="history")return;n.historyPanels.unshift(D(A.commit,z.rightContent,`${A.shortCommit} ${A.summary}`))}await jt(),document.getElementById("tour-mode-status").textContent="",it(),ye()}async function Ai(r=n.historyCommit||n.authoredTour.range.headOid,c=!0){let u=++ee,d=n.historyEntries.find(w=>w.commit===r);if(!d)throw new Error("The selected revision is unavailable in this history.");let h=c&&n.historyCommit===r&&n.historyPanels.length?n.historyPanels:[d.parentCommit||null,r].map(w=>({id:`history-${w||"empty"}`,commit:w,content:"",editable:!1,label:w?w.slice(0,7):"Empty tree"})),g=await pe("changed-files",{commits:h.map(w=>w.commit||null),includeEntries:!0,includeFiles:!0});u!==ee||n.zoom.mode!=="history"||(n.historyCommit=r,n.historyPanels=h,n.historyFocus=h.at(-1).id,n.historyPath=null,n.historyChangedFiles=new Set(g.paths),n.historyFiles=g.files,n.tour.files=g.files,Fn(),n.activeTourFilePath=null,ue(),ne({...nn(h.map(w=>w.label),g.entries),history:kt(Sr(n.historyEntries,r,{}),h.map(w=>w.commit),r)}),qe(g.paths.length?"":"No changed files for the selected revisions."),it(),ye())}function Sr(r,c,u){let d=r.findIndex(g=>g.commit===c),h=r[d];return{fileName:(n.historyPath||u.path||"Changed files").split("/").pop(),canGoBack:d>=0&&d<r.length-1,canGoForward:d>0,positionLabel:`${d+1} / ${r.length}`,leftCommitLabel:n.historyPanels[0]?.commit?.slice(0,7)||"Empty tree",leftTimestamp:"",rightCommitLabel:n.historyPanels.at(-1)?.label||(h?`${h.shortCommit} ${h.summary}`.trim():c.slice(0,7)),rightTimestamp:h?.timestamp||"",workingTreeControls:!1,rail:{activeTabId:"history",tabs:[{id:"history",label:"History"}],itemsByTab:{history:[]}}}}function qt(r,c){let u=En(),d=u.indexOf(r.commit);if(d<0)return null;let h=new Set(n.historyPanels.map(k=>k.commit)),w=(c==="left"?u.slice(0,d).reverse():u.slice(d+1)).find(k=>!h.has(k)&&n.historyEntries.some(S=>S.commit===k));return n.historyEntries.find(k=>k.commit===w)}function kt(r,c,u){return r.rail.itemsByTab.history=ro(n.historyEntries,{displayed:c,active:u,selected:n.comparisonDraftCommits,tourCommits:new Set(n.authoredTour?.commits.map(d=>d.oid)),selectionEnabled:!!n.zoom,missingRevisionSelectionEnabled:!!n.zoom,missingRevisionLabel:d=>d?`${d.slice(0,7)} \xB7 Parent/base revision`:"Empty tree"}).map(d=>({...d,meta:d.parents.length>1?`${d.meta} \xB7 Merge: ${d.parents.map(h=>h.slice(0,7)).join(", ")}`:d.meta})),r}async function jt(){let r=n.historyPanels,c=n.authoredTour,u=ee,d=await pe("changed-files",{commits:r.map(w=>w.commit||null),includeFiles:!0});if(u!==ee||r!==n.historyPanels||c!==n.authoredTour||n.zoom.mode!=="history")return;n.historyChangedFiles=new Set(d.paths),n.historyFiles=d.files,n.tour.files=d.files,Fn();let h=n.historyPanels.map(w=>({...w,addLeftEnabled:!!qt(w,"left"),addRightEnabled:!!qt(w,"right"),removeEnabled:n.historyPanels.length>2})),g=h.find(w=>w.id===n.historyFocus)?.commit;n.activeTourFilePath=n.historyPath,ue(),ne({...rn({panels:h,files:Gt(),activePanelId:n.historyFocus,mutationEnabled:!0,canReturnToDirectory:!0},(w,k)=>we(w.content,k.content)),history:kt(Sr(n.historyEntries,n.historyCommit,n.historyDiff),h.map(w=>w.commit),g)})}async function Ni(r){let c=n.historyPanels.find(u=>u.id===(r.anchorPanelId||r.panelId));if(c){if(r.type==="multiRemovePanel"){if(n.historyPanels.length<=2)return;++ee,n.historyPanels=n.historyPanels.filter(u=>u!==c),n.historyFocus===c.id&&(n.historyFocus=n.historyPanels.at(-1).id)}else{let u=qt(c,r.side);if(!u)return;let d=++ee,h=await pe("diff",{path:n.historyPath,commit:u.commit,head:n.authoredTour.range.headOid});if(d!==ee||n.zoom.mode!=="history")return;let g={id:`history-${u.commit}`,commit:u.commit,content:h.rightContent,label:`${u.shortCommit} ${u.summary}`,path:h.path,editable:!1};n.historyPanels.push(g);let w=En();n.historyPanels.sort((k,S)=>w.indexOf(k.commit)-w.indexOf(S.commit)),n.historyFocus=g.id}await jt()}}function Sn(r){let c=n.historyEntries.findIndex(d=>d.commit===n.historyCommit),u=n.historyEntries[c+r];if(u)return Ye(n.historyPath,u.commit,!1)}function Cn(r){let c=r.commits;return{fileName:(r.path||n.activeTourFilePath||"Comparison").split("/").pop(),canGoBack:!1,canGoForward:!1,positionLabel:`${r.commits.length} loaded panels`,leftCommitLabel:c[0]?.slice(0,7)||"",leftTimestamp:"",rightCommitLabel:c.at(-1)?.slice(0,7)||"",rightTimestamp:"",workingTreeControls:!1,rail:{activeTabId:"history",tabs:[{id:"history",label:"History"}],itemsByTab:{history:[]}}}}function Cr(r,c=null){if(!r||r.kind!=="text-diff")return!1;qe("");let u=r.comparisonPanels;return c=c||n.comparisonFocus,n.comparisonFocus=c,n.activeTourFilePath=r.path,ue(),ne({...rn({panels:u,files:Gt(),activePanelId:c?`compare-${c}`:null,mutationEnabled:!1,reorderEnabled:!1,canReturnToDirectory:!0},(d,h)=>we(d.content,h.content)),history:kt(Cn(n.compare),n.compare.commits,c)}),ye(),!0}async function Tr(r,c=null){let u=++ee;if(!r.comparisonPanels){let d;try{d=await pe("compare-many",{commits:n.compare.commits,path:r.path})}catch(w){if(u!==ee)return!1;throw w}if(u!==ee||n.zoom?.mode!=="compare")return!1;let h=n.tour.files.findIndex(w=>w.path===r.path),g=d.files.find(w=>w.path===r.path)||d.files[0];if(!g)return document.getElementById("tour-mode-status").textContent="This file is absent from the selected revisions.",!1;r={...g,path:r.path},n.tour.files[h]=r,ue(),r.kind==="omitted"&&(document.getElementById("tour-mode-status").textContent=r.reason)}return Cr(r,c)}async function $r(r,c,u=null){r=Er(r);let d=++ee,h=await pe("compare-many",r),g=re()?await pe("changed-files",{commits:r.commits,includeFiles:!0}):null,w=new Set(g?.paths||h.files.map(P=>P.path));for(let P of h.files)P.comparisonPanels?.some(L=>w.has(L.path))&&w.add(P.path);if(d!==ee||n.zoom.mode!=="compare")return;let k=h.files;n.comparisonCommits=r.commits,n.compare={...r,files:k,inventory:g?.files,entries:h.entries,changedPaths:w},n.tour=xt("compare"),n.activeSceneIndex=-1,n.tourFocusFilePath=null,st(),ot(),Xe();let S=n.tour.files.find(P=>P.kind==="text-diff"&&P.path===c)||k.find(P=>P.kind==="text-diff");if(se?.view==="directory")Tn();else if(S){if(!await Tr(S,u))return}else{n.activeTourFilePath=null;let P=r.commits.map(L=>({id:`compare-${L}`,commit:L,path:"No text changes",content:"",label:L.slice(0,7),editable:!1}));ne({...rn({panels:P,files:{paths:[],currentPath:null},mutationEnabled:!1,reorderEnabled:!1,canReturnToDirectory:!0},(L,$)=>we(L.content,$.content)),history:kt(Cn(r),r.commits,null)}),n.activeTourFilePath=null,se=null,ue()}document.getElementById("tour-mode-status").textContent=k.length?S?"":"Changed files cannot be displayed as text. See the file list for details.":"No changes between these revisions.",ye()}async function He(r){if(!re()){Je(Ue());return}n.zoomSwitching||(n.zoom.mode!=="compare"?await _e("compare",r):await $r(r,n.activeTourFilePath),Vt("commits"))}function Tn(){n.compare&&(n.activeTourFilePath=null,ue(),ne(nn(n.compare.commits.map(r=>r.slice(0,7)),n.compare.entries)),qe(n.compare.entries.length?"":"No changed files for the selected comparison."),ye())}function $n(){return{commits:[n.authoredTour.range.mergeBaseOid,n.authoredTour.range.headOid]}}function Ar(){return n.historyEntries.find(r=>r.commit===n.historyCommit)?.path||n.historyPath}function _e(r,c,u){let d=m.then(()=>Li(r,c,u));return m=d.catch(()=>{}),d}async function Li(r,c,u){if(!n.zoom||n.zoomSwitching||r===n.zoom.mode||!K().includes(r))return;n.zoomSwitching=!0,++ee;let d=n.zoom.mode,h;try{h=await Be(),n.zoom.depart(h),X.stop();let g=n.zoom.enter(r,r==="history"?h:null);if(n.tourNavigatorTab=g.restore?g.location.navigatorTab||"commits":Y()?"tour":"commits",n.activeSceneIndex=-1,n.activeStepIndex=0,n.narrativeParent=null,n.directoryEvidence=null,n.sceneIntroVisible=!1,n.tourFocusFilePath=null,n.tour=xt(r),st(),Xe(),ot(),document.getElementById("tour-mode-status").textContent="",se=g.restore&&!c?g.location:null,r==="history")await Ye(u||(g.restore?g.location.path:null),n.historyCommit||g.location.commit);else if(r==="compare")await $r(c||n.compare||$n(),u||g.location.path||h.path);else if(U()[r]&&(me(Math.max(0,g.location.sceneIndex),g.location.stepIndex,{zoomLanding:!0,showIntro:g.restore?g.location.sceneIntroVisible:!0,readingKey:g.restore?g.location.readingKey:"title"}),g.location.path&&n.activeTourFilePath!==g.location.path)){let w=n.tour.files.findIndex(k=>k.path===g.location.path);w>=0&&Tt(w)}if(ye(),l&&!s){let w=new URL(window.location.href);w.hash=Y()?Ze(n.zoom.mode,at(j.find(k=>k.key===n.readingKey))):"",window.history.replaceState(null,"",w)}}catch(g){se=null,n.zoom.enter(d),n.tour=xt(d),h&&(n.activeSceneIndex=h.sceneIndex,n.activeStepIndex=h.stepIndex,n.activeTourFilePath=h.path,n.narrativeParent=h.narrativeParent,n.sceneIntroVisible=h.sceneIntroVisible,n.tourNavigatorTab=h.navigatorTab),st(),ot(),Xe(),h&&Y()&&(se=h,me(h.sceneIndex,h.stepIndex,{zoomLanding:!0,showIntro:h.sceneIntroVisible,readingKey:h.readingKey}),h.path&&n.activeTourFilePath!==h.path&&Tt(n.tour.files.findIndex(w=>w.path===h.path))),ue(),ye(),ae(g)}finally{n.zoomSwitching=!1}}async function Ri(r){if(!(!r||typeof r!="object")){if(r.type==="navigationState"){be.get(r.requestId)?.(r.navigation);return}if(r.type==="renderComplete"&&n.mode==="tour"&&r.renderRequestId===he&&$i(n.activeTourFilePath,he),r.type==="renderComplete"&&se&&r.renderRequestId===Ae){let c=se;se=null,ne({type:"restoreNavigationState",navigation:c.navigation});let u=document.getElementById("tour-narrative-content");u&&(u.scrollTop=c.narrativeScroll||0,Q=u.scrollTop),c.focusId&&document.getElementById(c.focusId)?.focus({preventScroll:!0})}if(r.type==="ready"){let c=new URLSearchParams(window.location.search),u=c.get("manifest");u||o?Dr(u):c.get("demo")==="1"&&Qr();return}if(n.mode==="tour"&&n.directoryEvidence&&Y()){if(r.type==="openDirectoryEntry"){Mn(r.relativePath);return}if(r.type==="returnToDirectory"){Dn();return}}if(n.mode==="tour"){if(n.zoom?.mode==="compare"&&["openDirectoryEntry","returnToDirectory"].includes(r.type)){if(Ne(),r.type==="returnToDirectory")Tn();else{let c=n.compare.files.find(u=>u.path===r.relativePath);c?.kind==="text-diff"?Cr(c):c&&qe(`${c.path}: ${c.reason||"This file cannot be displayed as text."}`)}return}if(r.type==="multiMovePanel")return;if(n.zoom?.mode==="history"&&["openDirectoryEntry","returnToDirectory","navigateFile"].includes(r.type)){Ne();let c=Gt();r.type==="openDirectoryEntry"&&(c.paths=[...n.historyChangedFiles]);let u=no(r,c,!0);u&&Ye(u.path,n.historyCommit).catch(ae);return}if(n.zoom?.mode==="history"&&["multiAddPanel","multiRemovePanel"].includes(r.type)){Ni(r).catch(ae);return}if(r.type==="multiSetActivePair"||r.type==="multiSetActivePanel"){Y()&&Number.isInteger(r.pairIndex)&&(document.getElementById("file-info").textContent=Bn(n.activeTourFilePath,r.pairIndex)),n.zoom?.mode==="history"?n.historyFocus=r.type==="multiSetActivePanel"?r.panelId:n.historyPanels[r.pairIndex]?.id||n.historyFocus:n.zoom?.mode==="compare"&&(n.comparisonFocus=r.type==="multiSetActivePanel"?r.panelId.replace(/^compare-/,""):n.comparisonCommits[r.pairIndex]);return}if(r.type==="historyBack"||r.type==="historyForward"){if(n.zoom?.mode!=="history")return;let c=Sn(r.type==="historyBack"?1:-1);c&&c.catch(ae);return}if(r.type==="toggleHistorySelection"&&Number.isInteger(r.index)){let c=n.displayedPanels.map(h=>h.commit),u=r.index<0?{commit:c[-r.index-1]}:n.historyEntries[r.index];if(!u?.commit)return;let d=n.comparisonDraftCommits.includes(u.commit)?n.comparisonDraftCommits.filter(h=>h!==u.commit):[...n.comparisonDraftCommits,u.commit];n.comparisonDraftCommits=d.length>=2?Er({commits:d}).commits:d,it();return}if(r.type==="compareHistoryEntry"&&Number.isInteger(r.index)){let c=n.historyEntries[r.index];c?.parentCommit&&He({commits:[c.parentCommit,c.commit],path:n.activeTourFilePath}).catch(ae);return}if(r.type==="selectHistoryEntry"&&Number.isInteger(r.index)){let c=n.historyEntries[r.index];if(c&&n.zoom?.mode==="history"){let u=n.historyPanels.find(d=>d.commit===c.commit);u&&n.historyPath?(n.historyFocus=u.id,ne({type:"focusHistoryPanel",panelId:u.id})):Ye(n.historyPath,c.commit,!1).catch(ae)}if(c&&n.zoom?.mode!=="history"){let u=n.displayedPanels.find(d=>d.commit===c.commit);u?ne({type:"focusHistoryPanel",panelId:u.id}):(n.historyCommit=c.commit,n.historyPath=n.activeTourFilePath||n.historyPath,_e("history",void 0,n.activeTourFilePath).catch(ae))}return}}if(r.type==="navigateFile"&&n.mode==="tour"){Hr(r.direction==="previous"?-1:1);return}if(r.type==="navigateTourStep"&&n.mode==="tour"){let c=r.sceneIndex,u=r.stepIndex;Number.isInteger(c)&&Number.isInteger(u)&&me(c,u,{userNavigation:!0,showIntro:!1});return}r.type==="recomputeDiff"&&n.mode==="diff"&&n.left&&n.right&&(n.left.content=r.leftContent,n.right.content=r.rightContent,ne({type:"showDiff",file1:n.left.name,file2:n.right.name,comparisonId:`web-${n.comparisonId}`,leftContent:n.left.content,rightContent:n.right.content,diffModel:we(n.left.content,n.right.content),history:null}))}}function Pi(){let r=(C,q)=>document.getElementById(C)?.addEventListener("click",()=>{Promise.resolve().then(q).catch(ae)});for(let C of["explain","question"])r(`tour-feedback-${C}`,()=>{if(!Y())return;let q=j.find(ge=>ge.key===n.readingKey);q&&bi(C,()=>yi(n.tour,q,{mode:n.zoom?.mode||"historical",location:Gr(at(q)),imageVisible:t.isVisible(),displayedEvidence:document.body.classList.contains("tour-discussion")||t.isVisible()?null:xe?.tour===n.tour?xe.context:null}))});let c=[...document.querySelectorAll(".tour-selection-more")],u=(C,q=!1)=>{C.open=!1,q&&C.querySelector("summary").focus()};for(let C of c)C.addEventListener("click",q=>{q.target.closest("button")&&u(C,!0)});document.addEventListener("click",C=>{for(let q of c)q.open&&!q.contains(C.target)&&u(q)}),document.addEventListener("keydown",C=>{if(C.key==="Escape")for(let q of c)q.open&&(C.preventDefault(),u(q,!0))}),r("tour-history-compare",()=>He({commits:n.comparisonDraftCommits})),r("tour-compare-apply",()=>He({commits:n.comparisonDraftCommits,path:n.compare?.path})),r("tour-history-parent",()=>{let C=n.historyEntries.find(q=>q.commit===n.historyCommit)?.parentCommit;if(!C){ae("This is the first commit; History already shows its comparison with the empty tree.");return}return He({commits:[C,n.historyCommit],path:Ar()})}),r("tour-history-base",()=>He({commits:[n.authoredTour.range.mergeBaseOid,n.historyCommit],path:Ar()})),r("tour-history-final",()=>He($n())),r("tour-compare-final",()=>He($n())),r("tour-compare-all",()=>He({commits:n.compare.commits}));let d=C=>{n.comparisonDraftCommits=C.filter(Boolean),it(),ne({type:"updateHistorySelection",commits:n.comparisonDraftCommits})};for(let C of["history","compare"])r(`tour-${C}-clear`,()=>d([])),r(`tour-${C}-reset`,()=>d(In()));for(let C of["wheel","pointerdown","keydown"])document.addEventListener(C,q=>{!q.isTrusted||q.target?.closest?.("#tour-mode-controls")||q.target?.closest?.(".monaco-editor, .diff-toolbar, #tour-narrative")&&Ne()},{capture:!0,passive:!0});let h=document.getElementById("web-compare-test"),g=document.getElementById("web-open-diff"),w=document.getElementById("web-open-diff3"),k=document.getElementById("web-diff-input"),S=document.getElementById("web-diff3-input"),P=document.getElementById("tour-narration"),L=document.getElementById("tour-return-focus"),$=document.getElementById("tour-search-input"),D=document.getElementById("tour-search-scope"),A=document.getElementById("tour-listen"),z=document.getElementById("tour-stop"),_=document.getElementById("tour-narration-skip-back"),te=document.getElementById("tour-narration-skip-ahead"),H=document.getElementById("tour-narration-voice"),Z=document.getElementById("tour-narration-rate");ji(),document.getElementById("tour-show-all-files")?.addEventListener("change",C=>{Y()?n.showAllTourFiles=C.target.checked:n.showAllFiles=C.target.checked,ue()}),document.getElementById("tour-files")?.addEventListener("toggle",C=>{let q=C.target;!(q instanceof HTMLDetailsElement)||!q.dataset.fileFolder||!q.isConnected||(q.open?n.collapsedFileFolders.delete(q.dataset.fileFolder):n.collapsedFileFolders.add(q.dataset.fileFolder))},!0),Wi(),Vi(),Fi(),document.getElementById("tour-navigator-tabs")?.addEventListener("click",C=>{let q=C.target instanceof Element?C.target.closest("[data-tour-navigator]"):null;q?.dataset.tourNavigator&&Vt(q.dataset.tourNavigator)}),h?.addEventListener("click",()=>{Qr()}),g?.addEventListener("click",()=>{k.value="",k.click()}),w?.addEventListener("click",()=>{S.value="",S.click()}),k?.addEventListener("change",async()=>{let C=Array.from(k.files||[]);if(C.length!==2){Ie("Select exactly 2 files for a diff.");return}await us(C)}),S?.addEventListener("change",async()=>{let C=Array.from(S.files||[]);if(C.length<1){Ie("Select one or more files.");return}await fs(C)}),document.getElementById("tour-title")?.addEventListener("click",()=>Xt("tour")),document.getElementById("tour-narrative-content")?.addEventListener("scroll",as,{passive:!0}),document.getElementById("tour-back")?.addEventListener("click",()=>Wt(-1)),document.getElementById("tour-next")?.addEventListener("click",()=>Wt(1)),P?.addEventListener("click",()=>ns()),L?.addEventListener("click",Xi),document.getElementById("tour-directory-root")?.addEventListener("click",()=>{Xt("scene"),document.getElementById("tour-directory-root").focus({preventScroll:!0})}),$?.addEventListener("input",Xe),D?.addEventListener("change",Xe),A?.addEventListener("click",Nr),z?.addEventListener("click",()=>X.stop()),_?.addEventListener("click",()=>X.skipSegment(-1)),te?.addEventListener("click",()=>X.skipSegment(1)),H?.addEventListener("change",()=>{n.narrationVoiceURI=H.value,i.setItem(x,n.narrationVoiceURI)}),Z&&(Z.value=String(n.narrationRate),Z.addEventListener("change",()=>{let C=Number(Z.value);n.narrationRate=B.has(C)?C:1,Z.value=String(n.narrationRate),i.setItem(N,String(n.narrationRate))})),document.getElementById("tour-search-results")?.addEventListener("click",C=>{let q=C.target instanceof Element?C.target.closest("[data-tour-search-result]"):null;q&&qi(Number(q.getAttribute("data-tour-search-result")))}),window.addEventListener("keydown",C=>{if(n.mode==="tour"&&(C.metaKey||C.ctrlKey)&&C.shiftKey&&C.key.toLocaleLowerCase()==="f"){C.preventDefault(),C.stopImmediatePropagation(),n.tourSidebarHidden&&Ln(!1),Vt("tour"),document.querySelector(".tour-search-disclosure")?.setAttribute("open",""),$?.focus(),$?.select();return}n.mode!=="tour"||C.metaKey||C.ctrlKey||C.altKey||es(C.target)||(C.key==="PageUp"||C.key==="ArrowLeft"?(C.preventDefault(),n.zoom?.mode==="history"?Sn(1)?.catch(ae):Wt(-1)):C.key==="PageDown"||C.key==="ArrowRight"?(C.preventDefault(),n.zoom?.mode==="history"?Sn(-1)?.catch(ae):Wt(1)):n.zoom?.mode==="history"&&["ArrowUp","ArrowDown"].includes(C.key)&&(C.preventDefault(),Hr(C.key==="ArrowUp"?-1:1)))},!0),window.addEventListener("bygone:tour-command",C=>{C.detail==="toggleNarration"&&Nr(),C.detail==="pauseNarration"&&X.pauseForExternalOwner()}),window.addEventListener("beforeunload",()=>X.dispose(),{once:!0}),An(X.state)}function Fi(){let r=document.getElementById("tour-narration-voice"),c=document.getElementById("tour-listen");if(!M){c&&(c.disabled=!0,c.title="Device narration is not supported by this browser."),r&&(r.disabled=!0),Et("Device narration unavailable");return}let u=()=>{if(n.narrationVoices=window.speechSynthesis.getVoices().filter(d=>!o||d.localService).slice().sort((d,h)=>Number(h.default)-Number(d.default)||d.lang.localeCompare(h.lang)||d.name.localeCompare(h.name)),n.narrationVoiceURI&&n.narrationVoices.length>0&&!n.narrationVoices.some(d=>d.voiceURI===n.narrationVoiceURI)&&(n.narrationVoiceURI="",i.removeItem(x)),r){let d=document.createElement("option");d.value="",d.textContent="System default voice",r.replaceChildren(d,...n.narrationVoices.map(h=>{let g=document.createElement("option");return g.value=h.voiceURI,g.textContent=`${h.name} (${h.lang})${h.default?" \u2014 default":""}`,g})),r.value=n.narrationVoiceURI,r.disabled=n.narrationVoices.length===0}};u(),window.speechSynthesis.addEventListener("voiceschanged",u)}function Di(){let r=Number(i.getItem(N));return B.has(r)?r:1}function Mi(){let r=null;return{speak(c,u){if(!M){u.onError("Device narration is not supported by this browser.");return}let d=new window.SpeechSynthesisUtterance(c.speechText),h=n.narrationVoices.find(g=>g.voiceURI===n.narrationVoiceURI)||(o?n.narrationVoices[0]:null);if(o&&!h){u.onError("No local narration voice is available.");return}h&&(d.voice=h),d.rate=n.narrationRate,d.onend=()=>{r===d&&(r=null),u.onEnd()},d.onerror=g=>{r===d&&(r=null),u.onError(Oi(g.error))},r=d,window.speechSynthesis.speak(d)},pause(){M&&window.speechSynthesis.pause()},resume(){M&&window.speechSynthesis.resume()},cancel(){r=null,M&&window.speechSynthesis.cancel()}}}function Oi(r){return r==="not-allowed"?"Device narration needs permission to play audio.":r==="language-unavailable"||r==="voice-unavailable"?"The selected device voice is unavailable.":`Device narration failed${r?`: ${r}`:"."}`}function Bi(){if(!M||n.mode!=="tour")return;let r=Lr("playback-start");r&&(n.renderedNarrationUnit=r,ts(r),X.start(r,!0))}function Nr(){X.state.kind==="playing"||X.state.kind==="paused"?X.togglePause():Bi()}function Lr(r){let c=j.find(u=>u.key===n.readingKey);return n.tour&&c?Qo(n.tour,c,{entry:r}):null}function Ui(r,c){return!!(n.tour&&Ut(j,r.readingKey,c,tt(n.tour)))}function zi(r,c){if(!n.tour)return null;let u=Ut(j,r.readingKey,c,tt(n.tour));return u?me(u.sceneIndex,u.stepIndex,{readingKey:u.key,narrationNavigation:"controller",narrationEntry:"continuous"}):null}function Hi(){o||fetch("/narration/claim",{method:"POST",cache:"no-store"}).catch(()=>{})}function An(r){let c=document.getElementById("tour-listen"),u=document.getElementById("tour-stop"),d=document.getElementById("tour-narration-skip-back"),h=document.getElementById("tour-narration-skip-ahead");if(c){c.disabled=!M||n.mode!=="tour";let g=r.kind==="playing";c.querySelector(".tour-play-pause-icon")?.setAttribute("d",g?"M7 5h4v14H7zM13 5h4v14h-4z":"m8 5 11 7-11 7Z");let w=g?"Pause narration":r.kind==="paused"?"Resume narration":"Listen from the current tour item";c.title=w,c.setAttribute("aria-label",w),document.getElementById("tour-listen-label").textContent=g?"Pause":r.kind==="paused"?"Resume":"Listen"}if(u&&(u.disabled=r.kind!=="playing"&&r.kind!=="paused"),d&&(d.disabled=!X.canSkipSegment(-1)),h&&(h.disabled=!X.canSkipSegment(1)),r.kind==="playing"||r.kind==="paused"){let g=r.segmentIndex+1,w=r.unit.segments.length;Et(`${r.kind==="paused"?"Paused":"Speaking"} \xB7 segment ${g} of ${w}`)}else r.kind==="completed"?Et("Narration complete"):r.kind==="error"?Et(r.message):M&&Et("Device voice ready")}function Et(r){let c=document.getElementById("tour-narration-status");c&&(c.textContent=r)}function _i(r,c){if(document.querySelectorAll(".tour-narration-segment.is-speaking").forEach(k=>{k.classList.remove("is-speaking","is-paused")}),!r)return;let u=[...document.querySelectorAll("[data-narration-segment-id]")].filter(k=>k.dataset.narrationSegmentId===r.id),d=u[0];if(!d||(u.forEach(k=>{k.classList.add("is-speaking"),k.classList.toggle("is-paused",c)}),c))return;let h=document.getElementById("tour-narrative-content");if(!h)return;let g=d.getBoundingClientRect(),w=h.getBoundingClientRect();(g.top<w.top+Zt()||g.bottom>w.bottom)&&(d.scrollIntoView({block:"nearest"}),Q=h.scrollTop)}let It=[];function Xe(){let r=document.getElementById("tour-search-input"),c=document.getElementById("tour-search-scope"),u=document.getElementById("tour-search-status"),d=document.getElementById("tour-search-results");if(!(!n.tour||!r||!c||!u||!d)){if(It=ti(n.tour,r.value,c.value),!r.value.trim()){u.textContent="Cmd/Ctrl+Shift+F",d.replaceChildren();return}u.textContent=`${It.length} result${It.length===1?"":"s"}`,d.replaceChildren(...It.map((h,g)=>{let w=document.createElement("button");w.type="button",w.className="tour-search-result",w.setAttribute("role","option"),w.dataset.tourSearchResult=String(g),w.title=`Open ${h.kind==="code"?`${h.label}:${h.lineNumber}`:h.label}`;let k=document.createElement("span");k.className="tour-search-location",k.textContent=h.kind==="code"?`${h.label}:${h.lineNumber}`:h.label;let S=document.createElement("span");return S.className="tour-search-preview",S.textContent=h.preview.trim(),w.append(k,S),w}))}}function qi(r){let c=It[r];if(c){if(c.kind==="narrative"){Ne(),me(c.sceneIndex,c.stepIndex??0,{readingKey:c.readingKey,showIntro:c.stepIndex===void 0});return}Un(c.fileIndex)&&window.requestAnimationFrame(()=>ne({type:"revealSearchResult",sideIndex:c.sideIndex,lineNumber:c.lineNumber,startColumn:c.startColumn,endColumn:c.endColumn}))}}function ji(){let r=document.getElementById("tour-shell"),c=document.getElementById("tour-sidebar-resizer"),u=document.getElementById("tour-sidebar-hide"),d=document.getElementById("tour-sidebar-show");!r||!c||!u||!d||(Pr(),u.addEventListener("click",()=>Ln(!0)),d.addEventListener("click",()=>Ln(!1)),c.addEventListener("pointerdown",h=>{h.preventDefault(),document.body.classList.add("is-resizing-tour-sidebar"),c.setPointerCapture?.(h.pointerId);let g=k=>Rr(k.clientX),w=()=>{document.body.classList.remove("is-resizing-tour-sidebar"),window.removeEventListener("pointermove",g),window.removeEventListener("pointerup",w),window.removeEventListener("pointercancel",w),i.setItem(y,String(n.tourSidebarWidth))};window.addEventListener("pointermove",g),window.addEventListener("pointerup",w),window.addEventListener("pointercancel",w)}),c.addEventListener("keydown",h=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(h.key))return;h.preventDefault();let g=n.tourSidebarWidth;h.key==="Home"?g=b:h.key==="End"?g=Nn():g+=h.key==="ArrowLeft"?-16:16,Rr(g),i.setItem(y,String(n.tourSidebarWidth))}))}function Ki(){let r=Number.parseInt(i.getItem(y)||"",10);return Number.isFinite(r)?Math.min(E,Math.max(b,r)):300}function Nn(){return Math.max(b,Math.min(E,Math.floor(window.innerWidth*.6)))}function Rr(r){n.tourSidebarWidth=Math.min(Nn(),Math.max(b,Math.round(r))),Pr(),window.dispatchEvent(new Event("resize"))}function Pr(){document.documentElement.style.setProperty("--tour-rail-width",`${n.tourSidebarWidth}px`);let r=document.getElementById("tour-sidebar-resizer");r?.setAttribute("aria-valuemax",String(Nn())),r?.setAttribute("aria-valuenow",String(n.tourSidebarWidth))}function Ln(r){n.tourSidebarHidden=r,document.body.classList.toggle("tour-sidebar-hidden",r);let c=document.getElementById("tour-sidebar-show");c&&(c.hidden=!r),window.dispatchEvent(new Event("resize"))}function Wi(){let r=document.getElementById("tour-narrative-resizer");r&&(Pn(),r.addEventListener("pointerdown",c=>{if(c.button!==0)return;c.preventDefault(),document.body.classList.add("is-resizing-tour-narrative"),r.setPointerCapture?.(c.pointerId),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-start"));let u=document.getElementById("tour-narrative").getBoundingClientRect().top,d=g=>Fr(g.clientY-u),h=()=>{document.body.classList.remove("is-resizing-tour-narrative"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",h),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-end")),i.setItem(I,String(n.tourNarrativeHeight))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",h),window.addEventListener("pointercancel",h)}),r.addEventListener("keydown",c=>{if(!["ArrowUp","ArrowDown","Home","End"].includes(c.key))return;c.preventDefault();let u=c.key==="Home"?T:c.key==="End"?Rn():n.tourNarrativeHeight+(c.key==="ArrowUp"?-16:16);Fr(u),i.setItem(I,String(n.tourNarrativeHeight))}),window.addEventListener("resize",Pn))}function Gi(){let r=Number.parseInt(i.getItem(I)||"",10);return Number.isFinite(r)?r:Math.min(window.innerHeight*.38,360)}function Rn(){return Math.max(T,window.innerHeight-document.getElementById("tour-mode-controls").offsetHeight-v)}function Fr(r){n.tourNarrativeHeight=r,Pn()}function Pn(){n.tourNarrativeHeight=Math.min(Rn(),Math.max(T,Math.round(n.tourNarrativeHeight))),document.getElementById("tour-narrative").style.height=`${n.tourNarrativeHeight}px`;let r=document.getElementById("tour-narrative-resizer");r?.setAttribute("aria-valuemax",String(Rn())),r?.setAttribute("aria-valuenow",String(n.tourNarrativeHeight)),r&&(r.style.top=`calc(var(--workspace-toolbar-height, 0px) + ${n.tourNarrativeHeight-4}px)`)}function Vi(){let r=document.getElementById("tour-narrative");if(!r)return;let c=()=>{let u=r.hidden?0:Math.ceil(r.getBoundingClientRect().height);document.documentElement.style.setProperty("--tour-narrative-height",`${u}px`),Xr(),Zt(),window.dispatchEvent(new Event("resize"))};new ResizeObserver(c).observe(r),c()}async function Dr(r){Ie("Loading change tour\u2026");let c=xi(r),u={...n,historyEntries:[...n.historyEntries],fileHistoryCache:new Map(n.fileHistoryCache),displayedPanels:[...n.displayedPanels],historyPanels:[...n.historyPanels],comparisonCommits:[...n.comparisonCommits],comparisonDraftCommits:[...n.comparisonDraftCommits]},d=document.body.className,h=document.getElementById("tour-shell")?.hidden,g=document.getElementById("tour-narrative")?.hidden,w=document.getElementById("tour-mode-controls")?.hidden,k=he,S=se,P=Ae,L=ee;try{X.stop();let $=o?.manifest;if(!o){let C=await fetch(r,{cache:"no-store"});if(!C.ok)throw new Error(`Manifest request failed (${C.status}).`);$=await C.json()}let D=Ko($,{exported:!!o}),A=Jn(window.location.hash);A&&Vn(D,A.mode,A.focus);let _=U(D).deconstructed?"deconstructed":"historical",te=re(D)?(await pe("list",{commit:D.range.headOid},c,D)).entries:[];n.tour=D,n.authoredTour=D,n.historyPrefix=c,n.zoom=new bn(_),n.historyEntries=te,n.historyCommit=null,n.historyPath=null,n.historyPanels=[],n.historyFocus=null,n.historyDiff=null,n.historyChangedFiles=new Set,n.historyFiles=null,n.showAllFiles=!1,n.showAllTourFiles=!1,n.collapsedFileFolders=new Set,n.revealedFilePath=null,n.zoom&&(n.tour=xt(_)),n.mode="tour",document.body.classList.add("tour-mode"),st(),ot(),Xe();let H=new URLSearchParams(window.location.search),Z=gr(n.tour.scenes,H.get("scene"),H.get("step"));if(me(Z.sceneIndex,Z.stepIndex,{showIntro:H.get("view")==="overview"||!H.get("step"),readingKey:!H.get("scene")&&!H.get("step")?"title":void 0}),["tour","chapter","conclusion"].includes(H.get("view"))&&Xt(H.get("view")),n.zoom){let q={explanation:"deconstructed",revisions:"historical",final:Le()?"historical":"compare"}[H.get("mode")]||H.get("mode");if(q==="history"&&K().includes("history"))n.historyPath=H.get("file"),n.tourNavigatorTab="commits",n.zoom.enter("history"),n.tour=xt("history"),st(),ot(),await Ye(n.historyPath,H.get("commit"));else if(q==="compare"&&K().includes("compare")){let Se=H.get("commits")?.split(",").filter(Boolean);await _e("compare",{commits:Se?.length?Se:[H.get("from")||n.authoredTour.range.mergeBaseOid,H.get("to")||n.authoredTour.range.headOid],...H.get("scope")?{path:H.get("scope")}:{}},H.get("file")),H.get("view")==="directory"&&Tn()}else if(q&&q!==n.zoom.mode&&K().includes(q)){await _e(q);let Se=gr(n.tour.scenes,H.get("scene"),H.get("step"));me(Se.sceneIndex,Se.stepIndex,{showIntro:H.get("view")==="overview"||!H.get("step"),readingKey:!H.get("scene")&&!H.get("step")?"title":void 0}),["tour","chapter","conclusion"].includes(H.get("view"))&&Xt(H.get("view"))}let ge=wt;wt=null,de&&ge&&ge!==n.zoom.mode&&K().includes(ge)&&await _e(ge)}return n.directoryEvidence&&H.get("file")&&Mn(H.get("file")),An(X.state),n.workspacePromptStatus="",ve(),Ie(""),A?await Vr(A):Y()&&window.history.replaceState(null,"",Ze(n.zoom.mode,at(j.find(C=>C.key===n.readingKey)))),document.getElementById("export-loading")?.remove(),window.__BYGONE_EXPORT_READY__=!!o,l=!0,!0}catch($){let D=document.getElementById("export-loading");D&&(D.textContent=`Could not open export: ${$.message}`),Object.assign(n,u),he=k,se=S,Ae=P,ee=L,document.body.className=d;let A=document.getElementById("tour-shell");A&&h!==void 0&&(A.hidden=h);let z=document.getElementById("tour-narrative");z&&g!==void 0&&(z.hidden=g);let _=document.getElementById("tour-mode-controls");return _&&w!==void 0&&(_.hidden=w),n.mode==="tour"&&n.tour&&(st(),ot(),Xe(),ve()),Ie(`Could not load change tour: ${$ instanceof Error?$.message:String($)}`),!1}}function st(){Jt();let r=n.tour;if(!r)return;let c=document.getElementById("tour-shell"),u=document.getElementById("tour-title"),d=document.getElementById("tour-source"),h=document.getElementById("tour-range"),g=document.getElementById("tour-stats"),w=document.getElementById("tour-authoring-coverage"),k=document.getElementById("tour-scenes"),S=document.getElementById("tour-scene-count"),P=document.getElementById("tour-files"),L=document.getElementById("tour-file-count");if(!c||!u||!d||!h||!g||!w||!k||!S||!P||!L)throw new Error("Presenter UI is incomplete.");c.hidden=!1,u.textContent=r.title,document.title=oi(r),r.sourceUrl?(d.href=r.sourceUrl,d.hidden=!1):(d.removeAttribute("href"),d.hidden=!0);let $=jr(r.range.baseRef),D=jr(r.range.headRef),A=r.range.headOid.slice(0,7);if(h.textContent=`${Y()?"Tour range: ":""}${$} \u2192 ${D}${D===A?"":` \xB7 ${A}`}`,g.textContent=`${Nt(r.summary.changedFiles,"file")} \xB7 +${r.summary.additions} \u2212${r.summary.deletions} \xB7 ${Nt(r.summary.commitCount,"commit")}`,Ji(w,r.authoringCoverage),gi(document.getElementById("tour-audience"),Y()?r:null),S.textContent=Y()&&r.scenes.length?String(r.scenes.length):"",L.textContent=String(r.files.length),k.replaceChildren(),Y()){Hn();let _=je("Intro","Read the introduction and tour route",()=>Ee(j.find(te=>te.kind==="title")));_.className="tour-scene",_.dataset.readingLink="title",k.append(_)}let z=new Map(r.scenes.map(_=>[_.id,_]));for(let _ of r.chapters){let te=Kr(`chapter:${_.id}`,`${r.chapters.indexOf(_)+1}. ${_.title}`,"tour-chapter-link",()=>{let Z=j.find(C=>C.kind==="chapter"&&C.chapterId===_.id)||j.find(C=>C.kind==="scene"&&_.sceneIds.includes(r.scenes[C.sceneIndex]?.id));Z&&Ee(Z)}),H=te.children;k.append(te.group);for(let Z of _.sceneIds){let C=z.get(Z);if(!C)continue;let q=r.scenes.indexOf(C),ge=Kr(`scene:${C.id}`,C.title,"tour-scene",()=>me(q,0,{userNavigation:!0,showIntro:!0})),Se=ge.link;Se.replaceChildren(),Se.dataset.sceneId=C.id,C.kind==="text-diff"&&(Se.dataset.filePath=C.path),ge.link.title=`Open scene: ${C.kind==="text-diff"?C.path:C.title}`;let _n=document.createElement("span");_n.className="tour-scene-copy";for(let[Lt,ct]of[["tour-scene-title",`${q+1}. ${C.title}`],["tour-scene-path",C.kind==="text-diff"?C.path:C.kind==="deconstructed-diff"?`${Nt(C.panels.length-1,"comparison stage")} \xB7 ${Nt(C.steps.length,"tour slide")}`:ke(C)?Nt(C.steps.length,C.steps.every(Pe=>Pe.image)?"image":"step"):"Discussion"],["tour-scene-note",C.takeaway]]){let Pe=document.createElement("span");Pe.className=Lt,Pe.textContent=ct,_n.append(Pe)}if(Se.append(_n),H.append(ge.group),ke(C)){let Lt=ge.children;Lt.classList.add("tour-outline-steps"),Lt.dataset.sceneId=C.id,C.steps.forEach((ct,Pe)=>{let Ke=document.createElement("button");Ke.type="button",Ke.className="tour-outline-step",Ke.dataset.sceneId=C.id,Ke.dataset.stepIndex=String(Pe);let hs=C.kind==="deconstructed-diff"?`Stage ${(ct.stageIndex??ct.pairIndex)+1}: `:"";Ke.textContent=`${Pe+1}. ${ct.title}`,Ke.title=`${hs}${ct.title}`,Ke.addEventListener("click",()=>me(q,Pe,{userNavigation:!0,showIntro:!1})),Lt.append(Ke)})}else ge.toggle.hidden=!0}}if(Y()&&r.conclusion){let _=je("Conclusion",`Read ${r.conclusion.title}`,()=>Ee(j.find(te=>te.kind==="conclusion")));_.className="tour-scene",_.dataset.readingLink="conclusion",k.append(_)}Fn(),Vt(n.tourNavigatorTab)}function Fn(){let r=n.tour,c=document.getElementById("tour-files");document.getElementById("tour-file-count").textContent=String(r.files.length),c.replaceChildren(Mr(mi(r.files,d=>d.path),(d,h,g)=>{let w=document.createElement("button");w.type="button",w.className=`tour-file${d.kind==="omitted"?" is-omitted":""}`,w.dataset.filePath=d.path,w.disabled=d.kind==="omitted",w.title=d.kind==="omitted"?`${d.path}: ${d.reason}`:`Open file: ${d.path}`,d.kind==="text-diff"&&w.addEventListener("click",()=>Tt(h));let k=document.createElement("span");k.className="tour-file-marker",k.textContent=d.kind==="omitted"?"\xD7":zn(d.changeKind);let S=document.createElement("span");S.className="tour-file-copy";let P=document.createElement("span");P.className="tour-file-path",P.textContent=g;let L=document.createElement("span");return L.className="tour-file-meta",L.textContent=d.kind==="omitted"?`Not rendered \xB7 ${d.reason}`:Number.isFinite(d.additions)?`${Yt(d.changeKind)} \xB7 +${d.additions} \u2212${d.deletions}`:Yt(d.changeKind),S.append(P,L),w.append(k,S),w}));let u=document.createElement("div");u.className="history-rail-empty",u.dataset.fileTreeEmpty="",c.append(u),ue()}function Mr(r,c){let u=document.createElement("ul");u.className="file-tree";for(let d of r.folders){let h=document.createElement("li"),g=document.createElement("details");g.dataset.fileFolder=d.path,g.open=!n.collapsedFileFolders.has(d.path);let w=document.createElement("summary"),k=document.createElement("span");k.className="tour-file-path",k.textContent=d.name,w.append(k),w.title=d.path,g.append(w,Mr(d,c)),h.append(g),u.append(h)}for(let{item:d,index:h,name:g}of r.files){let w=document.createElement("li");w.append(c(d,h,g)),u.append(w)}return u}function Ji(r,c){if(r.replaceChildren(),r.hidden=!c,!c)return;let u=[{metric:"walkthrough",label:"Anchored diff hunks",covered:c.walkthrough.coveredUnits,total:c.walkthrough.includedUnits,percent:c.walkthrough.coveragePercent,description:"Distinct change hunks referenced by authored base/head focus anchors. Revision-stack steps are not counted."},...c.explanationAssignments.map(d=>({metric:"assignment",label:c.explanationAssignments.length>1?`Deconstructed assignment \xB7 ${d.sceneId}`:"Deconstructed assignment",covered:d.completeUnits,total:d.totalUnits,percent:d.assignmentPercent,description:`${d.assignedUnits} assigned, ${d.excludedUnits} explicitly excluded.`}))];for(let d of u){let h=document.createElement("div");h.className="tour-coverage-item",h.dataset.metric=d.metric,h.dataset.tooltip=d.description,h.tabIndex=0,h.setAttribute("aria-description",d.description);let g=document.createElement("div");g.className="tour-coverage-heading";let w=document.createElement("span");w.textContent=d.label;let k=document.createElement("strong");k.textContent=`${d.covered}/${d.total} \xB7 ${d.percent}%`,g.append(w,k);let S=document.createElement("div");S.className="tour-coverage-meter",S.setAttribute("role","progressbar"),S.setAttribute("aria-label",d.label),S.setAttribute("aria-valuemin","0"),S.setAttribute("aria-valuemax","100"),S.setAttribute("aria-valuenow",String(d.percent));let P=document.createElement("span");P.style.width=`${d.percent}%`,S.append(P),h.append(g,S),r.append(h)}}let xe=null;function me(r,c=0,u={}){let d=n.tour;if(!d||u.readingKey!=="conclusion"&&(r<0||r>=d.scenes.length))return null;if(t.clear(),u.userNavigation&&Ne(),n.zoom?.mode==="history"&&!n.zoomSwitching){let z=d.scenes[r],_=z.path||z.steps?.[c]?.file||n.activeTourFilePath;return Ye(_,n.historyCommit).catch(te=>{document.getElementById("tour-mode-status").textContent=te.message}),null}let h=xe?.tour===d&&!u.zoomLanding&&!s?xe.context:null;n.directoryEvidence=null,qe(""),Jt(),Hn();let g=j.find(z=>z.key===u.readingKey)||yn(j,r,c,u.showIntro?"overview":null);g&&g.kind!=="step"&&g.kind!=="conclusion"&&g.kind!=="title"&&tt(d)&&(g=yn(j,g.sceneIndex,0)),g&&(r=g.sceneIndex,c=g.stepIndex);let w=d.scenes[r],k=en(d,g);document.body.classList.toggle("tour-discussion",k==="narrative");let S=g.kind==="title"||g.kind==="chapter"||g.kind==="conclusion",P=document.body.classList.contains("tour-bookend")!==S;document.body.classList.toggle("tour-bookend",S),n.readingKey=g?.key||"title",n.sceneIntroVisible=g?.kind!=="step",n.narrativeParent=g?.kind==="conclusion"?"conclusion":g?.kind==="title"?"tour":g?.kind==="chapter"?"chapter":null,n.activeSceneIndex=r,n.activeStepIndex=ke(w)?Math.min(Math.max(c,0),Math.max(w.steps.length-1,0)):0,n.tourFocusFilePath=!w||n.narrativeParent?null:w.kind==="text-diff"?w.path:w.kind==="walkthrough"?w.steps[n.activeStepIndex]?.diff.path??null:Re(w)?w.steps[n.activeStepIndex]?.file??null:null;let L=w?_r(d,r):null;ss();let $=u.preserveNarration&&X.engaged?X.state.unit:Lr(u.narrationEntry||"playback-start");n.renderedNarrationUnit=$,Yr(w,L,$),(!u.fromReadingScroll||P)&&Zr(n.readingKey),$&&!u.zoomLanding&&!u.preserveNarration&&(!n.zoom||Y())&&(u.narrationNavigation==="linear"?X.followLinearNavigation($):u.narrationNavigation!=="controller"&&X.followDirectNavigation($)),ye();let D=fe(d,g,n.zoom?.mode);k==="overview"?xe={tour:d,context:D}:k!=="narrative"?xe=h?{tour:d,context:h}:null:g.kind!=="chapter"&&(xe=null);let A=J.get(g.key)?.querySelector(".tour-scene-orientation");return A&&D&&(A.textContent=qn(h,D)),k==="overview"&&Dn()?$:k==="narrative"?(++he,n.displayedPanels=[],n.activeTourFilePath=null,ne({type:"updateCommitHistory",history:Ir()}),document.body.classList.add("tour-discussion"),n.tourFocusFilePath=null,ue(),ve(),$):(document.body.classList.remove("tour-discussion"),w.kind==="walkthrough"?(Br(w),$):Re(w)?(Ur(w),$):(St(w,Kt(w.path)),$))}function qe(r){let c=document.getElementById("status-banner");c.textContent=r,c.hidden=!r}function Dn(){let r=n.tour?.scenes[n.activeSceneIndex];if(!Y()||!r||tt(n.tour)||n.narrativeParent||!r.overview)return!1;let c=Qt(n.tour,r);n.directoryEvidence=c,n.activeTourFilePath=null,ue(),document.body.classList.remove("tour-discussion");let u=fe(n.tour,j.find(d=>d.key===n.readingKey),n.zoom?.mode);return ne(nn(u.labels,c.entries)),document.getElementById("file-info").textContent=ut(u),qe(c.entries.length?"":"No changed files in this directory for the selected comparison."),ye(),!0}function Mn(r){let c=n.directoryEvidence;if(!c)return!1;let u=c.files.find(d=>d.path===r);if(!u){let d=c.omitted.find(h=>h.path===r);return qe(d?`${r}: ${d.reason}`:"This file has no change in the overview comparison."),!1}return Ne(),qe(""),St(u,[],`directory-${n.tour.scenes[n.activeSceneIndex].id}-${r}`),ye(),!0}function Kt(r){let c=n.tour;return!c||!r?[]:ni(c,r,n.activeSceneIndex,n.activeStepIndex)}function Yi(r,c){let u=n.tour;return!u||!r?[]:ri(u,r,n.activeSceneIndex,n.activeStepIndex,(d,h)=>wr(c?.[d]?.diffModel,h))}function On(r){return`file::${r}`}function St(r,c=[],u=On(r.path),d=null,h=null){if(document.body.classList.remove("tour-discussion"),!n.tour)return;t.clear(),n.activeTourFilePath=n.zoom?.mode==="history"&&n.historyPath||r.path,ue();let w=we(r.leftContent,r.rightContent),k=Or(r,r.leftLabel,n.zoom?.mode==="compare"?"from":"base"),S=Or(r,r.rightLabel,n.zoom?.mode==="compare"?"to":"head"),P=c.find($=>$.active)||h&&{side:h.revision==="head"?"right":"left",startLine:h.startLine},L=r.changeKind==="added"?{left:!1,right:!0}:r.changeKind==="deleted"?{left:!0,right:!1}:{left:!0,right:!0};ne({type:"showDiff",file1:`1. ${k}`,file2:`2. ${S}`,comparisonId:`tour-${u}`,leftContent:r.leftContent,rightContent:r.rightContent,canReturnToDirectory:!!n.directoryEvidence,sourceInfo:{leftPath:r.previousPath||r.path,rightPath:r.path},fileExists:L,diffModel:w,history:d,fileNavigation:{canGoPrevious:!!Ct(-1),canGoNext:!!Ct(1)},editableSides:{left:!1,right:!1},comparisonSummary:Bn(r.path,void 0,!n.directoryEvidence),initialChangeIndex:P?qr(w,P.side,P.startLine):r.focusChangeIndex,tourAnnotations:c})}function Bn(r,c,u=!1){if(!Y())return r;let d=j.find(H=>H.key===n.readingKey),h=d&&fe(n.tour,d,n.zoom?.mode),g=c===void 0?d:{kind:"step",sceneIndex:n.activeSceneIndex,stepIndex:n.activeStepIndex},w=g&&fe(n.tour,g,n.zoom?.mode,c),k=u||!w?eo(n.tour,r):w,S={...k,scope:r,scopeKey:JSON.stringify([r]),overview:!1},P=xe?.tour===n.tour?xe.context:null,L=P&&(P.comparisonKey!==S.comparisonKey||P.scopeKey!==S.scopeKey)?qn(P,S):ut(S);xe={tour:n.tour,context:S};let $=h,D=d&&en(n.tour,d)==="preview"&&$?.scope===r&&$.comparisonKey===k.comparisonKey,A=d&&n.tour.scenes[d.sceneIndex],z=A&&ke(A)?A.steps[d.kind==="step"?d.stepIndex:0]:null;return`${z&&$?.scope===r&&$.comparisonKey===k.comparisonKey?`${D?"Coming up":"Evidence for"}: ${Fe(n.tour,{kind:"step",key:`step:${A.id}:${z.id}`,sceneIndex:d.sceneIndex,stepIndex:d.kind==="step"?d.stepIndex:0})} \xB7 `:""}${L}`}function Or(r,c,u){if(n.zoom?.mode==="history")return c;let d=c.startsWith(r.path)?c.slice(r.path.length).trim():c.trim();return d?`${u} ${d}`:u}function Br(r){let c=r.steps[n.activeStepIndex];if(c){if(c.image){++he,n.displayedPanels=[],n.activeTourFilePath=c.diff.path,t.show(c.image,c.title),ue();return}St(c.diff,n.sceneIntroVisible?[]:Kt(c.diff.path),On(c.diff.path),null,n.sceneIntroVisible?c.focus:null)}}function Ur(r){let c=r.steps[n.activeStepIndex];c&&zr(r,c.file,c)}function zr(r,c,u){document.body.classList.remove("tour-discussion");let d=$t(r,c);if(!u||!d)return;n.activeTourFilePath=d.path,ue();let h=d.panels.map((A,z)=>({id:`${r.id}-${d.path}-${A.id}`,commit:r.kind==="stacked-diff"?At(r)[z].oid:void 0,label:A.label,path:A.path||d.path,content:A.content,savedContent:A.content,dirty:!1,editable:!1,stackId:At(r)[z].id})),g=jn(h,(A,z)=>we(A.content,z.content)),w=n.sceneIntroVisible?[]:Yi(d.path,g),k=w.find(A=>A.active),S=k?.pairIndex??u.pairIndex,P=k?.side??u.side,L=k?.startLine??u.startLine,$=g[S]?.diffModel,D=$&&L?qr($,P,L):0;ne({type:"showMultiDiff",panels:h,pairs:g,activePanelId:h[S+(P==="right"?1:0)]?.id,activePairIndex:S,initialChangeIndex:D,revealFirstChangeInEachPanel:r.kind==="deconstructed-diff",history:null,fileNavigation:{canGoPrevious:!!Ct(-1),canGoNext:!!Ct(1)},mutationEnabled:!1,comparisonSummary:Bn(d.path,S),tourAnnotations:w})}function Wt(r){if(!Y())return!1;let c=Ut(j,n.readingKey,r,tt(n.tour));return c?(Ee(c,!1,!0),!0):!1}function Gt(){return{paths:n.tour.files.filter(r=>r.kind==="text-diff").map(r=>r.path),currentPath:n.activeTourFilePath,changedPaths:n.zoom?.mode==="compare"?n.compare?.changedPaths:n.historyChangedFiles}}function Ct(r){let c=n.tour;if(!c||r!==-1&&r!==1)return null;let u=c.scenes[n.activeSceneIndex];if(n.zoom?.mode==="history"||n.zoom?.mode==="compare"){let d=We(Gt(),r);return d?{fileIndex:c.files.findIndex(h=>h.path===d),path:d}:null}if(n.directoryEvidence){let d=n.directoryEvidence.files,h=d.findIndex(k=>k.path===n.activeTourFilePath),g=d[h+r],w=g?c.files.findIndex(k=>k.path===g.path):-1;return w>=0?{fileIndex:w,path:g.path}:null}if(Re(u)){let d=u.steps[n.activeStepIndex]?.pairIndex;if(!Number.isInteger(d))return null;let h=c.files.flatMap(k=>{if(k.kind!=="text-diff")return[];let S=$t(u,k.path);return S?[S]:[]}),g=Vo(h,d,n.activeTourFilePath,r);if(!g)return null;let w=c.files.findIndex(k=>k.kind==="text-diff"&&k.path===g.path);return w>=0?{fileIndex:w,path:g.path}:null}return Jo(c.files,n.activeTourFilePath,r)}function Hr(r){let c=Ct(r);return c?Tt(c.fileIndex):!1}function Un(r,c=!0){let u=n.tour?.files[r];return!u||u.kind!=="text-diff"?!1:(c&&X.interruptForExploration(),n.directoryEvidence=null,St(u,Kt(u.path),On(u.path)),!0)}function Tt(r){let c=n.tour?.files[r];if(!c||c.kind!=="text-diff")return!1;if(Ne(),n.zoom?.mode==="history")return Ye(c.path,n.historyCommit).catch(d=>{document.getElementById("tour-mode-status").textContent=d.message}),!0;if(n.zoom?.mode==="compare")return Tr(c).catch(d=>{document.getElementById("tour-mode-status").textContent=d.message}),!0;if(n.directoryEvidence&&Y())return Mn(c.path);n.zoomSwitching||X.interruptForExploration();let u=n.tour?.scenes[n.activeSceneIndex];if(Re(u)){let d=u.steps[n.activeStepIndex];return d&&$t(u,c.path)?(zr(u,c.path,d),!0):!1}return Un(r,!1)}function $t(r,c){let u=r?.files?.find(g=>g.path===c);if(u||r?.kind!=="deconstructed-diff")return u;let d=n.tour?.files.find(g=>g.kind==="text-diff"&&g.path===c);if(!d||d.kind!=="text-diff")return null;let h=d.changeKind!=="deleted";return{path:d.path,panels:At(r).map(g=>({id:g.id,label:`${g.label} / ${d.path}${h?"":" (absent)"}`,path:h?d.path:void 0,content:h?d.rightContent:"",exists:h}))}}function Xi(){if(n.narrativeParent)return!!me(n.activeSceneIndex,n.activeStepIndex,{readingKey:n.readingKey,preserveNarration:!0});if(n.directoryEvidence)return Dn();let r=n.tour?.scenes[n.activeSceneIndex];if(!r||!n.tourFocusFilePath)return!1;if(r.kind==="walkthrough")Br(r);else if(Re(r))Ur(r);else if(r.kind==="text-diff")St(r,Kt(r.path));else return!1;return!0}function Vt(r){if(!["tour","files","commits"].includes(r))return;let c=Y()&&!!n.tour?.scenes.length;r==="tour"&&!c&&(r="commits"),n.tourNavigatorTab=r,document.querySelectorAll("[data-tour-navigator]").forEach(u=>{let d=u.dataset.tourNavigator===r;u.disabled=u.dataset.tourNavigator==="tour"&&!c,u.classList.toggle("is-active",d),u.setAttribute("aria-selected",String(d)),u.tabIndex=d?0:-1}),document.querySelectorAll("[data-tour-navigator-panel]").forEach(u=>{u.hidden=u.dataset.tourNavigatorPanel!==r}),window.dispatchEvent(new CustomEvent("bygone:present-navigator-change",{detail:{tab:r}})),window.dispatchEvent(new Event("resize"))}function Jt(){let r=!!(n.directoryEvidence&&Y()),c=r?n.activeTourFilePath:null;document.body.classList.toggle("tour-directory-overview",r),document.body.classList.toggle("tour-directory-file-open",!!c),document.getElementById("tour-directory-breadcrumb").hidden=!r;let u=document.getElementById("tour-directory-root");c?u.removeAttribute("aria-current"):u.setAttribute("aria-current","location"),document.getElementById("tour-directory-separator").hidden=!c;let d=document.getElementById("tour-directory-file");d.textContent=c||"",d.hidden=!c;let h=document.getElementById("tour-directory-narration-context");h.hidden=!c,h.textContent=`Narration describes the ${n.narrativeParent||"overview"}`}function ue(){Jt();let r=n.tour?.scenes[n.activeSceneIndex],c=Re(r)?r.steps[n.activeStepIndex]:null,u=new Map(n.tour?.files.map($=>[$.path,$]));document.querySelectorAll(".tour-file").forEach($=>{let D=$.dataset.filePath;$.classList.toggle("is-active",D===n.activeTourFilePath),$.classList.toggle("is-tour-focus",!n.directoryEvidence&&D===n.tourFocusFilePath),$.classList.remove("is-comparison-changed","is-comparison-empty"),delete $.dataset.comparisonState;let A=u.get(D);$.classList.toggle("is-omitted",A?.kind==="omitted"),$.disabled=A?.kind==="omitted"||!!(n.directoryEvidence&&!n.directoryEvidence.files.some(H=>H.path===D)),D===n.activeTourFilePath?$.setAttribute("aria-current","true"):$.removeAttribute("aria-current");let z=$.querySelector(".tour-file-marker"),_=$.querySelector(".tour-file-meta");if(n.directoryEvidence&&$.disabled&&A?.kind==="text-diff"){let H="Not in this overview comparison";$.setAttribute("title",`${D} \xB7 ${H}`),$.setAttribute("aria-label",`${D}, ${H}`),_&&(_.textContent=H),z&&(z.textContent="\u25CB");return}if(n.directoryEvidence&&A?.kind==="text-diff"){let H=n.directoryEvidence.files.find(C=>C.path===D),Z=`${Yt(H.changeKind)} in overview`;$.setAttribute("title",`${D} \xB7 ${Z}`),$.setAttribute("aria-label",`${D}, ${Z}`),_&&(_.textContent=Z),z&&(z.textContent=zn(H.changeKind));return}let te=n.zoom?.mode==="history"?n.historyChangedFiles:n.zoom?.mode==="compare"?n.compare?.changedPaths:null;if(te&&A?.kind==="text-diff"){let H=te.has(D),Z=H?"Changed in this comparison":"Unchanged in this comparison";$.classList.add(H?"is-comparison-changed":"is-comparison-empty"),$.setAttribute("title",`${D} \xB7 ${Z}`),$.setAttribute("aria-label",`${D}, ${Z}`),_&&(_.textContent=Z),z&&(z.textContent=H?"M":"\u25CB");return}if(c&&A?.kind==="text-diff"){let H=$t(r,D);if(H){let C=mr(H,c.pairIndex),q=Zi(C);$.dataset.comparisonState=C,$.classList.add(q.changed?"is-comparison-changed":"is-comparison-empty"),$.setAttribute("title",`${A.path} \xB7 ${q.label}`),$.setAttribute("aria-label",`${A.path}, ${q.label}`),z&&(z.textContent=q.marker),_&&(_.textContent=q.label);return}$.disabled=!0;let Z="Not included in this tour comparison";$.setAttribute("title",`${D} \xB7 ${Z}`),$.setAttribute("aria-label",`${D}, ${Z}`),z&&(z.textContent="\u25CB"),_&&(_.textContent=Z);return}if(A){let H=A.kind==="omitted"?`${A.path}: ${A.reason}`:`Open file: ${A.path}`;$.setAttribute("title",H),$.setAttribute("aria-label",H),z&&(z.textContent=A.kind==="omitted"?"\xD7":zn(A.changeKind)),_&&(_.textContent=A.kind==="omitted"?`Not rendered \xB7 ${A.reason}`:`${Yt(A.changeKind)} \xB7 +${A.additions} \u2212${A.deletions}`)}});let d=document.getElementById("tour-files"),h=Y(),g=!h||!!(c||n.directoryEvidence),w=!g||(h?n.showAllTourFiles:n.showAllFiles),k=0;d.querySelectorAll(".tour-file").forEach($=>{let D=$.dataset.filePath,A=n.directoryEvidence?n.directoryEvidence.files.some(z=>z.path===D):n.zoom?.mode==="history"?n.historyChangedFiles.has(D):n.zoom?.mode==="compare"?n.compare?.changedPaths.has(D):c?$.classList.contains("is-comparison-changed"):!0;$.parentElement.hidden=!w&&!A,$.parentElement.hidden||k++});for(let $ of[...d.querySelectorAll("details[data-file-folder]")].reverse())$.parentElement.hidden=![...$.querySelector(":scope > ul").children].some(D=>!D.hidden);d.querySelector("[data-file-tree-empty]").hidden=k>0,d.querySelector("[data-file-tree-empty]").textContent=w?"No files":"No changed files",d.setAttribute("aria-label",w?h?"Tour files":o?"Included files":"Files in selected revisions":"Changed files");let S=document.getElementById("tour-file-filter");S.hidden=!g,S.title=h?"Include tour files unchanged in this step comparison":o?"Include unchanged files packaged in this export":"Include unchanged files from the selected revisions",document.getElementById("tour-file-filter-label").textContent=h?"Show unchanged tour files":o?"Show all included files":"Show all files",document.getElementById("tour-show-all-files").checked=h?n.showAllTourFiles:n.showAllFiles,document.getElementById("tour-visible-file-count").textContent=`${k} / ${n.tour.files.length}`;let P=d.querySelector(".tour-file.is-active");if(n.revealedFilePath!==n.activeTourFilePath&&P&&!P.parentElement.hidden){for(let $=P.closest("details");$;$=$.parentElement.closest("details"))$.open=!0,n.collapsedFileFolders.delete($.dataset.fileFolder);P.scrollIntoView({block:"nearest"})}n.revealedFilePath=n.activeTourFilePath;let L=document.getElementById("tour-return-focus");if(L){let $=Y(),D=r?.kind==="walkthrough"&&r.steps[n.activeStepIndex]?.image;L.hidden=!$||!!n.directoryEvidence||(n.narrativeParent?!n.activeTourFilePath:!n.tourFocusFilePath||(D?t.isVisible():n.activeTourFilePath===n.tourFocusFilePath)),L.textContent=n.narrativeParent?"Return to passage":"Return to tour focus"}}function Zi(r){return{"modified-here":{label:"Modified here",marker:"\u2022",changed:!0},"created-here":{label:"Created here",marker:"+",changed:!0},"deleted-here":{label:"Deleted here",marker:"\u2212",changed:!0},"unchanged-here":{label:"Unchanged here",marker:"\u25CB",changed:!1},"not-created-yet":{label:"Not created yet",marker:"\u2026",changed:!1},"already-deleted":{label:"Already deleted",marker:"\xD7",changed:!1}}[r]}function ke(r){return r?.kind==="walkthrough"||r?.kind==="stacked-diff"||r?.kind==="deconstructed-diff"}function Re(r){return r?.kind==="stacked-diff"||r?.kind==="deconstructed-diff"}function At(r){return r.kind==="deconstructed-diff"?r.panels:r.stack}function zn(r){return{added:"+",deleted:"\u2212",renamed:"\u2192",modified:"\u2022"}[r]||"\u2022"}function Yt(r){return`${r.charAt(0).toUpperCase()}${r.slice(1)}`}function _r(r,c){let u=r.scenes[c],d=r.chapters.findIndex(k=>k.sceneIds.includes(u.id)),h=d>=0?r.chapters[d]:null,g=h?h.sceneIds.indexOf(u.id)+1:c+1,w=h?h.sceneIds.length:r.scenes.length;return{chapter:h,chapterIndex:d,chapterNumber:d>=0?d+1:c+1,sceneInChapter:g,scenesInChapter:w,sceneCount:r.scenes.length}}function Qi(r,c){return ke(r)?`${r.title} \xB7 Step ${c+1} of ${r.steps.length}`:r.title}function qr(r,c,u){let h=(c==="left"?r.leftLines:r.rightLines).findIndex(L=>L.lineNumber===u);if(h<0)return 0;let g=c==="left"?"leftStart":"rightStart",w=c==="left"?"leftEnd":"rightEnd",k=r.blocks.findIndex(L=>h>=L[g]&&h<L[w]);if(k>=0)return k;let S=0,P=Number.POSITIVE_INFINITY;return r.blocks.forEach((L,$)=>{let D=Math.min(Math.abs(h-L[g]),Math.abs(h-L[w]));D<P&&(S=$,P=D)}),S}function jr(r){return/^[0-9a-f]{40}$/i.test(r)?r.slice(0,7):r}function Nt(r,c){return`${r} ${r===1?c:`${c}s`}`}function es(r){return r instanceof Element&&!!r.closest('a, button, input, select, summary, textarea, [contenteditable="true"], [role="textbox"], .monaco-editor')}function ts(r){let c=n.tour?.scenes[n.activeSceneIndex];n.tour&&Yr(c,c?_r(n.tour,n.activeSceneIndex):null,r)}function Xt(r){let c=yn(j,n.activeSceneIndex,n.activeStepIndex,r==="scene"?"overview":r==="step"?null:r);c&&Ee(c)}function je(r,c,u){let d=document.createElement("button");return d.type="button",d.textContent=r,d.title=c,d.addEventListener("click",u),d}function Kr(r,c,u,d){let h=document.createElement("div");h.className="tour-outline-group",h.dataset.readingGroup=r;let g=document.createElement("div");g.className="tour-outline-heading";let w=document.createElement("div");w.className="tour-outline-children",w.id=`outline-${encodeURIComponent(r)}`;let k=`${n.zoom?.mode||"tour"}:${r}`,S=je("\u25BE",`Expand or collapse ${c}`,()=>{oe.has(k)?oe.delete(k):oe.add(k),P()});S.className="tour-outline-toggle",S.setAttribute("aria-controls",w.id);let P=()=>{w.hidden=oe.has(k),S.setAttribute("aria-expanded",String(!w.hidden)),S.textContent=w.hidden?"\u25B8":"\u25BE"};P();let L=je(c,`Read ${c}`,d);return L.className=u,L.dataset.readingLink=r,g.append(S,L),h.append(g,w),{group:h,children:w,link:L,toggle:S}}function ns(){let r=document.getElementById("tour-audio-settings");r&&(r.hidden=!r.hidden,Wr())}function Wr(){Jt();for(let[u,d]of[["tour-back",-1],["tour-next",1]]){let h=document.getElementById(u);h&&(h.disabled=!Y()||!Ut(j,n.readingKey,d,tt(n.tour)))}let r=document.getElementById("tour-narration"),c=document.getElementById("tour-audio-settings");if(r){let u=!!(c&&!c.hidden);r.setAttribute("aria-expanded",String(u)),r.textContent=u?"\u203A":"\u2039 Narration",r.title=u?"Hide narration controls":"Show narration controls",r.setAttribute("aria-label",r.title)}}function at(r){if(!r||r.kind==="title")return{part:"title"};if(r.kind==="conclusion")return{part:"conclusion"};if(r.kind==="chapter")return{part:"chapter",chapter:r.chapterId};let c=n.tour.scenes[r.sceneIndex];return r.kind==="scene"?{part:"scene",scene:c.id}:{part:"step",scene:c.id,step:c.steps[r.stepIndex].id}}function rs(r){let c=document.createElement("button");return c.type="button",c.className="tour-copy-location",c.setAttribute("aria-label","Copy link to this section"),c.innerHTML='<svg viewBox="0 0 24 24" aria-hidden="true"><path class="tour-link-chain" d="M10 13a5 5 0 0 0 7 .1l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7-.1l-3 3a5 5 0 0 0 7 7l2-2"/><path class="tour-link-check" d="m5 12 4 4L19 6"/></svg>',c.title=o?"Copy location within this export; share the HTML file separately":n.authoredTour?.localSource?"Copy local link to the saved current document; evidence may change":"Copy browser location (requires this presentation server)",c.addEventListener("click",async u=>{u.stopPropagation();let d=Gr(r);try{await navigator.clipboard.writeText(d),c.classList.add("is-copied"),c.setAttribute("aria-label","Link copied"),setTimeout(()=>{c.classList.remove("is-copied"),c.setAttribute("aria-label","Copy link to this section")},1800)}catch{let h=document.createElement("dialog"),g=document.createElement("p");g.textContent="Copy this link:";let w=document.createElement("textarea");w.value=d,w.readOnly=!0,w.setAttribute("aria-label","Link to this tour location");let k=document.createElement("button");k.textContent="Close",k.addEventListener("click",()=>h.close()),h.append(g,w,k),document.body.append(h),h.addEventListener("close",()=>h.remove(),{once:!0}),h.showModal(),w.select()}}),c}function Gr(r){let c=Y()?n.zoom?.mode||"historical":Object.keys(U())[0],u=n.authoredTour.localSource;return u&&!o?co({kind:"tour",...u,mode:c,focus:r}):new URL(Ze(c,r),window.location.href).href}function Vr(r){let c=++f,u=p.then(()=>os(r,c));return p=u.catch(()=>{}),u}async function os(r,c){if(!r||!n.authoredTour)return;let u=Vn(n.authoredTour,r.mode,r.focus);if(c===f){s=!0;try{if(n.zoom.mode!==r.mode&&await _e(r.mode),c!==f)return;if(n.zoom.mode!==r.mode)throw new Error("The requested tour mode could not be opened.");if(se=null,document.getElementById("tour-mode-status").textContent="",me(u.sceneIndex,u.stepIndex,{readingKey:u.key,showIntro:r.focus.part!=="step"}),await new Promise(h=>window.requestAnimationFrame(h)),c!==f)return;let d=J.get(u.key);if(!d)throw new Error("The requested document section could not be rendered.");d.tabIndex=-1,d.focus({preventScroll:!0}),Zr(u.key),d.classList.add("tour-link-target"),window.setTimeout(()=>d.classList.remove("tour-link-target"),1800)}finally{s=!1}}}window.addEventListener("hashchange",()=>{try{Vr(Jn(window.location.hash)).catch(ae)}catch(r){ae(r)}});function ye(){if(o)return;let r=n.tour?.scenes[n.activeSceneIndex],c=new URLSearchParams(window.location.search);for(let d of["from","to","commits","scope","commit","file","panelOrder"])c.delete(d);if(n.zoom&&c.set("mode",n.zoom.mode),n.zoom&&!Y()){for(let d of["scene","step","view"])c.delete(d);n.zoom.mode==="compare"&&n.compare&&(c.set("commits",n.compare.commits.join(",")),n.compare.path&&c.set("scope",n.compare.path),n.activeTourFilePath||c.set("view","directory")),n.zoom.mode==="history"&&n.historyCommit&&c.set("commit",n.historyCommit),n.activeTourFilePath&&c.set("file",n.zoom.mode==="history"?n.historyPath:n.activeTourFilePath),window.history.replaceState(null,"",`${window.location.pathname}?${c.toString()}${window.location.hash}`);return}if(n.readingKey==="conclusion"){c.delete("scene"),c.delete("step"),c.set("view","conclusion"),window.history.replaceState(null,"",`${window.location.pathname}?${c.toString()}${Ze(n.zoom.mode,{part:"conclusion"})}`);return}if(!r)return;c.set("scene",r.id);let u=ke(r)?r.steps[n.activeStepIndex]:null;u?c.set("step",u.id):c.delete("step"),n.directoryEvidence&&n.activeTourFilePath?c.set("file",n.activeTourFilePath):c.delete("file"),n.narrativeParent?c.set("view",n.narrativeParent):u&&n.sceneIntroVisible?c.set("view","overview"):c.delete("view"),window.history.replaceState(null,"",`${window.location.pathname}?${c.toString()}${Ze(n.zoom.mode,at(j.find(d=>d.key===n.readingKey)))}`)}function Jr(r=n.tour?.scenes[n.activeSceneIndex],c=n.activeStepIndex){if(!r||!ke(r))return null;let u=r.steps[c];if(!u)return null;if(r.kind==="walkthrough"){if(u.image)return null;let h=u.focus;return!h?.path||!Number.isInteger(h.startLine)?null:{filePath:h.path,sideIndex:h.revision==="base"?0:1,lineNumber:h.startLine,label:`${h.path}:${h.startLine}`}}let d=u.startLine;if(!Number.isInteger(d)){let h=$t(r,u.file),g=h?.panels?.[u.pairIndex],w=h?.panels?.[u.pairIndex+1];if(g&&w){let k=we(g.content,w.content);d=wr(k,u.side)?.startLine}}return!u.file||!Number.isInteger(d)?null:{filePath:u.file,sideIndex:u.pairIndex+(u.side==="right"?1:0),lineNumber:d,label:`${u.file}:${d}`}}function is(){let r=Jr(),c=n.tour?.scenes[n.activeSceneIndex];if(n.sceneIntroVisible||!r||!c)return!1;if(X.interruptForExploration(),n.activeTourFilePath!==r.filePath){let u=n.tour.files.findIndex(h=>h.kind==="text-diff"&&h.path===r.filePath);if(u<0||!(Re(c)?Tt(u):Un(u,!1)))return!1}return window.requestAnimationFrame(()=>ne({type:"revealSearchResult",sideIndex:r.sideIndex,lineNumber:r.lineNumber,startColumn:1,endColumn:1})),!0}function Yr(r,c,u){Hn(),document.getElementById("tour-narrative").hidden=!1,document.getElementById("tour-breadcrumb").textContent=n.narrativeParent==="tour"?"Intro":n.narrativeParent==="conclusion"?"Conclusion":n.narrativeParent==="chapter"?c.chapter?.title||"":n.sceneIntroVisible?r.title:Qi(r,n.activeStepIndex);let d=r&&J.get(`scene:${r.id}`),h=ke(r)?r.steps[n.activeStepIndex]:null,g=h&&J.get(`step:${r.id}:${h.id}`);for(let w of new Set([d,g,J.get(n.readingKey)].filter(Boolean)))w.querySelectorAll("[data-reading-field]").forEach(k=>{k.closest("[data-reading-key]")===w&&ls(k,k.dataset.readingText,{field:k.dataset.readingField,...k.dataset.itemIndex!==void 0?{itemIndex:Number(k.dataset.itemIndex)}:{}},u)});Wr()}function Hn(){if(O===n.tour)return;O=n.tour,j=ei(n.tour),J.clear();let r=document.getElementById("tour-narrative-content"),c=[],u,d=(k,S,P,L,$,D)=>{let A=document.createElement(S);A.className=P;let z=$&&/^h[1-6]$/.test(S)?document.createElement("span"):A;return z!==A&&A.append(z),z.replaceChildren(...kr(document,L||"")),$&&(z.dataset.readingField=$,z.dataset.readingText=L||"",D!==void 0&&(z.dataset.itemIndex=String(D))),k.append(A),A},h=(k,S,P)=>{if(d(k,"p","tour-narrative-summary",S.summary,P?"summary":null),S.bullets?.length){let L=document.createElement("ul");L.className="tour-narrative-bullets",S.bullets.forEach(($,D)=>d(L,"li","",$,P?"bullet":null,D)),k.append(L)}S.takeaway&&d(k,"p","tour-narrative-takeaway",S.takeaway,P?"takeaway":null)},g=Rt(n.tour),w=(k,S)=>{let P=d(k,"ul","tour-route","");S.forEach(L=>{let $=d(P,"li","",""),D=je("",`Read ${L.title}`,()=>Ee(j.find(A=>A.kind==="scene"&&A.sceneIndex===L.sceneIndex)));D.className="tour-route-link",d(D,"span","tour-route-number",`${L.sceneIndex+1}. `),d(D,"span","",L.title,"route-title",L.sceneIndex),$.append(D)})};for(let k of j){let S=document.createElement("section");S.className="tour-reading-item",S.dataset.readingKey=k.key,S.dataset.readingKind=k.kind,S.dataset.sceneIndex=String(k.sceneIndex),S.dataset.stepIndex=String(k.stepIndex);let P=n.tour.scenes[k.sceneIndex];if(k.kind==="title")d(S,"h1","tour-document-title",n.tour.title,"document-title"),n.tour.opening&&(d(S,"h2","tour-passage-title",n.tour.opening.title,"passage-title"),h(S,n.tour.opening,!0)),d(S,"h2","tour-passage-title","What you'll see"),g.chapters.forEach(L=>{let $=d(S,"section","tour-route-chapter",""),D=d($,"h3","",""),A=je("",`Read ${L.title}`,()=>Ee(j.find(z=>z.kind==="chapter"&&z.chapterId===L.chapterId)||j.find(z=>z.kind==="scene"&&z.sceneIndex===L.scenes[0]?.sceneIndex)));A.className="tour-route-link tour-route-chapter-link",d(A,"span","tour-route-number",`${L.chapterIndex+1}. `),d(A,"span","",L.title,"route-chapter",L.chapterIndex),D.append(A)}),g.chapters.length||w(S,g.scenes);else if(k.kind==="conclusion")d(S,"h2","tour-passage-title",n.tour.conclusion.title,"passage-title"),h(S,n.tour.conclusion,!0);else if(k.kind==="chapter"){let L=g.chapters.find($=>$.chapterId===k.chapterId);d(S,"h2","tour-document-chapter",L.title,"chapter"),d(S,"p","tour-narrative-summary",L.summary,"summary"),w(S,L.scenes)}else if(k.kind==="scene"){S.classList.add("tour-scene-group");let L=d(S,"div","tour-scene-header",""),$=d(L,"h2","tour-scene-heading",Fe(n.tour,k),"scene-title"),D=document.createElement("button");D.className="tour-scene-title-toggle",D.type="button",D.title="Expand or collapse scene overview",D.disabled=!0,D.append(...$.childNodes),$.append(D);let A=document.createElement("details");A.className="tour-scene-context";let z=d(A,"summary","","");z.setAttribute("aria-label",`Scene overview: ${P.title}`),z.dataset.tooltip="Expand or collapse scene overview";let _=d(A,"div","tour-scene-context-body","");_.id=`scene-overview-${k.sceneIndex}`,D.setAttribute("aria-controls",_.id),D.setAttribute("aria-expanded","false"),D.addEventListener("click",C=>{C.target.closest("a")||(A.open=!A.open)}),A.addEventListener("toggle",()=>D.setAttribute("aria-expanded",String(A.open))),h(_,P,!1),L.addEventListener("keydown",C=>{C.key==="Escape"&&A.open&&(C.preventDefault(),C.stopPropagation(),A.open=!1,z.focus({preventScroll:!0}))}),L.append(A);let te=d(S,"div","tour-scene-overview","");h(te,{...P,takeaway:ke(P)?"":P.takeaway},!0),P.overview?.purpose&&d(te,"p","tour-overview-purpose",P.overview.purpose,"overview-purpose");let H=fe(n.tour,k,n.zoom?.mode);H&&d(te,"p","tour-scene-orientation",ut(H));let Z=d(te,"div","tour-narrative-tags","");P.tags.forEach(C=>d(Z,"span","",C))}else{let L=P.steps[k.stepIndex],$=P.kind==="deconstructed-diff"?L.body?`Stage ${(L.stageIndex??L.pairIndex)+1}`:P.panels[L.pairIndex+1].label:"";if($&&d(S,"div","tour-narrative-chapter",$,"stage-title"),d(S,"h3","tour-step-title",Fe(n.tour,k),"step-title"),d(S,"p","tour-step-orientation",tn(n.tour,k.sceneIndex,k.stepIndex),"step-orientation"),L.body&&d(S,"p","tour-step-body",L.body,"step-body"),P.kind==="deconstructed-diff"&&!L.body){let z=P.steps.findIndex(_=>_.pairIndex===L.pairIndex);if(z>=0&&z<k.stepIndex){let _=j.find(H=>H.kind==="step"&&H.sceneIndex===k.sceneIndex&&H.stepIndex===z),te=je("Read stage explanation",`Read ${P.steps[z].title}`,()=>Ee(_));te.className="tour-show-in-code tour-stage-explanation",S.append(te)}}let D=d(S,"div","tour-step-requirement","");ds(D,L.requirement),L.connection&&(d(S,"p","tour-connection",`${L.connection.from.path} \u2192 ${L.connection.to.path}`),d(S,"p","tour-connection",L.connection.label,"connection")),k.stepIndex===P.steps.length-1&&d(S,"p","tour-narrative-takeaway",P.takeaway,"takeaway");let A=Jr(P,k.stepIndex);if(A){let z=d(S,"div","tour-step-code","");d(z,"span","tour-step-code-location",A.label);let _=je("Show in code",`Show ${A.label}`,()=>{Ee(k),is()});_.className="tour-show-in-code",z.append(_)}}S.querySelector("h1, h2, h3").append(rs(at(k))),J.set(k.key,S),k.kind==="step"?u.append(S):(c.push(S),u=k.kind==="scene"?S:null)}r.replaceChildren(...c),Q=r.scrollTop}function ss(){for(let[u,d]of J)d.classList.toggle("is-active",u===n.readingKey);document.querySelectorAll("[data-reading-link], .tour-outline-step, #tour-title").forEach(u=>{let d=n.tour?.scenes[n.activeSceneIndex],h=d&&ke(d)?d.steps[Number(u.dataset.stepIndex)]:null,w=(u.id==="tour-title"?"title":u.dataset.readingLink||(h&&u.dataset.sceneId===d.id?`step:${d.id}:${h.id}`:null))===n.readingKey;u.classList.toggle("is-active",w),w?u.setAttribute("aria-current","location"):u.removeAttribute("aria-current")}),document.querySelectorAll(".tour-outline-group").forEach(u=>{u.classList.toggle("has-active",!!u.querySelector('[aria-current="location"]'))});let r=document.getElementById("tour-scenes"),c=r?.querySelector('[aria-current="location"]');for(;c&&!c.getClientRects().length;)c=c.closest(".tour-outline-children[hidden]")?.parentElement.querySelector(":scope > .tour-outline-heading [data-reading-link]");if(c&&r.clientHeight){let u=r.getBoundingClientRect(),d=c.getBoundingClientRect();d.top<u.top?r.scrollTop+=d.top-u.top:d.bottom>u.bottom&&(r.scrollTop+=d.bottom-u.bottom)}}function Xr(){let r=document.getElementById("tour-narrative"),c=document.getElementById("tour-narrative-content");if(!r||!c||!r.getClientRects().length)return;let u=r.getBoundingClientRect(),d=u.height-c.clientHeight;c.style.setProperty("--tour-reading-viewport",`${c.clientHeight}px`),c.style.setProperty("--tour-bookend-viewport",`${Math.max(0,window.innerHeight-u.top-d)}px`)}function Zr(r){let c=document.getElementById("tour-narrative-content"),u=J.get(r);if(!c||!u)return;Xr();let d=u.dataset.readingKind==="step"?u.closest(".tour-scene-group")?.querySelector(".tour-scene-header"):null;c.scrollTop+=u.getBoundingClientRect().top-c.getBoundingClientRect().top-(d?.getBoundingClientRect().height||0),Q=c.scrollTop,Zt()}function Zt(){let r=document.getElementById("tour-narrative-content"),c=r.getBoundingClientRect().top,u=0;return r.querySelectorAll(".tour-scene-header").forEach(d=>{let h=d.parentElement.getBoundingClientRect(),g=h.top<c-1&&h.bottom>c;d.classList.toggle("is-stuck",g),d.querySelector(".tour-scene-title-toggle").disabled=!g,g?u=Math.max(u,d.getBoundingClientRect().bottom-c):d.querySelector("details").open=!1}),r.style.scrollPaddingTop=`${u}px`,u}function Ee(r,c=!1,u=!1){return!c&&!s&&Y()&&window.history.pushState(null,"",Ze(n.zoom.mode,at(r))),me(r.sceneIndex,r.stepIndex,{readingKey:r.key,showIntro:r.kind!=="step",userNavigation:!0,fromReadingScroll:c,narrationNavigation:u?"linear":void 0,narrationEntry:u?"continuous":"playback-start"})}function as(){ie===null&&(ie=window.requestAnimationFrame(()=>{if(ie=null,!Y()||n.zoomSwitching)return;let r=document.getElementById("tour-narrative-content"),c=Zt();if(Q!==null&&Math.abs(r.scrollTop-Q)<2)return;Q=null;let u=r.getBoundingClientRect().top+c+24,d=j[0];for(let h of j){if(J.get(h.key).getBoundingClientRect().top>u)break;d=h}d&&d.key!==n.readingKey&&Ee(d,!0)}))}function cs(r){let c=[];return r.source&&c.push(r.source),r.confidence&&c.push(`${r.confidence} confidence`),c.join(" \xB7 ")}function ds(r,c){if(!c){r.hidden=!0,r.replaceChildren(),r.removeAttribute("title");return}let u=document.createElement("span");u.className="tour-requirement-chip",u.dataset.status=c.status||"unspecified",u.textContent=c.status?`${c.id} \xB7 ${c.status}`:c.id;let d=document.createElement("span");d.className="tour-requirement-text",d.textContent=c.text;let h=[u,d],g=cs(c);if(g){let w=document.createElement("span");w.className="tour-requirement-meta",w.textContent=g,h.push(w)}r.replaceChildren(...h),r.title=[`${c.id}: ${c.text}`,g].filter(Boolean).join(" \u2014 "),r.hidden=!1}function ls(r,c,u,d,h={}){let g=d?.segments.filter(k=>k.source.field===u.field&&k.source.itemIndex===u.itemIndex)||[],w=[];h.prefix&&w.push(document.createTextNode(h.prefix)),w.push(...kr(document,c,g)),h.suffix&&w.push(document.createTextNode(h.suffix)),r.replaceChildren(...w)}function Qr(){X.stop();let r=Uo();n.mode="diff",n.comparisonId+=1,n.left={name:r.leftFileName,content:r.leftContent},n.right={name:r.rightFileName,content:r.rightContent},Ie("Loaded sample diff."),ne({type:"showDiff",file1:n.left.name,file2:n.right.name,comparisonId:`web-${n.comparisonId}`,leftContent:n.left.content,rightContent:n.right.content,diffModel:we(n.left.content,n.right.content),history:null})}async function us(r){X.stop();let[c,u]=r,[d,h]=await Promise.all([c.text(),u.text()]);n.mode="diff",n.comparisonId+=1,n.left={name:c.name,content:d},n.right={name:u.name,content:h},Ie(`Loaded ${c.name} and ${u.name}.`),ne({type:"showDiff",file1:c.name,file2:u.name,comparisonId:`web-${n.comparisonId}`,leftContent:d,rightContent:h,diffModel:we(d,h),history:null})}async function fs(r){X.stop();let c=await Promise.all(r.map(async(u,d)=>{let h=await u.text();return{id:`web-panel-${d}`,label:u.name,content:h,savedContent:h,dirty:!1,editable:!0}}));n.mode="multi-diff",Ie(`Loaded ${c.length}-panel diff for ${c.map(u=>u.label).join(", ")}.`),ne({type:"showMultiDiff",panels:c,pairs:c.slice(0,-1).map((u,d)=>({leftIndex:d,rightIndex:d+1,diffModel:we(u.content,c[d+1].content)}))})}function Ie(r){let c=document.getElementById("web-status");c&&(c.textContent=r)}})();})();
670
+ The converted copy will be downloaded after opening.`)){Qe("Tour conversion canceled.");return}p=await d(!0),g=await p.json().catch(()=>({}))}if(!p.ok)throw new Error(g.error||`Tour upload failed (${p.status}).`);if(!g||typeof g.manifestUrl!="string"||!g.manifestUrl)throw new Error("Tour upload did not return a manifest URL.");if(Fi(g)&&!window.confirm(Di(g))){Qe("Kept the current tour.");return}if(!await Hr(g.manifestUrl)){Qe("Could not load the uploaded tour.");return}if(typeof g.convertedSource=="string"){let b=URL.createObjectURL(new Blob([g.convertedSource],{type:"application/yaml"})),E=document.createElement("a");E.href=b,E.download=`${r.name.replace(/(?:\.bygone)?\.ya?ml$|\.bygone$/i,"")}.v4.bygone`,document.body.appendChild(E),E.click(),E.remove(),setTimeout(()=>URL.revokeObjectURL(b),1e3)}Qe("")}catch(r){Qe(`Could not open existing tour: ${r instanceof Error?r.message:String(r)}`)}}function re(){return!n.zoom||!!G()[n.zoom.mode]}function Ct(r){let a=n.authoredTour;if(G()[r])return{...a,opening:void 0,conclusion:void 0,details:void 0,...G()[r]};let u=r==="compare"&&n.compare?[...new Map([...n.compare.inventory||a.files,...n.compare.files].map(d=>[d.path,d])).values()]:r==="history"&&n.historyFiles||a.files;return{...a,opening:void 0,conclusion:void 0,details:void 0,scenes:[],chapters:[],files:u}}function ct(){let r=document.getElementById("tour-mode-controls");if(r.hidden=!n.zoom||ce,!n.zoom)return;be();let a=document.getElementById("tour-mode-tabs"),u=document.getElementById("tour-mode-description");a&&(a.hidden=!0),u&&(u.hidden=!0);let d=n.zoom.mode==="history",p=ae();document.getElementById("tour-history-controls").hidden=!p||n.zoom.mode==="compare",document.getElementById("tour-compare-controls").hidden=!p||n.zoom.mode!=="compare";let g=["historical","deconstructed"].includes(n.zoom.mode)&&!G()[n.zoom.mode];document.body.classList.toggle("workspace-empty-tour",g),document.body.classList.toggle("tour-derived-mode",!re()),re()||document.body.classList.remove("tour-discussion");for(let y of["tour-history-parent","tour-history-base"])document.getElementById(y).hidden=!d;dt()}function dt(){let r=n.comparisonDraftCommits,a=r.length,u=ae(),d=[...new Set(An())],p=E=>E.length===a&&E.every(P=>r.includes(P)),g=n.zoom?.mode==="compare"&&p(n.compare?.commits||[]);for(let E of["history","compare"])document.getElementById(`tour-${E}-count`).textContent=`${a} selected`,document.getElementById(`tour-${E}-hint`).textContent=a<2?"Select 2+ revisions":g?"Selection applied":E==="compare"?"Unapplied selection":"Ready to compare",document.getElementById(`tour-${E}-clear`).disabled=!a,document.getElementById(`tour-${E}-reset`).disabled=!d.length||p(d);document.getElementById("tour-history-compare").disabled=a<2||!u;let y=document.getElementById("tour-compare-apply");y.disabled=a<2||!u||g,y.title=g?"These revisions are already displayed":"Apply the selected revisions";let b=document.getElementById("tour-compare-scope");b.textContent=n.compare?.path||"All changed files",b.title=n.compare?.path?`File scope: ${n.compare.path}`:"Comparing across all changed files",document.getElementById("tour-compare-all").hidden=!n.compare?.path;for(let E of["tour-history-parent","tour-history-base"])document.getElementById(E).disabled=!ae()||!n.historyCommit}function $n(){return[...new Set([...[...n.historyEntries].reverse().map(r=>r.commit),n.authoredTour.range.mergeBaseOid,...n.authoredTour.commits.map(r=>r.oid),n.authoredTour.range.headOid])]}function Lr(r){return hi(r,$n())}async function we(r,a,u=n.historyPrefix,d=n.authoredTour){if(c)return c(r,a);if(!ae(d))throw new Error(je());let p=await fetch(`${u||"/history/"}${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),g=await p.json();if(!p.ok)throw new Error(g.error||`History request failed (${p.status}).`);return g}function fe(r){let a=r instanceof Error?r.message:String(r),u=document.getElementById("tour-mode-status");u&&(u.textContent=a),N&&Qe(a)}function An(){return n.displayedPanels.map(r=>r.commit).filter(Boolean)}function Oi(){let r=n.tour?.scenes[n.activeSceneIndex],a=n.zoom?.mode==="compare"?n.comparisonCommits:[n.authoredTour.range.mergeBaseOid,n.authoredTour.range.headOid];if(n.directoryEvidence&&Me(r)){let u=Ft(r),d=r.overview?.comparison;a=r.kind==="deconstructed-diff"?[]:[(d?u.find(p=>p.id===d.from):u[0])?.oid,(d?u.find(p=>p.id===d.to):u.at(-1))?.oid]}return["left","right"].map((u,d)=>({id:u,commit:a[d]}))}function Nr(){let r=n.displayedPanels.map(a=>a.commit);return{...Tt(Nn({commits:An()}),r,null),navigatorOnly:!0}}async function Bi(r){if(!r||!n.zoom||!ae())return[];if(!n.fileHistoryCache.has(r)){let a=we("list",{path:r,commit:n.authoredTour.range.headOid}).then(u=>u.entries);n.fileHistoryCache.set(r,a),a.catch(()=>n.fileHistoryCache.delete(r))}return n.fileHistoryCache.get(r)}async function Ui(r,a){try{let u=await Bi(r);if(a!==ge)return;se({type:"updateCommitMarkers",changedCommits:u.map(d=>d.commit),path:r})}catch(u){a===ge&&fe(u)}}async function et(r,a,u=!0){if(a=a||n.historyCommit||n.authoredTour.range.headOid,!r)return zi(a,u);let d=++oe,p=n.historyEntries,g=p.find(M=>M.commit===a);if(n.historyPath===r&&n.historyCommit===a&&n.historyPanels.length){await Wt();return}let y=await we("diff",{path:r,commit:a,head:n.authoredTour.range.headOid});if(d!==oe||n.zoom.mode!=="history")return;if(u&&n.historyPanels.length&&n.historyCommit===a){let M=await Promise.all(n.historyPanels.map(async z=>{let L=z.commit===a?{rightContent:y.rightContent,path:y.path}:z.commit===y.parentCommit?{rightContent:y.leftContent,path:y.previousPath||y.path}:z.commit?await we("diff",{path:r,commit:z.commit,head:n.authoredTour.range.headOid}):{rightContent:"",path:r};return{...z,content:L.rightContent,path:L.path}}));if(d!==oe||n.zoom.mode!=="history")return;n.historyPanels=M,n.historyPath=r,n.historyDiff=y,await Wt(),Se();return}let b=p.findIndex(M=>M.commit===a),P=(b>=0?p[b+1]:null)?.commit||y.parentCommit,R=P&&P!==y.parentCommit?(await we("diff",{path:r,commit:P,head:n.authoredTour.range.headOid})).rightContent:y.leftContent;if(d!==oe||n.zoom.mode!=="history")return;n.historyPath=r,n.historyCommit=a;let U=Math.max(2,n.historyPanels.length);n.historyDiff=y;let F=(M,z,L)=>({id:`history-${M||"empty"}`,commit:M,content:z,label:L,path:y.path,editable:!1});for(n.historyPanels=[F(P,R,P?.slice(0,7)||"Empty tree"),F(a,y.rightContent,g?`${g.shortCommit} ${g.summary}`:a.slice(0,7))],n.historyFocus=`history-${a}`;n.historyPanels.length<U;){let M=Kt(n.historyPanels[0],"left");if(!M)break;let z=await we("diff",{path:r,commit:M.commit,head:n.authoredTour.range.headOid});if(d!==oe||n.zoom.mode!=="history")return;n.historyPanels.unshift(F(M.commit,z.rightContent,`${M.shortCommit} ${M.summary}`))}await Wt(),document.getElementById("tour-mode-status").textContent="",dt(),Se()}async function zi(r=n.historyCommit||n.authoredTour.range.headOid,a=!0){let u=++oe,d=n.historyEntries.find(y=>y.commit===r);if(!d)throw new Error("The selected revision is unavailable in this history.");let p=a&&n.historyCommit===r&&n.historyPanels.length?n.historyPanels:[d.parentCommit||null,r].map(y=>({id:`history-${y||"empty"}`,commit:y,content:"",editable:!1,label:y?y.slice(0,7):"Empty tree"})),g=await we("changed-files",{commits:p.map(y=>y.commit||null),includeEntries:!0,includeFiles:!0});u!==oe||n.zoom.mode!=="history"||(n.historyCommit=r,n.historyPanels=p,n.historyFocus=p.at(-1).id,n.historyPath=null,n.historyChangedFiles=new Set(g.paths),n.historyFiles=g.files,n.tour.files=g.files,Un(),n.activeTourFilePath=null,pe(),se({...sn(p.map(y=>y.label),g.entries),history:Tt(Rr(n.historyEntries,r,{}),p.map(y=>y.commit),r)}),Ge(g.paths.length?"":"No changed files for the selected revisions."),dt(),Se())}function Rr(r,a,u){let d=r.findIndex(g=>g.commit===a),p=r[d];return{fileName:(n.historyPath||u.path||"Changed files").split("/").pop(),canGoBack:d>=0&&d<r.length-1,canGoForward:d>0,positionLabel:`${d+1} / ${r.length}`,leftCommitLabel:n.historyPanels[0]?.commit?.slice(0,7)||"Empty tree",leftTimestamp:"",rightCommitLabel:n.historyPanels.at(-1)?.label||(p?`${p.shortCommit} ${p.summary}`.trim():a.slice(0,7)),rightTimestamp:p?.timestamp||"",workingTreeControls:!1,rail:{activeTabId:"history",tabs:[{id:"history",label:"History"}],itemsByTab:{history:[]}}}}function Kt(r,a){let u=$n(),d=u.indexOf(r.commit);if(d<0)return null;let p=new Set(n.historyPanels.map(b=>b.commit)),y=(a==="left"?u.slice(0,d).reverse():u.slice(d+1)).find(b=>!p.has(b)&&n.historyEntries.some(E=>E.commit===b));return n.historyEntries.find(b=>b.commit===y)}function Tt(r,a,u){return r.rail.itemsByTab.history=po(n.historyEntries,{displayed:a,active:u,selected:n.comparisonDraftCommits,tourCommits:new Set(n.authoredTour?.commits.map(d=>d.oid)),selectionEnabled:!!n.zoom,missingRevisionSelectionEnabled:!!n.zoom,missingRevisionLabel:d=>d?`${d.slice(0,7)} \xB7 Parent/base revision`:"Empty tree"}).map(d=>({...d,meta:d.parents.length>1?`${d.meta} \xB7 Merge: ${d.parents.map(p=>p.slice(0,7)).join(", ")}`:d.meta})),r}async function Wt(){let r=n.historyPanels,a=n.authoredTour,u=oe,d=await we("changed-files",{commits:r.map(y=>y.commit||null),includeFiles:!0});if(u!==oe||r!==n.historyPanels||a!==n.authoredTour||n.zoom.mode!=="history")return;n.historyChangedFiles=new Set(d.paths),n.historyFiles=d.files,n.tour.files=d.files,Un();let p=n.historyPanels.map(y=>({...y,addLeftEnabled:!!Kt(y,"left"),addRightEnabled:!!Kt(y,"right"),removeEnabled:n.historyPanels.length>2})),g=p.find(y=>y.id===n.historyFocus)?.commit;n.activeTourFilePath=n.historyPath,pe(),se({...an({panels:p,files:Xt(),activePanelId:n.historyFocus,mutationEnabled:!0,canReturnToDirectory:!0},(y,b)=>ke(y.content,b.content)),history:Tt(Rr(n.historyEntries,n.historyCommit,n.historyDiff),p.map(y=>y.commit),g)})}async function qi(r){let a=n.historyPanels.find(u=>u.id===(r.anchorPanelId||r.panelId));if(a){if(r.type==="multiRemovePanel"){if(n.historyPanels.length<=2)return;++oe,n.historyPanels=n.historyPanels.filter(u=>u!==a),n.historyFocus===a.id&&(n.historyFocus=n.historyPanels.at(-1).id)}else{let u=Kt(a,r.side);if(!u)return;let d=++oe,p=await we("diff",{path:n.historyPath,commit:u.commit,head:n.authoredTour.range.headOid});if(d!==oe||n.zoom.mode!=="history")return;let g={id:`history-${u.commit}`,commit:u.commit,content:p.rightContent,label:`${u.shortCommit} ${u.summary}`,path:p.path,editable:!1};n.historyPanels.push(g);let y=$n();n.historyPanels.sort((b,E)=>y.indexOf(b.commit)-y.indexOf(E.commit)),n.historyFocus=g.id}await Wt()}}function Ln(r){let a=n.historyEntries.findIndex(d=>d.commit===n.historyCommit),u=n.historyEntries[a+r];if(u)return et(n.historyPath,u.commit,!1)}function Nn(r){let a=r.commits;return{fileName:(r.path||n.activeTourFilePath||"Comparison").split("/").pop(),canGoBack:!1,canGoForward:!1,positionLabel:`${r.commits.length} loaded panels`,leftCommitLabel:a[0]?.slice(0,7)||"",leftTimestamp:"",rightCommitLabel:a.at(-1)?.slice(0,7)||"",rightTimestamp:"",workingTreeControls:!1,rail:{activeTabId:"history",tabs:[{id:"history",label:"History"}],itemsByTab:{history:[]}}}}function Pr(r,a=null){if(!r||r.kind!=="text-diff")return!1;Ge("");let u=r.comparisonPanels;return a=a||n.comparisonFocus,n.comparisonFocus=a,n.activeTourFilePath=r.path,pe(),se({...an({panels:u,files:Xt(),activePanelId:a?`compare-${a}`:null,mutationEnabled:!1,reorderEnabled:!1,canReturnToDirectory:!0},(d,p)=>ke(d.content,p.content)),history:Tt(Nn(n.compare),n.compare.commits,a)}),Se(),!0}async function Fr(r,a=null){let u=++oe;if(!r.comparisonPanels){let d;try{d=await we("compare-many",{commits:n.compare.commits,path:r.path})}catch(y){if(u!==oe)return!1;throw y}if(u!==oe||n.zoom?.mode!=="compare")return!1;let p=n.tour.files.findIndex(y=>y.path===r.path),g=d.files.find(y=>y.path===r.path)||d.files[0];if(!g)return document.getElementById("tour-mode-status").textContent="This file is absent from the selected revisions.",!1;r={...g,path:r.path},n.tour.files[p]=r,pe(),r.kind==="omitted"&&(document.getElementById("tour-mode-status").textContent=r.reason)}return Pr(r,a)}async function Dr(r,a,u=null){r=Lr(r);let d=++oe,p=await we("compare-many",r),g=ae()?await we("changed-files",{commits:r.commits,includeFiles:!0}):null,y=new Set(g?.paths||p.files.map(P=>P.path));for(let P of p.files)P.comparisonPanels?.some(R=>y.has(R.path))&&y.add(P.path);if(d!==oe||n.zoom.mode!=="compare")return;let b=p.files;n.comparisonCommits=r.commits,n.compare={...r,files:b,inventory:g?.files,entries:p.entries,changedPaths:y},n.tour=Ct("compare"),n.activeSceneIndex=-1,n.tourFocusFilePath=null,lt(),ct(),tt();let E=n.tour.files.find(P=>P.kind==="text-diff"&&P.path===a)||b.find(P=>P.kind==="text-diff");if(le?.view==="directory")Rn();else if(E){if(!await Fr(E,u))return}else{n.activeTourFilePath=null;let P=r.commits.map(R=>({id:`compare-${R}`,commit:R,path:"No text changes",content:"",label:R.slice(0,7),editable:!1}));se({...an({panels:P,files:{paths:[],currentPath:null},mutationEnabled:!1,reorderEnabled:!1,canReturnToDirectory:!0},(R,U)=>ke(R.content,U.content)),history:Tt(Nn(r),r.commits,null)}),n.activeTourFilePath=null,le=null,pe()}document.getElementById("tour-mode-status").textContent=b.length?E?"":"Changed files cannot be displayed as text. See the file list for details.":"No changes between these revisions.",Se()}async function Ke(r){if(!ae()){Qe(De());return}n.zoomSwitching||(n.zoom.mode!=="compare"?await We("compare",r):await Dr(r,n.activeTourFilePath),Pt("commits"))}function Rn(){n.compare&&(n.activeTourFilePath=null,pe(),se(sn(n.compare.commits.map(r=>r.slice(0,7)),n.compare.entries)),Ge(n.compare.entries.length?"":"No changed files for the selected comparison."),Se())}function Pn(){return{commits:[n.authoredTour.range.mergeBaseOid,n.authoredTour.range.headOid]}}function Mr(){return n.historyEntries.find(r=>r.commit===n.historyCommit)?.path||n.historyPath}function We(r,a,u){let d=m.then(()=>Hi(r,a,u));return m=d.catch(()=>{}),d}async function Hi(r,a,u){if(!n.zoom||n.zoomSwitching||r===n.zoom.mode||!de().includes(r))return;n.zoomSwitching=!0,++oe;let d=n.zoom.mode,p;try{p=await _e(),n.zoom.depart(p),Q.stop();let g=n.zoom.enter(r,r==="history"?p:null);if(n.tourNavigatorTab=g.restore?g.location.navigatorTab||"commits":re()?"tour":"commits",n.activeSceneIndex=-1,n.activeStepIndex=0,n.narrativeParent=null,n.directoryEvidence=null,n.sceneIntroVisible=!1,n.tourFocusFilePath=null,n.tour=Ct(r),lt(),tt(),ct(),document.getElementById("tour-mode-status").textContent="",le=g.restore&&!a?g.location:null,r==="history")await et(u||(g.restore?g.location.path:null),n.historyCommit||g.location.commit);else if(r==="compare")await Dr(a||n.compare||Pn(),u||g.location.path||p.path);else if(G()[r]&&(ve(Math.max(0,g.location.sceneIndex),g.location.stepIndex,{zoomLanding:!0,showIntro:g.restore?g.location.sceneIntroVisible:!0,readingKey:g.restore?g.location.readingKey:"title"}),g.location.path&&n.activeTourFilePath!==g.location.path)){let y=n.tour.files.findIndex(b=>b.path===g.location.path);y>=0&&ft(y)}if(Se(),l&&!s){let y=new URL(window.location.href);y.hash=re()?nt(n.zoom.mode,pt(_.find(b=>b.key===n.readingKey))):"",window.history.replaceState(null,"",y)}}catch(g){le=null,n.zoom.enter(d),n.tour=Ct(d),p&&(n.activeSceneIndex=p.sceneIndex,n.activeStepIndex=p.stepIndex,n.activeTourFilePath=p.path,n.narrativeParent=p.narrativeParent,n.sceneIntroVisible=p.sceneIntroVisible,n.tourNavigatorTab=p.navigatorTab),lt(),ct(),tt(),p&&re()&&(le=p,ve(p.sceneIndex,p.stepIndex,{zoomLanding:!0,showIntro:p.sceneIntroVisible,readingKey:p.readingKey}),p.path&&n.activeTourFilePath!==p.path&&ft(n.tour.files.findIndex(y=>y.path===p.path))),pe(),Se(),fe(g)}finally{n.zoomSwitching=!1}}async function _i(r){if(!(!r||typeof r!="object")){if(r.type==="navigationState"){Te.get(r.requestId)?.(r.navigation);return}if(r.type==="renderComplete"&&n.mode==="tour"&&r.renderRequestId===ge&&Ui(n.activeTourFilePath,ge),r.type==="renderComplete"&&le&&r.renderRequestId===Pe){let a=le;le=null,se({type:"restoreNavigationState",navigation:a.navigation});let u=document.getElementById("tour-narrative-content");u&&(u.scrollTop=a.narrativeScroll||0,X=u.scrollTop),a.focusId&&document.getElementById(a.focusId)?.focus({preventScroll:!0})}if(r.type==="ready"){let a=new URLSearchParams(window.location.search),u=a.get("manifest");u||o?Hr(u):a.get("demo")==="1"&&co();return}if(n.mode==="tour"&&n.directoryEvidence&&re()){if(r.type==="openDirectoryEntry"){qn(r.relativePath);return}if(r.type==="returnToDirectory"){zn();return}}if(n.mode==="tour"){if(n.zoom?.mode==="compare"&&["openDirectoryEntry","returnToDirectory"].includes(r.type)){if(Ee(),r.type==="returnToDirectory")Rn();else{let a=n.compare.files.find(u=>u.path===r.relativePath);a?.kind==="text-diff"?Pr(a):a&&Ge(`${a.path}: ${a.reason||"This file cannot be displayed as text."}`)}return}if(r.type==="multiMovePanel")return;if(n.zoom?.mode==="history"&&["openDirectoryEntry","returnToDirectory","navigateFile"].includes(r.type)){Ee();let a=Xt();r.type==="openDirectoryEntry"&&(a.paths=[...n.historyChangedFiles]);let u=fo(r,a,!0);u&&et(u.path,n.historyCommit).catch(fe);return}if(n.zoom?.mode==="history"&&["multiAddPanel","multiRemovePanel"].includes(r.type)){qi(r).catch(fe);return}if(r.type==="multiSetActivePair"||r.type==="multiSetActivePanel"){re()&&Number.isInteger(r.pairIndex)&&(document.getElementById("file-info").textContent=Hn(n.activeTourFilePath,r.pairIndex)),n.zoom?.mode==="history"?n.historyFocus=r.type==="multiSetActivePanel"?r.panelId:n.historyPanels[r.pairIndex]?.id||n.historyFocus:n.zoom?.mode==="compare"&&(n.comparisonFocus=r.type==="multiSetActivePanel"?r.panelId.replace(/^compare-/,""):n.comparisonCommits[r.pairIndex]);return}if(r.type==="historyBack"||r.type==="historyForward"){if(n.zoom?.mode!=="history")return;let a=Ln(r.type==="historyBack"?1:-1);a&&a.catch(fe);return}if(r.type==="toggleHistorySelection"&&Number.isInteger(r.index)){let a=n.displayedPanels.map(p=>p.commit),u=r.index<0?{commit:a[-r.index-1]}:n.historyEntries[r.index];if(!u?.commit)return;let d=n.comparisonDraftCommits.includes(u.commit)?n.comparisonDraftCommits.filter(p=>p!==u.commit):[...n.comparisonDraftCommits,u.commit];n.comparisonDraftCommits=d.length>=2?Lr({commits:d}).commits:d,dt();return}if(r.type==="compareHistoryEntry"&&Number.isInteger(r.index)){let a=n.historyEntries[r.index];a?.parentCommit&&Ke({commits:[a.parentCommit,a.commit],path:n.activeTourFilePath}).catch(fe);return}if(r.type==="selectHistoryEntry"&&Number.isInteger(r.index)){let a=n.historyEntries[r.index];if(a&&n.zoom?.mode==="history"){let u=n.historyPanels.find(d=>d.commit===a.commit);u&&n.historyPath?(n.historyFocus=u.id,se({type:"focusHistoryPanel",panelId:u.id})):et(n.historyPath,a.commit,!1).catch(fe)}if(a&&n.zoom?.mode!=="history"){let u=n.displayedPanels.find(d=>d.commit===a.commit);u?se({type:"focusHistoryPanel",panelId:u.id}):(n.historyCommit=a.commit,n.historyPath=n.activeTourFilePath||n.historyPath,We("history",void 0,n.activeTourFilePath).catch(fe))}return}}if(r.type==="navigateFile"&&n.mode==="tour"){Xr(r.direction==="previous"?-1:1);return}if(r.type==="navigateTourStep"&&n.mode==="tour"){let a=r.sceneIndex,u=r.stepIndex;Number.isInteger(a)&&Number.isInteger(u)&&ve(a,u,{userNavigation:!0,showIntro:!1});return}r.type==="recomputeDiff"&&n.mode==="diff"&&n.left&&n.right&&(n.left.content=r.leftContent,n.right.content=r.rightContent,se({type:"showDiff",file1:n.left.name,file2:n.right.name,comparisonId:`web-${n.comparisonId}`,leftContent:n.left.content,rightContent:n.right.content,diffModel:ke(n.left.content,n.right.content),history:null}))}}function ji(){let r=(T,W)=>document.getElementById(T)?.addEventListener("click",()=>{Promise.resolve().then(W).catch(fe)});for(let T of["explain","question"])r(`tour-feedback-${T}`,()=>{if(!re())return;let W=_.find(Z=>Z.key===n.readingKey);W&&$i(T,()=>Ci(n.tour,W,{mode:n.zoom?.mode||"historical",location:no(pt(W)),imageVisible:t.isVisible(),displayedEvidence:document.body.classList.contains("tour-discussion")||t.isVisible()?null:Ie?.tour===n.tour?Ie.context:null}))});let a=[...document.querySelectorAll(".tour-selection-more")],u=(T,W=!1)=>{T.open=!1,W&&T.querySelector("summary").focus()};for(let T of a)T.addEventListener("click",W=>{W.target.closest("button")&&u(T,!0)});document.addEventListener("click",T=>{for(let W of a)W.open&&!W.contains(T.target)&&u(W)}),document.addEventListener("keydown",T=>{if(T.key==="Escape")for(let W of a)W.open&&(T.preventDefault(),u(W,!0))}),r("tour-history-compare",()=>Ke({commits:n.comparisonDraftCommits})),r("tour-compare-apply",()=>Ke({commits:n.comparisonDraftCommits,path:n.compare?.path})),r("tour-history-parent",()=>{let T=n.historyEntries.find(W=>W.commit===n.historyCommit)?.parentCommit;if(!T){fe("This is the first commit; History already shows its comparison with the empty tree.");return}return Ke({commits:[T,n.historyCommit],path:Mr()})}),r("tour-history-base",()=>Ke({commits:[n.authoredTour.range.mergeBaseOid,n.historyCommit],path:Mr()})),r("tour-history-final",()=>Ke(Pn())),r("tour-compare-final",()=>Ke(Pn())),r("tour-compare-all",()=>Ke({commits:n.compare.commits}));let d=T=>{n.comparisonDraftCommits=T.filter(Boolean),dt(),se({type:"updateHistorySelection",commits:n.comparisonDraftCommits})};for(let T of["history","compare"])r(`tour-${T}-clear`,()=>d([])),r(`tour-${T}-reset`,()=>d(An()));for(let T of["wheel","pointerdown","keydown"])document.addEventListener(T,W=>{!W.isTrusted||W.target?.closest?.("#tour-mode-controls")||W.target?.closest?.(".monaco-editor, .diff-toolbar, #tour-narrative")&&Ee()},{capture:!0,passive:!0});let p=document.getElementById("web-compare-test"),g=document.getElementById("web-open-diff"),y=document.getElementById("web-open-diff3"),b=document.getElementById("web-diff-input"),E=document.getElementById("web-diff3-input"),P=document.getElementById("tour-narration"),R=document.getElementById("tour-return-focus"),U=document.getElementById("tour-search-input"),F=document.getElementById("tour-search-scope"),M=document.getElementById("tour-listen"),z=document.getElementById("tour-stop"),L=document.getElementById("tour-narration-skip-back"),H=document.getElementById("tour-narration-skip-ahead"),K=document.getElementById("tour-narration-voice"),q=document.getElementById("tour-narration-rate");ts(),document.getElementById("tour-show-all-files")?.addEventListener("change",T=>{re()?n.showAllTourFiles=T.target.checked:n.showAllFiles=T.target.checked,pe()}),document.getElementById("tour-files")?.addEventListener("toggle",T=>{let W=T.target;!(W instanceof HTMLDetailsElement)||!W.dataset.fileFolder||!W.isConnected||(W.open?n.collapsedFileFolders.delete(W.dataset.fileFolder):n.collapsedFileFolders.add(W.dataset.fileFolder))},!0),rs(),is(),Ki(),document.getElementById("correspondence-filter")?.addEventListener("input",Lt),document.getElementById("correspondence-context")?.addEventListener("click",()=>Gt(!0)),document.getElementById("file-symbol-context")?.addEventListener("click",()=>Gt(!!(n.activeCorrespondenceId&&!n.symbolContext))),document.getElementById("correspondence-all")?.addEventListener("change",Lt),document.getElementById("correspondence-unmatched")?.addEventListener("change",Lt),document.getElementById("tour-navigator-tabs")?.addEventListener("click",T=>{let W=T.target instanceof Element?T.target.closest("[data-tour-navigator]"):null;W?.dataset.tourNavigator&&Pt(W.dataset.tourNavigator)}),p?.addEventListener("click",()=>{co()}),g?.addEventListener("click",()=>{b.value="",b.click()}),y?.addEventListener("click",()=>{E.value="",E.click()}),b?.addEventListener("change",async()=>{let T=Array.from(b.files||[]);if(T.length!==2){Le("Select exactly 2 files for a diff.");return}await Is(T)}),E?.addEventListener("change",async()=>{let T=Array.from(E.files||[]);if(T.length<1){Le("Select one or more files.");return}await Ss(T)}),document.getElementById("tour-title")?.addEventListener("click",()=>en("tour")),document.getElementById("tour-narrative-content")?.addEventListener("scroll",vs,{passive:!0}),document.getElementById("tour-back")?.addEventListener("click",()=>Yt(-1)),document.getElementById("tour-next")?.addEventListener("click",()=>Yt(1)),P?.addEventListener("click",()=>ms()),R?.addEventListener("click",ls),document.getElementById("tour-directory-root")?.addEventListener("click",()=>{en("scene"),document.getElementById("tour-directory-root").focus({preventScroll:!0})}),U?.addEventListener("input",tt),F?.addEventListener("change",tt),M?.addEventListener("click",Or),z?.addEventListener("click",()=>Q.stop()),L?.addEventListener("click",()=>Q.skipSegment(-1)),H?.addEventListener("click",()=>Q.skipSegment(1)),K?.addEventListener("change",()=>{n.narrationVoiceURI=K.value,i.setItem(I,n.narrationVoiceURI)}),q&&(q.value=String(n.narrationRate),q.addEventListener("change",()=>{let T=Number(q.value);n.narrationRate=D.has(T)?T:1,q.value=String(n.narrationRate),i.setItem($,String(n.narrationRate))})),document.getElementById("tour-search-results")?.addEventListener("click",T=>{let W=T.target instanceof Element?T.target.closest("[data-tour-search-result]"):null;W&&es(Number(W.getAttribute("data-tour-search-result")))}),window.addEventListener("keydown",T=>{if(n.mode==="tour"&&(T.metaKey||T.ctrlKey)&&T.shiftKey&&T.key.toLocaleLowerCase()==="f"){T.preventDefault(),T.stopImmediatePropagation(),n.tourSidebarHidden&&Mn(!1),Pt("tour"),document.querySelector(".tour-search-disclosure")?.setAttribute("open",""),U?.focus(),U?.select();return}n.mode!=="tour"||T.metaKey||T.ctrlKey||T.altKey||ps(T.target)||(T.key==="PageUp"||T.key==="ArrowLeft"?(T.preventDefault(),n.zoom?.mode==="history"?Ln(1)?.catch(fe):Yt(-1)):T.key==="PageDown"||T.key==="ArrowRight"?(T.preventDefault(),n.zoom?.mode==="history"?Ln(-1)?.catch(fe):Yt(1)):n.zoom?.mode==="history"&&["ArrowUp","ArrowDown"].includes(T.key)&&(T.preventDefault(),Xr(T.key==="ArrowUp"?-1:1)))},!0),window.addEventListener("bygone:tour-command",T=>{T.detail==="toggleNarration"&&Or(),T.detail==="pauseNarration"&&Q.pauseForExternalOwner()}),window.addEventListener("beforeunload",()=>Q.dispose(),{once:!0}),Fn(Q.state)}function Ki(){let r=document.getElementById("tour-narration-voice"),a=document.getElementById("tour-listen");if(!A){a&&(a.disabled=!0,a.title="Device narration is not supported by this browser."),r&&(r.disabled=!0),$t("Device narration unavailable");return}let u=()=>{if(n.narrationVoices=window.speechSynthesis.getVoices().filter(d=>!o||d.localService).slice().sort((d,p)=>Number(p.default)-Number(d.default)||d.lang.localeCompare(p.lang)||d.name.localeCompare(p.name)),n.narrationVoiceURI&&n.narrationVoices.length>0&&!n.narrationVoices.some(d=>d.voiceURI===n.narrationVoiceURI)&&(n.narrationVoiceURI="",i.removeItem(I)),r){let d=document.createElement("option");d.value="",d.textContent="System default voice",r.replaceChildren(d,...n.narrationVoices.map(p=>{let g=document.createElement("option");return g.value=p.voiceURI,g.textContent=`${p.name} (${p.lang})${p.default?" \u2014 default":""}`,g})),r.value=n.narrationVoiceURI,r.disabled=n.narrationVoices.length===0}};u(),window.speechSynthesis.addEventListener("voiceschanged",u)}function Wi(){let r=Number(i.getItem($));return D.has(r)?r:1}function Gi(){let r=null;return{speak(a,u){if(!A){u.onError("Device narration is not supported by this browser.");return}let d=new window.SpeechSynthesisUtterance(a.speechText),p=n.narrationVoices.find(g=>g.voiceURI===n.narrationVoiceURI)||(o?n.narrationVoices[0]:null);if(o&&!p){u.onError("No local narration voice is available.");return}p&&(d.voice=p),d.rate=n.narrationRate,d.onend=()=>{r===d&&(r=null),u.onEnd()},d.onerror=g=>{r===d&&(r=null),u.onError(Vi(g.error))},r=d,window.speechSynthesis.speak(d)},pause(){A&&window.speechSynthesis.pause()},resume(){A&&window.speechSynthesis.resume()},cancel(){r=null,A&&window.speechSynthesis.cancel()}}}function Vi(r){return r==="not-allowed"?"Device narration needs permission to play audio.":r==="language-unavailable"||r==="voice-unavailable"?"The selected device voice is unavailable.":`Device narration failed${r?`: ${r}`:"."}`}function Ji(){if(!A||n.mode!=="tour")return;let r=Br("playback-start");r&&(n.renderedNarrationUnit=r,hs(r),Q.start(r,!0))}function Or(){Q.state.kind==="playing"||Q.state.kind==="paused"?Q.togglePause():Ji()}function Br(r){let a=_.find(u=>u.key===n.readingKey);return n.tour&&a?ci(n.tour,a,{entry:r}):null}function Yi(r,a){return!!(n.tour&&Ht(_,r.readingKey,a,st(n.tour)))}function Xi(r,a){if(!n.tour)return null;let u=Ht(_,r.readingKey,a,st(n.tour));return u?ve(u.sceneIndex,u.stepIndex,{readingKey:u.key,narrationNavigation:"controller",narrationEntry:"continuous"}):null}function Zi(){o||fetch("/narration/claim",{method:"POST",cache:"no-store"}).catch(()=>{})}function Fn(r){let a=document.getElementById("tour-listen"),u=document.getElementById("tour-stop"),d=document.getElementById("tour-narration-skip-back"),p=document.getElementById("tour-narration-skip-ahead");if(a){a.disabled=!A||n.mode!=="tour";let g=r.kind==="playing";a.querySelector(".tour-play-pause-icon")?.setAttribute("d",g?"M7 5h4v14H7zM13 5h4v14h-4z":"m8 5 11 7-11 7Z");let y=g?"Pause narration":r.kind==="paused"?"Resume narration":"Listen from the current tour item";a.title=y,a.setAttribute("aria-label",y),document.getElementById("tour-listen-label").textContent=g?"Pause":r.kind==="paused"?"Resume":"Listen"}if(u&&(u.disabled=r.kind!=="playing"&&r.kind!=="paused"),d&&(d.disabled=!Q.canSkipSegment(-1)),p&&(p.disabled=!Q.canSkipSegment(1)),r.kind==="playing"||r.kind==="paused"){let g=r.segmentIndex+1,y=r.unit.segments.length;$t(`${r.kind==="paused"?"Paused":"Speaking"} \xB7 segment ${g} of ${y}`)}else r.kind==="completed"?$t("Narration complete"):r.kind==="error"?$t(r.message):A&&$t("Device voice ready")}function $t(r){let a=document.getElementById("tour-narration-status");a&&(a.textContent=r)}function Qi(r,a){if(document.querySelectorAll(".tour-narration-segment.is-speaking").forEach(b=>{b.classList.remove("is-speaking","is-paused")}),!r)return;let u=[...document.querySelectorAll("[data-narration-segment-id]")].filter(b=>b.dataset.narrationSegmentId===r.id),d=u[0];if(!d||(u.forEach(b=>{b.classList.add("is-speaking"),b.classList.toggle("is-paused",a)}),a))return;let p=document.getElementById("tour-narrative-content");if(!p)return;let g=d.getBoundingClientRect(),y=p.getBoundingClientRect();(g.top<y.top+tn()||g.bottom>y.bottom)&&(d.scrollIntoView({block:"nearest"}),X=p.scrollTop)}let At=[];function tt(){let r=document.getElementById("tour-search-input"),a=document.getElementById("tour-search-scope"),u=document.getElementById("tour-search-status"),d=document.getElementById("tour-search-results");if(!(!n.tour||!r||!a||!u||!d)){if(At=li(n.tour,r.value,a.value),!r.value.trim()){u.textContent="Cmd/Ctrl+Shift+F",d.replaceChildren();return}u.textContent=`${At.length} result${At.length===1?"":"s"}`,d.replaceChildren(...At.map((p,g)=>{let y=document.createElement("button");y.type="button",y.className="tour-search-result",y.setAttribute("role","option"),y.dataset.tourSearchResult=String(g),y.title=`Open ${p.kind==="code"?`${p.label}:${p.lineNumber}`:p.label}`;let b=document.createElement("span");b.className="tour-search-location",b.textContent=p.kind==="code"?`${p.label}:${p.lineNumber}`:p.label;let E=document.createElement("span");return E.className="tour-search-preview",E.textContent=p.preview.trim(),y.append(b,E),y}))}}function es(r){let a=At[r];if(a){if(a.kind==="narrative"){Ee(),ve(a.sceneIndex,a.stepIndex??0,{readingKey:a.readingKey,showIntro:a.stepIndex===void 0});return}_n(a.fileIndex)&&window.requestAnimationFrame(()=>se({type:"revealSearchResult",sideIndex:a.sideIndex,lineNumber:a.lineNumber,startColumn:a.startColumn,endColumn:a.endColumn}))}}function ts(){let r=document.getElementById("tour-shell"),a=document.getElementById("tour-sidebar-resizer"),u=document.getElementById("tour-sidebar-hide"),d=document.getElementById("tour-sidebar-show");!r||!a||!u||!d||(zr(),u.addEventListener("click",()=>Mn(!0)),d.addEventListener("click",()=>Mn(!1)),a.addEventListener("pointerdown",p=>{p.preventDefault(),document.body.classList.add("is-resizing-tour-sidebar"),a.setPointerCapture?.(p.pointerId);let g=b=>Ur(b.clientX),y=()=>{document.body.classList.remove("is-resizing-tour-sidebar"),window.removeEventListener("pointermove",g),window.removeEventListener("pointerup",y),window.removeEventListener("pointercancel",y),i.setItem(w,String(n.tourSidebarWidth))};window.addEventListener("pointermove",g),window.addEventListener("pointerup",y),window.addEventListener("pointercancel",y)}),a.addEventListener("keydown",p=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(p.key))return;p.preventDefault();let g=n.tourSidebarWidth;p.key==="Home"?g=v:p.key==="End"?g=Dn():g+=p.key==="ArrowLeft"?-16:16,Ur(g),i.setItem(w,String(n.tourSidebarWidth))}))}function ns(){let r=Number.parseInt(i.getItem(w)||"",10);return Number.isFinite(r)?Math.min(k,Math.max(v,r)):300}function Dn(){return Math.max(v,Math.min(k,Math.floor(window.innerWidth*.6)))}function Ur(r){n.tourSidebarWidth=Math.min(Dn(),Math.max(v,Math.round(r))),zr(),window.dispatchEvent(new Event("resize"))}function zr(){document.documentElement.style.setProperty("--tour-rail-width",`${n.tourSidebarWidth}px`);let r=document.getElementById("tour-sidebar-resizer");r?.setAttribute("aria-valuemax",String(Dn())),r?.setAttribute("aria-valuenow",String(n.tourSidebarWidth))}function Mn(r){n.tourSidebarHidden=r,document.body.classList.toggle("tour-sidebar-hidden",r);let a=document.getElementById("tour-sidebar-show");a&&(a.hidden=!r),window.dispatchEvent(new Event("resize"))}function rs(){let r=document.getElementById("tour-narrative-resizer");r&&(Bn(),r.addEventListener("pointerdown",a=>{if(a.button!==0)return;a.preventDefault(),document.body.classList.add("is-resizing-tour-narrative"),r.setPointerCapture?.(a.pointerId),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-start"));let u=document.getElementById("tour-narrative").getBoundingClientRect().top,d=g=>qr(g.clientY-u),p=()=>{document.body.classList.remove("is-resizing-tour-narrative"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p),window.removeEventListener("pointercancel",p),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-end")),i.setItem(x,String(n.tourNarrativeHeight))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p),window.addEventListener("pointercancel",p)}),r.addEventListener("keydown",a=>{if(!["ArrowUp","ArrowDown","Home","End"].includes(a.key))return;a.preventDefault();let u=a.key==="Home"?C:a.key==="End"?On():n.tourNarrativeHeight+(a.key==="ArrowUp"?-16:16);qr(u),i.setItem(x,String(n.tourNarrativeHeight))}),window.addEventListener("resize",Bn))}function os(){let r=Number.parseInt(i.getItem(x)||"",10);return Number.isFinite(r)?r:Math.min(window.innerHeight*.38,360)}function On(){return Math.max(C,window.innerHeight-document.getElementById("tour-mode-controls").offsetHeight-S)}function qr(r){n.tourNarrativeHeight=r,Bn()}function Bn(){n.tourNarrativeHeight=Math.min(On(),Math.max(C,Math.round(n.tourNarrativeHeight))),document.getElementById("tour-narrative").style.height=`${n.tourNarrativeHeight}px`;let r=document.getElementById("tour-narrative-resizer");r?.setAttribute("aria-valuemax",String(On())),r?.setAttribute("aria-valuenow",String(n.tourNarrativeHeight)),r&&(r.style.top=`calc(var(--workspace-toolbar-height, 0px) + ${n.tourNarrativeHeight-4}px)`)}function is(){let r=document.getElementById("tour-narrative");if(!r)return;let a=()=>{let u=r.hidden?0:Math.ceil(r.getBoundingClientRect().height);document.documentElement.style.setProperty("--tour-narrative-height",`${u}px`),so(),tn(),window.dispatchEvent(new Event("resize"))};new ResizeObserver(a).observe(r),a()}async function Hr(r){Le("Loading change tour\u2026");let a=Ri(r),u={...n,historyEntries:[...n.historyEntries],fileHistoryCache:new Map(n.fileHistoryCache),displayedPanels:[...n.displayedPanels],historyPanels:[...n.historyPanels],comparisonCommits:[...n.comparisonCommits],comparisonDraftCommits:[...n.comparisonDraftCommits]},d=document.body.className,p=document.getElementById("tour-shell")?.hidden,g=document.getElementById("tour-narrative")?.hidden,y=document.getElementById("tour-mode-controls")?.hidden,b=ge,E=le,P=Pe,R=oe;try{Q.stop();let U=o?.manifest;if(!o){let W=await fetch(r,{cache:"no-store"});if(!W.ok)throw new Error(`Manifest request failed (${W.status}).`);U=await W.json()}let F=ei(U,{exported:!!o}),M=null;if(!o&&new URLSearchParams(window.location.search).has("correspondence")&&r==="/tour.json"){let W=await fetch("/correspondence.json",{cache:"no-store"});if(!W.ok)throw new Error(`Correspondence request failed (${W.status}).`);if(M=await W.json(),M.range.baseOid!==F.range.mergeBaseOid||M.range.headOid!==F.range.headOid)throw new Error("Correspondence revisions do not match this view.")}let z=Qn(window.location.hash);z&&Zn(F,z.mode,z.focus);let H=G(F).deconstructed?"deconstructed":"historical",K=ae(F)?(await we("list",{commit:F.range.headOid},a,F)).entries:[];n.tour=F,n.correspondence=M,n.collapsedSymbolNodes=new Set,n.activeCorrespondenceId=null,n.symbolSelection=null,n.expandedFileSymbols.clear(),document.getElementById("file-symbol-context").hidden=!0,document.getElementById("correspondence-context").hidden=!0,n.authoredTour=F,n.historyPrefix=a,n.zoom=new En(H),n.historyEntries=K,n.historyCommit=null,n.historyPath=null,n.historyPanels=[],n.historyFocus=null,n.historyDiff=null,n.historyChangedFiles=new Set,n.historyFiles=null,n.showAllFiles=!1,n.showAllTourFiles=!1,n.collapsedFileFolders=new Set,n.revealedFilePath=null,n.zoom&&(n.tour=Ct(H)),n.mode="tour",document.body.classList.add("tour-mode"),lt(),ct(),tt();let q=new URLSearchParams(window.location.search),T=xr(n.tour.scenes,q.get("scene"),q.get("step"));if(ve(T.sceneIndex,T.stepIndex,{showIntro:q.get("view")==="overview"||!q.get("step"),readingKey:!q.get("scene")&&!q.get("step")?"title":void 0}),["tour","chapter","conclusion"].includes(q.get("view"))&&en(q.get("view")),n.zoom){let Z={explanation:"deconstructed",revisions:"historical",final:Fe()?"historical":"compare"}[q.get("mode")]||q.get("mode");if(Z==="history"&&de().includes("history"))n.historyPath=q.get("file"),n.tourNavigatorTab="commits",n.zoom.enter("history"),n.tour=Ct("history"),lt(),ct(),await et(n.historyPath,q.get("commit"));else if(Z==="compare"&&de().includes("compare")){let ue=q.get("commits")?.split(",").filter(Boolean);await We("compare",{commits:ue?.length?ue:[q.get("from")||n.authoredTour.range.mergeBaseOid,q.get("to")||n.authoredTour.range.headOid],...q.get("scope")?{path:q.get("scope")}:{}},q.get("file")),q.get("view")==="directory"&&Rn()}else if(Z&&Z!==n.zoom.mode&&de().includes(Z)){await We(Z);let ue=xr(n.tour.scenes,q.get("scene"),q.get("step"));ve(ue.sceneIndex,ue.stepIndex,{showIntro:q.get("view")==="overview"||!q.get("step"),readingKey:!q.get("scene")&&!q.get("step")?"title":void 0}),["tour","chapter","conclusion"].includes(q.get("view"))&&en(q.get("view"))}let ie=He;He=null,ce&&ie&&ie!==n.zoom.mode&&de().includes(ie)&&await We(ie)}return n.directoryEvidence&&q.get("file")&&qn(q.get("file")),Fn(Q.state),n.workspacePromptStatus="",be(),Le(""),z?await ro(z):re()&&window.history.replaceState(null,"",nt(n.zoom.mode,pt(_.find(W=>W.key===n.readingKey)))),document.getElementById("export-loading")?.remove(),window.__BYGONE_EXPORT_READY__=!!o,l=!0,!0}catch(U){let F=document.getElementById("export-loading");F&&(F.textContent=`Could not open export: ${U.message}`),Object.assign(n,u),ge=b,le=E,Pe=P,oe=R,document.body.className=d;let M=document.getElementById("tour-shell");M&&p!==void 0&&(M.hidden=p);let z=document.getElementById("tour-narrative");z&&g!==void 0&&(z.hidden=g);let L=document.getElementById("tour-mode-controls");return L&&y!==void 0&&(L.hidden=y),n.mode==="tour"&&n.tour&&(lt(),ct(),tt(),be()),Le(`Could not load change tour: ${U instanceof Error?U.message:String(U)}`),!1}}function lt(){Zt();let r=n.tour;if(!r)return;let a=document.getElementById("tour-shell"),u=document.getElementById("tour-title"),d=document.getElementById("tour-source"),p=document.getElementById("tour-range"),g=document.getElementById("tour-stats"),y=document.getElementById("tour-authoring-coverage"),b=document.getElementById("tour-scenes"),E=document.getElementById("tour-scene-count"),P=document.getElementById("tour-files"),R=document.getElementById("tour-file-count");if(!a||!u||!d||!p||!g||!y||!b||!E||!P||!R)throw new Error("Presenter UI is incomplete.");a.hidden=!1,u.textContent=r.title,document.title=pi(r),r.sourceUrl?(d.href=r.sourceUrl,d.hidden=!1):(d.removeAttribute("href"),d.hidden=!0);let U=Qr(r.range.baseRef),F=Qr(r.range.headRef),M=r.range.headOid.slice(0,7);if(p.textContent=`${re()?"Tour range: ":""}${U} \u2192 ${F}${F===M?"":` \xB7 ${M}`}`,g.textContent=`${Dt(r.summary.changedFiles,"file")} \xB7 +${r.summary.additions} \u2212${r.summary.deletions} \xB7 ${Dt(r.summary.commitCount,"commit")}`,cs(y,r.authoringCoverage),Si(document.getElementById("tour-audience"),re()?r:null),E.textContent=re()&&r.scenes.length?String(r.scenes.length):"",R.textContent=String(r.files.length),b.replaceChildren(),re()){Wn();let L=Ve("Intro","Read the introduction and tour route",()=>Ae(_.find(H=>H.kind==="title")));L.className="tour-scene",L.dataset.readingLink="title",b.append(L)}let z=new Map(r.scenes.map(L=>[L.id,L]));for(let L of r.chapters){let H=eo(`chapter:${L.id}`,`${r.chapters.indexOf(L)+1}. ${L.title}`,"tour-chapter-link",()=>{let q=_.find(T=>T.kind==="chapter"&&T.chapterId===L.id)||_.find(T=>T.kind==="scene"&&L.sceneIds.includes(r.scenes[T.sceneIndex]?.id));q&&Ae(q)}),K=H.children;b.append(H.group);for(let q of L.sceneIds){let T=z.get(q);if(!T)continue;let W=r.scenes.indexOf(T),Z=eo(`scene:${T.id}`,T.title,"tour-scene",()=>ve(W,0,{userNavigation:!0,showIntro:!0})),ie=Z.link;ie.replaceChildren(),ie.dataset.sceneId=T.id,T.kind==="text-diff"&&(ie.dataset.filePath=T.path),Z.link.title=`Open scene: ${T.kind==="text-diff"?T.path:T.title}`;let ue=document.createElement("span");ue.className="tour-scene-copy";for(let[ye,xe]of[["tour-scene-title",`${W+1}. ${T.title}`],["tour-scene-path",T.kind==="text-diff"?T.path:T.kind==="deconstructed-diff"?`${Dt(T.panels.length-1,"comparison stage")} \xB7 ${Dt(T.steps.length,"tour slide")}`:$e(T)?Dt(T.steps.length,T.steps.every(Oe=>Oe.image)?"image":"step"):"Discussion"],["tour-scene-note",T.takeaway]]){let Oe=document.createElement("span");Oe.className=ye,Oe.textContent=xe,ue.append(Oe)}if(ie.append(ue),K.append(Z.group),$e(T)){let ye=Z.children;ye.classList.add("tour-outline-steps"),ye.dataset.sceneId=T.id,T.steps.forEach((xe,Oe)=>{let Je=document.createElement("button");Je.type="button",Je.className="tour-outline-step",Je.dataset.sceneId=T.id,Je.dataset.stepIndex=String(Oe);let Cs=T.kind==="deconstructed-diff"?`Stage ${(xe.stageIndex??xe.pairIndex)+1}: `:"";Je.textContent=`${Oe+1}. ${xe.title}`,Je.title=`${Cs}${xe.title}`,Je.addEventListener("click",()=>ve(W,Oe,{userNavigation:!0,showIntro:!1})),ye.append(Je)})}else Z.toggle.hidden=!0}}if(re()&&r.conclusion){let L=Ve("Conclusion",`Read ${r.conclusion.title}`,()=>Ae(_.find(H=>H.kind==="conclusion")));L.className="tour-scene",L.dataset.readingLink="conclusion",b.append(L)}Un(),Lt(),Pt(n.tourNavigatorTab)}function Lt(){let r=n.correspondence;document.getElementById("correspondence-tab").hidden=!r,document.getElementById("correspondence-availability").hidden=!!r;let a=document.getElementById("correspondence-list");if(a.replaceChildren(),!r)return;let u=document.getElementById("correspondence-filter").value.toLowerCase(),d=document.getElementById("correspondence-all").checked,p=document.getElementById("correspondence-unmatched")?.checked??!0,g=$r(r,{all:d,includeUnmatched:p,query:u});if(document.getElementById("correspondence-status").textContent=`${r.range.baseOid.slice(0,7)} \u2192 ${r.range.headOid.slice(0,7)} \xB7 ${r.status} analysis \xB7 ${g.matchingRelations} of ${r.relations.length} inferred mappings \xB7 ${g.matchingUnmatched} unmatched symbols \xB7 ${r.unresolved.length} ambiguous groups. Behavior unassessed.`,jr(a,g.files),_r(g),!g.files.length){let y=document.createElement("p");y.className="history-rail-empty",y.textContent=u.trim()?"No symbols match this filter.":"No symbols match the current filters. Enable the include options to see more inventoried declarations.",a.append(y)}as(r)}function _r(r=$r(n.correspondence,{all:document.getElementById("correspondence-all").checked,includeUnmatched:document.getElementById("correspondence-unmatched")?.checked??!0,query:document.getElementById("correspondence-filter").value})){document.querySelectorAll("#tour-files .file-symbols, #tour-files .file-symbol-toggle").forEach(a=>a.remove());for(let a of document.querySelectorAll("#tour-files .tour-file")){a.parentElement.classList.remove("has-file-symbols");let u=n.tour.files.find(E=>E.path===a.dataset.filePath),d=r.files.filter(E=>E.path===u?.path||E.path===u?.previousPath),p=d.length?{path:u.path,children:d.flatMap(E=>E.children)}:null;if(!p?.children.length)continue;let g=document.createElement("div");g.className="file-symbols",g.id=`file-symbols-${++Xe}`,jr(g,p.children);let y=document.createElement("button");y.type="button",y.className="file-symbol-toggle",y.setAttribute("aria-controls",g.id);let b=()=>{let E=n.expandedFileSymbols.has(p.path);g.hidden=!E,y.setAttribute("aria-expanded",String(E)),y.dataset.tooltip=E?"Hide Symbols":"Show Symbols",y.setAttribute("aria-label",`${y.dataset.tooltip}: ${p.path}`),y.textContent=E?"\u25BE":"\u25B8"};y.addEventListener("click",()=>{n.expandedFileSymbols.has(p.path)?n.expandedFileSymbols.delete(p.path):n.expandedFileSymbols.add(p.path),b()}),b(),a.parentElement.classList.add("has-file-symbols"),a.parentElement.append(y,g)}}function jr(r,a){let u=n.correspondence,d=document.getElementById("correspondence-filter").value,p=++Xe,g=document.createElement("ul");g.className="correspondence-tree",r.append(g);let y=a.map(b=>({node:b,parent:g})).reverse();for(;y.length;){let{node:b,parent:E}=y.pop(),P=document.createElement("li");P.dataset.symbolKey=b.key,P.classList.toggle("is-context",b.type==="symbol"&&b.context);let R=document.createElement("div");R.className="correspondence-heading";let U=document.createElement("ul");U.id=`symbols-${p}-${encodeURIComponent(b.key)}`;let F=document.createElement("button");F.type="button",F.className="correspondence-toggle";let M=b.type==="file"?b.path:b.entry.name,z=()=>{F.setAttribute("aria-expanded",String(!U.hidden)),F.setAttribute("aria-label",`${U.hidden?"Expand":"Collapse"} ${M}`),F.textContent=U.hidden?"\u25B8":"\u25BE"};if(U.hidden=!d.trim()&&n.collapsedSymbolNodes.has(b.key),F.setAttribute("aria-controls",U.id),F.addEventListener("click",()=>{U.hidden=!U.hidden,U.hidden?n.collapsedSymbolNodes.add(b.key):n.collapsedSymbolNodes.delete(b.key),z()}),z(),F.hidden=!b.children.length,R.append(F),P.append(R),b.type==="file"){P.classList.add("correspondence-file");let L=document.createElement("button");L.type="button",L.className="correspondence-file-label",L.textContent=b.path,L.title=b.path,L.setAttribute("aria-current",String(n.activeTourFilePath===b.path)),L.addEventListener("click",()=>{let H=n.tour.files.findIndex(K=>K.path===b.path||K.previousPath===b.path);H>=0&&ft(H)}),R.append(L)}else{let{before:L,after:H,relation:K}=b,q=document.createElement("button");q.type="button",q.className="correspondence-item";let T=K?.id||b.key;q.dataset.correspondenceId=T,q.dataset.sourceReference=String(!!b.sourceReference),q.dataset.changeKind=K?b.changed?"modified":"unchanged":b.ambiguous?"ambiguous":b.side==="before"?"deleted":"added",q.classList.toggle("is-relocated",!!b.sourceReference||!!K?.pathChanged),q.setAttribute("aria-pressed",String(n.activeCorrespondenceId===T));let W=xe=>`${xe.path}:${xe.startLine}`;q.title=K?`Compare ${W(L)} with ${W(H)}`:`Inspect ${W(b.entry)} \xB7 no accepted match`;let Z=document.createElement("strong");Z.textContent=L&&H&&L.name!==H.name?`${L.name} \u2192 ${H.name}`:b.entry.name;let ie=document.createElement("span");ie.textContent=K?`${W(L)} \u2192 ${W(H)}`:`${W(b.entry)} \xB7 ${b.side==="before"?"base":"head"}`,ie.className="correspondence-location";let ue=document.createElement("span"),ye=K?[b.sourceReference?"Before location":"",K.pathChanged?"Moved":"",K.nameChanged?"Renamed":"",K.rawEqual?"":"Edited",b.changed&&!K.pathChanged&&!K.nameChanged&&K.rawEqual?"Reparented":""].filter(Boolean):[b.side==="before"?"Before only":"After only",b.ambiguous?"Ambiguous":"Unmatched"];ue.textContent=`${b.entry.kind} \xB7 ${ye.join(" \xB7 ")||"Unchanged text"}${b.context?" \xB7 ancestor context":""}`,q.append(Z,ie,ue),q.addEventListener("click",()=>{Ee(),oe+=1,document.body.classList.remove("tour-discussion"),Ie=null,Q.interruptForExploration(),n.directoryEvidence=null,n.symbolSelection={before:L,after:H,relation:K,ambiguous:b.ambiguous,side:b.side,entry:b.entry,id:T,range:u.range},Gt(!1),r.querySelectorAll(".correspondence-item").forEach(xe=>xe.setAttribute("aria-pressed",String(xe.dataset.correspondenceId===T)))}),R.append(q)}E.append(P),b.children.length&&(P.append(U),y.push(...b.children.map(L=>({node:L,parent:U})).reverse()))}}function Gt(r=!1){let a=n.symbolSelection;if(!a)return;let{before:u,after:d,relation:p,range:g}=a,y=(F,M)=>F?r?n.correspondence?.documents[M].find(z=>z.path===F.path)?.text??a.context?.[M==="before"?"leftContent":"rightContent"]??null:F.text:"",b=y(u,"before"),E=y(d,"after");if(b===null||E===null){document.getElementById("correspondence-selection").textContent="Full file context is unavailable in this older artifact. Rebuild the correspondence artifact to include it.";return}++ge,t.clear(),n.displayedPanels=[],n.activeCorrespondenceId=a.id,n.activeTourFilePath=d?.path||u?.path,n.symbolContext=r,document.getElementById("correspondence-context").hidden=r,document.getElementById("file-symbol-context").hidden=!1,document.getElementById("file-symbol-context").textContent=r?"Return to symbol comparison":"Show file context",document.getElementById("correspondence-selection").textContent=p?`${u.name}: inferred correspondence \xB7 behavior unassessed. ${r?"Complete source and destination files; declarations highlighted.":`Complete declarations; line 1 starts at source lines ${u.startLine} / ${d.startLine}.`}`:`${a.entry.name}: ${a.ambiguous?"ambiguous":"unmatched"} ${a.side} symbol. The empty side does not establish an addition or deletion.`;let P=r?[[u,"left"],[d,"right"]].filter(([F])=>F).map(([F,M])=>({side:M,startLine:F.startLine,endLine:F.endLine,label:F.name,active:!0})):[],R=F=>F?`${F.path}:${F.startLine}`:"No accepted match",U=ke(b,E);se({type:"showDiff",file1:`${R(u)} @ ${g.baseOid.slice(0,7)}`,file2:`${R(d)} @ ${g.headOid.slice(0,7)}`,sourceInfo:{leftPath:u?.path||a.entry.path,rightPath:d?.path||a.entry.path},comparisonId:`correspondence-${a.id}-${r?"file":"symbol"}`,leftContent:b,rightContent:E,diffModel:U,history:null,correspondenceView:!0,editableSides:{left:!1,right:!1},tourAnnotations:P,initialChangeIndex:r?Kn(U,d?"right":"left",(d||u).startLine):0,comparisonSummary:p?"Inferred symbol correspondence \xB7 behavior unassessed":"No accepted symbol match \xB7 addition/deletion unassessed"}),pe(),document.querySelectorAll(".correspondence-item").forEach(F=>F.setAttribute("aria-pressed",String(F.dataset.correspondenceId===a.id))),r&&Pt("files")}function ss(r){document.getElementById("correspondence-filter").value="",document.getElementById("correspondence-all").checked=!0;let a=document.getElementById("correspondence-unmatched");a&&(a.checked=!0),Lt();let u=n.correspondence.relations.find(y=>y.sourceId===r||y.destinationId===r),d=[...document.querySelectorAll("#correspondence-list .correspondence-item")],p=d.find(y=>y.parentElement.parentElement.dataset.symbolKey===`after:${r}`||y.parentElement.parentElement.dataset.symbolKey===`before:${r}`)||d.find(y=>y.dataset.correspondenceId===u?.id);if(!p)return;let g=p.closest("li").parentElement;for(;g?.closest("#correspondence-list");)g.tagName==="UL"&&g.hidden&&g.previousElementSibling?.querySelector(".correspondence-toggle")?.click(),g=g.parentElement;p.click(),p.focus(),p.scrollIntoView({block:"nearest"})}function as(r){let a=document.getElementById("correspondence-limitations"),u=new Set([...a.querySelectorAll("details[open]")].map(b=>b.dataset.diagnosticCategory));a.replaceChildren();let d=(b,E)=>{let P=document.createElement("p");P.textContent=E,b.append(P)},p=new Map([...r.symbols.before,...r.symbols.after].map(b=>[b.id,b]));d(a,"Categories overlap and use different units. Rejected records are not missing functions; these counts do not measure coverage."),r.diagnostics||d(a,"Detailed diagnostics unavailable. This older artifact retains summaries and inventoried symbols only.");for(let b of r.diagnostics?.scope||[])d(a,b);for(let b of Ai(r)){let E=document.createElement("details");E.dataset.diagnosticCategory=b.category,E.open=u.has(b.category);let P=document.createElement("summary");P.textContent=`${b.title} \xB7 ${b.count}`,E.append(P),d(E,b.description);let R=document.createElement("ul");R.className="correspondence-diagnostics";for(let U of b.records){let F=document.createElement("li");d(F,Ar(U.reason));let M=document.createElement("code");M.textContent=U.reason,F.append(M),U.producerId&&d(F,`Engine record: ${U.producerId}`),U.message&&d(F,U.message);for(let z of U.locations){let L=p.get(z.symbolId),H=n.tour?.files.find(T=>T.path===z.path&&T.kind==="text-diff"),K=`${z.side?`${z.side} @ ${(z.side==="before"?r.range.baseOid:r.range.headOid).slice(0,7)} \xB7 `:"changed path \xB7 "}${z.path}${z.line?`:${z.line}`:""}${L?` (${L.name})`:""}`,q=document.createElement(L||H?"button":"span");if(q.textContent=K,q.className="correspondence-diagnostic-location",L||H?(q.type="button",q.title=L?"Inspect symbol (enables both include options and clears search)":"Inspect complete file context",q.addEventListener("click",()=>{if(L)return ss(L.id);Ee(),oe+=1,Q.interruptForExploration(),n.directoryEvidence=null,n.activeCorrespondenceId=null,ut(H,[],Jt(H.path),null,z.line&&z.side?{revision:z.side==="before"?"base":"head",startLine:z.line}:null),document.getElementById("correspondence-selection").textContent=`Complete file context: ${K}`,document.querySelectorAll(".correspondence-item").forEach(T=>T.setAttribute("aria-pressed","false"))})):q.title="File context is not available in this comparison.",F.append(q),z.reason){d(F,Ar(z.reason));let T=document.createElement("code");T.textContent=z.reason,F.append(T)}}R.append(F)}b.records.length&&E.append(R),a.append(E)}let g=document.createElement("details"),y=document.createElement("summary");y.textContent="Analysis summaries and provenance",g.append(y);for(let b of r.limitations)d(g,b);a.append(g)}function Un(){let r=n.tour,a=document.getElementById("tour-files");document.getElementById("tour-file-count").textContent=String(r.files.length),a.replaceChildren(Kr(Ii(r.files,d=>d.path),(d,p,g)=>{let y=document.createElement("button");y.type="button",y.className=`tour-file${d.kind==="omitted"?" is-omitted":""}`,y.dataset.filePath=d.path,y.disabled=d.kind==="omitted",y.title=d.kind==="omitted"?`${d.path}: ${d.reason}`:`Open file: ${d.path}`,d.kind==="text-diff"&&y.addEventListener("click",()=>ft(p));let b=document.createElement("span");b.className="tour-file-marker",b.textContent=d.kind==="omitted"?"\xD7":jn(d.changeKind);let E=document.createElement("span");E.className="tour-file-copy";let P=document.createElement("span");P.className="tour-file-path",P.textContent=g;let R=document.createElement("span");return R.className="tour-file-meta",R.textContent=d.kind==="omitted"?`Not rendered \xB7 ${d.reason}`:Number.isFinite(d.additions)?`${Qt(d.changeKind)} \xB7 +${d.additions} \u2212${d.deletions}`:Qt(d.changeKind),E.append(P,R),y.append(b,E),y}));let u=document.createElement("div");u.className="history-rail-empty",u.dataset.fileTreeEmpty="",a.append(u),n.correspondence&&_r(),pe()}function Kr(r,a){let u=document.createElement("ul");u.className="file-tree";for(let d of r.folders){let p=document.createElement("li"),g=document.createElement("details");g.dataset.fileFolder=d.path,g.open=!n.collapsedFileFolders.has(d.path);let y=document.createElement("summary"),b=document.createElement("span");b.className="tour-file-path",b.textContent=d.name,y.append(b),y.title=d.path,g.append(y,Kr(d,a)),p.append(g),u.append(p)}for(let{item:d,index:p,name:g}of r.files){let y=document.createElement("li");y.append(a(d,p,g)),u.append(y)}return u}function cs(r,a){if(r.replaceChildren(),r.hidden=!a,!a)return;let u=[{metric:"walkthrough",label:"Anchored diff hunks",covered:a.walkthrough.coveredUnits,total:a.walkthrough.includedUnits,percent:a.walkthrough.coveragePercent,description:"Distinct change hunks referenced by authored base/head focus anchors. Revision-stack steps are not counted."},...a.explanationAssignments.map(d=>({metric:"assignment",label:a.explanationAssignments.length>1?`Deconstructed assignment \xB7 ${d.sceneId}`:"Deconstructed assignment",covered:d.completeUnits,total:d.totalUnits,percent:d.assignmentPercent,description:`${d.assignedUnits} assigned, ${d.excludedUnits} explicitly excluded.`}))];for(let d of u){let p=document.createElement("div");p.className="tour-coverage-item",p.dataset.metric=d.metric,p.dataset.tooltip=d.description,p.tabIndex=0,p.setAttribute("aria-description",d.description);let g=document.createElement("div");g.className="tour-coverage-heading";let y=document.createElement("span");y.textContent=d.label;let b=document.createElement("strong");b.textContent=`${d.covered}/${d.total} \xB7 ${d.percent}%`,g.append(y,b);let E=document.createElement("div");E.className="tour-coverage-meter",E.setAttribute("role","progressbar"),E.setAttribute("aria-label",d.label),E.setAttribute("aria-valuemin","0"),E.setAttribute("aria-valuemax","100"),E.setAttribute("aria-valuenow",String(d.percent));let P=document.createElement("span");P.style.width=`${d.percent}%`,E.append(P),p.append(g,E),r.append(p)}}let Ie=null;function ve(r,a=0,u={}){let d=n.tour;if(!d||u.readingKey!=="conclusion"&&(r<0||r>=d.scenes.length))return null;if(t.clear(),u.userNavigation&&Ee(),n.zoom?.mode==="history"&&!n.zoomSwitching){let z=d.scenes[r],L=z.path||z.steps?.[a]?.file||n.activeTourFilePath;return et(L,n.historyCommit).catch(H=>{document.getElementById("tour-mode-status").textContent=H.message}),null}let p=Ie?.tour===d&&!u.zoomLanding&&!s?Ie.context:null;n.directoryEvidence=null,n.activeCorrespondenceId=null,Ge(""),Zt(),Wn();let g=_.find(z=>z.key===u.readingKey)||xn(_,r,a,u.showIntro?"overview":null);g&&g.kind!=="step"&&g.kind!=="conclusion"&&g.kind!=="title"&&st(d)&&(g=xn(_,g.sceneIndex,0)),g&&(r=g.sceneIndex,a=g.stepIndex);let y=d.scenes[r],b=rn(d,g);document.body.classList.toggle("tour-discussion",b==="narrative");let E=g.kind==="title"||g.kind==="chapter"||g.kind==="conclusion",P=document.body.classList.contains("tour-bookend")!==E;document.body.classList.toggle("tour-bookend",E),n.readingKey=g?.key||"title",n.sceneIntroVisible=g?.kind!=="step",n.narrativeParent=g?.kind==="conclusion"?"conclusion":g?.kind==="title"?"tour":g?.kind==="chapter"?"chapter":null,n.activeSceneIndex=r,n.activeStepIndex=$e(y)?Math.min(Math.max(a,0),Math.max(y.steps.length-1,0)):0,n.tourFocusFilePath=!y||n.narrativeParent?null:y.kind==="text-diff"?y.path:y.kind==="walkthrough"?y.steps[n.activeStepIndex]?.diff.path??null:Me(y)?y.steps[n.activeStepIndex]?.file??null:null;let R=y?Zr(d,r):null;ws();let U=u.preserveNarration&&Q.engaged?Q.state.unit:Br(u.narrationEntry||"playback-start");n.renderedNarrationUnit=U,io(y,R,U),(!u.fromReadingScroll||P)&&ao(n.readingKey),U&&!u.zoomLanding&&!u.preserveNarration&&(!n.zoom||re())&&(u.narrationNavigation==="linear"?Q.followLinearNavigation(U):u.narrationNavigation!=="controller"&&Q.followDirectNavigation(U)),Se();let F=me(d,g,n.zoom?.mode);b==="overview"?Ie={tour:d,context:F}:b!=="narrative"?Ie=p?{tour:d,context:p}:null:g.kind!=="chapter"&&(Ie=null);let M=J.get(g.key)?.querySelector(".tour-scene-orientation");return M&&F&&(M.textContent=Gn(p,F)),b==="overview"&&zn()?U:b==="narrative"?(++ge,n.displayedPanels=[],n.activeTourFilePath=null,se({type:"updateCommitHistory",history:Nr()}),document.body.classList.add("tour-discussion"),n.tourFocusFilePath=null,pe(),be(),U):(document.body.classList.remove("tour-discussion"),y.kind==="walkthrough"?(Vr(y),U):Me(y)?(Jr(y),U):(ut(y,Vt(y.path)),U))}function Ge(r){let a=document.getElementById("status-banner");a.textContent=r,a.hidden=!r}function zn(){let r=n.tour?.scenes[n.activeSceneIndex];if(!re()||!r||st(n.tour)||n.narrativeParent||!r.overview)return!1;let a=nn(n.tour,r);n.directoryEvidence=a,n.activeCorrespondenceId=null,n.activeTourFilePath=null,pe(),document.body.classList.remove("tour-discussion");let u=me(n.tour,_.find(d=>d.key===n.readingKey),n.zoom?.mode);return se(sn(u.labels,a.entries)),document.getElementById("file-info").textContent=gt(u),Ge(a.entries.length?"":"No changed files in this directory for the selected comparison."),Se(),!0}function qn(r){let a=n.directoryEvidence;if(!a)return!1;let u=a.files.find(d=>d.path===r);if(!u){let d=a.omitted.find(p=>p.path===r);return Ge(d?`${r}: ${d.reason}`:"This file has no change in the overview comparison."),!1}return Ee(),Ge(""),ut(u,[],`directory-${n.tour.scenes[n.activeSceneIndex].id}-${r}`),Se(),!0}function Vt(r){let a=n.tour;return!a||!r?[]:ui(a,r,n.activeSceneIndex,n.activeStepIndex)}function ds(r,a){let u=n.tour;return!u||!r?[]:fi(u,r,n.activeSceneIndex,n.activeStepIndex,(d,p)=>Er(a?.[d]?.diffModel,p))}function Jt(r){return`file::${r}`}function ut(r,a=[],u=Jt(r.path),d=null,p=null){if(document.body.classList.remove("tour-discussion"),!n.tour)return;t.clear(),n.activeCorrespondenceId=null,n.activeTourFilePath=n.zoom?.mode==="history"&&n.historyPath||r.path,pe();let y=ke(r.leftContent,r.rightContent),b=Wr(r,r.leftLabel,n.zoom?.mode==="compare"?"from":"base"),E=Wr(r,r.rightLabel,n.zoom?.mode==="compare"?"to":"head"),P=a.find(U=>U.active)||p&&{side:p.revision==="head"?"right":"left",startLine:p.startLine},R=r.changeKind==="added"?{left:!1,right:!0}:r.changeKind==="deleted"?{left:!0,right:!1}:{left:!0,right:!0};se({type:"showDiff",file1:`1. ${b}`,file2:`2. ${E}`,comparisonId:`tour-${u}`,leftContent:r.leftContent,rightContent:r.rightContent,canReturnToDirectory:!!n.directoryEvidence,sourceInfo:{leftPath:r.previousPath||r.path,rightPath:r.path},fileExists:R,diffModel:y,history:d,fileNavigation:{canGoPrevious:!!Nt(-1),canGoNext:!!Nt(1)},editableSides:{left:!1,right:!1},comparisonSummary:Hn(r.path,void 0,!n.directoryEvidence),initialChangeIndex:P?Kn(y,P.side,P.startLine):r.focusChangeIndex,tourAnnotations:a})}function Hn(r,a,u=!1){if(!re())return r;let d=_.find(K=>K.key===n.readingKey),p=d&&me(n.tour,d,n.zoom?.mode),g=a===void 0?d:{kind:"step",sceneIndex:n.activeSceneIndex,stepIndex:n.activeStepIndex},y=g&&me(n.tour,g,n.zoom?.mode,a),b=u||!y?lo(n.tour,r):y,E={...b,scope:r,scopeKey:JSON.stringify([r]),overview:!1},P=Ie?.tour===n.tour?Ie.context:null,R=P&&(P.comparisonKey!==E.comparisonKey||P.scopeKey!==E.scopeKey)?Gn(P,E):gt(E);Ie={tour:n.tour,context:E};let U=p,F=d&&rn(n.tour,d)==="preview"&&U?.scope===r&&U.comparisonKey===b.comparisonKey,M=d&&n.tour.scenes[d.sceneIndex],z=M&&$e(M)?M.steps[d.kind==="step"?d.stepIndex:0]:null;return`${z&&U?.scope===r&&U.comparisonKey===b.comparisonKey?`${F?"Coming up":"Evidence for"}: ${Be(n.tour,{kind:"step",key:`step:${M.id}:${z.id}`,sceneIndex:d.sceneIndex,stepIndex:d.kind==="step"?d.stepIndex:0})} \xB7 `:""}${R}`}function Wr(r,a,u){if(n.zoom?.mode==="history")return a;let d=a.startsWith(r.path)?a.slice(r.path.length).trim():a.trim();return d?`${u} ${d}`:u}function Gr(r){return r.status==="inferred"?r.id:`${r.before?"before":"after"}:${r.id}`}function Vr(r){let a=r.steps[n.activeStepIndex];if(a){if(a.symbol&&!n.sceneIntroVisible){let u=a.symbol;n.symbolSelection={...u,id:Gr(u),entry:u.after||u.before,relation:u.status==="inferred"?{id:u.id}:null,ambiguous:u.status==="ambiguous",side:u.before?"before":"after"},Gt(!1);return}if(a.image){++ge,n.displayedPanels=[],n.activeCorrespondenceId=null,n.activeTourFilePath=a.diff.path,t.show(a.image,a.title),pe();return}ut(a.diff,n.sceneIntroVisible?[]:Vt(a.diff.path),Jt(a.diff.path),null,n.sceneIntroVisible?a.focus:null)}}function Jr(r){let a=r.steps[n.activeStepIndex];a&&Yr(r,a.file,a)}function Yr(r,a,u){document.body.classList.remove("tour-discussion");let d=Rt(r,a);if(!u||!d)return;n.activeCorrespondenceId=null,n.activeTourFilePath=d.path,pe();let p=d.panels.map((M,z)=>({id:`${r.id}-${d.path}-${M.id}`,commit:r.kind==="stacked-diff"?Ft(r)[z].oid:void 0,label:M.label,path:M.path||d.path,content:M.content,savedContent:M.content,dirty:!1,editable:!1,stackId:Ft(r)[z].id})),g=Vn(p,(M,z)=>ke(M.content,z.content)),y=n.sceneIntroVisible?[]:ds(d.path,g),b=y.find(M=>M.active),E=b?.pairIndex??u.pairIndex,P=b?.side??u.side,R=b?.startLine??u.startLine,U=g[E]?.diffModel,F=U&&R?Kn(U,P,R):0;se({type:"showMultiDiff",panels:p,pairs:g,activePanelId:p[E+(P==="right"?1:0)]?.id,activePairIndex:E,initialChangeIndex:F,revealFirstChangeInEachPanel:r.kind==="deconstructed-diff",history:null,fileNavigation:{canGoPrevious:!!Nt(-1),canGoNext:!!Nt(1)},mutationEnabled:!1,comparisonSummary:Hn(d.path,E),tourAnnotations:y})}function Yt(r){if(!re())return!1;let a=Ht(_,n.readingKey,r,st(n.tour));return a?(Ae(a,!1,!0),!0):!1}function Xt(){return{paths:n.tour.files.filter(r=>r.kind==="text-diff").map(r=>r.path),currentPath:n.activeTourFilePath,changedPaths:n.zoom?.mode==="compare"?n.compare?.changedPaths:n.historyChangedFiles}}function Nt(r){let a=n.tour;if(!a||r!==-1&&r!==1)return null;let u=a.scenes[n.activeSceneIndex];if(n.zoom?.mode==="history"||n.zoom?.mode==="compare"){let d=Ye(Xt(),r);return d?{fileIndex:a.files.findIndex(p=>p.path===d),path:d}:null}if(n.directoryEvidence){let d=n.directoryEvidence.files,p=d.findIndex(b=>b.path===n.activeTourFilePath),g=d[p+r],y=g?a.files.findIndex(b=>b.path===g.path):-1;return y>=0?{fileIndex:y,path:g.path}:null}if(Me(u)){let d=u.steps[n.activeStepIndex]?.pairIndex;if(!Number.isInteger(d))return null;let p=a.files.flatMap(b=>{if(b.kind!=="text-diff")return[];let E=Rt(u,b.path);return E?[E]:[]}),g=ri(p,d,n.activeTourFilePath,r);if(!g)return null;let y=a.files.findIndex(b=>b.kind==="text-diff"&&b.path===g.path);return y>=0?{fileIndex:y,path:g.path}:null}return oi(a.files,n.activeTourFilePath,r)}function Xr(r){let a=Nt(r);return a?ft(a.fileIndex):!1}function _n(r,a=!0){let u=n.tour?.files[r];return!u||u.kind!=="text-diff"?!1:(a&&Q.interruptForExploration(),n.directoryEvidence=null,ut(u,Vt(u.path),Jt(u.path)),!0)}function ft(r){let a=n.tour?.files[r];if(!a||a.kind!=="text-diff")return!1;if(Ee(),n.activeCorrespondenceId=null,n.symbolContext=!1,document.getElementById("file-symbol-context").hidden=!n.symbolSelection,document.getElementById("file-symbol-context").textContent="Return to symbol comparison",document.querySelectorAll(".correspondence-file-label").forEach(d=>d.setAttribute("aria-current",String(d.textContent===a.path))),document.querySelectorAll(".correspondence-item").forEach(d=>d.setAttribute("aria-pressed","false")),n.zoom?.mode==="history")return et(a.path,n.historyCommit).catch(d=>{document.getElementById("tour-mode-status").textContent=d.message}),!0;if(n.zoom?.mode==="compare")return Fr(a).catch(d=>{document.getElementById("tour-mode-status").textContent=d.message}),!0;if(n.directoryEvidence&&re())return qn(a.path);n.zoomSwitching||Q.interruptForExploration();let u=n.tour?.scenes[n.activeSceneIndex];if(Me(u)){let d=u.steps[n.activeStepIndex];return d&&Rt(u,a.path)?(Yr(u,a.path,d),!0):!1}return _n(r,!1)}function Rt(r,a){let u=r?.files?.find(g=>g.path===a);if(u||r?.kind!=="deconstructed-diff")return u;let d=n.tour?.files.find(g=>g.kind==="text-diff"&&g.path===a);if(!d||d.kind!=="text-diff")return null;let p=d.changeKind!=="deleted";return{path:d.path,panels:Ft(r).map(g=>({id:g.id,label:`${g.label} / ${d.path}${p?"":" (absent)"}`,path:p?d.path:void 0,content:p?d.rightContent:"",exists:p}))}}function ls(){if(n.narrativeParent)return!!ve(n.activeSceneIndex,n.activeStepIndex,{readingKey:n.readingKey,preserveNarration:!0});if(n.directoryEvidence)return zn();let r=n.tour?.scenes[n.activeSceneIndex];if(!r||!n.tourFocusFilePath)return!1;if(r.kind==="walkthrough")Vr(r);else if(Me(r))Jr(r);else if(r.kind==="text-diff")ut(r,Vt(r.path));else return!1;return!0}function Pt(r){if(!["tour","files","commits","symbols"].includes(r))return;r==="symbols"&&!n.correspondence&&(r="files");let a=re()&&!!n.tour?.scenes.length;r==="tour"&&!a&&(r="commits"),n.tourNavigatorTab=r,document.querySelectorAll("[data-tour-navigator]").forEach(u=>{let d=u.dataset.tourNavigator===r;u.disabled=u.dataset.tourNavigator==="tour"&&!a,u.classList.toggle("is-active",d),u.setAttribute("aria-selected",String(d)),u.tabIndex=d?0:-1}),document.querySelectorAll("[data-tour-navigator-panel]").forEach(u=>{u.hidden=u.dataset.tourNavigatorPanel!==r}),window.dispatchEvent(new CustomEvent("bygone:present-navigator-change",{detail:{tab:r}})),window.dispatchEvent(new Event("resize"))}function Zt(){let r=!!(n.directoryEvidence&&re()),a=r?n.activeTourFilePath:null;document.body.classList.toggle("tour-directory-overview",r),document.body.classList.toggle("tour-directory-file-open",!!a),document.getElementById("tour-directory-breadcrumb").hidden=!r;let u=document.getElementById("tour-directory-root");a?u.removeAttribute("aria-current"):u.setAttribute("aria-current","location"),document.getElementById("tour-directory-separator").hidden=!a;let d=document.getElementById("tour-directory-file");d.textContent=a||"",d.hidden=!a;let p=document.getElementById("tour-directory-narration-context");p.hidden=!a,p.textContent=`Narration describes the ${n.narrativeParent||"overview"}`}function pe(){Zt();let r=document.getElementById("file-symbol-context");r.hidden=!n.symbolSelection,r.textContent=n.activeCorrespondenceId&&!n.symbolContext?"Show file context":"Return to symbol comparison";let a=n.activeCorrespondenceId?[n.symbolSelection?.before?.path,n.symbolSelection?.after?.path].filter(Boolean):[],u=n.tour?.files.find(L=>L.path===n.activeTourFilePath),d=a.length?a:[n.activeTourFilePath,u?.previousPath];document.querySelectorAll(".correspondence-file-label").forEach(L=>{let H=d.includes(L.textContent);L.setAttribute("aria-current",String(H))}),document.querySelectorAll(".correspondence-item").forEach(L=>L.setAttribute("aria-pressed",String(L.dataset.correspondenceId===n.activeCorrespondenceId)));let p=n.tour?.scenes[n.activeSceneIndex],g=Me(p)?p.steps[n.activeStepIndex]:null,y=new Map(n.tour?.files.map(L=>[L.path,L]));document.querySelectorAll(".tour-file").forEach(L=>{let H=L.dataset.filePath;L.classList.toggle("is-active",H===n.activeTourFilePath||a.includes(H)||a.includes(y.get(H)?.previousPath)),L.classList.toggle("is-tour-focus",!n.directoryEvidence&&H===n.tourFocusFilePath),L.classList.remove("is-comparison-changed","is-comparison-empty"),delete L.dataset.comparisonState;let K=y.get(H);L.dataset.changeKind=K?.changeKind||"",L.classList.toggle("is-omitted",K?.kind==="omitted"),L.disabled=K?.kind==="omitted"||!!(n.directoryEvidence&&!n.directoryEvidence.files.some(Z=>Z.path===H)),H===n.activeTourFilePath?L.setAttribute("aria-current","true"):L.removeAttribute("aria-current");let q=L.querySelector(".tour-file-marker"),T=L.querySelector(".tour-file-meta");if(n.directoryEvidence&&L.disabled&&K?.kind==="text-diff"){let Z="Not in this overview comparison";L.setAttribute("title",`${H} \xB7 ${Z}`),L.setAttribute("aria-label",`${H}, ${Z}`),T&&(T.textContent=Z),q&&(q.textContent="\u25CB");return}if(n.directoryEvidence&&K?.kind==="text-diff"){let Z=n.directoryEvidence.files.find(ue=>ue.path===H);L.dataset.changeKind=Z.changeKind;let ie=`${Qt(Z.changeKind)} in overview`;L.setAttribute("title",`${H} \xB7 ${ie}`),L.setAttribute("aria-label",`${H}, ${ie}`),T&&(T.textContent=ie),q&&(q.textContent=jn(Z.changeKind));return}let W=n.zoom?.mode==="history"?n.historyChangedFiles:n.zoom?.mode==="compare"?n.compare?.changedPaths:null;if(W&&K?.kind==="text-diff"){let Z=W.has(H),ie=Z?"Changed in this comparison":"Unchanged in this comparison";L.classList.add(Z?"is-comparison-changed":"is-comparison-empty"),L.setAttribute("title",`${H} \xB7 ${ie}`),L.setAttribute("aria-label",`${H}, ${ie}`),T&&(T.textContent=ie),q&&(q.textContent=Z?"M":"\u25CB");return}if(g&&K?.kind==="text-diff"){let Z=Rt(p,H);if(Z){let ue=vr(Z,g.pairIndex),ye=us(ue);L.dataset.comparisonState=ue,L.classList.add(ye.changed?"is-comparison-changed":"is-comparison-empty"),L.setAttribute("title",`${K.path} \xB7 ${ye.label}`),L.setAttribute("aria-label",`${K.path}, ${ye.label}`),q&&(q.textContent=ye.marker),T&&(T.textContent=ye.label);return}L.disabled=!0;let ie="Not included in this tour comparison";L.setAttribute("title",`${H} \xB7 ${ie}`),L.setAttribute("aria-label",`${H}, ${ie}`),q&&(q.textContent="\u25CB"),T&&(T.textContent=ie);return}if(K){let Z=K.kind==="omitted"?`${K.path}: ${K.reason}`:`Open file: ${K.path}`;L.setAttribute("title",Z),L.setAttribute("aria-label",Z),q&&(q.textContent=K.kind==="omitted"?"\xD7":jn(K.changeKind)),T&&(T.textContent=K.kind==="omitted"?`Not rendered \xB7 ${K.reason}`:`${Qt(K.changeKind)} \xB7 +${K.additions} \u2212${K.deletions}`)}});let b=document.getElementById("tour-files"),E=re(),P=!E||!!(g||n.directoryEvidence),R=!P||(E?n.showAllTourFiles:n.showAllFiles),U=0;b.querySelectorAll(".tour-file").forEach(L=>{let H=L.dataset.filePath,K=n.directoryEvidence?n.directoryEvidence.files.some(q=>q.path===H):n.zoom?.mode==="history"?n.historyChangedFiles.has(H):n.zoom?.mode==="compare"?n.compare?.changedPaths.has(H):g?L.classList.contains("is-comparison-changed"):!0;L.parentElement.hidden=!R&&!K,L.parentElement.hidden||U++});for(let L of[...b.querySelectorAll("details[data-file-folder]")].reverse())L.parentElement.hidden=![...L.querySelector(":scope > ul").children].some(H=>!H.hidden);b.querySelector("[data-file-tree-empty]").hidden=U>0,b.querySelector("[data-file-tree-empty]").textContent=R?"No files":"No changed files",b.setAttribute("aria-label",R?E?"Tour files":o?"Included files":"Files in selected revisions":"Changed files");let F=document.getElementById("tour-file-filter");F.hidden=!P,F.title=E?"Include tour files unchanged in this step comparison":o?"Include unchanged files packaged in this export":"Include unchanged files from the selected revisions",document.getElementById("tour-file-filter-label").textContent=E?"Show unchanged tour files":o?"Show all included files":"Show all files",document.getElementById("tour-show-all-files").checked=E?n.showAllTourFiles:n.showAllFiles,document.getElementById("tour-visible-file-count").textContent=`${U} / ${n.tour.files.length}`;let M=b.querySelector(".tour-file.is-active");if(n.revealedFilePath!==n.activeTourFilePath&&M&&!M.parentElement.hidden){for(let L=M.closest("details");L;L=L.parentElement.closest("details"))L.open=!0,n.collapsedFileFolders.delete(L.dataset.fileFolder);M.scrollIntoView({block:"nearest"})}n.revealedFilePath=n.activeTourFilePath;let z=document.getElementById("tour-return-focus");if(z){let L=re(),H=p?.kind==="walkthrough"&&p.steps[n.activeStepIndex]?.image,K=p?.kind==="walkthrough"&&p.steps[n.activeStepIndex]?.symbol;z.hidden=!L||!!n.directoryEvidence||(n.narrativeParent?!n.activeTourFilePath:!n.tourFocusFilePath||(H?t.isVisible():K?n.activeCorrespondenceId===Gr(K)&&!n.symbolContext:n.activeTourFilePath===n.tourFocusFilePath)),z.textContent=n.narrativeParent?"Return to passage":"Return to tour focus"}}function us(r){return{"modified-here":{label:"Modified here",marker:"\u2022",changed:!0},"created-here":{label:"Created here",marker:"+",changed:!0},"deleted-here":{label:"Deleted here",marker:"\u2212",changed:!0},"unchanged-here":{label:"Unchanged here",marker:"\u25CB",changed:!1},"not-created-yet":{label:"Not created yet",marker:"\u2026",changed:!1},"already-deleted":{label:"Already deleted",marker:"\xD7",changed:!1}}[r]}function $e(r){return r?.kind==="walkthrough"||r?.kind==="stacked-diff"||r?.kind==="deconstructed-diff"}function Me(r){return r?.kind==="stacked-diff"||r?.kind==="deconstructed-diff"}function Ft(r){return r.kind==="deconstructed-diff"?r.panels:r.stack}function jn(r){return{added:"+",deleted:"\u2212",renamed:"\u2192",modified:"\u2022"}[r]||"\u2022"}function Qt(r){return`${r.charAt(0).toUpperCase()}${r.slice(1)}`}function Zr(r,a){let u=r.scenes[a],d=r.chapters.findIndex(b=>b.sceneIds.includes(u.id)),p=d>=0?r.chapters[d]:null,g=p?p.sceneIds.indexOf(u.id)+1:a+1,y=p?p.sceneIds.length:r.scenes.length;return{chapter:p,chapterIndex:d,chapterNumber:d>=0?d+1:a+1,sceneInChapter:g,scenesInChapter:y,sceneCount:r.scenes.length}}function fs(r,a){return $e(r)?`${r.title} \xB7 Step ${a+1} of ${r.steps.length}`:r.title}function Kn(r,a,u){let p=(a==="left"?r.leftLines:r.rightLines).findIndex(R=>R.lineNumber===u);if(p<0)return 0;let g=a==="left"?"leftStart":"rightStart",y=a==="left"?"leftEnd":"rightEnd",b=r.blocks.findIndex(R=>p>=R[g]&&p<R[y]);if(b>=0)return b;let E=0,P=Number.POSITIVE_INFINITY;return r.blocks.forEach((R,U)=>{let F=Math.min(Math.abs(p-R[g]),Math.abs(p-R[y]));F<P&&(E=U,P=F)}),E}function Qr(r){return/^[0-9a-f]{40}$/i.test(r)?r.slice(0,7):r}function Dt(r,a){return`${r} ${r===1?a:`${a}s`}`}function ps(r){return r instanceof Element&&!!r.closest('a, button, input, select, summary, textarea, [contenteditable="true"], [role="textbox"], .monaco-editor')}function hs(r){let a=n.tour?.scenes[n.activeSceneIndex];n.tour&&io(a,a?Zr(n.tour,n.activeSceneIndex):null,r)}function en(r){let a=xn(_,n.activeSceneIndex,n.activeStepIndex,r==="scene"?"overview":r==="step"?null:r);a&&Ae(a)}function Ve(r,a,u){let d=document.createElement("button");return d.type="button",d.textContent=r,d.title=a,d.addEventListener("click",u),d}function eo(r,a,u,d){let p=document.createElement("div");p.className="tour-outline-group",p.dataset.readingGroup=r;let g=document.createElement("div");g.className="tour-outline-heading";let y=document.createElement("div");y.className="tour-outline-children",y.id=`outline-${encodeURIComponent(r)}`;let b=`${n.zoom?.mode||"tour"}:${r}`,E=Ve("\u25BE",`Expand or collapse ${a}`,()=>{te.has(b)?te.delete(b):te.add(b),P()});E.className="tour-outline-toggle",E.setAttribute("aria-controls",y.id);let P=()=>{y.hidden=te.has(b),E.setAttribute("aria-expanded",String(!y.hidden)),E.textContent=y.hidden?"\u25B8":"\u25BE"};P();let R=Ve(a,`Read ${a}`,d);return R.className=u,R.dataset.readingLink=r,g.append(E,R),p.append(g,y),{group:p,children:y,link:R,toggle:E}}function ms(){let r=document.getElementById("tour-audio-settings");r&&(r.hidden=!r.hidden,to())}function to(){Zt();for(let[u,d]of[["tour-back",-1],["tour-next",1]]){let p=document.getElementById(u);p&&(p.disabled=!re()||!Ht(_,n.readingKey,d,st(n.tour)))}let r=document.getElementById("tour-narration"),a=document.getElementById("tour-audio-settings");if(r){let u=!!(a&&!a.hidden);r.setAttribute("aria-expanded",String(u)),r.textContent=u?"\u203A":"\u2039 Narration",r.title=u?"Hide narration controls":"Show narration controls",r.setAttribute("aria-label",r.title)}}function pt(r){if(!r||r.kind==="title")return{part:"title"};if(r.kind==="conclusion")return{part:"conclusion"};if(r.kind==="chapter")return{part:"chapter",chapter:r.chapterId};let a=n.tour.scenes[r.sceneIndex];return r.kind==="scene"?{part:"scene",scene:a.id}:{part:"step",scene:a.id,step:a.steps[r.stepIndex].id}}function gs(r){let a=document.createElement("button");return a.type="button",a.className="tour-copy-location",a.setAttribute("aria-label","Copy link to this section"),a.innerHTML='<svg viewBox="0 0 24 24" aria-hidden="true"><path class="tour-link-chain" d="M10 13a5 5 0 0 0 7 .1l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7-.1l-3 3a5 5 0 0 0 7 7l2-2"/><path class="tour-link-check" d="m5 12 4 4L19 6"/></svg>',a.title=o?"Copy location within this export; share the HTML file separately":n.authoredTour?.localSource?"Copy local link to the saved current document; evidence may change":"Copy browser location (requires this presentation server)",a.addEventListener("click",async u=>{u.stopPropagation();let d=no(r);try{await navigator.clipboard.writeText(d),a.classList.add("is-copied"),a.setAttribute("aria-label","Link copied"),setTimeout(()=>{a.classList.remove("is-copied"),a.setAttribute("aria-label","Copy link to this section")},1800)}catch{let p=document.createElement("dialog"),g=document.createElement("p");g.textContent="Copy this link:";let y=document.createElement("textarea");y.value=d,y.readOnly=!0,y.setAttribute("aria-label","Link to this tour location");let b=document.createElement("button");b.textContent="Close",b.addEventListener("click",()=>p.close()),p.append(g,y,b),document.body.append(p),p.addEventListener("close",()=>p.remove(),{once:!0}),p.showModal(),y.select()}}),a}function no(r){let a=re()?n.zoom?.mode||"historical":Object.keys(G())[0],u=n.authoredTour.localSource;return u&&!o?bo({kind:"tour",...u,mode:a,focus:r}):new URL(nt(a,r),window.location.href).href}function ro(r){let a=++f,u=h.then(()=>ys(r,a));return h=u.catch(()=>{}),u}async function ys(r,a){if(!r||!n.authoredTour)return;let u=Zn(n.authoredTour,r.mode,r.focus);if(a===f){s=!0;try{if(n.zoom.mode!==r.mode&&await We(r.mode),a!==f)return;if(n.zoom.mode!==r.mode)throw new Error("The requested tour mode could not be opened.");if(le=null,document.getElementById("tour-mode-status").textContent="",ve(u.sceneIndex,u.stepIndex,{readingKey:u.key,showIntro:r.focus.part!=="step"}),await new Promise(p=>window.requestAnimationFrame(p)),a!==f)return;let d=J.get(u.key);if(!d)throw new Error("The requested document section could not be rendered.");d.tabIndex=-1,d.focus({preventScroll:!0}),ao(u.key),d.classList.add("tour-link-target"),window.setTimeout(()=>d.classList.remove("tour-link-target"),1800)}finally{s=!1}}}window.addEventListener("hashchange",()=>{try{ro(Qn(window.location.hash)).catch(fe)}catch(r){fe(r)}});function Se(){if(o)return;let r=n.tour?.scenes[n.activeSceneIndex],a=new URLSearchParams(window.location.search);for(let d of["from","to","commits","scope","commit","file","panelOrder"])a.delete(d);if(n.zoom&&a.set("mode",n.zoom.mode),n.zoom&&!re()){for(let d of["scene","step","view"])a.delete(d);n.zoom.mode==="compare"&&n.compare&&(a.set("commits",n.compare.commits.join(",")),n.compare.path&&a.set("scope",n.compare.path),n.activeTourFilePath||a.set("view","directory")),n.zoom.mode==="history"&&n.historyCommit&&a.set("commit",n.historyCommit),n.activeTourFilePath&&a.set("file",n.zoom.mode==="history"?n.historyPath:n.activeTourFilePath),window.history.replaceState(null,"",`${window.location.pathname}?${a.toString()}${window.location.hash}`);return}if(n.readingKey==="conclusion"){a.delete("scene"),a.delete("step"),a.set("view","conclusion"),window.history.replaceState(null,"",`${window.location.pathname}?${a.toString()}${nt(n.zoom.mode,{part:"conclusion"})}`);return}if(!r)return;a.set("scene",r.id);let u=$e(r)?r.steps[n.activeStepIndex]:null;u?a.set("step",u.id):a.delete("step"),n.directoryEvidence&&n.activeTourFilePath?a.set("file",n.activeTourFilePath):a.delete("file"),n.narrativeParent?a.set("view",n.narrativeParent):u&&n.sceneIntroVisible?a.set("view","overview"):a.delete("view"),window.history.replaceState(null,"",`${window.location.pathname}?${a.toString()}${nt(n.zoom.mode,pt(_.find(d=>d.key===n.readingKey)))}`)}function oo(r=n.tour?.scenes[n.activeSceneIndex],a=n.activeStepIndex){if(!r||!$e(r))return null;let u=r.steps[a];if(!u)return null;if(r.kind==="walkthrough"){if(u.image)return null;let p=u.focus;return!p?.path||!Number.isInteger(p.startLine)?null:{filePath:p.path,sideIndex:p.revision==="base"?0:1,lineNumber:p.startLine,label:`${p.path}:${p.startLine}`}}let d=u.startLine;if(!Number.isInteger(d)){let p=Rt(r,u.file),g=p?.panels?.[u.pairIndex],y=p?.panels?.[u.pairIndex+1];if(g&&y){let b=ke(g.content,y.content);d=Er(b,u.side)?.startLine}}return!u.file||!Number.isInteger(d)?null:{filePath:u.file,sideIndex:u.pairIndex+(u.side==="right"?1:0),lineNumber:d,label:`${u.file}:${d}`}}function bs(){let r=oo(),a=n.tour?.scenes[n.activeSceneIndex];if(n.sceneIntroVisible||!r||!a)return!1;if(Q.interruptForExploration(),n.activeTourFilePath!==r.filePath){let u=n.tour.files.findIndex(p=>p.kind==="text-diff"&&p.path===r.filePath);if(u<0||!(Me(a)?ft(u):_n(u,!1)))return!1}return window.requestAnimationFrame(()=>se({type:"revealSearchResult",sideIndex:r.sideIndex,lineNumber:r.lineNumber,startColumn:1,endColumn:1})),!0}function io(r,a,u){Wn(),document.getElementById("tour-narrative").hidden=!1,document.getElementById("tour-breadcrumb").textContent=n.narrativeParent==="tour"?"Intro":n.narrativeParent==="conclusion"?"Conclusion":n.narrativeParent==="chapter"?a.chapter?.title||"":n.sceneIntroVisible?r.title:fs(r,n.activeStepIndex);let d=r&&J.get(`scene:${r.id}`),p=$e(r)?r.steps[n.activeStepIndex]:null,g=p&&J.get(`step:${r.id}:${p.id}`);for(let y of new Set([d,g,J.get(n.readingKey)].filter(Boolean)))y.querySelectorAll("[data-reading-field]").forEach(b=>{b.closest("[data-reading-key]")===y&&Es(b,b.dataset.readingText,{field:b.dataset.readingField,...b.dataset.itemIndex!==void 0?{itemIndex:Number(b.dataset.itemIndex)}:{}},u)});to()}function Wn(){if(O===n.tour)return;O=n.tour,_=di(n.tour),J.clear();let r=document.getElementById("tour-narrative-content"),a=[],u,d=(b,E,P,R,U,F)=>{let M=document.createElement(E);M.className=P;let z=U&&/^h[1-6]$/.test(E)?document.createElement("span"):M;return z!==M&&M.append(z),z.replaceChildren(...Tr(document,R||"")),U&&(z.dataset.readingField=U,z.dataset.readingText=R||"",F!==void 0&&(z.dataset.itemIndex=String(F))),b.append(M),M},p=(b,E,P)=>{if(d(b,"p","tour-narrative-summary",E.summary,P?"summary":null),E.bullets?.length){let R=document.createElement("ul");R.className="tour-narrative-bullets",E.bullets.forEach((U,F)=>d(R,"li","",U,P?"bullet":null,F)),b.append(R)}E.takeaway&&d(b,"p","tour-narrative-takeaway",E.takeaway,P?"takeaway":null)},g=Mt(n.tour),y=(b,E)=>{let P=d(b,"ul","tour-route","");E.forEach(R=>{let U=d(P,"li","",""),F=Ve("",`Read ${R.title}`,()=>Ae(_.find(M=>M.kind==="scene"&&M.sceneIndex===R.sceneIndex)));F.className="tour-route-link",d(F,"span","tour-route-number",`${R.sceneIndex+1}. `),d(F,"span","",R.title,"route-title",R.sceneIndex),U.append(F)})};for(let b of _){let E=document.createElement("section");E.className="tour-reading-item",E.dataset.readingKey=b.key,E.dataset.readingKind=b.kind,E.dataset.sceneIndex=String(b.sceneIndex),E.dataset.stepIndex=String(b.stepIndex);let P=n.tour.scenes[b.sceneIndex];if(b.kind==="title")d(E,"h1","tour-document-title",n.tour.title,"document-title"),n.tour.opening&&(d(E,"h2","tour-passage-title",n.tour.opening.title,"passage-title"),p(E,n.tour.opening,!0)),d(E,"h2","tour-passage-title","What you'll see"),g.chapters.forEach(R=>{let U=d(E,"section","tour-route-chapter",""),F=d(U,"h3","",""),M=Ve("",`Read ${R.title}`,()=>Ae(_.find(z=>z.kind==="chapter"&&z.chapterId===R.chapterId)||_.find(z=>z.kind==="scene"&&z.sceneIndex===R.scenes[0]?.sceneIndex)));M.className="tour-route-link tour-route-chapter-link",d(M,"span","tour-route-number",`${R.chapterIndex+1}. `),d(M,"span","",R.title,"route-chapter",R.chapterIndex),F.append(M)}),g.chapters.length||y(E,g.scenes);else if(b.kind==="conclusion")d(E,"h2","tour-passage-title",n.tour.conclusion.title,"passage-title"),p(E,n.tour.conclusion,!0);else if(b.kind==="chapter"){let R=g.chapters.find(U=>U.chapterId===b.chapterId);d(E,"h2","tour-document-chapter",R.title,"chapter"),d(E,"p","tour-narrative-summary",R.summary,"summary"),y(E,R.scenes)}else if(b.kind==="scene"){E.classList.add("tour-scene-group");let R=d(E,"div","tour-scene-header",""),U=d(R,"h2","tour-scene-heading",Be(n.tour,b),"scene-title"),F=document.createElement("button");F.className="tour-scene-title-toggle",F.type="button",F.title="Expand or collapse scene overview",F.disabled=!0,F.append(...U.childNodes),U.append(F);let M=document.createElement("details");M.className="tour-scene-context";let z=d(M,"summary","","");z.setAttribute("aria-label",`Scene overview: ${P.title}`),z.dataset.tooltip="Expand or collapse scene overview";let L=d(M,"div","tour-scene-context-body","");L.id=`scene-overview-${b.sceneIndex}`,F.setAttribute("aria-controls",L.id),F.setAttribute("aria-expanded","false"),F.addEventListener("click",T=>{T.target.closest("a")||(M.open=!M.open)}),M.addEventListener("toggle",()=>F.setAttribute("aria-expanded",String(M.open))),p(L,P,!1),R.addEventListener("keydown",T=>{T.key==="Escape"&&M.open&&(T.preventDefault(),T.stopPropagation(),M.open=!1,z.focus({preventScroll:!0}))}),R.append(M);let H=d(E,"div","tour-scene-overview","");p(H,{...P,takeaway:$e(P)?"":P.takeaway},!0),P.overview?.purpose&&d(H,"p","tour-overview-purpose",P.overview.purpose,"overview-purpose");let K=me(n.tour,b,n.zoom?.mode);K&&d(H,"p","tour-scene-orientation",gt(K));let q=d(H,"div","tour-narrative-tags","");P.tags.forEach(T=>d(q,"span","",T))}else{let R=P.steps[b.stepIndex],U=P.kind==="deconstructed-diff"?R.body?`Stage ${(R.stageIndex??R.pairIndex)+1}`:P.panels[R.pairIndex+1].label:"";if(U&&d(E,"div","tour-narrative-chapter",U,"stage-title"),d(E,"h3","tour-step-title",Be(n.tour,b),"step-title"),d(E,"p","tour-step-orientation",on(n.tour,b.sceneIndex,b.stepIndex),"step-orientation"),R.body&&d(E,"p","tour-step-body",R.body,"step-body"),P.kind==="deconstructed-diff"&&!R.body){let z=P.steps.findIndex(L=>L.pairIndex===R.pairIndex);if(z>=0&&z<b.stepIndex){let L=_.find(K=>K.kind==="step"&&K.sceneIndex===b.sceneIndex&&K.stepIndex===z),H=Ve("Read stage explanation",`Read ${P.steps[z].title}`,()=>Ae(L));H.className="tour-show-in-code tour-stage-explanation",E.append(H)}}let F=d(E,"div","tour-step-requirement","");ks(F,R.requirement),R.connection&&(d(E,"p","tour-connection",`${R.connection.from.path} \u2192 ${R.connection.to.path}`),d(E,"p","tour-connection",R.connection.label,"connection")),b.stepIndex===P.steps.length-1&&d(E,"p","tour-narrative-takeaway",P.takeaway,"takeaway");let M=oo(P,b.stepIndex);if(M){let z=d(E,"div","tour-step-code","");d(z,"span","tour-step-code-location",M.label);let L=Ve("Show in code",`Show ${M.label}`,()=>{Ae(b),bs()});L.className="tour-show-in-code",z.append(L)}}E.querySelector("h1, h2, h3").append(gs(pt(b))),J.set(b.key,E),b.kind==="step"?u.append(E):(a.push(E),u=b.kind==="scene"?E:null)}r.replaceChildren(...a),X=r.scrollTop}function ws(){for(let[u,d]of J)d.classList.toggle("is-active",u===n.readingKey);document.querySelectorAll("[data-reading-link], .tour-outline-step, #tour-title").forEach(u=>{let d=n.tour?.scenes[n.activeSceneIndex],p=d&&$e(d)?d.steps[Number(u.dataset.stepIndex)]:null,y=(u.id==="tour-title"?"title":u.dataset.readingLink||(p&&u.dataset.sceneId===d.id?`step:${d.id}:${p.id}`:null))===n.readingKey;u.classList.toggle("is-active",y),y?u.setAttribute("aria-current","location"):u.removeAttribute("aria-current")}),document.querySelectorAll(".tour-outline-group").forEach(u=>{u.classList.toggle("has-active",!!u.querySelector('[aria-current="location"]'))});let r=document.getElementById("tour-scenes"),a=r?.querySelector('[aria-current="location"]');for(;a&&!a.getClientRects().length;)a=a.closest(".tour-outline-children[hidden]")?.parentElement.querySelector(":scope > .tour-outline-heading [data-reading-link]");if(a&&r.clientHeight){let u=r.getBoundingClientRect(),d=a.getBoundingClientRect();d.top<u.top?r.scrollTop+=d.top-u.top:d.bottom>u.bottom&&(r.scrollTop+=d.bottom-u.bottom)}}function so(){let r=document.getElementById("tour-narrative"),a=document.getElementById("tour-narrative-content");if(!r||!a||!r.getClientRects().length)return;let u=r.getBoundingClientRect(),d=u.height-a.clientHeight;a.style.setProperty("--tour-reading-viewport",`${a.clientHeight}px`),a.style.setProperty("--tour-bookend-viewport",`${Math.max(0,window.innerHeight-u.top-d)}px`)}function ao(r){let a=document.getElementById("tour-narrative-content"),u=J.get(r);if(!a||!u)return;so();let d=u.dataset.readingKind==="step"?u.closest(".tour-scene-group")?.querySelector(".tour-scene-header"):null;a.scrollTop+=u.getBoundingClientRect().top-a.getBoundingClientRect().top-(d?.getBoundingClientRect().height||0),X=a.scrollTop,tn()}function tn(){let r=document.getElementById("tour-narrative-content"),a=r.getBoundingClientRect().top,u=0;return r.querySelectorAll(".tour-scene-header").forEach(d=>{let p=d.parentElement.getBoundingClientRect(),g=p.top<a-1&&p.bottom>a;d.classList.toggle("is-stuck",g),d.querySelector(".tour-scene-title-toggle").disabled=!g,g?u=Math.max(u,d.getBoundingClientRect().bottom-a):d.querySelector("details").open=!1}),r.style.scrollPaddingTop=`${u}px`,u}function Ae(r,a=!1,u=!1){return!a&&!s&&re()&&window.history.pushState(null,"",nt(n.zoom.mode,pt(r))),ve(r.sceneIndex,r.stepIndex,{readingKey:r.key,showIntro:r.kind!=="step",userNavigation:!0,fromReadingScroll:a,narrationNavigation:u?"linear":void 0,narrationEntry:u?"continuous":"playback-start"})}function vs(){ne===null&&(ne=window.requestAnimationFrame(()=>{if(ne=null,!re()||n.zoomSwitching)return;let r=document.getElementById("tour-narrative-content"),a=tn();if(X!==null&&Math.abs(r.scrollTop-X)<2)return;X=null;let u=r.getBoundingClientRect().top+a+24,d=_[0];for(let p of _){if(J.get(p.key).getBoundingClientRect().top>u)break;d=p}d&&d.key!==n.readingKey&&Ae(d,!0)}))}function xs(r){let a=[];return r.source&&a.push(r.source),r.confidence&&a.push(`${r.confidence} confidence`),a.join(" \xB7 ")}function ks(r,a){if(!a){r.hidden=!0,r.replaceChildren(),r.removeAttribute("title");return}let u=document.createElement("span");u.className="tour-requirement-chip",u.dataset.status=a.status||"unspecified",u.textContent=a.status?`${a.id} \xB7 ${a.status}`:a.id;let d=document.createElement("span");d.className="tour-requirement-text",d.textContent=a.text;let p=[u,d],g=xs(a);if(g){let y=document.createElement("span");y.className="tour-requirement-meta",y.textContent=g,p.push(y)}r.replaceChildren(...p),r.title=[`${a.id}: ${a.text}`,g].filter(Boolean).join(" \u2014 "),r.hidden=!1}function Es(r,a,u,d,p={}){let g=d?.segments.filter(b=>b.source.field===u.field&&b.source.itemIndex===u.itemIndex)||[],y=[];p.prefix&&y.push(document.createTextNode(p.prefix)),y.push(...Tr(document,a,g)),p.suffix&&y.push(document.createTextNode(p.suffix)),r.replaceChildren(...y)}function co(){Q.stop();let r=Go();n.mode="diff",n.comparisonId+=1,n.left={name:r.leftFileName,content:r.leftContent},n.right={name:r.rightFileName,content:r.rightContent},Le("Loaded sample diff."),se({type:"showDiff",file1:n.left.name,file2:n.right.name,comparisonId:`web-${n.comparisonId}`,leftContent:n.left.content,rightContent:n.right.content,diffModel:ke(n.left.content,n.right.content),history:null})}async function Is(r){Q.stop();let[a,u]=r,[d,p]=await Promise.all([a.text(),u.text()]);n.mode="diff",n.comparisonId+=1,n.left={name:a.name,content:d},n.right={name:u.name,content:p},Le(`Loaded ${a.name} and ${u.name}.`),se({type:"showDiff",file1:a.name,file2:u.name,comparisonId:`web-${n.comparisonId}`,leftContent:d,rightContent:p,diffModel:ke(d,p),history:null})}async function Ss(r){Q.stop();let a=await Promise.all(r.map(async(u,d)=>{let p=await u.text();return{id:`web-panel-${d}`,label:u.name,content:p,savedContent:p,dirty:!1,editable:!0}}));n.mode="multi-diff",Le(`Loaded ${a.length}-panel diff for ${a.map(u=>u.label).join(", ")}.`),se({type:"showMultiDiff",panels:a,pairs:a.slice(0,-1).map((u,d)=>({leftIndex:d,rightIndex:d+1,diffModel:ke(u.content,a[d+1].content)}))})}function Le(r){let a=document.getElementById("web-status");a&&(a.textContent=r)}})();})();
668
671
  //# sourceMappingURL=web-host.js.map