dsh-thoughtdag 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist-app/assets/{canonical-BAKMmYtu.js → canonical-Bu0lc0IS.js} +2 -2
  2. package/dist-app/assets/{canvas-record-v0T9A4JC.js → canvas-record-CmXFsOEP.js} +1 -1
  3. package/dist-app/assets/{claude-code-session-WliRGG8W.js → claude-code-session-B0xfEAeh.js} +3 -3
  4. package/dist-app/assets/{codex-session-CIpFw1w2.js → codex-session-DGckD5vR.js} +4 -4
  5. package/dist-app/assets/{dsh-session-rxnDGmEX.js → dsh-session-DcFBMiBo.js} +3 -3
  6. package/dist-app/assets/experiment-loop-DLwE-thH.js +2 -0
  7. package/dist-app/assets/{http-bridge-CFJoyZSa.js → http-bridge-C9WCIcet.js} +1 -1
  8. package/dist-app/assets/index-8PjAYhti.js +904 -0
  9. package/dist-app/assets/{index-BPz35wb6.js → index-DIJtOJxk.js} +1 -1
  10. package/dist-app/assets/{index-DE0h-KA1.js → index-DdyOBAYQ.js} +1 -1
  11. package/dist-app/assets/index-Lvtth6pP.css +1 -0
  12. package/dist-app/assets/{index-DxbomCNl.js → index-sZcnNAul.js} +3 -3
  13. package/dist-app/assets/local-ladder.worker-BkmzXrqq.js +1 -0
  14. package/dist-app/assets/{pi-session-BjtG1-5k.js → pi-session-DA_RmEVw.js} +1 -1
  15. package/dist-app/assets/{sensitive-scan-Bu7x2N6Y.js → sensitive-scan-brovGPLt.js} +1 -1
  16. package/dist-app/assets/{session-handoff-BYVQEntk.js → session-handoff-rMaxWoB9.js} +2 -2
  17. package/dist-app/assets/{shared-BuierUP1.js → shared-DJOVlRHh.js} +3 -3
  18. package/dist-app/assets/{turndown-plugin-gfm.cjs-CukkoPc7.js → turndown-plugin-gfm.cjs-D9apJuex.js} +3 -3
  19. package/dist-app/assets/{update-check-BIhP2KP4.js → update-check-D1_48OBp.js} +1 -1
  20. package/dist-app/index.html +2 -2
  21. package/dist-app/whats-new/jev-recall.mp4 +0 -0
  22. package/dist-app/whats-new/timeline-detail-en.mp4 +0 -0
  23. package/dist-app/whats-new/timeline-detail-zh.mp4 +0 -0
  24. package/dist-app/whats-new/zoom-ladder-en.mp4 +0 -0
  25. package/dist-app/whats-new/zoom-ladder-zh.mp4 +0 -0
  26. package/package.json +1 -1
  27. package/dist-app/assets/experiment-loop-CQaQhKai.js +0 -2
  28. package/dist-app/assets/index-93ujsGjx.css +0 -1
  29. package/dist-app/assets/index-D0VdUWYE.js +0 -883
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DxbomCNl.js","assets/index-D0VdUWYE.js","assets/index-93ujsGjx.css","assets/experiment-loop-CQaQhKai.js"])))=>i.map(i=>d[i]);
2
- import{c as _,b as y,_ as k,p as D,r as O,g as R,a as K,u as C,h as Q,s as z,j as $,k as W,f as V,l as Y,m as Z,t as tt,n as M,o as et,q as st}from"./index-D0VdUWYE.js";const ot=190;async function ct(n){const{anyRunnerSessionConversation:d}=await k(async()=>{const{anyRunnerSessionConversation:r}=await import("./index-DxbomCNl.js");return{anyRunnerSessionConversation:r}},__vite__mapDeps([0,1,2])),t=await d(n);return J(t)}function ut(n,d){let r=0,s=!1;return async()=>{if(s)return null;const a=await window.desktopSessions.readRange(n,d,r,8388608);return r=a.nextStart,a.eof&&(s=!0),a.text}}function L(n){if(!n)return null;for(const d of _.getState().projects){const t=d.sourceSession;if(!t)continue;if(t.sessionId===n)return{project:d,entry:t};const r=t.chapters?.find(a=>a.sessionId===n);if(r)return{project:d,entry:r};const s=t.branches?.find(a=>a.sessionId===n);if(s)return{project:d,entry:s}}return null}function H(n,d,t,r,s){const a=r.position.x+(s?560:0),f=a-40,c=a+580,e=n.nodes.reduce((g,w)=>{const b=w.width??w.measured?.width??540;if(w.position.x+b<f||w.position.x>c)return g;const x=w.height??w.measured?.height??300;return Math.max(g,w.position.y+x)},s?r.position.y-300:r.position.y+(r.height??140)),i=a-d[0].position.x,m=Math.max(e+ot,s?r.position.y:-1/0)-d[0].position.y,u=d.map(g=>({...g,position:{x:g.position.x+i,y:g.position.y+m}})),l=[{id:M(),source:r.id,target:u[0].id,type:"smoothstep"},...t];return{moved:u,edges:l}}async function J(n,d={}){if(!n)return null;const t=n.build(),r=t.nodes.filter(c=>c.data.importSource),s=r.at(-1)?.id??t.nodes.at(-1)?.id??"";if(t.nodes.length===0)return null;const a=L(n.sessionId);if(a)return U(n,t,r,s,a,d);if(n.sessionId){const c=await nt(n.sessionId);if(c){let e=-1,i="";if(r.forEach((m,u)=>{const l=m.data.importSource?.itemIds?.[0],g=l?c.byFirstId.get(l):void 0;g&&(e=u,i=g)}),e>=0){await O(c.projectId,"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:e+1,tailNodeId:i});const m=L(n.sessionId);if(m)return U(n,t,r,s,m,d)}}}if(n.sessionId&&r.length>0){const{parseAnchor:c}=await k(async()=>{const{parseAnchor:i}=await import("./experiment-loop-CQaQhKai.js");return{parseAnchor:i}},__vite__mapDeps([3,1,2])),e=c(r[0].data.question??"");if(e&&_.getState().projects.some(i=>i.id===e.project)){await R(e.project);const i=y.getState(),m=_.getState().projects.find(l=>l.id===e.project);let u=i.nodes.find(l=>l.id===e.node)??null;if(!u&&e.mode==="continue"&&m.sourceSession?.sessionId){const l=m.sourceSession;u=i.nodes.find(g=>g.id===l.tailNodeId)??i.nodes.filter(g=>g.data.importSource?.sessionId===l.sessionId).at(-1)??null}if(u){const l=t.nodes.find(h=>h.data.importSource&&h.data.stepKind!=="note");if(l&&c(l.data.question??"")){const h=K("exp.openerMark");l.data={...l.data,question:h,source:l.data.source?{...l.data.source,question:h}:l.data.source}}const g=new Set(t.nodes.map(h=>h.id)),w=t.edges.filter(h=>g.has(h.source)&&g.has(h.target)),b=e.mode!=="continue",x=H(i,t.nodes,w,u,b);if(b){const h=x.moved.find(N=>N.data.importSource&&N.data.stepKind!=="note");h&&(h.data={...h.data,isBranch:!0})}return i.pushHistory(),y.setState(h=>({nodes:[...h.nodes,...x.moved],edges:[...h.edges,...x.edges]})),await O(e.project,b?"branch":"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:s,anchorNodeId:u.id}),C.getState().setArrivalFocusNodeId(x.moved[x.moved.length-1].id),{kind:"mounted",mode:b?"branch":"continue",turns:r.length}}}}const f=crypto.randomUUID();return await Q(D(f),JSON.stringify({state:{nodes:z(t.nodes),edges:t.edges},version:1})),C.getState().setArrivalFocusNodeId(t.nodes[t.nodes.length-1].id),await $(f,n.title.slice(0,60),"chat",n.sessionId?{sourceSession:{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:s}}:void 0),{kind:"imported",nodeCount:t.nodes.length}}async function pt(n,d){if(!n||!n.sessionId)return null;if(L(n.sessionId))return J(n);const t=n.build(),r=t.nodes.filter(u=>u.data.importSource);if(t.nodes.length===0)return null;await R(d);const s=y.getState(),a=_.getState().projects.find(u=>u.id===d);if(!a)return null;const f=a.sourceSession,c=(f?.sessionId?s.nodes.find(u=>u.id===f.tailNodeId)??s.nodes.filter(u=>u.data.importSource?.sessionId===f.sessionId).at(-1):null)??s.nodes.at(-1)??null;if(!c)return null;const e=new Set(t.nodes.map(u=>u.id)),i=t.edges.filter(u=>e.has(u.source)&&e.has(u.target)),m=H(s,t.nodes,i,c,!1);return s.pushHistory(),y.setState(u=>({nodes:[...u.nodes,...m.moved],edges:[...u.edges,...m.edges]})),await O(d,"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:r.at(-1)?.id??t.nodes.at(-1).id,anchorNodeId:c.id}),C.getState().setArrivalFocusNodeId(m.moved[m.moved.length-1].id),{kind:"mounted",mode:"continue",turns:r.length}}async function nt(n){const{projects:d,activeId:t}=_.getState(),r=[...d].sort((s,a)=>s.id===t?-1:a.id===t?1:a.updatedAt-s.updatedAt);for(const s of r){if(s.id!==t&&s.provenanceSessions&&!s.provenanceSessions.includes(n))continue;let a;if(s.id===t)a=y.getState().nodes;else try{const{get:c}=await k(async()=>{const{get:m}=await import("./index-D0VdUWYE.js").then(u=>u.C);return{get:m}},__vite__mapDeps([1,2])),e=await c(D(s.id));a=(typeof e=="string"?JSON.parse(e):e)?.state?.nodes??[]}catch{continue}if(s.id!==t&&!s.provenanceSessions){const c=[...new Set(a.map(e=>e.data.importSource?.sessionId).filter(e=>!!e))];_.setState(e=>({projects:e.projects.map(i=>i.id===s.id?{...i,provenanceSessions:c}:i)}))}const f=new Map;for(const c of a)if(c.data.importSource?.sessionId===n&&c.data.stepKind!=="note"){const e=c.data.importSource.itemIds?.[0];e&&f.set(e,c.id)}if(f.size>0)return{projectId:s.id,byFirstId:f}}return null}async function U(n,d,t,r,s,a={}){await R(s.project.id);const f=y.getState(),c=f.nodes.filter(o=>o.data.importSource?.sessionId===n.sessionId),e=f.nodes.find(o=>o.id===s.entry.tailNodeId)??c.at(-1)??null,i=s.entry.importedCount>0&&t.length>=s.entry.importedCount?t[s.entry.importedCount-1]:null;if(i){const o=i.data.importSource?.itemIds?.[0],p=o?c.find(E=>E.data.importSource?.itemIds?.[0]===o):void 0,S=p?.data.source,A=!!S&&p.data.question===S.question&&(p.data.response??"")===(S.response??""),I=i.data,X=!!p&&(I.response??"").trim()===""&&(p.data.response??"").trim()!=="",G=!!p&&!X&&(I.question!==p.data.question||(I.response??"")!==(p.data.response??"")),P=p?.data.attachments??[],T=I.attachments??[],B=!!p&&T.length>P.length&&P.every((E,q)=>T[q]?.name===E.name);if(p&&A&&(G||B)){const E=G?I.attachments:[...P,...T.slice(P.length)];y.setState(q=>({nodes:q.nodes.map(F=>F.id===p.id?{...F,data:{...F.data,question:I.question,response:I.response,responses:I.responses,responseIndex:I.responseIndex,tokenCount:I.tokenCount,attachments:E,importSource:I.importSource,source:I.source}}:F)})),y.getState().recomputeStaleness()}}if(t.length<=s.entry.importedCount)return a.focusOnRefresh!==!1&&C.getState().setArrivalFocusNodeId(e?.id??null),{kind:"opened"};const m=t[s.entry.importedCount],u=d.nodes.findIndex(o=>o.id===m.id),l=d.nodes.slice(u),g=new Set(l.map(o=>o.id)),w=d.edges.filter(o=>g.has(o.source)&&g.has(o.target)),b=new Map;for(const o of c){const p=o.data.importSource?.itemIds?.[0];p&&b.set(p,o.id)}const x=new Map;for(const o of d.nodes){const p=o.data.importSource?.itemIds?.[0];p&&!g.has(o.id)&&x.set(o.id,p)}const h=[];for(const o of d.edges){if(!g.has(o.target)||g.has(o.source))continue;const p=x.get(o.source),S=p?b.get(p):void 0;S&&h.push({...o,id:M(),source:S})}const N=new Set(h.map(o=>o.target));let v,j;if(e){const o=H(f,l,w,e,!1);v=o.moved;const p=new Set(w.map(S=>S.target));j=o.edges.filter(S=>!(S.source===e.id&&N.has(S.target)));for(const S of v)S.id!==v[0].id&&!p.has(S.id)&&!N.has(S.id)&&S.data.stepKind!=="note"&&j.push({id:M(),source:e.id,target:S.id,type:"smoothstep"});j=[...j,...h]}else{const p=(f.nodes.length?Math.max(...f.nodes.map(I=>I.position.x)):0)+560-l[0].position.x,S=-l[0].position.y;v=l.map(I=>({...I,position:{x:I.position.x+p,y:I.position.y+S}}));const A=rt(it(t.length-s.entry.importedCount),v[0]);v=[A,...v],j=[{id:M(),source:A.id,target:v[1].id,type:"smoothstep"},...w]}return f.pushHistory(),y.setState(o=>({nodes:[...o.nodes,...v],edges:[...o.edges,...j]})),await et(s.project.id,n.sessionId,{importedCount:t.length,tailNodeId:r}),C.getState().setArrivalFocusNodeId(v[e?0:1].id),{kind:"appended",turns:t.length-s.entry.importedCount}}function it(n){return`[Mirror] The source session grew by ${n} turn(s); the earlier mirrored turns were removed from this canvas by hand, so the new turns land here on their own.`}function rt(n,d){const t=st(n,"",!1);return t.data.stepKind="note",t.data.importSource=d.data.importSource?{...d.data.importSource,itemIds:[]}:void 0,t.width=460,t.position={x:d.position.x-520,y:d.position.y},t}async function ft(n){const{projects:d,activeId:t}=_.getState(),r=d.find(e=>e.id===n);if(!r?.sourceSession)return"native";if((r.sourceSession.chapters?.length??0)>0||(r.sourceSession.branches?.length??0)>0)return"diverged-mirror";let s;if(n===t)s=y.getState().nodes;else{const{get:e}=await k(async()=>{const{get:m}=await import("./index-D0VdUWYE.js").then(u=>u.C);return{get:m}},__vite__mapDeps([1,2])),i=await e(D(n));try{s=(typeof i=="string"?JSON.parse(i):i)?.state?.nodes??[]}catch{return"diverged-mirror"}}const a=r.sourceSession.sessionId,f=s.filter(e=>e.data.importSource?.sessionId===a);return s.some(e=>!e.data.importSource)||s.some(e=>e.data.importSource&&e.data.importSource.sessionId!==a)||f.filter(e=>e.data.source).length<r.sourceSession.importedCount||f.some(e=>e.data.source&&(e.data.question!==e.data.source.question||e.data.response!==e.data.source.response))?"diverged-mirror":"pristine-mirror"}async function mt(){const{bootProjects:n}=await k(async()=>{const{bootProjects:i}=await import("./index-D0VdUWYE.js").then(m=>m.D);return{bootProjects:i}},__vite__mapDeps([1,2]));await n();const{projects:d,activeId:t}=_.getState(),r=d.find(i=>i.id===t);if(!r?.sourceSession)return;const s=Y(r);if(s.length===0)return;const a=new Set;for(const i of y.getState().nodes){const m=i.data.importSource?.sessionId;m&&a.add(m)}const f=s.filter(i=>!a.has(i));if(f.length===0)return;for(const i of f)await Z(r.id,i);const e=_.getState().projects.find(i=>i.id===r.id)?.sourceSession?"toast.unsubscribed":"toast.unsubscribedNative";tt("info",V(K(e),{n:f.length}),8e3)}async function lt(n,d){const t=n.filter(c=>!!c&&!!c.sessionId);if(t.length===0)return null;const r=d??await W(V(K("atlas.mergedName"),{title:t[0].title.slice(0,24),n:t.length}));await R(r),y.getState().pushHistory();let s=0,a=0;for(const c of t){const e=c.sessionId;if(L(e)){a++;continue}const i=c.build();if(i.nodes.length===0){a++;continue}const m=i.nodes.filter(o=>o.data.importSource),u=y.getState().nodes,l=u.reduce((o,p)=>Math.max(o,p.position.x+(p.width??p.measured?.width??540)),-1/0),g=u.reduce((o,p)=>Math.min(o,p.position.y),1/0),w=Math.min(...i.nodes.map(o=>o.position.x)),b=Math.min(...i.nodes.map(o=>o.position.y)),x=(Number.isFinite(l)?l+180:0)-w,h=(Number.isFinite(g)?g:0)-b,N=i.nodes.map(o=>({...o,position:{x:o.position.x+x,y:o.position.y+h}})),v=new Set(N.map(o=>o.id)),j=i.edges.filter(o=>v.has(o.source)&&v.has(o.target));y.setState(o=>({nodes:[...o.nodes,...N],edges:[...o.edges,...j]})),await O(r,"chapter",{sessionId:e,runner:c.source,importedCount:m.length,tailNodeId:m.at(-1)?.id??N[N.length-1].id}),s++}y.getState().pushHistory();const f=y.getState().nodes.at(-1);return s>0&&f&&C.getState().setArrivalFocusNodeId(f.id),{mounted:s,skipped:a,projectId:r}}export{ft as canvasUniqueness,J as importOrAppendConversation,ct as importOrAppendSession,lt as mergeSessionsIntoProject,pt as mountConversationToProject,ut as shellSessionReader,Y as subscribedSessionIds,mt as unsubscribeOrphanedSessions};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-sZcnNAul.js","assets/index-8PjAYhti.js","assets/index-Lvtth6pP.css","assets/experiment-loop-DLwE-thH.js"])))=>i.map(i=>d[i]);
2
+ import{c as _,b as y,_ as k,p as D,r as O,g as R,a as K,u as C,h as Q,s as z,j as $,k as W,f as V,l as Y,m as Z,t as tt,n as M,o as et,q as st}from"./index-8PjAYhti.js";const ot=190;async function ct(n){const{anyRunnerSessionConversation:d}=await k(async()=>{const{anyRunnerSessionConversation:r}=await import("./index-sZcnNAul.js");return{anyRunnerSessionConversation:r}},__vite__mapDeps([0,1,2])),t=await d(n);return J(t)}function ut(n,d){let r=0,s=!1;return async()=>{if(s)return null;const a=await window.desktopSessions.readRange(n,d,r,8388608);return r=a.nextStart,a.eof&&(s=!0),a.text}}function L(n){if(!n)return null;for(const d of _.getState().projects){const t=d.sourceSession;if(!t)continue;if(t.sessionId===n)return{project:d,entry:t};const r=t.chapters?.find(a=>a.sessionId===n);if(r)return{project:d,entry:r};const s=t.branches?.find(a=>a.sessionId===n);if(s)return{project:d,entry:s}}return null}function H(n,d,t,r,s){const a=r.position.x+(s?560:0),f=a-40,c=a+580,e=n.nodes.reduce((g,w)=>{const b=w.width??w.measured?.width??540;if(w.position.x+b<f||w.position.x>c)return g;const x=w.height??w.measured?.height??300;return Math.max(g,w.position.y+x)},s?r.position.y-300:r.position.y+(r.height??140)),i=a-d[0].position.x,m=Math.max(e+ot,s?r.position.y:-1/0)-d[0].position.y,u=d.map(g=>({...g,position:{x:g.position.x+i,y:g.position.y+m}})),l=[{id:M(),source:r.id,target:u[0].id,type:"smoothstep"},...t];return{moved:u,edges:l}}async function J(n,d={}){if(!n)return null;const t=n.build(),r=t.nodes.filter(c=>c.data.importSource),s=r.at(-1)?.id??t.nodes.at(-1)?.id??"";if(t.nodes.length===0)return null;const a=L(n.sessionId);if(a)return U(n,t,r,s,a,d);if(n.sessionId){const c=await nt(n.sessionId);if(c){let e=-1,i="";if(r.forEach((m,u)=>{const l=m.data.importSource?.itemIds?.[0],g=l?c.byFirstId.get(l):void 0;g&&(e=u,i=g)}),e>=0){await O(c.projectId,"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:e+1,tailNodeId:i});const m=L(n.sessionId);if(m)return U(n,t,r,s,m,d)}}}if(n.sessionId&&r.length>0){const{parseAnchor:c}=await k(async()=>{const{parseAnchor:i}=await import("./experiment-loop-DLwE-thH.js");return{parseAnchor:i}},__vite__mapDeps([3,1,2])),e=c(r[0].data.question??"");if(e&&_.getState().projects.some(i=>i.id===e.project)){await R(e.project);const i=y.getState(),m=_.getState().projects.find(l=>l.id===e.project);let u=i.nodes.find(l=>l.id===e.node)??null;if(!u&&e.mode==="continue"&&m.sourceSession?.sessionId){const l=m.sourceSession;u=i.nodes.find(g=>g.id===l.tailNodeId)??i.nodes.filter(g=>g.data.importSource?.sessionId===l.sessionId).at(-1)??null}if(u){const l=t.nodes.find(h=>h.data.importSource&&h.data.stepKind!=="note");if(l&&c(l.data.question??"")){const h=K("exp.openerMark");l.data={...l.data,question:h,source:l.data.source?{...l.data.source,question:h}:l.data.source}}const g=new Set(t.nodes.map(h=>h.id)),w=t.edges.filter(h=>g.has(h.source)&&g.has(h.target)),b=e.mode!=="continue",x=H(i,t.nodes,w,u,b);if(b){const h=x.moved.find(N=>N.data.importSource&&N.data.stepKind!=="note");h&&(h.data={...h.data,isBranch:!0})}return i.pushHistory(),y.setState(h=>({nodes:[...h.nodes,...x.moved],edges:[...h.edges,...x.edges]})),await O(e.project,b?"branch":"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:s,anchorNodeId:u.id}),C.getState().setArrivalFocusNodeId(x.moved[x.moved.length-1].id),{kind:"mounted",mode:b?"branch":"continue",turns:r.length}}}}const f=crypto.randomUUID();return await Q(D(f),JSON.stringify({state:{nodes:z(t.nodes),edges:t.edges},version:1})),C.getState().setArrivalFocusNodeId(t.nodes[t.nodes.length-1].id),await $(f,n.title.slice(0,60),"chat",n.sessionId?{sourceSession:{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:s}}:void 0),{kind:"imported",nodeCount:t.nodes.length}}async function pt(n,d){if(!n||!n.sessionId)return null;if(L(n.sessionId))return J(n);const t=n.build(),r=t.nodes.filter(u=>u.data.importSource);if(t.nodes.length===0)return null;await R(d);const s=y.getState(),a=_.getState().projects.find(u=>u.id===d);if(!a)return null;const f=a.sourceSession,c=(f?.sessionId?s.nodes.find(u=>u.id===f.tailNodeId)??s.nodes.filter(u=>u.data.importSource?.sessionId===f.sessionId).at(-1):null)??s.nodes.at(-1)??null;if(!c)return null;const e=new Set(t.nodes.map(u=>u.id)),i=t.edges.filter(u=>e.has(u.source)&&e.has(u.target)),m=H(s,t.nodes,i,c,!1);return s.pushHistory(),y.setState(u=>({nodes:[...u.nodes,...m.moved],edges:[...u.edges,...m.edges]})),await O(d,"chapter",{sessionId:n.sessionId,runner:n.source,importedCount:r.length,tailNodeId:r.at(-1)?.id??t.nodes.at(-1).id,anchorNodeId:c.id}),C.getState().setArrivalFocusNodeId(m.moved[m.moved.length-1].id),{kind:"mounted",mode:"continue",turns:r.length}}async function nt(n){const{projects:d,activeId:t}=_.getState(),r=[...d].sort((s,a)=>s.id===t?-1:a.id===t?1:a.updatedAt-s.updatedAt);for(const s of r){if(s.id!==t&&s.provenanceSessions&&!s.provenanceSessions.includes(n))continue;let a;if(s.id===t)a=y.getState().nodes;else try{const{get:c}=await k(async()=>{const{get:m}=await import("./index-8PjAYhti.js").then(u=>u.D);return{get:m}},__vite__mapDeps([1,2])),e=await c(D(s.id));a=(typeof e=="string"?JSON.parse(e):e)?.state?.nodes??[]}catch{continue}if(s.id!==t&&!s.provenanceSessions){const c=[...new Set(a.map(e=>e.data.importSource?.sessionId).filter(e=>!!e))];_.setState(e=>({projects:e.projects.map(i=>i.id===s.id?{...i,provenanceSessions:c}:i)}))}const f=new Map;for(const c of a)if(c.data.importSource?.sessionId===n&&c.data.stepKind!=="note"){const e=c.data.importSource.itemIds?.[0];e&&f.set(e,c.id)}if(f.size>0)return{projectId:s.id,byFirstId:f}}return null}async function U(n,d,t,r,s,a={}){await R(s.project.id);const f=y.getState(),c=f.nodes.filter(o=>o.data.importSource?.sessionId===n.sessionId),e=f.nodes.find(o=>o.id===s.entry.tailNodeId)??c.at(-1)??null,i=s.entry.importedCount>0&&t.length>=s.entry.importedCount?t[s.entry.importedCount-1]:null;if(i){const o=i.data.importSource?.itemIds?.[0],p=o?c.find(E=>E.data.importSource?.itemIds?.[0]===o):void 0,S=p?.data.source,A=!!S&&p.data.question===S.question&&(p.data.response??"")===(S.response??""),I=i.data,X=!!p&&(I.response??"").trim()===""&&(p.data.response??"").trim()!=="",G=!!p&&!X&&(I.question!==p.data.question||(I.response??"")!==(p.data.response??"")),P=p?.data.attachments??[],T=I.attachments??[],B=!!p&&T.length>P.length&&P.every((E,q)=>T[q]?.name===E.name);if(p&&A&&(G||B)){const E=G?I.attachments:[...P,...T.slice(P.length)];y.setState(q=>({nodes:q.nodes.map(F=>F.id===p.id?{...F,data:{...F.data,question:I.question,response:I.response,responses:I.responses,responseIndex:I.responseIndex,tokenCount:I.tokenCount,attachments:E,importSource:I.importSource,source:I.source}}:F)})),y.getState().recomputeStaleness()}}if(t.length<=s.entry.importedCount)return a.focusOnRefresh!==!1&&C.getState().setArrivalFocusNodeId(e?.id??null),{kind:"opened"};const m=t[s.entry.importedCount],u=d.nodes.findIndex(o=>o.id===m.id),l=d.nodes.slice(u),g=new Set(l.map(o=>o.id)),w=d.edges.filter(o=>g.has(o.source)&&g.has(o.target)),b=new Map;for(const o of c){const p=o.data.importSource?.itemIds?.[0];p&&b.set(p,o.id)}const x=new Map;for(const o of d.nodes){const p=o.data.importSource?.itemIds?.[0];p&&!g.has(o.id)&&x.set(o.id,p)}const h=[];for(const o of d.edges){if(!g.has(o.target)||g.has(o.source))continue;const p=x.get(o.source),S=p?b.get(p):void 0;S&&h.push({...o,id:M(),source:S})}const N=new Set(h.map(o=>o.target));let v,j;if(e){const o=H(f,l,w,e,!1);v=o.moved;const p=new Set(w.map(S=>S.target));j=o.edges.filter(S=>!(S.source===e.id&&N.has(S.target)));for(const S of v)S.id!==v[0].id&&!p.has(S.id)&&!N.has(S.id)&&S.data.stepKind!=="note"&&j.push({id:M(),source:e.id,target:S.id,type:"smoothstep"});j=[...j,...h]}else{const p=(f.nodes.length?Math.max(...f.nodes.map(I=>I.position.x)):0)+560-l[0].position.x,S=-l[0].position.y;v=l.map(I=>({...I,position:{x:I.position.x+p,y:I.position.y+S}}));const A=rt(it(t.length-s.entry.importedCount),v[0]);v=[A,...v],j=[{id:M(),source:A.id,target:v[1].id,type:"smoothstep"},...w]}return f.pushHistory(),y.setState(o=>({nodes:[...o.nodes,...v],edges:[...o.edges,...j]})),await et(s.project.id,n.sessionId,{importedCount:t.length,tailNodeId:r}),C.getState().setArrivalFocusNodeId(v[e?0:1].id),{kind:"appended",turns:t.length-s.entry.importedCount}}function it(n){return`[Mirror] The source session grew by ${n} turn(s); the earlier mirrored turns were removed from this canvas by hand, so the new turns land here on their own.`}function rt(n,d){const t=st(n,"",!1);return t.data.stepKind="note",t.data.importSource=d.data.importSource?{...d.data.importSource,itemIds:[]}:void 0,t.width=460,t.position={x:d.position.x-520,y:d.position.y},t}async function ft(n){const{projects:d,activeId:t}=_.getState(),r=d.find(e=>e.id===n);if(!r?.sourceSession)return"native";if((r.sourceSession.chapters?.length??0)>0||(r.sourceSession.branches?.length??0)>0)return"diverged-mirror";let s;if(n===t)s=y.getState().nodes;else{const{get:e}=await k(async()=>{const{get:m}=await import("./index-8PjAYhti.js").then(u=>u.D);return{get:m}},__vite__mapDeps([1,2])),i=await e(D(n));try{s=(typeof i=="string"?JSON.parse(i):i)?.state?.nodes??[]}catch{return"diverged-mirror"}}const a=r.sourceSession.sessionId,f=s.filter(e=>e.data.importSource?.sessionId===a);return s.some(e=>!e.data.importSource)||s.some(e=>e.data.importSource&&e.data.importSource.sessionId!==a)||f.filter(e=>e.data.source).length<r.sourceSession.importedCount||f.some(e=>e.data.source&&(e.data.question!==e.data.source.question||e.data.response!==e.data.source.response))?"diverged-mirror":"pristine-mirror"}async function mt(){const{bootProjects:n}=await k(async()=>{const{bootProjects:i}=await import("./index-8PjAYhti.js").then(m=>m.F);return{bootProjects:i}},__vite__mapDeps([1,2]));await n();const{projects:d,activeId:t}=_.getState(),r=d.find(i=>i.id===t);if(!r?.sourceSession)return;const s=Y(r);if(s.length===0)return;const a=new Set;for(const i of y.getState().nodes){const m=i.data.importSource?.sessionId;m&&a.add(m)}const f=s.filter(i=>!a.has(i));if(f.length===0)return;for(const i of f)await Z(r.id,i);const e=_.getState().projects.find(i=>i.id===r.id)?.sourceSession?"toast.unsubscribed":"toast.unsubscribedNative";tt("info",V(K(e),{n:f.length}),8e3)}async function lt(n,d){const t=n.filter(c=>!!c&&!!c.sessionId);if(t.length===0)return null;const r=d??await W(V(K("atlas.mergedName"),{title:t[0].title.slice(0,24),n:t.length}));await R(r),y.getState().pushHistory();let s=0,a=0;for(const c of t){const e=c.sessionId;if(L(e)){a++;continue}const i=c.build();if(i.nodes.length===0){a++;continue}const m=i.nodes.filter(o=>o.data.importSource),u=y.getState().nodes,l=u.reduce((o,p)=>Math.max(o,p.position.x+(p.width??p.measured?.width??540)),-1/0),g=u.reduce((o,p)=>Math.min(o,p.position.y),1/0),w=Math.min(...i.nodes.map(o=>o.position.x)),b=Math.min(...i.nodes.map(o=>o.position.y)),x=(Number.isFinite(l)?l+180:0)-w,h=(Number.isFinite(g)?g:0)-b,N=i.nodes.map(o=>({...o,position:{x:o.position.x+x,y:o.position.y+h}})),v=new Set(N.map(o=>o.id)),j=i.edges.filter(o=>v.has(o.source)&&v.has(o.target));y.setState(o=>({nodes:[...o.nodes,...N],edges:[...o.edges,...j]})),await O(r,"chapter",{sessionId:e,runner:c.source,importedCount:m.length,tailNodeId:m.at(-1)?.id??N[N.length-1].id}),s++}y.getState().pushHistory();const f=y.getState().nodes.at(-1);return s>0&&f&&C.getState().setArrivalFocusNodeId(f.id),{mounted:s,skipped:a,projectId:r}}export{ft as canvasUniqueness,J as importOrAppendConversation,ct as importOrAppendSession,lt as mergeSessionsIntoProject,pt as mountConversationToProject,ut as shellSessionReader,Y as subscribedSessionIds,mt as unsubscribeOrphanedSessions};
@@ -1 +1 @@
1
- import{b as c,c as p,E as m,s as v,d as w,i as h,e as g}from"./index-D0VdUWYE.js";const S=6e4,T=4e3;function y(e){const s=(e.data.attachments??[]).map(t=>({id:t.id,name:t.name,type:t.type,size:t.size,content:"",...t.addedAt?{addedAt:t.addedAt}:{},...t.extractedText?{extractedText:t.extractedText.slice(0,T)}:{},...t.paths?{paths:t.paths}:{},...t.op?{op:t.op}:{}}));return{...e,data:{...e.data,attachments:s}}}function j(){const{nodes:e,edges:s,events:t}=c.getState(),{projects:u,activeId:a}=p.getState();if(!a||e.length===0)return null;const i=u.find(l=>l.id===a),f=JSON.stringify({version:m,name:w(),projectId:a,exportedAt:new Date().toISOString(),record:"thoughtdag-canvas-record",instantiatedFrom:i?.instantiatedFrom,sourceSession:i?.sourceSession,nodes:v(e).map(y),edges:s,events:t});return{projectId:a,json:f}}let n=null,o=!1;async function d(){n&&(clearTimeout(n),n=null),o=!1;const e=window.desktopCanvas;if(!e)return!1;const s=j();return s?!!(await e.write(s.projectId,s.json).catch(()=>({ok:!1}))).ok:!1}function x(){o=!0,n&&clearTimeout(n),n=setTimeout(()=>{n=null,o&&d().catch(e=>console.warn("[thoughtdag] canvas record write failed:",e))},S)}let r=!1;function E(){r||h||typeof window>"u"||!window.desktopCanvas||(r=!0,c.subscribe((e,s)=>{(e.nodes!==s.nodes||e.edges!==s.edges||e.events!==s.events)&&x()}),g.push(async()=>{o&&await d()}),window.addEventListener("pagehide",()=>{o&&d()}))}async function R(e){await window.desktopCanvas?.remove(e).catch(()=>{})}export{j as canvasRecordPayload,d as flushCanvasRecord,R as removeCanvasRecord,E as startCanvasRecord};
1
+ import{b as c,c as p,E as m,s as v,d as w,i as h,e as g}from"./index-8PjAYhti.js";const S=6e4,T=4e3;function y(e){const s=(e.data.attachments??[]).map(t=>({id:t.id,name:t.name,type:t.type,size:t.size,content:"",...t.addedAt?{addedAt:t.addedAt}:{},...t.extractedText?{extractedText:t.extractedText.slice(0,T)}:{},...t.paths?{paths:t.paths}:{},...t.op?{op:t.op}:{}}));return{...e,data:{...e.data,attachments:s}}}function j(){const{nodes:e,edges:s,events:t}=c.getState(),{projects:u,activeId:a}=p.getState();if(!a||e.length===0)return null;const i=u.find(l=>l.id===a),f=JSON.stringify({version:m,name:w(),projectId:a,exportedAt:new Date().toISOString(),record:"thoughtdag-canvas-record",instantiatedFrom:i?.instantiatedFrom,sourceSession:i?.sourceSession,nodes:v(e).map(y),edges:s,events:t});return{projectId:a,json:f}}let n=null,o=!1;async function d(){n&&(clearTimeout(n),n=null),o=!1;const e=window.desktopCanvas;if(!e)return!1;const s=j();return s?!!(await e.write(s.projectId,s.json).catch(()=>({ok:!1}))).ok:!1}function x(){o=!0,n&&clearTimeout(n),n=setTimeout(()=>{n=null,o&&d().catch(e=>console.warn("[thoughtdag] canvas record write failed:",e))},S)}let r=!1;function E(){r||h||typeof window>"u"||!window.desktopCanvas||(r=!0,c.subscribe((e,s)=>{(e.nodes!==s.nodes||e.edges!==s.edges||e.events!==s.events)&&x()}),g.push(async()=>{o&&await d()}),window.addEventListener("pagehide",()=>{o&&d()}))}async function R(e){await window.desktopCanvas?.remove(e).catch(()=>{})}export{j as canvasRecordPayload,d as flushCanvasRecord,R as removeCanvasRecord,E as startCanvasRecord};
@@ -1,7 +1,7 @@
1
- import{q as I,A as g,n as T}from"./index-D0VdUWYE.js";import{t as C,a as A,r as _,b as x,c as w,d as L,e as S,s as k,f as v,m as O,T as b,A as q,g as M}from"./shared-BuierUP1.js";const B=16e3;function f(o){return typeof o=="string"?o:Array.isArray(o)?o.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(`
1
+ import{q as I,B as g,n as T}from"./index-8PjAYhti.js";import{t as C,a as _,r as A,b as x,c as w,d as L,e as S,s as k,f as v,m as O,T as b,A as q,g as B}from"./shared-DJOVlRHh.js";const M=16e3;function f(o){return typeof o=="string"?o:Array.isArray(o)?o.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(`
2
2
  `):""}function N(o){return typeof o=="string"?o:Array.isArray(o)?o.map(t=>t.type==="text"&&t.text?t.text:t.type==="image"?"[image result omitted]":"").filter(Boolean).join(`
3
- `):""}const p=S;class ${turns=[];pendingTools=new Map;current=null;pendingCompaction;sessionId=null;customTitle=null;summary=null;slug=null;firstQuestion=null;cwd=null;mode=null;feedLine(t){const s=t.trim();if(!s)return;let n;try{n=JSON.parse(s)}catch{return}this.feed(n)}flush(){const t=this.current;t&&(t.question||t.response||t.tools.length)&&this.turns.push(t),this.current=null}feed(t){if(t.type==="custom-title"&&t.customTitle&&(this.customTitle=t.customTitle),t.type==="summary"&&t.summary&&!this.summary&&(this.summary=t.summary),t.slug&&!this.slug&&(this.slug=t.slug),t.cwd&&!this.cwd&&(this.cwd=t.cwd),this.mode===null&&(t.type==="user"||t.type==="assistant")&&t.uuid&&(this.mode=t.isSidechain&&t.agentId?"sidechain":"main",this.mode==="sidechain"&&(this.sessionId=t.agentId)),!!t.isSidechain==(this.mode==="sidechain")){if(t.type==="system"&&t.subtype==="compact_boundary"){this.flush();const s=t.compactMetadata;this.pendingCompaction=`[Compaction] The source runner compacted its history here${s?.preTokens?` (${s.preTokens} → ${s.postTokens??"?"} tokens)`:""}. Everything above this point reached later turns only as a summary.`;return}if((t.type==="user"||t.type==="assistant")&&t.uuid&&t.sessionId&&!this.sessionId&&(this.sessionId=t.sessionId),t.type==="user"){const s=t.message?.content;if(Array.isArray(s)){for(const e of s)if(e.type==="tool_result"&&e.tool_use_id){const i=this.pendingTools.get(e.tool_use_id);if(i&&this.current){const a=p(N(e.content),b);this.current.tools.push({name:i.name,call:i.call,result:a.text,truncated:a.truncated,...i.paths.length?{paths:i.paths}:{},op:i.op,nativeCallId:e.tool_use_id,...i.url?{url:i.url}:{},...i.locator?{locator:i.locator}:{}}),this.pendingTools.delete(e.tool_use_id)}}}const n=f(s);if(!n.trim())return;if(/^\s*<task-notification>/.test(n)){if(this.current){const e=p(n,B);this.current.tools.push({name:"Agent",call:"(task notification)",result:e.text,truncated:e.truncated,op:"agent"})}return}this.flush(),this.firstQuestion||(this.firstQuestion=n.trim()),this.current={question:n,response:"",itemIds:t.uuid?[t.uuid]:[],tools:[],parentItemId:t.parentUuid??void 0,...t.timestamp?{at:t.timestamp}:{}},this.pendingCompaction&&(this.current.compactionBefore=this.pendingCompaction,this.pendingCompaction=void 0);return}if(t.type==="assistant"&&this.current){t.uuid&&this.current.itemIds.push(t.uuid);const s=t.message?.content,n=f(s);if(n.trim()&&(this.current.response=this.current.response?`${this.current.response}
3
+ `):""}const p=S;class ${turns=[];pendingTools=new Map;current=null;pendingCompaction;sessionId=null;customTitle=null;summary=null;slug=null;firstQuestion=null;cwd=null;mode=null;feedLine(t){const s=t.trim();if(!s)return;let n;try{n=JSON.parse(s)}catch{return}this.feed(n)}flush(){const t=this.current;t&&(t.question||t.response||t.tools.length)&&this.turns.push(t),this.current=null}feed(t){if(t.type==="custom-title"&&t.customTitle&&(this.customTitle=t.customTitle),t.type==="summary"&&t.summary&&!this.summary&&(this.summary=t.summary),t.slug&&!this.slug&&(this.slug=t.slug),t.cwd&&!this.cwd&&(this.cwd=t.cwd),this.mode===null&&(t.type==="user"||t.type==="assistant")&&t.uuid&&(this.mode=t.isSidechain&&t.agentId?"sidechain":"main",this.mode==="sidechain"&&(this.sessionId=t.agentId)),!!t.isSidechain==(this.mode==="sidechain")){if(t.type==="system"&&t.subtype==="compact_boundary"){this.flush();const s=t.compactMetadata;this.pendingCompaction=`[Compaction] The source runner compacted its history here${s?.preTokens?` (${s.preTokens} → ${s.postTokens??"?"} tokens)`:""}. Everything above this point reached later turns only as a summary.`;return}if((t.type==="user"||t.type==="assistant")&&t.uuid&&t.sessionId&&!this.sessionId&&(this.sessionId=t.sessionId),t.type==="user"){const s=t.message?.content;if(Array.isArray(s)){for(const e of s)if(e.type==="tool_result"&&e.tool_use_id){const i=this.pendingTools.get(e.tool_use_id);if(i&&this.current){const a=p(N(e.content),b);this.current.tools.push({name:i.name,call:i.call,result:a.text,truncated:a.truncated,...i.paths.length?{paths:i.paths}:{},op:i.op,nativeCallId:e.tool_use_id,...i.url?{url:i.url}:{},...i.locator?{locator:i.locator}:{}}),this.pendingTools.delete(e.tool_use_id)}}}const n=f(s);if(!n.trim())return;if(/^\s*<task-notification>/.test(n)){if(this.current){const e=p(n,M);this.current.tools.push({name:"Agent",call:"(task notification)",result:e.text,truncated:e.truncated,op:"agent"})}return}this.flush(),this.firstQuestion||(this.firstQuestion=n.trim()),this.current={question:n,response:"",itemIds:t.uuid?[t.uuid]:[],tools:[],parentItemId:t.parentUuid??void 0,...t.timestamp?{at:t.timestamp}:{}},this.pendingCompaction&&(this.current.compactionBefore=this.pendingCompaction,this.pendingCompaction=void 0);return}if(t.type==="assistant"&&this.current){t.uuid&&this.current.itemIds.push(t.uuid);const s=t.message?.content,n=f(s);if(n.trim()&&(this.current.response=this.current.response?`${this.current.response}
4
4
 
5
- ${n}`:n),Array.isArray(s)){for(const e of s)if(e.type==="tool_use"&&e.id&&e.name){const i=A(e.name),a=p(_(e.name,e.input),i==="write"||i==="edit"?q:M);this.pendingTools.set(e.id,{name:e.name,call:a.text,paths:w(e.input),op:i,...x(e.input)})}}}}}finish(){if(this.flush(),!this.sessionId)return null;const t=this.firstQuestion?.split(`
5
+ ${n}`:n),Array.isArray(s)){for(const e of s)if(e.type==="tool_use"&&e.id&&e.name){const i=_(e.name),a=p(A(e.name,e.input),i==="write"||i==="edit"?q:B);this.pendingTools.set(e.id,{name:e.name,call:a.text,paths:w(e.input),op:i,...x(e.input)})}}}}}finish(){if(this.flush(),!this.sessionId)return null;const t=this.firstQuestion?.split(`
6
6
  `).map(n=>n.trim()).find(n=>n&&!n.startsWith("<"))?.slice(0,80)??null,s=this.customTitle??this.summary??t??this.slug??`session ${this.sessionId.slice(0,8)}`;return{sessionId:this.sessionId,title:s,turns:L(this.turns),...this.cwd?{cwd:this.cwd}:{}}}toConversation(){const t=this.finish();return!t||t.turns.length===0?null:{title:t.title,messageCount:t.turns.length,source:"claude-code",sessionId:t.sessionId,build:()=>Q(t.turns,t.sessionId,t.cwd)}}}function y(o){const t=new $;for(const s of o.split(`
7
7
  `))t.feedLine(s);return t}function F(o){const t=I(o,"",!1);return t.data.stepKind="note",O(t),t}function Q(o,t,s){const n=s?{cwd:s}:{},e=[],i=[];let a=null;const m=new Map,l=(u,c)=>{i.push({id:T(),source:u.id,target:c.id,type:"smoothstep"})};for(const u of o){let c=null;if(u.compactionBefore){const d=F(u.compactionBefore);d.data.importSource={runner:"claude-code",sessionId:t,itemIds:[],...n},e.push(d),c=d}const r=I(u.question,u.response,a===null);r.data.importSource={runner:"claude-code",sessionId:t,itemIds:u.itemIds,...n},r.data.source={question:r.data.question,response:r.data.response},k(r),r.data.attachments=v(u),e.push(r);const h=u.parentItemId?m.get(u.parentItemId):void 0;h?l(h,r):a&&l(a,r),c&&l(c,r);for(const d of u.itemIds)m.set(d,r);a=r}return{nodes:g(e,i),edges:i}}function E(o,t){const s=y(o).finish();return s?C(s.turns,s.sessionId,"claude-code",t,s.cwd):null}function R(o){return y(o).toConversation()}export{$ as ClaudeSessionCollector,E as claudeCodeSessionAsBranch,R as claudeCodeSessionConversation};
@@ -1,11 +1,11 @@
1
- import{q as p,n as d,A as m}from"./index-D0VdUWYE.js";import{t as y,a as _,d as g,e as I,m as x,f as T,s as C,A as w,g as A,T as v}from"./shared-BuierUP1.js";function L(n){const t=[];for(const e of n.matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm))t.push(e[1].trim());return t}const h=I,S=n=>(n??[]).filter(t=>t.text&&(t.type==="input_text"||t.type==="output_text"||t.type==="text")).map(t=>t.text).join(`
2
- `),B=/^\s*<\/?[a-zA-Z_][\w-]*[^>]*>/,q=n=>B.test(n)||n.trimStart().startsWith("# AGENTS.md instructions for "),O=n=>(n??[]).filter(t=>t.text&&(t.type==="input_text"||t.type==="text")&&!q(t.text)).map(t=>t.text).join(`
1
+ import{q as p,n as d,B as m}from"./index-8PjAYhti.js";import{t as y,a as _,d as g,e as I,m as x,f as T,s as C,A as w,g as v,T as A}from"./shared-DJOVlRHh.js";function B(n){const t=[];for(const e of n.matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm))t.push(e[1].trim());return t}const h=I,L=n=>(n??[]).filter(t=>t.text&&(t.type==="input_text"||t.type==="output_text"||t.type==="text")).map(t=>t.text).join(`
2
+ `),S=/^\s*<\/?[a-zA-Z_][\w-]*[^>]*>/,q=n=>S.test(n)||n.trimStart().startsWith("# AGENTS.md instructions for "),O=n=>(n??[]).filter(t=>t.text&&(t.type==="input_text"||t.type==="text")&&!q(t.text)).map(t=>t.text).join(`
3
3
  `),N=n=>typeof n=="string"?n:Array.isArray(n)?n.map(t=>t?.text??"").filter(Boolean).join(`
4
4
  `):n==null?"":JSON.stringify(n);class ${turns=[];pendingCalls=new Map;current=null;pendingCompaction;sessionId=null;cwd="";day="";sawItems=!1;firstQuestion=null;parentThreadId=null;feedLine(t){const e=t.trim();if(!e)return;let s;try{s=JSON.parse(e)}catch{return}this.feed(s)}flush(){const t=this.current;t&&(t.question||t.response||t.tools.length)&&this.turns.push(t),this.current=null}ensure(){return this.current||(this.current={question:"",response:"",itemIds:[],tools:[]},this.pendingCompaction&&(this.current.compactionBefore=this.pendingCompaction,this.pendingCompaction=void 0)),this.current}feed(t){const e=t.payload??{};if(t.type==="session_meta"&&e.id&&!this.sessionId){this.sessionId=e.id,this.cwd=e.cwd??"",this.day=e.timestamp?.slice(0,10)??"",this.parentThreadId=e.parent_thread_id??null;return}if((t.type==="response_item"||t.type==="event_msg")&&(this.sawItems=!0),t.type==="compacted"){this.flush(),this.pendingCompaction="[Compaction] The source runner compacted its history here. Everything above this point reached later turns only as a summary.";return}if(t.type==="turn_context"||t.type==="event_msg"&&e.type==="task_started"){this.flush();const s=this.ensure();e.turn_id&&s.itemIds.push(e.turn_id);return}if(t.type==="response_item"){if(e.type==="message"){if(e.role==="user"){const s=O(e.content);if(s.trim()){this.firstQuestion||(this.firstQuestion=s.trim());const o=this.ensure();!o.at&&t.timestamp&&(o.at=t.timestamp),o.question=o.question?`${o.question}
5
5
 
6
- ${s}`:s}}else if(e.role==="assistant"){const s=S(e.content);if(s.trim()){const o=this.ensure();o.response=o.response?`${o.response}
6
+ ${s}`:s}}else if(e.role==="assistant"){const s=L(e.content);if(s.trim()){const o=this.ensure();o.response=o.response?`${o.response}
7
7
 
8
- ${s}`:s}}}else if((e.type==="function_call"||e.type==="custom_tool_call")&&e.call_id&&e.name){const s=String(e.arguments??e.input??""),o=_(e.name),i=h(s,o==="edit"||o==="write"?w:A),r=o==="read"?(()=>{try{const a=JSON.parse(s);return typeof a.path=="string"&&a.path?[a.path]:[]}catch{return[]}})():[];this.pendingCalls.set(e.call_id,{name:e.name,call:i.text,paths:o==="edit"?L(s):r,op:o})}else if((e.type==="function_call_output"||e.type==="custom_tool_call_output")&&e.call_id){const s=this.pendingCalls.get(e.call_id);if(s){const o=this.ensure(),i=h(N(e.output),v);o.tools.push({name:s.name,call:s.call,result:i.text,truncated:i.truncated,...s.paths.length?{paths:s.paths}:{},op:s.op,nativeCallId:e.call_id}),this.pendingCalls.delete(e.call_id)}}}}finish(){if(this.flush(),!this.sessionId||!this.sawItems)return null;const t=[];let e;for(const i of this.turns){const r=t[t.length-1];!i.question.trim()&&r?(i.compactionBefore&&(e=e??i.compactionBefore),i.response&&(r.response=r.response?`${r.response}
8
+ ${s}`:s}}}else if((e.type==="function_call"||e.type==="custom_tool_call")&&e.call_id&&e.name){const s=String(e.arguments??e.input??""),o=_(e.name),i=h(s,o==="edit"||o==="write"?w:v),r=o==="read"?(()=>{try{const a=JSON.parse(s);return typeof a.path=="string"&&a.path?[a.path]:[]}catch{return[]}})():[];this.pendingCalls.set(e.call_id,{name:e.name,call:i.text,paths:o==="edit"?B(s):r,op:o})}else if((e.type==="function_call_output"||e.type==="custom_tool_call_output")&&e.call_id){const s=this.pendingCalls.get(e.call_id);if(s){const o=this.ensure(),i=h(N(e.output),A);o.tools.push({name:s.name,call:s.call,result:i.text,truncated:i.truncated,...s.paths.length?{paths:s.paths}:{},op:s.op,nativeCallId:e.call_id}),this.pendingCalls.delete(e.call_id)}}}}finish(){if(this.flush(),!this.sessionId||!this.sawItems)return null;const t=[];let e;for(const i of this.turns){const r=t[t.length-1];!i.question.trim()&&r?(i.compactionBefore&&(e=e??i.compactionBefore),i.response&&(r.response=r.response?`${r.response}
9
9
 
10
10
  ${i.response}`:i.response),r.tools.push(...i.tools),r.itemIds.push(...i.itemIds)):(e&&!i.compactionBefore&&(i.compactionBefore=e),e=void 0,t.push(i))}this.turns=t;const s=this.cwd.split("/").filter(Boolean).pop(),o=this.firstQuestion?.split(`
11
11
  `)[0].slice(0,60)||["codex",s,this.day].filter(Boolean).join(" · ");return{sessionId:this.sessionId,title:o,turns:g(this.turns),subagent:!!this.parentThreadId,...this.cwd?{cwd:this.cwd}:{}}}toConversation(){const t=this.finish();return!t||t.turns.length===0?null:{title:t.title,messageCount:t.turns.length,source:"codex",sessionId:t.sessionId,build:()=>j(t.turns,t.sessionId,t.cwd)}}}function f(n){const t=new $;for(const e of n.split(`
@@ -1,6 +1,6 @@
1
- import{q as C,A as x,n as w}from"./index-D0VdUWYE.js";import{t as A,a as h,b as I,c as y,e as c,r as f,d as L,T as d,g as p,A as m,f as S,s as b}from"./shared-BuierUP1.js";function q(r){if(!r)return!1;if(r.error)return!0;const s=r.message?.content;return Array.isArray(s)&&s.some(t=>!!t&&typeof t=="object"&&t.isError===!0)}function l(r,s=0){return typeof r=="string"?r:!Array.isArray(r)||s>2?"":r.map(t=>{if(!t||typeof t!="object")return"";const e=t;return e.type==="text"&&typeof e.text=="string"?e.text:e.type==="image"?"[image omitted]":e.type==="reasoning"?"":l(e.text??e.content,s+1)}).filter(Boolean).join(`
1
+ import{q as C,B as x,n as w}from"./index-8PjAYhti.js";import{t as L,a as h,b as I,c as y,e as c,r as f,d as A,T as d,g as p,A as m,f as S,s as b}from"./shared-DJOVlRHh.js";function q(r){if(!r)return!1;if(r.error)return!0;const s=r.message?.content;return Array.isArray(s)&&s.some(t=>!!t&&typeof t=="object"&&t.isError===!0)}function l(r,s=0){return typeof r=="string"?r:!Array.isArray(r)||s>2?"":r.map(t=>{if(!t||typeof t!="object")return"";const e=t;return e.type==="text"&&typeof e.text=="string"?e.text:e.type==="image"?"[image omitted]":e.type==="reasoning"?"":l(e.text??e.content,s+1)}).filter(Boolean).join(`
2
2
  `)}function O(r,s,t){const e=h(r);if(e==="run"||/^run_code$/i.test(r)){const o=t??{};return c(typeof o.code=="string"?o.code:s,m)}const n=t&&typeof t=="object"?f(r,t):s;return c(n,e==="write"||e==="edit"?m:p)}const v=r=>{try{return JSON.parse(r??"")}catch{return}};class _{turns=[];pendingTools=new Map;current=null;sessionId=null;cwd=null;title=null;firstQuestion=null;feedLine(s){const t=s.trim();if(!t)return;let e;try{e=JSON.parse(t)}catch{return}this.feed(e)}flush(){const s=this.current;s&&(s.question||s.response||s.tools.length)&&this.turns.push(s),this.current=null}ensure(){return this.current||(this.current={question:"",response:"",itemIds:[],tools:[]}),this.current}feed(s){if(s.type==="session"&&s.id&&!("timestamp"in s)){this.sessionId||(this.sessionId=s.id),s.cwd&&!this.cwd&&(this.cwd=s.cwd);return}if(s.type==="session/title"&&s.data?.title&&!this.title){this.title=s.data.title;return}if(s.type==="user/message"){const t=s,e=t.data?.source?.kind;if(e&&e!=="user")return;const n=l(t.data?.content).trim();if(!n)return;this.firstQuestion||(this.firstQuestion=n.split(`
3
3
  `)[0].slice(0,80)),this.flush();const o=this.ensure();o.question=n,o.itemIds=[t.data?.id??`u${t.seq}`],t.time&&(o.at=new Date(t.time).toISOString());return}if(s.type==="assistant/message"&&this.current){const t=s,e=t.data?.message?.content,n=l(e).trim(),o=t.data?.message?.id;o&&this.current.itemIds.push(o),n&&(this.current.response=this.current.response?`${this.current.response}
4
4
 
5
- ${n}`:n);return}if(s.type==="tool/call"){const t=s;if(!t.data?.callId||!t.data?.name)return;const e=/^run_code$/i.test(t.data.name)?"run":h(t.data.name),n=v(t.data.arguments),o=O(t.data.name,t.data.arguments??"",n),i=e==="run"?{}:I(n);this.pendingTools.set(t.data.callId,{name:t.data.name,call:o.text,truncated:o.truncated,op:e,paths:e==="run"?[]:y(n),...i});return}if(s.type==="tool/result"){const t=s,e=t.data?.message?.source?.callId;if(!e)return;const n=this.pendingTools.get(e);if(!n)return;const o=c(l(t.data?.message?.content),d),i=this.ensure(),u=q(t.data);i.tools.push({name:n.name,call:n.call,result:o.text,truncated:n.truncated||o.truncated,op:u?"other":n.op,nativeCallId:e,...u?{}:{...n.paths.length?{paths:n.paths}:{},...n.url?{url:n.url}:{},...n.locator?{locator:n.locator}:{}}}),this.pendingTools.delete(e);return}if(s.type==="tool/code-dispatch"||s.type==="tool/ptc-dispatch"){const t=s.data;if(!t?.name||!t.subCallId)return;const e=y(t.arguments),n=I(t.arguments);if(!e.length&&!n.url)return;if(t.isError===!0){const a=c(f(t.name,t.arguments),p),g=c(l(t.content),d);this.ensure().tools.push({name:t.name,call:a.text,result:g.text,truncated:a.truncated||g.truncated,op:"other",nativeCallId:t.subCallId});return}const o=h(t.name),i=c(f(t.name,t.arguments),o==="write"||o==="edit"?m:p),u=c(l(t.content),d);this.ensure().tools.push({name:t.name,call:i.text,result:u.text,truncated:i.truncated||u.truncated,op:o,nativeCallId:t.subCallId,...e.length?{paths:e}:{},...n.url?{url:n.url}:{},...n.locator?{locator:n.locator}:{}});return}}finish(){if(this.flush(),!this.sessionId)return null;const s=this.firstQuestion??null,t=this.title??s??`session ${this.sessionId.replace(/^session-/,"").slice(0,8)}`;return{sessionId:this.sessionId,title:t,turns:L(this.turns),...this.cwd?{cwd:this.cwd}:{}}}toConversation(){const s=this.finish();return!s||s.turns.length===0?null:{title:s.title,messageCount:s.turns.length,source:"dsh",sessionId:s.sessionId,build:()=>$(s.turns,s.sessionId,s.cwd)}}}function T(r){const s=new _;for(const t of r.split(`
6
- `))s.feedLine(t);return s}function $(r,s,t){const e=t?{cwd:t}:{},n=[],o=[];let i=null;for(const u of r){const a=C(u.question||"(tool-only turn)",u.response,i===null);a.data.importSource={runner:"dsh",sessionId:s,itemIds:u.itemIds,...e},a.data.source={question:a.data.question,response:a.data.response},a.data.attachments=S(u),b(a),n.push(a),i&&o.push({id:w(),source:i.id,target:a.id,type:"smoothstep"}),i=a}return{nodes:x(n,o),edges:o}}function F(r,s){const t=T(r).finish();return t?A(t.turns,t.sessionId,"dsh",s,t.cwd):null}function M(r){return T(r).toConversation()}export{_ as DshSessionCollector,$ as buildGraphFromTurns,F as dshSessionAsBranch,M as dshSessionConversation};
5
+ ${n}`:n);return}if(s.type==="tool/call"){const t=s;if(!t.data?.callId||!t.data?.name)return;const e=/^run_code$/i.test(t.data.name)?"run":h(t.data.name),n=v(t.data.arguments),o=O(t.data.name,t.data.arguments??"",n),i=e==="run"?{}:I(n);this.pendingTools.set(t.data.callId,{name:t.data.name,call:o.text,truncated:o.truncated,op:e,paths:e==="run"?[]:y(n),...i});return}if(s.type==="tool/result"){const t=s,e=t.data?.message?.source?.callId;if(!e)return;const n=this.pendingTools.get(e);if(!n)return;const o=c(l(t.data?.message?.content),d),i=this.ensure(),u=q(t.data);i.tools.push({name:n.name,call:n.call,result:o.text,truncated:n.truncated||o.truncated,op:u?"other":n.op,nativeCallId:e,...u?{}:{...n.paths.length?{paths:n.paths}:{},...n.url?{url:n.url}:{},...n.locator?{locator:n.locator}:{}}}),this.pendingTools.delete(e);return}if(s.type==="tool/code-dispatch"||s.type==="tool/ptc-dispatch"){const t=s.data;if(!t?.name||!t.subCallId)return;const e=y(t.arguments),n=I(t.arguments);if(!e.length&&!n.url)return;if(t.isError===!0){const a=c(f(t.name,t.arguments),p),g=c(l(t.content),d);this.ensure().tools.push({name:t.name,call:a.text,result:g.text,truncated:a.truncated||g.truncated,op:"other",nativeCallId:t.subCallId});return}const o=h(t.name),i=c(f(t.name,t.arguments),o==="write"||o==="edit"?m:p),u=c(l(t.content),d);this.ensure().tools.push({name:t.name,call:i.text,result:u.text,truncated:i.truncated||u.truncated,op:o,nativeCallId:t.subCallId,...e.length?{paths:e}:{},...n.url?{url:n.url}:{},...n.locator?{locator:n.locator}:{}});return}}finish(){if(this.flush(),!this.sessionId)return null;const s=this.firstQuestion??null,t=this.title??s??`session ${this.sessionId.replace(/^session-/,"").slice(0,8)}`;return{sessionId:this.sessionId,title:t,turns:A(this.turns),...this.cwd?{cwd:this.cwd}:{}}}toConversation(){const s=this.finish();return!s||s.turns.length===0?null:{title:s.title,messageCount:s.turns.length,source:"dsh",sessionId:s.sessionId,build:()=>$(s.turns,s.sessionId,s.cwd)}}}function T(r){const s=new _;for(const t of r.split(`
6
+ `))s.feedLine(t);return s}function $(r,s,t){const e=t?{cwd:t}:{},n=[],o=[];let i=null;for(const u of r){const a=C(u.question||"(tool-only turn)",u.response,i===null);a.data.importSource={runner:"dsh",sessionId:s,itemIds:u.itemIds,...e},a.data.source={question:a.data.question,response:a.data.response},a.data.attachments=S(u),b(a),n.push(a),i&&o.push({id:w(),source:i.id,target:a.id,type:"smoothstep"}),i=a}return{nodes:x(n,o),edges:o}}function B(r,s){const t=T(r).finish();return t?L(t.turns,t.sessionId,"dsh",s,t.cwd):null}function F(r){return T(r).toConversation()}export{_ as DshSessionCollector,$ as buildGraphFromTurns,B as dshSessionAsBranch,F as dshSessionConversation};
@@ -0,0 +1,2 @@
1
+ import{a as c,b as h,c as l,w as p,x as m,t as u,f as b}from"./index-8PjAYhti.js";const g=/\[ThoughtDAG anchor: project=([\w-]+) node=([\w-]+) bundle=([\w-]+)(?: mode=(branch|continue))?\]/;function w(o){const n=o.match(g);return n?{project:n[1],node:n[2],bundle:n[3],mode:n[4]==="continue"?"continue":"branch"}:null}function x(o,n){const e=[];e.push(c("exp.mdIntro")),e.push("");for(const s of o.context.messages){const t=s.content[0].text;switch(s.source.layer){case"system":e.push(`**${c("exp.mdRole")}** ${t}`);break;case"chain":e.push(s.role==="assistant"?`**A:** ${t}`:`**Q:** ${t}`);break;default:e.push(t)}e.push("")}return e.push("---"),e.push(c("exp.mdOutro")),e.push(""),e.push(`[ThoughtDAG anchor: project=${n.project} node=${n.node} bundle=${n.bundle}${n.mode==="continue"?" mode=continue":""}]`),e.join(`
2
+ `)}async function j(o,n="branch"){const e=h.getState(),s=l.getState().activeId??"default",t=await p(o,e.nodes,e.edges,{now:new Date().toISOString(),projectId:s,staleIds:m(e)}),d={project:s,node:o,bundle:t.id,mode:n},i=x(t,d);try{await navigator.clipboard.writeText(i)}catch{return u("error",c("exp.clipboardFailed")),!1}{const a=[...new Set(t.context.messages.map(r=>r.source?.node_id).filter(r=>!!r))];e.logEvent("commit",o,{kind:"bundle",sha:t.integrity.content_hash,bundle:t.id,n:t.context.messages.length,...a.length?{m:a.slice(0,200).join(",")}:{},...a.length>200?{more:!0}:{}})}return u("success",b(c("exp.copied"),{n:t.context.messages.length,tok:t.budget.estimated_tokens}),12e3),!0}export{w as parseAnchor,x as renderHandoffMarkdown,j as takeToExperiment};
@@ -1 +1 @@
1
- import{I as f}from"./index-D0VdUWYE.js";async function y(l){if(window.desktopAgents)return!0;const r=l.replace(/\/+$/,"");let i;try{const e=await fetch(r+"/agents/available",{credentials:"same-origin"});if(!e.ok)return!1;i=await e.json()}catch{return!1}const s=async(e,t)=>{const n=await fetch(r+e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify(t??{})});if(!n.ok)throw new Error(`${e}: ${n.status}`);return n.json()},c=[];let o=null;const d=()=>{o||(o=new EventSource(r+"/agents/events"),o.onmessage=e=>{try{const t=JSON.parse(e.data);for(const n of c)n(t)}catch{}})},w=f,g={nativePicker:w},p=()=>new Promise(e=>{if(!w)return e(null);const t=`cwd-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,n=u=>{const a=u.data;u.origin!==window.location.origin||a?.source!=="dsh-thoughtdag"||a.type!=="td:picked-cwd"||a.requestId!==t||(window.removeEventListener("message",n),a.unsupported&&(g.nativePicker=!1),e(typeof a.path=="string"&&a.path?a.path:null))};window.addEventListener("message",n),window.parent.postMessage({source:"dsh-thoughtdag",type:"td:pick-cwd",requestId:t},window.location.origin)});return window.desktopAgents={capabilities:g,available:async()=>i,models:async e=>(await fetch(r+"/agents/models"+(e?`?runtime=${encodeURIComponent(e)}`:""),{credentials:"same-origin"})).json(),run:async e=>(d(),(await s("/agents/run",e)).runId),abort:async e=>(await s("/agents/abort",{runId:e})).ok,answer:async(e,t,n)=>(await s("/agents/answer",{runId:e,requestId:t,response:n})).ok,workspace:async e=>(await s("/agents/workspace",{canvasId:e})).dir,pickCwd:()=>p(),guardWrite:async(e,t)=>(await s("/agents/guard",{cwd:e,config:t})).ok,writeMaterials:async(e,t)=>s("/agents/materials",{cwd:e,files:t}),onEvent:e=>{c.push(e),d()}},!0}export{y as installAgentsHttpBridge};
1
+ import{I as f}from"./index-8PjAYhti.js";async function y(l){if(window.desktopAgents)return!0;const r=l.replace(/\/+$/,"");let i;try{const e=await fetch(r+"/agents/available",{credentials:"same-origin"});if(!e.ok)return!1;i=await e.json()}catch{return!1}const s=async(e,t)=>{const n=await fetch(r+e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify(t??{})});if(!n.ok)throw new Error(`${e}: ${n.status}`);return n.json()},c=[];let o=null;const d=()=>{o||(o=new EventSource(r+"/agents/events"),o.onmessage=e=>{try{const t=JSON.parse(e.data);for(const n of c)n(t)}catch{}})},w=f,g={nativePicker:w},p=()=>new Promise(e=>{if(!w)return e(null);const t=`cwd-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,n=u=>{const a=u.data;u.origin!==window.location.origin||a?.source!=="dsh-thoughtdag"||a.type!=="td:picked-cwd"||a.requestId!==t||(window.removeEventListener("message",n),a.unsupported&&(g.nativePicker=!1),e(typeof a.path=="string"&&a.path?a.path:null))};window.addEventListener("message",n),window.parent.postMessage({source:"dsh-thoughtdag",type:"td:pick-cwd",requestId:t},window.location.origin)});return window.desktopAgents={capabilities:g,available:async()=>i,models:async e=>(await fetch(r+"/agents/models"+(e?`?runtime=${encodeURIComponent(e)}`:""),{credentials:"same-origin"})).json(),run:async e=>(d(),(await s("/agents/run",e)).runId),abort:async e=>(await s("/agents/abort",{runId:e})).ok,answer:async(e,t,n)=>(await s("/agents/answer",{runId:e,requestId:t,response:n})).ok,workspace:async e=>(await s("/agents/workspace",{canvasId:e})).dir,pickCwd:()=>p(),guardWrite:async(e,t)=>(await s("/agents/guard",{cwd:e,config:t})).ok,writeMaterials:async(e,t)=>s("/agents/materials",{cwd:e,files:t}),onEvent:e=>{c.push(e),d()}},!0}export{y as installAgentsHttpBridge};