sessiongraph-app-darwin-x64 1.0.6 → 1.0.7

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.
@@ -1 +1 @@
1
- import{R as a,v as i,C as R}from"./index-BEabiGl5.js";var w;(function(n){n[n.Audio=1]="Audio",n[n.Cache=2]="Cache",n[n.Config=3]="Config",n[n.Data=4]="Data",n[n.LocalData=5]="LocalData",n[n.Document=6]="Document",n[n.Download=7]="Download",n[n.Picture=8]="Picture",n[n.Public=9]="Public",n[n.Video=10]="Video",n[n.Resource=11]="Resource",n[n.Temp=12]="Temp",n[n.AppConfig=13]="AppConfig",n[n.AppData=14]="AppData",n[n.AppLocalData=15]="AppLocalData",n[n.AppCache=16]="AppCache",n[n.AppLog=17]="AppLog",n[n.Desktop=18]="Desktop",n[n.Executable=19]="Executable",n[n.Font=20]="Font",n[n.Home=21]="Home",n[n.Runtime=22]="Runtime",n[n.Template=23]="Template"})(w||(w={}));var d;(function(n){n[n.Start=0]="Start",n[n.Current=1]="Current",n[n.End=2]="End"})(d||(d={}));function u(n){return{isFile:n.isFile,isDirectory:n.isDirectory,isSymlink:n.isSymlink,size:n.size,mtime:n.mtime!==null?new Date(n.mtime):null,atime:n.atime!==null?new Date(n.atime):null,birthtime:n.birthtime!==null?new Date(n.birthtime):null,readonly:n.readonly,fileAttributes:n.fileAttributes,dev:n.dev,ino:n.ino,mode:n.mode,nlink:n.nlink,uid:n.uid,gid:n.gid,rdev:n.rdev,blksize:n.blksize,blocks:n.blocks}}function U(n){const e=new Uint8ClampedArray(n),t=e.byteLength;let o=0;for(let r=0;r<t;r++){const s=e[r];o*=256,o+=s}return o}class g extends a{async read(e){if(e.byteLength===0)return 0;const t=await i("plugin:fs|read",{rid:this.rid,len:e.byteLength}),o=U(t.slice(-8)),r=t instanceof ArrayBuffer?new Uint8Array(t):t;return e.set(r.slice(0,r.length-8)),o===0?null:o}async seek(e,t){return await i("plugin:fs|seek",{rid:this.rid,offset:e,whence:t})}async stat(){const e=await i("plugin:fs|fstat",{rid:this.rid});return u(e)}async truncate(e){await i("plugin:fs|ftruncate",{rid:this.rid,len:e})}async write(e){return await i("plugin:fs|write",{rid:this.rid,data:e})}}async function b(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|create",{path:n instanceof URL?n.toString():n,options:e});return new g(t)}async function p(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|open",{path:n instanceof URL?n.toString():n,options:e});return new g(t)}async function S(n,e,t){if(n instanceof URL&&n.protocol!=="file:"||e instanceof URL&&e.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|copy_file",{fromPath:n instanceof URL?n.toString():n,toPath:e instanceof URL?e.toString():e,options:t})}async function A(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|mkdir",{path:n instanceof URL?n.toString():n,options:e})}async function T(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|read_dir",{path:n instanceof URL?n.toString():n,options:e})}async function E(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|read_file",{path:n instanceof URL?n.toString():n,options:e});return t instanceof ArrayBuffer?new Uint8Array(t):Uint8Array.from(t)}async function _(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|read_text_file",{path:n instanceof URL?n.toString():n,options:e}),o=t instanceof ArrayBuffer?t:Uint8Array.from(t);return new TextDecoder(e?.encoding??"utf-8").decode(o)}async function x(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=n instanceof URL?n.toString():n;return await Promise.resolve({path:t,rid:null,async next(){const o=new TextDecoder(e?.encoding??"utf-8");if(this.rid===null){const l=o.encoding;this.rid=await i("plugin:fs|read_text_file_lines",{path:t,options:e!=null?{...e,encoding:l}:void 0})}let r;try{r=await i("plugin:fs|read_text_file_lines_next",{rid:this.rid})}catch(l){throw this.rid=null,l}const s=r instanceof ArrayBuffer?new Uint8Array(r):Uint8Array.from(r),f=s[s.byteLength-1]===1;return f?(this.rid=null,{value:null,done:f}):{value:o.decode(s.slice(0,s.byteLength-1)),done:f}},async return(){if(this.rid!==null){const o=this.rid;this.rid=null,await new a(o).close()}return{value:null,done:!0}},[Symbol.asyncIterator](){return this}})}async function v(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|remove",{path:n instanceof URL?n.toString():n,options:e})}async function M(n,e,t){if(n instanceof URL&&n.protocol!=="file:"||e instanceof URL&&e.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|rename",{oldPath:n instanceof URL?n.toString():n,newPath:e instanceof URL?e.toString():e,options:t})}async function C(n,e){const t=await i("plugin:fs|stat",{path:n instanceof URL?n.toString():n,options:e});return u(t)}async function k(n,e){const t=await i("plugin:fs|lstat",{path:n instanceof URL?n.toString():n,options:e});return u(t)}async function F(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|truncate",{path:n instanceof URL?n.toString():n,len:e,options:t})}async function z(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");if(e instanceof ReadableStream){const o=await p(n,{read:!1,create:!0,write:!0,...t,truncate:!t?.append}),r=e.getReader();try{for(;;){const{done:s,value:f}=await r.read();if(s)break;await o.write(f)}}finally{r.releaseLock(),await o.close()}}else await i("plugin:fs|write_file",e,{headers:{path:encodeURIComponent(n instanceof URL?n.toString():n),options:JSON.stringify(t)}})}async function I(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const o=new TextEncoder;await i("plugin:fs|write_text_file",o.encode(e),{headers:{path:encodeURIComponent(n instanceof URL?n.toString():n),options:JSON.stringify(t)}})}async function H(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|exists",{path:n instanceof URL?n.toString():n,options:e})}class y extends a{}async function L(n,e,t){const o=Array.isArray(n)?n:[n];for(const c of o)if(c instanceof URL&&c.protocol!=="file:")throw new TypeError("Must be a file URL.");const r=new R;r.onmessage=e;const s=await i("plugin:fs|watch",{paths:o.map(c=>c instanceof URL?c.toString():c),options:t,onEvent:r}),f=new y(s);return()=>{f.close()}}async function J(n,e,t){return await L(n,e,{delayMs:2e3,...t})}async function N(n,e,t){return await L(n,e,{...t,delayMs:void 0})}async function O(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|size",{path:n instanceof URL?n.toString():n,options:e})}async function V(n){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|start_accessing_security_scoped_resource",{path:n instanceof URL?n.toString():n})}async function h(n){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|stop_accessing_security_scoped_resource",{path:n instanceof URL?n.toString():n})}export{w as BaseDirectory,g as FileHandle,d as SeekMode,S as copyFile,b as create,H as exists,k as lstat,A as mkdir,p as open,T as readDir,E as readFile,_ as readTextFile,x as readTextFileLines,v as remove,M as rename,O as size,V as startAccessingSecurityScopedResource,C as stat,h as stopAccessingSecurityScopedResource,F as truncate,J as watch,N as watchImmediate,z as writeFile,I as writeTextFile};
1
+ import{R as a,v as i,C as R}from"./index-iA3u_0lX.js";var w;(function(n){n[n.Audio=1]="Audio",n[n.Cache=2]="Cache",n[n.Config=3]="Config",n[n.Data=4]="Data",n[n.LocalData=5]="LocalData",n[n.Document=6]="Document",n[n.Download=7]="Download",n[n.Picture=8]="Picture",n[n.Public=9]="Public",n[n.Video=10]="Video",n[n.Resource=11]="Resource",n[n.Temp=12]="Temp",n[n.AppConfig=13]="AppConfig",n[n.AppData=14]="AppData",n[n.AppLocalData=15]="AppLocalData",n[n.AppCache=16]="AppCache",n[n.AppLog=17]="AppLog",n[n.Desktop=18]="Desktop",n[n.Executable=19]="Executable",n[n.Font=20]="Font",n[n.Home=21]="Home",n[n.Runtime=22]="Runtime",n[n.Template=23]="Template"})(w||(w={}));var d;(function(n){n[n.Start=0]="Start",n[n.Current=1]="Current",n[n.End=2]="End"})(d||(d={}));function u(n){return{isFile:n.isFile,isDirectory:n.isDirectory,isSymlink:n.isSymlink,size:n.size,mtime:n.mtime!==null?new Date(n.mtime):null,atime:n.atime!==null?new Date(n.atime):null,birthtime:n.birthtime!==null?new Date(n.birthtime):null,readonly:n.readonly,fileAttributes:n.fileAttributes,dev:n.dev,ino:n.ino,mode:n.mode,nlink:n.nlink,uid:n.uid,gid:n.gid,rdev:n.rdev,blksize:n.blksize,blocks:n.blocks}}function U(n){const e=new Uint8ClampedArray(n),t=e.byteLength;let o=0;for(let r=0;r<t;r++){const s=e[r];o*=256,o+=s}return o}class g extends a{async read(e){if(e.byteLength===0)return 0;const t=await i("plugin:fs|read",{rid:this.rid,len:e.byteLength}),o=U(t.slice(-8)),r=t instanceof ArrayBuffer?new Uint8Array(t):t;return e.set(r.slice(0,r.length-8)),o===0?null:o}async seek(e,t){return await i("plugin:fs|seek",{rid:this.rid,offset:e,whence:t})}async stat(){const e=await i("plugin:fs|fstat",{rid:this.rid});return u(e)}async truncate(e){await i("plugin:fs|ftruncate",{rid:this.rid,len:e})}async write(e){return await i("plugin:fs|write",{rid:this.rid,data:e})}}async function b(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|create",{path:n instanceof URL?n.toString():n,options:e});return new g(t)}async function p(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|open",{path:n instanceof URL?n.toString():n,options:e});return new g(t)}async function S(n,e,t){if(n instanceof URL&&n.protocol!=="file:"||e instanceof URL&&e.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|copy_file",{fromPath:n instanceof URL?n.toString():n,toPath:e instanceof URL?e.toString():e,options:t})}async function A(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|mkdir",{path:n instanceof URL?n.toString():n,options:e})}async function T(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|read_dir",{path:n instanceof URL?n.toString():n,options:e})}async function E(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|read_file",{path:n instanceof URL?n.toString():n,options:e});return t instanceof ArrayBuffer?new Uint8Array(t):Uint8Array.from(t)}async function _(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=await i("plugin:fs|read_text_file",{path:n instanceof URL?n.toString():n,options:e}),o=t instanceof ArrayBuffer?t:Uint8Array.from(t);return new TextDecoder(e?.encoding??"utf-8").decode(o)}async function x(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const t=n instanceof URL?n.toString():n;return await Promise.resolve({path:t,rid:null,async next(){const o=new TextDecoder(e?.encoding??"utf-8");if(this.rid===null){const l=o.encoding;this.rid=await i("plugin:fs|read_text_file_lines",{path:t,options:e!=null?{...e,encoding:l}:void 0})}let r;try{r=await i("plugin:fs|read_text_file_lines_next",{rid:this.rid})}catch(l){throw this.rid=null,l}const s=r instanceof ArrayBuffer?new Uint8Array(r):Uint8Array.from(r),f=s[s.byteLength-1]===1;return f?(this.rid=null,{value:null,done:f}):{value:o.decode(s.slice(0,s.byteLength-1)),done:f}},async return(){if(this.rid!==null){const o=this.rid;this.rid=null,await new a(o).close()}return{value:null,done:!0}},[Symbol.asyncIterator](){return this}})}async function v(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|remove",{path:n instanceof URL?n.toString():n,options:e})}async function M(n,e,t){if(n instanceof URL&&n.protocol!=="file:"||e instanceof URL&&e.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|rename",{oldPath:n instanceof URL?n.toString():n,newPath:e instanceof URL?e.toString():e,options:t})}async function C(n,e){const t=await i("plugin:fs|stat",{path:n instanceof URL?n.toString():n,options:e});return u(t)}async function k(n,e){const t=await i("plugin:fs|lstat",{path:n instanceof URL?n.toString():n,options:e});return u(t)}async function F(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|truncate",{path:n instanceof URL?n.toString():n,len:e,options:t})}async function z(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");if(e instanceof ReadableStream){const o=await p(n,{read:!1,create:!0,write:!0,...t,truncate:!t?.append}),r=e.getReader();try{for(;;){const{done:s,value:f}=await r.read();if(s)break;await o.write(f)}}finally{r.releaseLock(),await o.close()}}else await i("plugin:fs|write_file",e,{headers:{path:encodeURIComponent(n instanceof URL?n.toString():n),options:JSON.stringify(t)}})}async function I(n,e,t){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");const o=new TextEncoder;await i("plugin:fs|write_text_file",o.encode(e),{headers:{path:encodeURIComponent(n instanceof URL?n.toString():n),options:JSON.stringify(t)}})}async function H(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|exists",{path:n instanceof URL?n.toString():n,options:e})}class y extends a{}async function L(n,e,t){const o=Array.isArray(n)?n:[n];for(const c of o)if(c instanceof URL&&c.protocol!=="file:")throw new TypeError("Must be a file URL.");const r=new R;r.onmessage=e;const s=await i("plugin:fs|watch",{paths:o.map(c=>c instanceof URL?c.toString():c),options:t,onEvent:r}),f=new y(s);return()=>{f.close()}}async function J(n,e,t){return await L(n,e,{delayMs:2e3,...t})}async function N(n,e,t){return await L(n,e,{...t,delayMs:void 0})}async function O(n,e){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");return await i("plugin:fs|size",{path:n instanceof URL?n.toString():n,options:e})}async function V(n){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|start_accessing_security_scoped_resource",{path:n instanceof URL?n.toString():n})}async function h(n){if(n instanceof URL&&n.protocol!=="file:")throw new TypeError("Must be a file URL.");await i("plugin:fs|stop_accessing_security_scoped_resource",{path:n instanceof URL?n.toString():n})}export{w as BaseDirectory,g as FileHandle,d as SeekMode,S as copyFile,b as create,H as exists,k as lstat,A as mkdir,p as open,T as readDir,E as readFile,_ as readTextFile,x as readTextFileLines,v as remove,M as rename,O as size,V as startAccessingSecurityScopedResource,C as stat,h as stopAccessingSecurityScopedResource,F as truncate,J as watch,N as watchImmediate,z as writeFile,I as writeTextFile};
@@ -1,4 +1,4 @@
1
- import{M as oe,C as L,S as ce,a as M,G,P as ae,I as ne,b as k,D as F,c as I,A as T,d as Y,e as N,B as D,F as S,f as re,g as H,W as ke,h as Pe,O as Se,i as Ae,H as Ce,E as Re,R as Fe,U as Ee,V as O,j as Ie,k as Te,l as ze,m as Be,n as Ue,o as V,p as Ge,q as g,r as De,s as ee,t as Oe,u as Le,v as j,w as te,x as ie,y as He,L as Ne,z as de,J as ue,K as Xe,N as _e}from"./three-D_1Qt16u.js";import{h as ge,j as R,c as Ve,D as $e,m as je,k as C,l as $,o as We,n as qe,q as Ye,r as se,u as fe}from"./index-BEabiGl5.js";const Ke=["svg",ge,[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]]];const Qe=["svg",ge,[["circle",{cx:"12",cy:"8",r:"5"}],["path",{d:"M20 21a8 8 0 0 0-16 0"}]]],ye=`
1
+ import{M as oe,C as L,S as ce,a as M,G,P as ae,I as ne,b as k,D as F,c as I,A as T,d as Y,e as N,B as D,F as S,f as re,g as H,W as ke,h as Pe,O as Se,i as Ae,H as Ce,E as Re,R as Fe,U as Ee,V as O,j as Ie,k as Te,l as ze,m as Be,n as Ue,o as V,p as Ge,q as g,r as De,s as ee,t as Oe,u as Le,v as j,w as te,x as ie,y as He,L as Ne,z as de,J as ue,K as Xe,N as _e}from"./three-D_1Qt16u.js";import{h as ge,j as R,c as Ve,D as $e,m as je,k as C,l as $,o as We,n as qe,q as Ye,r as se,u as fe}from"./index-iA3u_0lX.js";const Ke=["svg",ge,[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]]];const Qe=["svg",ge,[["circle",{cx:"12",cy:"8",r:"5"}],["path",{d:"M20 21a8 8 0 0 0-16 0"}]]],ye=`
2
2
  attribute float nodeIndex;
3
3
  uniform float uSelected;
4
4
  uniform float uHovered;
@@ -1,6 +1,6 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DxQk-77k.js","assets/index-BEabiGl5.js","assets/index-vX8x5oFC.css","assets/index-86i6pjnx.js"])))=>i.map(i=>d[i]);
2
- import{TimelineScene as X}from"./scene-CEalI0mr.js";import{i as J,_ as O,c as Y,S as Z,p as K,a as Q,t as ee,s as te,b as B,d as ae,e as oe,f as re,g as se}from"./index-BEabiGl5.js";import"./three-D_1Qt16u.js";const ne="Cosmic Wobbly Disco Sneaky Bouncy Galactic Crispy Dizzy Fuzzy Noodle Groovy Sleepy Spicy Jolly Loopy Squishy Turbo Giggly Velvet Soggy Zippy Fluffy Moonwalking Wiggly Fizzy Snazzy Goofy Jazzy Tiny Chunky Dapper Wacky".split(" "),ie="Wombat Pickle Pancake Badger Potato Narwhal Noodle Goblin Otter Turnip Hamster Comet Dumpling Goose Biscuit Llama Muffin Squid Raccoon Toaster Waffle Penguin Yeti Pudding Walrus Taco Jellybean Platypus Sloth Cactus Donut Mongoose".split(" ");function le(e,t=()=>crypto.getRandomValues(new Uint32Array(1))[0]/2**32){const o=ne.flatMap(r=>ie.map(l=>`${r} ${l}`));for(let r=o.length-1;r>0;r--){const l=Math.floor(t()*(r+1));[o[r],o[l]]=[o[l],o[r]]}return Array.from({length:e},(r,l)=>{const u=Math.floor(l/o.length);return`Project ${"Mega".repeat(u)}${o[l%o.length]}`})}function ce(e){const t=le(e.lanes.length),o=new Map(e.nodes.map((i,a)=>[i.session.id,`session-${a}`])),r=new Map(e.lanes.flatMap((i,a)=>i.nodes.map(s=>[s.session.id,`project-${a}`]))),l=e.nodes.map(i=>{const a=i.session,s={id:o.get(a.id),title:"Session",projectID:r.get(a.id),directory:"",created:a.created,updated:a.created,activity:a.activity&&{firstMessageAt:a.activity.firstMessageAt,lastMessageAt:a.activity.lastMessageAt,userMessages:a.activity.userMessages,untimedUserMessages:a.activity.untimedUserMessages},archived:!1,model:"",provider:"",agent:"",cost:null,source:a.source==="continue"?"continue":a.source==="opencode"||!a.source?"opencode":"unknown",tokens:a.tokens};return a.parentID&&o.has(a.parentID)&&(s.parentID=o.get(a.parentID)),a.forkID&&o.has(a.forkID)&&(s.forkID=o.get(a.forkID)),{session:s,position:[...i.position],startPosition:[...i.startPosition],color:i.color,radius:i.radius}}),u=new Map(l.map(i=>[i.session.id,i]));return{start:e.start,end:e.end,timeFrame:e.timeFrame&&{...e.timeFrame},nodes:l,edges:e.edges.map(i=>({from:o.get(i.from),to:o.get(i.to),kind:i.kind})),lanes:e.lanes.map((i,a)=>({key:`project-${a}`,label:t[a],color:i.color,kind:"directory",y:i.y,z:i.z,nodes:i.nodes.map(s=>u.get(o.get(s.session.id)))}))}}const G={gif:{label:"GIF",description:"GIF animation",mime:"image/gif",filename:"sessiongraph-playback.gif"},mp4:{label:"MP4",description:"MP4 video",mime:"video/mp4",filename:"sessiongraph-playback.mp4"}},_=`My coding sessions, visualized with SessionGraph.
3
- https://github.com/arvindell/sessiongraph`,de=`https://x.com/intent/tweet?text=${encodeURIComponent(_)}`,W=e=>e instanceof Error&&e.name==="AbortError";async function ue(e,t,o){const{label:r,description:l,mime:u,filename:i}=G[o];try{if(J()){const[{save:a},{writeFile:s}]=await Promise.all([O(()=>import("./index-DxQk-77k.js"),__vite__mapDeps([0,1,2])),O(()=>import("./index-86i6pjnx.js"),__vite__mapDeps([3,1,2]))]),h=await a({title:`Save SessionGraph ${r}`,defaultPath:i,filters:[{name:l,extensions:[o]}]});if(!h)return"cancelled";await s(h,new Uint8Array(await e.arrayBuffer()))}else{const a=window.showSaveFilePicker;if(a){const h=await(await a.call(window,{suggestedName:i,types:[{description:l,accept:{[u]:[`.${o}`]}}]})).createWritable();try{await h.write(e),await h.close()}catch(c){throw await h.abort().catch(()=>{}),c}}else{const s=document.createElement("a");return s.href=t,s.download=i,document.body.append(s),s.click(),s.remove(),"downloaded"}}return"saved"}catch(a){if(W(a))return"cancelled";throw a}}const A=960,T=600,he=e=>Intl.NumberFormat("en",{notation:"compact",maximumFractionDigits:1}).format(e);function pe(e,t,o,r,l,u){const s=T-122,h=Math.max(1,...r);e.fillStyle="#91afa2",e.font='12px "Geist Variable", sans-serif',e.fillText("SessionGraph",28,32);for(let p=0;p<r.length;p++){const m=Math.max(2,r[p]/h*22);e.fillStyle=p/r.length<=o?"#91bfae":"#253d39",e.fillRect(260+p/r.length*440,s-m,440/r.length-2,m)}e.fillStyle="#d6f4e8",e.fillRect(260+440*o,s-27,1,31);const c=t.start+(t.end-t.start)*o,M=l.at(c,o===1).tokens;e.textAlign="center",e.fillStyle="#a0baae",e.font='12px "IBM Plex Mono", monospace',e.fillText(se(c,t.end-t.start),A/2,s+23),e.fillStyle="#e7f5ee",e.font='36px "Geist Variable", sans-serif',e.fillText(u(c,o===1).toLocaleString("en"),A/2-105,s+66),e.fillText(l.recorded?he(M):"—",A/2+105,s+66),e.font='12px "Geist Variable", sans-serif',e.fillStyle="#92b0a3",e.fillText("Sessions",A/2-105,s+87),e.fillText("Burnt tokens",A/2+105,s+87),e.textAlign="left"}async function ye(e,t,o,r,l){r.throwIfAborted();const{label:u,mime:i}=G[o],a=K(e.nodes.map(b=>b.session)),s=Q(e.nodes.map(b=>b.session)),h=ee(e.nodes.map(b=>te(b.session)),e.start,e.end),c=document.createElement("div");c.className="share-render-host",c.setAttribute("aria-hidden","true"),c.style.cssText=`position:fixed;left:-12000px;top:0;width:${A}px;height:${T}px;pointer-events:none;visibility:hidden`,document.body.append(c);const M=document.createElement("canvas");M.width=A,M.height=T;const p=M.getContext("2d",{willReadFrequently:!0});let m,f;try{if(!p)throw new Error("Canvas export is unavailable.");m=new X(c,{onSelect(){},onHover(){},onPlaybackInterrupt(){},onEvent(){},onEventHover(){}},{manual:!0}),m.applyPreferences({...t,quality:"balanced",motion:"on",labels:!0,focusDimming:!1,trails:t.trails==="selected"?"all":t.trails}),m.setGraph(e,!0),m.prepareCapture(),await document.fonts.ready,r.throwIfAborted(),f=o==="mp4"?new Worker(new URL("/assets/mp4-worker-HFPra5JP.js",import.meta.url),{type:"module"}):new Worker(new URL("/assets/gif-worker-CghHEBpp.js",import.meta.url),{type:"module"});const b=(w,I=[])=>new Promise((C,v)=>{r.throwIfAborted();const S=()=>{clearTimeout(P),r.removeEventListener("abort",g),f.onmessage=null,f.onerror=null},g=()=>{S(),v(r.reason)},P=setTimeout(()=>{S(),v(new Error(`${u} encoding timed out. Please try again.`))},6e4);r.addEventListener("abort",g,{once:!0}),f.onmessage=E=>{S(),E.data.error?v(new Error(E.data.error)):C(E.data)},f.onerror=()=>{S(),v(new Error(`Could not start the ${u} encoder.`))},f.postMessage(w,I)});o==="mp4"&&await b({init:!0,width:A,height:T});for(let w=0;w<B;w++){r.throwIfAborted();const I=ae(w);m.captureFrame(I,1/oe,p,re(w)),pe(p,e,I,h,a,s);const C=p.getImageData(0,0,A,T).data.buffer;await b({rgba:C,width:A,height:T},[C]),l((w+1)/B)}const $=await b({finish:!0});return new Blob([$.bytes],{type:i})}finally{f?.terminate(),m?.dispose(),c.remove()}}function ve(e){const t=document.createElement("dialog");t.className="share-dialog",t.setAttribute("aria-labelledby","share-title"),t.innerHTML=`<h2 id="share-title">SessionGraph</h2><p>Project and sessions names are hidden</p>
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CSlKklgv.js","assets/index-iA3u_0lX.js","assets/index-vX8x5oFC.css","assets/index-x7CFY4c0.js"])))=>i.map(i=>d[i]);
2
+ import{TimelineScene as X}from"./scene-BGmgWBAw.js";import{i as J,_ as O,c as Y,S as Z,p as K,a as Q,t as ee,s as te,b as B,d as ae,e as oe,f as re,g as se}from"./index-iA3u_0lX.js";import"./three-D_1Qt16u.js";const ne="Cosmic Wobbly Disco Sneaky Bouncy Galactic Crispy Dizzy Fuzzy Noodle Groovy Sleepy Spicy Jolly Loopy Squishy Turbo Giggly Velvet Soggy Zippy Fluffy Moonwalking Wiggly Fizzy Snazzy Goofy Jazzy Tiny Chunky Dapper Wacky".split(" "),ie="Wombat Pickle Pancake Badger Potato Narwhal Noodle Goblin Otter Turnip Hamster Comet Dumpling Goose Biscuit Llama Muffin Squid Raccoon Toaster Waffle Penguin Yeti Pudding Walrus Taco Jellybean Platypus Sloth Cactus Donut Mongoose".split(" ");function le(e,t=()=>crypto.getRandomValues(new Uint32Array(1))[0]/2**32){const o=ne.flatMap(r=>ie.map(l=>`${r} ${l}`));for(let r=o.length-1;r>0;r--){const l=Math.floor(t()*(r+1));[o[r],o[l]]=[o[l],o[r]]}return Array.from({length:e},(r,l)=>{const u=Math.floor(l/o.length);return`Project ${"Mega".repeat(u)}${o[l%o.length]}`})}function ce(e){const t=le(e.lanes.length),o=new Map(e.nodes.map((i,a)=>[i.session.id,`session-${a}`])),r=new Map(e.lanes.flatMap((i,a)=>i.nodes.map(s=>[s.session.id,`project-${a}`]))),l=e.nodes.map(i=>{const a=i.session,s={id:o.get(a.id),title:"Session",projectID:r.get(a.id),directory:"",created:a.created,updated:a.created,activity:a.activity&&{firstMessageAt:a.activity.firstMessageAt,lastMessageAt:a.activity.lastMessageAt,userMessages:a.activity.userMessages,untimedUserMessages:a.activity.untimedUserMessages},archived:!1,model:"",provider:"",agent:"",cost:null,source:a.source==="continue"?"continue":a.source==="opencode"||!a.source?"opencode":"unknown",tokens:a.tokens};return a.parentID&&o.has(a.parentID)&&(s.parentID=o.get(a.parentID)),a.forkID&&o.has(a.forkID)&&(s.forkID=o.get(a.forkID)),{session:s,position:[...i.position],startPosition:[...i.startPosition],color:i.color,radius:i.radius}}),u=new Map(l.map(i=>[i.session.id,i]));return{start:e.start,end:e.end,timeFrame:e.timeFrame&&{...e.timeFrame},nodes:l,edges:e.edges.map(i=>({from:o.get(i.from),to:o.get(i.to),kind:i.kind})),lanes:e.lanes.map((i,a)=>({key:`project-${a}`,label:t[a],color:i.color,kind:"directory",y:i.y,z:i.z,nodes:i.nodes.map(s=>u.get(o.get(s.session.id)))}))}}const G={gif:{label:"GIF",description:"GIF animation",mime:"image/gif",filename:"sessiongraph-playback.gif"},mp4:{label:"MP4",description:"MP4 video",mime:"video/mp4",filename:"sessiongraph-playback.mp4"}},_=`My coding sessions, visualized with SessionGraph.
3
+ https://github.com/arvindell/sessiongraph`,de=`https://x.com/intent/tweet?text=${encodeURIComponent(_)}`,W=e=>e instanceof Error&&e.name==="AbortError";async function ue(e,t,o){const{label:r,description:l,mime:u,filename:i}=G[o];try{if(J()){const[{save:a},{writeFile:s}]=await Promise.all([O(()=>import("./index-CSlKklgv.js"),__vite__mapDeps([0,1,2])),O(()=>import("./index-x7CFY4c0.js"),__vite__mapDeps([3,1,2]))]),h=await a({title:`Save SessionGraph ${r}`,defaultPath:i,filters:[{name:l,extensions:[o]}]});if(!h)return"cancelled";await s(h,new Uint8Array(await e.arrayBuffer()))}else{const a=window.showSaveFilePicker;if(a){const h=await(await a.call(window,{suggestedName:i,types:[{description:l,accept:{[u]:[`.${o}`]}}]})).createWritable();try{await h.write(e),await h.close()}catch(c){throw await h.abort().catch(()=>{}),c}}else{const s=document.createElement("a");return s.href=t,s.download=i,document.body.append(s),s.click(),s.remove(),"downloaded"}}return"saved"}catch(a){if(W(a))return"cancelled";throw a}}const A=960,T=600,he=e=>Intl.NumberFormat("en",{notation:"compact",maximumFractionDigits:1}).format(e);function pe(e,t,o,r,l,u){const s=T-122,h=Math.max(1,...r);e.fillStyle="#91afa2",e.font='12px "Geist Variable", sans-serif',e.fillText("SessionGraph",28,32);for(let p=0;p<r.length;p++){const m=Math.max(2,r[p]/h*22);e.fillStyle=p/r.length<=o?"#91bfae":"#253d39",e.fillRect(260+p/r.length*440,s-m,440/r.length-2,m)}e.fillStyle="#d6f4e8",e.fillRect(260+440*o,s-27,1,31);const c=t.start+(t.end-t.start)*o,M=l.at(c,o===1).tokens;e.textAlign="center",e.fillStyle="#a0baae",e.font='12px "IBM Plex Mono", monospace',e.fillText(se(c,t.end-t.start),A/2,s+23),e.fillStyle="#e7f5ee",e.font='36px "Geist Variable", sans-serif',e.fillText(u(c,o===1).toLocaleString("en"),A/2-105,s+66),e.fillText(l.recorded?he(M):"—",A/2+105,s+66),e.font='12px "Geist Variable", sans-serif',e.fillStyle="#92b0a3",e.fillText("Sessions",A/2-105,s+87),e.fillText("Burnt tokens",A/2+105,s+87),e.textAlign="left"}async function ye(e,t,o,r,l){r.throwIfAborted();const{label:u,mime:i}=G[o],a=K(e.nodes.map(b=>b.session)),s=Q(e.nodes.map(b=>b.session)),h=ee(e.nodes.map(b=>te(b.session)),e.start,e.end),c=document.createElement("div");c.className="share-render-host",c.setAttribute("aria-hidden","true"),c.style.cssText=`position:fixed;left:-12000px;top:0;width:${A}px;height:${T}px;pointer-events:none;visibility:hidden`,document.body.append(c);const M=document.createElement("canvas");M.width=A,M.height=T;const p=M.getContext("2d",{willReadFrequently:!0});let m,f;try{if(!p)throw new Error("Canvas export is unavailable.");m=new X(c,{onSelect(){},onHover(){},onPlaybackInterrupt(){},onEvent(){},onEventHover(){}},{manual:!0}),m.applyPreferences({...t,quality:"balanced",motion:"on",labels:!0,focusDimming:!1,trails:t.trails==="selected"?"all":t.trails}),m.setGraph(e,!0),m.prepareCapture(),await document.fonts.ready,r.throwIfAborted(),f=o==="mp4"?new Worker(new URL("/assets/mp4-worker-HFPra5JP.js",import.meta.url),{type:"module"}):new Worker(new URL("/assets/gif-worker-CghHEBpp.js",import.meta.url),{type:"module"});const b=(w,I=[])=>new Promise((C,v)=>{r.throwIfAborted();const S=()=>{clearTimeout(P),r.removeEventListener("abort",g),f.onmessage=null,f.onerror=null},g=()=>{S(),v(r.reason)},P=setTimeout(()=>{S(),v(new Error(`${u} encoding timed out. Please try again.`))},6e4);r.addEventListener("abort",g,{once:!0}),f.onmessage=E=>{S(),E.data.error?v(new Error(E.data.error)):C(E.data)},f.onerror=()=>{S(),v(new Error(`Could not start the ${u} encoder.`))},f.postMessage(w,I)});o==="mp4"&&await b({init:!0,width:A,height:T});for(let w=0;w<B;w++){r.throwIfAborted();const I=ae(w);m.captureFrame(I,1/oe,p,re(w)),pe(p,e,I,h,a,s);const C=p.getImageData(0,0,A,T).data.buffer;await b({rgba:C,width:A,height:T},[C]),l((w+1)/B)}const $=await b({finish:!0});return new Blob([$.bytes],{type:i})}finally{f?.terminate(),m?.dispose(),c.remove()}}function ve(e){const t=document.createElement("dialog");t.className="share-dialog",t.setAttribute("aria-labelledby","share-title"),t.innerHTML=`<h2 id="share-title">SessionGraph</h2><p>Project and sessions names are hidden</p>
4
4
  <div class="share-formats" role="group" aria-label="Animation format"><button data-format="gif" aria-pressed="true">GIF</button><button data-format="mp4" aria-pressed="false">MP4 video</button></div>
5
5
  <div class="share-preview"><img alt="SessionGraph playback with hidden project and session names" hidden/><video aria-label="SessionGraph playback with hidden project and session names" muted loop playsinline controls hidden></video><div class="share-progress"><progress max="100" value="0" aria-label="Creating GIF"></progress><span role="status">Creating GIF… 0%</span></div></div>
6
6
  <p class="share-notice" role="status" hidden></p>
@@ -10,7 +10,7 @@
10
10
  />
11
11
  <title>SessionGraph — Explore &amp; visualize all your LLM sessions</title>
12
12
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
13
- <script type="module" crossorigin src="/assets/index-BEabiGl5.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-iA3u_0lX.js"></script>
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-vX8x5oFC.css">
15
15
  </head>
16
16
  <body>
@@ -18,7 +18,7 @@
18
18
  </data>
19
19
  <key>Resources/resources/server.mjs</key>
20
20
  <data>
21
- Auxi9+gE1XyaSNNhucOBl1jlNU4=
21
+ wvcyFN7ZJiWHRbiD81sA8XClga8=
22
22
  </data>
23
23
  <key>Resources/resources/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2</key>
24
24
  <data>
@@ -84,37 +84,37 @@
84
84
  <data>
85
85
  LdRX2sBB3T5WDAsZLCwBlsMYXPw=
86
86
  </data>
87
- <key>Resources/resources/web/assets/index-3_I59bPI.js</key>
87
+ <key>Resources/resources/web/assets/index-CQQQn4As.js</key>
88
88
  <data>
89
- jvEe650eLU5hAx0/4M0wzspX1QM=
89
+ eCr+OK+iSwy/OwEdv7kZgxSz09c=
90
90
  </data>
91
- <key>Resources/resources/web/assets/index-86i6pjnx.js</key>
91
+ <key>Resources/resources/web/assets/index-CSlKklgv.js</key>
92
92
  <data>
93
- H5fahmuqeuyyiT3chlKALoCyaNs=
93
+ ccml7K3PFvHuNbb8qV8KS+L0Qgg=
94
94
  </data>
95
- <key>Resources/resources/web/assets/index-BEabiGl5.js</key>
95
+ <key>Resources/resources/web/assets/index-iA3u_0lX.js</key>
96
96
  <data>
97
- yieEwXdFxUso5j71EfOsuzfFlPo=
98
- </data>
99
- <key>Resources/resources/web/assets/index-DxQk-77k.js</key>
100
- <data>
101
- 8M0dHH567zRsnncdNmWqXCTQx+s=
97
+ dsInbFZbyRvJi/D6eTzuN3egOnQ=
102
98
  </data>
103
99
  <key>Resources/resources/web/assets/index-vX8x5oFC.css</key>
104
100
  <data>
105
101
  R/hfolJpB1RiibIOKKyMqkGwvVM=
106
102
  </data>
103
+ <key>Resources/resources/web/assets/index-x7CFY4c0.js</key>
104
+ <data>
105
+ MnD9CCbm52YpjWTItDWsLcqidWY=
106
+ </data>
107
107
  <key>Resources/resources/web/assets/mp4-worker-HFPra5JP.js</key>
108
108
  <data>
109
109
  ATVDz7hoBhGkjEraL7M3QJPykT0=
110
110
  </data>
111
- <key>Resources/resources/web/assets/scene-CEalI0mr.js</key>
111
+ <key>Resources/resources/web/assets/scene-BGmgWBAw.js</key>
112
112
  <data>
113
- ijDDCMVV0kvjCPFLH/Tq0GGi6ec=
113
+ xxDmrYBJoqFeMuIYGtjvY2RI058=
114
114
  </data>
115
- <key>Resources/resources/web/assets/share-BydK_UaB.js</key>
115
+ <key>Resources/resources/web/assets/share-CLYxMZI8.js</key>
116
116
  <data>
117
- 85uQ0IX0Oph5zeYAJ2eb0rypPIM=
117
+ Sbur4vaBUIrU3P3l6h4azRUOF00=
118
118
  </data>
119
119
  <key>Resources/resources/web/assets/three-D_1Qt16u.js</key>
120
120
  <data>
@@ -130,7 +130,7 @@
130
130
  </data>
131
131
  <key>Resources/resources/web/index.html</key>
132
132
  <data>
133
- Un4luTUKgqDlBih2cIBg8NhAHzs=
133
+ jQwbwbNQRQ042CXGYBP1K0DLlEI=
134
134
  </data>
135
135
  <key>Resources/resources/web/sources/LICENSE-APACHE-2.0.txt</key>
136
136
  <data>
@@ -396,7 +396,7 @@
396
396
  <dict>
397
397
  <key>hash2</key>
398
398
  <data>
399
- MDQbNmKGR+mfoJ2gQ3vNTHyhXDZF5IZjDVdBkzzdov4=
399
+ nzJNB74YxehPHMXhLP13hlleg2zaNy2/F0g/rGe7syE=
400
400
  </data>
401
401
  </dict>
402
402
  <key>Resources/resources/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2</key>
@@ -511,39 +511,39 @@
511
511
  vO1WHZkeP4HBUMCOcff6hJ/L/1I1YPYFkkXy7c4ZtgA=
512
512
  </data>
513
513
  </dict>
514
- <key>Resources/resources/web/assets/index-3_I59bPI.js</key>
514
+ <key>Resources/resources/web/assets/index-CQQQn4As.js</key>
515
515
  <dict>
516
516
  <key>hash2</key>
517
517
  <data>
518
- 49v/pQdfz5Pr5v6C22vGmxWByZCmp4GSbfJRDAy0U/I=
518
+ 8wTvyCThgNnLVhrJB1eSKreFKKBHlWKOrSTs5DcCvD0=
519
519
  </data>
520
520
  </dict>
521
- <key>Resources/resources/web/assets/index-86i6pjnx.js</key>
521
+ <key>Resources/resources/web/assets/index-CSlKklgv.js</key>
522
522
  <dict>
523
523
  <key>hash2</key>
524
524
  <data>
525
- zncEN0kZ8eKr65EoGYeZedOTq+28daCrJJTpOsEeaig=
525
+ 1dSsD1HU7BgEw0QUrZEmKx64a7+SKawx4Kvz8thPDLU=
526
526
  </data>
527
527
  </dict>
528
- <key>Resources/resources/web/assets/index-BEabiGl5.js</key>
528
+ <key>Resources/resources/web/assets/index-iA3u_0lX.js</key>
529
529
  <dict>
530
530
  <key>hash2</key>
531
531
  <data>
532
- 6KkdnIHs7eWxf6sU0qb6LLI0a2L3ujd9+1vWU+OAra0=
532
+ edYz3gaKu/p4t5sbtReuhMgmbU/ACOUG5UTYAIAQB18=
533
533
  </data>
534
534
  </dict>
535
- <key>Resources/resources/web/assets/index-DxQk-77k.js</key>
535
+ <key>Resources/resources/web/assets/index-vX8x5oFC.css</key>
536
536
  <dict>
537
537
  <key>hash2</key>
538
538
  <data>
539
- N/Sot/ZLvw5KNCZOzj0ngXYNwc8zPDBqUo9XobdlIyg=
539
+ X3Upi/KYR8mRr5ZGR1UH5c6USbG8O1rFowYZsSJRdmA=
540
540
  </data>
541
541
  </dict>
542
- <key>Resources/resources/web/assets/index-vX8x5oFC.css</key>
542
+ <key>Resources/resources/web/assets/index-x7CFY4c0.js</key>
543
543
  <dict>
544
544
  <key>hash2</key>
545
545
  <data>
546
- X3Upi/KYR8mRr5ZGR1UH5c6USbG8O1rFowYZsSJRdmA=
546
+ 5S2ObzLmnYGGV+WAc41c748XFnVigphaC4kuiWZaCmA=
547
547
  </data>
548
548
  </dict>
549
549
  <key>Resources/resources/web/assets/mp4-worker-HFPra5JP.js</key>
@@ -553,18 +553,18 @@
553
553
  OcBpKX8DX9+EUp27mNDb0LMrwE28fDC5f3PbjJsXOjU=
554
554
  </data>
555
555
  </dict>
556
- <key>Resources/resources/web/assets/scene-CEalI0mr.js</key>
556
+ <key>Resources/resources/web/assets/scene-BGmgWBAw.js</key>
557
557
  <dict>
558
558
  <key>hash2</key>
559
559
  <data>
560
- ika96W+3K0U9vpl8xp1hQwNe6xmz484bn6Rrm441cWQ=
560
+ vnXALZZdC1swwgi9nVIC5hjo8cPdTCJS2/AT3umP87M=
561
561
  </data>
562
562
  </dict>
563
- <key>Resources/resources/web/assets/share-BydK_UaB.js</key>
563
+ <key>Resources/resources/web/assets/share-CLYxMZI8.js</key>
564
564
  <dict>
565
565
  <key>hash2</key>
566
566
  <data>
567
- zkE8lWhakUbj/HcCxwlpbll82BpcSRxl0TdBd4R4hXI=
567
+ TUtSds0CzYG0+AXW6ErneRX/v/VhellLZS9x9SnZAXQ=
568
568
  </data>
569
569
  </dict>
570
570
  <key>Resources/resources/web/assets/three-D_1Qt16u.js</key>
@@ -592,7 +592,7 @@
592
592
  <dict>
593
593
  <key>hash2</key>
594
594
  <data>
595
- YPNUQAeii6nV1yI4mq/CdkREr7SHwa1ek5pgaVEC7yM=
595
+ k+yUZKoZ7ywIFD+pAYZDRdYIvzjzexewMkg23Ppg2+I=
596
596
  </data>
597
597
  </dict>
598
598
  <key>Resources/resources/web/sources/LICENSE-APACHE-2.0.txt</key>