@ngocsangairvds/vsaf 5.1.13 → 5.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/commands/run.d.ts +24 -5
  3. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  4. package/packages/cli/dist/commands/run.js +70 -18
  5. package/packages/cli/dist/commands/run.js.map +1 -1
  6. package/packages/cli/dist/commands/status.d.ts +3 -3
  7. package/packages/cli/dist/commands/status.d.ts.map +1 -1
  8. package/packages/cli/dist/commands/status.js +6 -3
  9. package/packages/cli/dist/commands/status.js.map +1 -1
  10. package/packages/cli/dist/index.js +15 -5
  11. package/packages/cli/dist/index.js.map +1 -1
  12. package/packages/cli/dist/server/app.d.ts +9 -0
  13. package/packages/cli/dist/server/app.d.ts.map +1 -1
  14. package/packages/cli/dist/server/app.js +24 -9
  15. package/packages/cli/dist/server/app.js.map +1 -1
  16. package/packages/cli/dist/server/routes/projects.d.ts +6 -0
  17. package/packages/cli/dist/server/routes/projects.d.ts.map +1 -0
  18. package/packages/cli/dist/server/routes/projects.js +27 -0
  19. package/packages/cli/dist/server/routes/projects.js.map +1 -0
  20. package/packages/cli/dist/server/routes/providers.d.ts +3 -0
  21. package/packages/cli/dist/server/routes/providers.d.ts.map +1 -0
  22. package/packages/cli/dist/server/routes/providers.js +21 -0
  23. package/packages/cli/dist/server/routes/providers.js.map +1 -0
  24. package/packages/cli/dist/server/routes/runs.d.ts +2 -5
  25. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  26. package/packages/cli/dist/server/routes/runs.js +76 -40
  27. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  28. package/packages/cli/dist/server/routes/workflows.d.ts +2 -1
  29. package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
  30. package/packages/cli/dist/server/routes/workflows.js +14 -9
  31. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  32. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  33. package/packages/cli/dist/server/services/execution-manager.js +22 -3
  34. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  35. package/packages/cli/dist/server/services/project-registry.d.ts +27 -0
  36. package/packages/cli/dist/server/services/project-registry.d.ts.map +1 -0
  37. package/packages/cli/dist/server/services/project-registry.js +103 -0
  38. package/packages/cli/dist/server/services/project-registry.js.map +1 -0
  39. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  40. package/packages/core/dist/engine/dag-parser.js +1 -0
  41. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  42. package/packages/core/dist/schema/workflow-schema.d.ts +3 -0
  43. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  44. package/packages/core/dist/schema/workflow-schema.js +1 -0
  45. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  46. package/packages/core/dist/store/recovery.d.ts.map +1 -1
  47. package/packages/core/dist/store/recovery.js +16 -1
  48. package/packages/core/dist/store/recovery.js.map +1 -1
  49. package/packages/core/dist/store/run-store.d.ts +3 -1
  50. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  51. package/packages/core/dist/store/run-store.js +49 -1
  52. package/packages/core/dist/store/run-store.js.map +1 -1
  53. package/packages/core/dist/store/types.d.ts +16 -0
  54. package/packages/core/dist/store/types.d.ts.map +1 -1
  55. package/packages/core/dist/store/types.js.map +1 -1
  56. package/packages/core/dist/types/dag.d.ts +1 -0
  57. package/packages/core/dist/types/dag.d.ts.map +1 -1
  58. package/packages/core/dist/types/workflow.d.ts +1 -0
  59. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  60. package/packages/web/dist/web/browser/chunk-5WD7R336.js +1 -0
  61. package/packages/web/dist/web/browser/chunk-FXYDTGOX.js +1 -0
  62. package/packages/web/dist/web/browser/chunk-K4DHLOOA.js +1 -0
  63. package/packages/web/dist/web/browser/chunk-V2CDNNWN.js +1 -0
  64. package/packages/web/dist/web/browser/chunk-WJT4QH2P.js +4 -0
  65. package/packages/web/dist/web/browser/chunk-WMJLW2L6.js +5 -0
  66. package/packages/web/dist/web/browser/chunk-XHOL7AER.js +1 -0
  67. package/packages/web/dist/web/browser/chunk-YBYFKZWR.js +1 -0
  68. package/packages/web/dist/web/browser/index.html +1 -1
  69. package/packages/web/dist/web/browser/main-SYHKSBNJ.js +1 -0
  70. package/packages/web/dist/web/browser/chunk-4YPNNQ2T.js +0 -4
  71. package/packages/web/dist/web/browser/chunk-E227ZHPJ.js +0 -1
  72. package/packages/web/dist/web/browser/chunk-JFBK3MNW.js +0 -1
  73. package/packages/web/dist/web/browser/chunk-L2VOQBBI.js +0 -1
  74. package/packages/web/dist/web/browser/chunk-OJJM5VOH.js +0 -1
  75. package/packages/web/dist/web/browser/chunk-U2H3QYAG.js +0 -5
  76. package/packages/web/dist/web/browser/chunk-VA7KFQOR.js +0 -1
  77. package/packages/web/dist/web/browser/chunk-WV3C6DNH.js +0 -1
  78. package/packages/web/dist/web/browser/main-THGFWXYL.js +0 -1
@@ -1 +0,0 @@
1
- import{a as A,b as R,c as j,d as q,e as B,f as $,j as D}from"./chunk-L2VOQBBI.js";import{a as Q}from"./chunk-OJJM5VOH.js";import{$ as w,D as y,Fa as N,Ga as L,H as u,P as s,Q as n,R as t,T as M,U as O,W as x,X as _,Y as d,Z as S,_ as E,ba as r,ca as m,da as W,ea as F,fa as C,g as v,ga as h,ha as k,ka as b,n as P,na as I,o as f,p as g,va as V,wa as T,z as l,za as z}from"./chunk-U2H3QYAG.js";var J=a=>({folder:a}),Y=a=>({id:a});function K(a,i){a&1&&(n(0,"div",7),r(1,"Loading workflows..."),t())}function U(a,i){if(a&1&&(n(0,"div",8),r(1),t()),a&2){let e=d();l(),m(e.loadError)}}function X(a,i){if(a&1&&(n(0,"p"),r(1),t()),a&2){let e=d(3);l(),m(e.folderError)}}function Z(a,i){if(a&1){let e=x();n(0,"form",30),_("ngSubmit",function(){f(e);let c=d(2);return g(c.createFolder())}),n(1,"span"),r(2),t(),n(3,"input",31),k("ngModelChange",function(c){f(e);let p=d(2);return h(p.newFolderName,c)||(p.newFolderName=c),g(c)}),t(),n(4,"div")(5,"button",32),r(6,"Create"),t(),n(7,"button",22),_("click",function(){f(e);let c=d(2);return g(c.cancelFolder())}),r(8,"Cancel"),t()(),u(9,X,2,1,"p",33),t()}if(a&2){let e=d(2);l(2),m(e.selectedFolder?e.selectedFolder+"/":""),l(),C("ngModel",e.newFolderName),l(2),s("disabled",e.creatingFolder),l(4),s("ngIf",e.folderError)}}function ee(a,i){if(a&1){let e=x();n(0,"button",34),_("click",function(){let c=f(e).$implicit,p=d(2);return g(p.selectFolder(c.path))}),n(1,"span",16),r(2,"\u203A"),t(),n(3,"span"),r(4),t(),n(5,"strong"),r(6),t()()}if(a&2){let e=i.$implicit,o=d(2);E("padding-left",14+e.depth*16,"px"),w("active",o.selectedFolder===e.path),l(4),m(e.name),l(2),m(e.count)}}function te(a,i){if(a&1){let e=x();M(0),n(1,"span"),r(2,"/"),t(),n(3,"button",22),_("click",function(){let c=f(e).$implicit,p=d(2);return g(p.selectFolder(c.path))}),r(4),t(),O()}if(a&2){let e=i.$implicit,o=i.last;l(3),w("current",o),l(),m(e.name)}}function ne(a,i){if(a&1){let e=x();n(0,"article",35),_("click",function(){let c=f(e).$implicit,p=d(2);return g(p.selectWorkflow(c))}),n(1,"div",36)(2,"span",37),r(3,"Y"),t(),n(4,"div")(5,"strong"),r(6),t(),n(7,"p"),r(8),t()()(),n(9,"span",38),r(10),t(),n(11,"code"),r(12),t(),n(13,"div",39)(14,"a",40),_("click",function(c){return c.stopPropagation()}),r(15,"Details"),t(),n(16,"button",22),_("click",function(c){let p=f(e).$implicit,H=d(2);return c.stopPropagation(),g(H.selectWorkflow(p))}),r(17,"Run"),t()()()}if(a&2){let e=i.$implicit,o=d(2);w("selected",(o.selectedWorkflow==null?null:o.selectedWorkflow.id)===e.id),l(6),m(e.name),l(2),m(e.description||"No description provided."),l(2),m(e.nodeCount),l(2),m(e.file),l(2),s("queryParams",b(7,Y,e.id))}}function oe(a,i){a&1&&(n(0,"div",41),r(1,"No workflows match this folder and search."),t())}function re(a,i){if(a&1&&(n(0,"div",48),r(1),t()),a&2){let e=d(3);l(),m(e.runError)}}function ie(a,i){if(a&1){let e=x();M(0),n(1,"div",12),r(2,"Run workflow"),t(),n(3,"span",42),r(4),t(),n(5,"h2"),r(6),t(),n(7,"p"),r(8),t(),n(9,"dl")(10,"div")(11,"dt"),r(12,"Nodes"),t(),n(13,"dd"),r(14),t()(),n(15,"div")(16,"dt"),r(17,"File"),t(),n(18,"dd"),r(19),t()()(),n(20,"label",43),r(21,"Arguments"),t(),n(22,"input",44),k("ngModelChange",function(c){f(e);let p=d(2);return h(p.runArgs,c)||(p.runArgs=c),g(c)}),t(),n(23,"button",45),_("click",function(){f(e);let c=d(2);return g(c.runSelected())}),r(24),t(),n(25,"a",46),r(26,"Open details"),t(),u(27,re,2,1,"div",47),O()}if(a&2){let e=d(2);l(4),m(e.selectedWorkflow.id),l(2),m(e.selectedWorkflow.name),l(2),m(e.selectedWorkflow.description||"No description provided."),l(6),m(e.selectedWorkflow.nodeCount),l(5),m(e.selectedWorkflow.file),l(3),C("ngModel",e.runArgs),s("disabled",e.running),l(),s("disabled",e.running),l(),W(" ",e.running?"Starting...":"Run workflow"," "),l(),s("queryParams",b(11,Y,e.selectedWorkflow.id)),l(2),s("ngIf",e.runError)}}function le(a,i){a&1&&(n(0,"div",12),r(1,"Inspector"),t(),n(2,"p"),r(3,"Select a workflow to inspect and run it."),t())}function ae(a,i){if(a&1){let e=x();n(0,"div",9)(1,"aside",10)(2,"div",11)(3,"div",12),r(4,"Folders"),t(),n(5,"button",13),_("click",function(){f(e);let c=d();return g(c.showFolderForm=!0)}),r(6,"+"),t()(),u(7,Z,10,4,"form",14),n(8,"button",15),_("click",function(){f(e);let c=d();return g(c.selectFolder(""))}),n(9,"span",16),r(10,"\u2302"),t(),n(11,"span"),r(12,".vsaf/workflows"),t(),n(13,"strong"),r(14),t()(),u(15,ee,7,6,"button",17),n(16,"a",18),r(17,"+ Workflow in this folder"),t()(),n(18,"main",19)(19,"div",20)(20,"div")(21,"nav",21)(22,"button",22),_("click",function(){f(e);let c=d();return g(c.selectFolder(""))}),r(23,"workflows"),t(),u(24,te,5,3,"ng-container",23),t(),n(25,"p"),r(26),t()(),n(27,"input",24),k("ngModelChange",function(c){f(e);let p=d();return h(p.searchQuery,c)||(p.searchQuery=c),g(c)}),t()(),n(28,"div",25)(29,"span"),r(30,"Name"),t(),n(31,"span"),r(32,"Nodes"),t(),n(33,"span"),r(34,"Location"),t(),n(35,"span"),r(36,"Actions"),t()(),u(37,ne,18,9,"article",26)(38,oe,2,0,"div",27),t(),n(39,"aside",28),u(40,ie,28,13,"ng-container",29)(41,le,4,0,"ng-template",null,0,I),t()()}if(a&2){let e=S(42),o=d();l(7),s("ngIf",o.showFolderForm),l(),w("active",o.selectedFolder===""),l(6),m(o.workflows.length),l(),s("ngForOf",o.folders),l(),s("queryParams",b(15,J,o.selectedFolder||null)),l(8),s("ngForOf",o.breadcrumbs),l(2),F("",o.visibleWorkflows.length," workflow",o.visibleWorkflows.length===1?"":"s"),l(),C("ngModel",o.searchQuery),l(10),s("ngForOf",o.visibleWorkflows)("ngForTrackBy",o.trackWorkflow),l(),s("ngIf",!o.visibleWorkflows.length),l(2),s("ngIf",o.selectedWorkflow)("ngIfElse",e)}}var G=class a{api=P(Q);router=P(N);workflows=[];folderPaths=[];loading=!0;loadError="";selectedFolder="";selectedWorkflow;searchQuery="";runArgs="";running=!1;runError="";showFolderForm=!1;newFolderName="";creatingFolder=!1;folderError="";ngOnInit(){v({workflows:this.api.getWorkflows(),folders:this.api.getWorkflowFolders()}).subscribe({next:i=>{this.workflows=i.workflows,this.folderPaths=i.folders,this.loading=!1},error:i=>{this.loadError=i?.error?.error??"Failed to load workflows.",this.loading=!1}})}get folders(){let i=new Set(this.folderPaths);for(let e of this.workflows){let o=e.directory.split("/").filter(Boolean);o.forEach((c,p)=>i.add(o.slice(0,p+1).join("/")))}return[...i].sort().map(e=>({path:e,name:e.slice(e.lastIndexOf("/")+1),depth:e.split("/").length-1,count:this.workflows.filter(o=>o.directory===e||o.directory.startsWith(`${e}/`)).length}))}get breadcrumbs(){let i=this.selectedFolder.split("/").filter(Boolean);return i.map((e,o)=>({name:e,path:i.slice(0,o+1).join("/")}))}get visibleWorkflows(){let i=this.searchQuery.trim().toLowerCase();return this.workflows.filter(e=>{let o=!this.selectedFolder||e.directory===this.selectedFolder,c=!i||`${e.name} ${e.id} ${e.description}`.toLowerCase().includes(i);return o&&c})}selectFolder(i){this.selectedFolder=i,this.selectedWorkflow=void 0,this.runError=""}createFolder(){let i=this.newFolderName.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");if(!i){this.folderError="Enter a valid folder name.";return}let e=this.selectedFolder?`${this.selectedFolder}/${i}`:i;this.creatingFolder=!0,this.folderError="",this.api.createWorkflowFolder(e).subscribe({next:()=>{this.creatingFolder=!1,this.folderPaths=[...new Set([...this.folderPaths,e])].sort(),this.selectFolder(e),this.cancelFolder()},error:o=>{this.creatingFolder=!1,this.folderError=o?.error?.error??"Failed to create folder."}})}cancelFolder(){this.showFolderForm=!1,this.newFolderName="",this.folderError=""}selectWorkflow(i){this.selectedWorkflow=i,this.runError=""}trackWorkflow(i,e){return e.id}runSelected(){!this.selectedWorkflow||this.running||(this.running=!0,this.api.startRun(this.selectedWorkflow.id,this.runArgs).subscribe({next:i=>this.router.navigate(["/runs",i.runId]),error:i=>{this.running=!1,this.runError=i?.error?.error??"Failed to start workflow."}}))}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=y({type:a,selectors:[["app-workflows"]],decls:14,vars:6,consts:[["noSelection",""],[1,"page"],[1,"page-header"],["routerLink","/workflows/builder",1,"primary-button",3,"queryParams"],["class","state",4,"ngIf"],["class","state error",4,"ngIf"],["class","explorer",4,"ngIf"],[1,"state"],[1,"state","error"],[1,"explorer"],[1,"folder-panel"],[1,"folder-heading"],[1,"panel-heading"],["type","button","title","Create subfolder",3,"click"],["class","folder-form",3,"ngSubmit",4,"ngIf"],["type","button",1,"folder-row","root",3,"click"],[1,"chevron"],["type","button","class","folder-row",3,"active","padding-left","click",4,"ngFor","ngForOf"],["routerLink","/workflows/builder",1,"folder-new-flow",3,"queryParams"],[1,"content-panel"],[1,"content-toolbar"],["aria-label","Workflow folder",1,"breadcrumb"],["type","button",3,"click"],[4,"ngFor","ngForOf"],["type","search","placeholder","Search this workspace",3,"ngModelChange","ngModel"],[1,"column-head"],["class","workflow-row",3,"selected","click",4,"ngFor","ngForOf","ngForTrackBy"],["class","empty",4,"ngIf"],[1,"run-panel"],[4,"ngIf","ngIfElse"],[1,"folder-form",3,"ngSubmit"],["name","folderName","placeholder","folder-name","autofocus","",3,"ngModelChange","ngModel"],["type","submit",3,"disabled"],[4,"ngIf"],["type","button",1,"folder-row",3,"click"],[1,"workflow-row",3,"click"],[1,"workflow-name"],[1,"file-icon"],[1,"node-count"],[1,"row-actions"],["routerLink","/workflows/detail",3,"click","queryParams"],[1,"empty"],[1,"namespace"],["for","run-args"],["id","run-args","placeholder","Optional run args",3,"ngModelChange","ngModel","disabled"],["type","button",1,"run-button",3,"click","disabled"],["routerLink","/workflows/detail",1,"details-button",3,"queryParams"],["class","run-error",4,"ngIf"],[1,"run-error"]],template:function(e,o){e&1&&(n(0,"section",1)(1,"header",2)(2,"div")(3,"h1"),r(4,"Workflows"),t(),n(5,"p"),r(6,"Browse workflow definitions by their directory structure."),t()(),n(7,"a",3)(8,"span"),r(9,"+"),t(),r(10," New workflow"),t()(),u(11,K,2,0,"div",4)(12,U,2,1,"div",5)(13,ae,43,17,"div",6),t()),e&2&&(l(7),s("queryParams",b(4,J,o.selectedFolder||null)),l(4),s("ngIf",o.loading),l(),s("ngIf",o.loadError),l(),s("ngIf",!o.loading&&!o.loadError))},dependencies:[z,V,T,D,$,A,R,j,B,q,L],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}.page[_ngcontent-%COMP%]{padding:22px;max-width:1600px;margin:auto}.page-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:21px;margin:0}.page-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .content-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font-size:13px;color:#8f96a3;margin:4px 0 0}.primary-button[_ngcontent-%COMP%], .details-button[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:7px;background:#6366f1;color:#fff;text-decoration:none;padding:9px 12px;border-radius:6px;font-size:13px;font-weight:700}.explorer[_ngcontent-%COMP%]{display:grid;grid-template-columns:240px minmax(500px,1fr) 280px;min-height:620px;border:1px solid #292c34;border-radius:7px;overflow:hidden;background:#15161a}.folder-panel[_ngcontent-%COMP%], .run-panel[_ngcontent-%COMP%]{background:#131419}.folder-panel[_ngcontent-%COMP%]{border-right:1px solid #292c34;padding:12px 8px}.run-panel[_ngcontent-%COMP%]{border-left:1px solid #292c34;padding:14px}.panel-heading[_ngcontent-%COMP%]{font-size:11px;color:#8f96a3;text-transform:uppercase;font-weight:800;margin:3px 7px 12px}.folder-heading[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.folder-heading[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:24px;height:24px;border:1px solid #353842;border-radius:4px;background:#202229;color:#fff;cursor:pointer}.folder-form[_ngcontent-%COMP%]{border:1px solid #383b45;background:#191b20;padding:8px;margin-bottom:8px;border-radius:5px}.folder-form[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;color:#777e8b;font-size:10px;overflow-wrap:anywhere}.folder-form[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{box-sizing:border-box;width:100%;margin:5px 0;border:1px solid #3b3e49;background:#101114;color:#fff;padding:6px;border-radius:4px}.folder-form[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;gap:5px}.folder-form[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #3b3e49;background:#252731;color:#ddd;padding:4px 6px;border-radius:4px;font-size:10px}.folder-form[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#fca5a5;font-size:10px;margin:6px 0 0}.folder-new-flow[_ngcontent-%COMP%]{display:block;color:#a5b4fc;text-decoration:none;font-size:11px;padding:9px 12px;border-top:1px solid #292c34;margin-top:8px}.folder-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:16px minmax(0,1fr) auto;gap:7px;align-items:center;width:100%;height:34px;border:0;border-radius:5px;background:transparent;color:#b7bbc4;text-align:left;cursor:pointer;padding-right:9px}.folder-row[_ngcontent-%COMP%]:hover, .folder-row.active[_ngcontent-%COMP%]{background:#242630;color:#fff}.folder-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.folder-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-size:10px;color:#6f7684}.chevron[_ngcontent-%COMP%]{color:#7c83ff}.content-panel[_ngcontent-%COMP%]{min-width:0;padding:0 16px 20px}.content-toolbar[_ngcontent-%COMP%]{min-height:72px;display:flex;justify-content:space-between;align-items:center;gap:20px;border-bottom:1px solid #292c34}.breadcrumb[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px}.breadcrumb[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:0;background:transparent;color:#949ba8;padding:0;cursor:pointer;font-weight:600}.breadcrumb[_ngcontent-%COMP%] button.current[_ngcontent-%COMP%]{color:#fff}.breadcrumb[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#555b67}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{box-sizing:border-box;border:1px solid #343741;background:#101114;color:#eee;border-radius:5px;padding:8px 10px;outline:none}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:260px}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus, .run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus{border-color:#6366f1}.column-head[_ngcontent-%COMP%], .workflow-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(220px,1.4fr) 60px minmax(150px,.8fr) 120px;gap:12px;align-items:center}.column-head[_ngcontent-%COMP%]{height:38px;color:#707784;font-size:10px;text-transform:uppercase;font-weight:800}.workflow-row[_ngcontent-%COMP%]{min-height:68px;border-top:1px solid #25272e;padding:10px 0;cursor:pointer}.workflow-row[_ngcontent-%COMP%]:hover, .workflow-row.selected[_ngcontent-%COMP%]{background:#1b1d23}.workflow-name[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;min-width:0;padding-left:8px}.workflow-name[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{min-width:0}.file-icon[_ngcontent-%COMP%]{display:grid;place-items:center;flex:0 0 28px;width:28px;height:32px;border:1px solid #4b4f5c;border-radius:4px;color:#a5b4fc;font-size:11px;font-weight:900}.workflow-name[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;font-size:13px;overflow-wrap:anywhere}.workflow-name[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0 0;color:#777e8b;font-size:11px;line-height:1.4;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.node-count[_ngcontent-%COMP%]{color:#aeb4bf;font-size:12px}.workflow-row[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-size:10px;color:#777e8b;overflow:hidden;text-overflow:ellipsis}.row-actions[_ngcontent-%COMP%]{display:flex;gap:6px}.row-actions[_ngcontent-%COMP%] a[_ngcontent-%COMP%], .row-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #383b45;background:#202229;color:#c9ccd3;border-radius:4px;padding:5px 7px;text-decoration:none;font:inherit;font-size:11px;cursor:pointer}.run-panel[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:16px;margin:7px 0}.run-panel[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9299a5;font-size:12px;line-height:1.5}.namespace[_ngcontent-%COMP%]{font:10px ui-monospace,monospace;color:#818cf8;overflow-wrap:anywhere}.run-panel[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{border-top:1px solid #292c34;border-bottom:1px solid #292c34;padding:8px 0;margin:14px 0}.run-panel[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-size:11px;padding:4px 0}.run-panel[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:#777e8b}.run-panel[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;max-width:170px;overflow-wrap:anywhere;text-align:right}.run-panel[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:block;font-size:10px;text-transform:uppercase;color:#8f96a3;font-weight:700;margin-bottom:6px}.run-panel[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%}.run-button[_ngcontent-%COMP%], .details-button[_ngcontent-%COMP%]{width:100%;justify-content:center;box-sizing:border-box;margin-top:9px;border:0}.run-button[_ngcontent-%COMP%]{background:#059669;color:#fff;padding:9px;border-radius:5px;font-weight:700;cursor:pointer}.run-button[_ngcontent-%COMP%]:disabled{opacity:.5}.details-button[_ngcontent-%COMP%]{background:#242630}.run-error[_ngcontent-%COMP%], .state.error[_ngcontent-%COMP%]{color:#fecaca}.run-error[_ngcontent-%COMP%]{font-size:11px;margin-top:10px}.state[_ngcontent-%COMP%], .empty[_ngcontent-%COMP%]{border:1px solid #292c34;padding:18px;color:#949ba8;border-radius:6px}.empty[_ngcontent-%COMP%]{text-align:center;margin-top:12px}.state[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:#0b0c0f;padding:2px 5px}@media(max-width:1100px){.explorer[_ngcontent-%COMP%]{grid-template-columns:210px 1fr}.run-panel[_ngcontent-%COMP%]{display:none}}@media(max-width:720px){.page[_ngcontent-%COMP%]{padding:14px}.page-header[_ngcontent-%COMP%]{align-items:flex-start}.explorer[_ngcontent-%COMP%]{display:block}.folder-panel[_ngcontent-%COMP%]{border-right:0;border-bottom:1px solid #292c34}.content-toolbar[_ngcontent-%COMP%]{align-items:flex-start;flex-direction:column;padding:14px 0}.content-toolbar[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%}.column-head[_ngcontent-%COMP%]{display:none}.workflow-row[_ngcontent-%COMP%]{grid-template-columns:1fr auto}.workflow-row[_ngcontent-%COMP%] > code[_ngcontent-%COMP%], .node-count[_ngcontent-%COMP%]{display:none}}"]})};export{G as WorkflowsComponent};
@@ -1 +0,0 @@
1
- import{a as G,b as H,e as J,j as K}from"./chunk-L2VOQBBI.js";import{a as Q}from"./chunk-OJJM5VOH.js";import{$ as M,D as C,Da as $,Fa as B,Ga as q,H as f,K as v,L as D,M as W,P as s,Q as n,R as t,S as N,T,U as R,W as u,X as _,Y as p,ba as o,ca as d,da as b,fa as V,g as I,ga as z,ha as F,ka as P,la as h,ma as k,n as w,o as g,p as x,t as O,va as A,wa as L,ya as j,z as i,za as Y}from"./chunk-U2H3QYAG.js";function ne(r,l){if(r&1){let e=u();n(0,"div",1),_("click",function(){g(e);let a=p();return x(a.close())}),n(1,"div",2),_("click",function(a){return a.stopPropagation()}),n(2,"h3",3),o(3),t(),n(4,"label",4),o(5,"Arguments"),t(),n(6,"input",5),F("ngModelChange",function(a){g(e);let m=p();return z(m.args,a)||(m.args=a),x(a)}),_("keydown.enter",function(){g(e);let a=p();return x(a.submit())}),t(),n(7,"div",6)(8,"button",7),_("click",function(){g(e);let a=p();return x(a.close())}),o(9,"Cancel"),t(),n(10,"button",8),_("click",function(){g(e);let a=p();return x(a.submit())}),o(11,"Start \u25B6"),t()()()()}if(r&2){let e=p();i(3),b("Run ",e.workflowName),i(3),V("ngModel",e.args)}}var y=class r{visible=!1;workflowName="";run=new O;closed=new O;args="";submit(){this.run.emit(this.args),this.args=""}close(){this.visible=!1,this.args="",this.closed.emit()}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=C({type:r,selectors:[["app-run-dialog"]],inputs:{visible:"visible",workflowName:"workflowName"},outputs:{run:"run",closed:"closed"},decls:1,vars:1,consts:[[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50"],[1,"fixed","inset-0","bg-black/60","flex","items-center","justify-center","z-50",3,"click"],[1,"bg-slate-800","rounded-lg","p-6","w-full","max-w-md","border","border-slate-700",3,"click"],[1,"text-lg","font-semibold","text-slate-100","mb-4"],[1,"block","text-sm","text-slate-400","mb-1"],["placeholder",'e.g. "fix #42"',1,"w-full","bg-slate-900","border","border-slate-600","rounded","px-3","py-2","text-slate-100","text-sm","focus:outline-none","focus:border-blue-500","mb-4",3,"ngModelChange","keydown.enter","ngModel"],[1,"flex","justify-end","gap-3"],[1,"px-4","py-2","text-sm","text-slate-400","hover:text-slate-200",3,"click"],[1,"px-4","py-2","text-sm","bg-blue-600","text-white","rounded","hover:bg-blue-500",3,"click"]],template:function(e,c){e&1&&D(0,ne,12,2,"div",0),e&2&&W(c.visible?0:-1)},dependencies:[K,G,H,J],encapsulation:2})};var oe=r=>({edit:r}),ie=r=>["/runs",r];function re(r,l){if(r&1&&(n(0,"div",4),o(1),t()),r&2){let e=p();i(),d(e.error)}}function ae(r,l){r&1&&(n(0,"div",5),o(1,"Loading workflow definition..."),t())}function le(r,l){if(r&1&&(n(0,"span"),o(1),t()),r&2){let e=p(3);i(),d(e.runs.length)}}function de(r,l){if(r&1){let e=u();n(0,"button",24),_("click",function(){let a=g(e).$implicit,m=p(2);return x(m.tab=a.id)}),o(1),f(2,le,2,1,"span",3),t()}if(r&2){let e=l.$implicit,c=p(2);M("active",c.tab===e.id),i(),b(" ",e.label," "),i(),s("ngIf",e.id==="runs")}}function ce(r,l){if(r&1){let e=u();n(0,"button",30),_("click",function(){let a=g(e).$implicit,m=p(3);return x(m.selectedNode=a)}),n(1,"span",31),o(2),t(),n(3,"span",32),o(4),t(),n(5,"span",33)(6,"strong"),o(7),t(),n(8,"small"),o(9),t()(),n(10,"span",34),o(11),t()()}if(r&2){let e=l.$implicit,c=l.index,a=p(3);M("selected",(a.selectedNode==null?null:a.selectedNode.id)===e.id),i(2),d(c+1),i(),v("data-type",e.type),i(),d(a.typeLabel(e.type)),i(3),d(e.id),i(2),d(e.content),i(2),d(e.dependsOn.length?"After "+e.dependsOn.join(", "):"Entry point")}}function pe(r,l){if(r&1&&(n(0,"aside",35)(1,"div",36),o(2,"Node inspector"),t(),n(3,"h3"),o(4),t(),n(5,"span",37),o(6),t(),n(7,"dl")(8,"div")(9,"dt"),o(10,"Depends on"),t(),n(11,"dd"),o(12),t()(),n(13,"div")(14,"dt"),o(15,"Trigger"),t(),n(16,"dd"),o(17),t()(),n(18,"div")(19,"dt"),o(20,"Context"),t(),n(21,"dd"),o(22),t()(),n(23,"div")(24,"dt"),o(25,"Condition"),t(),n(26,"dd"),o(27),t()(),n(28,"div")(29,"dt"),o(30,"Model"),t(),n(31,"dd"),o(32),t()()(),n(33,"label"),o(34,"Content"),t(),n(35,"pre"),o(36),t()()),r&2){let e=p(3);i(4),d(e.selectedNode.id),i(2),d(e.selectedNode.type),i(6),d(e.selectedNode.dependsOn.join(", ")||"None"),i(5),d(e.selectedNode.triggerRule),i(5),d(e.selectedNode.context),i(5),d(e.selectedNode.when||"Always"),i(5),d(e.selectedNode.model||e.workflow.defaultModel||"Default"),i(4),d(e.selectedNode.content)}}function se(r,l){if(r&1&&(n(0,"div",25)(1,"main",26)(2,"div",27)(3,"div")(4,"h2"),o(5,"Workflow steps"),t(),n(6,"p"),o(7,"Execution order and node configuration."),t()()(),f(8,ce,12,8,"button",28),t(),f(9,pe,37,8,"aside",29),t()),r&2){let e=p(2);i(8),s("ngForOf",e.workflow.nodes),i(),s("ngIf",e.selectedNode)}}function me(r,l){if(r&1&&(n(0,"article")(1,"div")(2,"span",32),o(3),t(),n(4,"strong"),o(5),t()(),n(6,"small"),o(7),t()()),r&2){let e=l.$implicit,c=p(4);i(2),v("data-type",e.type),i(),d(c.typeLabel(e.type)),i(2),d(e.id),i(2),d(e.dependsOn.length?"\u2190 "+e.dependsOn.join(", "):"Entry point")}}function ge(r,l){if(r&1&&(n(0,"div",42)(1,"span",43),o(2),t(),f(3,me,8,4,"article",44),t()),r&2){let e=l.$implicit,c=l.index;i(2),b("Stage ",c+1),i(),s("ngForOf",e)}}function xe(r,l){if(r&1&&(n(0,"div",38)(1,"div",39)(2,"div")(3,"h2"),o(4,"DAG topology"),t(),n(5,"p"),o(6,"Dependencies flow from left to right."),t()(),n(7,"span"),o(8),t()(),n(9,"div",40),f(10,ge,4,2,"div",41),t()()),r&2){let e=p(2);i(8),b("",e.dagLayers.length," stages"),i(2),s("ngForOf",e.dagLayers)}}function _e(r,l){if(r&1){let e=u();n(0,"div",45)(1,"div",46)(2,"span"),o(3,"Read-only YAML definition"),t(),n(4,"button",24),_("click",function(){g(e);let a=p(2);return x(a.copyYaml())}),o(5),t()(),n(6,"pre"),o(7),t()()}if(r&2){let e=p(2);i(5),d(e.copied?"Copied":"Copy"),i(2),d(e.workflow.yaml)}}function fe(r,l){if(r&1&&(n(0,"tr")(1,"td")(2,"code"),o(3),t()(),n(4,"td")(5,"span",48),o(6),t()(),n(7,"td"),o(8),h(9,"date"),t(),n(10,"td"),o(11),h(12,"date"),t(),n(13,"td")(14,"a",49),o(15,"Open"),t()()()),r&2){let e=l.$implicit;i(3),d(e.runId),i(2),v("data-status",e.status),i(),d(e.status),i(2),d(k(9,6,e.startedAt,"medium")),i(3),d(e.completedAt?k(12,9,e.completedAt,"medium"):"In progress"),i(3),s("routerLink",P(12,ie,e.runId))}}function ue(r,l){r&1&&(n(0,"tr")(1,"td",50),o(2,"This workflow has not been run yet."),t()())}function be(r,l){if(r&1&&(n(0,"div",47)(1,"table")(2,"thead")(3,"tr")(4,"th"),o(5,"Run ID"),t(),n(6,"th"),o(7,"Status"),t(),n(8,"th"),o(9,"Started"),t(),n(10,"th"),o(11,"Completed"),t(),N(12,"th"),t()(),n(13,"tbody"),f(14,fe,16,14,"tr",44)(15,ue,3,0,"tr",3),t()()()),r&2){let e=p(2);i(14),s("ngForOf",e.runs),i(),s("ngIf",!e.runs.length)}}function we(r,l){if(r&1){let e=u();T(0),n(1,"nav",6)(2,"a",7),o(3,"Workflows"),t(),n(4,"span"),o(5,"/"),t(),n(6,"span"),o(7),t()(),n(8,"header",8)(9,"div",9),o(10,"Y"),t(),n(11,"div",10)(12,"span",11),o(13),t(),n(14,"h1"),o(15),t(),n(16,"p"),o(17),t()(),n(18,"div",12)(19,"a",13),o(20,"Edit"),t(),n(21,"button",14),_("click",function(){g(e);let a=p();return x(a.showRunDialog=!0)}),o(22,"Run workflow"),t()()(),n(23,"div",15)(24,"div")(25,"span"),o(26,"Nodes"),t(),n(27,"strong"),o(28),t()(),n(29,"div")(30,"span"),o(31,"Dependencies"),t(),n(32,"strong"),o(33),t()(),n(34,"div")(35,"span"),o(36,"Provider"),t(),n(37,"strong"),o(38),t()(),n(39,"div")(40,"span"),o(41,"Model"),t(),n(42,"strong"),o(43),t()(),n(44,"div")(45,"span"),o(46,"Runs"),t(),n(47,"strong"),o(48),t()()(),n(49,"div",16)(50,"span"),o(51,"Definition"),t(),n(52,"code"),o(53),t()(),n(54,"nav",17),f(55,de,3,4,"button",18),t(),f(56,se,10,2,"div",19)(57,xe,11,2,"div",20)(58,_e,8,2,"div",21)(59,be,16,2,"div",22),n(60,"app-run-dialog",23),_("run",function(a){g(e);let m=p();return x(m.onStartRun(a))})("closed",function(){g(e);let a=p();return x(a.showRunDialog=!1)}),t(),R()}if(r&2){let e=p();i(7),d(e.workflow.id),i(6),d(e.workflow.id),i(2),d(e.workflow.name),i(2),d(e.workflow.description||"No description provided."),i(2),s("queryParams",P(18,oe,e.workflow.id)),i(9),d(e.workflow.nodeCount),i(5),d(e.dependencyCount),i(5),d(e.workflow.defaultProvider||"default"),i(5),d(e.workflow.defaultModel||"default"),i(5),d(e.runs.length),i(5),b(".vsaf/workflows/",e.workflow.file),i(2),s("ngForOf",e.tabs),i(),s("ngIf",e.tab==="overview"),i(),s("ngIf",e.tab==="dag"),i(),s("ngIf",e.tab==="yaml"),i(),s("ngIf",e.tab==="runs"),i(),s("visible",e.showRunDialog)("workflowName",e.workflow.id)}}var U=class r{route=w($);api=w(Q);router=w(B);workflow;runs=[];selectedNode;tab="overview";showRunDialog=!1;loading=!0;error="";copied=!1;tabs=[{id:"overview",label:"Overview"},{id:"dag",label:"DAG"},{id:"yaml",label:"YAML"},{id:"runs",label:"Runs"}];ngOnInit(){let l=this.route.snapshot.queryParamMap.get("id");if(!l){this.loading=!1,this.error="Missing workflow id.";return}I({workflow:this.api.getWorkflow(l),runs:this.api.getRuns()}).subscribe({next:e=>{this.workflow=e.workflow,this.selectedNode=e.workflow.nodes[0],this.runs=e.runs.filter(c=>c.workflow===l).reverse(),this.loading=!1},error:e=>{this.loading=!1,this.error=e?.error?.error??"Failed to load workflow."}})}get dependencyCount(){return this.workflow?.nodes.reduce((l,e)=>l+e.dependsOn.length,0)??0}get dagLayers(){if(!this.workflow)return[];let l=new Map,e=(a,m=new Set)=>{if(l.has(a.id))return l.get(a.id);if(m.has(a.id)||!a.dependsOn.length)return 0;m.add(a.id);let S=1+Math.max(...a.dependsOn.map(X=>{let E=this.workflow.nodes.find(Z=>Z.id===X);return E?e(E,m):0}));return m.delete(a.id),l.set(a.id,S),S};for(let a of this.workflow.nodes)l.set(a.id,e(a));let c=[];for(let a of this.workflow.nodes)(c[l.get(a.id)??0]??=[]).push(a);return c}typeLabel(l){return l==="command"?"CMD":l==="prompt"?"AI":"SH"}onStartRun(l){this.showRunDialog=!1,this.api.startRun(this.workflow.id,l).subscribe(e=>this.router.navigate(["/runs",e.runId]))}copyYaml(){this.workflow&&navigator.clipboard.writeText(this.workflow.yaml).then(()=>{this.copied=!0,setTimeout(()=>this.copied=!1,1500)})}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=C({type:r,selectors:[["app-workflow-detail"]],decls:4,vars:3,consts:[[1,"detail-page"],["class","state error",4,"ngIf"],["class","state",4,"ngIf"],[4,"ngIf"],[1,"state","error"],[1,"state"],[1,"breadcrumb"],["routerLink","/workflows"],[1,"hero"],[1,"workflow-icon"],[1,"hero-copy"],[1,"namespace"],[1,"hero-actions"],["routerLink","/workflows/builder",1,"button","secondary",3,"queryParams"],["type","button",1,"button","primary",3,"click"],[1,"stats"],[1,"file-strip"],["aria-label","Workflow detail sections",1,"tabs"],["type","button",3,"active","click",4,"ngFor","ngForOf"],["class","tab-content",4,"ngIf"],["class","dag-panel",4,"ngIf"],["class","yaml-panel",4,"ngIf"],["class","runs-panel",4,"ngIf"],[3,"run","closed","visible","workflowName"],["type","button",3,"click"],[1,"tab-content"],[1,"node-list"],[1,"section-heading"],["type","button","class","node-row",3,"selected","click",4,"ngFor","ngForOf"],["class","inspector",4,"ngIf"],["type","button",1,"node-row",3,"click"],[1,"step-index"],[1,"type-icon"],[1,"node-main"],[1,"dependency"],[1,"inspector"],[1,"inspector-title"],[1,"badge"],[1,"dag-panel"],[1,"dag-toolbar"],[1,"dag-canvas"],["class","dag-layer",4,"ngFor","ngForOf"],[1,"dag-layer"],[1,"layer-label"],[4,"ngFor","ngForOf"],[1,"yaml-panel"],[1,"yaml-toolbar"],[1,"runs-panel"],[1,"status"],[3,"routerLink"],["colspan","5",1,"empty"]],template:function(e,c){e&1&&(n(0,"section",0),f(1,re,2,1,"div",1)(2,ae,2,0,"div",2)(3,we,61,20,"ng-container",3),t()),e&2&&(i(),s("ngIf",c.error),i(),s("ngIf",c.loading),i(),s("ngIf",c.workflow))},dependencies:[Y,A,L,q,y,j],styles:["[_nghost-%COMP%]{display:block;min-height:calc(100vh - 56px);background:#101114;color:#e7e7ea}.detail-page[_ngcontent-%COMP%]{max-width:1320px;margin:auto;padding:24px 28px 60px}.breadcrumb[_ngcontent-%COMP%]{display:flex;gap:7px;color:#737a87;font-size:12px;margin-bottom:18px}.breadcrumb[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#9ca3af;text-decoration:none}.hero[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:15px}.workflow-icon[_ngcontent-%COMP%]{display:grid;place-items:center;flex:0 0 46px;height:52px;border:1px solid #454957;border-radius:6px;color:#a5b4fc;font-weight:900}.hero-copy[_ngcontent-%COMP%]{min-width:0}.namespace[_ngcontent-%COMP%]{font:11px ui-monospace,monospace;color:#818cf8}.hero[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:26px;margin:4px 0}.hero[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9ba1ad;margin:5px 0;line-height:1.5;max-width:800px}.hero-actions[_ngcontent-%COMP%]{display:flex;gap:8px;margin-left:auto}.button[_ngcontent-%COMP%]{padding:9px 13px;border-radius:5px;text-decoration:none;font:inherit;font-size:12px;font-weight:700;cursor:pointer}.button.secondary[_ngcontent-%COMP%]{border:1px solid #3b3e48;background:#1c1e24;color:#e5e7eb}.button.primary[_ngcontent-%COMP%]{border:1px solid #6366f1;background:#6366f1;color:#fff}.stats[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid #2d3038;border-radius:7px;margin-top:24px;background:#16171c}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{padding:13px 16px;border-right:1px solid #2d3038}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]:last-child{border:0}.stats[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .file-strip[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;color:#777e8b;font-size:10px;text-transform:uppercase;font-weight:700}.stats[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-top:5px;font-size:14px}.file-strip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:14px;padding:10px 14px;border:1px solid #2d3038;border-top:0;background:#131419}.file-strip[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{color:#aab0bb;font-size:11px}.tabs[_ngcontent-%COMP%]{display:flex;border-bottom:1px solid #2d3038;margin-top:24px}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:0;background:transparent;color:#858c98;padding:10px 14px;font-weight:700;cursor:pointer}.tabs[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{color:#fff;box-shadow:inset 0 -2px #6366f1}.tabs[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{background:#292c34;padding:1px 5px;border-radius:8px;font-size:10px}.tab-content[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:16px;margin-top:18px}.section-heading[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:15px;margin:0}.section-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font-size:12px;color:#7f8692;margin:4px 0 12px}.node-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:28px 38px minmax(180px,1fr) minmax(120px,.5fr);align-items:center;gap:11px;width:100%;border:1px solid #292c34;border-bottom:0;background:#16171c;color:#e5e7eb;padding:11px;text-align:left;cursor:pointer}.node-row[_ngcontent-%COMP%]:first-of-type{border-radius:6px 6px 0 0}.node-row[_ngcontent-%COMP%]:last-child{border-bottom:1px solid #292c34;border-radius:0 0 6px 6px}.node-row[_ngcontent-%COMP%]:hover, .node-row.selected[_ngcontent-%COMP%]{background:#1e2027;border-color:#494d5a}.step-index[_ngcontent-%COMP%]{color:#676e7a;font-size:11px;text-align:center}.type-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:34px;height:28px;border-radius:4px;background:#242630;color:#c4b5fd;font-size:9px;font-weight:900;text-transform:uppercase}.type-icon[data-type=bash][_ngcontent-%COMP%]{color:#fbbf24}.type-icon[data-type=command][_ngcontent-%COMP%]{color:#67e8f9}.node-main[_ngcontent-%COMP%]{min-width:0}.node-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block}.node-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{color:#777e8b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:4px}.dependency[_ngcontent-%COMP%]{color:#858c98;font-size:11px;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%]{border:1px solid #2d3038;background:#16171c;border-radius:6px;padding:15px}.inspector-title[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px;font-weight:800}.inspector[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:8px 0;font-size:16px}.badge[_ngcontent-%COMP%]{display:inline-block;border:1px solid #4b4f5c;padding:2px 6px;border-radius:4px;font-size:10px;color:#a5b4fc}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{margin:14px 0}.inspector[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:12px;padding:7px 0;border-bottom:1px solid #282a31;font-size:11px}.inspector[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:#777e8b}.inspector[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;text-align:right;overflow-wrap:anywhere}.inspector[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:10px;color:#777e8b;text-transform:uppercase}.inspector[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{white-space:pre-wrap;overflow-wrap:anywhere;background:#0d0e11;padding:10px;border-radius:5px;font-size:11px;max-height:240px;overflow:auto}.dag-panel[_ngcontent-%COMP%], .yaml-panel[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%]{margin-top:18px;border:1px solid #2d3038;border-radius:7px;overflow:hidden}.dag-toolbar[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid #2d3038;background:#16171c}.dag-toolbar[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:0}.dag-toolbar[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .yaml-toolbar[_ngcontent-%COMP%]{font-size:11px;color:#858c98}.dag-canvas[_ngcontent-%COMP%]{display:flex;align-items:stretch;gap:42px;min-height:380px;overflow:auto;padding:32px;background-color:#101114;background-image:radial-gradient(#30333b 1px,transparent 1px);background-size:16px 16px}.dag-layer[_ngcontent-%COMP%]{display:flex;flex:0 0 220px;flex-direction:column;gap:10px;position:relative}.layer-label[_ngcontent-%COMP%]{font-size:10px;color:#6f7684;text-transform:uppercase}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%]{border:1px solid #3a3d47;background:#191b20;border-radius:6px;padding:10px}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;align-items:center;gap:9px}.dag-layer[_ngcontent-%COMP%] article[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{display:block;color:#777e8b;margin-top:8px;overflow-wrap:anywhere}.yaml-toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid #3a3d47;background:#22242b;color:#ddd;border-radius:4px;padding:5px 9px}.yaml-panel[_ngcontent-%COMP%] > pre[_ngcontent-%COMP%]{margin:0;padding:18px;min-height:420px;max-height:65vh;overflow:auto;background:#0d0e11;color:#cdd6f4;font:12px/1.6 ui-monospace,monospace;white-space:pre-wrap}.runs-panel[_ngcontent-%COMP%] table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background:#16171c;font-size:12px}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .runs-panel[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:12px;text-align:left;border-bottom:1px solid #292c34}.runs-panel[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{color:#777e8b;text-transform:uppercase;font-size:10px}.runs-panel[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#a5b4fc}.status[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase}.status[data-status=completed][_ngcontent-%COMP%]{color:#34d399}.status[data-status=failed][_ngcontent-%COMP%], .status[data-status=cancelled][_ngcontent-%COMP%]{color:#f87171}.status[data-status=running][_ngcontent-%COMP%]{color:#60a5fa}.empty[_ngcontent-%COMP%], .state[_ngcontent-%COMP%]{padding:24px;text-align:center;color:#858c98}.state.error[_ngcontent-%COMP%]{color:#fca5a5}@media(max-width:900px){.detail-page[_ngcontent-%COMP%]{padding:18px 14px}.hero[_ngcontent-%COMP%]{flex-wrap:wrap}.hero-actions[_ngcontent-%COMP%]{width:100%;margin-left:61px}.stats[_ngcontent-%COMP%]{grid-template-columns:repeat(2,1fr)}.stats[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{border-bottom:1px solid #2d3038}.tab-content[_ngcontent-%COMP%]{grid-template-columns:1fr}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 38px 1fr}.dependency[_ngcontent-%COMP%]{grid-column:3}.inspector[_ngcontent-%COMP%]{position:static}}@media(max-width:600px){.stats[_ngcontent-%COMP%]{grid-template-columns:1fr}.hero-actions[_ngcontent-%COMP%]{margin-left:0}.tabs[_ngcontent-%COMP%]{overflow:auto}.node-row[_ngcontent-%COMP%]{grid-template-columns:28px 1fr}.type-icon[_ngcontent-%COMP%]{display:none}.node-main[_ngcontent-%COMP%], .dependency[_ngcontent-%COMP%]{grid-column:2}.dag-canvas[_ngcontent-%COMP%]{padding:18px}}"]})};export{U as WorkflowDetailComponent};
@@ -1 +0,0 @@
1
- import{Aa as s,Ca as f,D as a,Ea as g,Ga as x,Ha as u,Ia as b,P as l,Q as n,R as t,S as m,ba as o,ja as c,qa as d,z as p}from"./chunk-U2H3QYAG.js";var h=[{path:"",loadComponent:()=>import("./chunk-JFBK3MNW.js").then(e=>e.DashboardComponent)},{path:"workflows",loadComponent:()=>import("./chunk-VA7KFQOR.js").then(e=>e.WorkflowsComponent)},{path:"workflows/builder",loadComponent:()=>import("./chunk-4YPNNQ2T.js").then(e=>e.WorkflowBuilderComponent)},{path:"workflows/detail",loadComponent:()=>import("./chunk-WV3C6DNH.js").then(e=>e.WorkflowDetailComponent)},{path:"runs/:runId",loadComponent:()=>import("./chunk-E227ZHPJ.js").then(e=>e.RunExecutionComponent)}];var C={providers:[d({eventCoalescing:!0}),b(h),f()]};var k=()=>({exact:!0}),i=class e{static \u0275fac=function(r){return new(r||e)};static \u0275cmp=a({type:e,selectors:[["app-root"]],decls:16,vars:2,consts:[[1,"app-shell"],[1,"app-nav"],["routerLink","/",1,"brand-link"],[1,"brand-icon"],[1,"brand-name"],["routerLink","/","routerLinkActive","border-primary text-primary",1,"nav-link",3,"routerLinkActiveOptions"],["routerLink","/workflows","routerLinkActive","border-primary text-primary",1,"nav-link"],[1,"nav-spacer"],[1,"version-pill"],[1,"app-main"]],template:function(r,y){r&1&&(n(0,"div",0)(1,"nav",1)(2,"a",2)(3,"span",3),o(4,"V"),t(),n(5,"span",4),o(6,"VSAF"),t()(),n(7,"a",5),o(8," Dashboard "),t(),n(9,"a",6),o(10," Workflows "),t(),n(11,"div",7)(12,"span",8),o(13,"v0.2.0"),t()()(),n(14,"main",9),m(15,"router-outlet"),t()()),r&2&&(p(7),l("routerLinkActiveOptions",c(1,k)))},dependencies:[g,x,u],styles:["[_nghost-%COMP%]{display:block;min-height:100vh;background:#101114;color:#e7e7ea}.app-shell[_ngcontent-%COMP%]{min-height:100vh;background:#101114;color:#e7e7ea}.app-nav[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;height:56px;border-bottom:1px solid #2b2d33;background:#17181d;padding:0 16px;box-sizing:border-box}.brand-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:9px;margin-right:18px;color:#f4f4f5;text-decoration:none}.brand-link[_ngcontent-%COMP%]:hover{opacity:.82}.brand-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:30px;height:30px;border-radius:7px;background:#6366f1;color:#fff;font-size:14px;font-weight:800}.brand-name[_ngcontent-%COMP%]{font-size:14px;font-weight:800}.nav-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:56px;border-bottom:2px solid transparent;padding:0 13px;color:#a1a1aa;font-size:14px;font-weight:650;text-decoration:none;box-sizing:border-box}.nav-link[_ngcontent-%COMP%]:hover{color:#f4f4f5}.nav-link.border-primary[_ngcontent-%COMP%], .nav-link.text-primary[_ngcontent-%COMP%]{border-bottom-color:#6366f1;color:#a5b4fc}.nav-spacer[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;gap:12px}.version-pill[_ngcontent-%COMP%]{border:1px solid #2b2d33;border-radius:7px;background:#20222a;color:#a1a1aa;padding:5px 8px;font-size:12px}.app-main[_ngcontent-%COMP%]{min-height:calc(100vh - 56px);overflow:auto;background:#101114}"]})};s(i,C).catch(e=>console.error(e));