singleton-pipeline 0.4.0-beta.13 → 0.4.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/cli/src/assets/singleton-logo.txt +10 -0
- package/dist/packages/cli/src/commands/new.js +763 -0
- package/dist/packages/cli/src/commands/repl.js +557 -0
- package/dist/packages/cli/src/commands/usage.js +49 -0
- package/dist/packages/cli/src/executor/debug-loop.js +525 -0
- package/dist/packages/cli/src/executor/inputs.js +226 -0
- package/dist/packages/cli/src/executor/outputs.js +134 -0
- package/dist/packages/cli/src/executor/preflight.js +605 -0
- package/dist/packages/cli/src/executor/replay-loop.js +120 -0
- package/dist/packages/cli/src/executor/run-report.js +209 -0
- package/dist/packages/cli/src/executor/run-setup.js +114 -0
- package/dist/packages/cli/src/executor/security-review.js +97 -0
- package/dist/packages/cli/src/executor/snapshot-manager.js +349 -0
- package/dist/packages/cli/src/executor/step-runner.js +241 -0
- package/dist/packages/cli/src/executor.js +584 -0
- package/dist/packages/cli/src/index.js +107 -0
- package/dist/packages/cli/src/parser.js +89 -0
- package/dist/packages/cli/src/runners/_shared.js +96 -0
- package/dist/packages/cli/src/runners/claude.js +103 -0
- package/dist/packages/cli/src/runners/codex-instructions.js +69 -0
- package/dist/packages/cli/src/runners/codex.js +141 -0
- package/dist/packages/cli/src/runners/copilot.js +209 -0
- package/dist/packages/cli/src/runners/index.js +18 -0
- package/dist/packages/cli/src/runners/opencode.js +240 -0
- package/dist/packages/cli/src/scanner.js +43 -0
- package/dist/packages/cli/src/security/policy.js +115 -0
- package/dist/packages/cli/src/sentinels.js +1 -0
- package/dist/packages/cli/src/shell.js +753 -0
- package/dist/packages/cli/src/theme.js +39 -0
- package/dist/packages/cli/src/timeline.js +238 -0
- package/dist/packages/cli/src/types.js +1 -0
- package/dist/packages/cli/src/usage/aggregator.js +44 -0
- package/dist/packages/cli/src/usage/reader.js +30 -0
- package/dist/packages/cli/src/usage/types.js +1 -0
- package/dist/packages/server/src/index.js +36 -0
- package/dist/packages/server/src/routes/agents.js +31 -0
- package/dist/packages/server/src/routes/files.js +45 -0
- package/dist/packages/server/src/routes/pipelines.js +74 -0
- package/docs/reference.md +28 -0
- package/package.json +15 -14
- package/packages/web/dist/assets/{index-CnKytBly.js → index-9S0goZlQ.js} +1 -1
- package/packages/web/dist/assets/{index-CCFWfCA2.css → index-iV4UtXoN.css} +1 -1
- package/packages/web/dist/assets/logo-COSyZmgk.png +0 -0
- package/packages/web/dist/index.html +2 -2
- package/packages/cli/package.json +0 -18
- package/packages/cli/src/commands/new.js +0 -786
- package/packages/cli/src/commands/repl.js +0 -548
- package/packages/cli/src/executor/debug-loop.js +0 -587
- package/packages/cli/src/executor/inputs.js +0 -202
- package/packages/cli/src/executor/outputs.js +0 -140
- package/packages/cli/src/executor/preflight.js +0 -459
- package/packages/cli/src/executor/replay-loop.js +0 -172
- package/packages/cli/src/executor/run-report.js +0 -189
- package/packages/cli/src/executor/run-setup.js +0 -93
- package/packages/cli/src/executor/security-review.js +0 -108
- package/packages/cli/src/executor/snapshot-manager.js +0 -335
- package/packages/cli/src/executor/step-runner.js +0 -266
- package/packages/cli/src/executor.js +0 -652
- package/packages/cli/src/index.js +0 -107
- package/packages/cli/src/parser.js +0 -78
- package/packages/cli/src/runners/_shared.js +0 -83
- package/packages/cli/src/runners/claude.js +0 -122
- package/packages/cli/src/runners/codex-instructions.js +0 -75
- package/packages/cli/src/runners/codex.js +0 -165
- package/packages/cli/src/runners/copilot.js +0 -224
- package/packages/cli/src/runners/index.js +0 -20
- package/packages/cli/src/runners/opencode.js +0 -265
- package/packages/cli/src/scanner.js +0 -47
- package/packages/cli/src/security/policy.js +0 -126
- package/packages/cli/src/shell.js +0 -732
- package/packages/cli/src/theme.js +0 -46
- package/packages/cli/src/timeline.js +0 -180
- package/packages/server/package.json +0 -11
- package/packages/server/src/index.js +0 -43
- package/packages/server/src/routes/agents.js +0 -32
- package/packages/server/src/routes/files.js +0 -42
- package/packages/server/src/routes/pipelines.js +0 -74
|
@@ -52,4 +52,4 @@ Edge: ${e}`,USEVUEFLOW_OPTIONS:()=>"The options parameter is deprecated and will
|
|
|
52
52
|
h${-(F.value.width-2*e.maskBorderRadius)}
|
|
53
53
|
a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 -${e.maskBorderRadius},-${e.maskBorderRadius}
|
|
54
54
|
v${-(F.value.height-2*e.maskBorderRadius)}
|
|
55
|
-
a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 ${e.maskBorderRadius},-${e.maskBorderRadius}z`);sh(T=>{if(b.value){const H=fn(b.value),D=le=>{if(le.sourceEvent.type!=="wheel"||!d.value||!h.value)return;const ue=le.sourceEvent.ctrlKey&&Xo()?10:1,Q=-le.sourceEvent.deltaY*(le.sourceEvent.deltaMode===1?.05:le.sourceEvent.deltaMode?1:.002)*e.zoomStep,ee=a.value.zoom*2**(Q*ue);h.value.scaleTo(d.value,ee)},Y=le=>{if(le.sourceEvent.type!=="mousemove"||!d.value||!h.value)return;const ue=ne.value*Math.max(1,a.value.zoom)*(e.inversePan?-1:1),Q={x:a.value.x-le.sourceEvent.movementX*ue,y:a.value.y-le.sourceEvent.movementY*ue},ee=[[0,0],[c.value.width,c.value.height]],ie=El.translate(Q.x,Q.y).scale(a.value.zoom),fe=h.value.constrain()(ie,ee,u.value);h.value.transform(d.value,fe)},J=p$().wheelDelta(le=>Ms(le)*(e.zoomStep/10)).on("zoom",e.pannable?Y:()=>{}).on("zoom.wheel",e.zoomable?D:()=>{});H.call(J),T(()=>{H.on("zoom",null)})}},{flush:"post"});function I(T){const[H,D]=ln(T);t("click",{event:T,position:{x:H,y:D}})}function re(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeClick(D),t("nodeClick",D)}function g(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeDoubleClick(D),t("nodeDblclick",D)}function P(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseEnter(D),t("nodeMouseenter",D)}function _(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseMove(D),t("nodeMousemove",D)}function A(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseLeave(D),t("nodeMouseleave",D)}return(T,H)=>(K(),Ve(Z(zf),{position:T.position,class:Xe(["vue-flow__minimap",{pannable:T.pannable,zoomable:T.zoomable}])},{default:dt(()=>[(K(),te("svg",{ref_key:"el",ref:b,width:C.value,height:w.value,viewBox:[W.value.x,W.value.y,W.value.width,W.value.height].join(" "),role:"img","aria-labelledby":`vue-flow__minimap-${Z(s)}`,onClick:I},[T.ariaLabel?(K(),te("title",{key:0,id:`vue-flow__minimap-${Z(s)}`},Oe(T.ariaLabel),9,_$)):Ae("",!0),(K(!0),te(be,null,yt(Z(E),D=>(K(),Ve(m$,{id:D.id,key:D.id,f:"",position:D.computedPosition,dimensions:D.dimensions,selected:D.selected,dragging:D.dragging,style:tt(D.style),class:Xe(B.value(D)),color:$.value(D),"border-radius":T.nodeBorderRadius,"stroke-color":M.value(D),"stroke-width":T.nodeStrokeWidth,"shape-rendering":Z(k),type:D.type,hidden:D.hidden,onClick:Y=>re(Y,D),onDblclick:Y=>g(Y,D),onMouseenter:Y=>P(Y,D),onMousemove:Y=>_(Y,D),onMouseleave:Y=>A(Y,D)},null,8,["id","position","dimensions","selected","dragging","style","class","color","border-radius","stroke-color","stroke-width","shape-rendering","type","hidden","onClick","onDblclick","onMouseenter","onMousemove","onMouseleave"]))),128)),U("path",{class:"vue-flow__minimap-mask",d:q.value,fill:T.maskColor,stroke:T.maskStrokeColor,"stroke-width":T.maskStrokeWidth,"fill-rule":"evenodd"},null,8,w$)],8,y$))]),_:1},8,["position","class"]))}}),$$={class:"node-agent__head"},S$={class:"node-agent__id"},E$={key:0,class:"node-agent__badge"},N$={key:0,class:"node-agent__warn"},C$={class:"node-agent__desc"},M$={class:"node-agent__ports"},k$={class:"node-agent__col node-agent__col--in"},T$={class:"node-agent__col node-agent__col--out"},I$={__name:"AgentNode",props:{id:String,data:Object},setup(e){const t=e,n=ct("agents"),{removeNodes:o}=ke(),i=ce(()=>n.value.find(s=>s.id===t.data.agentId)),r=ce(()=>!i.value);return(s,l)=>(K(),te("div",{class:Xe(["node-agent",{"node-agent--stale":r.value}])},[U("header",$$,[U("span",S$,[hn(Oe(e.data.agentId)+" ",1),r.value?(K(),te("span",E$,"stale")):Ae("",!0)]),U("button",{class:"node-agent__close",type:"button",onClick:l[0]||(l[0]=a=>Z(o)([e.id])),title:"Remove node"},"✕")]),r.value?(K(),te("p",N$," Agent introuvable dans le repo. Supprime le node ou restaure le fichier. ")):(K(),te(be,{key:1},[U("p",C$,Oe(i.value.description),1),U("div",M$,[U("div",k$,[l[1]||(l[1]=U("div",{class:"node-agent__col-title"},"Inputs",-1)),(K(!0),te(be,null,yt(i.value.inputs,a=>(K(),te("div",{key:a,class:"node-agent__port node-agent__port--in"},[me(Z(On),{id:`in-${a}`,type:"target",position:Z(ae).Left,style:{top:"50%"}},null,8,["id","position"]),hn(" "+Oe(a),1)]))),128))]),U("div",T$,[l[2]||(l[2]=U("div",{class:"node-agent__col-title"},"Outputs",-1)),(K(!0),te(be,null,yt(i.value.outputs,a=>(K(),te("div",{key:a,class:"node-agent__port node-agent__port--out"},[hn(Oe(a)+" ",1),me(Z(On),{id:`out-${a}`,type:"source",position:Z(ae).Right,style:{top:"50%"}},null,8,["id","position"])]))),128))])])],64))],2))}},A$=mn(I$,[["__scopeId","data-v-9ea2f689"]]);function P$(){const e=ye([]),t=ye(!1),n=ye("");async function o(i="md"){t.value=!0,n.value="";try{const r=await fetch(`/api/files?ext=${encodeURIComponent(i)}`),s=await r.json();if(!r.ok)throw new Error(s.error||"list failed");e.value=s.files||[]}catch(r){n.value=r.message,e.value=[]}finally{t.value=!1}}return{files:e,loading:t,error:n,fetchFiles:o}}const D$={class:"file-picker__dialog"},O$={class:"file-picker__head"},R$={class:"file-picker__title"},z$={class:"file-picker__body"},B$=["placeholder"],H$={key:0,class:"file-picker__state"},V$={key:1,class:"file-picker__state file-picker__state--error"},F$={key:2,class:"file-picker__state"},L$={key:3,class:"file-picker__list"},Y$=["onClick"],G$={__name:"FilePicker",props:{open:Boolean,ext:{type:String,default:"md"},title:{type:String,default:"Choisir un fichier"}},emits:["close","pick"],setup(e,{emit:t}){const n=e,o=t,{files:i,loading:r,error:s,fetchFiles:l}=P$(),a=ye("");xe(()=>n.open,f=>{f&&(a.value="",l(n.ext))}),_t(()=>{n.open&&l(n.ext)});const u=ce(()=>{const f=a.value.trim().toLowerCase();return f?i.value.filter(d=>d.toLowerCase().includes(f)):i.value});function c(f){o("pick",f),o("close")}return(f,d)=>e.open?(K(),te("div",{key:0,class:"file-picker",onClick:d[2]||(d[2]=gs(h=>o("close"),["self"]))},[U("div",D$,[U("header",O$,[U("h3",R$,Oe(e.title),1),U("button",{class:"file-picker__close",type:"button",onClick:d[0]||(d[0]=h=>o("close"))},"✕")]),U("div",z$,[Ku(U("input",{"onUpdate:modelValue":d[1]||(d[1]=h=>a.value=h),class:"file-picker__search",type:"text",placeholder:`Filtrer… (${Z(i).length} fichier(s) .${e.ext})`,autofocus:""},null,8,B$),[[Tc,a.value]]),Z(r)?(K(),te("div",H$,"Chargement…")):Z(s)?(K(),te("div",V$,Oe(Z(s)),1)):u.value.length===0?(K(),te("div",F$,"Aucun fichier.")):(K(),te("ul",L$,[(K(!0),te(be,null,yt(u.value,h=>(K(),te("li",{key:h,class:"file-picker__item",onClick:E=>c(h)},Oe(h),9,Y$))),128))]))])])])):Ae("",!0)}},U$=mn(G$,[["__scopeId","data-v-be890d20"]]),X$={class:"node-input__head"},W$={class:"node-input__meta"},K$={class:"node-input__subtypes"},Z$={class:"node-input__body"},q$=["value"],j$={key:0,class:"node-input__path"},J$={key:1,class:"node-input__placeholder"},Q$=["value"],eS=["value"],tS={class:"node-input__port"},nS={__name:"InputNode",props:{id:String,data:Object},setup(e){const t=e,{removeNodes:n,updateNodeData:o}=ke(),i=ye(!1);function r(s){o(t.id,s)}return(s,l)=>(K(),te("div",{class:Xe(["node-input",`node-input--${e.data.subtype||"file"}`])},[U("header",X$,[U("div",W$,[l[9]||(l[9]=U("span",{class:"node-input__kind"},"Input",-1)),U("div",K$,[U("button",{class:Xe(["node-input__st",{"node-input__st--active":(e.data.subtype||"file")==="file"}]),type:"button",onClick:l[0]||(l[0]=a=>r({subtype:"file"}))},"file",2),U("button",{class:Xe(["node-input__st",{"node-input__st--active":e.data.subtype==="text"}]),type:"button",onClick:l[1]||(l[1]=a=>r({subtype:"text"}))},"text",2)])]),U("button",{class:"node-input__close",type:"button",onClick:l[2]||(l[2]=a=>Z(n)([e.id]))},"✕")]),U("div",Z$,[(e.data.subtype||"file")==="file"?(K(),te(be,{key:0},[U("input",{class:"node-input__field",value:e.data.label||"",placeholder:"Label…",onInput:l[3]||(l[3]=a=>r({label:a.target.value}))},null,40,q$),U("button",{class:"node-input__file-btn",type:"button",onClick:l[4]||(l[4]=a=>i.value=!0)},[e.data.value?(K(),te("span",j$,Oe(e.data.value),1)):(K(),te("span",J$,"— choisir un fichier —"))]),me(U$,{open:i.value,ext:"",title:"Input — choisir un fichier",onClose:l[5]||(l[5]=a=>i.value=!1),onPick:l[6]||(l[6]=a=>r({value:a}))},null,8,["open"])],64)):(K(),te(be,{key:1},[U("input",{class:"node-input__field",value:e.data.label||"",placeholder:"Question à poser…",onInput:l[7]||(l[7]=a=>r({label:a.target.value}))},null,40,Q$),U("input",{class:"node-input__field node-input__field--dim",value:e.data.value||"",placeholder:"Valeur par défaut (optionnel)",onInput:l[8]||(l[8]=a=>r({value:a.target.value}))},null,40,eS)],64))]),U("div",tS,[l[10]||(l[10]=hn(" value ",-1)),me(Z(On),{id:"out-value",type:"source",position:Z(ae).Right},null,8,["position"])])],2))}},oS=mn(nS,[["__scopeId","data-v-95ec91bc"]]),iS={__name:"PipelineCanvas",props:{agents:Array,pipeline:Object},setup(e){const t=e,{onConnect:n,addEdges:o,screenToFlowCoordinate:i,onNodesChange:r,onEdgesChange:s,applyNodeChanges:l,applyEdgeChanges:a}=ke();n(d=>{o([{...d,id:`e-${d.source}-${d.sourceHandle}->${d.target}-${d.targetHandle}`}])}),r(d=>{t.pipeline.nodes.value=l(d,t.pipeline.nodes.value)}),s(d=>{t.pipeline.edges.value=a(d,t.pipeline.edges.value)});function u(d){d.preventDefault(),d.dataTransfer.dropEffect="move"}function c(d){d.preventDefault();const h=i({x:d.clientX,y:d.clientY}),E=d.dataTransfer.getData("application/singleton-agent");if(E){t.pipeline.addAgentNode(JSON.parse(E),h);return}const b=d.dataTransfer.getData("application/singleton-node");if(b){const{kind:C,subtype:w}=JSON.parse(b);C==="input"&&t.pipeline.addInputNode(h,{subtype:w||"file"})}}const f={agent:A$,input:oS};return(d,h)=>(K(),te("div",{class:"canvas",onDragover:u,onDrop:c},[me(Z(t1),{nodes:e.pipeline.nodes.value,edges:e.pipeline.edges.value,"node-types":f,"fit-view-on-init":!0},{default:dt(()=>[me(Z(u1),{"pattern-color":"#1c2027",gap:20}),me(Z(V1)),me(Z(x$),{pannable:"",zoomable:"",class:"canvas__minimap"})]),_:1},8,["nodes","edges"])],32))}},rS=mn(iS,[["__scopeId","data-v-b93ee04b"]]),go=ye([]);let sS=0;function Nl(){function e(t,n="info",o=4e3){const i=++sS;go.value=[...go.value,{id:i,text:t,kind:n}],setTimeout(()=>{go.value=go.value.filter(r=>r.id!==i)},o)}return{messages:go,push:e}}const lS={class:"toolbar"},aS={class:"modal__dialog modal__dialog--md"},uS={class:"modal__header"},cS={class:"modal__body"},fS={class:"modal__section"},dS={class:"modal__section-head"},hS={class:"modal__code modal__code--inline"},pS={class:"modal__section"},gS={class:"modal__section-head"},vS={class:"modal__code modal__code--scroll"},mS={class:"modal__dialog modal__dialog--sm"},yS={class:"modal__header"},_S={class:"modal__body"},wS={key:0,class:"pipeline-list__empty"},bS={key:1,class:"pipeline-list"},xS={class:"pipeline-list__info"},$S={class:"pipeline-list__name"},SS={class:"pipeline-list__meta"},ES={class:"pipeline-list__actions"},NS=["onClick"],CS=["onClick"],MS={__name:"PipelineToolbar",props:{pipeline:Object,agents:Array},emits:["rescan"],setup(e,{emit:t}){const n=e,o=t,{push:i}=Nl(),r=ye(!1),s=ye(""),l=ye(""),a=ye(!1),u=ye([]);async function c(){let C;try{C=n.pipeline.toPipelineJson()}catch(M){i(M.message,"error");return}const w={...C,nodes:n.pipeline.nodes.value,edges:n.pipeline.edges.value},k=await fetch("/api/pipelines",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}),$=await k.json();k.ok?i(`Pipeline sauvée → ${$.file}`,"success"):i(`Erreur save: ${$.error}`,"error")}function f(){let C;try{C=n.pipeline.toPipelineJson()}catch(w){i(w.message,"error");return}s.value=JSON.stringify(C,null,2),l.value=`singleton run --pipeline ./pipelines/${C.name}.json`,r.value=!0}async function d(){try{const w=await(await fetch("/api/pipelines")).json();u.value=w.pipelines||[],a.value=!0}catch(C){i(`Erreur list: ${C.message}`,"error")}}function h(C){n.pipeline.loadPipeline(C);const w=n.pipeline.sanitize();a.value=!1,w.length?i(`"${C.name}" chargée — ${w.length} edge(s) obsolète(s) retirée(s)`,"warn"):i(`"${C.name}" chargée`,"success")}async function E(C){if(!confirm(`Supprimer "${C.name}" ?`))return;(await fetch(`/api/pipelines/${encodeURIComponent(C.name)}`,{method:"DELETE"})).ok?(u.value=u.value.filter(k=>k.name!==C.name),i(`"${C.name}" supprimée`,"info")):i("Suppression échouée","error")}function b(C){navigator.clipboard.writeText(C),i("Copié","info",1200)}return(C,w)=>(K(),te("div",lS,[Ku(U("input",{"onUpdate:modelValue":w[0]||(w[0]=k=>e.pipeline.name.value=k),class:"toolbar__input",placeholder:"pipeline name"},null,512),[[Tc,e.pipeline.name.value]]),U("button",{class:"toolbar__btn",type:"button",onClick:w[1]||(w[1]=k=>o("rescan"))},"Rescan"),U("button",{class:"toolbar__btn",type:"button",onClick:d},"Load"),U("button",{class:"toolbar__btn",type:"button",onClick:c},"Save"),U("button",{class:"toolbar__btn toolbar__btn--primary",type:"button",onClick:f},"Export CLI"),U("button",{class:"toolbar__btn toolbar__btn--danger",type:"button",onClick:w[2]||(w[2]=k=>e.pipeline.clear())},"Clear"),r.value?(K(),te("div",{key:0,class:"modal",onClick:w[6]||(w[6]=gs(k=>r.value=!1,["self"]))},[U("div",aS,[U("header",uS,[w[9]||(w[9]=U("h3",{class:"modal__title"},"Export pipeline",-1)),U("button",{class:"modal__close",type:"button",onClick:w[3]||(w[3]=k=>r.value=!1)},"✕")]),U("div",cS,[U("section",fS,[U("div",dS,[w[10]||(w[10]=U("label",{class:"modal__label"},"CLI command",-1)),U("button",{class:"modal__copy",type:"button",onClick:w[4]||(w[4]=k=>b(l.value))},"Copy")]),U("pre",hS,Oe(l.value),1)]),U("section",pS,[U("div",gS,[w[11]||(w[11]=U("label",{class:"modal__label"},"Pipeline JSON",-1)),U("button",{class:"modal__copy",type:"button",onClick:w[5]||(w[5]=k=>b(s.value))},"Copy")]),U("pre",vS,Oe(s.value),1)])])])])):Ae("",!0),a.value?(K(),te("div",{key:1,class:"modal",onClick:w[8]||(w[8]=gs(k=>a.value=!1,["self"]))},[U("div",mS,[U("header",yS,[w[12]||(w[12]=U("h3",{class:"modal__title"},"Charger une pipeline",-1)),U("button",{class:"modal__close",type:"button",onClick:w[7]||(w[7]=k=>a.value=!1)},"✕")]),U("div",_S,[u.value.length===0?(K(),te("p",wS," Aucune pipeline sauvée. ")):(K(),te("ul",bS,[(K(!0),te(be,null,yt(u.value,k=>{var $;return K(),te("li",{key:k.name,class:"pipeline-list__item"},[U("div",xS,[U("div",$S,Oe(k.name),1),U("div",SS,Oe((k.steps||[]).length)+" step(s) · "+Oe((($=k.created)==null?void 0:$.slice(0,16).replace("T"," "))||"n/a"),1)]),U("div",ES,[U("button",{class:"toolbar__btn toolbar__btn--primary",type:"button",onClick:M=>h(k)},"Load",8,NS),U("button",{class:"toolbar__btn toolbar__btn--danger",type:"button",onClick:M=>E(k)},"✕",8,CS)])])}),128))]))])])])):Ae("",!0)]))}},kS=mn(MS,[["__scopeId","data-v-770bf2a0"]]),TS={class:"toast-stack"},IS={__name:"ToastStack",setup(e){const{messages:t}=Nl();return(n,o)=>(K(),te("div",TS,[(K(!0),te(be,null,yt(Z(t),i=>(K(),te("div",{key:i.id,class:Xe(["toast",`toast--${i.kind}`])},Oe(i.text),3))),128))]))}},AS=mn(IS,[["__scopeId","data-v-ac6df039"]]);function PS(){const e=ye([]),t=ye(!1),n=ye(null);async function o(){t.value=!0,n.value=null;try{const r=await fetch("/api/agents");if(!r.ok)throw new Error(`HTTP ${r.status}`);const s=await r.json();e.value=s.agents||[]}catch(r){n.value=r.message}finally{t.value=!1}}async function i(){t.value=!0,n.value=null;try{const s=await(await fetch("/api/agents/rescan",{method:"POST"})).json();e.value=s.agents||[]}catch(r){n.value=r.message}finally{t.value=!1}}return{agents:e,loading:t,error:n,fetchAgents:o,rescan:i}}function DS(e){const t=ye([]),n=ye([]),o=ye("my-pipeline");let i=0;function r(h){return e.value.find(E=>E.id===h)}function s(h,E={x:200,y:120}){i+=1;const b=`${h.id}-${i}`;return t.value=[...t.value,{id:b,type:"agent",position:E,data:{agentId:h.id}}],b}function l(h={x:80,y:120},{subtype:E="file",label:b="",value:C=""}={}){i+=1;const w=`input-${i}`;return t.value=[...t.value,{id:w,type:"input",position:h,data:{subtype:E,label:b,value:C}}],w}function a(h){t.value=t.value.filter(E=>E.id!==h),n.value=n.value.filter(E=>E.source!==h&&E.target!==h)}function u(){t.value=[],n.value=[],i=0,o.value="my-pipeline"}function c(){var C,w;const h=new Map(t.value.map(k=>[k.id,k])),E=[],b=[];for(const k of n.value){const $=h.get(k.source),M=h.get(k.target);if(!$||!M){b.push({edge:k,reason:"node introuvable"});continue}let B=!0,G="";if($.type==="agent"){const ne=r($.data.agentId),W=(C=k.sourceHandle)==null?void 0:C.replace(/^out-/,"");B=!!(ne&&ne.outputs.includes(W)),B||(G=`output "${W}" introuvable`)}else $.type==="input"?B=k.sourceHandle==="out-value":(B=!1,G="source invalide");let F=!0,X="";if(M.type==="agent"){const ne=r(M.data.agentId),W=(w=k.targetHandle)==null?void 0:w.replace(/^in-/,"");F=!!(ne&&ne.inputs.includes(W)),F||(X=`input "${W}" introuvable`)}else F=!1,X="target invalide";B&&F?E.push(k):b.push({edge:k,reason:G||X||"invalide"})}return b.length&&(n.value=E),b}function f(h){u(),o.value=h.name||"my-pipeline",t.value=Array.isArray(h.nodes)?[...h.nodes]:[],n.value=Array.isArray(h.edges)?[...h.edges]:[];for(const E of t.value){const b=String(E.id).match(/(\d+)/g);if(!b)continue;const C=Math.max(...b.map(Number));C>i&&(i=C)}}function d(){const h=new Map(t.value.map(B=>[B.id,B])),E=new Map,b=new Map;for(const B of n.value)(E.get(B.target)||E.set(B.target,[]).get(B.target)).push(B),(b.get(B.source)||b.set(B.source,[]).get(B.source)).push(B);const C=[],w=new Map;function k(B,G=[]){const F=w.get(B);if(F!=="done"){if(F==="visiting"){const X=[...G.slice(G.indexOf(B)),B].join(" → ");throw new Error(`Cycle détecté dans la pipeline: ${X}`)}w.set(B,"visiting");for(const X of E.get(B)||[])k(X.source,[...G,B]);w.set(B,"done"),C.push(B)}}for(const B of t.value)k(B.id);const M=C.filter(B=>{var G;return((G=h.get(B))==null?void 0:G.type)==="agent"}).map(B=>{var q;const G=h.get(B),F=r(G.data.agentId),X=E.get(B)||[];b.get(B);const ne={};for(const I of(F==null?void 0:F.inputs)||[]){const re=X.find(P=>P.targetHandle===`in-${I}`);if(!re){ne[I]="$FILE:<todo-set-path>";continue}const g=h.get(re.source);if((g==null?void 0:g.type)==="input")ne[I]=`$INPUT:${g.id}`;else{const P=(q=re.sourceHandle)==null?void 0:q.replace(/^out-/,"");ne[I]=`$PIPE:${g==null?void 0:g.data.agentId}.${P}`}}const W={};for(const I of(F==null?void 0:F.outputs)||[])W[I]=`$FILE:./output/${G.data.agentId}.${I}.md`;return{agent:G.data.agentId,agent_file:F==null?void 0:F.file,inputs:ne,outputs:W}});return{name:o.value,created:new Date().toISOString(),steps:M}}return{nodes:t,edges:n,name:o,addAgentNode:s,addInputNode:l,removeNode:a,clear:u,sanitize:c,loadPipeline:f,toPipelineJson:d}}const OS={class:"app"},RS={class:"app__header"},zS={class:"app__body"},BS={class:"app__canvas"},HS={__name:"App",setup(e){const{agents:t,loading:n,error:o,fetchAgents:i,rescan:r}=PS(),s=DS(t),{push:l}=Nl();Qt("agents",t);async function a(){await r();const u=s.sanitize();u.length?l(`${u.length} connexion(s) nettoyée(s) après rescan`,"warn"):l("Rescan OK","success",1800)}return _t(i),xe(t,()=>{s.sanitize()},{deep:!0}),(u,c)=>(K(),te("div",OS,[U("header",RS,[c[0]||(c[0]=U("div",{class:"app__brand"},[U("span",{class:"app__logo"},"◉"),U("h1",{class:"app__title"},"Singleton Pipeline Builder"),U("span",{class:"app__tagline"},"— drag agents, wire them up, ship a CLI command")],-1)),me(kS,{pipeline:Z(s),agents:Z(t),onRescan:a},null,8,["pipeline","agents"])]),U("div",zS,[me(Zp,{agents:Z(t),loading:Z(n),error:Z(o)},null,8,["agents","loading","error"]),U("main",BS,[me(rS,{agents:Z(t),pipeline:Z(s)},null,8,["agents","pipeline"])])]),me(AS)]))}},VS=mn(HS,[["__scopeId","data-v-599c0f81"]]);Ip(VS).mount("#app");
|
|
55
|
+
a${e.maskBorderRadius},${e.maskBorderRadius} 0 0 1 ${e.maskBorderRadius},-${e.maskBorderRadius}z`);sh(T=>{if(b.value){const H=fn(b.value),D=le=>{if(le.sourceEvent.type!=="wheel"||!d.value||!h.value)return;const ue=le.sourceEvent.ctrlKey&&Xo()?10:1,Q=-le.sourceEvent.deltaY*(le.sourceEvent.deltaMode===1?.05:le.sourceEvent.deltaMode?1:.002)*e.zoomStep,ee=a.value.zoom*2**(Q*ue);h.value.scaleTo(d.value,ee)},Y=le=>{if(le.sourceEvent.type!=="mousemove"||!d.value||!h.value)return;const ue=ne.value*Math.max(1,a.value.zoom)*(e.inversePan?-1:1),Q={x:a.value.x-le.sourceEvent.movementX*ue,y:a.value.y-le.sourceEvent.movementY*ue},ee=[[0,0],[c.value.width,c.value.height]],ie=El.translate(Q.x,Q.y).scale(a.value.zoom),fe=h.value.constrain()(ie,ee,u.value);h.value.transform(d.value,fe)},J=p$().wheelDelta(le=>Ms(le)*(e.zoomStep/10)).on("zoom",e.pannable?Y:()=>{}).on("zoom.wheel",e.zoomable?D:()=>{});H.call(J),T(()=>{H.on("zoom",null)})}},{flush:"post"});function I(T){const[H,D]=ln(T);t("click",{event:T,position:{x:H,y:D}})}function re(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeClick(D),t("nodeClick",D)}function g(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeDoubleClick(D),t("nodeDblclick",D)}function P(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseEnter(D),t("nodeMouseenter",D)}function _(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseMove(D),t("nodeMousemove",D)}function A(T,H){const D={event:T,node:H,connectedEdges:$n([H],l.value)};f.miniMapNodeMouseLeave(D),t("nodeMouseleave",D)}return(T,H)=>(K(),Ve(Z(zf),{position:T.position,class:Xe(["vue-flow__minimap",{pannable:T.pannable,zoomable:T.zoomable}])},{default:dt(()=>[(K(),te("svg",{ref_key:"el",ref:b,width:C.value,height:w.value,viewBox:[W.value.x,W.value.y,W.value.width,W.value.height].join(" "),role:"img","aria-labelledby":`vue-flow__minimap-${Z(s)}`,onClick:I},[T.ariaLabel?(K(),te("title",{key:0,id:`vue-flow__minimap-${Z(s)}`},Oe(T.ariaLabel),9,_$)):Ae("",!0),(K(!0),te(be,null,yt(Z(E),D=>(K(),Ve(m$,{id:D.id,key:D.id,f:"",position:D.computedPosition,dimensions:D.dimensions,selected:D.selected,dragging:D.dragging,style:tt(D.style),class:Xe(B.value(D)),color:$.value(D),"border-radius":T.nodeBorderRadius,"stroke-color":M.value(D),"stroke-width":T.nodeStrokeWidth,"shape-rendering":Z(k),type:D.type,hidden:D.hidden,onClick:Y=>re(Y,D),onDblclick:Y=>g(Y,D),onMouseenter:Y=>P(Y,D),onMousemove:Y=>_(Y,D),onMouseleave:Y=>A(Y,D)},null,8,["id","position","dimensions","selected","dragging","style","class","color","border-radius","stroke-color","stroke-width","shape-rendering","type","hidden","onClick","onDblclick","onMouseenter","onMousemove","onMouseleave"]))),128)),U("path",{class:"vue-flow__minimap-mask",d:q.value,fill:T.maskColor,stroke:T.maskStrokeColor,"stroke-width":T.maskStrokeWidth,"fill-rule":"evenodd"},null,8,w$)],8,y$))]),_:1},8,["position","class"]))}}),$$={class:"node-agent__head"},S$={class:"node-agent__id"},E$={key:0,class:"node-agent__badge"},N$={key:0,class:"node-agent__warn"},C$={class:"node-agent__desc"},M$={class:"node-agent__ports"},k$={class:"node-agent__col node-agent__col--in"},T$={class:"node-agent__col node-agent__col--out"},I$={__name:"AgentNode",props:{id:String,data:Object},setup(e){const t=e,n=ct("agents"),{removeNodes:o}=ke(),i=ce(()=>n.value.find(s=>s.id===t.data.agentId)),r=ce(()=>!i.value);return(s,l)=>(K(),te("div",{class:Xe(["node-agent",{"node-agent--stale":r.value}])},[U("header",$$,[U("span",S$,[hn(Oe(e.data.agentId)+" ",1),r.value?(K(),te("span",E$,"stale")):Ae("",!0)]),U("button",{class:"node-agent__close",type:"button",onClick:l[0]||(l[0]=a=>Z(o)([e.id])),title:"Remove node"},"✕")]),r.value?(K(),te("p",N$," Agent introuvable dans le repo. Supprime le node ou restaure le fichier. ")):(K(),te(be,{key:1},[U("p",C$,Oe(i.value.description),1),U("div",M$,[U("div",k$,[l[1]||(l[1]=U("div",{class:"node-agent__col-title"},"Inputs",-1)),(K(!0),te(be,null,yt(i.value.inputs,a=>(K(),te("div",{key:a,class:"node-agent__port node-agent__port--in"},[me(Z(On),{id:`in-${a}`,type:"target",position:Z(ae).Left,style:{top:"50%"}},null,8,["id","position"]),hn(" "+Oe(a),1)]))),128))]),U("div",T$,[l[2]||(l[2]=U("div",{class:"node-agent__col-title"},"Outputs",-1)),(K(!0),te(be,null,yt(i.value.outputs,a=>(K(),te("div",{key:a,class:"node-agent__port node-agent__port--out"},[hn(Oe(a)+" ",1),me(Z(On),{id:`out-${a}`,type:"source",position:Z(ae).Right,style:{top:"50%"}},null,8,["id","position"])]))),128))])])],64))],2))}},A$=mn(I$,[["__scopeId","data-v-9ea2f689"]]);function P$(){const e=ye([]),t=ye(!1),n=ye("");async function o(i="md"){t.value=!0,n.value="";try{const r=await fetch(`/api/files?ext=${encodeURIComponent(i)}`),s=await r.json();if(!r.ok)throw new Error(s.error||"list failed");e.value=s.files||[]}catch(r){n.value=r instanceof Error?r.message:String(r),e.value=[]}finally{t.value=!1}}return{files:e,loading:t,error:n,fetchFiles:o}}const D$={class:"file-picker__dialog"},O$={class:"file-picker__head"},R$={class:"file-picker__title"},z$={class:"file-picker__body"},B$=["placeholder"],H$={key:0,class:"file-picker__state"},V$={key:1,class:"file-picker__state file-picker__state--error"},F$={key:2,class:"file-picker__state"},L$={key:3,class:"file-picker__list"},Y$=["onClick"],G$={__name:"FilePicker",props:{open:Boolean,ext:{type:String,default:"md"},title:{type:String,default:"Choisir un fichier"}},emits:["close","pick"],setup(e,{emit:t}){const n=e,o=t,{files:i,loading:r,error:s,fetchFiles:l}=P$(),a=ye("");xe(()=>n.open,f=>{f&&(a.value="",l(n.ext))}),_t(()=>{n.open&&l(n.ext)});const u=ce(()=>{const f=a.value.trim().toLowerCase();return f?i.value.filter(d=>d.toLowerCase().includes(f)):i.value});function c(f){o("pick",f),o("close")}return(f,d)=>e.open?(K(),te("div",{key:0,class:"file-picker",onClick:d[2]||(d[2]=gs(h=>o("close"),["self"]))},[U("div",D$,[U("header",O$,[U("h3",R$,Oe(e.title),1),U("button",{class:"file-picker__close",type:"button",onClick:d[0]||(d[0]=h=>o("close"))},"✕")]),U("div",z$,[Ku(U("input",{"onUpdate:modelValue":d[1]||(d[1]=h=>a.value=h),class:"file-picker__search",type:"text",placeholder:`Filtrer… (${Z(i).length} fichier(s) .${e.ext})`,autofocus:""},null,8,B$),[[Tc,a.value]]),Z(r)?(K(),te("div",H$,"Chargement…")):Z(s)?(K(),te("div",V$,Oe(Z(s)),1)):u.value.length===0?(K(),te("div",F$,"Aucun fichier.")):(K(),te("ul",L$,[(K(!0),te(be,null,yt(u.value,h=>(K(),te("li",{key:h,class:"file-picker__item",onClick:E=>c(h)},Oe(h),9,Y$))),128))]))])])])):Ae("",!0)}},U$=mn(G$,[["__scopeId","data-v-be890d20"]]),X$={class:"node-input__head"},W$={class:"node-input__meta"},K$={class:"node-input__subtypes"},Z$={class:"node-input__body"},q$=["value"],j$={key:0,class:"node-input__path"},J$={key:1,class:"node-input__placeholder"},Q$=["value"],eS=["value"],tS={class:"node-input__port"},nS={__name:"InputNode",props:{id:String,data:Object},setup(e){const t=e,{removeNodes:n,updateNodeData:o}=ke(),i=ye(!1);function r(s){o(t.id,s)}return(s,l)=>(K(),te("div",{class:Xe(["node-input",`node-input--${e.data.subtype||"file"}`])},[U("header",X$,[U("div",W$,[l[9]||(l[9]=U("span",{class:"node-input__kind"},"Input",-1)),U("div",K$,[U("button",{class:Xe(["node-input__st",{"node-input__st--active":(e.data.subtype||"file")==="file"}]),type:"button",onClick:l[0]||(l[0]=a=>r({subtype:"file"}))},"file",2),U("button",{class:Xe(["node-input__st",{"node-input__st--active":e.data.subtype==="text"}]),type:"button",onClick:l[1]||(l[1]=a=>r({subtype:"text"}))},"text",2)])]),U("button",{class:"node-input__close",type:"button",onClick:l[2]||(l[2]=a=>Z(n)([e.id]))},"✕")]),U("div",Z$,[(e.data.subtype||"file")==="file"?(K(),te(be,{key:0},[U("input",{class:"node-input__field",value:e.data.label||"",placeholder:"Label…",onInput:l[3]||(l[3]=a=>r({label:a.target.value}))},null,40,q$),U("button",{class:"node-input__file-btn",type:"button",onClick:l[4]||(l[4]=a=>i.value=!0)},[e.data.value?(K(),te("span",j$,Oe(e.data.value),1)):(K(),te("span",J$,"— choisir un fichier —"))]),me(U$,{open:i.value,ext:"",title:"Input — choisir un fichier",onClose:l[5]||(l[5]=a=>i.value=!1),onPick:l[6]||(l[6]=a=>r({value:a}))},null,8,["open"])],64)):(K(),te(be,{key:1},[U("input",{class:"node-input__field",value:e.data.label||"",placeholder:"Question à poser…",onInput:l[7]||(l[7]=a=>r({label:a.target.value}))},null,40,Q$),U("input",{class:"node-input__field node-input__field--dim",value:e.data.value||"",placeholder:"Valeur par défaut (optionnel)",onInput:l[8]||(l[8]=a=>r({value:a.target.value}))},null,40,eS)],64))]),U("div",tS,[l[10]||(l[10]=hn(" value ",-1)),me(Z(On),{id:"out-value",type:"source",position:Z(ae).Right},null,8,["position"])])],2))}},oS=mn(nS,[["__scopeId","data-v-95ec91bc"]]),iS={__name:"PipelineCanvas",props:{agents:Array,pipeline:Object},setup(e){const t=e,{onConnect:n,addEdges:o,screenToFlowCoordinate:i,onNodesChange:r,onEdgesChange:s,applyNodeChanges:l,applyEdgeChanges:a}=ke();n(d=>{o([{...d,id:`e-${d.source}-${d.sourceHandle}->${d.target}-${d.targetHandle}`}])}),r(d=>{t.pipeline.nodes.value=l(d,t.pipeline.nodes.value)}),s(d=>{t.pipeline.edges.value=a(d,t.pipeline.edges.value)});function u(d){d.preventDefault(),d.dataTransfer.dropEffect="move"}function c(d){d.preventDefault();const h=i({x:d.clientX,y:d.clientY}),E=d.dataTransfer.getData("application/singleton-agent");if(E){t.pipeline.addAgentNode(JSON.parse(E),h);return}const b=d.dataTransfer.getData("application/singleton-node");if(b){const{kind:C,subtype:w}=JSON.parse(b);C==="input"&&t.pipeline.addInputNode(h,{subtype:w||"file"})}}const f={agent:A$,input:oS};return(d,h)=>(K(),te("div",{class:"canvas",onDragover:u,onDrop:c},[me(Z(t1),{nodes:e.pipeline.nodes.value,edges:e.pipeline.edges.value,"node-types":f,"fit-view-on-init":!0},{default:dt(()=>[me(Z(u1),{"pattern-color":"#1c2027",gap:20}),me(Z(V1)),me(Z(x$),{pannable:"",zoomable:"",class:"canvas__minimap"})]),_:1},8,["nodes","edges"])],32))}},rS=mn(iS,[["__scopeId","data-v-b93ee04b"]]),go=ye([]);let sS=0;function Nl(){function e(t,n="info",o=4e3){const i=++sS;go.value=[...go.value,{id:i,text:t,kind:n}],setTimeout(()=>{go.value=go.value.filter(r=>r.id!==i)},o)}return{messages:go,push:e}}const lS={class:"toolbar"},aS={class:"modal__dialog modal__dialog--md"},uS={class:"modal__header"},cS={class:"modal__body"},fS={class:"modal__section"},dS={class:"modal__section-head"},hS={class:"modal__code modal__code--inline"},pS={class:"modal__section"},gS={class:"modal__section-head"},vS={class:"modal__code modal__code--scroll"},mS={class:"modal__dialog modal__dialog--sm"},yS={class:"modal__header"},_S={class:"modal__body"},wS={key:0,class:"pipeline-list__empty"},bS={key:1,class:"pipeline-list"},xS={class:"pipeline-list__info"},$S={class:"pipeline-list__name"},SS={class:"pipeline-list__meta"},ES={class:"pipeline-list__actions"},NS=["onClick"],CS=["onClick"],MS={__name:"PipelineToolbar",props:{pipeline:Object,agents:Array},emits:["rescan"],setup(e,{emit:t}){const n=e,o=t,{push:i}=Nl(),r=ye(!1),s=ye(""),l=ye(""),a=ye(!1),u=ye([]);async function c(){let C;try{C=n.pipeline.toPipelineJson()}catch(M){i(M.message,"error");return}const w={...C,nodes:n.pipeline.nodes.value,edges:n.pipeline.edges.value},k=await fetch("/api/pipelines",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}),$=await k.json();k.ok?i(`Pipeline sauvée → ${$.file}`,"success"):i(`Erreur save: ${$.error}`,"error")}function f(){let C;try{C=n.pipeline.toPipelineJson()}catch(w){i(w.message,"error");return}s.value=JSON.stringify(C,null,2),l.value=`singleton run --pipeline ./pipelines/${C.name}.json`,r.value=!0}async function d(){try{const w=await(await fetch("/api/pipelines")).json();u.value=w.pipelines||[],a.value=!0}catch(C){i(`Erreur list: ${C.message}`,"error")}}function h(C){n.pipeline.loadPipeline(C);const w=n.pipeline.sanitize();a.value=!1,w.length?i(`"${C.name}" chargée — ${w.length} edge(s) obsolète(s) retirée(s)`,"warn"):i(`"${C.name}" chargée`,"success")}async function E(C){if(!confirm(`Supprimer "${C.name}" ?`))return;(await fetch(`/api/pipelines/${encodeURIComponent(C.name)}`,{method:"DELETE"})).ok?(u.value=u.value.filter(k=>k.name!==C.name),i(`"${C.name}" supprimée`,"info")):i("Suppression échouée","error")}function b(C){navigator.clipboard.writeText(C),i("Copié","info",1200)}return(C,w)=>(K(),te("div",lS,[Ku(U("input",{"onUpdate:modelValue":w[0]||(w[0]=k=>e.pipeline.name.value=k),class:"toolbar__input",placeholder:"pipeline name"},null,512),[[Tc,e.pipeline.name.value]]),U("button",{class:"toolbar__btn",type:"button",onClick:w[1]||(w[1]=k=>o("rescan"))},"Rescan"),U("button",{class:"toolbar__btn",type:"button",onClick:d},"Load"),U("button",{class:"toolbar__btn",type:"button",onClick:c},"Save"),U("button",{class:"toolbar__btn toolbar__btn--primary",type:"button",onClick:f},"Export CLI"),U("button",{class:"toolbar__btn toolbar__btn--danger",type:"button",onClick:w[2]||(w[2]=k=>e.pipeline.clear())},"Clear"),r.value?(K(),te("div",{key:0,class:"modal",onClick:w[6]||(w[6]=gs(k=>r.value=!1,["self"]))},[U("div",aS,[U("header",uS,[w[9]||(w[9]=U("h3",{class:"modal__title"},"Export pipeline",-1)),U("button",{class:"modal__close",type:"button",onClick:w[3]||(w[3]=k=>r.value=!1)},"✕")]),U("div",cS,[U("section",fS,[U("div",dS,[w[10]||(w[10]=U("label",{class:"modal__label"},"CLI command",-1)),U("button",{class:"modal__copy",type:"button",onClick:w[4]||(w[4]=k=>b(l.value))},"Copy")]),U("pre",hS,Oe(l.value),1)]),U("section",pS,[U("div",gS,[w[11]||(w[11]=U("label",{class:"modal__label"},"Pipeline JSON",-1)),U("button",{class:"modal__copy",type:"button",onClick:w[5]||(w[5]=k=>b(s.value))},"Copy")]),U("pre",vS,Oe(s.value),1)])])])])):Ae("",!0),a.value?(K(),te("div",{key:1,class:"modal",onClick:w[8]||(w[8]=gs(k=>a.value=!1,["self"]))},[U("div",mS,[U("header",yS,[w[12]||(w[12]=U("h3",{class:"modal__title"},"Charger une pipeline",-1)),U("button",{class:"modal__close",type:"button",onClick:w[7]||(w[7]=k=>a.value=!1)},"✕")]),U("div",_S,[u.value.length===0?(K(),te("p",wS," Aucune pipeline sauvée. ")):(K(),te("ul",bS,[(K(!0),te(be,null,yt(u.value,k=>{var $;return K(),te("li",{key:k.name,class:"pipeline-list__item"},[U("div",xS,[U("div",$S,Oe(k.name),1),U("div",SS,Oe((k.steps||[]).length)+" step(s) · "+Oe((($=k.created)==null?void 0:$.slice(0,16).replace("T"," "))||"n/a"),1)]),U("div",ES,[U("button",{class:"toolbar__btn toolbar__btn--primary",type:"button",onClick:M=>h(k)},"Load",8,NS),U("button",{class:"toolbar__btn toolbar__btn--danger",type:"button",onClick:M=>E(k)},"✕",8,CS)])])}),128))]))])])])):Ae("",!0)]))}},kS=mn(MS,[["__scopeId","data-v-770bf2a0"]]),TS={class:"toast-stack"},IS={__name:"ToastStack",setup(e){const{messages:t}=Nl();return(n,o)=>(K(),te("div",TS,[(K(!0),te(be,null,yt(Z(t),i=>(K(),te("div",{key:i.id,class:Xe(["toast",`toast--${i.kind}`])},Oe(i.text),3))),128))]))}},AS=mn(IS,[["__scopeId","data-v-ac6df039"]]);function PS(){const e=ye([]),t=ye(!1),n=ye(null);async function o(){t.value=!0,n.value=null;try{const r=await fetch("/api/agents");if(!r.ok)throw new Error(`HTTP ${r.status}`);const s=await r.json();e.value=s.agents||[]}catch(r){n.value=r instanceof Error?r.message:String(r)}finally{t.value=!1}}async function i(){t.value=!0,n.value=null;try{const s=await(await fetch("/api/agents/rescan",{method:"POST"})).json();e.value=s.agents||[]}catch(r){n.value=r instanceof Error?r.message:String(r)}finally{t.value=!1}}return{agents:e,loading:t,error:n,fetchAgents:o,rescan:i}}function DS(e){const t=ye([]),n=ye([]),o=ye("my-pipeline");let i=0;function r(h){return e.value.find(E=>E.id===h)}function s(h,E={x:200,y:120}){i+=1;const b=`${h.id}-${i}`;return t.value=[...t.value,{id:b,type:"agent",position:E,data:{agentId:h.id}}],b}function l(h={x:80,y:120},{subtype:E="file",label:b="",value:C=""}={}){i+=1;const w=`input-${i}`;return t.value=[...t.value,{id:w,type:"input",position:h,data:{subtype:E,label:b,value:C}}],w}function a(h){t.value=t.value.filter(E=>E.id!==h),n.value=n.value.filter(E=>E.source!==h&&E.target!==h)}function u(){t.value=[],n.value=[],i=0,o.value="my-pipeline"}function c(){var C,w;const h=new Map(t.value.map(k=>[k.id,k])),E=[],b=[];for(const k of n.value){const $=h.get(k.source),M=h.get(k.target);if(!$||!M){b.push({edge:k,reason:"node introuvable"});continue}let B=!0,G="";if($.type==="agent"){const ne=r($.data.agentId),W=((C=k.sourceHandle)==null?void 0:C.replace(/^out-/,""))||"";B=!!(ne&&ne.outputs.includes(W)),B||(G=`output "${W}" introuvable`)}else $.type==="input"?B=k.sourceHandle==="out-value":(B=!1,G="source invalide");let F=!0,X="";if(M.type==="agent"){const ne=r(M.data.agentId),W=((w=k.targetHandle)==null?void 0:w.replace(/^in-/,""))||"";F=!!(ne&&ne.inputs.includes(W)),F||(X=`input "${W}" introuvable`)}else F=!1,X="target invalide";B&&F?E.push(k):b.push({edge:k,reason:G||X||"invalide"})}return b.length&&(n.value=E),b}function f(h){u(),o.value=h.name||"my-pipeline",t.value=Array.isArray(h.nodes)?[...h.nodes]:[],n.value=Array.isArray(h.edges)?[...h.edges]:[];for(const E of t.value){const b=String(E.id).match(/(\d+)/g);if(!b)continue;const C=Math.max(...b.map(Number));C>i&&(i=C)}}function d(){const h=new Map(t.value.map(B=>[B.id,B])),E=new Map,b=new Map;for(const B of n.value)(E.get(B.target)||E.set(B.target,[]).get(B.target)).push(B),(b.get(B.source)||b.set(B.source,[]).get(B.source)).push(B);const C=[],w=new Map;function k(B,G=[]){const F=w.get(B);if(F!=="done"){if(F==="visiting"){const X=[...G.slice(G.indexOf(B)),B].join(" → ");throw new Error(`Cycle détecté dans la pipeline: ${X}`)}w.set(B,"visiting");for(const X of E.get(B)||[])k(X.source,[...G,B]);w.set(B,"done"),C.push(B)}}for(const B of t.value)k(B.id);const M=C.filter(B=>{var G;return((G=h.get(B))==null?void 0:G.type)==="agent"}).map(B=>{var q;const G=h.get(B);if(!G)throw new Error(`Missing pipeline node: ${B}`);const F=r(G.data.agentId),X=E.get(B)||[];b.get(B);const ne={};for(const I of(F==null?void 0:F.inputs)||[]){const re=X.find(P=>P.targetHandle===`in-${I}`);if(!re){ne[I]="$FILE:<todo-set-path>";continue}const g=h.get(re.source);if((g==null?void 0:g.type)==="input")ne[I]=`$INPUT:${g.id}`;else{const P=(q=re.sourceHandle)==null?void 0:q.replace(/^out-/,"");ne[I]=`$PIPE:${g==null?void 0:g.data.agentId}.${P}`}}const W={};for(const I of(F==null?void 0:F.outputs)||[])W[I]=`$FILE:./output/${G.data.agentId}.${I}.md`;return{agent:G.data.agentId,agent_file:F==null?void 0:F.file,inputs:ne,outputs:W}});return{name:o.value,created:new Date().toISOString(),steps:M}}return{nodes:t,edges:n,name:o,addAgentNode:s,addInputNode:l,removeNode:a,clear:u,sanitize:c,loadPipeline:f,toPipelineJson:d}}const OS="/assets/logo-COSyZmgk.png",RS={class:"app"},zS={class:"app__header"},BS={class:"app__brand"},HS=["src"],VS={class:"app__body"},FS={class:"app__canvas"},LS={__name:"App",setup(e){const{agents:t,loading:n,error:o,fetchAgents:i,rescan:r}=PS(),s=DS(t),{push:l}=Nl();Qt("agents",t);async function a(){await r();const u=s.sanitize();u.length?l(`${u.length} connexion(s) nettoyée(s) après rescan`,"warn"):l("Rescan OK","success",1800)}return _t(i),xe(t,()=>{s.sanitize()},{deep:!0}),(u,c)=>(K(),te("div",RS,[U("header",zS,[U("div",BS,[U("img",{class:"app__logo",src:Z(OS),alt:"Singleton"},null,8,HS),c[0]||(c[0]=U("h1",{class:"app__title"},"Singleton Pipeline Builder",-1)),c[1]||(c[1]=U("span",{class:"app__tagline"},"— drag agents, wire them up, ship a CLI command",-1))]),me(kS,{pipeline:Z(s),agents:Z(t),onRescan:a},null,8,["pipeline","agents"])]),U("div",VS,[me(Zp,{agents:Z(t),loading:Z(n),error:Z(o)},null,8,["agents","loading","error"]),U("main",FS,[me(rS,{agents:Z(t),pipeline:Z(s)},null,8,["agents","pipeline"])])]),me(AS)]))}},YS=mn(LS,[["__scopeId","data-v-6e13e9f8"]]);Ip(YS).mount("#app");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.sidebar[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;width:288px;border-right:1px solid #262b34;background-color:#14171c;flex-shrink:0}.sidebar__header[data-v-82474bb7]{padding:12px;border-bottom:1px solid #262b34}.sidebar__title[data-v-82474bb7]{margin:0;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#94a3b8}.sidebar__hint[data-v-82474bb7]{margin:4px 0 0;font-size:11px;color:#64748b}.sidebar__list[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar{width:10px;height:10px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-track{background:transparent}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-thumb:hover{background:#3a4150}.sidebar__list[data-v-82474bb7]{flex:1;overflow-y:auto;padding:12px}.sidebar__state[data-v-82474bb7]{font-size:12px;color:#94a3b8}.sidebar__state--error[data-v-82474bb7]{color:#ef4444}.sidebar__state code[data-v-82474bb7]{font-size:11px;background:#1c2027;padding:2px 4px;border-radius:4px}.sidebar__nodes[data-v-82474bb7]{padding:12px;border-bottom:1px solid #262b34}.sidebar__subtitle[data-v-82474bb7]{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:#64748b;margin-bottom:4px}.sidebar__io-row[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.io-card[data-v-82474bb7]{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:2px;flex:1;padding:8px;border-radius:6px;border:1px solid #3a4150;border-left:3px solid #7dd3fc;background-color:#1c2027;cursor:grab;transition:background-color .12s ease,border-color .12s ease}.io-card[data-v-82474bb7]:hover{background-color:#262b34;border-color:#38bdf8}.io-card[data-v-82474bb7]:active{cursor:grabbing}.io-card__label[data-v-82474bb7]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#7dd3fc}.io-card__hint[data-v-82474bb7]{font-size:10px;color:#64748b}.agent-card[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;padding:12px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;cursor:grab;transition:background-color .12s ease,border-color .12s ease}.agent-card[data-v-82474bb7]:hover{background-color:#262b34;border-color:#38bdf8}.agent-card[data-v-82474bb7]:active{cursor:grabbing}.agent-card__head[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px}.agent-card__id[data-v-82474bb7]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc}.agent-card__model[data-v-82474bb7]{font-size:10px;color:#64748b}.agent-card__desc[data-v-82474bb7]{margin:0;font-size:11px;color:#94a3b8;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.agent-card__tags[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:4px;flex-wrap:wrap}.agent-card__tag[data-v-82474bb7]{font-size:10px;padding:2px 6px;border-radius:4px;background:#3a4150;color:#94a3b8}.agent-card__ports[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:12px;font-size:10px;color:#64748b}.node-agent[data-v-9ea2f689]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;min-width:220px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;box-shadow:0 4px 12px #00000059;color:#f1f5f9}.node-agent--stale[data-v-9ea2f689]{border-color:#7f1d1d;background-color:#450a0a}.node-agent--stale .node-agent__head[data-v-9ea2f689]{background-color:#7f1d1d;border-bottom-color:#7f1d1d}.node-agent--stale .node-agent__id[data-v-9ea2f689]{color:#fee2e2}.node-agent__head[data-v-9ea2f689]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid #3a4150;background-color:#14171c;border-radius:8px 8px 0 0}.node-agent__id[data-v-9ea2f689]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc}.node-agent__badge[data-v-9ea2f689]{margin-left:4px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#fee2e2}.node-agent__close[data-v-9ea2f689]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#64748b;transition:color .12s ease}.node-agent__close[data-v-9ea2f689]:hover{color:#ef4444}.node-agent__desc[data-v-9ea2f689]{margin:0;padding:8px 12px;font-size:11px;color:#94a3b8;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.node-agent__warn[data-v-9ea2f689]{margin:0;padding:8px 12px;font-size:11px;color:#fee2e2}.node-agent__ports[data-v-9ea2f689]{display:flex;flex-direction:row;align-items:stretch;justify-content:flex-start;gap:8px;padding:8px 12px;border-top:1px solid #3a4150}.node-agent__col[data-v-9ea2f689]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;flex:1}.node-agent__col--out[data-v-9ea2f689]{text-align:right}.node-agent__col-title[data-v-9ea2f689]{font-size:10px;text-transform:uppercase;color:#64748b;margin-bottom:4px}.node-agent__port[data-v-9ea2f689]{position:relative;font-size:11px;color:#94a3b8;padding:4px 0}.node-agent__port--in[data-v-9ea2f689]{padding-left:8px}.node-agent__port--out[data-v-9ea2f689]{padding-right:8px}.file-picker[data-v-be890d20]{display:flex;align-items:center;justify-content:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background-color:#0009}.file-picker__dialog[data-v-be890d20]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;width:720px;max-width:95vw;max-height:80vh;border-radius:8px;border:1px solid #3a4150;background-color:#14171c;box-shadow:0 8px 24px #00000073}.file-picker__head[data-v-be890d20]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;padding:12px;border-bottom:1px solid #262b34}.file-picker__title[data-v-be890d20]{margin:0;font-size:14px;font-weight:600}.file-picker__close[data-v-be890d20]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;color:#94a3b8}.file-picker__close[data-v-be890d20]:hover{color:#f1f5f9}.file-picker__body[data-v-be890d20]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:12px;overflow:hidden}.file-picker__search[data-v-be890d20]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;padding:4px 8px;font-size:12px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9}.file-picker__search[data-v-be890d20]:focus{border-color:#38bdf8}.file-picker__state[data-v-be890d20]{padding:12px;font-size:12px;color:#94a3b8;text-align:center}.file-picker__state--error[data-v-be890d20]{color:#ef4444}.file-picker__list[data-v-be890d20]::-webkit-scrollbar{width:10px;height:10px}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-track{background:transparent}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-thumb:hover{background:#3a4150}.file-picker__list[data-v-be890d20]{list-style:none;margin:0;padding:0;overflow-y:auto;max-height:55vh;border:1px solid #262b34;border-radius:6px}.file-picker__item[data-v-be890d20]{padding:4px 8px;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#f1f5f9;cursor:pointer;border-bottom:1px solid #262b34}.file-picker__item[data-v-be890d20]:last-child{border-bottom:0}.file-picker__item[data-v-be890d20]:hover{background-color:#1c2027;color:#7dd3fc}.node-input[data-v-95ec91bc]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;min-width:220px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;box-shadow:0 4px 12px #00000059;color:#f1f5f9;border-left:3px solid #7dd3fc}.node-input__head[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid #3a4150;background-color:#14171c;border-radius:8px 8px 0 0}.node-input__meta[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.node-input__kind[data-v-95ec91bc]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#7dd3fc;text-transform:uppercase;letter-spacing:.06em}.node-input__subtypes[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:2px}.node-input__st[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;font-size:10px;padding:1px 4px;border-radius:4px;color:#64748b;border:1px solid transparent;transition:color .12s ease,border-color .12s ease}.node-input__st[data-v-95ec91bc]:hover{color:#94a3b8}.node-input__st--active[data-v-95ec91bc]{color:#7dd3fc;border-color:#3a4150}.node-input__close[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#64748b}.node-input__close[data-v-95ec91bc]:hover{color:#ef4444}.node-input__body[data-v-95ec91bc]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0}.node-input__field[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;padding:4px 12px;font-size:11px;color:#f1f5f9;border-bottom:1px solid #3a4150;background:transparent;transition:background-color .12s ease}.node-input__field[data-v-95ec91bc]::placeholder{color:#64748b;font-style:italic}.node-input__field[data-v-95ec91bc]:focus{background-color:#262b34}.node-input__field--dim[data-v-95ec91bc]{color:#94a3b8}.node-input__file-btn[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;padding:8px 12px;text-align:left;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;transition:background-color .12s ease;border-bottom:1px solid #3a4150}.node-input__file-btn[data-v-95ec91bc]:hover{background-color:#262b34}.node-input__path[data-v-95ec91bc]{color:#7dd3fc}.node-input__placeholder[data-v-95ec91bc]{color:#64748b;font-style:italic}.node-input__port[data-v-95ec91bc]{position:relative;font-size:11px;color:#94a3b8;padding:4px 12px;text-align:right}.canvas[data-v-b93ee04b]{width:100%;height:100%}.canvas[data-v-b93ee04b] .canvas__minimap{background-color:#14171c!important}.toolbar[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.toolbar__input[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;width:160px;padding:4px 8px;font-size:11px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9;transition:border-color .12s ease}.toolbar__input[data-v-770bf2a0]:focus{border-color:#38bdf8}.toolbar__btn[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;padding:4px 12px;font-size:11px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9;transition:background-color .12s ease,border-color .12s ease}.toolbar__btn[data-v-770bf2a0]:hover{background-color:#262b34}.toolbar__btn--primary[data-v-770bf2a0]{background-color:#0ea5e9;border-color:#0ea5e9;color:#fff}.toolbar__btn--primary[data-v-770bf2a0]:hover{background-color:#38bdf8;border-color:#38bdf8}.toolbar__btn--danger[data-v-770bf2a0]:hover{background-color:#7f1d1d;border-color:#7f1d1d}.modal[data-v-770bf2a0]{display:flex;align-items:center;justify-content:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background-color:#0009}.modal__dialog[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;max-width:95vw;max-height:85vh;border-radius:8px;border:1px solid #3a4150;background-color:#14171c;box-shadow:0 8px 24px #00000073}.modal__dialog--sm[data-v-770bf2a0]{width:560px}.modal__dialog--md[data-v-770bf2a0]{width:720px}.modal__header[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;padding:12px;border-bottom:1px solid #262b34}.modal__title[data-v-770bf2a0]{margin:0;font-size:14px;font-weight:600}.modal__close[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;color:#94a3b8;transition:color .12s ease}.modal__close[data-v-770bf2a0]:hover{color:#f1f5f9}.modal__body[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:16px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar{width:10px;height:10px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-track{background:transparent}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-thumb:hover{background:#3a4150}.modal__body[data-v-770bf2a0]{padding:16px;overflow-y:auto}.modal__section[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px}.modal__section-head[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px}.modal__label[data-v-770bf2a0]{font-size:11px;text-transform:uppercase;color:#94a3b8}.modal__copy[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#7dd3fc}.modal__copy[data-v-770bf2a0]:hover{color:#38bdf8}.modal__code[data-v-770bf2a0]{margin:0;padding:8px 12px;font-size:11px;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;color:#7dd3fc;background-color:#0b0d10;border:1px solid #262b34;border-radius:6px}.modal__code--inline[data-v-770bf2a0]{white-space:pre-wrap}.modal__code--scroll[data-v-770bf2a0]{overflow:auto;max-height:50vh;color:#f1f5f9}.pipeline-list[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;list-style:none;margin:0;padding:0}.pipeline-list__empty[data-v-770bf2a0]{margin:0;padding:16px;text-align:center;font-size:12px;color:#64748b}.pipeline-list__item[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 0;border-bottom:1px solid #262b34}.pipeline-list__item[data-v-770bf2a0]:last-child{border-bottom:0}.pipeline-list__info[data-v-770bf2a0]{min-width:0;flex:1}.pipeline-list__name[data-v-770bf2a0]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pipeline-list__meta[data-v-770bf2a0]{font-size:10px;color:#64748b}.pipeline-list__actions[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:4px;flex-shrink:0}.toast-stack[data-v-ac6df039]{display:flex;flex-direction:column;align-items:flex-end;justify-content:flex-start;gap:8px;position:fixed;right:16px;bottom:16px;z-index:60}.toast[data-v-ac6df039]{padding:8px 12px;max-width:360px;font-size:11px;border-radius:8px;border:1px solid;box-shadow:0 4px 12px #00000059}.toast--info[data-v-ac6df039]{background-color:#1c2027;border-color:#3a4150;color:#f1f5f9}.toast--warn[data-v-ac6df039]{background-color:#b45309d9;border-color:#d97706;color:#fde68a}.toast--error[data-v-ac6df039]{background-color:#7f1d1dd9;border-color:#dc2626;color:#fee2e2}.toast--success[data-v-ac6df039]{background-color:#064e3bd9;border-color:#10b981;color:#d1fae5}.app[data-v-599c0f81]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;height:100vh}.app__header[data-v-599c0f81]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;height:48px;padding:0 16px;border-bottom:1px solid #262b34;background-color:#14171c;flex-shrink:0}.app__brand[data-v-599c0f81]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.app__logo[data-v-599c0f81]{color:#7dd3fc;font-weight:700}.app__title[data-v-599c0f81]{margin:0;font-size:14px;font-weight:600}.app__tagline[data-v-599c0f81]{font-size:11px;color:#64748b}.app__body[data-v-599c0f81]{display:flex;flex-direction:row;align-items:stretch;justify-content:flex-start;gap:0;flex:1;overflow:hidden}.app__canvas[data-v-599c0f81]{flex:1;position:relative}.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}*,*:before,*:after{box-sizing:border-box}html,body,#app{height:100%;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;background-color:#0b0d10;color:#f1f5f9;-webkit-font-smoothing:antialiased}a{color:#38bdf8}code,pre{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace}.vue-flow__node-agent{padding:0;border:none;background:transparent;box-shadow:none}.vue-flow__handle{width:10px;height:10px;background:#38bdf8;border:2px solid #0b0d10}.vue-flow__edge-path{stroke:#38bdf8;stroke-width:2}.vue-flow__background{background-color:#0b0d10}.vue-flow__controls button{background:#1c2027;border-color:#3a4150;color:#f1f5f9}.vue-flow__controls button:hover{background:#262b34}.vue-flow__controls button svg{fill:#f1f5f9}.vue-flow__minimap{background:#14171c!important}
|
|
1
|
+
.sidebar[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;width:288px;border-right:1px solid #262b34;background-color:#14171c;flex-shrink:0}.sidebar__header[data-v-82474bb7]{padding:12px;border-bottom:1px solid #262b34}.sidebar__title[data-v-82474bb7]{margin:0;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#94a3b8}.sidebar__hint[data-v-82474bb7]{margin:4px 0 0;font-size:11px;color:#64748b}.sidebar__list[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar{width:10px;height:10px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-track{background:transparent}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.sidebar__list[data-v-82474bb7]::-webkit-scrollbar-thumb:hover{background:#3a4150}.sidebar__list[data-v-82474bb7]{flex:1;overflow-y:auto;padding:12px}.sidebar__state[data-v-82474bb7]{font-size:12px;color:#94a3b8}.sidebar__state--error[data-v-82474bb7]{color:#ef4444}.sidebar__state code[data-v-82474bb7]{font-size:11px;background:#1c2027;padding:2px 4px;border-radius:4px}.sidebar__nodes[data-v-82474bb7]{padding:12px;border-bottom:1px solid #262b34}.sidebar__subtitle[data-v-82474bb7]{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:#64748b;margin-bottom:4px}.sidebar__io-row[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.io-card[data-v-82474bb7]{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:2px;flex:1;padding:8px;border-radius:6px;border:1px solid #3a4150;border-left:3px solid #7dd3fc;background-color:#1c2027;cursor:grab;transition:background-color .12s ease,border-color .12s ease}.io-card[data-v-82474bb7]:hover{background-color:#262b34;border-color:#38bdf8}.io-card[data-v-82474bb7]:active{cursor:grabbing}.io-card__label[data-v-82474bb7]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#7dd3fc}.io-card__hint[data-v-82474bb7]{font-size:10px;color:#64748b}.agent-card[data-v-82474bb7]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;padding:12px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;cursor:grab;transition:background-color .12s ease,border-color .12s ease}.agent-card[data-v-82474bb7]:hover{background-color:#262b34;border-color:#38bdf8}.agent-card[data-v-82474bb7]:active{cursor:grabbing}.agent-card__head[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px}.agent-card__id[data-v-82474bb7]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc}.agent-card__model[data-v-82474bb7]{font-size:10px;color:#64748b}.agent-card__desc[data-v-82474bb7]{margin:0;font-size:11px;color:#94a3b8;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.agent-card__tags[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:4px;flex-wrap:wrap}.agent-card__tag[data-v-82474bb7]{font-size:10px;padding:2px 6px;border-radius:4px;background:#3a4150;color:#94a3b8}.agent-card__ports[data-v-82474bb7]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:12px;font-size:10px;color:#64748b}.node-agent[data-v-9ea2f689]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;min-width:220px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;box-shadow:0 4px 12px #00000059;color:#f1f5f9}.node-agent--stale[data-v-9ea2f689]{border-color:#7f1d1d;background-color:#450a0a}.node-agent--stale .node-agent__head[data-v-9ea2f689]{background-color:#7f1d1d;border-bottom-color:#7f1d1d}.node-agent--stale .node-agent__id[data-v-9ea2f689]{color:#fee2e2}.node-agent__head[data-v-9ea2f689]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid #3a4150;background-color:#14171c;border-radius:8px 8px 0 0}.node-agent__id[data-v-9ea2f689]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc}.node-agent__badge[data-v-9ea2f689]{margin-left:4px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#fee2e2}.node-agent__close[data-v-9ea2f689]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#64748b;transition:color .12s ease}.node-agent__close[data-v-9ea2f689]:hover{color:#ef4444}.node-agent__desc[data-v-9ea2f689]{margin:0;padding:8px 12px;font-size:11px;color:#94a3b8;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.node-agent__warn[data-v-9ea2f689]{margin:0;padding:8px 12px;font-size:11px;color:#fee2e2}.node-agent__ports[data-v-9ea2f689]{display:flex;flex-direction:row;align-items:stretch;justify-content:flex-start;gap:8px;padding:8px 12px;border-top:1px solid #3a4150}.node-agent__col[data-v-9ea2f689]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;flex:1}.node-agent__col--out[data-v-9ea2f689]{text-align:right}.node-agent__col-title[data-v-9ea2f689]{font-size:10px;text-transform:uppercase;color:#64748b;margin-bottom:4px}.node-agent__port[data-v-9ea2f689]{position:relative;font-size:11px;color:#94a3b8;padding:4px 0}.node-agent__port--in[data-v-9ea2f689]{padding-left:8px}.node-agent__port--out[data-v-9ea2f689]{padding-right:8px}.file-picker[data-v-be890d20]{display:flex;align-items:center;justify-content:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background-color:#0009}.file-picker__dialog[data-v-be890d20]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;width:720px;max-width:95vw;max-height:80vh;border-radius:8px;border:1px solid #3a4150;background-color:#14171c;box-shadow:0 8px 24px #00000073}.file-picker__head[data-v-be890d20]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;padding:12px;border-bottom:1px solid #262b34}.file-picker__title[data-v-be890d20]{margin:0;font-size:14px;font-weight:600}.file-picker__close[data-v-be890d20]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;color:#94a3b8}.file-picker__close[data-v-be890d20]:hover{color:#f1f5f9}.file-picker__body[data-v-be890d20]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:12px;overflow:hidden}.file-picker__search[data-v-be890d20]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;padding:4px 8px;font-size:12px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9}.file-picker__search[data-v-be890d20]:focus{border-color:#38bdf8}.file-picker__state[data-v-be890d20]{padding:12px;font-size:12px;color:#94a3b8;text-align:center}.file-picker__state--error[data-v-be890d20]{color:#ef4444}.file-picker__list[data-v-be890d20]::-webkit-scrollbar{width:10px;height:10px}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-track{background:transparent}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.file-picker__list[data-v-be890d20]::-webkit-scrollbar-thumb:hover{background:#3a4150}.file-picker__list[data-v-be890d20]{list-style:none;margin:0;padding:0;overflow-y:auto;max-height:55vh;border:1px solid #262b34;border-radius:6px}.file-picker__item[data-v-be890d20]{padding:4px 8px;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#f1f5f9;cursor:pointer;border-bottom:1px solid #262b34}.file-picker__item[data-v-be890d20]:last-child{border-bottom:0}.file-picker__item[data-v-be890d20]:hover{background-color:#1c2027;color:#7dd3fc}.node-input[data-v-95ec91bc]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;min-width:220px;border-radius:8px;border:1px solid #3a4150;background-color:#1c2027;box-shadow:0 4px 12px #00000059;color:#f1f5f9;border-left:3px solid #7dd3fc}.node-input__head[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid #3a4150;background-color:#14171c;border-radius:8px 8px 0 0}.node-input__meta[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.node-input__kind[data-v-95ec91bc]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;color:#7dd3fc;text-transform:uppercase;letter-spacing:.06em}.node-input__subtypes[data-v-95ec91bc]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:2px}.node-input__st[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;font-size:10px;padding:1px 4px;border-radius:4px;color:#64748b;border:1px solid transparent;transition:color .12s ease,border-color .12s ease}.node-input__st[data-v-95ec91bc]:hover{color:#94a3b8}.node-input__st--active[data-v-95ec91bc]{color:#7dd3fc;border-color:#3a4150}.node-input__close[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#64748b}.node-input__close[data-v-95ec91bc]:hover{color:#ef4444}.node-input__body[data-v-95ec91bc]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0}.node-input__field[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;padding:4px 12px;font-size:11px;color:#f1f5f9;border-bottom:1px solid #3a4150;background:transparent;transition:background-color .12s ease}.node-input__field[data-v-95ec91bc]::placeholder{color:#64748b;font-style:italic}.node-input__field[data-v-95ec91bc]:focus{background-color:#262b34}.node-input__field--dim[data-v-95ec91bc]{color:#94a3b8}.node-input__file-btn[data-v-95ec91bc]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;padding:8px 12px;text-align:left;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:11px;transition:background-color .12s ease;border-bottom:1px solid #3a4150}.node-input__file-btn[data-v-95ec91bc]:hover{background-color:#262b34}.node-input__path[data-v-95ec91bc]{color:#7dd3fc}.node-input__placeholder[data-v-95ec91bc]{color:#64748b;font-style:italic}.node-input__port[data-v-95ec91bc]{position:relative;font-size:11px;color:#94a3b8;padding:4px 12px;text-align:right}.canvas[data-v-b93ee04b]{width:100%;height:100%}.canvas[data-v-b93ee04b] .canvas__minimap{background-color:#14171c!important}.toolbar[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.toolbar__input[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;outline:0;font:inherit;color:inherit;width:160px;padding:4px 8px;font-size:11px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9;transition:border-color .12s ease}.toolbar__input[data-v-770bf2a0]:focus{border-color:#38bdf8}.toolbar__btn[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;font:inherit;color:inherit;cursor:pointer;padding:4px 12px;font-size:11px;border-radius:6px;border:1px solid #3a4150;background-color:#1c2027;color:#f1f5f9;transition:background-color .12s ease,border-color .12s ease}.toolbar__btn[data-v-770bf2a0]:hover{background-color:#262b34}.toolbar__btn--primary[data-v-770bf2a0]{background-color:#0ea5e9;border-color:#0ea5e9;color:#fff}.toolbar__btn--primary[data-v-770bf2a0]:hover{background-color:#38bdf8;border-color:#38bdf8}.toolbar__btn--danger[data-v-770bf2a0]:hover{background-color:#7f1d1d;border-color:#7f1d1d}.modal[data-v-770bf2a0]{display:flex;align-items:center;justify-content:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background-color:#0009}.modal__dialog[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;max-width:95vw;max-height:85vh;border-radius:8px;border:1px solid #3a4150;background-color:#14171c;box-shadow:0 8px 24px #00000073}.modal__dialog--sm[data-v-770bf2a0]{width:560px}.modal__dialog--md[data-v-770bf2a0]{width:720px}.modal__header[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;padding:12px;border-bottom:1px solid #262b34}.modal__title[data-v-770bf2a0]{margin:0;font-size:14px;font-weight:600}.modal__close[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;color:#94a3b8;transition:color .12s ease}.modal__close[data-v-770bf2a0]:hover{color:#f1f5f9}.modal__body[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:16px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar{width:10px;height:10px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-track{background:transparent}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-thumb{background:#262b34;border-radius:4px}.modal__body[data-v-770bf2a0]::-webkit-scrollbar-thumb:hover{background:#3a4150}.modal__body[data-v-770bf2a0]{padding:16px;overflow-y:auto}.modal__section[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px}.modal__section-head[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px}.modal__label[data-v-770bf2a0]{font-size:11px;text-transform:uppercase;color:#94a3b8}.modal__copy[data-v-770bf2a0]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer;font-size:11px;color:#7dd3fc}.modal__copy[data-v-770bf2a0]:hover{color:#38bdf8}.modal__code[data-v-770bf2a0]{margin:0;padding:8px 12px;font-size:11px;font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;color:#7dd3fc;background-color:#0b0d10;border:1px solid #262b34;border-radius:6px}.modal__code--inline[data-v-770bf2a0]{white-space:pre-wrap}.modal__code--scroll[data-v-770bf2a0]{overflow:auto;max-height:50vh;color:#f1f5f9}.pipeline-list[data-v-770bf2a0]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;list-style:none;margin:0;padding:0}.pipeline-list__empty[data-v-770bf2a0]{margin:0;padding:16px;text-align:center;font-size:12px;color:#64748b}.pipeline-list__item[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:8px;padding:8px 0;border-bottom:1px solid #262b34}.pipeline-list__item[data-v-770bf2a0]:last-child{border-bottom:0}.pipeline-list__info[data-v-770bf2a0]{min-width:0;flex:1}.pipeline-list__name[data-v-770bf2a0]{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace;font-size:12px;color:#7dd3fc;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pipeline-list__meta[data-v-770bf2a0]{font-size:10px;color:#64748b}.pipeline-list__actions[data-v-770bf2a0]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:4px;flex-shrink:0}.toast-stack[data-v-ac6df039]{display:flex;flex-direction:column;align-items:flex-end;justify-content:flex-start;gap:8px;position:fixed;right:16px;bottom:16px;z-index:60}.toast[data-v-ac6df039]{padding:8px 12px;max-width:360px;font-size:11px;border-radius:8px;border:1px solid;box-shadow:0 4px 12px #00000059}.toast--info[data-v-ac6df039]{background-color:#1c2027;border-color:#3a4150;color:#f1f5f9}.toast--warn[data-v-ac6df039]{background-color:#b45309d9;border-color:#d97706;color:#fde68a}.toast--error[data-v-ac6df039]{background-color:#7f1d1dd9;border-color:#dc2626;color:#fee2e2}.toast--success[data-v-ac6df039]{background-color:#064e3bd9;border-color:#10b981;color:#d1fae5}.app[data-v-6e13e9f8]{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;height:100vh}.app__header[data-v-6e13e9f8]{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;height:48px;padding:0 16px;border-bottom:1px solid #262b34;background-color:#14171c;flex-shrink:0}.app__brand[data-v-6e13e9f8]{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px}.app__logo[data-v-6e13e9f8]{height:32px;width:auto;display:block}.app__title[data-v-6e13e9f8]{margin:0;font-size:14px;font-weight:600}.app__tagline[data-v-6e13e9f8]{font-size:11px;color:#64748b}.app__body[data-v-6e13e9f8]{display:flex;flex-direction:row;align-items:stretch;justify-content:flex-start;gap:0;flex:1;overflow:hidden}.app__canvas[data-v-6e13e9f8]{flex:1;position:relative}.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}*,*:before,*:after{box-sizing:border-box}html,body,#app{height:100%;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;background-color:#0b0d10;color:#f1f5f9;-webkit-font-smoothing:antialiased}a{color:#38bdf8}code,pre{font-family:SF Mono,JetBrains Mono,Fira Code,Menlo,monospace}.vue-flow__node-agent{padding:0;border:none;background:transparent;box-shadow:none}.vue-flow__handle{width:10px;height:10px;background:#38bdf8;border:2px solid #0b0d10}.vue-flow__edge-path{stroke:#38bdf8;stroke-width:2}.vue-flow__background{background-color:#0b0d10}.vue-flow__controls button{background:#1c2027;border-color:#3a4150;color:#f1f5f9}.vue-flow__controls button:hover{background:#262b34}.vue-flow__controls button svg{fill:#f1f5f9}.vue-flow__minimap{background:#14171c!important}
|
|
Binary file
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Singleton Pipeline Builder</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-9S0goZlQ.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-iV4UtXoN.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@singleton/cli",
|
|
3
|
-
"version": "0.4.0-beta.12",
|
|
4
|
-
"type": "module",
|
|
5
|
-
"bin": {
|
|
6
|
-
"singleton": "./src/index.js"
|
|
7
|
-
},
|
|
8
|
-
"main": "./src/index.js",
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"@inquirer/prompts": "^7.2.1",
|
|
11
|
-
"blessed": "^0.1.81",
|
|
12
|
-
"chalk": "^5.6.2",
|
|
13
|
-
"commander": "^12.1.0",
|
|
14
|
-
"fast-glob": "^3.3.2",
|
|
15
|
-
"figlet": "^1.11.0",
|
|
16
|
-
"kleur": "^4.1.5"
|
|
17
|
-
}
|
|
18
|
-
}
|