@davmash/bygone 0.8.12 → 0.8.13
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.
- package/README.md +1 -1
- package/docs/releasing.md +5 -0
- package/media/webview.js +1 -1
- package/out/changeTour.js +1319 -33
- package/out/standalone-main.js +1311 -31
- package/out/tourCoverage.js +1319 -33
- package/package.json +1 -1
- package/web/presenter.css +12 -0
- package/web/web-host.js +5 -5
package/package.json
CHANGED
package/web/presenter.css
CHANGED
|
@@ -530,6 +530,18 @@ body.tour-discussion .tour-narrative-resizer {
|
|
|
530
530
|
text-align: center;
|
|
531
531
|
}
|
|
532
532
|
|
|
533
|
+
.tour-file.is-comparison-changed .tour-file-marker {
|
|
534
|
+
color: #8ed6a5;
|
|
535
|
+
font-weight: 800;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.tour-file.is-comparison-changed .tour-file-meta { color: #a9d9b7; }
|
|
539
|
+
|
|
540
|
+
.tour-file.is-comparison-empty .tour-file-path { color: var(--tour-muted); }
|
|
541
|
+
|
|
542
|
+
.tour-file.is-comparison-empty .tour-file-marker,
|
|
543
|
+
.tour-file.is-comparison-empty .tour-file-meta { color: var(--tour-faint); }
|
|
544
|
+
|
|
533
545
|
.tour-file.is-tour-focus .tour-file-marker { color: var(--tour-accent-bright); }
|
|
534
546
|
|
|
535
547
|
.tour-file-copy,
|
package/web/web-host.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";(()=>{function Y(){}Y.prototype={diff:function(e,n){var r,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s=o.callback;typeof o=="function"&&(s=o,o={}),this.options=o;var
|
|
2
|
-
`));var e=[],n=t.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r<n.length;r++){var o=n[r];r%2&&!this.options.newlineIsToken?e[e.length-1]+=o:(this.options.ignoreWhitespace&&(o=o.trim()),e.push(o))}return e};var
|
|
1
|
+
"use strict";(()=>{function Y(){}Y.prototype={diff:function(e,n){var r,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s=o.callback;typeof o=="function"&&(s=o,o={}),this.options=o;var c=this;function u(A){return s?(setTimeout(function(){s(void 0,A)},0),!0):A}e=this.castInput(e),n=this.castInput(n),e=this.removeEmpty(this.tokenize(e)),n=this.removeEmpty(this.tokenize(n));var d=n.length,m=e.length,p=1,a=d+m;o.maxEditLength&&(a=Math.min(a,o.maxEditLength));var x=(r=o.timeout)!==null&&r!==void 0?r:1/0,E=Date.now()+x,C=[{oldPos:-1,lastComponent:void 0}],k=this.extractCommon(C[0],n,e,0);if(C[0].oldPos+1>=m&&k+1>=d)return u([{value:this.join(n),count:n.length}]);var v=-1/0,w=1/0;function L(){for(var A=Math.max(v,-p);A<=Math.min(w,p);A+=2){var P=void 0,D=C[A-1],W=C[A+1];D&&(C[A-1]=void 0);var z=!1;if(W){var ye=W.oldPos-A;z=W&&0<=ye&&ye<d}var ie=D&&D.oldPos+1<m;if(!z&&!ie){C[A]=void 0;continue}if(!ie||z&&D.oldPos+1<W.oldPos?P=c.addToPath(W,!0,void 0,0):P=c.addToPath(D,void 0,!0,1),k=c.extractCommon(P,n,e,A),P.oldPos+1>=m&&k+1>=d)return u(vn(c,P.lastComponent,n,e,c.useLongestToken));C[A]=P,P.oldPos+1>=m&&(w=Math.min(w,A-1)),k+1>=d&&(v=Math.max(v,A+1))}p++}if(s)(function A(){setTimeout(function(){if(p>a||Date.now()>E)return s();L()||A()},0)})();else for(;p<=a&&Date.now()<=E;){var $=L();if($)return $}},addToPath:function(e,n,r,o){var s=e.lastComponent;return s&&s.added===n&&s.removed===r?{oldPos:e.oldPos+o,lastComponent:{count:s.count+1,added:n,removed:r,previousComponent:s.previousComponent}}:{oldPos:e.oldPos+o,lastComponent:{count:1,added:n,removed:r,previousComponent:s}}},extractCommon:function(e,n,r,o){for(var s=n.length,c=r.length,u=e.oldPos,d=u-o,m=0;d+1<s&&u+1<c&&this.equals(n[d+1],r[u+1]);)d++,u++,m++;return m&&(e.lastComponent={count:m,previousComponent:e.lastComponent}),e.oldPos=u,d},equals:function(e,n){return this.options.comparator?this.options.comparator(e,n):e===n||this.options.ignoreCase&&e.toLowerCase()===n.toLowerCase()},removeEmpty:function(e){for(var n=[],r=0;r<e.length;r++)e[r]&&n.push(e[r]);return n},castInput:function(e){return e},tokenize:function(e){return e.split("")},join:function(e){return e.join("")}};function vn(t,e,n,r,o){for(var s=[],c;e;)s.push(e),c=e.previousComponent,delete e.previousComponent,e=c;s.reverse();for(var u=0,d=s.length,m=0,p=0;u<d;u++){var a=s[u];if(a.removed){if(a.value=t.join(r.slice(p,p+a.count)),p+=a.count,u&&s[u-1].added){var E=s[u-1];s[u-1]=s[u],s[u]=E}}else{if(!a.added&&o){var x=n.slice(m,m+a.count);x=x.map(function(k,v){var w=r[p+v];return w.length>k.length?w:k}),a.value=t.join(x)}else a.value=t.join(n.slice(m,m+a.count));m+=a.count,a.added||(p+=a.count)}}var C=s[d-1];return d>1&&typeof C.value=="string"&&(C.added||C.removed)&&t.equals("",C.value)&&(s[d-2].value+=C.value,s.pop()),s}var Tn=new Y;function xt(t,e,n){return Tn.diff(t,e,n)}var It=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,wt=/\S/,Ve=new Y;Ve.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!wt.test(t)&&!wt.test(e)};Ve.tokenize=function(t){for(var e=t.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n<e.length-1;n++)!e[n+1]&&e[n+2]&&It.test(e[n])&&It.test(e[n+2])&&(e[n]+=e[n+2],e.splice(n+1,2),n--);return e};function St(t,e,n){return Ve.diff(t,e,n)}var vt=new Y;vt.tokenize=function(t){this.options.stripTrailingCr&&(t=t.replace(/\r\n/g,`
|
|
2
|
+
`));var e=[],n=t.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r<n.length;r++){var o=n[r];r%2&&!this.options.newlineIsToken?e[e.length-1]+=o:(this.options.ignoreWhitespace&&(o=o.trim()),e.push(o))}return e};var En=new Y;En.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};var kn=new Y;kn.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function Ee(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ee=function(e){return typeof e}:Ee=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ee(t)}var Cn=Object.prototype.toString,he=new Y;he.useLongestToken=!0;he.tokenize=vt.tokenize;he.castInput=function(t){var e=this.options,n=e.undefinedReplacement,r=e.stringifyReplacer,o=r===void 0?function(s,c){return typeof c>"u"?n:c}:r;return typeof t=="string"?t:JSON.stringify(ze(t,null,null,o),o," ")};he.equals=function(t,e){return Y.prototype.equals.call(he,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function ze(t,e,n,r,o){e=e||[],n=n||[],r&&(t=r(o,t));var s;for(s=0;s<e.length;s+=1)if(e[s]===t)return n[s];var c;if(Cn.call(t)==="[object Array]"){for(e.push(t),c=new Array(t.length),n.push(c),s=0;s<t.length;s+=1)c[s]=ze(t[s],e,n,r,o);return e.pop(),n.pop(),c}if(t&&t.toJSON&&(t=t.toJSON()),Ee(t)==="object"&&t!==null){e.push(t),c={},n.push(c);var u=[],d;for(d in t)t.hasOwnProperty(d)&&u.push(d);for(u.sort(),s=0;s<u.length;s+=1)d=u[s],c[d]=ze(t[d],e,n,r,d);e.pop(),n.pop()}else c=t;return c}var ke=new Y;ke.tokenize=function(t){return t.slice()};ke.join=ke.removeEmpty=function(t){return t};function Tt(t,e,n){return ke.diff(t,e,n)}var Nn=500,$n=100,Et=Ht("BYGONE_MAX_INLINE_HIGHLIGHT_LINE_LENGTH",Nn),An=Ht("BYGONE_DIFF_TIMEOUT_MS",$n);function re(t,e,n={}){let r=kt(t),o=kt(e),s=Tt(r,o,{timeout:n.timeoutMs??An});if(!s)return Rn(r,o);let c=[],u=[],d=[],m=[],p=1,a=1;for(let E=0;E<s.length;E++){let C=s[E],k=C.removed?C.value:[],v=C.added?C.value:[];if(!C.added&&!C.removed){for(let w of C.value)u.push(ee("context",w,p)),d.push(ee("context",w,a)),c.push(ce(Q("context",w,p++),Q("context",w,a++)));continue}if(C.removed&&E+1<s.length&&s[E+1].added){let w=s[E+1],L=u.length,$=d.length,A=Ut(k,w.value);for(let{left:P,right:D}of A){let W,z;P!==void 0&&(W=ee("removed",P,p),u.push(W)),D!==void 0&&(z=ee("added",D,a),d.push(z)),W&&z&&Jn(W,z),c.push(ce(P===void 0?le():Q("removed",P,p++),D===void 0?le():Q("added",D,a++)))}m.push($e("replace",L,u.length,$,d.length)),E++;continue}if(C.removed){let w=u.length,L=d.length;for(let $ of k)u.push(ee("removed",$,p)),c.push(ce(Q("removed",$,p++),le()));m.push($e("delete",w,u.length,L,d.length));continue}if(C.added){let w=u.length,L=d.length;for(let $ of v)d.push(ee("added",$,a)),c.push(ce(le(),Q("added",$,a++)));m.push($e("insert",w,u.length,L,d.length))}}let x=c.some(E=>E.left.kind!=="context"||E.right.kind!=="context");return{rows:c,leftLines:u,rightLines:d,blocks:m,hasChanges:x}}function Rn(t,e){let n=t.map((c,u)=>ee("removed",c,u+1)),r=e.map((c,u)=>ee("added",c,u+1)),o=[...t.map((c,u)=>ce(Q("removed",c,u+1),le())),...e.map((c,u)=>ce(le(),Q("added",c,u+1)))],s="replace";return t.length===0?s="insert":e.length===0&&(s="delete"),{rows:o,leftLines:n,rightLines:r,blocks:o.length===0?[]:[$e(s,0,t.length,0,e.length)],hasChanges:o.length>0}}function kt(t){if(t.length===0)return[];let e=t.replace(/\r\n/g,`
|
|
3
3
|
`).split(`
|
|
4
|
-
`);return e[e.length-1]===""&&e.pop(),e}var
|
|
4
|
+
`);return e[e.length-1]===""&&e.pop(),e}var Ot=1e4,Ct=2e3,Fn=.52,Mn=.35,Pt=.38,_n=.33,Dt=.86,Ae=.08,Ce=.05,Le=-.12,Lt=5e3,On=2e3,Nt=4,Pn=8,qe=4;function Ut(t,e){if(t.length===0)return e.map(d=>({right:d}));if(e.length===0)return t.map(d=>({left:d}));if(t.length===1&&e.length===1){let d=Je(t[0],e[0]);return(d.eligible||d.score>=Mn)&&je(t[0],e[0])&&me(te(t[0]))&&me(te(e[0]))?[{left:t[0],right:e[0]}]:[{left:t[0]},{right:e[0]}]}if(t.length*e.length>Ot)return Wn(t,e);let n=Dn(t,e),r=Array.from({length:t.length+1},()=>new Array(e.length+1).fill(Number.NEGATIVE_INFINITY)),o=Array.from({length:t.length+1},()=>new Array(e.length+1).fill(null));r[0][0]=0;for(let d=1;d<=t.length;d++)r[d][0]=r[d-1][0]+Le,o[d][0]="left";for(let d=1;d<=e.length;d++)r[0][d]=r[0][d-1]+Le,o[0][d]="right";for(let d=1;d<=t.length;d++)for(let m=1;m<=e.length;m++){let p=n[d-1][m-1],x=[{move:"left",score:r[d-1][m]+Le},{move:"right",score:r[d][m-1]+Le},{move:"match",score:p===null?Number.NEGATIVE_INFINITY:r[d-1][m-1]+p}].reduce((E,C)=>C.score>E.score?C:E);r[d][m]=x.score,o[d][m]=x.move}let s=[],c=t.length,u=e.length;for(;c>0||u>0;){let d=o[c][u];d==="match"?s.push({left:t[--c],right:e[--u]}):d==="left"?s.push({left:t[--c]}):s.push({right:e[--u]})}return s.reverse()}function Je(t,e){let n=te(t),r=te(e),o=me(n),s=me(r);if(!o||!s||n.length>Ct||r.length>Ct)return{score:0,eligible:!1,characterSimilarity:0,tokenSimilarity:0,lengthSimilarity:0};if(n===r)return{score:1,eligible:!0,characterSimilarity:1,tokenSimilarity:1,lengthSimilarity:1};let c=Ye(n),u=Ye(r),d=Yn(n,r),m=jn(c,u),p=Math.min(n.length,r.length)/Math.max(n.length,r.length),a=Xn(c,u),x=d*.52+m*.32+p*.1+a*.06,E=d>=.52||m>=.45||d>=.48&&m>=.28;return{score:x,eligible:E&&x>=Fn,characterSimilarity:d,tokenSimilarity:m,lengthSimilarity:p}}function Dn(t,e){let n=t.map(k=>e.map(v=>Je(k,v))),r=Bt(t,e),o=n.map(k=>Ke(k)),s=e.map((k,v)=>Ke(n.map(w=>w[v]))),c=n.map((k,v)=>k.map((w,L)=>{if(r.has(`${v}:${L}`))return Math.max(w.score,1);if(!w.eligible)return null;let $=o[v],A=s[L],P=w.score===$.best&&w.score===A.best,D=w.score>=Dt?Ae/2:Ae,W=$.best-$.second>=D,z=A.best-A.second>=D;return P&&W&&z?w.score:null}));if(Math.max(t.length,e.length)>Pn||Math.abs(t.length-e.length)>qe)return c;let u=(k,v,w)=>k.score>=Pt&&je(t[v],e[w])&&Math.abs(v-w)<=qe,d=n.map((k,v)=>Ne(k,(w,L)=>u(w,v,L))),m=e.map((k,v)=>Ne(n.map(w=>w[v]),(w,L)=>u(w,L,v))),p=(k,v,w)=>k.score>=_n&&je(t[v],e[w])&&Math.abs(v-w)<=qe,a=n.map((k,v)=>Ne(k,(w,L)=>p(w,v,L))),x=e.map((k,v)=>Ne(n.map(w=>w[v]),(w,L)=>p(w,L,v))),E=(k,v)=>{let w=n[k][v];if(!u(w,k,v))return!1;let L=d[k],$=m[v];return w.score===L.best&&w.score===$.best&&L.best-L.second>=Ce&&$.best-$.second>=Ce},C=(k,v)=>{let w=n[k][v];if(!p(w,k,v))return!1;let L=a[k],$=x[v];return w.score===L.best&&w.score===$.best&&L.best-L.second>=Ce&&$.best-$.second>=Ce};return c.map((k,v)=>k.map((w,L)=>{if(w!==null)return w;let $=E(v,L)&&(Un(c,v,L)||Bn(n,v,L,E)),A=Hn(n,v,L,(P,D)=>p(n[P][D],P,D),C);return!$&&!A?null:n[v][L].score}))}function Un(t,e,n){return e>0&&n>0&&t[e-1][n-1]!==null||e+1<t.length&&n+1<t[e+1].length&&t[e+1][n+1]!==null}function Bn(t,e,n,r){return e>0&&n>0&&r(e-1,n-1)||e+1<t.length&&n+1<t[e+1].length&&r(e+1,n+1)}function Hn(t,e,n,r,o){let s=e,c=n;for(;s>0&&c>0&&r(s-1,c-1);)s--,c--;let u=e,d=n,m=t[e][n].score,p=1;for(;u+1<t.length&&d+1<t[u+1].length&&r(u+1,d+1);)u++,d++,m+=t[u][d].score,p++;for(let a=e-1,x=n-1;a>=s&&x>=c;a--,x--)m+=t[a][x].score,p++;return p>=3&&m/p>=Pt&&o(s,c)&&o(u,d)}function Ne(t,e){let n=Number.NEGATIVE_INFINITY,r=Number.NEGATIVE_INFINITY;return t.forEach((o,s)=>{e(o,s)&&(o.score>n?(r=n,n=o.score):o.score>r&&(r=o.score))}),{best:n,second:r}}function Ke(t){let e=Number.NEGATIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(let r of t)r.eligible&&(r.score>e?(n=e,e=r.score):r.score>n&&(n=r.score));return{best:e,second:n}}function Wn(t,e){let n=Gn(t,e),r=[],o=0,s=0;for(let c of n)Mt(r,t.slice(o,c.leftIndex),e.slice(s,c.rightIndex)),r.push({left:t[c.leftIndex],right:e[c.rightIndex]}),o=c.leftIndex+1,s=c.rightIndex+1;return Mt(r,t.slice(o),e.slice(s)),r}function Gn(t,e){let n=zn(t,e);if(n===null)return[];let r=Bt(t,e),o=n.map(({leftIndex:m,rightIndex:p,exact:a})=>({leftIndex:m,rightIndex:p,exact:a,structural:r.has(`${m}:${p}`),match:Je(t[m],e[p])})).filter(m=>m.exact||m.structural||m.match.eligible),s=Rt(o,"leftIndex"),c=Rt(o,"rightIndex"),u=o.filter(m=>{if(m.exact||m.structural)return!0;let p=s.get(m.leftIndex),a=c.get(m.rightIndex);if(!p||!a||m.match.score!==p.best||m.match.score!==a.best)return!1;let x=m.match.score>=Dt?Ae/2:Ae;return p.best-p.second>=x&&a.best-a.second>=x}),d=qn(u,e.length);return d.length<=On?d:[]}function zn(t,e){let n=$t(t,te),r=$t(e,te),o=new Map;for(let[u,d]of n){let m=r.get(u);if(!me(u)||d.length!==1||m?.length!==1)continue;let p=d[0],a=m[0];if(o.set(`${p}:${a}`,{leftIndex:p,rightIndex:a,exact:!0}),o.size>Lt)return null}let s=At(t),c=At(e);for(let[u,d]of s){let m=c.get(u);if(!(!m||d.length>Nt||m.length>Nt))for(let p of d)for(let a of m){let x=`${p}:${a}`;if(!o.has(x)&&(o.set(x,{leftIndex:p,rightIndex:a,exact:!1}),o.size>Lt))return null}}return[...o.values()]}function $t(t,e){let n=new Map;return t.forEach((r,o)=>{let s=e(r),c=n.get(s)??[];c.push(o),n.set(s,c)}),n}function At(t){let e=new Map;return t.forEach((n,r)=>{let o=new Set(Ye(te(n)).filter(Vn));for(let s of o){let c=e.get(s)??[];c.push(r),e.set(s,c)}}),e}function Vn(t){return t.length>=2&&/[\p{L}\p{N}_$]/u.test(t)}function Rt(t,e){let n=new Map;for(let r of t){let o=n.get(r[e])??[];o.push(r.match),n.set(r[e],o)}return new Map([...n].map(([r,o])=>[r,Ke(o)]))}function qn(t,e){let n=[...t].sort((m,p)=>m.leftIndex-p.leftIndex||m.rightIndex-p.rightIndex),r=new Array(e+2).fill(0),o=new Array(e+2).fill(-1),s=new Array(n.length).fill(0),c=new Array(n.length).fill(-1);for(let m=0;m<n.length;){let p=m+1;for(;p<n.length&&n[p].leftIndex===n[m].leftIndex;)p++;for(let a=m;a<p;a++){let x=Ft(r,o,n[a].rightIndex),E=n[a].exact||n[a].structural?.5:0;s[a]=x.score+n[a].match.score+E,c[a]=x.candidateIndex}for(let a=m;a<p;a++)Kn(r,o,n[a].rightIndex+1,s[a],a);m=p}let u=Ft(r,o,e+1),d=[];for(let m=u.candidateIndex;m>=0;m=c[m])d.push({leftIndex:n[m].leftIndex,rightIndex:n[m].rightIndex});return d.reverse()}function Ft(t,e,n){let r=0,o=-1;for(let s=n;s>0;s-=s&-s)t[s]>r&&(r=t[s],o=e[s]);return{score:r,candidateIndex:o}}function Kn(t,e,n,r,o){for(let s=n;s<t.length;s+=s&-s)r>t[s]&&(t[s]=r,e[s]=o)}function Mt(t,e,n){if(e.length*n.length<=Ot){t.push(...Ut(e,n));return}t.push(...e.map(r=>({left:r}))),t.push(...n.map(r=>({right:r})))}function te(t){return t.trim().replace(/\s+/g," ")}function Bt(t,e){let n=_t(t),r=_t(e),o=new Set;for(let[s,c]of n){let u=r.get(s);c.length===1&&u?.length===1&&o.add(`${c[0]}:${u[0]}`)}return o}function _t(t){let e=new Map;return t.forEach((n,r)=>{let o=Xe(n);if(!o)return;let s=e.get(o)??[];s.push(r),e.set(o,s)}),e}function je(t,e){let n=Xe(t),r=Xe(e);return!n||!r?n===r:n.split(":",1)[0]===r.split(":",1)[0]}function Xe(t){let e=te(t),n=[["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[r,o]of n){let s=e.match(o);if(s)return`${r}:${s[1]}`}return null}function me(t){return t.length<3?!1:/[\p{L}\p{N}_$]/u.test(t)&&!/^[\s()[\]{};,.:+\-*/=>|&!?'"`]+$/.test(t)}function Ye(t){return t.toLowerCase().match(/[\p{L}_$][\p{L}\p{N}_$]*|\p{N}+(?:\.\p{N}+)?|[^\s\p{L}\p{N}_$]/gu)??[]}function jn(t,e){if(t.length+e.length===0)return 1;let n=new Map;t.forEach(o=>n.set(o,(n.get(o)??0)+1));let r=0;for(let o of e){let s=n.get(o)??0;s>0&&(r++,n.set(o,s-1))}return 2*r/(t.length+e.length)}function Xn(t,e){if(t.length===0||e.length===0)return 0;let n=t[0]===e[0]?.5:0,r=t[t.length-1]===e[e.length-1]?.5:0;return n+r}function Yn(t,e){let n=t.length+e.length;return n===0?1:2*xt(t,e).filter(o=>!o.added&&!o.removed).reduce((o,s)=>o+s.value.length,0)/n}function Jn(t,e){if(t.content.length>Et||e.content.length>Et)return;let{leftSegments:n,rightSegments:r,hasInlineChanges:o}=Zn(t.content,e.content);o&&(t.segments=n,e.segments=r)}function Zn(t,e){let n=St(t,e),r=[],o=[],s=!1;for(let c of n){let u=c.value;if(!c.added&&!c.removed){let m={kind:"context",text:u,emphasis:!1};r.push(m),o.push(m);continue}let d=/[^\s]/.test(u);s=s||d,c.removed&&r.push({kind:"removed",text:u,emphasis:d}),c.added&&o.push({kind:"added",text:u,emphasis:d})}return{leftSegments:r,rightSegments:o,hasInlineChanges:s}}function le(){return{kind:"placeholder",content:"",lineNumber:null}}function Q(t,e,n){return{kind:t,content:e,lineNumber:n}}function ee(t,e,n){return{kind:t,content:e,lineNumber:n}}function ce(t,e){return{left:t,right:e}}function $e(t,e,n,r,o){return{kind:t,leftStart:e,leftEnd:n,rightStart:r,rightEnd:o}}function Ht(t,e){let n=typeof process<"u"?process.env?.[t]:void 0,r=Number.parseInt(n??"",10);return Number.isFinite(r)&&r>0?r:e}function Wt(){return{leftFileName:"test-file-1.js",rightFileName:"test-file-2.js",leftContent:`// Test File 1 - Example JavaScript Code
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const path = require('path');
|
|
7
7
|
|
|
@@ -145,7 +145,7 @@ if (require.main === module) {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
module.exports = FileProcessor;
|
|
148
|
-
`}}function Ot(t){if(!O(t)||t.version!==1)throw new Error("Unsupported or missing change-tour manifest version.");if(L(t.title,"title"),L(t.generatedAt,"generatedAt"),t.windowTitle!==void 0&&L(t.windowTitle,"windowTitle"),t.sourceUrl!==void 0&&L(t.sourceUrl,"sourceUrl"),!O(t.range))throw new Error("Change-tour manifest range must be an object.");for(let r of["baseRef","headRef","mergeBaseOid","headOid"])L(t.range[r],`range.${r}`);if(!O(t.summary))throw new Error("Change-tour manifest summary must be an object.");for(let r of["changedFiles","includedScenes","additions","deletions","commitCount"])re(t.summary[r],`summary.${r}`);if(me(t.summary.omittedFiles,"summary.omittedFiles"),!Array.isArray(t.commits)||!Array.isArray(t.chapters)||!Array.isArray(t.scenes))throw new Error("Change-tour manifest commits, chapters, and scenes must be arrays.");if(t.files!==void 0&&!Array.isArray(t.files))throw new Error("Change-tour manifest files must be an array.");let e=new Set;for(let[r,o]of t.scenes.entries()){if(Ze(o,r),e.has(o.id))throw new Error(`Duplicate change-tour scene id: ${o.id}`);e.add(o.id)}for(let[r,o]of t.chapters.entries()){if(!O(o))throw new Error(`chapters[${r}] must be an object.`);L(o.id,`chapters[${r}].id`),L(o.title,`chapters[${r}].title`),me(o.sceneIds,`chapters[${r}].sceneIds`);for(let s of o.sceneIds)if(!e.has(s))throw new Error(`Chapter references unknown scene id: ${s}`)}if(t.summary.includedScenes!==t.scenes.length)throw new Error("summary.includedScenes must match the number of scenes.");let n=t.files===void 0?er(t.scenes):t.files.map((r,o)=>(Qn(r,o),r));if(t.files!==void 0&&t.summary.changedFiles!==n.length)throw new Error("summary.changedFiles must match the number of files.");return{...t,files:n}}function Ze(t,e){if(!O(t)||!["text-diff","discussion","walkthrough","stacked-diff","deconstructed-diff"].includes(String(t.kind)))throw new Error(`scenes[${e}] must be a text-diff, discussion, walkthrough, stacked-diff, or deconstructed-diff scene.`);for(let n of["id","title"])L(t[n],`scenes[${e}].${n}`);if(tr(t,`scenes[${e}]`),t.kind!=="discussion"){if(t.kind==="walkthrough"){if(!Array.isArray(t.steps)||t.steps.length===0)throw new Error(`scenes[${e}].steps must be a non-empty array.`);for(let[n,r]of t.steps.entries()){let o=`scenes[${e}].steps[${n}]`;if(!O(r)||!O(r.focus)||!O(r.diff))throw new Error(`${o} must contain focus and diff objects.`);for(let s of["id","title","body"])L(r[s],`${o}.${s}`);if(r.depth!==void 0&&!["mentioned","explained","contextualized"].includes(String(r.depth)))throw new Error(`${o}.depth must be mentioned, explained, or contextualized.`);if(Je(r.focus,`${o}.focus`),Ze(r.diff,e),r.diff.kind!=="text-diff")throw new Error(`${o}.diff must be a text-diff scene.`);if(r.connection!==void 0){if(!O(r.connection))throw new Error(`${o}.connection must be an object.`);L(r.connection.id,`${o}.connection.id`),L(r.connection.label,`${o}.connection.label`),Je(r.connection.from,`${o}.connection.from`),Je(r.connection.to,`${o}.connection.to`)}}return}if(t.kind==="stacked-diff"){Jn(t,e);return}if(t.kind==="deconstructed-diff"){Zn(t,e);return}for(let n of["path","leftLabel","rightLabel","leftContent","rightContent"])L(t[n],`scenes[${e}].${n}`);t.previousPath!==void 0&&L(t.previousPath,`scenes[${e}].previousPath`),L(t.changeKind,`scenes[${e}].changeKind`),re(t.additions,`scenes[${e}].additions`),re(t.deletions,`scenes[${e}].deletions`),t.focusChangeIndex!==void 0&&re(t.focusChangeIndex,`scenes[${e}].focusChangeIndex`)}}function Jn(t,e){if(!Array.isArray(t.stack)||t.stack.length<3||t.stack.length>6)throw new Error(`scenes[${e}].stack must contain between 3 and 6 revisions.`);for(let[n,r]of t.stack.entries()){if(!O(r))throw new Error(`scenes[${e}].stack[${n}] must be an object.`);for(let o of["id","ref","oid","label"])L(r[o],`scenes[${e}].stack[${n}].${o}`)}Ht(t.files,t.stack.length,e),Bt(t.steps,t.stack.length,e,!1)}function Zn(t,e){if(t.stageLabel!=="Explanation stages")throw new Error(`scenes[${e}].stageLabel must be Explanation stages.`);if(!O(t.realRange))throw new Error(`scenes[${e}].realRange must be an object.`);for(let r of["baseRef","targetRef","baseOid","targetOid"])L(t.realRange[r],`scenes[${e}].realRange.${r}`);if(!Array.isArray(t.panels)||t.panels.length<2||t.panels.length>13)throw new Error(`scenes[${e}].panels must contain a baseline and between 1 and 12 stages.`);let n=t.panels;for(let[r,o]of n.entries()){if(!O(o))throw new Error(`scenes[${e}].panels[${r}] must be an object.`);for(let l of["id","label","role"])L(o[l],`scenes[${e}].panels[${r}].${l}`);let s=r===0?"baseline":"stage";if(o.role!==s)throw new Error(`scenes[${e}].panels[${r}].role must be ${s}.`);r>0&&L(o.stageId,`scenes[${e}].panels[${r}].stageId`)}if(Ht(t.files,n.length,e),Bt(t.steps,n.length,e,!0),Array.isArray(t.steps)&&t.steps.length!==n.length-1)throw new Error(`scenes[${e}].steps must match the number of explanation stages.`);Array.isArray(t.steps)&&t.steps.forEach((r,o)=>{let s=n[o+1];if(!O(r)||!O(s)||s.stageId!==r.id)throw new Error(`scenes[${e}].panels must align with explanation stage ids.`)})}function Ht(t,e,n){if(!Array.isArray(t)||t.length===0)throw new Error(`scenes[${n}].files must be non-empty.`);for(let[r,o]of t.entries()){if(!O(o))throw new Error(`scenes[${n}].files[${r}] must be an object.`);if(L(o.path,`scenes[${n}].files[${r}].path`),!Array.isArray(o.panels)||o.panels.length!==e)throw new Error(`scenes[${n}].files[${r}].panels must match panel count.`);for(let[s,l]of o.panels.entries()){if(!O(l))throw new Error(`scenes[${n}].files[${r}].panels[${s}] must be an object.`);for(let u of["id","label","content"])L(l[u],`scenes[${n}].files[${r}].panels[${s}].${u}`);if(l.path!==void 0&&L(l.path,`scenes[${n}].files[${r}].panels[${s}].path`),typeof l.exists!="boolean")throw new Error(`scenes[${n}].files[${r}].panels[${s}].exists must be boolean.`)}}}function Bt(t,e,n,r){if(!Array.isArray(t)||t.length===0)throw new Error(`scenes[${n}].steps must be non-empty.`);for(let[o,s]of t.entries()){if(!O(s))throw new Error(`scenes[${n}].steps[${o}] must be an object.`);for(let l of["id","title","body","file","side"])L(s[l],`scenes[${n}].steps[${o}].${l}`);if(re(s.pairIndex,`scenes[${n}].steps[${o}].pairIndex`),Number(s.pairIndex)>=e-1)throw new Error(`scenes[${n}].steps[${o}].pairIndex is outside the panels.`);if(r){if(me(s.introducedHunks,`scenes[${n}].steps[${o}].introducedHunks`),s.introducedHunks.length===0)throw new Error(`scenes[${n}].steps[${o}].introducedHunks must be non-empty.`);if(Number(s.pairIndex)!==o)throw new Error(`scenes[${n}].steps[${o}].pairIndex must match its explanation stage.`)}if(s.side!=="left"&&s.side!=="right")throw new Error(`scenes[${n}].steps[${o}].side must be left or right.`);s.startLine!==void 0&&$e(s.startLine,`scenes[${n}].steps[${o}].startLine`),s.endLine!==void 0&&$e(s.endLine,`scenes[${n}].steps[${o}].endLine`)}}function Qn(t,e){if(!O(t))throw new Error(`files[${e}] must be an object.`);if(t.kind==="text-diff"){Ze(t,e);return}if(t.kind!=="omitted")throw new Error(`files[${e}].kind must be text-diff or omitted.`);for(let n of["id","title","path","changeKind","reason"])L(t[n],`files[${e}].${n}`);t.previousPath!==void 0&&L(t.previousPath,`files[${e}].previousPath`),re(t.additions,`files[${e}].additions`),re(t.deletions,`files[${e}].deletions`)}function er(t){let e=new Map;for(let n of t){if(n.kind==="text-diff"){e.has(n.path)||e.set(n.path,n);continue}if(n.kind==="walkthrough")for(let r of n.steps)e.has(r.diff.path)||e.set(r.diff.path,r.diff)}return[...e.values()].sort((n,r)=>n.path.localeCompare(r.path))}function Je(t,e){if(!O(t))throw new Error(`${e} must be an object.`);for(let n of["id","path","revision","excerpt"])L(t[n],`${e}.${n}`);if(t.revision!=="base"&&t.revision!=="head")throw new Error(`${e}.revision must be base or head.`);if($e(t.startLine,`${e}.startLine`),$e(t.endLine,`${e}.endLine`),Number(t.endLine)<Number(t.startLine))throw new Error(`${e}.endLine must not precede startLine.`)}function tr(t,e){L(t.summary,`${e}.summary`),me(t.bullets,`${e}.bullets`),me(t.tags,`${e}.tags`),L(t.takeaway,`${e}.takeaway`)}function O(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function L(t,e){if(typeof t!="string")throw new Error(`${e} must be a string.`)}function me(t,e){if(!Array.isArray(t)||t.some(n=>typeof n!="string"))throw new Error(`${e} must be an array of strings.`)}function re(t,e){if(!Number.isInteger(t)||Number(t)<0)throw new Error(`${e} must be a non-negative integer.`)}function $e(t,e){if(!Number.isInteger(t)||Number(t)<1)throw new Error(`${e} must be a positive integer.`)}function Wt(t,e,n){let r=t.findIndex(u=>u.id===e),o=r>=0?r:0,s=t[o];if(!s||s.kind!=="walkthrough"&&s.kind!=="stacked-diff"&&s.kind!=="deconstructed-diff"||!n)return{sceneIndex:o,stepIndex:0};let l=s.steps.findIndex(u=>u.id===n);return{sceneIndex:o,stepIndex:l>=0?l:0}}function Re(t,e,n){let r=t[e.sceneIndex];if(!r)return null;if(n>0)return(r.kind==="walkthrough"||r.kind==="stacked-diff"||r.kind==="deconstructed-diff")&&e.stepIndex<r.steps.length-1?{sceneIndex:e.sceneIndex,stepIndex:e.stepIndex+1}:e.sceneIndex<t.length-1?{sceneIndex:e.sceneIndex+1,stepIndex:0}:null;if((r.kind==="walkthrough"||r.kind==="stacked-diff"||r.kind==="deconstructed-diff")&&e.stepIndex>0)return{sceneIndex:e.sceneIndex,stepIndex:e.stepIndex-1};if(e.sceneIndex===0)return null;let o=t[e.sceneIndex-1];return{sceneIndex:e.sceneIndex-1,stepIndex:o.kind==="walkthrough"||o.kind==="stacked-diff"||o.kind==="deconstructed-diff"?o.steps.length-1:0}}function Gt(t,e,n){if(!e)return null;let r=t.map((u,d)=>({file:u,fileIndex:d})).filter(({file:u})=>u.kind==="text-diff"),o=r.findIndex(({file:u})=>u.path===e),s=o+n,l=o>=0?r[s]:null;return l?{fileIndex:l.fileIndex,path:l.file.path}:null}function zt(t,e,n){let r=t[e.sceneIndex],o=Ut(r,e.sceneIndex,e.stepIndex,n);if(o)return o;for(let s=0;s<t.length;s+=1){if(s===e.sceneIndex)continue;let l=Ut(t[s],s,0,n);if(l)return l}return null}function Ut(t,e,n,r){if(!t||t.kind!=="stacked-diff"&&t.kind!=="deconstructed-diff"||!t.files.some(l=>l.path===r))return null;let s=t.steps[n]?.file===r?n:t.steps.findIndex(l=>l.file===r);return{sceneIndex:e,stepIndex:s>=0?s:Math.max(n,0)}}function jt(t,e,n){let r=t.scenes[e.sceneIndex];if(!r)return null;let o=Qe(r)?Math.min(Math.max(e.stepIndex,0),r.steps.length-1):0,s={sceneIndex:e.sceneIndex,stepIndex:o},l=Qe(r)?r.steps[o]:void 0,u=[],d=!l||o===0,m=!!(l&&o>0&&n.entry==="playback-start");if(d){let v=t.chapters.find(k=>k.sceneIds.includes(r.id));v&&u.push({source:{field:"chapter"},text:v.title})}(d||m)&&u.push({source:{field:"scene-title"},text:r.title}),d&&(u.push({source:{field:"summary"},text:r.summary}),r.bullets.forEach((v,k)=>{u.push({source:{field:"bullet",itemIndex:k},text:v})})),l&&(u.push({source:{field:"step-title"},text:l.title}),u.push({source:{field:"step-body"},text:l.body}),"connection"in l&&l.connection?.label&&u.push({source:{field:"connection"},text:l.connection.label})),(!l||Qe(r)&&o===r.steps.length-1)&&u.push({source:{field:"takeaway"},text:r.takeaway});let p=`${r.id}:${l?.id||"scene"}`,a=n.segmentLimit??240,I=u.flatMap(v=>ir(p,v,a));return{id:p,position:s,segments:I}}function nr(t,e=240){if(!Number.isInteger(e)||e<40)throw new Error("Narration segment limit must be an integer of at least 40 characters.");return or(t).flatMap(r=>sr(t,r.startOffset,r.endOffset,e))}function rr(t){return t.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 ir(t,e,n){let r=e.source.itemIndex===void 0?e.source.field:`${e.source.field}-${e.source.itemIndex}`;return nr(e.text,n).map((o,s)=>({id:`${t}:${r}:${s}`,text:o.text,speechText:rr(o.text),source:e.source,startOffset:o.startOffset,endOffset:o.endOffset})).filter(o=>o.speechText.length>0)}function or(t){let e=[],n=0;for(let r=0;r<t.length;r+=1){if(!".!?".includes(t[r]))continue;let o=r+1;for(;o<t.length&&`"'\u201D\u2019)]}`.includes(t[o]);)o+=1;o<t.length&&!/\s/u.test(t[o])||(Ae(t,e,n,o),n=o)}return Ae(t,e,n,t.length),e}function sr(t,e,n,r){let o=[],s=e;for(;n-s>r;){let l=s+r,u=s+Math.floor(r*.55),d=Vt(t,u,l,/[;,:—–-]/u);d<=s&&(d=Vt(t,u,l,/\s/u)),d<=s&&(d=l),Ae(t,o,s,d),s=d}return Ae(t,o,s,n),o}function Vt(t,e,n,r){for(let o=n;o>=e;o-=1)if(r.test(t[o]))return o+1;return-1}function Ae(t,e,n,r){let o=n,s=r;for(;o<s&&/\s/u.test(t[o]);)o+=1;for(;s>o&&/\s/u.test(t[s-1]);)s-=1;o<s&&e.push({text:t.slice(o,s),startOffset:o,endOffset:s})}function Qe(t){return t.kind==="walkthrough"||t.kind==="stacked-diff"||t.kind==="deconstructed-diff"}var Fe=class{constructor(e,n){this.engine=e;this.callbacks=n;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(e,n=!0){if(this.resetEngine(),this.continuous=n,e.segments.length===0){this.finishUnit(e);return}this.callbacks.claimAudio(),this.setState({kind:"playing",unit:e,segmentIndex:0}),this.speakCurrent()}togglePause(){if(this.currentState.kind==="playing"){this.engine.pause();let n={kind:"paused",unit:this.currentState.unit,segmentIndex:this.currentState.segmentIndex,pendingStart:!1};this.setState(n),this.callbacks.onSegmentChange(n.unit.segments[n.segmentIndex]||null,!0);return}if(this.currentState.kind!=="paused")return;this.callbacks.claimAudio();let e=this.currentState;this.setState({kind:"playing",unit:e.unit,segmentIndex:e.segmentIndex}),e.pendingStart?this.speakCurrent():(this.engine.resume(),this.callbacks.onSegmentChange(e.unit.segments[e.segmentIndex]||null,!1))}stop(){this.resetEngine(),this.setState({kind:"idle"}),this.callbacks.onSegmentChange(null,!1)}pauseForExternalOwner(){this.currentState.kind==="playing"&&this.togglePause()}canSkipSegment(e){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return!1;let n=this.currentState.segmentIndex+e;return n>=0&&n<this.currentState.unit.segments.length?!0:this.callbacks.canNavigateUnit(this.currentState.unit,e)}skipSegment(e){if(!this.canSkipSegment(e))return!1;let n=this.currentState,r=n.kind==="paused",o=n.unit,s=n.segmentIndex+e;if(s<0||s>=o.segments.length){let l=this.callbacks.navigateUnit(o,e);if(!l||l.segments.length===0)return!1;o=l,s=e<0?o.segments.length-1:0}return this.resetEngine(),r?(this.setState({kind:"paused",unit:o,segmentIndex:s,pendingStart:!0}),this.callbacks.onSegmentChange(o.segments[s]||null,!0)):(this.setState({kind:"playing",unit:o,segmentIndex:s}),this.speakCurrent()),!0}followLinearNavigation(e){this.currentState.kind==="playing"?this.start(e,this.continuous):this.currentState.kind==="paused"&&this.preparePaused(e)}followDirectNavigation(e){this.engaged&&this.preparePaused(e)}interruptForExploration(){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return;let e=this.currentState;this.resetEngine(),this.setState({kind:"paused",unit:e.unit,segmentIndex:e.segmentIndex,pendingStart:!0}),this.callbacks.onSegmentChange(e.unit.segments[e.segmentIndex]||null,!0)}dispose(){this.stop()}preparePaused(e){this.resetEngine(),this.setState({kind:"paused",unit:e,segmentIndex:0,pendingStart:!0}),this.callbacks.onSegmentChange(e.segments[0]||null,!0)}speakCurrent(){if(this.currentState.kind!=="playing")return;let e=this.generation,n=this.currentState.unit.segments[this.currentState.segmentIndex];if(!n){this.finishUnit(this.currentState.unit);return}this.callbacks.onSegmentChange(n,!1),this.engine.speak(n,{onEnd:()=>{if(e!==this.generation||this.currentState.kind!=="playing")return;let r=this.currentState.segmentIndex+1;r<this.currentState.unit.segments.length?(this.setState({kind:"playing",unit:this.currentState.unit,segmentIndex:r}),this.speakCurrent()):this.finishUnit(this.currentState.unit)},onError:r=>{e===this.generation&&(this.setState({kind:"error",message:r}),this.callbacks.onSegmentChange(null,!1))}})}finishUnit(e){if(this.continuous){let n=this.callbacks.navigateUnit(e,1);if(n){if(this.generation+=1,n.segments.length===0){this.finishUnit(n);return}this.setState({kind:"playing",unit:n,segmentIndex:0}),this.speakCurrent();return}}this.setState({kind:"completed"}),this.callbacks.onSegmentChange(null,!1)}resetEngine(){this.generation+=1,this.engine.cancel()}setState(e){this.currentState=e,this.callbacks.onStateChange(e)}};function Kt(t,e,n="all",r=300){let o=e.trim().toLocaleLowerCase();if(!o||r<=0)return[];let s=[];if(n!=="code"){let l=new Map;t.chapters.forEach(u=>u.sceneIds.forEach(d=>l.set(d,u.title))),t.scenes.forEach((u,d)=>{let m=[l.get(u.id),u.title,u.summary,...u.bullets,...u.tags,u.takeaway],p=qt(m,o);p&&s.push({kind:"narrative",sceneIndex:d,label:u.title,preview:p}),cr(u)&&u.steps.forEach((a,I)=>{let v=qt([a.title,a.body,"connection"in a?a.connection?.label:void 0],o);v&&s.push({kind:"narrative",sceneIndex:d,stepIndex:I,label:`${u.title} \xB7 ${a.title}`,preview:v})})})}if(n!=="narrative"&&s.length<r)for(let l=0;l<t.files.length;l+=1){let u=t.files[l];if(u.kind==="text-diff"){for(let[d,m]of[[0,u.leftContent],[1,u.rightContent]])for(let p of ar(m,o))if(s.push({kind:"code",fileIndex:l,sideIndex:d,label:`${u.path} \xB7 ${d===0?"base":"head"}`,...p}),s.length>=r)return s}}return s.slice(0,r)}function qt(t,e){return t.find(n=>n?.toLocaleLowerCase().includes(e))}function ar(t,e){let n=[];return t.replace(/\r\n/g,`
|
|
148
|
+
`}}function Gt(t){if(!_(t)||t.version!==1)throw new Error("Unsupported or missing change-tour manifest version.");if(N(t.title,"title"),N(t.generatedAt,"generatedAt"),t.windowTitle!==void 0&&N(t.windowTitle,"windowTitle"),t.sourceUrl!==void 0&&N(t.sourceUrl,"sourceUrl"),!_(t.range))throw new Error("Change-tour manifest range must be an object.");for(let r of["baseRef","headRef","mergeBaseOid","headOid"])N(t.range[r],`range.${r}`);if(!_(t.summary))throw new Error("Change-tour manifest summary must be an object.");for(let r of["changedFiles","includedScenes","additions","deletions","commitCount"])J(t.summary[r],`summary.${r}`);if(pe(t.summary.omittedFiles,"summary.omittedFiles"),!Array.isArray(t.commits)||!Array.isArray(t.chapters)||!Array.isArray(t.scenes))throw new Error("Change-tour manifest commits, chapters, and scenes must be arrays.");if(t.files!==void 0&&!Array.isArray(t.files))throw new Error("Change-tour manifest files must be an array.");let e=new Set;for(let[r,o]of t.scenes.entries()){if(Qe(o,r),e.has(o.id))throw new Error(`Duplicate change-tour scene id: ${o.id}`);e.add(o.id)}for(let[r,o]of t.chapters.entries()){if(!_(o))throw new Error(`chapters[${r}] must be an object.`);N(o.id,`chapters[${r}].id`),N(o.title,`chapters[${r}].title`),pe(o.sceneIds,`chapters[${r}].sceneIds`);for(let s of o.sceneIds)if(!e.has(s))throw new Error(`Chapter references unknown scene id: ${s}`)}if(t.summary.includedScenes!==t.scenes.length)throw new Error("summary.includedScenes must match the number of scenes.");let n=t.files===void 0?nr(t.scenes):t.files.map((r,o)=>(tr(r,o),r));if(t.files!==void 0&&t.summary.changedFiles!==n.length)throw new Error("summary.changedFiles must match the number of files.");return{...t,files:n}}function Qe(t,e){if(!_(t)||!["text-diff","discussion","walkthrough","stacked-diff","deconstructed-diff"].includes(String(t.kind)))throw new Error(`scenes[${e}] must be a text-diff, discussion, walkthrough, stacked-diff, or deconstructed-diff scene.`);for(let n of["id","title"])N(t[n],`scenes[${e}].${n}`);if(rr(t,`scenes[${e}]`),t.kind!=="discussion"){if(t.kind==="walkthrough"){if(!Array.isArray(t.steps)||t.steps.length===0)throw new Error(`scenes[${e}].steps must be a non-empty array.`);for(let[n,r]of t.steps.entries()){let o=`scenes[${e}].steps[${n}]`;if(!_(r)||!_(r.focus)||!_(r.diff))throw new Error(`${o} must contain focus and diff objects.`);for(let s of["id","title","body"])N(r[s],`${o}.${s}`);if(r.depth!==void 0&&!["mentioned","explained","contextualized"].includes(String(r.depth)))throw new Error(`${o}.depth must be mentioned, explained, or contextualized.`);if(Ze(r.focus,`${o}.focus`),Qe(r.diff,e),r.diff.kind!=="text-diff")throw new Error(`${o}.diff must be a text-diff scene.`);if(r.connection!==void 0){if(!_(r.connection))throw new Error(`${o}.connection must be an object.`);N(r.connection.id,`${o}.connection.id`),N(r.connection.label,`${o}.connection.label`),Ze(r.connection.from,`${o}.connection.from`),Ze(r.connection.to,`${o}.connection.to`)}}return}if(t.kind==="stacked-diff"){Qn(t,e);return}if(t.kind==="deconstructed-diff"){er(t,e);return}for(let n of["path","leftLabel","rightLabel","leftContent","rightContent"])N(t[n],`scenes[${e}].${n}`);t.previousPath!==void 0&&N(t.previousPath,`scenes[${e}].previousPath`),N(t.changeKind,`scenes[${e}].changeKind`),J(t.additions,`scenes[${e}].additions`),J(t.deletions,`scenes[${e}].deletions`),t.focusChangeIndex!==void 0&&J(t.focusChangeIndex,`scenes[${e}].focusChangeIndex`)}}function Qn(t,e){if(!Array.isArray(t.stack)||t.stack.length<3||t.stack.length>6)throw new Error(`scenes[${e}].stack must contain between 3 and 6 revisions.`);for(let[n,r]of t.stack.entries()){if(!_(r))throw new Error(`scenes[${e}].stack[${n}] must be an object.`);for(let o of["id","ref","oid","label"])N(r[o],`scenes[${e}].stack[${n}].${o}`)}zt(t.files,t.stack.length,e),Vt(t.steps,t.stack.length,e,!1)}function er(t,e){if(t.stageLabel!=="Explanation stages")throw new Error(`scenes[${e}].stageLabel must be Explanation stages.`);if(!_(t.realRange))throw new Error(`scenes[${e}].realRange must be an object.`);for(let r of["baseRef","targetRef","baseOid","targetOid"])N(t.realRange[r],`scenes[${e}].realRange.${r}`);if(!Array.isArray(t.panels)||t.panels.length<2||t.panels.length>13)throw new Error(`scenes[${e}].panels must contain a baseline and between 1 and 12 stages.`);let n=t.panels;for(let[r,o]of n.entries()){if(!_(o))throw new Error(`scenes[${e}].panels[${r}] must be an object.`);for(let c of["id","label","role"])N(o[c],`scenes[${e}].panels[${r}].${c}`);let s=r===0?"baseline":"stage";if(o.role!==s)throw new Error(`scenes[${e}].panels[${r}].role must be ${s}.`);r>0&&N(o.stageId,`scenes[${e}].panels[${r}].stageId`)}if(zt(t.files,n.length,e),Vt(t.steps,n.length,e,!0),Array.isArray(t.steps)){let r=-1;t.steps.forEach((o,s)=>{if(!_(o))return;let c=Number(o.pairIndex);if(c<r)throw new Error(`scenes[${e}].steps must remain grouped in explanation stage order.`);if(r=c,o.stageId!==void 0&&N(o.stageId,`scenes[${e}].steps[${s}].stageId`),o.stageIndex!==void 0&&J(o.stageIndex,`scenes[${e}].steps[${s}].stageIndex`),o.focusIndex!==void 0&&J(o.focusIndex,`scenes[${e}].steps[${s}].focusIndex`),o.focusCount!==void 0&&be(o.focusCount,`scenes[${e}].steps[${s}].focusCount`),o.stageIndex!==void 0&&Number(o.stageIndex)!==c)throw new Error(`scenes[${e}].steps[${s}].stageIndex must match pairIndex.`);if(o.focusIndex!==void 0&&o.focusCount!==void 0&&Number(o.focusIndex)>=Number(o.focusCount))throw new Error(`scenes[${e}].steps[${s}].focusIndex must be less than focusCount.`)});for(let o=0;o<n.length-1;o+=1){let s=n[o+1],c=t.steps.filter(m=>_(m)&&Number(m.pairIndex)===o);if(!_(s)||c.length===0)throw new Error(`scenes[${e}].steps must cover every explanation stage.`);let u=c[0],d=_(u)?u.id:void 0;if(c.some(m=>_(m)?(m.stageId??d)!==s.stageId:!0))throw new Error(`scenes[${e}].panels must align with explanation stage ids.`)}}}function zt(t,e,n){if(!Array.isArray(t)||t.length===0)throw new Error(`scenes[${n}].files must be non-empty.`);for(let[r,o]of t.entries()){if(!_(o))throw new Error(`scenes[${n}].files[${r}] must be an object.`);if(N(o.path,`scenes[${n}].files[${r}].path`),!Array.isArray(o.panels)||o.panels.length!==e)throw new Error(`scenes[${n}].files[${r}].panels must match panel count.`);for(let[s,c]of o.panels.entries()){if(!_(c))throw new Error(`scenes[${n}].files[${r}].panels[${s}] must be an object.`);for(let u of["id","label","content"])N(c[u],`scenes[${n}].files[${r}].panels[${s}].${u}`);if(c.path!==void 0&&N(c.path,`scenes[${n}].files[${r}].panels[${s}].path`),typeof c.exists!="boolean")throw new Error(`scenes[${n}].files[${r}].panels[${s}].exists must be boolean.`)}}}function Vt(t,e,n,r){if(!Array.isArray(t)||t.length===0)throw new Error(`scenes[${n}].steps must be non-empty.`);for(let[o,s]of t.entries()){if(!_(s))throw new Error(`scenes[${n}].steps[${o}] must be an object.`);for(let c of["id","title","body","file","side"])N(s[c],`scenes[${n}].steps[${o}].${c}`);if(J(s.pairIndex,`scenes[${n}].steps[${o}].pairIndex`),Number(s.pairIndex)>=e-1)throw new Error(`scenes[${n}].steps[${o}].pairIndex is outside the panels.`);if(r&&(pe(s.introducedHunks,`scenes[${n}].steps[${o}].introducedHunks`),s.introducedHunks.length===0))throw new Error(`scenes[${n}].steps[${o}].introducedHunks must be non-empty.`);if(s.side!=="left"&&s.side!=="right")throw new Error(`scenes[${n}].steps[${o}].side must be left or right.`);s.startLine!==void 0&&be(s.startLine,`scenes[${n}].steps[${o}].startLine`),s.endLine!==void 0&&be(s.endLine,`scenes[${n}].steps[${o}].endLine`)}}function tr(t,e){if(!_(t))throw new Error(`files[${e}] must be an object.`);if(t.kind==="text-diff"){Qe(t,e);return}if(t.kind!=="omitted")throw new Error(`files[${e}].kind must be text-diff or omitted.`);for(let n of["id","title","path","changeKind","reason"])N(t[n],`files[${e}].${n}`);t.previousPath!==void 0&&N(t.previousPath,`files[${e}].previousPath`),J(t.additions,`files[${e}].additions`),J(t.deletions,`files[${e}].deletions`)}function nr(t){let e=new Map;for(let n of t){if(n.kind==="text-diff"){e.has(n.path)||e.set(n.path,n);continue}if(n.kind==="walkthrough")for(let r of n.steps)e.has(r.diff.path)||e.set(r.diff.path,r.diff)}return[...e.values()].sort((n,r)=>n.path.localeCompare(r.path))}function Ze(t,e){if(!_(t))throw new Error(`${e} must be an object.`);for(let n of["id","path","revision","excerpt"])N(t[n],`${e}.${n}`);if(t.revision!=="base"&&t.revision!=="head")throw new Error(`${e}.revision must be base or head.`);if(be(t.startLine,`${e}.startLine`),be(t.endLine,`${e}.endLine`),Number(t.endLine)<Number(t.startLine))throw new Error(`${e}.endLine must not precede startLine.`)}function rr(t,e){N(t.summary,`${e}.summary`),pe(t.bullets,`${e}.bullets`),pe(t.tags,`${e}.tags`),N(t.takeaway,`${e}.takeaway`)}function _(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function N(t,e){if(typeof t!="string")throw new Error(`${e} must be a string.`)}function pe(t,e){if(!Array.isArray(t)||t.some(n=>typeof n!="string"))throw new Error(`${e} must be an array of strings.`)}function J(t,e){if(!Number.isInteger(t)||Number(t)<0)throw new Error(`${e} must be a non-negative integer.`)}function be(t,e){if(!Number.isInteger(t)||Number(t)<1)throw new Error(`${e} must be a positive integer.`)}var ir=new Set(["modified-here","created-here","deleted-here"]);function et(t,e){let n=t.panels[e],r=t.panels[e+1];return!n||!r?"unchanged-here":n.exists&&r.exists?n.content===r.content?"unchanged-here":"modified-here":!n.exists&&r.exists?"created-here":n.exists&&!r.exists?"deleted-here":t.panels.slice(0,e).some(c=>c.exists)?"already-deleted":(t.panels.slice(e+2).some(c=>c.exists),"not-created-yet")}function qt(t,e,n,r){if(r!==-1&&r!==1||!n)return null;let o=t.findIndex(u=>u.path===n);if(o<0)return null;let s=t.map((u,d)=>({file:u,fileIndex:d,state:et(u,e)})).filter(({state:u})=>ir.has(u)),c=r<0?[...s].reverse().find(({fileIndex:u})=>u<o):s.find(({fileIndex:u})=>u>o);return c?{pairIndex:e,fileIndex:c.fileIndex,path:c.file.path}:null}function Kt(t,e,n){let r=t.findIndex(u=>u.id===e),o=r>=0?r:0,s=t[o];if(!s||s.kind!=="walkthrough"&&s.kind!=="stacked-diff"&&s.kind!=="deconstructed-diff"||!n)return{sceneIndex:o,stepIndex:0};let c=s.steps.findIndex(u=>u.id===n);return{sceneIndex:o,stepIndex:c>=0?c:0}}function Re(t,e,n){let r=t[e.sceneIndex];if(!r)return null;if(n>0)return(r.kind==="walkthrough"||r.kind==="stacked-diff"||r.kind==="deconstructed-diff")&&e.stepIndex<r.steps.length-1?{sceneIndex:e.sceneIndex,stepIndex:e.stepIndex+1}:e.sceneIndex<t.length-1?{sceneIndex:e.sceneIndex+1,stepIndex:0}:null;if((r.kind==="walkthrough"||r.kind==="stacked-diff"||r.kind==="deconstructed-diff")&&e.stepIndex>0)return{sceneIndex:e.sceneIndex,stepIndex:e.stepIndex-1};if(e.sceneIndex===0)return null;let o=t[e.sceneIndex-1];return{sceneIndex:e.sceneIndex-1,stepIndex:o.kind==="walkthrough"||o.kind==="stacked-diff"||o.kind==="deconstructed-diff"?o.steps.length-1:0}}function jt(t,e,n){if(!e)return null;let r=t.map((u,d)=>({file:u,fileIndex:d})).filter(({file:u})=>u.kind==="text-diff"),o=r.findIndex(({file:u})=>u.path===e),s=o+n,c=o>=0?r[s]:null;return c?{fileIndex:c.fileIndex,path:c.file.path}:null}function Yt(t,e,n){let r=t.scenes[e.sceneIndex];if(!r)return null;let o=tt(r)?Math.min(Math.max(e.stepIndex,0),r.steps.length-1):0,s={sceneIndex:e.sceneIndex,stepIndex:o},c=tt(r)?r.steps[o]:void 0,u=[],d=!c||o===0,m=!!(c&&o>0&&n.entry==="playback-start");if(d){let E=t.chapters.find(C=>C.sceneIds.includes(r.id));E&&u.push({source:{field:"chapter"},text:E.title})}(d||m)&&u.push({source:{field:"scene-title"},text:r.title}),d&&(u.push({source:{field:"summary"},text:r.summary}),r.bullets.forEach((E,C)=>{u.push({source:{field:"bullet",itemIndex:C},text:E})})),c&&(u.push({source:{field:"step-title"},text:c.title}),u.push({source:{field:"step-body"},text:c.body}),"connection"in c&&c.connection?.label&&u.push({source:{field:"connection"},text:c.connection.label})),(!c||tt(r)&&o===r.steps.length-1)&&u.push({source:{field:"takeaway"},text:r.takeaway});let p=`${r.id}:${c?.id||"scene"}`,a=n.segmentLimit??240,x=u.flatMap(E=>ar(p,E,a));return{id:p,position:s,segments:x}}function or(t,e=240){if(!Number.isInteger(e)||e<40)throw new Error("Narration segment limit must be an integer of at least 40 characters.");return lr(t).flatMap(r=>cr(t,r.startOffset,r.endOffset,e))}function sr(t){return t.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 ar(t,e,n){let r=e.source.itemIndex===void 0?e.source.field:`${e.source.field}-${e.source.itemIndex}`;return or(e.text,n).map((o,s)=>({id:`${t}:${r}:${s}`,text:o.text,speechText:sr(o.text),source:e.source,startOffset:o.startOffset,endOffset:o.endOffset})).filter(o=>o.speechText.length>0)}function lr(t){let e=[],n=0;for(let r=0;r<t.length;r+=1){if(!".!?".includes(t[r]))continue;let o=r+1;for(;o<t.length&&`"'\u201D\u2019)]}`.includes(t[o]);)o+=1;o<t.length&&!/\s/u.test(t[o])||(Fe(t,e,n,o),n=o)}return Fe(t,e,n,t.length),e}function cr(t,e,n,r){let o=[],s=e;for(;n-s>r;){let c=s+r,u=s+Math.floor(r*.55),d=Xt(t,u,c,/[;,:—–-]/u);d<=s&&(d=Xt(t,u,c,/\s/u)),d<=s&&(d=c),Fe(t,o,s,d),s=d}return Fe(t,o,s,n),o}function Xt(t,e,n,r){for(let o=n;o>=e;o-=1)if(r.test(t[o]))return o+1;return-1}function Fe(t,e,n,r){let o=n,s=r;for(;o<s&&/\s/u.test(t[o]);)o+=1;for(;s>o&&/\s/u.test(t[s-1]);)s-=1;o<s&&e.push({text:t.slice(o,s),startOffset:o,endOffset:s})}function tt(t){return t.kind==="walkthrough"||t.kind==="stacked-diff"||t.kind==="deconstructed-diff"}var Me=class{constructor(e,n){this.engine=e;this.callbacks=n;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(e,n=!0){if(this.resetEngine(),this.continuous=n,e.segments.length===0){this.finishUnit(e);return}this.callbacks.claimAudio(),this.setState({kind:"playing",unit:e,segmentIndex:0}),this.speakCurrent()}togglePause(){if(this.currentState.kind==="playing"){this.engine.pause();let n={kind:"paused",unit:this.currentState.unit,segmentIndex:this.currentState.segmentIndex,pendingStart:!1};this.setState(n),this.callbacks.onSegmentChange(n.unit.segments[n.segmentIndex]||null,!0);return}if(this.currentState.kind!=="paused")return;this.callbacks.claimAudio();let e=this.currentState;this.setState({kind:"playing",unit:e.unit,segmentIndex:e.segmentIndex}),e.pendingStart?this.speakCurrent():(this.engine.resume(),this.callbacks.onSegmentChange(e.unit.segments[e.segmentIndex]||null,!1))}stop(){this.resetEngine(),this.setState({kind:"idle"}),this.callbacks.onSegmentChange(null,!1)}pauseForExternalOwner(){this.currentState.kind==="playing"&&this.togglePause()}canSkipSegment(e){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return!1;let n=this.currentState.segmentIndex+e;return n>=0&&n<this.currentState.unit.segments.length?!0:this.callbacks.canNavigateUnit(this.currentState.unit,e)}skipSegment(e){if(!this.canSkipSegment(e))return!1;let n=this.currentState,r=n.kind==="paused",o=n.unit,s=n.segmentIndex+e;if(s<0||s>=o.segments.length){let c=this.callbacks.navigateUnit(o,e);if(!c||c.segments.length===0)return!1;o=c,s=e<0?o.segments.length-1:0}return this.resetEngine(),r?(this.setState({kind:"paused",unit:o,segmentIndex:s,pendingStart:!0}),this.callbacks.onSegmentChange(o.segments[s]||null,!0)):(this.setState({kind:"playing",unit:o,segmentIndex:s}),this.speakCurrent()),!0}followLinearNavigation(e){this.currentState.kind==="playing"?this.start(e,this.continuous):this.currentState.kind==="paused"&&this.preparePaused(e)}followDirectNavigation(e){this.engaged&&this.preparePaused(e)}interruptForExploration(){if(this.currentState.kind!=="playing"&&this.currentState.kind!=="paused")return;let e=this.currentState;this.resetEngine(),this.setState({kind:"paused",unit:e.unit,segmentIndex:e.segmentIndex,pendingStart:!0}),this.callbacks.onSegmentChange(e.unit.segments[e.segmentIndex]||null,!0)}dispose(){this.stop()}preparePaused(e){this.resetEngine(),this.setState({kind:"paused",unit:e,segmentIndex:0,pendingStart:!0}),this.callbacks.onSegmentChange(e.segments[0]||null,!0)}speakCurrent(){if(this.currentState.kind!=="playing")return;let e=this.generation,n=this.currentState.unit.segments[this.currentState.segmentIndex];if(!n){this.finishUnit(this.currentState.unit);return}this.callbacks.onSegmentChange(n,!1),this.engine.speak(n,{onEnd:()=>{if(e!==this.generation||this.currentState.kind!=="playing")return;let r=this.currentState.segmentIndex+1;r<this.currentState.unit.segments.length?(this.setState({kind:"playing",unit:this.currentState.unit,segmentIndex:r}),this.speakCurrent()):this.finishUnit(this.currentState.unit)},onError:r=>{e===this.generation&&(this.setState({kind:"error",message:r}),this.callbacks.onSegmentChange(null,!1))}})}finishUnit(e){if(this.continuous){let n=this.callbacks.navigateUnit(e,1);if(n){if(this.generation+=1,n.segments.length===0){this.finishUnit(n);return}this.setState({kind:"playing",unit:n,segmentIndex:0}),this.speakCurrent();return}}this.setState({kind:"completed"}),this.callbacks.onSegmentChange(null,!1)}resetEngine(){this.generation+=1,this.engine.cancel()}setState(e){this.currentState=e,this.callbacks.onStateChange(e)}};function Zt(t,e,n="all",r=300){let o=e.trim().toLocaleLowerCase();if(!o||r<=0)return[];let s=[];if(n!=="code"){let c=new Map;t.chapters.forEach(u=>u.sceneIds.forEach(d=>c.set(d,u.title))),t.scenes.forEach((u,d)=>{let m=[c.get(u.id),u.title,u.summary,...u.bullets,...u.tags,u.takeaway],p=Jt(m,o);p&&s.push({kind:"narrative",sceneIndex:d,label:u.title,preview:p}),dr(u)&&u.steps.forEach((a,x)=>{let E=Jt([a.title,a.body,"connection"in a?a.connection?.label:void 0],o);E&&s.push({kind:"narrative",sceneIndex:d,stepIndex:x,label:`${u.title} \xB7 ${a.title}`,preview:E})})})}if(n!=="narrative"&&s.length<r)for(let c=0;c<t.files.length;c+=1){let u=t.files[c];if(u.kind==="text-diff"){for(let[d,m]of[[0,u.leftContent],[1,u.rightContent]])for(let p of ur(m,o))if(s.push({kind:"code",fileIndex:c,sideIndex:d,label:`${u.path} \xB7 ${d===0?"base":"head"}`,...p}),s.length>=r)return s}}return s.slice(0,r)}function Jt(t,e){return t.find(n=>n?.toLocaleLowerCase().includes(e))}function ur(t,e){let n=[];return t.replace(/\r\n/g,`
|
|
149
149
|
`).split(`
|
|
150
|
-
`).forEach((r,o)=>{let s=r.toLocaleLowerCase(),l=0;for(;l<=s.length-e.length;){let u=s.indexOf(e,l);if(u<0)break;n.push({lineNumber:o+1,startColumn:u+1,endColumn:u+e.length+1,preview:r}),l=u+Math.max(e.length,1)}}),n}function cr(t){return t.kind==="walkthrough"||t.kind==="stacked-diff"||t.kind==="deconstructed-diff"}function Xt(t,e){let n=t?.blocks[0],r=e==="left"?t?.leftLines:t?.rightLines;if(!n||!r?.length)return;let o=e==="left"?n.leftStart:n.rightStart,s=e==="left"?n.leftEnd:n.rightEnd,l=r.slice(o,s),u=l[0]?.lineNumber??r[Math.min(o,r.length-1)]?.lineNumber;if(Number.isInteger(u))return{startLine:u,endLine:l.at(-1)?.lineNumber??u}}function Yt(t,e,n,r){let o=[];return t.scenes.forEach((s,l)=>{s.kind==="walkthrough"&&s.steps.forEach((u,d)=>{u.diff.path===e&&o.push({side:u.focus.revision==="base"?"left":"right",startLine:u.focus.startLine,endLine:u.focus.endLine,label:`${s.title} \xB7 ${u.title}: ${u.body}`,active:l===n&&d===r,jumpTarget:{sceneIndex:l,stepIndex:d}})})}),o}function Jt(t,e,n,r,o){let s=[];return t.scenes.forEach((l,u)=>{l.kind==="stacked-diff"&&l.steps.forEach((d,m)=>{if(d.file!==e)return;let p=d.startLine===void 0?o?.(d.pairIndex,d.side):{startLine:d.startLine,endLine:d.endLine??d.startLine};if(!p)return;let a=d.pairIndex+(d.side==="right"?1:0);s.push({pairIndex:d.pairIndex,panelIndex:a,side:d.side,startLine:p.startLine,endLine:p.endLine,label:`${l.title} \xB7 ${d.title}: ${d.body}`,active:u===n&&m===r,jumpTarget:{sceneIndex:u,stepIndex:m}})})}),s}function lr(t,e=120){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function Zt(t,e="Bygone"){let n=t?.windowTitle?.trim()||t?.title?.trim();return n?lr(n):`${e} Tour`}(function(){let e="bygone.tourSidebarWidth",o="bygone.tourNarrativeHeight",u="bygone.tourNarrationVoice",d="bygone.tourNarrationRate",m=new Set([.75,1,1.25,1.5]),p="speechSynthesis"in window&&"SpeechSynthesisUtterance"in window,a={mode:"empty",left:null,right:null,comparisonId:0,tour:null,activeSceneIndex:-1,activeStepIndex:0,activeTourFilePath:null,tourFocusFilePath:null,tourSidebarWidth:nn(),tourSidebarHidden:!1,tourNarrativeHeight:on(),narrationVoiceURI:window.localStorage.getItem(u)||"",narrationRate:w(),narrationVoices:[],renderedNarrationUnit:null},I=new Fe(C(),{claimAudio:pe,onStateChange:ie,onSegmentChange:Qt,canNavigateUnit:W,navigateUnit:z});window.__BYGONE_HOST__={environment:"web",editorWorkerUrl:"/media/editor.worker.js",diffWorkerUrl:"/media/diff.worker.js",postMessage(i){k(i)}},window.addEventListener("DOMContentLoaded",()=>{E(),X("Browser host ready.")});function v(i){window.dispatchEvent(new window.CustomEvent("bygone:host-message",{detail:i}))}async function k(i){if(!(!i||typeof i!="object")){if(i.type==="ready"){let c=new URLSearchParams(window.location.search),g=c.get("manifest");g?sn(g):c.get("demo")==="1"&>();return}if(i.type==="navigateFile"&&a.mode==="tour"){ln(i.direction==="previous"?-1:1);return}if(i.type==="navigateTourStep"&&a.mode==="tour"){let c=i.sceneIndex,g=i.stepIndex;Number.isInteger(c)&&Number.isInteger(g)&&oe(c,g);return}i.type==="recomputeDiff"&&a.mode==="diff"&&a.left&&a.right&&(a.left.content=i.leftContent,a.right.content=i.rightContent,v({type:"showDiff",file1:a.left.name,file2:a.right.name,comparisonId:`web-${a.comparisonId}`,leftContent:a.left.content,rightContent:a.right.content,diffModel:ne(a.left.content,a.right.content),history:null}))}}function E(){let i=document.getElementById("web-compare-test"),c=document.getElementById("web-open-diff"),g=document.getElementById("web-open-diff3"),h=document.getElementById("web-diff-input"),f=document.getElementById("web-diff3-input"),x=document.getElementById("tour-previous"),y=document.getElementById("tour-next"),T=document.getElementById("tour-return-focus"),N=document.getElementById("tour-search-input"),H=document.getElementById("tour-search-scope"),B=document.getElementById("tour-listen"),V=document.getElementById("tour-stop"),j=document.getElementById("tour-narration-skip-back"),P=document.getElementById("tour-narration-skip-ahead"),_=document.getElementById("tour-narration-voice"),K=document.getElementById("tour-narration-rate");tn(),rn(),S(),i?.addEventListener("click",()=>{gt()}),c?.addEventListener("click",()=>{h.value="",h.click()}),g?.addEventListener("click",()=>{f.value="",f.click()}),h?.addEventListener("change",async()=>{let b=Array.from(h.files||[]);if(b.length!==2){X("Select exactly 2 files for a diff.");return}await bn(b)}),f?.addEventListener("change",async()=>{let b=Array.from(f.files||[]);if(b.length<1){X("Select one or more files.");return}await yn(b)}),x?.addEventListener("click",()=>Ie(-1)),y?.addEventListener("click",()=>Ie(1)),T?.addEventListener("click",un),N?.addEventListener("input",Me),H?.addEventListener("change",Me),B?.addEventListener("click",M),V?.addEventListener("click",()=>I.stop()),j?.addEventListener("click",()=>I.skipSegment(-1)),P?.addEventListener("click",()=>I.skipSegment(1)),_?.addEventListener("change",()=>{a.narrationVoiceURI=_.value,window.localStorage.setItem(u,a.narrationVoiceURI)}),K&&(K.value=String(a.narrationRate),K.addEventListener("change",()=>{let b=Number(K.value);a.narrationRate=m.has(b)?b:1,K.value=String(a.narrationRate),window.localStorage.setItem(d,String(a.narrationRate))})),document.getElementById("tour-search-results")?.addEventListener("click",b=>{let G=b.target instanceof Element?b.target.closest("[data-tour-search-result]"):null;G&&en(Number(G.getAttribute("data-tour-search-result")))}),window.addEventListener("keydown",b=>{if(a.mode==="tour"&&(b.metaKey||b.ctrlKey)&&b.shiftKey&&b.key.toLocaleLowerCase()==="f"){b.preventDefault(),b.stopImmediatePropagation(),a.tourSidebarHidden&&De(!1),N?.focus(),N?.select();return}a.mode!=="tour"||b.metaKey||b.ctrlKey||b.altKey||mn(b.target)||(b.key==="PageUp"||b.key==="ArrowLeft"?(b.preventDefault(),Ie(-1)):(b.key==="PageDown"||b.key==="ArrowRight")&&(b.preventDefault(),Ie(1)))},!0),window.addEventListener("bygone:tour-command",b=>{b.detail==="toggleNarration"&&M(),b.detail==="pauseNarration"&&I.pauseForExternalOwner()}),window.addEventListener("beforeunload",()=>I.dispose(),{once:!0}),ie(I.state)}function S(){let i=document.getElementById("tour-narration-voice"),c=document.getElementById("tour-listen");if(!p){c&&(c.disabled=!0,c.title="Device narration is not supported by this browser."),i&&(i.disabled=!0),ce("Device narration unavailable");return}let g=()=>{if(a.narrationVoices=window.speechSynthesis.getVoices().slice().sort((h,f)=>Number(f.default)-Number(h.default)||h.lang.localeCompare(f.lang)||h.name.localeCompare(f.name)),a.narrationVoiceURI&&a.narrationVoices.length>0&&!a.narrationVoices.some(h=>h.voiceURI===a.narrationVoiceURI)&&(a.narrationVoiceURI="",window.localStorage.removeItem(u)),i){let h=document.createElement("option");h.value="",h.textContent="System default voice",i.replaceChildren(h,...a.narrationVoices.map(f=>{let x=document.createElement("option");return x.value=f.voiceURI,x.textContent=`${f.name} (${f.lang})${f.default?" \u2014 default":""}`,x})),i.value=a.narrationVoiceURI,i.disabled=a.narrationVoices.length===0}};g(),window.speechSynthesis.addEventListener("voiceschanged",g)}function w(){let i=Number(window.localStorage.getItem(d));return m.has(i)?i:1}function C(){let i=null;return{speak(c,g){if(!p){g.onError("Device narration is not supported by this browser.");return}let h=new window.SpeechSynthesisUtterance(c.speechText),f=a.narrationVoices.find(x=>x.voiceURI===a.narrationVoiceURI);f&&(h.voice=f),h.rate=a.narrationRate,h.onend=()=>{i===h&&(i=null),g.onEnd()},h.onerror=x=>{i===h&&(i=null),g.onError($(x.error))},i=h,window.speechSynthesis.speak(h)},pause(){p&&window.speechSynthesis.pause()},resume(){p&&window.speechSynthesis.resume()},cancel(){i=null,p&&window.speechSynthesis.cancel()}}}function $(i){return i==="not-allowed"?"Device narration needs permission to play audio.":i==="language-unavailable"||i==="voice-unavailable"?"The selected device voice is unavailable.":`Device narration failed${i?`: ${i}`:"."}`}function R(){if(!p||a.mode!=="tour")return;let i=D("playback-start");i&&(a.renderedNarrationUnit=i,pn(i),I.start(i,!0))}function M(){I.state.kind==="playing"||I.state.kind==="paused"?I.togglePause():R()}function D(i){return!a.tour||a.activeSceneIndex<0?null:jt(a.tour,{sceneIndex:a.activeSceneIndex,stepIndex:a.activeStepIndex},{entry:i})}function W(i,c){let g=a.tour;return!!(g&&Re(g.scenes,i.position,c))}function z(i,c){let g=a.tour;if(!g)return null;let h=Re(g.scenes,i.position,c);return h?oe(h.sceneIndex,h.stepIndex,{narrationNavigation:"controller",narrationEntry:"continuous"}):null}function pe(){fetch("/narration/claim",{method:"POST",cache:"no-store"}).catch(()=>{})}function ie(i){let c=document.getElementById("tour-listen"),g=document.getElementById("tour-stop"),h=document.getElementById("tour-narration-skip-back"),f=document.getElementById("tour-narration-skip-ahead");if(c){c.disabled=!p||a.mode!=="tour";let x=i.kind==="playing";c.querySelector(".tour-play-pause-icon")?.setAttribute("d",x?"M7 5h4v14H7zM13 5h4v14h-4z":"m8 5 11 7-11 7Z");let y=x?"Pause narration":i.kind==="paused"?"Resume narration":"Listen from the current tour item";c.title=y,c.setAttribute("aria-label",y)}if(g&&(g.disabled=i.kind!=="playing"&&i.kind!=="paused"),h&&(h.disabled=!I.canSkipSegment(-1)),f&&(f.disabled=!I.canSkipSegment(1)),i.kind==="playing"||i.kind==="paused"){let x=i.segmentIndex+1,y=i.unit.segments.length;ce(`${i.kind==="paused"?"Paused":"Speaking"} \xB7 segment ${x} of ${y}`)}else i.kind==="completed"?ce("Narration complete"):i.kind==="error"?ce(i.message):p&&ce("Device voice ready")}function ce(i){let c=document.getElementById("tour-narration-status");c&&(c.textContent=i)}function Qt(i,c){if(document.querySelectorAll(".tour-narration-segment.is-speaking").forEach(y=>{y.classList.remove("is-speaking","is-paused")}),!i)return;let g=[...document.querySelectorAll("[data-narration-segment-id]")].find(y=>y.dataset.narrationSegmentId===i.id);if(!g)return;g.classList.add("is-speaking"),g.classList.toggle("is-paused",c);let h=document.getElementById("tour-narrative");if(!h)return;let f=g.getBoundingClientRect(),x=h.getBoundingClientRect();(f.top<x.top||f.bottom>x.bottom)&&g.scrollIntoView({block:"nearest"})}let le=[];function Me(){let i=document.getElementById("tour-search-input"),c=document.getElementById("tour-search-scope"),g=document.getElementById("tour-search-status"),h=document.getElementById("tour-search-results");if(!(!a.tour||!i||!c||!g||!h)){if(le=Kt(a.tour,i.value,c.value),!i.value.trim()){g.textContent="Cmd/Ctrl+Shift+F",h.replaceChildren();return}g.textContent=`${le.length} result${le.length===1?"":"s"}`,h.replaceChildren(...le.map((f,x)=>{let y=document.createElement("button");y.type="button",y.className="tour-search-result",y.setAttribute("role","option"),y.dataset.tourSearchResult=String(x),y.title=`Open ${f.kind==="code"?`${f.label}:${f.lineNumber}`:f.label}`;let T=document.createElement("span");T.className="tour-search-location",T.textContent=f.kind==="code"?`${f.label}:${f.lineNumber}`:f.label;let N=document.createElement("span");return N.className="tour-search-preview",N.textContent=f.preview.trim(),y.append(T,N),y}))}}function en(i){let c=le[i];if(c){if(c.kind==="narrative"){oe(c.sceneIndex,c.stepIndex??0);return}ct(c.fileIndex)&&window.requestAnimationFrame(()=>v({type:"revealSearchResult",sideIndex:c.sideIndex,lineNumber:c.lineNumber,startColumn:c.startColumn,endColumn:c.endColumn}))}}function tn(){let i=document.getElementById("tour-shell"),c=document.getElementById("tour-sidebar-resizer"),g=document.getElementById("tour-sidebar-hide"),h=document.getElementById("tour-sidebar-show");!i||!c||!g||!h||(tt(),g.addEventListener("click",()=>De(!0)),h.addEventListener("click",()=>De(!1)),c.addEventListener("pointerdown",f=>{f.preventDefault(),document.body.classList.add("is-resizing-tour-sidebar"),c.setPointerCapture?.(f.pointerId);let x=T=>et(T.clientX),y=()=>{document.body.classList.remove("is-resizing-tour-sidebar"),window.removeEventListener("pointermove",x),window.removeEventListener("pointerup",y),window.removeEventListener("pointercancel",y),window.localStorage.setItem(e,String(a.tourSidebarWidth))};window.addEventListener("pointermove",x),window.addEventListener("pointerup",y),window.addEventListener("pointercancel",y)}),c.addEventListener("keydown",f=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(f.key))return;f.preventDefault();let x=a.tourSidebarWidth;f.key==="Home"?x=240:f.key==="End"?x=Pe():x+=f.key==="ArrowLeft"?-16:16,et(x),window.localStorage.setItem(e,String(a.tourSidebarWidth))}))}function nn(){let i=Number.parseInt(window.localStorage.getItem(e)||"",10);return Number.isFinite(i)?Math.min(600,Math.max(240,i)):360}function Pe(){return Math.max(240,Math.min(600,Math.floor(window.innerWidth*.6)))}function et(i){a.tourSidebarWidth=Math.min(Pe(),Math.max(240,Math.round(i))),tt(),window.dispatchEvent(new Event("resize"))}function tt(){document.documentElement.style.setProperty("--tour-rail-width",`${a.tourSidebarWidth}px`);let i=document.getElementById("tour-sidebar-resizer");i?.setAttribute("aria-valuemax",String(Pe())),i?.setAttribute("aria-valuenow",String(a.tourSidebarWidth))}function De(i){a.tourSidebarHidden=i,document.body.classList.toggle("tour-sidebar-hidden",i);let c=document.getElementById("tour-sidebar-show");c&&(c.hidden=!i),window.dispatchEvent(new Event("resize"))}function rn(){let i=document.getElementById("tour-narrative-resizer");i&&(_e(),i.addEventListener("pointerdown",c=>{c.preventDefault(),document.body.classList.add("is-resizing-tour-narrative"),i.setPointerCapture?.(c.pointerId),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-start"));let g=document.getElementById("tour-narrative")?.getBoundingClientRect().top||0,h=x=>nt(x.clientY-g),f=()=>{document.body.classList.remove("is-resizing-tour-narrative"),window.removeEventListener("pointermove",h),window.removeEventListener("pointerup",f),window.removeEventListener("pointercancel",f),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-end")),rt()};window.addEventListener("pointermove",h),window.addEventListener("pointerup",f),window.addEventListener("pointercancel",f)}),i.addEventListener("keydown",c=>{if(!["ArrowUp","ArrowDown","Home","End"].includes(c.key))return;c.preventDefault();let g=c.key==="Home"?180:c.key==="End"?be():a.tourNarrativeHeight+(c.key==="ArrowUp"?-16:16);nt(g),rt()}),window.addEventListener("resize",()=>{a.tourNarrativeHeight=Math.min(be(),a.tourNarrativeHeight),_e()}))}function on(){let i=Number.parseInt(window.localStorage.getItem(o)||"",10);if(Number.isFinite(i))return Math.max(180,i);let c=Number.parseInt(window.getComputedStyle(document.documentElement).getPropertyValue("--tour-narrative-height"),10);return Number.isFinite(c)?c:296}function be(){let i=document.getElementById("tour-narrative")?.getBoundingClientRect().top||0;return Math.max(180,window.innerHeight-i-180)}function nt(i){a.tourNarrativeHeight=Math.min(be(),Math.max(180,Math.round(i))),_e(),window.dispatchEvent(new Event("resize"))}function _e(){document.documentElement.style.setProperty("--tour-narrative-height",`${a.tourNarrativeHeight}px`);let i=document.getElementById("tour-narrative-resizer");i?.setAttribute("aria-valuemax",String(be())),i?.setAttribute("aria-valuenow",String(a.tourNarrativeHeight))}function rt(){window.localStorage.setItem(o,String(a.tourNarrativeHeight))}async function sn(i){X("Loading change tour\u2026");try{I.stop();let c=await fetch(i,{cache:"no-store"});if(!c.ok)throw new Error(`Manifest request failed (${c.status}).`);a.tour=Ot(await c.json()),a.mode="tour",document.body.classList.add("tour-mode"),an(),Me();let g=new URLSearchParams(window.location.search),h=Wt(a.tour.scenes,g.get("scene"),g.get("step"));oe(h.sceneIndex,h.stepIndex),ie(I.state),X("")}catch(c){X(`Could not load change tour: ${c instanceof Error?c.message:String(c)}`)}}function an(){let i=a.tour;if(!i)return;let c=document.getElementById("tour-shell"),g=document.getElementById("tour-title"),h=document.getElementById("tour-source"),f=document.getElementById("tour-range"),x=document.getElementById("tour-stats"),y=document.getElementById("tour-scenes"),T=document.getElementById("tour-scene-count"),N=document.getElementById("tour-files"),H=document.getElementById("tour-file-count"),B=document.getElementById("tour-commits"),V=document.getElementById("tour-commits-summary");if(!c||!g||!h||!f||!x||!y||!T||!N||!H||!B||!V)throw new Error("Presenter UI is incomplete.");c.hidden=!1,g.textContent=i.title,document.title=Zt(i),i.sourceUrl?(h.href=i.sourceUrl,h.hidden=!1):h.hidden=!0;let j=Se(i.range.baseRef),P=Se(i.range.headRef),_=i.range.headOid.slice(0,7);f.textContent=`${j} \u2192 ${P}${P===_?"":` \xB7 ${_}`}`,x.textContent=`${fe(i.summary.changedFiles,"file")} \xB7 +${i.summary.additions} \u2212${i.summary.deletions} \xB7 ${fe(i.summary.commitCount,"commit")}`,T.textContent=String(i.scenes.length),H.textContent=String(i.files.length),V.textContent=fe(i.summary.commitCount,"commit"),y.replaceChildren();let K=new Map(i.scenes.map(b=>[b.id,b]));for(let b of i.chapters){let G=document.createElement("h2");G.className="tour-chapter-title",G.textContent=b.title,y.append(G);for(let A of b.sceneIds){let F=K.get(A);if(!F)continue;let q=i.scenes.indexOf(F),U=document.createElement("button");U.type="button",U.className="tour-scene",U.dataset.sceneId=F.id,F.kind==="text-diff"&&(U.dataset.filePath=F.path),U.title=`Open scene: ${F.kind==="text-diff"?F.path:F.title}`,U.addEventListener("click",()=>oe(q));let te=document.createElement("span");te.className="tour-scene-number",te.textContent=String(q+1).padStart(2,"0");let Ue=document.createElement("span");Ue.className="tour-scene-copy";for(let[wn,In]of[["tour-scene-title",F.title],["tour-scene-path",F.kind==="text-diff"?F.path:F.kind==="deconstructed-diff"?fe(F.steps.length,"explanation stage"):de(F)?fe(F.steps.length,"code step"):"Discussion"],["tour-scene-note",F.takeaway]]){let We=document.createElement("span");We.className=wn,We.textContent=In,Ue.append(We)}U.append(te,Ue),y.append(U)}}N.replaceChildren(...i.files.map((b,G)=>{let A=document.createElement("button");A.type="button",A.className=`tour-file${b.kind==="omitted"?" is-omitted":""}`,A.dataset.filePath=b.path,A.disabled=b.kind==="omitted",A.title=b.kind==="omitted"?`${b.path}: ${b.reason}`:`Open file: ${b.path}`,b.kind==="text-diff"&&A.addEventListener("click",()=>lt(G));let F=document.createElement("span");F.className="tour-file-marker",F.textContent=b.kind==="omitted"?"\xD7":fn(b.changeKind);let q=document.createElement("span");q.className="tour-file-copy";let U=document.createElement("span");U.className="tour-file-path",U.textContent=b.path;let te=document.createElement("span");return te.className="tour-file-meta",te.textContent=b.kind==="omitted"?`Not rendered \xB7 ${b.reason}`:`${gn(b.changeKind)} \xB7 +${b.additions} \u2212${b.deletions}`,q.append(U,te),A.append(F,q),A})),B.replaceChildren(...i.commits.map(b=>{let G=document.createElement("li"),A=document.createElement("span");return A.className="tour-commit-oid",A.textContent=b.shortOid,G.append(A,document.createTextNode(b.summary)),G}))}function oe(i,c=0,g={}){let h=a.tour;if(!h||i<0||i>=h.scenes.length)return null;let f=h.scenes[i];a.activeSceneIndex=i,a.activeStepIndex=de(f)?Math.min(Math.max(c,0),Math.max(f.steps.length-1,0)):0,a.tourFocusFilePath=f.kind==="text-diff"?f.path:f.kind==="walkthrough"?f.steps[a.activeStepIndex]?.diff.path??null:xe(f)?f.steps[a.activeStepIndex]?.file??null:null;let x=ut(h,i);document.querySelectorAll(".tour-scene").forEach(N=>{N.classList.toggle("is-active",N.dataset.sceneId===f.id)}),document.querySelector(`.tour-scene[data-scene-id="${f.id}"]`)?.scrollIntoView({block:"nearest"});let y=D(g.narrationEntry||"playback-start");a.renderedNarrationUnit=y,ft(f,x,y),y&&(g.narrationNavigation==="linear"?I.followLinearNavigation(y):g.narrationNavigation!=="controller"&&I.followDirectNavigation(y));let T=new URLSearchParams(window.location.search);return T.set("scene",f.id),de(f)?T.set("step",f.steps[a.activeStepIndex].id):T.delete("step"),window.history.replaceState(null,"",`${window.location.pathname}?${T.toString()}`),f.kind==="discussion"?(document.body.classList.add("tour-discussion"),Be(),y):(document.body.classList.remove("tour-discussion"),f.kind==="walkthrough"?(ot(f),y):xe(f)?(st(f),y):(we(f,ye(f.path)),y))}function ye(i){let c=a.tour;return!c||!i?[]:Yt(c,i,a.activeSceneIndex,a.activeStepIndex)}function cn(i,c){let g=a.tour;return!g||!i?[]:Jt(g,i,a.activeSceneIndex,a.activeStepIndex,(h,f)=>Xt(c?.[h]?.diffModel,f))}function Oe(i){return`file::${i}`}function we(i,c=[],g=Oe(i.path)){if(!a.tour)return;a.activeTourFilePath=i.path,Be();let f=ne(i.leftContent,i.rightContent),x=it(i,i.leftLabel,"base"),y=it(i,i.rightLabel,"head"),T=c.find(N=>N.active);v({type:"showDiff",file1:x,file2:y,comparisonId:`tour-${g}`,leftContent:i.leftContent,rightContent:i.rightContent,sourceInfo:{leftPath:i.path,rightPath:i.path},diffModel:f,history:null,fileNavigation:{canGoPrevious:!!ue(-1),canGoNext:!!ue(1)},editableSides:{left:!1,right:!1},comparisonSummary:`${i.path} \xB7 ${i.takeaway}`,initialChangeIndex:T?dt(f,T.side,T.startLine):i.focusChangeIndex,tourAnnotations:c})}function it(i,c,g){let h=c.startsWith(i.path)?c.slice(i.path.length).trim():c.trim();return h?`${g} ${h}`:g}function ot(i){let c=i.steps[a.activeStepIndex];c&&we(c.diff,ye(c.diff.path),Oe(c.diff.path))}function st(i){let c=i.steps[a.activeStepIndex];c&&at(i,c.file,c)}function at(i,c,g){let h=i.files.find(P=>P.path===c);if(!g||!h)return;a.activeTourFilePath=h.path,Be();let f=h.panels.map((P,_)=>({id:`${i.id}-${h.path}-${P.id}`,label:P.label,path:P.path||h.path,content:P.content,savedContent:P.content,dirty:!1,editable:!1,stackId:dn(i)[_].id})),x=f.slice(0,-1).map((P,_)=>({leftIndex:_,rightIndex:_+1,diffModel:ne(P.content,f[_+1].content)})),y=i.kind==="stacked-diff"?cn(h.path,x):[],T=y.find(P=>P.active),N=T?.pairIndex??g.pairIndex,H=T?.side??g.side,B=T?.startLine??g.startLine,V=x[N]?.diffModel,j=V&&B?dt(V,H,B):0;v({type:"showMultiDiff",panels:f,pairs:x,activePanelId:f[N+(H==="right"?1:0)]?.id,activePairIndex:N,initialChangeIndex:j,revealFirstChangeInEachPanel:i.kind==="deconstructed-diff",history:null,fileNavigation:{canGoPrevious:!!ue(-1),canGoNext:!!ue(1)},mutationEnabled:!1,comparisonSummary:i.kind==="deconstructed-diff"?`${i.stageLabel} \xB7 ${h.path} \xB7 ${Se(i.realRange.baseRef)} \u2192 ${Se(i.realRange.targetRef)}`:`${h.path} \xB7 ${i.takeaway}`,tourAnnotations:y})}function He(i){let c=a.tour;return!c||i!==-1&&i!==1?null:Re(c.scenes,{sceneIndex:a.activeSceneIndex,stepIndex:a.activeStepIndex},i)}function Ie(i){let c=He(i);return c?(oe(c.sceneIndex,c.stepIndex,{narrationNavigation:"linear",narrationEntry:"playback-start"}),!0):!1}function ue(i){let c=a.tour;return!c||i!==-1&&i!==1?null:Gt(c.files,a.activeTourFilePath,i)}function ln(i){let c=ue(i);return c?lt(c.fileIndex):!1}function ct(i,c=!0){let g=a.tour?.files[i];return!g||g.kind!=="text-diff"?!1:(c&&I.interruptForExploration(),we(g,ye(g.path),Oe(g.path)),!0)}function lt(i){let c=a.tour?.files[i];if(!c||c.kind!=="text-diff")return!1;if(I.interruptForExploration(),c?.kind==="text-diff"&&a.tour){let g=zt(a.tour.scenes,{sceneIndex:a.activeSceneIndex,stepIndex:a.activeStepIndex},c.path);if(g){let h=a.tour.scenes[g.sceneIndex],f=xe(h)?h.steps[g.stepIndex]:null;if(f)return at(h,c.path,f),!0}}return ct(i,!1)}function un(){let i=a.tour?.scenes[a.activeSceneIndex];if(!i||!a.tourFocusFilePath)return!1;if(i.kind==="walkthrough")ot(i);else if(xe(i))st(i);else if(i.kind==="text-diff")we(i,ye(i.path));else return!1;return!0}function Be(){document.querySelectorAll(".tour-file").forEach(c=>{c.classList.toggle("is-active",c.dataset.filePath===a.activeTourFilePath),c.classList.toggle("is-tour-focus",c.dataset.filePath===a.tourFocusFilePath)}),document.querySelector(".tour-file.is-active")?.scrollIntoView({block:"nearest"});let i=document.getElementById("tour-return-focus");i&&(i.hidden=!a.tourFocusFilePath||a.activeTourFilePath===a.tourFocusFilePath)}function de(i){return i.kind==="walkthrough"||i.kind==="stacked-diff"||i.kind==="deconstructed-diff"}function xe(i){return i.kind==="stacked-diff"||i.kind==="deconstructed-diff"}function dn(i){return i.kind==="deconstructed-diff"?i.panels:i.stack}function fn(i){return{added:"+",deleted:"\u2212",renamed:"\u2192",modified:"\u2022"}[i]||"\u2022"}function gn(i){return`${i.charAt(0).toUpperCase()}${i.slice(1)}`}function ut(i,c){let g=i.scenes[c],h=i.chapters.findIndex(T=>T.sceneIds.includes(g.id)),f=h>=0?i.chapters[h]:null,x=f?f.sceneIds.indexOf(g.id)+1:c+1,y=f?f.sceneIds.length:i.scenes.length;return{chapter:f,chapterIndex:h,chapterNumber:h>=0?h+1:c+1,sceneInChapter:x,scenesInChapter:y}}function hn(i,c,g){let h=[`Ch ${i.chapterNumber}`,`Scene ${i.sceneInChapter}/${i.scenesInChapter}`];return de(c)&&h.push(`Step ${g+1}/${c.steps.length}`),h.join(" \xB7 ")}function dt(i,c,g){let f=(c==="left"?i.leftLines:i.rightLines).findIndex(B=>B.lineNumber===g);if(f<0)return 0;let x=c==="left"?"leftStart":"rightStart",y=c==="left"?"leftEnd":"rightEnd",T=i.blocks.findIndex(B=>f>=B[x]&&f<B[y]);if(T>=0)return T;let N=0,H=Number.POSITIVE_INFINITY;return i.blocks.forEach((B,V)=>{let j=Math.min(Math.abs(f-B[x]),Math.abs(f-B[y]));j<H&&(N=V,H=j)}),N}function Se(i){return/^[0-9a-f]{40}$/i.test(i)?i.slice(0,7):i}function fe(i,c){return`${i} ${i===1?c:`${c}s`}`}function mn(i){return i instanceof Element&&!!i.closest('a, button, input, select, summary, textarea, [contenteditable="true"], [role="textbox"], .monaco-editor')}function pn(i){let c=a.tour?.scenes[a.activeSceneIndex];!a.tour||!c||ft(c,ut(a.tour,a.activeSceneIndex),i)}function ft(i,c,g){let h=document.getElementById("tour-narrative"),f=document.getElementById("tour-breadcrumb"),x=document.getElementById("tour-narrative-chapter"),y=document.getElementById("tour-narrative-title"),T=document.getElementById("tour-narrative-summary"),N=document.getElementById("tour-narrative-bullets"),H=document.getElementById("tour-narrative-tags"),B=document.getElementById("tour-narrative-takeaway"),V=document.getElementById("tour-step"),j=document.getElementById("tour-step-title"),P=document.getElementById("tour-step-body"),_=document.getElementById("tour-connection"),K=document.getElementById("tour-previous"),b=document.getElementById("tour-next");if(!h||!f||!x||!y||!T||!N||!H||!B||!V||!j||!P||!_||!K||!b)throw new Error("Tour narrative UI is incomplete.");h.hidden=!1,f.textContent=hn(c,i,a.activeStepIndex);let G=c.chapter?.title||"Change tour";J(x,G,{field:"chapter"},g,{suffix:i.kind==="deconstructed-diff"?` \xB7 ${i.stageLabel}`:""}),J(y,i.title,{field:"scene-title"},g),J(T,i.summary,{field:"summary"},g),N.replaceChildren(...i.bullets.map((F,q)=>{let U=document.createElement("li");return J(U,F,{field:"bullet",itemIndex:q},g),U})),H.replaceChildren(...i.tags.map(F=>{let q=document.createElement("span");return q.textContent=F,q})),J(B,i.takeaway,{field:"takeaway"},g);let A=de(i)?i.steps[a.activeStepIndex]:null;V.hidden=!A,A?(J(j,A.title,{field:"step-title"},g,{prefix:i.kind==="deconstructed-diff"?`Stage ${a.activeStepIndex+1}: `:""}),J(P,A.body,{field:"step-body"},g),"connection"in A&&A.connection?(_.hidden=!1,J(_,A.connection.label,{field:"connection"},g,{prefix:`${A.connection.from.path} \u2192 ${A.connection.to.path} \xB7 `})):(_.hidden=!0,_.textContent="")):(j.textContent="",P.textContent="",_.hidden=!0,_.textContent=""),K.disabled=!He(-1),b.disabled=!He(1)}function J(i,c,g,h,f={}){let x=h?.segments.filter(N=>N.source.field===g.field&&N.source.itemIndex===g.itemIndex)||[];if(x.length===0){i.textContent=`${f.prefix||""}${c}${f.suffix||""}`;return}let y=[];f.prefix&&y.push(document.createTextNode(f.prefix));let T=0;for(let N of x){N.startOffset>T&&y.push(document.createTextNode(c.slice(T,N.startOffset)));let H=document.createElement("span");H.className="tour-narration-segment",H.dataset.narrationSegmentId=N.id,H.textContent=c.slice(N.startOffset,N.endOffset),y.push(H),T=N.endOffset}T<c.length&&y.push(document.createTextNode(c.slice(T))),f.suffix&&y.push(document.createTextNode(f.suffix)),i.replaceChildren(...y)}function gt(){I.stop();let i=_t();a.mode="diff",a.comparisonId+=1,a.left={name:i.leftFileName,content:i.leftContent},a.right={name:i.rightFileName,content:i.rightContent},X("Loaded sample diff."),v({type:"showDiff",file1:a.left.name,file2:a.right.name,comparisonId:`web-${a.comparisonId}`,leftContent:a.left.content,rightContent:a.right.content,diffModel:ne(a.left.content,a.right.content),history:null})}async function bn(i){I.stop();let[c,g]=i,[h,f]=await Promise.all([c.text(),g.text()]);a.mode="diff",a.comparisonId+=1,a.left={name:c.name,content:h},a.right={name:g.name,content:f},X(`Loaded ${c.name} and ${g.name}.`),v({type:"showDiff",file1:c.name,file2:g.name,comparisonId:`web-${a.comparisonId}`,leftContent:h,rightContent:f,diffModel:ne(h,f),history:null})}async function yn(i){I.stop();let c=await Promise.all(i.map(async(g,h)=>{let f=await g.text();return{id:`web-panel-${h}`,label:g.name,content:f,savedContent:f,dirty:!1,editable:!0}}));a.mode="multi-diff",X(`Loaded ${c.length}-panel diff for ${c.map(g=>g.label).join(", ")}.`),v({type:"showMultiDiff",panels:c,pairs:c.slice(0,-1).map((g,h)=>({leftIndex:h,rightIndex:h+1,diffModel:ne(g.content,c[h+1].content)}))})}function X(i){let c=document.getElementById("web-status");c&&(c.textContent=i)}})();})();
|
|
150
|
+
`).forEach((r,o)=>{let s=r.toLocaleLowerCase(),c=0;for(;c<=s.length-e.length;){let u=s.indexOf(e,c);if(u<0)break;n.push({lineNumber:o+1,startColumn:u+1,endColumn:u+e.length+1,preview:r}),c=u+Math.max(e.length,1)}}),n}function dr(t){return t.kind==="walkthrough"||t.kind==="stacked-diff"||t.kind==="deconstructed-diff"}function Qt(t,e){return fr(t,0,e)}function fr(t,e,n){let r=t?.blocks[e],o=n==="left"?t?.leftLines:t?.rightLines;if(!r||!o?.length)return;let s=n==="left"?r.leftStart:r.rightStart,c=n==="left"?r.leftEnd:r.rightEnd,u=o.slice(s,c),d=u[0]?.lineNumber??o[Math.min(s,o.length-1)]?.lineNumber;if(Number.isInteger(d))return{startLine:d,endLine:u.at(-1)?.lineNumber??d}}function en(t,e,n,r){let o=[];return t.scenes.forEach((s,c)=>{s.kind==="walkthrough"&&s.steps.forEach((u,d)=>{u.diff.path===e&&o.push({side:u.focus.revision==="base"?"left":"right",startLine:u.focus.startLine,endLine:u.focus.endLine,label:`${s.title} \xB7 ${u.title}: ${u.body}`,active:c===n&&d===r,jumpTarget:{sceneIndex:c,stepIndex:d}})})}),o}function tn(t,e,n,r,o){let s=[];return t.scenes.forEach((c,u)=>{c.kind!=="stacked-diff"&&c.kind!=="deconstructed-diff"||c.steps.forEach((d,m)=>{if(d.file!==e)return;let p=d.startLine===void 0?o?.(d.pairIndex,d.side):{startLine:d.startLine,endLine:d.endLine??d.startLine};if(!p)return;let a=d.pairIndex+(d.side==="right"?1:0);s.push({pairIndex:d.pairIndex,panelIndex:a,side:d.side,startLine:p.startLine,endLine:p.endLine,label:`${c.title} \xB7 ${d.title}: ${d.body}`,active:u===n&&m===r,jumpTarget:{sceneIndex:u,stepIndex:m}})})}),s}function gr(t,e=120){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function nn(t,e="Bygone"){let n=t?.windowTitle?.trim()||t?.title?.trim();return n?gr(n):`${e} Tour`}(function(){let e="bygone.tourSidebarWidth",o="bygone.tourNarrativeHeight",u="bygone.tourNarrationVoice",d="bygone.tourNarrationRate",m=new Set([.75,1,1.25,1.5]),p="speechSynthesis"in window&&"SpeechSynthesisUtterance"in window,a={mode:"empty",left:null,right:null,comparisonId:0,tour:null,activeSceneIndex:-1,activeStepIndex:0,activeTourFilePath:null,tourFocusFilePath:null,tourSidebarWidth:an(),tourSidebarHidden:!1,tourNarrativeHeight:cn(),narrationVoiceURI:window.localStorage.getItem(u)||"",narrationRate:w(),narrationVoices:[],renderedNarrationUnit:null},x=new Me(L(),{claimAudio:ye,onStateChange:ie,onSegmentChange:rn,canNavigateUnit:W,navigateUnit:z});window.__BYGONE_HOST__={environment:"web",editorWorkerUrl:"/media/editor.worker.js",diffWorkerUrl:"/media/diff.worker.js",postMessage(i){C(i)}},window.addEventListener("DOMContentLoaded",()=>{k(),X("Browser host ready.")});function E(i){window.dispatchEvent(new window.CustomEvent("bygone:host-message",{detail:i}))}async function C(i){if(!(!i||typeof i!="object")){if(i.type==="ready"){let l=new URLSearchParams(window.location.search),h=l.get("manifest");h?un(h):l.get("demo")==="1"&&yt();return}if(i.type==="navigateFile"&&a.mode==="tour"){gn(i.direction==="previous"?-1:1);return}if(i.type==="navigateTourStep"&&a.mode==="tour"){let l=i.sceneIndex,h=i.stepIndex;Number.isInteger(l)&&Number.isInteger(h)&&oe(l,h);return}i.type==="recomputeDiff"&&a.mode==="diff"&&a.left&&a.right&&(a.left.content=i.leftContent,a.right.content=i.rightContent,E({type:"showDiff",file1:a.left.name,file2:a.right.name,comparisonId:`web-${a.comparisonId}`,leftContent:a.left.content,rightContent:a.right.content,diffModel:re(a.left.content,a.right.content),history:null}))}}function k(){let i=document.getElementById("web-compare-test"),l=document.getElementById("web-open-diff"),h=document.getElementById("web-open-diff3"),f=document.getElementById("web-diff-input"),g=document.getElementById("web-diff3-input"),b=document.getElementById("tour-previous"),y=document.getElementById("tour-next"),S=document.getElementById("tour-return-focus"),T=document.getElementById("tour-search-input"),O=document.getElementById("tour-search-scope"),F=document.getElementById("tour-listen"),V=document.getElementById("tour-stop"),q=document.getElementById("tour-narration-skip-back"),B=document.getElementById("tour-narration-skip-ahead"),U=document.getElementById("tour-narration-voice"),j=document.getElementById("tour-narration-rate");sn(),ln(),v(),i?.addEventListener("click",()=>{yt()}),l?.addEventListener("click",()=>{f.value="",f.click()}),h?.addEventListener("click",()=>{g.value="",g.click()}),f?.addEventListener("change",async()=>{let I=Array.from(f.files||[]);if(I.length!==2){X("Select exactly 2 files for a diff.");return}await In(I)}),g?.addEventListener("change",async()=>{let I=Array.from(g.files||[]);if(I.length<1){X("Select one or more files.");return}await wn(I)}),b?.addEventListener("click",()=>Se(-1)),y?.addEventListener("click",()=>Se(1)),S?.addEventListener("click",hn),T?.addEventListener("input",_e),O?.addEventListener("change",_e),F?.addEventListener("click",P),V?.addEventListener("click",()=>x.stop()),q?.addEventListener("click",()=>x.skipSegment(-1)),B?.addEventListener("click",()=>x.skipSegment(1)),U?.addEventListener("change",()=>{a.narrationVoiceURI=U.value,window.localStorage.setItem(u,a.narrationVoiceURI)}),j&&(j.value=String(a.narrationRate),j.addEventListener("change",()=>{let I=Number(j.value);a.narrationRate=m.has(I)?I:1,j.value=String(a.narrationRate),window.localStorage.setItem(d,String(a.narrationRate))})),document.getElementById("tour-search-results")?.addEventListener("click",I=>{let G=I.target instanceof Element?I.target.closest("[data-tour-search-result]"):null;G&&on(Number(G.getAttribute("data-tour-search-result")))}),window.addEventListener("keydown",I=>{if(a.mode==="tour"&&(I.metaKey||I.ctrlKey)&&I.shiftKey&&I.key.toLocaleLowerCase()==="f"){I.preventDefault(),I.stopImmediatePropagation(),a.tourSidebarHidden&&Pe(!1),T?.focus(),T?.select();return}a.mode!=="tour"||I.metaKey||I.ctrlKey||I.altKey||bn(I.target)||(I.key==="PageUp"||I.key==="ArrowLeft"?(I.preventDefault(),Se(-1)):(I.key==="PageDown"||I.key==="ArrowRight")&&(I.preventDefault(),Se(1)))},!0),window.addEventListener("bygone:tour-command",I=>{I.detail==="toggleNarration"&&P(),I.detail==="pauseNarration"&&x.pauseForExternalOwner()}),window.addEventListener("beforeunload",()=>x.dispose(),{once:!0}),ie(x.state)}function v(){let i=document.getElementById("tour-narration-voice"),l=document.getElementById("tour-listen");if(!p){l&&(l.disabled=!0,l.title="Device narration is not supported by this browser."),i&&(i.disabled=!0),ue("Device narration unavailable");return}let h=()=>{if(a.narrationVoices=window.speechSynthesis.getVoices().slice().sort((f,g)=>Number(g.default)-Number(f.default)||f.lang.localeCompare(g.lang)||f.name.localeCompare(g.name)),a.narrationVoiceURI&&a.narrationVoices.length>0&&!a.narrationVoices.some(f=>f.voiceURI===a.narrationVoiceURI)&&(a.narrationVoiceURI="",window.localStorage.removeItem(u)),i){let f=document.createElement("option");f.value="",f.textContent="System default voice",i.replaceChildren(f,...a.narrationVoices.map(g=>{let b=document.createElement("option");return b.value=g.voiceURI,b.textContent=`${g.name} (${g.lang})${g.default?" \u2014 default":""}`,b})),i.value=a.narrationVoiceURI,i.disabled=a.narrationVoices.length===0}};h(),window.speechSynthesis.addEventListener("voiceschanged",h)}function w(){let i=Number(window.localStorage.getItem(d));return m.has(i)?i:1}function L(){let i=null;return{speak(l,h){if(!p){h.onError("Device narration is not supported by this browser.");return}let f=new window.SpeechSynthesisUtterance(l.speechText),g=a.narrationVoices.find(b=>b.voiceURI===a.narrationVoiceURI);g&&(f.voice=g),f.rate=a.narrationRate,f.onend=()=>{i===f&&(i=null),h.onEnd()},f.onerror=b=>{i===f&&(i=null),h.onError($(b.error))},i=f,window.speechSynthesis.speak(f)},pause(){p&&window.speechSynthesis.pause()},resume(){p&&window.speechSynthesis.resume()},cancel(){i=null,p&&window.speechSynthesis.cancel()}}}function $(i){return i==="not-allowed"?"Device narration needs permission to play audio.":i==="language-unavailable"||i==="voice-unavailable"?"The selected device voice is unavailable.":`Device narration failed${i?`: ${i}`:"."}`}function A(){if(!p||a.mode!=="tour")return;let i=D("playback-start");i&&(a.renderedNarrationUnit=i,yn(i),x.start(i,!0))}function P(){x.state.kind==="playing"||x.state.kind==="paused"?x.togglePause():A()}function D(i){return!a.tour||a.activeSceneIndex<0?null:Yt(a.tour,{sceneIndex:a.activeSceneIndex,stepIndex:a.activeStepIndex},{entry:i})}function W(i,l){let h=a.tour;return!!(h&&Re(h.scenes,i.position,l))}function z(i,l){let h=a.tour;if(!h)return null;let f=Re(h.scenes,i.position,l);return f?oe(f.sceneIndex,f.stepIndex,{narrationNavigation:"controller",narrationEntry:"continuous"}):null}function ye(){fetch("/narration/claim",{method:"POST",cache:"no-store"}).catch(()=>{})}function ie(i){let l=document.getElementById("tour-listen"),h=document.getElementById("tour-stop"),f=document.getElementById("tour-narration-skip-back"),g=document.getElementById("tour-narration-skip-ahead");if(l){l.disabled=!p||a.mode!=="tour";let b=i.kind==="playing";l.querySelector(".tour-play-pause-icon")?.setAttribute("d",b?"M7 5h4v14H7zM13 5h4v14h-4z":"m8 5 11 7-11 7Z");let y=b?"Pause narration":i.kind==="paused"?"Resume narration":"Listen from the current tour item";l.title=y,l.setAttribute("aria-label",y)}if(h&&(h.disabled=i.kind!=="playing"&&i.kind!=="paused"),f&&(f.disabled=!x.canSkipSegment(-1)),g&&(g.disabled=!x.canSkipSegment(1)),i.kind==="playing"||i.kind==="paused"){let b=i.segmentIndex+1,y=i.unit.segments.length;ue(`${i.kind==="paused"?"Paused":"Speaking"} \xB7 segment ${b} of ${y}`)}else i.kind==="completed"?ue("Narration complete"):i.kind==="error"?ue(i.message):p&&ue("Device voice ready")}function ue(i){let l=document.getElementById("tour-narration-status");l&&(l.textContent=i)}function rn(i,l){if(document.querySelectorAll(".tour-narration-segment.is-speaking").forEach(y=>{y.classList.remove("is-speaking","is-paused")}),!i)return;let h=[...document.querySelectorAll("[data-narration-segment-id]")].find(y=>y.dataset.narrationSegmentId===i.id);if(!h)return;h.classList.add("is-speaking"),h.classList.toggle("is-paused",l);let f=document.getElementById("tour-narrative");if(!f)return;let g=h.getBoundingClientRect(),b=f.getBoundingClientRect();(g.top<b.top||g.bottom>b.bottom)&&h.scrollIntoView({block:"nearest"})}let de=[];function _e(){let i=document.getElementById("tour-search-input"),l=document.getElementById("tour-search-scope"),h=document.getElementById("tour-search-status"),f=document.getElementById("tour-search-results");if(!(!a.tour||!i||!l||!h||!f)){if(de=Zt(a.tour,i.value,l.value),!i.value.trim()){h.textContent="Cmd/Ctrl+Shift+F",f.replaceChildren();return}h.textContent=`${de.length} result${de.length===1?"":"s"}`,f.replaceChildren(...de.map((g,b)=>{let y=document.createElement("button");y.type="button",y.className="tour-search-result",y.setAttribute("role","option"),y.dataset.tourSearchResult=String(b),y.title=`Open ${g.kind==="code"?`${g.label}:${g.lineNumber}`:g.label}`;let S=document.createElement("span");S.className="tour-search-location",S.textContent=g.kind==="code"?`${g.label}:${g.lineNumber}`:g.label;let T=document.createElement("span");return T.className="tour-search-preview",T.textContent=g.preview.trim(),y.append(S,T),y}))}}function on(i){let l=de[i];if(l){if(l.kind==="narrative"){oe(l.sceneIndex,l.stepIndex??0);return}ut(l.fileIndex)&&window.requestAnimationFrame(()=>E({type:"revealSearchResult",sideIndex:l.sideIndex,lineNumber:l.lineNumber,startColumn:l.startColumn,endColumn:l.endColumn}))}}function sn(){let i=document.getElementById("tour-shell"),l=document.getElementById("tour-sidebar-resizer"),h=document.getElementById("tour-sidebar-hide"),f=document.getElementById("tour-sidebar-show");!i||!l||!h||!f||(rt(),h.addEventListener("click",()=>Pe(!0)),f.addEventListener("click",()=>Pe(!1)),l.addEventListener("pointerdown",g=>{g.preventDefault(),document.body.classList.add("is-resizing-tour-sidebar"),l.setPointerCapture?.(g.pointerId);let b=S=>nt(S.clientX),y=()=>{document.body.classList.remove("is-resizing-tour-sidebar"),window.removeEventListener("pointermove",b),window.removeEventListener("pointerup",y),window.removeEventListener("pointercancel",y),window.localStorage.setItem(e,String(a.tourSidebarWidth))};window.addEventListener("pointermove",b),window.addEventListener("pointerup",y),window.addEventListener("pointercancel",y)}),l.addEventListener("keydown",g=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(g.key))return;g.preventDefault();let b=a.tourSidebarWidth;g.key==="Home"?b=240:g.key==="End"?b=Oe():b+=g.key==="ArrowLeft"?-16:16,nt(b),window.localStorage.setItem(e,String(a.tourSidebarWidth))}))}function an(){let i=Number.parseInt(window.localStorage.getItem(e)||"",10);return Number.isFinite(i)?Math.min(600,Math.max(240,i)):360}function Oe(){return Math.max(240,Math.min(600,Math.floor(window.innerWidth*.6)))}function nt(i){a.tourSidebarWidth=Math.min(Oe(),Math.max(240,Math.round(i))),rt(),window.dispatchEvent(new Event("resize"))}function rt(){document.documentElement.style.setProperty("--tour-rail-width",`${a.tourSidebarWidth}px`);let i=document.getElementById("tour-sidebar-resizer");i?.setAttribute("aria-valuemax",String(Oe())),i?.setAttribute("aria-valuenow",String(a.tourSidebarWidth))}function Pe(i){a.tourSidebarHidden=i,document.body.classList.toggle("tour-sidebar-hidden",i);let l=document.getElementById("tour-sidebar-show");l&&(l.hidden=!i),window.dispatchEvent(new Event("resize"))}function ln(){let i=document.getElementById("tour-narrative-resizer");i&&(De(),i.addEventListener("pointerdown",l=>{l.preventDefault(),document.body.classList.add("is-resizing-tour-narrative"),i.setPointerCapture?.(l.pointerId),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-start"));let h=document.getElementById("tour-narrative")?.getBoundingClientRect().top||0,f=b=>it(b.clientY-h),g=()=>{document.body.classList.remove("is-resizing-tour-narrative"),window.removeEventListener("pointermove",f),window.removeEventListener("pointerup",g),window.removeEventListener("pointercancel",g),window.dispatchEvent(new CustomEvent("bygone:workspace-resize-end")),ot()};window.addEventListener("pointermove",f),window.addEventListener("pointerup",g),window.addEventListener("pointercancel",g)}),i.addEventListener("keydown",l=>{if(!["ArrowUp","ArrowDown","Home","End"].includes(l.key))return;l.preventDefault();let h=l.key==="Home"?180:l.key==="End"?Ie():a.tourNarrativeHeight+(l.key==="ArrowUp"?-16:16);it(h),ot()}),window.addEventListener("resize",()=>{a.tourNarrativeHeight=Math.min(Ie(),a.tourNarrativeHeight),De()}))}function cn(){let i=Number.parseInt(window.localStorage.getItem(o)||"",10);if(Number.isFinite(i))return Math.max(180,i);let l=Number.parseInt(window.getComputedStyle(document.documentElement).getPropertyValue("--tour-narrative-height"),10);return Number.isFinite(l)?l:296}function Ie(){let i=document.getElementById("tour-narrative")?.getBoundingClientRect().top||0;return Math.max(180,window.innerHeight-i-180)}function it(i){a.tourNarrativeHeight=Math.min(Ie(),Math.max(180,Math.round(i))),De(),window.dispatchEvent(new Event("resize"))}function De(){document.documentElement.style.setProperty("--tour-narrative-height",`${a.tourNarrativeHeight}px`);let i=document.getElementById("tour-narrative-resizer");i?.setAttribute("aria-valuemax",String(Ie())),i?.setAttribute("aria-valuenow",String(a.tourNarrativeHeight))}function ot(){window.localStorage.setItem(o,String(a.tourNarrativeHeight))}async function un(i){X("Loading change tour\u2026");try{x.stop();let l=await fetch(i,{cache:"no-store"});if(!l.ok)throw new Error(`Manifest request failed (${l.status}).`);a.tour=Gt(await l.json()),a.mode="tour",document.body.classList.add("tour-mode"),dn(),_e();let h=new URLSearchParams(window.location.search),f=Kt(a.tour.scenes,h.get("scene"),h.get("step"));oe(f.sceneIndex,f.stepIndex),ie(x.state),X("")}catch(l){X(`Could not load change tour: ${l instanceof Error?l.message:String(l)}`)}}function dn(){let i=a.tour;if(!i)return;let l=document.getElementById("tour-shell"),h=document.getElementById("tour-title"),f=document.getElementById("tour-source"),g=document.getElementById("tour-range"),b=document.getElementById("tour-stats"),y=document.getElementById("tour-scenes"),S=document.getElementById("tour-scene-count"),T=document.getElementById("tour-files"),O=document.getElementById("tour-file-count"),F=document.getElementById("tour-commits"),V=document.getElementById("tour-commits-summary");if(!l||!h||!f||!g||!b||!y||!S||!T||!O||!F||!V)throw new Error("Presenter UI is incomplete.");l.hidden=!1,h.textContent=i.title,document.title=nn(i),i.sourceUrl?(f.href=i.sourceUrl,f.hidden=!1):f.hidden=!0;let q=Te(i.range.baseRef),B=Te(i.range.headRef),U=i.range.headOid.slice(0,7);g.textContent=`${q} \u2192 ${B}${B===U?"":` \xB7 ${U}`}`,b.textContent=`${ae(i.summary.changedFiles,"file")} \xB7 +${i.summary.additions} \u2212${i.summary.deletions} \xB7 ${ae(i.summary.commitCount,"commit")}`,S.textContent=String(i.scenes.length),O.textContent=String(i.files.length),V.textContent=ae(i.summary.commitCount,"commit"),y.replaceChildren();let j=new Map(i.scenes.map(I=>[I.id,I]));for(let I of i.chapters){let G=document.createElement("h2");G.className="tour-chapter-title",G.textContent=I.title,y.append(G);for(let M of I.sceneIds){let R=j.get(M);if(!R)continue;let K=i.scenes.indexOf(R),H=document.createElement("button");H.type="button",H.className="tour-scene",H.dataset.sceneId=R.id,R.kind==="text-diff"&&(H.dataset.filePath=R.path),H.title=`Open scene: ${R.kind==="text-diff"?R.path:R.title}`,H.addEventListener("click",()=>oe(K));let ne=document.createElement("span");ne.className="tour-scene-number",ne.textContent=String(K+1).padStart(2,"0");let We=document.createElement("span");We.className="tour-scene-copy";for(let[xn,Sn]of[["tour-scene-title",R.title],["tour-scene-path",R.kind==="text-diff"?R.path:R.kind==="deconstructed-diff"?`${ae(R.panels.length-1,"comparison stage")} \xB7 ${ae(R.steps.length,"tour slide")}`:ge(R)?ae(R.steps.length,"code step"):"Discussion"],["tour-scene-note",R.takeaway]]){let Ge=document.createElement("span");Ge.className=xn,Ge.textContent=Sn,We.append(Ge)}H.append(ne,We),y.append(H)}}T.replaceChildren(...i.files.map((I,G)=>{let M=document.createElement("button");M.type="button",M.className=`tour-file${I.kind==="omitted"?" is-omitted":""}`,M.dataset.filePath=I.path,M.disabled=I.kind==="omitted",M.title=I.kind==="omitted"?`${I.path}: ${I.reason}`:`Open file: ${I.path}`,I.kind==="text-diff"&&M.addEventListener("click",()=>dt(G));let R=document.createElement("span");R.className="tour-file-marker",R.textContent=I.kind==="omitted"?"\xD7":gt(I.changeKind);let K=document.createElement("span");K.className="tour-file-copy";let H=document.createElement("span");H.className="tour-file-path",H.textContent=I.path;let ne=document.createElement("span");return ne.className="tour-file-meta",ne.textContent=I.kind==="omitted"?`Not rendered \xB7 ${I.reason}`:`${ht(I.changeKind)} \xB7 +${I.additions} \u2212${I.deletions}`,K.append(H,ne),M.append(R,K),M})),F.replaceChildren(...i.commits.map(I=>{let G=document.createElement("li"),M=document.createElement("span");return M.className="tour-commit-oid",M.textContent=I.shortOid,G.append(M,document.createTextNode(I.summary)),G}))}function oe(i,l=0,h={}){let f=a.tour;if(!f||i<0||i>=f.scenes.length)return null;let g=f.scenes[i];a.activeSceneIndex=i,a.activeStepIndex=ge(g)?Math.min(Math.max(l,0),Math.max(g.steps.length-1,0)):0,a.tourFocusFilePath=g.kind==="text-diff"?g.path:g.kind==="walkthrough"?g.steps[a.activeStepIndex]?.diff.path??null:se(g)?g.steps[a.activeStepIndex]?.file??null:null;let b=mt(f,i);document.querySelectorAll(".tour-scene").forEach(T=>{T.classList.toggle("is-active",T.dataset.sceneId===g.id)}),document.querySelector(`.tour-scene[data-scene-id="${g.id}"]`)?.scrollIntoView({block:"nearest"});let y=D(h.narrationEntry||"playback-start");a.renderedNarrationUnit=y,bt(g,b,y),y&&(h.narrationNavigation==="linear"?x.followLinearNavigation(y):h.narrationNavigation!=="controller"&&x.followDirectNavigation(y));let S=new URLSearchParams(window.location.search);return S.set("scene",g.id),ge(g)?S.set("step",g.steps[a.activeStepIndex].id):S.delete("step"),window.history.replaceState(null,"",`${window.location.pathname}?${S.toString()}`),g.kind==="discussion"?(document.body.classList.add("tour-discussion"),He(),y):(document.body.classList.remove("tour-discussion"),g.kind==="walkthrough"?(at(g),y):se(g)?(lt(g),y):(xe(g,we(g.path)),y))}function we(i){let l=a.tour;return!l||!i?[]:en(l,i,a.activeSceneIndex,a.activeStepIndex)}function fn(i,l){let h=a.tour;return!h||!i?[]:tn(h,i,a.activeSceneIndex,a.activeStepIndex,(f,g)=>Qt(l?.[f]?.diffModel,g))}function Ue(i){return`file::${i}`}function xe(i,l=[],h=Ue(i.path)){if(!a.tour)return;a.activeTourFilePath=i.path,He();let g=re(i.leftContent,i.rightContent),b=st(i,i.leftLabel,"base"),y=st(i,i.rightLabel,"head"),S=l.find(T=>T.active);E({type:"showDiff",file1:b,file2:y,comparisonId:`tour-${h}`,leftContent:i.leftContent,rightContent:i.rightContent,sourceInfo:{leftPath:i.path,rightPath:i.path},diffModel:g,history:null,fileNavigation:{canGoPrevious:!!fe(-1),canGoNext:!!fe(1)},editableSides:{left:!1,right:!1},comparisonSummary:`${i.path} \xB7 ${i.takeaway}`,initialChangeIndex:S?pt(g,S.side,S.startLine):i.focusChangeIndex,tourAnnotations:l})}function st(i,l,h){let f=l.startsWith(i.path)?l.slice(i.path.length).trim():l.trim();return f?`${h} ${f}`:h}function at(i){let l=i.steps[a.activeStepIndex];l&&xe(l.diff,we(l.diff.path),Ue(l.diff.path))}function lt(i){let l=i.steps[a.activeStepIndex];l&&ct(i,l.file,l)}function ct(i,l,h){let f=ve(i,l);if(!h||!f)return;a.activeTourFilePath=f.path,He();let g=f.panels.map((B,U)=>({id:`${i.id}-${f.path}-${B.id}`,label:B.label,path:B.path||f.path,content:B.content,savedContent:B.content,dirty:!1,editable:!1,stackId:ft(i)[U].id})),b=g.slice(0,-1).map((B,U)=>({leftIndex:U,rightIndex:U+1,diffModel:re(B.content,g[U+1].content)})),y=fn(f.path,b),S=y.find(B=>B.active),T=S?.pairIndex??h.pairIndex,O=S?.side??h.side,F=S?.startLine??h.startLine,V=b[T]?.diffModel,q=V&&F?pt(V,O,F):0;E({type:"showMultiDiff",panels:g,pairs:b,activePanelId:g[T+(O==="right"?1:0)]?.id,activePairIndex:T,initialChangeIndex:q,revealFirstChangeInEachPanel:i.kind==="deconstructed-diff",history:null,fileNavigation:{canGoPrevious:!!fe(-1),canGoNext:!!fe(1)},mutationEnabled:!1,comparisonSummary:i.kind==="deconstructed-diff"?`${i.stageLabel} \xB7 ${f.path} \xB7 ${Te(i.realRange.baseRef)} \u2192 ${Te(i.realRange.targetRef)}`:`${f.path} \xB7 ${i.takeaway}`,tourAnnotations:y})}function Be(i){let l=a.tour;return!l||i!==-1&&i!==1?null:Re(l.scenes,{sceneIndex:a.activeSceneIndex,stepIndex:a.activeStepIndex},i)}function Se(i){let l=Be(i);return l?(oe(l.sceneIndex,l.stepIndex,{narrationNavigation:"linear",narrationEntry:"playback-start"}),!0):!1}function fe(i){let l=a.tour;if(!l||i!==-1&&i!==1)return null;let h=l.scenes[a.activeSceneIndex];if(se(h)){let f=h.steps[a.activeStepIndex]?.pairIndex;if(!Number.isInteger(f))return null;let g=l.files.flatMap(S=>{if(S.kind!=="text-diff")return[];let T=ve(h,S.path);return T?[T]:[]}),b=qt(g,f,a.activeTourFilePath,i);if(!b)return null;let y=l.files.findIndex(S=>S.kind==="text-diff"&&S.path===b.path);return y>=0?{fileIndex:y,path:b.path}:null}return jt(l.files,a.activeTourFilePath,i)}function gn(i){let l=fe(i);return l?dt(l.fileIndex):!1}function ut(i,l=!0){let h=a.tour?.files[i];return!h||h.kind!=="text-diff"?!1:(l&&x.interruptForExploration(),xe(h,we(h.path),Ue(h.path)),!0)}function dt(i){let l=a.tour?.files[i];if(!l||l.kind!=="text-diff")return!1;x.interruptForExploration();let h=a.tour?.scenes[a.activeSceneIndex];if(se(h)){let f=h.steps[a.activeStepIndex];return f&&ve(h,l.path)?(ct(h,l.path,f),!0):!1}return ut(i,!1)}function ve(i,l){let h=i?.files?.find(b=>b.path===l);if(h||i?.kind!=="deconstructed-diff")return h;let f=a.tour?.files.find(b=>b.kind==="text-diff"&&b.path===l);if(!f||f.kind!=="text-diff")return null;let g=f.changeKind!=="deleted";return{path:f.path,panels:ft(i).map(b=>({id:b.id,label:`${b.label} / ${f.path}${g?"":" (absent)"}`,path:g?f.path:void 0,content:g?f.rightContent:"",exists:g}))}}function hn(){let i=a.tour?.scenes[a.activeSceneIndex];if(!i||!a.tourFocusFilePath)return!1;if(i.kind==="walkthrough")at(i);else if(se(i))lt(i);else if(i.kind==="text-diff")xe(i,we(i.path));else return!1;return!0}function He(){let i=a.tour?.scenes[a.activeSceneIndex],l=se(i)?i.steps[a.activeStepIndex]:null;document.querySelectorAll(".tour-file").forEach(f=>{let g=f.dataset.filePath;f.classList.toggle("is-active",g===a.activeTourFilePath),f.classList.toggle("is-tour-focus",g===a.tourFocusFilePath),f.classList.remove("is-comparison-changed","is-comparison-empty"),delete f.dataset.comparisonState;let b=a.tour?.files.find(T=>T.path===g),y=f.querySelector(".tour-file-marker"),S=f.querySelector(".tour-file-meta");if(l&&b?.kind==="text-diff"){let T=ve(i,g);if(T){let O=et(T,l.pairIndex),F=mn(O);f.dataset.comparisonState=O,f.classList.add(F.changed?"is-comparison-changed":"is-comparison-empty"),f.setAttribute("title",`${b.path} \xB7 ${F.label}`),f.setAttribute("aria-label",`${b.path}, ${F.label}`),y&&(y.textContent=F.marker),S&&(S.textContent=F.label);return}}if(b){let T=b.kind==="omitted"?`${b.path}: ${b.reason}`:`Open file: ${b.path}`;f.setAttribute("title",T),f.setAttribute("aria-label",T),y&&(y.textContent=b.kind==="omitted"?"\xD7":gt(b.changeKind)),S&&(S.textContent=b.kind==="omitted"?`Not rendered \xB7 ${b.reason}`:`${ht(b.changeKind)} \xB7 +${b.additions} \u2212${b.deletions}`)}}),document.querySelector(".tour-file.is-active")?.scrollIntoView({block:"nearest"});let h=document.getElementById("tour-return-focus");h&&(h.hidden=!a.tourFocusFilePath||a.activeTourFilePath===a.tourFocusFilePath)}function mn(i){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}}[i]}function ge(i){return i.kind==="walkthrough"||i.kind==="stacked-diff"||i.kind==="deconstructed-diff"}function se(i){return i?.kind==="stacked-diff"||i?.kind==="deconstructed-diff"}function ft(i){return i.kind==="deconstructed-diff"?i.panels:i.stack}function gt(i){return{added:"+",deleted:"\u2212",renamed:"\u2192",modified:"\u2022"}[i]||"\u2022"}function ht(i){return`${i.charAt(0).toUpperCase()}${i.slice(1)}`}function mt(i,l){let h=i.scenes[l],f=i.chapters.findIndex(S=>S.sceneIds.includes(h.id)),g=f>=0?i.chapters[f]:null,b=g?g.sceneIds.indexOf(h.id)+1:l+1,y=g?g.sceneIds.length:i.scenes.length;return{chapter:g,chapterIndex:f,chapterNumber:f>=0?f+1:l+1,sceneInChapter:b,scenesInChapter:y}}function pn(i,l,h){let f=[`Ch ${i.chapterNumber}`,`Scene ${i.sceneInChapter}/${i.scenesInChapter}`];return ge(l)&&f.push(`Step ${h+1}/${l.steps.length}`),f.join(" \xB7 ")}function pt(i,l,h){let g=(l==="left"?i.leftLines:i.rightLines).findIndex(F=>F.lineNumber===h);if(g<0)return 0;let b=l==="left"?"leftStart":"rightStart",y=l==="left"?"leftEnd":"rightEnd",S=i.blocks.findIndex(F=>g>=F[b]&&g<F[y]);if(S>=0)return S;let T=0,O=Number.POSITIVE_INFINITY;return i.blocks.forEach((F,V)=>{let q=Math.min(Math.abs(g-F[b]),Math.abs(g-F[y]));q<O&&(T=V,O=q)}),T}function Te(i){return/^[0-9a-f]{40}$/i.test(i)?i.slice(0,7):i}function ae(i,l){return`${i} ${i===1?l:`${l}s`}`}function bn(i){return i instanceof Element&&!!i.closest('a, button, input, select, summary, textarea, [contenteditable="true"], [role="textbox"], .monaco-editor')}function yn(i){let l=a.tour?.scenes[a.activeSceneIndex];!a.tour||!l||bt(l,mt(a.tour,a.activeSceneIndex),i)}function bt(i,l,h){let f=document.getElementById("tour-narrative"),g=document.getElementById("tour-breadcrumb"),b=document.getElementById("tour-narrative-chapter"),y=document.getElementById("tour-narrative-title"),S=document.getElementById("tour-narrative-summary"),T=document.getElementById("tour-narrative-bullets"),O=document.getElementById("tour-narrative-tags"),F=document.getElementById("tour-narrative-takeaway"),V=document.getElementById("tour-step"),q=document.getElementById("tour-step-title"),B=document.getElementById("tour-step-body"),U=document.getElementById("tour-connection"),j=document.getElementById("tour-previous"),I=document.getElementById("tour-next");if(!f||!g||!b||!y||!S||!T||!O||!F||!V||!q||!B||!U||!j||!I)throw new Error("Tour narrative UI is incomplete.");f.hidden=!1,g.textContent=pn(l,i,a.activeStepIndex);let G=l.chapter?.title||"Change tour";Z(b,G,{field:"chapter"},h,{suffix:i.kind==="deconstructed-diff"?` \xB7 ${i.stageLabel}`:""}),Z(y,i.title,{field:"scene-title"},h),Z(S,i.summary,{field:"summary"},h),T.replaceChildren(...i.bullets.map((R,K)=>{let H=document.createElement("li");return Z(H,R,{field:"bullet",itemIndex:K},h),H})),O.replaceChildren(...i.tags.map(R=>{let K=document.createElement("span");return K.textContent=R,K})),Z(F,i.takeaway,{field:"takeaway"},h);let M=ge(i)?i.steps[a.activeStepIndex]:null;V.hidden=!M,M?(Z(q,M.title,{field:"step-title"},h,{prefix:i.kind==="deconstructed-diff"?`Stage ${a.activeStepIndex+1}: `:""}),Z(B,M.body,{field:"step-body"},h),"connection"in M&&M.connection?(U.hidden=!1,Z(U,M.connection.label,{field:"connection"},h,{prefix:`${M.connection.from.path} \u2192 ${M.connection.to.path} \xB7 `})):(U.hidden=!0,U.textContent="")):(q.textContent="",B.textContent="",U.hidden=!0,U.textContent=""),j.disabled=!Be(-1),I.disabled=!Be(1)}function Z(i,l,h,f,g={}){let b=f?.segments.filter(T=>T.source.field===h.field&&T.source.itemIndex===h.itemIndex)||[];if(b.length===0){i.textContent=`${g.prefix||""}${l}${g.suffix||""}`;return}let y=[];g.prefix&&y.push(document.createTextNode(g.prefix));let S=0;for(let T of b){T.startOffset>S&&y.push(document.createTextNode(l.slice(S,T.startOffset)));let O=document.createElement("span");O.className="tour-narration-segment",O.dataset.narrationSegmentId=T.id,O.textContent=l.slice(T.startOffset,T.endOffset),y.push(O),S=T.endOffset}S<l.length&&y.push(document.createTextNode(l.slice(S))),g.suffix&&y.push(document.createTextNode(g.suffix)),i.replaceChildren(...y)}function yt(){x.stop();let i=Wt();a.mode="diff",a.comparisonId+=1,a.left={name:i.leftFileName,content:i.leftContent},a.right={name:i.rightFileName,content:i.rightContent},X("Loaded sample diff."),E({type:"showDiff",file1:a.left.name,file2:a.right.name,comparisonId:`web-${a.comparisonId}`,leftContent:a.left.content,rightContent:a.right.content,diffModel:re(a.left.content,a.right.content),history:null})}async function In(i){x.stop();let[l,h]=i,[f,g]=await Promise.all([l.text(),h.text()]);a.mode="diff",a.comparisonId+=1,a.left={name:l.name,content:f},a.right={name:h.name,content:g},X(`Loaded ${l.name} and ${h.name}.`),E({type:"showDiff",file1:l.name,file2:h.name,comparisonId:`web-${a.comparisonId}`,leftContent:f,rightContent:g,diffModel:re(f,g),history:null})}async function wn(i){x.stop();let l=await Promise.all(i.map(async(h,f)=>{let g=await h.text();return{id:`web-panel-${f}`,label:h.name,content:g,savedContent:g,dirty:!1,editable:!0}}));a.mode="multi-diff",X(`Loaded ${l.length}-panel diff for ${l.map(h=>h.label).join(", ")}.`),E({type:"showMultiDiff",panels:l,pairs:l.slice(0,-1).map((h,f)=>({leftIndex:f,rightIndex:f+1,diffModel:re(h.content,l[f+1].content)}))})}function X(i){let l=document.getElementById("web-status");l&&(l.textContent=i)}})();})();
|
|
151
151
|
//# sourceMappingURL=web-host.js.map
|