@runfusion/fusion 0.41.0 → 0.42.0

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 (83) hide show
  1. package/dist/bin.js +44240 -41922
  2. package/dist/client/.vite/manifest.json +72 -72
  3. package/dist/client/assets/AgentDetailView-C5Lb3fd3.js +18 -0
  4. package/dist/client/assets/AgentDetailView-DiWELtb1.css +1 -0
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-VDXL4XQc.js → AgentPermissionPolicyEditor-DtRcvE6M.js} +2 -2
  6. package/dist/client/assets/{AgentsView-ChXccELt.js → AgentsView-BVW-NOYD.js} +3 -3
  7. package/dist/client/assets/ChatView-Dy-oIkrK.js +6 -0
  8. package/dist/client/assets/{DevServerView-DGOahw1o.js → DevServerView-DLsFSP4s.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-DgqHlxyh.js → DirectoryPicker-_QawX-uL.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-CbbZwzbH.js → DocumentsView-DierUJsj.js} +1 -1
  11. package/dist/client/assets/{EvalsView-BL_ue7fJ.js → EvalsView-B83lYKQl.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-8H4XAu4O.js → ExperimentalAgentOnboardingModal-CTctYTPU.js} +1 -1
  13. package/dist/client/assets/{GoalsView-CO4FVL3E.js → GoalsView-CKn8i0i0.js} +1 -1
  14. package/dist/client/assets/{InsightsView-C5vLvWVE.js → InsightsView-EpRHCD8G.js} +1 -1
  15. package/dist/client/assets/{MemoryView-BL3W3yOv.js → MemoryView-Df_ocTc5.js} +2 -2
  16. package/dist/client/assets/NodesView-DF7xJ_3z.js +14 -0
  17. package/dist/client/assets/{PiExtensionsManager-HvSiVeDN.js → PiExtensionsManager-BOooOEDx.js} +2 -2
  18. package/dist/client/assets/{PluginManager-DIjrlhnU.js → PluginManager-CHrDAzK6.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-C2jQX8xZ.js → PullRequestView-CJU21OZ6.js} +2 -2
  20. package/dist/client/assets/{ReliabilityView-DbqEwoRs.js → ReliabilityView-uHkW1Qeu.js} +1 -1
  21. package/dist/client/assets/{ResearchView-C1QghmLI.js → ResearchView-oZ2-vbjL.js} +1 -1
  22. package/dist/client/assets/{SecretsView-Y2MQ-9n5.js → SecretsView-BpkqSV_E.js} +1 -1
  23. package/dist/client/assets/SessionTerminal-D9IW4cDj.js +2 -0
  24. package/dist/client/assets/{SettingsModal-DabcZZ6S.js → SettingsModal-BmB5l2bA.js} +1 -1
  25. package/dist/client/assets/SettingsModal-C8gsAazm.js +31 -0
  26. package/dist/client/assets/{SetupWizardModal-Db-Rxinm.js → SetupWizardModal-BYLEU_7o.js} +1 -1
  27. package/dist/client/assets/{SkillsView-CIEY1-DE.js → SkillsView-8GgQ8Z_Z.js} +1 -1
  28. package/dist/client/assets/{StashRecoveryView-B6iDu5tI.js → StashRecoveryView-CT1t1Uf2.js} +1 -1
  29. package/dist/client/assets/{TodoView-B8IK_BPM.js → TodoView-BUj6ITAb.js} +2 -2
  30. package/dist/client/assets/WorkflowNodeEditor-CN7GPmvV.js +8 -0
  31. package/dist/client/assets/WorkflowNodeEditor-aPj8cv81.css +1 -0
  32. package/dist/client/assets/app-B2ZxMfJT.js +13 -0
  33. package/dist/client/assets/app-BffGU_HQ.js +13 -0
  34. package/dist/client/assets/app-C8AHhs5N.js +13 -0
  35. package/dist/client/assets/app-DCot4oXA.js +13 -0
  36. package/dist/client/assets/app-Ri9Te2Dv.js +13 -0
  37. package/dist/client/assets/app-sEkTyT-w.js +13 -0
  38. package/dist/client/assets/{dashboard-view-O5j3PSGY.js → dashboard-view-C3SsjXo1.js} +1621 -1621
  39. package/dist/client/assets/{dashboard-view-Dn4CztR6.js → dashboard-view-CrYwb0oQ.js} +1 -1
  40. package/dist/client/assets/dashboard-view-Du53JbmQ.css +1 -0
  41. package/dist/client/assets/{folder-open-C9XAaduE.js → folder-open-CREXTATY.js} +1 -1
  42. package/dist/client/assets/index-2kYpdJrx.js +793 -0
  43. package/dist/client/assets/index-CJUfvGdC.css +1 -0
  44. package/dist/client/assets/{upload-BRAEugYV.js → upload-BvLUlwaH.js} +1 -1
  45. package/dist/client/assets/{users-BlflbMZ3.js → users-CjhbU-sF.js} +1 -1
  46. package/dist/client/index.html +2 -2
  47. package/dist/client/version.json +1 -1
  48. package/dist/droid-cli/package.json +1 -1
  49. package/dist/extension.js +43622 -41519
  50. package/dist/pi-claude-cli/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  52. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +59 -8
  54. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  55. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  56. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  57. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  58. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  59. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  60. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  61. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  62. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  63. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  64. package/package.json +2 -1
  65. package/skill/fusion/references/extension-tools.md +3 -3
  66. package/skill/fusion/references/fusion-capabilities.md +2 -2
  67. package/dist/client/assets/AgentDetailView-CY-O6VkV.css +0 -1
  68. package/dist/client/assets/AgentDetailView-krC0B2O0.js +0 -18
  69. package/dist/client/assets/ChatView-Dz_xBKit.js +0 -6
  70. package/dist/client/assets/NodesView-DfBNNm9c.js +0 -14
  71. package/dist/client/assets/SessionTerminal-DaTXNT3A.js +0 -2
  72. package/dist/client/assets/SettingsModal-BAzm2kYd.js +0 -31
  73. package/dist/client/assets/WorkflowNodeEditor-DaPyvD_R.js +0 -8
  74. package/dist/client/assets/WorkflowNodeEditor-Po5uv_dN.css +0 -1
  75. package/dist/client/assets/app-CTRT_hQh.js +0 -13
  76. package/dist/client/assets/app-CVg6W-HU.js +0 -13
  77. package/dist/client/assets/app-CY3pQXOr.js +0 -13
  78. package/dist/client/assets/app-DNh04p5I.js +0 -13
  79. package/dist/client/assets/app-DhHgtB9j.js +0 -13
  80. package/dist/client/assets/app-NL_hPGDS.js +0 -13
  81. package/dist/client/assets/dashboard-view-BgiLoG1G.css +0 -1
  82. package/dist/client/assets/index-BHGM5W8a.css +0 -1
  83. package/dist/client/assets/index-CgfrecpF.js +0 -793
@@ -1 +1 @@
1
- import{r as t,j as R}from"./vendor-react-D37HfzIf.js";import{cK as Ee,cL as Ye,t as _e,w as Xe,bo as ve}from"./index-CgfrecpF.js";import{Z as Ae,a as je,M as $e,R as Ge}from"./zoom-out-CSTHbJgD.js";import"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";import"./createLucideIcon-BYvOGRiO.js";const ye=4,xe=300,We=24;function Le({taskId:r,position:s,scale:o,canDrag:a,onPositionChange:f,onDragStateChange:c,onDragEnd:m,onDoubleTap:b}){const[C,I]=t.useState(!1),k=t.useRef(null),T=t.useRef(s),E=t.useRef(!1),n=t.useRef(null),h=t.useRef(!1);T.current=s,h.current=C;const l=t.useCallback(()=>{n.current=null},[]),M=t.useCallback(u=>{k.current=null,I(!1),h.current=!1,u&&(c?.(!1),m?.(),E.current=!0,l())},[m,c,l]),z=t.useCallback(u=>{if(!u.isPrimary)return;if(u.defaultPrevented){l();return}const P=Date.now();n.current&&P-n.current.timeStamp>xe&&l(),a&&u.stopPropagation();const D=u.currentTarget;a&&typeof D.setPointerCapture=="function"&&D.setPointerCapture(u.pointerId),k.current={pointerId:u.pointerId,pointerType:u.pointerType,startPointer:{x:u.clientX,y:u.clientY},startPosition:T.current,defaultPrevented:u.defaultPrevented,movedBeyondThreshold:!1}},[a,l]),_=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation();const D=u.clientX-P.startPointer.x,X=u.clientY-P.startPointer.y,ee=Math.hypot(D,X);if(ee>=ye&&(P.movedBeyondThreshold=!0),!a){P.movedBeyondThreshold&&l();return}if(!h.current&&ee>=ye&&(I(!0),h.current=!0,c?.(!0),l()),ee<ye)return;const L=o>0?o:1;f(r,{x:P.startPosition.x+D/L,y:P.startPosition.y+X/L})},[a,c,f,l,o,r]),W=t.useCallback((u,P)=>{if(!b||P.defaultPrevented||P.movedBeyondThreshold)return Date.now()-(n.current?.timeStamp??0)>xe&&l(),!1;if(P.pointerType==="mouse")return l(),!1;const D={timeStamp:Date.now(),point:{x:P.startPointer.x,y:P.startPointer.y}},X=n.current;return!X||D.timeStamp-X.timeStamp>xe||Math.hypot(D.point.x-X.point.x,D.point.y-X.point.y)>We?(n.current=D,!1):(E.current=!0,l(),b(),!0)},[b,l]),$=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId);const D=h.current;!D&&W(u,P)&&u.preventDefault(),M(D)},[a,M,W]),G=t.useCallback(u=>{const P=k.current;!P||P.pointerId!==u.pointerId||(a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId),l(),M(h.current))},[a,M,l]),j=t.useCallback(u=>{E.current&&(E.current=!1,u.preventDefault(),u.stopPropagation())},[]);return t.useMemo(()=>({isDragging:C,onPointerDown:z,onPointerMove:_,onPointerUp:$,onPointerCancel:G,onClickCapture:j}),[C,j,G,z,_,$])}const Ue=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Fe(r){return r?r.charAt(0).toUpperCase()+r.slice(1):"Executing"}function Be({style:r,position:s,scale:o,isSelected:a=!1,isHighlighted:f=!1,isDimmed:c=!1,onMouseEnter:m,onMouseLeave:b,onClick:C,onNodePositionChange:I,onNodeDragStateChange:k,onNodeDragEnd:T,...E}){const{task:n,globalPaused:h,taskStuckTimeoutMs:l,lastFetchTimeMs:M,onOpenDetail:z}=E,_=n.status==="failed",W=n.paused===!0,$=Ee(n,l,M),G=n.column==="triage"&&n.status==="awaiting-approval",j=!h&&!_&&!W&&!$&&!G&&(n.column==="in-progress"||Ue.has(n.status)),u=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,P=n.column==="in-review",D=Le({taskId:n.id,position:s,scale:o,canDrag:a,onPositionChange:I,onDragStateChange:k,onDragEnd:T,onDoubleTap:()=>z(n)});return R.jsxs("div",{className:`graph-task-node${a?" graph-node--draggable graph-task-node--selected":""}${D.isDragging?" graph-node--dragging":""}${f?" graph-task-node--highlighted graph-node--highlighted":""}${c?" graph-task-node--dimmed graph-node--dimmed":""}${j?" graph-task-node--active":""}${P?" graph-task-node--in-review":""}`,style:r,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":j&&u?String(n.currentStep):void 0,onMouseEnter:m,onMouseLeave:b,onClick:C,onDoubleClick:X=>{X.defaultPrevented||z(n)},onClickCapture:D.onClickCapture,onPointerDown:D.onPointerDown,onPointerMove:D.onPointerMove,onPointerUp:D.onPointerUp,onPointerCancel:D.onPointerCancel,children:[j?R.jsx("div",{className:"graph-task-active-indicator",children:R.jsx("span",{className:"graph-task-active-indicator-text",children:Fe(n.status)})}):null,R.jsx(Ye,{...E,onOpenDetail:()=>{},disableDrag:!0})]})}function Ze({zoom:r,onZoomIn:s,onZoomOut:o,onFitToGraph:a,onResetView:f}){return R.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[R.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:s,children:R.jsx(Ae,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:o,children:R.jsx(je,{size:16})}),R.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(r*100),"%"]}),R.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:a,children:R.jsx($e,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:f,children:R.jsx(Ge,{size:16})})]})}const Ve=280,Ke=100;function qe({edges:r,positions:s,nodeWidth:o=Ve,nodeHeight:a=Ke,nodeHeights:f,highlightedEdgeIds:c}){const m=!!(c&&c.size>0);return R.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[R.jsx("defs",{children:R.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:R.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),r.map(b=>{const C=s.get(b.source),I=s.get(b.target);if(!C||!I)return null;const k=`${b.source}->${b.target}`,T=m&&(c?.has(k)??!1),E=C.x+o/2,n=C.y+(f?.get(b.source)??a),h=I.x+o/2,l=I.y,M=n+(l-n)/2;return R.jsx("path",{"data-testid":"dependency-edge","data-edge-id":k,className:`dependency-graph-edge${T?" graph-edge--highlighted":""}${m&&!T?" graph-edge--dimmed":""}`,d:`M ${E} ${n} C ${E} ${M}, ${h} ${M}, ${h} ${l}`,fill:"none",stroke:T?"var(--todo)":"var(--border)",strokeWidth:T?"var(--space-xs)":"var(--btn-border-width)",opacity:m&&!T?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},k)})]})}const Je=new Set(["triage","todo","in-progress","in-review"]);function Qe(r){return r.filter(s=>Je.has(s.column))}const et={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80,orientation:"vertical"};function we(r,s){const o={...et,...s},a=r.nodes.map(n=>n.task.id);if(a.length===0)return new Map;const f=new Map,c=new Map;for(const n of a)c.set(n,0),f.set(n,[]);for(const n of r.edges)!c.has(n.source)||!c.has(n.target)||(f.get(n.target)?.push(n.source),c.set(n.source,(c.get(n.source)??0)+1));const m=a.filter(n=>(c.get(n)??0)===0),b=[];for(;m.length>0;){const n=m.shift();b.push(n);for(const h of f.get(n)??[]){const l=(c.get(h)??0)-1;c.set(h,l),l===0&&m.push(h)}}for(const n of a)b.includes(n)||b.push(n);const C=new Map;for(const n of b){const h=r.edges.filter(M=>M.source===n).map(M=>M.target);let l=0;for(const M of h)l=Math.max(l,(C.get(M)??0)+1);C.set(n,l)}const I=new Map;for(const n of a){const h=C.get(n)??0,l=I.get(h)??[];l.push(n),I.set(h,l)}const k=new Map,T=Array.from(I.keys()).sort((n,h)=>n-h),E=new Map;if(o.orientation==="vertical"){let n=0;for(const h of T){E.set(h,n);const l=I.get(h)??[],M=Math.max(o.nodeHeight,...l.map(z=>o.measuredHeights?.get(z)??o.nodeHeight));n+=M+o.verticalGap}}for(const n of T){const h=I.get(n)??[];if(h.sort(),o.orientation==="horizontal"){const W=-(h.reduce((j,u)=>j+(o.measuredHeights?.get(u)??o.nodeHeight),0)+Math.max(0,h.length-1)*o.verticalGap)/2,$=n*(o.nodeWidth+o.horizontalGap);let G=W;for(const j of h)k.set(j,{x:$,y:G}),G+=(o.measuredHeights?.get(j)??o.nodeHeight)+o.verticalGap;continue}const z=-(h.length*o.nodeWidth+Math.max(0,h.length-1)*o.horizontalGap)/2;h.forEach((_,W)=>{const $=z+W*(o.nodeWidth+o.horizontalGap),G=E.get(n)??n*(o.nodeHeight+o.verticalGap);k.set(_,{x:$,y:G})})}return k}function tt(r){return t.useMemo(()=>{const s=r.map(f=>({task:f})),o=new Set(r.map(f=>f.id)),a=r.flatMap(f=>(f.dependencies??[]).filter(c=>o.has(c)).map(c=>({source:f.id,target:c})));return{nodes:s,edges:a}},[r])}const ce=.1,ue=3,Se=40,nt=200;function J(r,s,o){return Math.min(o,Math.max(s,r))}function rt(r){if(!(r instanceof HTMLElement))return!1;const s=r.tagName.toLowerCase();return r.isContentEditable||s==="input"||s==="textarea"||s==="select"}function ot(){const[r,s]=t.useState({x:0,y:0}),[o,a]=t.useState(1),[f,c]=t.useState(!1),m=t.useRef(r),b=t.useRef(o),C=t.useRef(null),I=t.useRef(null),k=t.useRef(new Map),T=t.useRef(null),E=t.useRef({minX:0,minY:0,maxX:0,maxY:0});t.useEffect(()=>{m.current=r},[r]),t.useEffect(()=>{b.current=o},[o]),t.useEffect(()=>()=>{C.current!==null&&window.clearTimeout(C.current)},[]);const n=t.useMemo(()=>`translate(${r.x}px, ${r.y}px) scale(${o})`,[r.x,r.y,o]),h=t.useMemo(()=>Math.round(o*100),[o]),l=t.useCallback(i=>{if(!i){C.current!==null&&(window.clearTimeout(C.current),C.current=null),c(!1);return}c(!0),C.current!==null&&window.clearTimeout(C.current),C.current=window.setTimeout(()=>{c(!1),C.current=null},nt)},[]),M=t.useCallback((i,d,g,S=b.current)=>{const x=E.current;if(x.maxX<=x.minX||x.maxY<=x.minY)return{x:J(i.x,-d,d),y:J(i.y,-g,g)};const U=d-x.maxX*S,O=-x.minX*S,v=g-x.maxY*S,B=-x.minY*S,Z=U>O?(U+O)/2:J(i.x,U,O),K=v>B?(v+B)/2:J(i.y,v,B);return{x:Z,y:K}},[]),z=t.useCallback((i,d,g,S)=>{const x=b.current,U=m.current,O=J(i,ce,ue),v=O/x,B=M({x:d.x-(d.x-U.x)*v,y:d.y-(d.y-U.y)*v},g,S,O);a(O),s(B)},[M]),_=t.useCallback((i,d,g,S)=>{l(!1);const x=S??{x:d/2,y:g/2};z(b.current*i,x,d,g)},[l,z]),W=t.useCallback((i,d)=>{if(i&&d){_(1.2,i,d);return}a(g=>J(g+.1,ce,ue))},[_]),$=t.useCallback((i,d)=>{if(i&&d){_(1/1.2,i,d);return}a(g=>J(g-.1,ce,ue))},[_]),G=t.useCallback(()=>{l(!0),s({x:0,y:0}),a(1)},[l]),j=t.useCallback((i,d,g,S)=>{if(l(!0),i.size===0){s({x:0,y:0}),a(1);return}const x=S?.nodeWidth??280,U=S?.nodeHeight??100,O=Array.from(i.entries()),v=Math.min(...O.map(([,q])=>q.x)),B=Math.min(...O.map(([,q])=>q.y)),Z=Math.max(...O.map(([,q])=>q.x+x)),K=Math.max(...O.map(([q,he])=>he.y+(S?.measuredHeights?.get(q)??U))),te=Math.max(1,Z-v),A=Math.max(1,K-B),oe=Math.max(1,d-Se*2),se=Math.max(1,g-Se*2),ne=J(Math.min(oe/te,se/A),ce,ue),pe=(d-te*ne)/2-v*ne,de=(g-A*ne)/2-B*ne;a(ne),s(M({x:pe,y:de},d,g,ne))},[M,l]),u=t.useCallback((i,d)=>{if(k.current.set(i,d),k.current.size===2){const[g,S]=Array.from(k.current.values());T.current={distance:Math.hypot(g.x-S.x,g.y-S.y),zoom:b.current,pan:m.current,midpoint:{x:(g.x+S.x)/2,y:(g.y+S.y)/2}},I.current=null;return}I.current={start:d,panStart:m.current}},[]),P=t.useCallback((i,d,g,S)=>{if(k.current.has(i)&&k.current.set(i,d),k.current.size===2&&T.current){l(!1);const[O,v]=Array.from(k.current.values()),Z=Math.hypot(O.x-v.x,O.y-v.y)/Math.max(1,T.current.distance),K={x:(O.x+v.x)/2,y:(O.y+v.y)/2},te=J(T.current.zoom*Z,ce,ue),A=te/T.current.zoom,oe=M({x:K.x-(T.current.midpoint.x-T.current.pan.x)*A,y:K.y-(T.current.midpoint.y-T.current.pan.y)*A},g,S);a(te),s(oe);return}const x=I.current;if(!x)return;l(!1);const U={x:x.panStart.x+(d.x-x.start.x),y:x.panStart.y+(d.y-x.start.y)};s(M(U,g,S))},[M,l]),D=t.useCallback(i=>{if(k.current.delete(i),k.current.size<2&&(T.current=null),k.current.size===1){const[d]=Array.from(k.current.values());I.current={start:d,panStart:m.current};return}k.current.size===0&&(I.current=null)},[]),X=t.useCallback((i,d,g,S)=>{l(!1);const x={x:m.current.x-i,y:m.current.y-d};s(M(x,g,S))},[M,l]),ee=t.useCallback((i,d,g,S)=>{const x=i<0?1.1:.9;l(!1),z(b.current*x,d,g,S)},[l,z]),L=t.useCallback(i=>{E.current=i},[]),le=t.useCallback((i,d,g,S,x)=>{if(rt(i.target))return;const U=i.metaKey||i.ctrlKey;if(i.key==="Escape"){i.preventDefault(),G();return}if(U){if(i.key==="="||i.key==="+"){i.preventDefault(),_(1.2,d,g);return}if(i.key==="-"){i.preventDefault(),_(1/1.2,d,g);return}if(i.key==="0"){i.preventDefault(),G();return}(i.key==="f"||i.key==="F")&&i.shiftKey&&(i.preventDefault(),j(S,d,g,x))}},[j,G,_]);return{pan:r,zoom:o,zoomPercent:h,transform:n,transitioning:f,zoomIn:W,zoomOut:$,resetView:G,fitToGraph:j,setAnimate:l,onPointerDown:u,onPointerMove:P,onPointerUp:D,onWheelPan:X,onWheelZoom:ee,handleKeyDown:le,setGraphBounds:L}}function st(r){const{upstreamMap:s,downstreamMap:o}=t.useMemo(()=>{const f=new Map,c=new Map;for(const m of r)f.set(m.id,new Set(m.dependencies??[])),c.has(m.id)||c.set(m.id,new Set);for(const m of r)for(const b of m.dependencies??[])c.has(b)||c.set(b,new Set),c.get(b)?.add(m.id);return{upstreamMap:f,downstreamMap:c}},[r]);return{getChain:t.useCallback(f=>{if(!s.has(f)&&!o.has(f))return new Set;const c=new Set([f]),m=(b,C)=>{const I=[b],k=new Set([b]);for(;I.length>0;){const T=I.shift();if(!T)continue;const E=C.get(T);if(E)for(const n of E)k.has(n)||(k.add(n),c.add(n),I.push(n))}};return m(f,s),m(f,o),c},[o,s])}}const ke="fusion-plugin-dependency-graph:positions";function fe(r){if(!r||typeof r!="object")return!1;const s=r;return typeof s.x=="number"&&Number.isFinite(s.x)&&typeof s.y=="number"&&Number.isFinite(s.y)}function it(r){const s=_e(ke,r);if(!s)return{};try{const o=JSON.parse(s);if(!o||typeof o!="object")return{};const a={};for(const[f,c]of Object.entries(o))fe(c)&&(a[f]=c);return a}catch{return{}}}function at(r,s,o){const a={};for(const[f,c]of Object.entries(r))s.has(f)&&fe(c)&&(a[f]=c);Xe(ke,JSON.stringify(a),o)}function ct(r){ve(ke,r)}function ut(r,s,o){const a={};for(const[f,c]of Object.entries(r))o.has(f)&&fe(c)&&(a[f]=c);for(const[f,c]of Object.entries(s))o.has(f)&&fe(c)&&(a[f]=c);return a}function lt(r,s){const o={};for(const[a,f]of Object.entries(r))s.has(a)&&(o[a]=f);return o}function dt({projectId:r,visibleTaskIds:s}){const[o,a]=t.useState(null);t.useEffect(()=>{a(it(r))},[r]);const f=t.useCallback(m=>{at(m,s,r),a(lt(m,s))},[r,s]),c=t.useCallback(()=>{ct(r),a(null)},[r]);return{savedPositions:o,persistPositions:f,clearSavedPositions:c}}const ae=280,Q=100,ft=768,Te=4;function pt({tasks:r,projectId:s,onOpenTaskDetail:o,onOpenDetail:a,addToast:f,globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M}){const z=t.useRef(null),_=t.useRef(!1),W=t.useRef(null),$=t.useRef(!1),G=t.useRef(new Map),[j,u]=t.useState(null),[P,D]=t.useState(null),[X,ee]=t.useState({width:0,height:0}),[L,le]=t.useState(new Map),i=t.useMemo(()=>Qe(r),[r]),d=tt(i),{getChain:g}=st(i),S=j??P,x=t.useMemo(()=>S?g(S):new Set,[S,g]),U=t.useMemo(()=>{const e=X.width||(typeof window<"u"?window.innerWidth:0);return(X.height||(typeof window<"u"?window.innerHeight:0))>e||e<ft?"horizontal":"vertical"},[X.height,X.width]),O=t.useMemo(()=>({nodeWidth:ae,nodeHeight:Q,horizontalGap:40,verticalGap:80,orientation:U,measuredHeights:L}),[L,U]),v=t.useMemo(()=>we(d,O),[d,O]),B=t.useMemo(()=>new Set(i.map(e=>e.id)),[i]),{savedPositions:Z,persistPositions:K,clearSavedPositions:te}=dt({projectId:s,visibleTaskIds:B}),[A,oe]=t.useState(v),[se,ne]=t.useState(!1);t.useEffect(()=>{const e={};for(const[y,H]of v.entries())e[y]=H;const p=Z?ut(e,Z,B):e;oe(new Map(Object.entries(p)))},[v,Z,B]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=(H,Y)=>{ee(w=>w.width===H&&w.height===Y?w:{width:H,height:Y})};if(typeof ResizeObserver>"u"){p(e.clientWidth||(typeof window<"u"?window.innerWidth:0),e.clientHeight||(typeof window<"u"?window.innerHeight:0));return}p(e.clientWidth,e.clientHeight);const y=new ResizeObserver(H=>{const Y=H[0];Y&&p(Y.contentRect.width,Y.contentRect.height)});return y.observe(e),()=>y.disconnect()},[]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=new Set(d.nodes.map(w=>w.task.id)),y=new Map;for(const w of p){const N=e.querySelector(`[data-testid="graph-task-node-${w}"]`);N&&y.set(w,N)}G.current=y,le(w=>{let N=!1;const F=new Map;for(const[re,ie]of w.entries()){if(!p.has(re)){N=!0;continue}F.set(re,ie)}return N?F:w});const H=(w,N)=>{le(F=>{const re=F.get(w);if(re!==void 0&&Math.abs(re-N)<1)return F;const ie=new Map(F);return ie.set(w,N),ie})};for(const[w,N]of y.entries())H(w,N.offsetHeight||Q);if(typeof ResizeObserver>"u")return;const Y=new ResizeObserver(w=>{for(const N of w){const F=N.target,re=Array.from(y.entries()).find(([,ie])=>ie===F)?.[0];re&&H(re,F.offsetHeight||Q)}});for(const w of y.values())Y.observe(w);return()=>Y.disconnect()},[d.nodes,A,X.height,X.width]);const{transform:pe,zoom:de,transitioning:q,zoomIn:he,zoomOut:Ce,resetView:De,fitToGraph:me,onPointerDown:Re,onPointerMove:Ie,onPointerUp:be,onWheelPan:ze,onWheelZoom:He,handleKeyDown:Ne,setGraphBounds:Me}=ot();t.useEffect(()=>{if(_.current||i.length===0)return;if(!!(Z&&Object.keys(Z).length>0)){_.current=!0;return}const p=z.current;p&&(me(A,p.clientWidth,p.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L}),_.current=!0)},[i.length,me,L,A,Z]);const V=t.useMemo(()=>{const e=Array.from(A.values());if(e.length===0)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};const p=Math.min(...e.map(w=>w.x)),y=Math.min(...e.map(w=>w.y)),H=Math.max(...e.map(w=>w.x+ae)),Y=Math.max(...Array.from(A.entries()).map(([w,N])=>N.y+(L.get(w)??Q)));return{minX:p,minY:y,maxX:H,maxY:Y,width:Math.max(0,H-p),height:Math.max(0,Y-y)}},[L,A]),ge=t.useMemo(()=>{if(A.size===0)return A;const e=new Map;for(const[p,y]of A.entries())e.set(p,{x:y.x-V.minX,y:y.y-V.minY});return e},[V.minX,V.minY,A]);t.useEffect(()=>{Me({minX:0,minY:0,maxX:V.width,maxY:V.height})},[V.height,V.width,Me]);const Pe=t.useCallback(()=>{te();const e=we(d,O);oe(e)},[te,d,O]),Oe=t.useCallback(()=>{const e={};for(const[p,y]of A.entries())e[p]=y;K(e)},[K,A]);return R.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[R.jsx("div",{ref:z,className:"dependency-graph__viewport",onPointerDown:e=>{se||(W.current={x:e.clientX,y:e.clientY},$.current=!1,Re(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(se)return;const p=z.current;if(!p)return;const y=W.current;if(y){const H=Math.abs(e.clientX-y.x),Y=Math.abs(e.clientY-y.y);(H>Te||Y>Te)&&($.current=!0)}Ie(e.pointerId,{x:e.clientX,y:e.clientY},p.clientWidth,p.clientHeight)},onPointerUp:e=>{se||be(e.pointerId),W.current=null},onPointerCancel:e=>{se||be(e.pointerId),W.current=null,$.current=!1},onWheel:e=>{e.preventDefault();const p=z.current;if(p){if(e.ctrlKey||e.metaKey){const y=p.getBoundingClientRect();He(e.deltaY,{x:e.clientX-y.left,y:e.clientY-y.top},p.clientWidth,p.clientHeight);return}ze(e.deltaX,e.deltaY,p.clientWidth,p.clientHeight)}},onKeyDown:e=>{const p=z.current;p&&Ne(e,p.clientWidth,p.clientHeight,ge,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},tabIndex:0,onClick:()=>{$.current||se||D(null)},children:i.length===0?R.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):R.jsxs("div",{className:`graph-canvas-transform${q?" graph-canvas-transform--animate":""}`,style:{transform:pe,width:`${V.width}px`,height:`${V.height}px`},children:[R.jsx(qe,{edges:d.edges,positions:ge,nodeWidth:ae,nodeHeight:Q,nodeHeights:L,highlightedEdgeIds:x.size>0?new Set(d.edges.filter(e=>x.has(e.source)&&x.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),R.jsx("div",{className:"dependency-graph__nodes-layer",children:d.nodes.map(e=>{const p=ge.get(e.task.id);return p?R.jsx(Be,{task:e.task,projectId:s,isSelected:P===e.task.id,style:{minHeight:`${Q}px`,left:`${p.x}px`,top:`${p.y}px`},position:p,scale:de,onNodePositionChange:(y,H)=>{oe(Y=>{const w={x:H.x+V.minX,y:H.y+V.minY},N=Y.get(y);if(N&&N.x===w.x&&N.y===w.y)return Y;const F=new Map(Y);return F.set(y,w),F})},onNodeDragStateChange:ne,onNodeDragEnd:Oe,isHighlighted:x.size>0&&x.has(e.task.id),isDimmed:x.size>0&&!x.has(e.task.id),onOpenDetail:a??(y=>o?.(y.id)),addToast:f??(()=>{}),globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M,onMouseEnter:()=>u(e.task.id),onMouseLeave:()=>u(null),onClick:y=>{y.stopPropagation(),$.current=!1,D(H=>H===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),R.jsx(Ze,{zoom:de,onZoomIn:()=>{const e=z.current;e&&he(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=z.current;e&&Ce(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{Pe();const e=z.current;if(!e)return;const p=we(d,O),y=new Map,H=Array.from(p.values()),Y=H.length>0?Math.min(...H.map(N=>N.x)):0,w=H.length>0?Math.min(...H.map(N=>N.y)):0;for(const[N,F]of p.entries())y.set(N,{x:F.x-Y,y:F.y-w});me(y,e.clientWidth,e.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},onResetView:()=>{Pe(),De()}})]})}function ht(r){return new Map((r??[]).map(s=>[s.id,s.name]))}function Pt({context:r}){return t.createElement(pt,{tasks:r?.tasks??[],projectId:r?.projectId,workflowStepNameLookup:ht(r?.workflowSteps),onOpenDetail:r?.openTaskDetail})}export{pt as DependencyGraph,Pt as DependencyGraphDashboardView,Pt as default};
1
+ import{r as t,j as R}from"./vendor-react-D37HfzIf.js";import{cL as Ee,cM as Ye,t as _e,w as Xe,bo as ve}from"./index-2kYpdJrx.js";import{Z as Ae,a as je,M as $e,R as Ge}from"./zoom-out-CSTHbJgD.js";import"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";import"./createLucideIcon-BYvOGRiO.js";const ye=4,xe=300,We=24;function Le({taskId:r,position:s,scale:o,canDrag:a,onPositionChange:f,onDragStateChange:c,onDragEnd:m,onDoubleTap:b}){const[C,I]=t.useState(!1),k=t.useRef(null),T=t.useRef(s),E=t.useRef(!1),n=t.useRef(null),h=t.useRef(!1);T.current=s,h.current=C;const l=t.useCallback(()=>{n.current=null},[]),M=t.useCallback(u=>{k.current=null,I(!1),h.current=!1,u&&(c?.(!1),m?.(),E.current=!0,l())},[m,c,l]),z=t.useCallback(u=>{if(!u.isPrimary)return;if(u.defaultPrevented){l();return}const P=Date.now();n.current&&P-n.current.timeStamp>xe&&l(),a&&u.stopPropagation();const D=u.currentTarget;a&&typeof D.setPointerCapture=="function"&&D.setPointerCapture(u.pointerId),k.current={pointerId:u.pointerId,pointerType:u.pointerType,startPointer:{x:u.clientX,y:u.clientY},startPosition:T.current,defaultPrevented:u.defaultPrevented,movedBeyondThreshold:!1}},[a,l]),_=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation();const D=u.clientX-P.startPointer.x,X=u.clientY-P.startPointer.y,ee=Math.hypot(D,X);if(ee>=ye&&(P.movedBeyondThreshold=!0),!a){P.movedBeyondThreshold&&l();return}if(!h.current&&ee>=ye&&(I(!0),h.current=!0,c?.(!0),l()),ee<ye)return;const L=o>0?o:1;f(r,{x:P.startPosition.x+D/L,y:P.startPosition.y+X/L})},[a,c,f,l,o,r]),W=t.useCallback((u,P)=>{if(!b||P.defaultPrevented||P.movedBeyondThreshold)return Date.now()-(n.current?.timeStamp??0)>xe&&l(),!1;if(P.pointerType==="mouse")return l(),!1;const D={timeStamp:Date.now(),point:{x:P.startPointer.x,y:P.startPointer.y}},X=n.current;return!X||D.timeStamp-X.timeStamp>xe||Math.hypot(D.point.x-X.point.x,D.point.y-X.point.y)>We?(n.current=D,!1):(E.current=!0,l(),b(),!0)},[b,l]),$=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId);const D=h.current;!D&&W(u,P)&&u.preventDefault(),M(D)},[a,M,W]),G=t.useCallback(u=>{const P=k.current;!P||P.pointerId!==u.pointerId||(a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId),l(),M(h.current))},[a,M,l]),j=t.useCallback(u=>{E.current&&(E.current=!1,u.preventDefault(),u.stopPropagation())},[]);return t.useMemo(()=>({isDragging:C,onPointerDown:z,onPointerMove:_,onPointerUp:$,onPointerCancel:G,onClickCapture:j}),[C,j,G,z,_,$])}const Ue=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Fe(r){return r?r.charAt(0).toUpperCase()+r.slice(1):"Executing"}function Be({style:r,position:s,scale:o,isSelected:a=!1,isHighlighted:f=!1,isDimmed:c=!1,onMouseEnter:m,onMouseLeave:b,onClick:C,onNodePositionChange:I,onNodeDragStateChange:k,onNodeDragEnd:T,...E}){const{task:n,globalPaused:h,taskStuckTimeoutMs:l,lastFetchTimeMs:M,onOpenDetail:z}=E,_=n.status==="failed",W=n.paused===!0,$=Ee(n,l,M),G=n.column==="triage"&&n.status==="awaiting-approval",j=!h&&!_&&!W&&!$&&!G&&(n.column==="in-progress"||Ue.has(n.status)),u=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,P=n.column==="in-review",D=Le({taskId:n.id,position:s,scale:o,canDrag:a,onPositionChange:I,onDragStateChange:k,onDragEnd:T,onDoubleTap:()=>z(n)});return R.jsxs("div",{className:`graph-task-node${a?" graph-node--draggable graph-task-node--selected":""}${D.isDragging?" graph-node--dragging":""}${f?" graph-task-node--highlighted graph-node--highlighted":""}${c?" graph-task-node--dimmed graph-node--dimmed":""}${j?" graph-task-node--active":""}${P?" graph-task-node--in-review":""}`,style:r,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":j&&u?String(n.currentStep):void 0,onMouseEnter:m,onMouseLeave:b,onClick:C,onDoubleClick:X=>{X.defaultPrevented||z(n)},onClickCapture:D.onClickCapture,onPointerDown:D.onPointerDown,onPointerMove:D.onPointerMove,onPointerUp:D.onPointerUp,onPointerCancel:D.onPointerCancel,children:[j?R.jsx("div",{className:"graph-task-active-indicator",children:R.jsx("span",{className:"graph-task-active-indicator-text",children:Fe(n.status)})}):null,R.jsx(Ye,{...E,onOpenDetail:()=>{},disableDrag:!0})]})}function Ze({zoom:r,onZoomIn:s,onZoomOut:o,onFitToGraph:a,onResetView:f}){return R.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[R.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:s,children:R.jsx(Ae,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:o,children:R.jsx(je,{size:16})}),R.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(r*100),"%"]}),R.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:a,children:R.jsx($e,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:f,children:R.jsx(Ge,{size:16})})]})}const Ve=280,Ke=100;function qe({edges:r,positions:s,nodeWidth:o=Ve,nodeHeight:a=Ke,nodeHeights:f,highlightedEdgeIds:c}){const m=!!(c&&c.size>0);return R.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[R.jsx("defs",{children:R.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:R.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),r.map(b=>{const C=s.get(b.source),I=s.get(b.target);if(!C||!I)return null;const k=`${b.source}->${b.target}`,T=m&&(c?.has(k)??!1),E=C.x+o/2,n=C.y+(f?.get(b.source)??a),h=I.x+o/2,l=I.y,M=n+(l-n)/2;return R.jsx("path",{"data-testid":"dependency-edge","data-edge-id":k,className:`dependency-graph-edge${T?" graph-edge--highlighted":""}${m&&!T?" graph-edge--dimmed":""}`,d:`M ${E} ${n} C ${E} ${M}, ${h} ${M}, ${h} ${l}`,fill:"none",stroke:T?"var(--todo)":"var(--border)",strokeWidth:T?"var(--space-xs)":"var(--btn-border-width)",opacity:m&&!T?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},k)})]})}const Je=new Set(["triage","todo","in-progress","in-review"]);function Qe(r){return r.filter(s=>Je.has(s.column))}const et={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80,orientation:"vertical"};function we(r,s){const o={...et,...s},a=r.nodes.map(n=>n.task.id);if(a.length===0)return new Map;const f=new Map,c=new Map;for(const n of a)c.set(n,0),f.set(n,[]);for(const n of r.edges)!c.has(n.source)||!c.has(n.target)||(f.get(n.target)?.push(n.source),c.set(n.source,(c.get(n.source)??0)+1));const m=a.filter(n=>(c.get(n)??0)===0),b=[];for(;m.length>0;){const n=m.shift();b.push(n);for(const h of f.get(n)??[]){const l=(c.get(h)??0)-1;c.set(h,l),l===0&&m.push(h)}}for(const n of a)b.includes(n)||b.push(n);const C=new Map;for(const n of b){const h=r.edges.filter(M=>M.source===n).map(M=>M.target);let l=0;for(const M of h)l=Math.max(l,(C.get(M)??0)+1);C.set(n,l)}const I=new Map;for(const n of a){const h=C.get(n)??0,l=I.get(h)??[];l.push(n),I.set(h,l)}const k=new Map,T=Array.from(I.keys()).sort((n,h)=>n-h),E=new Map;if(o.orientation==="vertical"){let n=0;for(const h of T){E.set(h,n);const l=I.get(h)??[],M=Math.max(o.nodeHeight,...l.map(z=>o.measuredHeights?.get(z)??o.nodeHeight));n+=M+o.verticalGap}}for(const n of T){const h=I.get(n)??[];if(h.sort(),o.orientation==="horizontal"){const W=-(h.reduce((j,u)=>j+(o.measuredHeights?.get(u)??o.nodeHeight),0)+Math.max(0,h.length-1)*o.verticalGap)/2,$=n*(o.nodeWidth+o.horizontalGap);let G=W;for(const j of h)k.set(j,{x:$,y:G}),G+=(o.measuredHeights?.get(j)??o.nodeHeight)+o.verticalGap;continue}const z=-(h.length*o.nodeWidth+Math.max(0,h.length-1)*o.horizontalGap)/2;h.forEach((_,W)=>{const $=z+W*(o.nodeWidth+o.horizontalGap),G=E.get(n)??n*(o.nodeHeight+o.verticalGap);k.set(_,{x:$,y:G})})}return k}function tt(r){return t.useMemo(()=>{const s=r.map(f=>({task:f})),o=new Set(r.map(f=>f.id)),a=r.flatMap(f=>(f.dependencies??[]).filter(c=>o.has(c)).map(c=>({source:f.id,target:c})));return{nodes:s,edges:a}},[r])}const ce=.1,ue=3,Se=40,nt=200;function J(r,s,o){return Math.min(o,Math.max(s,r))}function rt(r){if(!(r instanceof HTMLElement))return!1;const s=r.tagName.toLowerCase();return r.isContentEditable||s==="input"||s==="textarea"||s==="select"}function ot(){const[r,s]=t.useState({x:0,y:0}),[o,a]=t.useState(1),[f,c]=t.useState(!1),m=t.useRef(r),b=t.useRef(o),C=t.useRef(null),I=t.useRef(null),k=t.useRef(new Map),T=t.useRef(null),E=t.useRef({minX:0,minY:0,maxX:0,maxY:0});t.useEffect(()=>{m.current=r},[r]),t.useEffect(()=>{b.current=o},[o]),t.useEffect(()=>()=>{C.current!==null&&window.clearTimeout(C.current)},[]);const n=t.useMemo(()=>`translate(${r.x}px, ${r.y}px) scale(${o})`,[r.x,r.y,o]),h=t.useMemo(()=>Math.round(o*100),[o]),l=t.useCallback(i=>{if(!i){C.current!==null&&(window.clearTimeout(C.current),C.current=null),c(!1);return}c(!0),C.current!==null&&window.clearTimeout(C.current),C.current=window.setTimeout(()=>{c(!1),C.current=null},nt)},[]),M=t.useCallback((i,d,g,S=b.current)=>{const x=E.current;if(x.maxX<=x.minX||x.maxY<=x.minY)return{x:J(i.x,-d,d),y:J(i.y,-g,g)};const U=d-x.maxX*S,O=-x.minX*S,v=g-x.maxY*S,B=-x.minY*S,Z=U>O?(U+O)/2:J(i.x,U,O),K=v>B?(v+B)/2:J(i.y,v,B);return{x:Z,y:K}},[]),z=t.useCallback((i,d,g,S)=>{const x=b.current,U=m.current,O=J(i,ce,ue),v=O/x,B=M({x:d.x-(d.x-U.x)*v,y:d.y-(d.y-U.y)*v},g,S,O);a(O),s(B)},[M]),_=t.useCallback((i,d,g,S)=>{l(!1);const x=S??{x:d/2,y:g/2};z(b.current*i,x,d,g)},[l,z]),W=t.useCallback((i,d)=>{if(i&&d){_(1.2,i,d);return}a(g=>J(g+.1,ce,ue))},[_]),$=t.useCallback((i,d)=>{if(i&&d){_(1/1.2,i,d);return}a(g=>J(g-.1,ce,ue))},[_]),G=t.useCallback(()=>{l(!0),s({x:0,y:0}),a(1)},[l]),j=t.useCallback((i,d,g,S)=>{if(l(!0),i.size===0){s({x:0,y:0}),a(1);return}const x=S?.nodeWidth??280,U=S?.nodeHeight??100,O=Array.from(i.entries()),v=Math.min(...O.map(([,q])=>q.x)),B=Math.min(...O.map(([,q])=>q.y)),Z=Math.max(...O.map(([,q])=>q.x+x)),K=Math.max(...O.map(([q,he])=>he.y+(S?.measuredHeights?.get(q)??U))),te=Math.max(1,Z-v),A=Math.max(1,K-B),oe=Math.max(1,d-Se*2),se=Math.max(1,g-Se*2),ne=J(Math.min(oe/te,se/A),ce,ue),pe=(d-te*ne)/2-v*ne,de=(g-A*ne)/2-B*ne;a(ne),s(M({x:pe,y:de},d,g,ne))},[M,l]),u=t.useCallback((i,d)=>{if(k.current.set(i,d),k.current.size===2){const[g,S]=Array.from(k.current.values());T.current={distance:Math.hypot(g.x-S.x,g.y-S.y),zoom:b.current,pan:m.current,midpoint:{x:(g.x+S.x)/2,y:(g.y+S.y)/2}},I.current=null;return}I.current={start:d,panStart:m.current}},[]),P=t.useCallback((i,d,g,S)=>{if(k.current.has(i)&&k.current.set(i,d),k.current.size===2&&T.current){l(!1);const[O,v]=Array.from(k.current.values()),Z=Math.hypot(O.x-v.x,O.y-v.y)/Math.max(1,T.current.distance),K={x:(O.x+v.x)/2,y:(O.y+v.y)/2},te=J(T.current.zoom*Z,ce,ue),A=te/T.current.zoom,oe=M({x:K.x-(T.current.midpoint.x-T.current.pan.x)*A,y:K.y-(T.current.midpoint.y-T.current.pan.y)*A},g,S);a(te),s(oe);return}const x=I.current;if(!x)return;l(!1);const U={x:x.panStart.x+(d.x-x.start.x),y:x.panStart.y+(d.y-x.start.y)};s(M(U,g,S))},[M,l]),D=t.useCallback(i=>{if(k.current.delete(i),k.current.size<2&&(T.current=null),k.current.size===1){const[d]=Array.from(k.current.values());I.current={start:d,panStart:m.current};return}k.current.size===0&&(I.current=null)},[]),X=t.useCallback((i,d,g,S)=>{l(!1);const x={x:m.current.x-i,y:m.current.y-d};s(M(x,g,S))},[M,l]),ee=t.useCallback((i,d,g,S)=>{const x=i<0?1.1:.9;l(!1),z(b.current*x,d,g,S)},[l,z]),L=t.useCallback(i=>{E.current=i},[]),le=t.useCallback((i,d,g,S,x)=>{if(rt(i.target))return;const U=i.metaKey||i.ctrlKey;if(i.key==="Escape"){i.preventDefault(),G();return}if(U){if(i.key==="="||i.key==="+"){i.preventDefault(),_(1.2,d,g);return}if(i.key==="-"){i.preventDefault(),_(1/1.2,d,g);return}if(i.key==="0"){i.preventDefault(),G();return}(i.key==="f"||i.key==="F")&&i.shiftKey&&(i.preventDefault(),j(S,d,g,x))}},[j,G,_]);return{pan:r,zoom:o,zoomPercent:h,transform:n,transitioning:f,zoomIn:W,zoomOut:$,resetView:G,fitToGraph:j,setAnimate:l,onPointerDown:u,onPointerMove:P,onPointerUp:D,onWheelPan:X,onWheelZoom:ee,handleKeyDown:le,setGraphBounds:L}}function st(r){const{upstreamMap:s,downstreamMap:o}=t.useMemo(()=>{const f=new Map,c=new Map;for(const m of r)f.set(m.id,new Set(m.dependencies??[])),c.has(m.id)||c.set(m.id,new Set);for(const m of r)for(const b of m.dependencies??[])c.has(b)||c.set(b,new Set),c.get(b)?.add(m.id);return{upstreamMap:f,downstreamMap:c}},[r]);return{getChain:t.useCallback(f=>{if(!s.has(f)&&!o.has(f))return new Set;const c=new Set([f]),m=(b,C)=>{const I=[b],k=new Set([b]);for(;I.length>0;){const T=I.shift();if(!T)continue;const E=C.get(T);if(E)for(const n of E)k.has(n)||(k.add(n),c.add(n),I.push(n))}};return m(f,s),m(f,o),c},[o,s])}}const ke="fusion-plugin-dependency-graph:positions";function fe(r){if(!r||typeof r!="object")return!1;const s=r;return typeof s.x=="number"&&Number.isFinite(s.x)&&typeof s.y=="number"&&Number.isFinite(s.y)}function it(r){const s=_e(ke,r);if(!s)return{};try{const o=JSON.parse(s);if(!o||typeof o!="object")return{};const a={};for(const[f,c]of Object.entries(o))fe(c)&&(a[f]=c);return a}catch{return{}}}function at(r,s,o){const a={};for(const[f,c]of Object.entries(r))s.has(f)&&fe(c)&&(a[f]=c);Xe(ke,JSON.stringify(a),o)}function ct(r){ve(ke,r)}function ut(r,s,o){const a={};for(const[f,c]of Object.entries(r))o.has(f)&&fe(c)&&(a[f]=c);for(const[f,c]of Object.entries(s))o.has(f)&&fe(c)&&(a[f]=c);return a}function lt(r,s){const o={};for(const[a,f]of Object.entries(r))s.has(a)&&(o[a]=f);return o}function dt({projectId:r,visibleTaskIds:s}){const[o,a]=t.useState(null);t.useEffect(()=>{a(it(r))},[r]);const f=t.useCallback(m=>{at(m,s,r),a(lt(m,s))},[r,s]),c=t.useCallback(()=>{ct(r),a(null)},[r]);return{savedPositions:o,persistPositions:f,clearSavedPositions:c}}const ae=280,Q=100,ft=768,Te=4;function pt({tasks:r,projectId:s,onOpenTaskDetail:o,onOpenDetail:a,addToast:f,globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M}){const z=t.useRef(null),_=t.useRef(!1),W=t.useRef(null),$=t.useRef(!1),G=t.useRef(new Map),[j,u]=t.useState(null),[P,D]=t.useState(null),[X,ee]=t.useState({width:0,height:0}),[L,le]=t.useState(new Map),i=t.useMemo(()=>Qe(r),[r]),d=tt(i),{getChain:g}=st(i),S=j??P,x=t.useMemo(()=>S?g(S):new Set,[S,g]),U=t.useMemo(()=>{const e=X.width||(typeof window<"u"?window.innerWidth:0);return(X.height||(typeof window<"u"?window.innerHeight:0))>e||e<ft?"horizontal":"vertical"},[X.height,X.width]),O=t.useMemo(()=>({nodeWidth:ae,nodeHeight:Q,horizontalGap:40,verticalGap:80,orientation:U,measuredHeights:L}),[L,U]),v=t.useMemo(()=>we(d,O),[d,O]),B=t.useMemo(()=>new Set(i.map(e=>e.id)),[i]),{savedPositions:Z,persistPositions:K,clearSavedPositions:te}=dt({projectId:s,visibleTaskIds:B}),[A,oe]=t.useState(v),[se,ne]=t.useState(!1);t.useEffect(()=>{const e={};for(const[y,H]of v.entries())e[y]=H;const p=Z?ut(e,Z,B):e;oe(new Map(Object.entries(p)))},[v,Z,B]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=(H,Y)=>{ee(w=>w.width===H&&w.height===Y?w:{width:H,height:Y})};if(typeof ResizeObserver>"u"){p(e.clientWidth||(typeof window<"u"?window.innerWidth:0),e.clientHeight||(typeof window<"u"?window.innerHeight:0));return}p(e.clientWidth,e.clientHeight);const y=new ResizeObserver(H=>{const Y=H[0];Y&&p(Y.contentRect.width,Y.contentRect.height)});return y.observe(e),()=>y.disconnect()},[]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=new Set(d.nodes.map(w=>w.task.id)),y=new Map;for(const w of p){const N=e.querySelector(`[data-testid="graph-task-node-${w}"]`);N&&y.set(w,N)}G.current=y,le(w=>{let N=!1;const F=new Map;for(const[re,ie]of w.entries()){if(!p.has(re)){N=!0;continue}F.set(re,ie)}return N?F:w});const H=(w,N)=>{le(F=>{const re=F.get(w);if(re!==void 0&&Math.abs(re-N)<1)return F;const ie=new Map(F);return ie.set(w,N),ie})};for(const[w,N]of y.entries())H(w,N.offsetHeight||Q);if(typeof ResizeObserver>"u")return;const Y=new ResizeObserver(w=>{for(const N of w){const F=N.target,re=Array.from(y.entries()).find(([,ie])=>ie===F)?.[0];re&&H(re,F.offsetHeight||Q)}});for(const w of y.values())Y.observe(w);return()=>Y.disconnect()},[d.nodes,A,X.height,X.width]);const{transform:pe,zoom:de,transitioning:q,zoomIn:he,zoomOut:Ce,resetView:De,fitToGraph:me,onPointerDown:Re,onPointerMove:Ie,onPointerUp:be,onWheelPan:ze,onWheelZoom:He,handleKeyDown:Ne,setGraphBounds:Me}=ot();t.useEffect(()=>{if(_.current||i.length===0)return;if(!!(Z&&Object.keys(Z).length>0)){_.current=!0;return}const p=z.current;p&&(me(A,p.clientWidth,p.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L}),_.current=!0)},[i.length,me,L,A,Z]);const V=t.useMemo(()=>{const e=Array.from(A.values());if(e.length===0)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};const p=Math.min(...e.map(w=>w.x)),y=Math.min(...e.map(w=>w.y)),H=Math.max(...e.map(w=>w.x+ae)),Y=Math.max(...Array.from(A.entries()).map(([w,N])=>N.y+(L.get(w)??Q)));return{minX:p,minY:y,maxX:H,maxY:Y,width:Math.max(0,H-p),height:Math.max(0,Y-y)}},[L,A]),ge=t.useMemo(()=>{if(A.size===0)return A;const e=new Map;for(const[p,y]of A.entries())e.set(p,{x:y.x-V.minX,y:y.y-V.minY});return e},[V.minX,V.minY,A]);t.useEffect(()=>{Me({minX:0,minY:0,maxX:V.width,maxY:V.height})},[V.height,V.width,Me]);const Pe=t.useCallback(()=>{te();const e=we(d,O);oe(e)},[te,d,O]),Oe=t.useCallback(()=>{const e={};for(const[p,y]of A.entries())e[p]=y;K(e)},[K,A]);return R.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[R.jsx("div",{ref:z,className:"dependency-graph__viewport",onPointerDown:e=>{se||(W.current={x:e.clientX,y:e.clientY},$.current=!1,Re(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(se)return;const p=z.current;if(!p)return;const y=W.current;if(y){const H=Math.abs(e.clientX-y.x),Y=Math.abs(e.clientY-y.y);(H>Te||Y>Te)&&($.current=!0)}Ie(e.pointerId,{x:e.clientX,y:e.clientY},p.clientWidth,p.clientHeight)},onPointerUp:e=>{se||be(e.pointerId),W.current=null},onPointerCancel:e=>{se||be(e.pointerId),W.current=null,$.current=!1},onWheel:e=>{e.preventDefault();const p=z.current;if(p){if(e.ctrlKey||e.metaKey){const y=p.getBoundingClientRect();He(e.deltaY,{x:e.clientX-y.left,y:e.clientY-y.top},p.clientWidth,p.clientHeight);return}ze(e.deltaX,e.deltaY,p.clientWidth,p.clientHeight)}},onKeyDown:e=>{const p=z.current;p&&Ne(e,p.clientWidth,p.clientHeight,ge,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},tabIndex:0,onClick:()=>{$.current||se||D(null)},children:i.length===0?R.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):R.jsxs("div",{className:`graph-canvas-transform${q?" graph-canvas-transform--animate":""}`,style:{transform:pe,width:`${V.width}px`,height:`${V.height}px`},children:[R.jsx(qe,{edges:d.edges,positions:ge,nodeWidth:ae,nodeHeight:Q,nodeHeights:L,highlightedEdgeIds:x.size>0?new Set(d.edges.filter(e=>x.has(e.source)&&x.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),R.jsx("div",{className:"dependency-graph__nodes-layer",children:d.nodes.map(e=>{const p=ge.get(e.task.id);return p?R.jsx(Be,{task:e.task,projectId:s,isSelected:P===e.task.id,style:{minHeight:`${Q}px`,left:`${p.x}px`,top:`${p.y}px`},position:p,scale:de,onNodePositionChange:(y,H)=>{oe(Y=>{const w={x:H.x+V.minX,y:H.y+V.minY},N=Y.get(y);if(N&&N.x===w.x&&N.y===w.y)return Y;const F=new Map(Y);return F.set(y,w),F})},onNodeDragStateChange:ne,onNodeDragEnd:Oe,isHighlighted:x.size>0&&x.has(e.task.id),isDimmed:x.size>0&&!x.has(e.task.id),onOpenDetail:a??(y=>o?.(y.id)),addToast:f??(()=>{}),globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M,onMouseEnter:()=>u(e.task.id),onMouseLeave:()=>u(null),onClick:y=>{y.stopPropagation(),$.current=!1,D(H=>H===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),R.jsx(Ze,{zoom:de,onZoomIn:()=>{const e=z.current;e&&he(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=z.current;e&&Ce(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{Pe();const e=z.current;if(!e)return;const p=we(d,O),y=new Map,H=Array.from(p.values()),Y=H.length>0?Math.min(...H.map(N=>N.x)):0,w=H.length>0?Math.min(...H.map(N=>N.y)):0;for(const[N,F]of p.entries())y.set(N,{x:F.x-Y,y:F.y-w});me(y,e.clientWidth,e.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},onResetView:()=>{Pe(),De()}})]})}function ht(r){return new Map((r??[]).map(s=>[s.id,s.name]))}function Pt({context:r}){return t.createElement(pt,{tasks:r?.tasks??[],projectId:r?.projectId,workflowStepNameLookup:ht(r?.workflowSteps),onOpenDetail:r?.openTaskDetail})}export{pt as DependencyGraph,Pt as DependencyGraphDashboardView,Pt as default};
@@ -0,0 +1 @@
1
+ .ce-view{display:flex;color:var(--text);flex:1 1 auto;flex-direction:column;gap:1rem;min-width:0;min-height:0;width:100%;height:100%;padding:1rem 1.25rem;box-sizing:border-box;overflow:auto}.ce-view-header{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}.ce-view-header h2{margin:0}.ce-view-summary{font-size:.8rem;color:var(--text-muted)}.ce-loading,.ce-view-error{padding:.75rem 1rem;font-size:.85rem}.ce-view-error{color:var(--color-error)}.ce-empty{max-width:36rem;padding:1.5rem;display:flex;flex-direction:column;gap:.75rem;align-items:flex-start}.ce-empty h3{margin:0}.ce-empty-hint{color:var(--text-muted);font-size:.85rem}.ce-groups{display:grid;grid-template-columns:repeat(auto-fill,minmax(18rem,1fr));gap:1rem}.ce-group{border:1px solid var(--border);border-radius:8px;padding:.75rem 1rem;display:flex;flex-direction:column;gap:.5rem}.ce-group[data-empty=true]{color:var(--text-muted)}.ce-group-header{display:flex;align-items:center;justify-content:space-between}.ce-group-header h3{margin:0;font-size:.95rem}.ce-group-count{font-size:.75rem;color:var(--text-dim)}.ce-group-empty{margin:0;font-size:.8rem;color:var(--text-dim)}.ce-artifact-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.ce-artifact{display:flex;align-items:center;justify-content:space-between;gap:.5rem;font-size:.85rem}.ce-artifact.is-selected{font-weight:600}.ce-artifact-btn{background:none;border:none;text-align:left;cursor:pointer;display:flex;flex-direction:column;color:inherit;padding:.25rem 0;flex:1}.ce-artifact-path{font-size:.7rem;color:var(--text-dim)}.ce-artifact-open{appearance:none;background:none;border:none;color:var(--color-info);cursor:pointer;font:inherit;padding:0;text-decoration:underline}.ce-artifact-open:hover,.ce-artifact-open:focus-visible{color:var(--color-info)}.ce-artifact-error .ce-artifact-error-msg{color:var(--color-error);font-size:.78rem}.ce-artifact-error{flex-direction:column;align-items:flex-start;gap:.15rem}.ce-view[data-mobile=true]{width:100%;padding:var(--space-sm)}.ce-view[data-mobile=true] .ce-groups{grid-template-columns:1fr}@media(max-width:768px){.ce-view{width:100%;padding:var(--space-sm)}.ce-session-row{align-items:center;flex-direction:row}.ce-session-open{flex-wrap:wrap}.ce-session-cancel,.ce-session-discard,.ce-flow-cancel,.ce-flow-close{margin-left:0}}.ce-launcher{margin:.75rem 0}.ce-launcher-list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:.5rem}.ce-launcher-tile{width:100%;display:flex;align-items:center;gap:.5rem}.ce-launcher-icon{flex:none}.ce-view-start{margin-left:auto}.ce-flow{margin:.75rem 0;display:flex;flex:1 1 auto;flex-direction:column;gap:.6rem;min-height:0;overflow-y:auto}.ce-flow-header{display:flex;align-items:center;gap:.5rem}.ce-flow-header h3{margin:0;text-transform:capitalize}.ce-flow-status{font-size:.72rem;color:var(--text-muted);text-transform:capitalize}.ce-flow-cancel,.ce-flow-close{margin-left:auto}.ce-flow-cancel+.ce-flow-close{margin-left:0}.ce-flow-transcript{list-style:none;margin:0;padding:0;display:flex;flex:1 1 auto;flex-direction:column;gap:.35rem;min-height:0;overflow-y:auto}.ce-flow-turn{display:flex;flex-direction:column}.ce-flow-turn-role{font-size:.65rem;text-transform:uppercase;color:var(--text-dim)}.ce-flow-turn-agent .ce-flow-turn-text{white-space:pre-wrap}.ce-flow-thinking{font-style:italic;color:var(--text-muted)}.ce-flow-question{display:flex;flex-direction:column;gap:.4rem}.ce-flow-question-text{font-weight:600;margin:0}.ce-flow-question-desc{font-size:.8rem;color:var(--text-muted);margin:0}.ce-flow-text{display:flex;flex-direction:column;gap:.4rem}.ce-flow-text textarea,.ce-flow-guidance-row textarea{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-primary);outline:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.ce-flow-text textarea{width:100%;resize:vertical}.ce-flow-text textarea:focus,.ce-flow-guidance-row textarea:focus{border-color:var(--todo);box-shadow:var(--focus-ring)}.ce-flow-text textarea::placeholder,.ce-flow-guidance-row textarea::placeholder{color:var(--text-dim)}.ce-flow-confirm{display:flex;gap:.5rem}.ce-flow-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.ce-flow-options ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.ce-flow-option{width:100%;text-align:left;display:flex;flex-direction:column}.ce-flow-option-desc{font-size:.72rem;color:var(--text-muted)}.ce-flow-checkbox{display:flex;align-items:center;gap:.4rem;cursor:pointer}.ce-flow-error{color:var(--color-error);font-size:.82rem}.ce-flow-degraded{border:1px dashed var(--color-warning);border-radius:6px;padding:.6rem;background:color-mix(in srgb,var(--color-warning) 8%,transparent)}.ce-flow-degraded-banner{margin:0 0 .4rem;font-size:.78rem;font-weight:600;color:var(--color-warning)}.ce-flow-degraded-options{font-size:.78rem;color:var(--text-muted);margin:0 0 .4rem;padding-left:1.1rem}.ce-sessions{margin-bottom:.8rem}.ce-sessions-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.ce-session-row{display:flex;align-items:center;gap:.5rem}.ce-session-row.is-active .ce-session-open{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 8%,transparent)}.ce-session-open{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:.6rem;text-align:left;padding:.4rem .6rem;border:1px solid var(--border);border-radius:6px;background:transparent;cursor:pointer}.ce-session-open:disabled{cursor:default;opacity:.6}.ce-session-stage{font-weight:600}.ce-session-status{font-size:.74rem;text-transform:capitalize;color:var(--text-muted)}.ce-session-status-awaiting_input{color:var(--color-warning);font-weight:600}.ce-session-status-error,.ce-session-status-interrupted{color:var(--color-error)}.ce-session-status-completed{color:var(--color-success)}.ce-session-updated{margin-left:auto;font-size:.72rem;color:var(--text-dim)}.ce-session-cancel,.ce-session-discard{flex:none}.ce-session-cancel,.ce-flow-cancel{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:calc(var(--space-xl) + var(--space-sm));height:calc(var(--space-xl) + var(--space-sm));padding:var(--space-xs);border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-error);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast),opacity var(--transition-fast)}.ce-session-cancel:hover:not(:disabled),.ce-flow-cancel:hover:not(:disabled){background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.ce-session-cancel:focus-visible,.ce-flow-cancel:focus-visible{box-shadow:var(--focus-ring);outline:none}.ce-session-cancel:disabled,.ce-flow-cancel:disabled{cursor:default;opacity:.6}.ce-flow-transcript{list-style:none;margin:0 0 .8rem;padding:0;display:flex;flex:1 1 auto;flex-direction:column;gap:.45rem;min-height:0;overflow-y:auto}.ce-flow-turn{display:flex;flex-direction:column;gap:.15rem;max-width:85%;padding:.45rem .65rem;border-radius:10px;background:color-mix(in srgb,var(--border) 30%,transparent)}.ce-flow-turn-user{align-self:flex-end;background:color-mix(in srgb,var(--todo) 12%,transparent)}.ce-flow-turn-role{font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim)}.ce-flow-turn-text{white-space:pre-wrap;word-break:break-word;font-size:.86rem}.ce-flow-turn-answer.is-steering{border-left:3px solid var(--color-warning)}.ce-flow-turn-comment{font-size:.78rem;font-style:italic;color:var(--text-muted);border-top:1px dashed color-mix(in srgb,var(--border) 60%,transparent);padding-top:.25rem}.ce-flow-turn-done{align-self:center;background:color-mix(in srgb,var(--color-success) 10%,transparent);font-size:.8rem}.ce-flow-artifact-path{color:var(--text-dim)}.ce-flow-turn-activity{background:transparent;padding:0;max-width:100%}.ce-flow-activity-details summary{cursor:pointer;font-size:.78rem;color:var(--text-muted)}.ce-flow-activity{display:flex;flex-direction:column;gap:.25rem;margin:.3rem 0 0;padding:.5rem .6rem;border:1px solid color-mix(in srgb,var(--border) 70%,transparent);border-radius:8px;background:color-mix(in srgb,var(--border) 12%,transparent);max-height:16rem;overflow-y:auto}.ce-activity-block{margin:0;font-size:.76rem;white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono, ui-monospace, monospace)}.ce-activity-thinking{color:var(--text-dim);font-style:italic}.ce-activity-tool{font-size:.76rem;font-family:var(--font-mono, ui-monospace, monospace)}.ce-activity-tool.is-running .ce-activity-tool-marker{color:var(--todo)}.ce-activity-tool.is-done .ce-activity-tool-marker{color:var(--color-success)}.ce-activity-tool.is-error .ce-activity-tool-marker{color:var(--color-error)}.ce-flow-working{margin:.4rem 0}.ce-flow-working-label{display:flex;align-items:center;gap:.45rem;margin:0 0 .3rem;font-size:.82rem;color:var(--text-muted)}.ce-flow-pulse{width:8px;height:8px;border-radius:50%;background:var(--todo);animation:ce-pulse 1.2s ease-in-out infinite}@keyframes ce-pulse{0%,to{opacity:.25;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.ce-flow-guidance{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed color-mix(in srgb,var(--border) 70%,transparent)}.ce-flow-guidance-label{display:block;font-size:.74rem;color:var(--text-dim);margin-bottom:.3rem}.ce-flow-guidance-row{display:flex;gap:.4rem;align-items:flex-end}.ce-flow-guidance-row textarea{flex:1;resize:vertical}
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-CgfrecpF.js";/**
1
+ import{c as a}from"./index-2kYpdJrx.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.