comisai 1.0.24 → 1.0.25

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 (98) hide show
  1. package/node_modules/@comis/agent/package.json +1 -1
  2. package/node_modules/@comis/channels/package.json +1 -1
  3. package/node_modules/@comis/cli/package.json +1 -1
  4. package/node_modules/@comis/core/dist/bootstrap.js +5 -0
  5. package/node_modules/@comis/core/dist/config/env-layer.d.ts +31 -0
  6. package/node_modules/@comis/core/dist/config/env-layer.js +41 -0
  7. package/node_modules/@comis/core/dist/config/layered.d.ts +9 -0
  8. package/node_modules/@comis/core/dist/config/layered.js +11 -0
  9. package/node_modules/@comis/core/package.json +1 -1
  10. package/node_modules/@comis/daemon/dist/daemon.js +3 -0
  11. package/node_modules/@comis/daemon/package.json +1 -1
  12. package/node_modules/@comis/gateway/package.json +1 -1
  13. package/node_modules/@comis/infra/package.json +1 -1
  14. package/node_modules/@comis/memory/package.json +1 -1
  15. package/node_modules/@comis/scheduler/package.json +1 -1
  16. package/node_modules/@comis/shared/package.json +1 -1
  17. package/node_modules/@comis/skills/package.json +1 -1
  18. package/node_modules/@comis/web/dist/assets/{agent-detail-BG9MGWWj.js → agent-detail-ru-AhppM.js} +270 -270
  19. package/node_modules/@comis/web/dist/assets/agent-editor-hjwRuFVp.js +2173 -0
  20. package/node_modules/@comis/web/dist/assets/{agent-list-LHCJ4rw2.js → agent-list-6Uotjatr.js} +170 -170
  21. package/node_modules/@comis/web/dist/assets/{approvals-q9VH_IKr.js → approvals-C-K6hN2U.js} +13 -13
  22. package/node_modules/@comis/web/dist/assets/billing-view-CxysXH0p.js +375 -0
  23. package/node_modules/@comis/web/dist/assets/{channel-detail-CaInesJM.js → channel-detail-BBCKtmne.js} +265 -265
  24. package/node_modules/@comis/web/dist/assets/channel-list-FkfeOLBQ.js +323 -0
  25. package/node_modules/@comis/web/dist/assets/{chat-console-CNmzl0JW.js → chat-console-BumBaIgO.js} +243 -246
  26. package/node_modules/@comis/web/dist/assets/{config-editor-DX4ITw6y.js → config-editor-C9BSwHGy.js} +477 -477
  27. package/node_modules/@comis/web/dist/assets/{context-dag-browser-BwiaF5tf.js → context-dag-browser-BHm00mJD.js} +105 -105
  28. package/node_modules/@comis/web/dist/assets/{context-engine-BZ5Am6hA.js → context-engine-BENY3pWE.js} +136 -136
  29. package/node_modules/@comis/web/dist/assets/decorate-BvWYovGE.js +38 -0
  30. package/node_modules/@comis/web/dist/assets/{delivery-view-OfBZof-m.js → delivery-view-BCnkPsAp.js} +134 -134
  31. package/node_modules/@comis/web/dist/assets/{diagnostics-view-YFwCxgr2.js → diagnostics-view-C_jQFG2H.js} +82 -82
  32. package/node_modules/@comis/web/dist/assets/directive-BOYXJ-K-.js +1 -0
  33. package/node_modules/@comis/web/dist/assets/{extract-variables-BM5qyK-s.js → extract-variables-B7-Doo7l.js} +39 -39
  34. package/node_modules/@comis/web/dist/assets/{ic-array-editor-B7m6x7-S.js → ic-array-editor-BLoEyeLS.js} +29 -29
  35. package/node_modules/@comis/web/dist/assets/{ic-breadcrumb-CUMpp3BL.js → ic-breadcrumb-DqN6G3gc.js} +16 -16
  36. package/node_modules/@comis/web/dist/assets/{ic-budget-segment-bar-BtJ6x5mN.js → ic-budget-segment-bar-zLsMzjDO.js} +20 -20
  37. package/node_modules/@comis/web/dist/assets/ic-chat-message-FdQcZsSQ.js +352 -0
  38. package/node_modules/@comis/web/dist/assets/{ic-confirm-dialog-CCDbB04e.js → ic-confirm-dialog-DGlPbV1T.js} +26 -26
  39. package/node_modules/@comis/web/dist/assets/{ic-connection-dot-CnT1b8xr.js → ic-connection-dot-BgYiK2N4.js} +13 -13
  40. package/node_modules/@comis/web/dist/assets/ic-data-table-CKIvr-ag.js +277 -0
  41. package/node_modules/@comis/web/dist/assets/ic-delivery-row-B3YwjjuM.js +67 -0
  42. package/node_modules/@comis/web/dist/assets/{ic-detail-panel-BF83r-if.js → ic-detail-panel-DiCe4hLr.js} +27 -27
  43. package/node_modules/@comis/web/dist/assets/{ic-empty-state-60l2ePhd.js → ic-empty-state-CM3Wbj2f.js} +19 -19
  44. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-ByRjij68.js +359 -0
  45. package/node_modules/@comis/web/dist/assets/ic-icon-BGNCCPpZ.js +33 -0
  46. package/node_modules/@comis/web/dist/assets/{ic-layer-waterfall-COvEYMg5.js → ic-layer-waterfall-WkaFyu-l.js} +18 -18
  47. package/node_modules/@comis/web/dist/assets/ic-relative-time-B3UAnTqg.js +12 -0
  48. package/node_modules/@comis/web/dist/assets/{ic-search-input-CSOxY9g7.js → ic-search-input-B02AGw1i.js} +22 -22
  49. package/node_modules/@comis/web/dist/assets/{ic-select-Ce-Raudx.js → ic-select-BqfZISjw.js} +29 -29
  50. package/node_modules/@comis/web/dist/assets/ic-tabs-yBjkWKJH.js +95 -0
  51. package/node_modules/@comis/web/dist/assets/ic-tag-CvMVQFRR.js +33 -0
  52. package/node_modules/@comis/web/dist/assets/{ic-time-range-picker-CypCT68y.js → ic-time-range-picker-DXbYeBmY.js} +31 -31
  53. package/node_modules/@comis/web/dist/assets/{ic-tool-call-7MaXSsCW.js → ic-tool-call-DMPHsLyx.js} +51 -51
  54. package/node_modules/@comis/web/dist/assets/index-CVEaS9aY.css +2 -0
  55. package/node_modules/@comis/web/dist/assets/index-FLPhHz8p.js +2792 -0
  56. package/node_modules/@comis/web/dist/assets/{mcp-management-BNZPnpDn.js → mcp-management-5jyScQis.js} +209 -209
  57. package/node_modules/@comis/web/dist/assets/{media-config-BBvTYxOX.js → media-config-J9oT9PPs.js} +154 -154
  58. package/node_modules/@comis/web/dist/assets/{media-test-BkK3RCRK.js → media-test-DGTCtM8-.js} +259 -259
  59. package/node_modules/@comis/web/dist/assets/{memory-inspector-1hDGCGat.js → memory-inspector-D5Re9ptG.js} +450 -450
  60. package/node_modules/@comis/web/dist/assets/{message-center-CXefwsUu.js → message-center-cRLK6ZmG.js} +290 -290
  61. package/node_modules/@comis/web/dist/assets/{models-C1qcU_j3.js → models-D5vu07MR.js} +371 -371
  62. package/node_modules/@comis/web/dist/assets/observability-types-D0tkwElU.js +1 -0
  63. package/node_modules/@comis/web/dist/assets/{observe-view-C0VBhX4C.js → observe-view-CalNNEmd.js} +399 -399
  64. package/node_modules/@comis/web/dist/assets/pipeline-builder-DUYDGwZf.js +1495 -0
  65. package/node_modules/@comis/web/dist/assets/{pipeline-history-DkfOQ6SW.js → pipeline-history-BAO8brOe.js} +124 -124
  66. package/node_modules/@comis/web/dist/assets/{pipeline-history-detail-hyHgD0ai.js → pipeline-history-detail-DectIoQt.js} +65 -65
  67. package/node_modules/@comis/web/dist/assets/{pipeline-list-BPW8hV-q.js → pipeline-list-BHlaBKww.js} +227 -227
  68. package/node_modules/@comis/web/dist/assets/{pipeline-monitor-Bip16T7e.js → pipeline-monitor-BhtpNEHf.js} +298 -298
  69. package/node_modules/@comis/web/dist/assets/{scheduler-BGgwKd06.js → scheduler-VafN_8xi.js} +486 -486
  70. package/node_modules/@comis/web/dist/assets/{security-D15st4xx.js → security-QQXMRTlo.js} +389 -389
  71. package/node_modules/@comis/web/dist/assets/{session-detail-SGEYNJ0M.js → session-detail-BpZ_8Yih.js} +294 -294
  72. package/node_modules/@comis/web/dist/assets/session-key-parser-Dkqcj2Ss.js +1 -0
  73. package/node_modules/@comis/web/dist/assets/session-list-DfCm8Cec.js +231 -0
  74. package/node_modules/@comis/web/dist/assets/{setup-wizard-nT0tz9QP.js → setup-wizard-C-z477CG.js} +486 -494
  75. package/node_modules/@comis/web/dist/assets/{skills-D8yVfSUy.js → skills-BCOGPf6s.js} +329 -329
  76. package/node_modules/@comis/web/dist/assets/{subagents-HHXMeHYo.js → subagents-l-auUraL.js} +74 -74
  77. package/node_modules/@comis/web/dist/assets/{workspace-manager-BQlr10iH.js → workspace-manager-DlvBixiq.js} +236 -236
  78. package/node_modules/@comis/web/dist/index.html +3 -2
  79. package/node_modules/@comis/web/package.json +1 -1
  80. package/package.json +15 -15
  81. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +0 -2173
  82. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +0 -375
  83. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +0 -323
  84. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +0 -1
  85. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +0 -352
  86. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +0 -277
  87. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +0 -67
  88. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +0 -359
  89. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +0 -33
  90. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +0 -12
  91. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +0 -95
  92. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +0 -33
  93. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +0 -2830
  94. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +0 -1
  95. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +0 -1
  96. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +0 -1496
  97. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +0 -1
  98. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +0 -231
@@ -1,24 +1,4 @@
1
- import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I as Q}from"./index-CEcM1R_C.js";import{N as it,b as at,a as nt,c as mt}from"./ic-graph-canvas-C8FuSMe1.js";import"./ic-breadcrumb-CUMpp3BL.js";import"./ic-confirm-dialog-CCDbB04e.js";import"./directive-DoeGSK_T.js";const ot=2e3,ft=1e3;function vt(){let t="",e="running",s=!1,r=[],i=[],o=[],a={total:0,completed:0,failed:0,skipped:0,running:0,pending:0},p=0,x=null,v=!0,S=null,m=null,I=null,n=null,_=[],y=null;const N=new Set;function f(){for(const d of N)d()}function X(d,b){return d.map(c=>{const u=b[c.id];return{id:c.id,task:c.task,agentId:c.agentId,modelId:c.modelId,status:u?.status??"pending",runId:u?.runId,output:u?.output,error:u?.error,startedAt:u?.startedAt,completedAt:u?.completedAt,durationMs:u?.durationMs,retryAttempt:u?.retryAttempt,retriesRemaining:u?.retriesRemaining,dependsOn:c.dependsOn,position:{x:c.position.x,y:c.position.y}}})}function U(d){t=d.graphId,e=d.status,s=d.isTerminal,o=d.executionOrder,a=d.stats,r=X(_,d.nodes),v=!1,S=null,n===null&&d.status==="running"&&(n=Date.now(),p=0,D()),s&&($(),M()),f()}function C(d){S=d instanceof Error?d.message:String(d),v=!1,f()}async function w(d,b){try{const c=await d.call("graph.status",{graphId:b});U(c)}catch(c){C(c)}}function $(){m!==null&&(clearInterval(m),m=null)}function M(){I!==null&&(clearInterval(I),I=null)}function D(){M(),I=setInterval(()=>{n!==null&&(p=Date.now()-n,f())},ft)}function st(){let d=0,b=0,c=0,u=0,k=0;for(const gt of r)switch(gt.status){case"completed":d++;break;case"failed":b++;break;case"skipped":c++;break;case"running":u++;break;default:k++;break}a={total:r.length,completed:d,failed:b,skipped:c,running:u,pending:k}}return{subscribe(d){return N.add(d),()=>{N.delete(d)}},getSnapshot(){return Object.freeze({graphId:t,graphStatus:e,isTerminal:s,nodes:[...r],edges:[...i],executionOrder:[...o],stats:{...a},elapsedMs:p,selectedNodeId:x,loading:v,error:S})},selectNode(d){x=d,f()},startPolling(d,b,c,u){$(),M(),y=d,t=b,_=c,i=u,n=null,s=!1,w(d,b),m=setInterval(()=>{w(d,b)},ot)},stopPolling(){$(),M()},destroy(){$(),M(),N.clear()},applyEvent(d,b){if(d==="graph:node_updated"){const c=b;if(c.graphId!==t)return;const u=r.findIndex(k=>k.id===c.nodeId);if(u>=0){const k=r[u];r[u]={...k,status:c.status,durationMs:c.durationMs??k.durationMs,error:c.error??k.error,startedAt:c.status==="running"&&k.startedAt==null?c.timestamp:k.startedAt,completedAt:c.status==="completed"||c.status==="failed"?c.timestamp:k.completedAt},st(),f()}}else if(d==="graph:completed"){const c=b;if(c.graphId!==t)return;e=c.status,s=!0,a={total:c.nodeCount,completed:c.nodesCompleted,failed:c.nodesFailed,skipped:c.nodesSkipped,running:0,pending:0},$(),M(),v=!1,S=null,f()}else if(d==="graph:started"){if(b.graphId!==t)return;n===null&&(n=Date.now(),p=0,D()),f()}},suspendPolling(){$()},resumePolling(){s||y&&(w(y,t),$(),m=setInterval(()=>{w(y,t)},ot))}}}var bt=Object.defineProperty,xt=Object.getOwnPropertyDescriptor,J=(t,e,s,r)=>{for(var i=r>1?void 0:r?xt(e,s):e,o=t.length-1,a;o>=0;o--)(a=t[o])&&(i=(r?a(e,s,i):a(i))||i);return r&&i&&bt(e,s,i),i};let W=class extends G{constructor(){super(...arguments),this.graphStatus="running",this.isTerminal=!1,this.elapsedMs=0,this.stats={total:0,completed:0,failed:0,skipped:0,running:0,pending:0}}render(){const t=`status-badge status-badge--${this.graphStatus}`;return l`
2
- <div class="bar">
3
- <span class=${t} role="status">${this.graphStatus}</span>
4
- <span class="elapsed">${this._formatElapsed(this.elapsedMs)}</span>
5
- <span class="progress">${this.stats.completed}/${this.stats.total} nodes complete</span>
6
- <span class="tokens">N/A</span>
7
- ${this.isTerminal?l`
8
- <button
9
- class="outputs-btn"
10
- aria-label="View graph outputs"
11
- @click=${this._onViewOutputs}
12
- >View Outputs</button>
13
- `:l`
14
- <button
15
- class="cancel-btn"
16
- aria-label="Cancel pipeline execution"
17
- @click=${this._onCancel}
18
- >Cancel</button>
19
- `}
20
- </div>
21
- `}_formatElapsed(t){const e=Math.floor(t/1e3),s=Math.floor(e/60),r=e%60;return s>0?`${s}m ${String(r).padStart(2,"0")}s`:`${r}s`}_onCancel(){this.dispatchEvent(new CustomEvent("cancel",{bubbles:!0,composed:!0}))}_onViewOutputs(){this.dispatchEvent(new CustomEvent("view-outputs",{bubbles:!0,composed:!0}))}};W.styles=[F,B`
1
+ import{c as e,f as t,h as n,l as r,m as i,n as a,o,r as s,s as c,t as l,u}from"./decorate-BvWYovGE.js";import{a as d}from"./index-FLPhHz8p.js";import"./ic-breadcrumb-DqN6G3gc.js";import"./ic-confirm-dialog-DGlPbV1T.js";import{n as f,t as p}from"./ic-graph-canvas-ByRjij68.js";var m=2e3,h=1e3;function g(){let e=``,t=`running`,n=!1,r=[],i=[],a=[],o={total:0,completed:0,failed:0,skipped:0,running:0,pending:0},s=0,c=null,l=!0,u=null,d=null,f=null,p=null,g=[],_=null,v=new Set;function y(){for(let e of v)e()}function b(e,t){return e.map(e=>{let n=t[e.id];return{id:e.id,task:e.task,agentId:e.agentId,modelId:e.modelId,status:n?.status??`pending`,runId:n?.runId,output:n?.output,error:n?.error,startedAt:n?.startedAt,completedAt:n?.completedAt,durationMs:n?.durationMs,retryAttempt:n?.retryAttempt,retriesRemaining:n?.retriesRemaining,dependsOn:e.dependsOn,position:{x:e.position.x,y:e.position.y}}})}function x(i){e=i.graphId,t=i.status,n=i.isTerminal,a=i.executionOrder,o=i.stats,r=b(g,i.nodes),l=!1,u=null,p===null&&i.status===`running`&&(p=Date.now(),s=0,E()),n&&(w(),T()),y()}function S(e){u=e instanceof Error?e.message:String(e),l=!1,y()}async function C(e,t){try{x(await e.call(`graph.status`,{graphId:t}))}catch(e){S(e)}}function w(){d!==null&&(clearInterval(d),d=null)}function T(){f!==null&&(clearInterval(f),f=null)}function E(){T(),f=setInterval(()=>{p!==null&&(s=Date.now()-p,y())},h)}function D(){let e=0,t=0,n=0,i=0,a=0;for(let o of r)switch(o.status){case`completed`:e++;break;case`failed`:t++;break;case`skipped`:n++;break;case`running`:i++;break;default:a++;break}o={total:r.length,completed:e,failed:t,skipped:n,running:i,pending:a}}return{subscribe(e){return v.add(e),()=>{v.delete(e)}},getSnapshot(){return Object.freeze({graphId:e,graphStatus:t,isTerminal:n,nodes:[...r],edges:[...i],executionOrder:[...a],stats:{...o},elapsedMs:s,selectedNodeId:c,loading:l,error:u})},selectNode(e){c=e,y()},startPolling(t,r,a,o){w(),T(),_=t,e=r,g=a,i=o,p=null,n=!1,C(t,r),d=setInterval(()=>{C(t,r)},m)},stopPolling(){w(),T()},destroy(){w(),T(),v.clear()},applyEvent(i,a){if(i===`graph:node_updated`){let t=a;if(t.graphId!==e)return;let n=r.findIndex(e=>e.id===t.nodeId);if(n>=0){let e=r[n];r[n]={...e,status:t.status,durationMs:t.durationMs??e.durationMs,error:t.error??e.error,startedAt:t.status===`running`&&e.startedAt==null?t.timestamp:e.startedAt,completedAt:t.status===`completed`||t.status===`failed`?t.timestamp:e.completedAt},D(),y()}}else if(i===`graph:completed`){let r=a;if(r.graphId!==e)return;t=r.status,n=!0,o={total:r.nodeCount,completed:r.nodesCompleted,failed:r.nodesFailed,skipped:r.nodesSkipped,running:0,pending:0},w(),T(),l=!1,u=null,y()}else if(i===`graph:started`){if(a.graphId!==e)return;p===null&&(p=Date.now(),s=0,E()),y()}},suspendPolling(){w()},resumePolling(){n||_&&(C(_,e),w(),d=setInterval(()=>{C(_,e)},m))}}}var _=class extends r{constructor(...e){super(...e),this.graphStatus=`running`,this.isTerminal=!1,this.elapsedMs=0,this.stats={total:0,completed:0,failed:0,skipped:0,running:0,pending:0}}static{this.styles=[s,n`
22
2
  :host {
23
3
  display: block;
24
4
  }
@@ -109,106 +89,27 @@ import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I
109
89
  outline: 2px solid var(--ic-accent);
110
90
  outline-offset: 2px;
111
91
  }
112
- `];J([g()],W.prototype,"graphStatus",2);J([g({type:Boolean})],W.prototype,"isTerminal",2);J([g({type:Number})],W.prototype,"elapsedMs",2);J([g({attribute:!1})],W.prototype,"stats",2);W=J([q("ic-monitor-status-bar")],W);var _t=Object.defineProperty,yt=Object.getOwnPropertyDescriptor,j=(t,e,s,r)=>{for(var i=r>1?void 0:r?yt(e,s):e,o=t.length-1,a;o>=0;o--)(a=t[o])&&(i=(r?a(e,s,i):a(i))||i);return r&&i&&_t(e,s,i),i};const ct={pending:"#6b7280",ready:"#a78bfa",running:"#06b6d4",completed:"#22c55e",failed:"#ef4444",skipped:"#9ca3af"};function lt(t){return t==null?"--":new Date(t).toLocaleTimeString()}function wt(t){if(t==null)return"--";const e=t/1e3;if(e>=60){const s=Math.floor(e/60),r=Math.floor(e%60);return`${s}m ${r.toString().padStart(2,"0")}s`}return`${e.toFixed(1)}s`}let A=class extends G{constructor(){super(...arguments),this.node=null,this.allNodes=[],this._showFullOutput=!1,this._steerMode=!1,this._steerText=""}_dispatchClose(){this.dispatchEvent(new CustomEvent("close",{bubbles:!0,composed:!0}))}_dispatchSteer(){const t=this.node;!t?.runId||!this._steerText.trim()||(this.dispatchEvent(new CustomEvent("steer",{bubbles:!0,composed:!0,detail:{runId:t.runId,message:this._steerText.trim()}})),this._steerMode=!1,this._steerText="")}_openFullOutput(){this._showFullOutput=!0}_closeFullOutput(){this._showFullOutput=!1}async _copyFullOutput(){const t=this.node?.output??this.node?.error??"";try{await navigator.clipboard.writeText(t)}catch{}}render(){const t=this.node;return t?l`
113
- ${this._renderHeader(t)}
114
- ${this._renderStatus(t)}
115
- ${this._renderTiming(t)}
116
- ${this._renderTask(t)}
117
- ${this._renderDependencies(t)}
118
- ${this._renderOutput(t)}
119
- ${this._renderError(t)}
120
- ${this._renderSteer(t)}
121
- ${this._showFullOutput?this._renderModal(t):h}
122
- `:h}_renderHeader(t){return l`
123
- <div class="header">
124
- <h3 title=${t.id}>${t.id}</h3>
125
- <button class="close-btn" @click=${this._dispatchClose} title="Close">&times;</button>
126
- </div>
127
- `}_renderStatus(t){const e=ct[t.status]??"#6b7280",s=t.retryAttempt!=null&&t.retryAttempt>0;return l`
128
- <div class="section-header">Status</div>
129
- <div style="margin-bottom: 6px">
130
- <span class="status-badge" style="background: ${e}">${t.status}</span>
131
- ${s?l`<span class="retry-badge">(retrying)</span>`:h}
132
- </div>
133
- ${s?l`<div class="field-row">
134
- <span class="field-label">Retry</span>
135
- <span class="field-value">Attempt ${t.retryAttempt}${t.retriesRemaining!=null?` (${t.retriesRemaining} remaining)`:""}</span>
136
- </div>`:h}
137
- ${t.agentId?l`<div class="field-row">
138
- <span class="field-label">Agent</span>
139
- <span class="field-value">${t.agentId}</span>
140
- </div>`:h}
141
- ${t.modelId?l`<div class="field-row">
142
- <span class="field-label">Model</span>
143
- <span class="field-value">${t.modelId}</span>
144
- </div>`:h}
145
- ${t.runId?l`<div class="field-row">
146
- <span class="field-label">Run ID</span>
147
- <span class="field-value mono" title=${t.runId}>${t.runId}</span>
148
- </div>`:h}
149
- `}_renderTiming(t){return l`
150
- <div class="section-header">Timing</div>
151
- <div class="field-row">
152
- <span class="field-label">Started</span>
153
- <span class="field-value">${lt(t.startedAt)}</span>
154
- </div>
155
- <div class="field-row">
156
- <span class="field-label">Completed</span>
157
- <span class="field-value">${lt(t.completedAt)}</span>
158
- </div>
159
- <div class="field-row">
160
- <span class="field-label">Duration</span>
161
- <span class="field-value">${wt(t.durationMs)}</span>
162
- </div>
163
- `}_renderTask(t){return l`
164
- <div class="section-header">Task</div>
165
- <div class="task-box">${t.task}</div>
166
- `}_renderDependencies(t){return t.dependsOn.length?l`
167
- <div class="section-header">Dependencies</div>
168
- ${t.dependsOn.map(e=>{const r=this.allNodes.find(o=>o.id===e)?.status??"pending",i=ct[r]??"#6b7280";return l`
169
- <div class="dep-row">
170
- <span class="dep-dot" style="background: ${i}"></span>
171
- <span class="dep-label">${e}</span>
172
- </div>
173
- `})}
174
- `:h}_renderOutput(t){if(!t.output)return h;const s=t.output.length>300?t.output.slice(0,300)+"...":t.output,r=t.output.endsWith("... [truncated]");return l`
175
- <div class="section-header">Output</div>
176
- <pre class="output-block">${s}</pre>
177
- ${r?l`<div class="truncated-note">Output may be truncated by server</div>`:h}
178
- <button class="view-full-btn" @click=${this._openFullOutput}>View Full Output</button>
179
- `}_renderError(t){return t.error?l`
180
- <div class="section-header">Error</div>
181
- <pre class="error-block">${t.error}</pre>
182
- `:h}_renderSteer(t){return t.status!=="running"||!t.runId?h:l`
183
- <div class="section-header">Steer</div>
184
- ${this._steerMode?l`
185
- <div class="steer-area">
186
- <textarea
187
- placeholder="Enter new instructions..."
188
- .value=${this._steerText}
189
- @input=${e=>{this._steerText=e.target.value}}
190
- ></textarea>
191
- <div class="send-row">
192
- <button class="send-btn" @click=${this._dispatchSteer}>Send</button>
193
- </div>
194
- </div>
195
- `:l`<button class="steer-btn" @click=${()=>{this._steerMode=!0}}>Steer</button>`}
196
- `}_renderModal(t){const e=t.output??t.error??"",s=t.output?"Full Output":"Error Details";return l`
197
- <div class="modal-backdrop" @click=${this._closeFullOutput}>
198
- <div class="modal-content" @click=${r=>r.stopPropagation()}>
199
- <div class="modal-header">
200
- <h4>${s} - ${t.id}</h4>
201
- <div class="modal-actions">
202
- <button class="copy-btn" @click=${this._copyFullOutput}>Copy</button>
203
- <button class="modal-close-btn" @click=${this._closeFullOutput}>Close</button>
204
- </div>
205
- </div>
206
- <div class="modal-body">
207
- <pre>${e}</pre>
208
- </div>
209
- </div>
92
+ `]}render(){return t`
93
+ <div class="bar">
94
+ <span class=${`status-badge status-badge--${this.graphStatus}`} role="status">${this.graphStatus}</span>
95
+ <span class="elapsed">${this._formatElapsed(this.elapsedMs)}</span>
96
+ <span class="progress">${this.stats.completed}/${this.stats.total} nodes complete</span>
97
+ <span class="tokens">N/A</span>
98
+ ${this.isTerminal?t`
99
+ <button
100
+ class="outputs-btn"
101
+ aria-label="View graph outputs"
102
+ @click=${this._onViewOutputs}
103
+ >View Outputs</button>
104
+ `:t`
105
+ <button
106
+ class="cancel-btn"
107
+ aria-label="Cancel pipeline execution"
108
+ @click=${this._onCancel}
109
+ >Cancel</button>
110
+ `}
210
111
  </div>
211
- `}};A.styles=[F,ht,B`
112
+ `}_formatElapsed(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n>0?`${n}m ${String(r).padStart(2,`0`)}s`:`${r}s`}_onCancel(){this.dispatchEvent(new CustomEvent(`cancel`,{bubbles:!0,composed:!0}))}_onViewOutputs(){this.dispatchEvent(new CustomEvent(`view-outputs`,{bubbles:!0,composed:!0}))}};l([c()],_.prototype,`graphStatus`,void 0),l([c({type:Boolean})],_.prototype,`isTerminal`,void 0),l([c({type:Number})],_.prototype,`elapsedMs`,void 0),l([c({attribute:!1})],_.prototype,`stats`,void 0),_=l([e(`ic-monitor-status-bar`)],_);var v={pending:`#6b7280`,ready:`#a78bfa`,running:`#06b6d4`,completed:`#22c55e`,failed:`#ef4444`,skipped:`#9ca3af`};function y(e){return e==null?`--`:new Date(e).toLocaleTimeString()}function b(e){if(e==null)return`--`;let t=e/1e3;return t>=60?`${Math.floor(t/60)}m ${Math.floor(t%60).toString().padStart(2,`0`)}s`:`${t.toFixed(1)}s`}var x=class extends r{constructor(...e){super(...e),this.node=null,this.allNodes=[],this._showFullOutput=!1,this._steerMode=!1,this._steerText=``}static{this.styles=[s,a,n`
212
113
  :host {
213
114
  display: block;
214
115
  width: 320px;
@@ -505,54 +406,106 @@ import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I
505
406
  font-style: italic;
506
407
  padding: 8px 0;
507
408
  }
508
- `];j([g({attribute:!1})],A.prototype,"node",2);j([g({attribute:!1})],A.prototype,"allNodes",2);j([P()],A.prototype,"_showFullOutput",2);j([P()],A.prototype,"_steerMode",2);j([P()],A.prototype,"_steerText",2);A=j([q("ic-node-detail-panel")],A);var $t=Object.defineProperty,St=Object.getOwnPropertyDescriptor,K=(t,e,s,r)=>{for(var i=r>1?void 0:r?St(e,s):e,o=t.length-1,a;o>=0;o--)(a=t[o])&&(i=(r?a(e,s,i):a(i))||i);return r&&i&&$t(e,s,i),i};const Y=28,Z=4,tt=80,rt=20,et=2,kt=200,dt={running:"#06b6d4",completed:"#22c55e",failed:"#ef4444",skipped:"#9ca3af",pending:"#4b5563",ready:"#a78bfa"};let V=class extends G{constructor(){super(...arguments),this.nodes=[],this.executionOrder=[],this.elapsedMs=0,this.selectedNodeId=null}render(){if(!this.executionOrder.length)return l`<svg width="100%" height="100%"></svg>`;const t=new Map(this.nodes.map(n=>[n.id,n])),e=this.executionOrder.map(n=>t.get(n)).filter(n=>n!=null);if(!e.length)return l`<svg width="100%" height="100%"></svg>`;const s=e.filter(n=>n.startedAt!=null).map(n=>n.startedAt),r=s.length>0?Math.min(...s):0,i=Math.max(this.elapsedMs,1e3),o=e.length,a=rt+o*(Y+Z)+Z,p=Math.max(kt,600),x=tt+p+16,v=p/i,S=i/1e3;let m;S<5?m=1:S<60?m=5:m=10;const I=[];for(let n=m;n*1e3<=i;n+=m)I.push(n);return l`
509
- <svg width="${x}" height="${a}" viewBox="0 0 ${x} ${a}">
510
- <!-- Time markers -->
511
- ${I.map(n=>{const _=tt+n*1e3*v;return H`
512
- <line class="time-line" x1="${_}" y1="${rt}" x2="${_}" y2="${a}" />
513
- <text class="time-marker" x="${_}" y="2">${n}s</text>
514
- `})}
515
-
516
- <!-- Rows -->
517
- ${e.map((n,_)=>{const y=rt+_*(Y+Z)+Z,N=n.id===this.selectedNodeId,f=n.retryAttempt!=null&&n.retryAttempt>0,X=n.id.length>10?n.id.slice(0,9)+"…":n.id,U=f?`${X} (R${n.retryAttempt})`:X;let C=0,w=0,$=dt[n.status]??"#4b5563",M=1,D=!1;if(n.status==="running"&&n.startedAt!=null)C=(n.startedAt-r)*v,w=Math.max((i-(n.startedAt-r))*v,4),M=.8,D=!0;else if((n.status==="completed"||n.status==="failed")&&n.startedAt!=null){C=(n.startedAt-r)*v;const st=n.completedAt??r+i;w=Math.max((st-n.startedAt)*v,4),D=!0}else n.status==="skipped"&&(C=0,w=8,$=dt.skipped,M=.5,D=!0);return H`
518
- <!-- Alternating row background -->
519
- ${_%2===1?H`<rect class="row-bg" x="0" y="${y}" width="${x}" height="${Y}" />`:h}
520
-
521
- <!-- Node label -->
522
- <text class="label-text" x="4" y="${y+Y/2}">
523
- ${U}
524
- </text>
525
-
526
- <!-- Bar -->
527
- ${D?H`
528
- <rect
529
- class="bar"
530
- x="${tt+C}"
531
- y="${y+4}"
532
- width="${w}"
533
- height="${Y-8}"
534
- rx="${et}"
535
- ry="${et}"
536
- fill="${$}"
537
- opacity="${M}"
538
- stroke="${f?"#f97316":"none"}"
539
- stroke-width="${f?"1.5":"0"}"
540
- data-node-id="${n.id}"
541
- @click=${()=>this._onBarClick(n.id)}
542
- />
543
- ${N?H`<rect
544
- class="selected-highlight"
545
- x="${tt+C-1}"
546
- y="${y+3}"
547
- width="${w+2}"
548
- height="${Y-6}"
549
- rx="${et+1}"
550
- ry="${et+1}"
551
- />`:h}
552
- `:h}
553
- `})}
554
- </svg>
555
- `}_onBarClick(t){this.dispatchEvent(new CustomEvent("node-inspect",{bubbles:!0,composed:!0,detail:{nodeId:t}}))}};V.styles=[F,B`
409
+ `]}_dispatchClose(){this.dispatchEvent(new CustomEvent(`close`,{bubbles:!0,composed:!0}))}_dispatchSteer(){let e=this.node;!e?.runId||!this._steerText.trim()||(this.dispatchEvent(new CustomEvent(`steer`,{bubbles:!0,composed:!0,detail:{runId:e.runId,message:this._steerText.trim()}})),this._steerMode=!1,this._steerText=``)}_openFullOutput(){this._showFullOutput=!0}_closeFullOutput(){this._showFullOutput=!1}async _copyFullOutput(){let e=this.node?.output??this.node?.error??``;try{await navigator.clipboard.writeText(e)}catch{}}render(){let e=this.node;return e?t`
410
+ ${this._renderHeader(e)}
411
+ ${this._renderStatus(e)}
412
+ ${this._renderTiming(e)}
413
+ ${this._renderTask(e)}
414
+ ${this._renderDependencies(e)}
415
+ ${this._renderOutput(e)}
416
+ ${this._renderError(e)}
417
+ ${this._renderSteer(e)}
418
+ ${this._showFullOutput?this._renderModal(e):u}
419
+ `:u}_renderHeader(e){return t`
420
+ <div class="header">
421
+ <h3 title=${e.id}>${e.id}</h3>
422
+ <button class="close-btn" @click=${this._dispatchClose} title="Close">&times;</button>
423
+ </div>
424
+ `}_renderStatus(e){let n=v[e.status]??`#6b7280`,r=e.retryAttempt!=null&&e.retryAttempt>0;return t`
425
+ <div class="section-header">Status</div>
426
+ <div style="margin-bottom: 6px">
427
+ <span class="status-badge" style="background: ${n}">${e.status}</span>
428
+ ${r?t`<span class="retry-badge">(retrying)</span>`:u}
429
+ </div>
430
+ ${r?t`<div class="field-row">
431
+ <span class="field-label">Retry</span>
432
+ <span class="field-value">Attempt ${e.retryAttempt}${e.retriesRemaining==null?``:` (${e.retriesRemaining} remaining)`}</span>
433
+ </div>`:u}
434
+ ${e.agentId?t`<div class="field-row">
435
+ <span class="field-label">Agent</span>
436
+ <span class="field-value">${e.agentId}</span>
437
+ </div>`:u}
438
+ ${e.modelId?t`<div class="field-row">
439
+ <span class="field-label">Model</span>
440
+ <span class="field-value">${e.modelId}</span>
441
+ </div>`:u}
442
+ ${e.runId?t`<div class="field-row">
443
+ <span class="field-label">Run ID</span>
444
+ <span class="field-value mono" title=${e.runId}>${e.runId}</span>
445
+ </div>`:u}
446
+ `}_renderTiming(e){return t`
447
+ <div class="section-header">Timing</div>
448
+ <div class="field-row">
449
+ <span class="field-label">Started</span>
450
+ <span class="field-value">${y(e.startedAt)}</span>
451
+ </div>
452
+ <div class="field-row">
453
+ <span class="field-label">Completed</span>
454
+ <span class="field-value">${y(e.completedAt)}</span>
455
+ </div>
456
+ <div class="field-row">
457
+ <span class="field-label">Duration</span>
458
+ <span class="field-value">${b(e.durationMs)}</span>
459
+ </div>
460
+ `}_renderTask(e){return t`
461
+ <div class="section-header">Task</div>
462
+ <div class="task-box">${e.task}</div>
463
+ `}_renderDependencies(e){return e.dependsOn.length?t`
464
+ <div class="section-header">Dependencies</div>
465
+ ${e.dependsOn.map(e=>t`
466
+ <div class="dep-row">
467
+ <span class="dep-dot" style="background: ${v[this.allNodes.find(t=>t.id===e)?.status??`pending`]??`#6b7280`}"></span>
468
+ <span class="dep-label">${e}</span>
469
+ </div>
470
+ `)}
471
+ `:u}_renderOutput(e){return e.output?t`
472
+ <div class="section-header">Output</div>
473
+ <pre class="output-block">${e.output.length>300?e.output.slice(0,300)+`...`:e.output}</pre>
474
+ ${e.output.endsWith(`... [truncated]`)?t`<div class="truncated-note">Output may be truncated by server</div>`:u}
475
+ <button class="view-full-btn" @click=${this._openFullOutput}>View Full Output</button>
476
+ `:u}_renderError(e){return e.error?t`
477
+ <div class="section-header">Error</div>
478
+ <pre class="error-block">${e.error}</pre>
479
+ `:u}_renderSteer(e){return e.status!==`running`||!e.runId?u:t`
480
+ <div class="section-header">Steer</div>
481
+ ${this._steerMode?t`
482
+ <div class="steer-area">
483
+ <textarea
484
+ placeholder="Enter new instructions..."
485
+ .value=${this._steerText}
486
+ @input=${e=>{this._steerText=e.target.value}}
487
+ ></textarea>
488
+ <div class="send-row">
489
+ <button class="send-btn" @click=${this._dispatchSteer}>Send</button>
490
+ </div>
491
+ </div>
492
+ `:t`<button class="steer-btn" @click=${()=>{this._steerMode=!0}}>Steer</button>`}
493
+ `}_renderModal(e){let n=e.output??e.error??``,r=e.output?`Full Output`:`Error Details`;return t`
494
+ <div class="modal-backdrop" @click=${this._closeFullOutput}>
495
+ <div class="modal-content" @click=${e=>e.stopPropagation()}>
496
+ <div class="modal-header">
497
+ <h4>${r} - ${e.id}</h4>
498
+ <div class="modal-actions">
499
+ <button class="copy-btn" @click=${this._copyFullOutput}>Copy</button>
500
+ <button class="modal-close-btn" @click=${this._closeFullOutput}>Close</button>
501
+ </div>
502
+ </div>
503
+ <div class="modal-body">
504
+ <pre>${n}</pre>
505
+ </div>
506
+ </div>
507
+ </div>
508
+ `}};l([c({attribute:!1})],x.prototype,`node`,void 0),l([c({attribute:!1})],x.prototype,`allNodes`,void 0),l([o()],x.prototype,`_showFullOutput`,void 0),l([o()],x.prototype,`_steerMode`,void 0),l([o()],x.prototype,`_steerText`,void 0),x=l([e(`ic-node-detail-panel`)],x);var S=28,C=4,w=80,T=20,E=2,D=200,O={running:`#06b6d4`,completed:`#22c55e`,failed:`#ef4444`,skipped:`#9ca3af`,pending:`#4b5563`,ready:`#a78bfa`},k=class extends r{constructor(...e){super(...e),this.nodes=[],this.executionOrder=[],this.elapsedMs=0,this.selectedNodeId=null}static{this.styles=[s,n`
556
509
  :host {
557
510
  display: block;
558
511
  height: 200px;
@@ -604,31 +557,58 @@ import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I
604
557
  stroke-width: 2;
605
558
  fill: none;
606
559
  }
607
- `];K([g({attribute:!1})],V.prototype,"nodes",2);K([g({attribute:!1})],V.prototype,"executionOrder",2);K([g({type:Number})],V.prototype,"elapsedMs",2);K([g()],V.prototype,"selectedNodeId",2);V=K([q("ic-execution-timeline")],V);var It=Object.defineProperty,Mt=Object.getOwnPropertyDescriptor,L=(t,e,s,r)=>{for(var i=r>1?void 0:r?Mt(e,s):e,o=t.length-1,a;o>=0;o--)(a=t[o])&&(i=(r?a(e,s,i):a(i))||i);return r&&i&&It(e,s,i),i};const z=160,R=120,pt=8,Ot=4,Ct=3,ut={pending:"#6b7280",ready:"#a78bfa",running:"#06b6d4",completed:"#22c55e",failed:"#ef4444",skipped:"#9ca3af"};let T=class extends G{constructor(){super(...arguments),this.nodes=[],this.viewport={x:0,y:0,scale:1},this.containerWidth=800,this.containerHeight=600,this._dragging=!1,this._dragStartMinimapX=0,this._dragStartMinimapY=0,this._dragStartVpX=0,this._dragStartVpY=0,this._onPointerDown=t=>{t.preventDefault(),t.currentTarget.setPointerCapture(t.pointerId),this._dragging=!0;const e=t.currentTarget.getBoundingClientRect();this._dragStartMinimapX=(t.clientX-e.left)/e.width*z,this._dragStartMinimapY=(t.clientY-e.top)/e.height*R,this._dragStartVpX=this.viewport.x,this._dragStartVpY=this.viewport.y},this._onPointerMove=t=>{if(!this._dragging)return;t.preventDefault();const e=t.currentTarget.getBoundingClientRect(),s=(t.clientX-e.left)/e.width*z,r=(t.clientY-e.top)/e.height*R,i=s-this._dragStartMinimapX,o=r-this._dragStartMinimapY,a=this._computeBounds(),p=this._computeScale(a.graphW,a.graphH),x=i/p,v=o/p,S=this._dragStartVpX-x*this.viewport.scale,m=this._dragStartVpY-v*this.viewport.scale;this.dispatchEvent(new CustomEvent("viewport-change",{bubbles:!0,composed:!0,detail:{x:S,y:m,scale:this.viewport.scale}}))},this._onPointerUp=t=>{this._dragging&&(this._dragging=!1,t.currentTarget.releasePointerCapture(t.pointerId))}}_computeBounds(){if(!this.nodes.length)return{minX:0,minY:0,maxX:400,maxY:300,graphW:400,graphH:300};let t=1/0,e=1/0,s=-1/0,r=-1/0;for(const o of this.nodes)t=Math.min(t,o.position.x),e=Math.min(e,o.position.y),s=Math.max(s,o.position.x+it),r=Math.max(r,o.position.y+at);const i=40;return t-=i,e-=i,s+=i,r+=i,{minX:t,minY:e,maxX:s,maxY:r,graphW:s-t,graphH:r-e}}_computeScale(t,e){const s=z-pt*2,r=R-pt*2;return Math.min(s/t,r/e,1)}render(){const t=this._computeBounds(),e=this._computeScale(t.graphW,t.graphH),s=t.graphW*e,r=t.graphH*e,i=(z-s)/2,o=(R-r)/2,a=this.nodes.map(f=>{const X=i+(f.position.x-t.minX)*e,U=o+(f.position.y-t.minY)*e,C=Math.max(it*e,Ot),w=Math.max(at*e,Ct),$=ut[f.status??"pending"]??ut.pending;return H`<rect x="${X}" y="${U}" width="${C}" height="${w}" fill="${$}" rx="1" />`}),p=this.viewport,x=-p.x/p.scale,v=-p.y/p.scale,S=this.containerWidth/p.scale,m=this.containerHeight/p.scale,I=i+(x-t.minX)*e,n=o+(v-t.minY)*e,_=S*e,y=m*e,N=_<z*.95||y<R*.95;return l`
608
- <svg
609
- viewBox="0 0 ${z} ${R}"
610
- @pointerdown=${this._onPointerDown}
611
- @pointermove=${this._onPointerMove}
612
- @pointerup=${this._onPointerUp}
613
- @pointercancel=${this._onPointerUp}
614
- >
615
- <!-- Node dots -->
616
- ${a}
560
+ `]}render(){if(!this.executionOrder.length)return t`<svg width="100%" height="100%"></svg>`;let e=new Map(this.nodes.map(e=>[e.id,e])),n=this.executionOrder.map(t=>e.get(t)).filter(e=>e!=null);if(!n.length)return t`<svg width="100%" height="100%"></svg>`;let r=n.filter(e=>e.startedAt!=null).map(e=>e.startedAt),a=r.length>0?Math.min(...r):0,o=Math.max(this.elapsedMs,1e3),s=T+n.length*(S+C)+C,c=Math.max(D,600),l=w+c+16,d=c/o,f=o/1e3,p;p=f<5?1:f<60?5:10;let m=[];for(let e=p;e*1e3<=o;e+=p)m.push(e);return t`
561
+ <svg width="${l}" height="${s}" viewBox="0 0 ${l} ${s}">
562
+ <!-- Time markers -->
563
+ ${m.map(e=>{let t=w+e*1e3*d;return i`
564
+ <line class="time-line" x1="${t}" y1="${T}" x2="${t}" y2="${s}" />
565
+ <text class="time-marker" x="${t}" y="2">${e}s</text>
566
+ `})}
617
567
 
618
- <!-- Viewport rectangle -->
619
- ${N?H`
620
- <rect class="viewport-fill" x="${I}" y="${n}" width="${_}" height="${y}" />
621
- <rect
622
- class="viewport-rect ${this._dragging?"dragging":""}"
623
- x="${I}" y="${n}" width="${_}" height="${y}"
624
- />
625
- `:h}
568
+ <!-- Rows -->
569
+ ${n.map((e,t)=>{let n=T+t*(S+C)+C,r=e.id===this.selectedNodeId,s=e.retryAttempt!=null&&e.retryAttempt>0,c=e.id.length>10?e.id.slice(0,9)+`…`:e.id,f=s?`${c} (R${e.retryAttempt})`:c,p=0,m=0,h=O[e.status]??`#4b5563`,g=1,_=!1;if(e.status===`running`&&e.startedAt!=null)p=(e.startedAt-a)*d,m=Math.max((o-(e.startedAt-a))*d,4),g=.8,_=!0;else if((e.status===`completed`||e.status===`failed`)&&e.startedAt!=null){p=(e.startedAt-a)*d;let t=e.completedAt??a+o;m=Math.max((t-e.startedAt)*d,4),_=!0}else e.status===`skipped`&&(p=0,m=8,h=O.skipped,g=.5,_=!0);return i`
570
+ <!-- Alternating row background -->
571
+ ${t%2==1?i`<rect class="row-bg" x="0" y="${n}" width="${l}" height="${S}" />`:u}
572
+
573
+ <!-- Node label -->
574
+ <text class="label-text" x="4" y="${n+S/2}">
575
+ ${f}
576
+ </text>
577
+
578
+ <!-- Bar -->
579
+ ${_?i`
580
+ <rect
581
+ class="bar"
582
+ x="${w+p}"
583
+ y="${n+4}"
584
+ width="${m}"
585
+ height="${S-8}"
586
+ rx="${E}"
587
+ ry="${E}"
588
+ fill="${h}"
589
+ opacity="${g}"
590
+ stroke="${s?`#f97316`:`none`}"
591
+ stroke-width="${s?`1.5`:`0`}"
592
+ data-node-id="${e.id}"
593
+ @click=${()=>this._onBarClick(e.id)}
594
+ />
595
+ ${r?i`<rect
596
+ class="selected-highlight"
597
+ x="${w+p-1}"
598
+ y="${n+3}"
599
+ width="${m+2}"
600
+ height="${S-6}"
601
+ rx="${E+1}"
602
+ ry="${E+1}"
603
+ />`:u}
604
+ `:u}
605
+ `})}
626
606
  </svg>
627
- `}};T.styles=[F,B`
607
+ `}_onBarClick(e){this.dispatchEvent(new CustomEvent(`node-inspect`,{bubbles:!0,composed:!0,detail:{nodeId:e}}))}};l([c({attribute:!1})],k.prototype,`nodes`,void 0),l([c({attribute:!1})],k.prototype,`executionOrder`,void 0),l([c({type:Number})],k.prototype,`elapsedMs`,void 0),l([c()],k.prototype,`selectedNodeId`,void 0),k=l([e(`ic-execution-timeline`)],k);var A=160,j=120,M=8,N=4,P=3,F={pending:`#6b7280`,ready:`#a78bfa`,running:`#06b6d4`,completed:`#22c55e`,failed:`#ef4444`,skipped:`#9ca3af`},I=class extends r{constructor(...e){super(...e),this.nodes=[],this.viewport={x:0,y:0,scale:1},this.containerWidth=800,this.containerHeight=600,this._dragging=!1,this._dragStartMinimapX=0,this._dragStartMinimapY=0,this._dragStartVpX=0,this._dragStartVpY=0,this._onPointerDown=e=>{e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),this._dragging=!0;let t=e.currentTarget.getBoundingClientRect();this._dragStartMinimapX=(e.clientX-t.left)/t.width*A,this._dragStartMinimapY=(e.clientY-t.top)/t.height*j,this._dragStartVpX=this.viewport.x,this._dragStartVpY=this.viewport.y},this._onPointerMove=e=>{if(!this._dragging)return;e.preventDefault();let t=e.currentTarget.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*A,r=(e.clientY-t.top)/t.height*j,i=n-this._dragStartMinimapX,a=r-this._dragStartMinimapY,o=this._computeBounds(),s=this._computeScale(o.graphW,o.graphH),c=i/s,l=a/s,u=this._dragStartVpX-c*this.viewport.scale,d=this._dragStartVpY-l*this.viewport.scale;this.dispatchEvent(new CustomEvent(`viewport-change`,{bubbles:!0,composed:!0,detail:{x:u,y:d,scale:this.viewport.scale}}))},this._onPointerUp=e=>{this._dragging&&(this._dragging=!1,e.currentTarget.releasePointerCapture(e.pointerId))}}static{this.styles=[s,n`
628
608
  :host {
629
609
  display: block;
630
- width: ${z}px;
631
- height: ${R}px;
610
+ width: ${A}px;
611
+ height: ${j}px;
632
612
  background: var(--ic-surface, #181825);
633
613
  border: 1px solid var(--ic-border);
634
614
  border-radius: var(--ic-radius-md, 8px);
@@ -661,115 +641,27 @@ import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I
661
641
  fill: var(--ic-accent, #3b82f6);
662
642
  fill-opacity: 0.05;
663
643
  }
664
- `];L([g({attribute:!1})],T.prototype,"nodes",2);L([g({attribute:!1})],T.prototype,"viewport",2);L([g({type:Number})],T.prototype,"containerWidth",2);L([g({type:Number})],T.prototype,"containerHeight",2);L([P()],T.prototype,"_dragging",2);T=L([q("ic-graph-minimap")],T);var Nt=Object.defineProperty,At=Object.getOwnPropertyDescriptor,E=(t,e,s,r)=>{for(var i=r>1?void 0:r?At(e,s):e,o=t.length-1,a;o>=0;o--)(a=t[o])&&(i=(r?a(e,s,i):a(i))||i);return r&&i&&Nt(e,s,i),i};let O=class extends G{constructor(){super(...arguments),this.rpcClient=null,this.graphId="",this.eventDispatcher=null,this._snapshot=null,this._viewport={x:0,y:0,scale:1},this._showCancelConfirm=!1,this._liveAnnouncement="",this._monitorState=null,this._stateUnsub=null,this._sseUnsubs=[],this._previousNodeStatuses=new Map,this._containerWidth=800,this._containerHeight=600,this._resizeObserver=null}connectedCallback(){super.connectedCallback(),this._monitorState=vt(),this._stateUnsub=this._monitorState.subscribe(()=>{const t=this._monitorState.getSnapshot();this._snapshot=t,this._announceNodeChanges(t.nodes)}),this._initMonitor()}firstUpdated(){const t=this.renderRoot.querySelector(".canvas-area");t&&(this._resizeObserver=new ResizeObserver(e=>{for(const s of e)this._containerWidth=s.contentRect.width,this._containerHeight=s.contentRect.height}),this._resizeObserver.observe(t))}disconnectedCallback(){for(const t of this._sseUnsubs)t();this._sseUnsubs=[],this._monitorState?.destroy(),this._monitorState=null,this._stateUnsub?.(),this._stateUnsub=null,this._resizeObserver?.disconnect(),this._resizeObserver=null,this._previousNodeStatuses.clear(),super.disconnectedCallback()}async _initMonitor(){if(!this.rpcClient||!this.graphId||!this._monitorState)return;let t=[],e=[];try{const s=await this.rpcClient.call("graph.load",{id:this.graphId});if(s?.nodes?.length){const r=s.nodes.map(a=>({id:a.id??a.nodeId,task:a.task??"",agentId:a.agentId??a.agent,dependsOn:a.dependsOn??[],maxSteps:a.maxSteps,timeoutMs:a.timeoutMs,barrierMode:a.barrierMode,modelId:a.modelId??a.model,position:a.position??{x:0,y:0}})),i=s.edges&&s.edges.length>0?s.edges:r.flatMap(a=>a.dependsOn.map(p=>({id:`${p}->${a.id}`,source:p,target:a.id})));if(r.length>0&&r.every(a=>a.position.x===0&&a.position.y===0)){const a=nt(r,i);for(const p of r){const x=a.positions.get(p.id);x&&(p.position=x)}}t=r,e=i}}catch{}if(t.length===0)try{const s=await this.rpcClient.call("graph.status",{graphId:this.graphId}),r=s.executionOrder.map(a=>({id:a,task:a,dependsOn:[],position:{x:0,y:0}})),i=[];if(r.length>1)for(let a=1;a<s.executionOrder.length;a++)i.push({id:`${s.executionOrder[a-1]}->${s.executionOrder[a]}`,source:s.executionOrder[a-1],target:s.executionOrder[a]});const o=nt(r,i);t=r.map(a=>{const p=o.positions.get(a.id);return p?{...a,position:p}:a}),e=i}catch{t=[],e=[]}t.length>0&&(this._monitorState.startPolling(this.rpcClient,this.graphId,t,e),setTimeout(()=>{t.length>0&&(this._viewport=mt(t,this._containerWidth||800,this._containerHeight||600))},200),this._wireSSE())}_wireSSE(){for(const r of this._sseUnsubs)r();if(this._sseUnsubs=[],!this.eventDispatcher||!this._monitorState)return;const t=["graph:started","graph:node_updated","graph:completed"];for(const r of t)this._sseUnsubs.push(this.eventDispatcher.addEventListener(r,i=>{i.graphId===this.graphId&&this._monitorState?.applyEvent(r,i)}));this.eventDispatcher.connected&&this._monitorState.suspendPolling();let e=this.eventDispatcher.connected;const s=setInterval(()=>{if(!this.eventDispatcher||!this._monitorState)return;const r=this.eventDispatcher.connected;r&&!e?(this._monitorState.resumePolling(),setTimeout(()=>{this._monitorState?.suspendPolling()},500)):!r&&e&&this._monitorState.resumePolling(),e=r},3e3);this._sseUnsubs.push(()=>clearInterval(s))}get _breadcrumbs(){return[{label:"Pipelines",route:"pipelines"},{label:this.graphId||"Monitor"}]}get _nodeStatuses(){const t=new Map;if(!this._snapshot)return t;for(const e of this._snapshot.nodes)t.set(e.id,e.status);return t}get _edgeStatuses(){const t=new Map;if(!this._snapshot)return t;const e=this._nodeStatuses;for(const s of this._snapshot.edges){const r=e.get(s.source)??"",i=e.get(s.target)??"";r==="completed"&&i==="completed"?t.set(s.id,"completed"):r==="running"||i==="running"?t.set(s.id,"running"):r==="failed"||i==="failed"?t.set(s.id,"failed"):(r==="skipped"||i==="skipped")&&t.set(s.id,"skipped")}return t}get _selectedNode(){return this._snapshot?.selectedNodeId?this._snapshot.nodes.find(t=>t.id===this._snapshot.selectedNodeId)??null:null}get _canvasNodes(){return this._snapshot?this._snapshot.nodes.map(t=>({id:t.id,task:t.task,agentId:t.agentId,dependsOn:t.dependsOn,position:t.position})):[]}_announceNodeChanges(t){const e=[];for(const s of t)if(this._previousNodeStatuses.get(s.id)!==s.status)switch(s.status){case"running":e.push(`Node ${s.id} started executing`);break;case"completed":e.push(`Node ${s.id} completed successfully`);break;case"failed":e.push(`Node ${s.id} failed`);break}this._previousNodeStatuses.clear();for(const s of t)this._previousNodeStatuses.set(s.id,s.status);e.length>0&&(this._liveAnnouncement=e.join(". "))}_onNodeInspect(t){this._monitorState?.selectNode(t.detail.nodeId)}_onCanvasClick(){this._monitorState?.selectNode(null)}_onViewportChange(t){this._viewport=t.detail}_onMinimapViewportChange(t){this._viewport=t.detail}_onCancelRequest(){this._showCancelConfirm=!0}async _onCancelConfirm(){if(this._showCancelConfirm=!1,!!this.rpcClient)try{await this.rpcClient.call("graph.cancel",{graphId:this.graphId}),Q.show("Pipeline cancelled","warning")}catch(t){Q.show(`Cancel failed: ${t instanceof Error?t.message:String(t)}`,"error")}}async _onSteer(t){if(this.rpcClient)try{await this.rpcClient.call("subagent.steer",{target:t.detail.runId,message:t.detail.message}),Q.show("Steer message sent","success")}catch(e){Q.show(`Steer failed: ${e instanceof Error?e.message:String(e)}`,"error")}}_onDetailClose(){this._monitorState?.selectNode(null)}_onViewOutputs(){this.graphId&&(window.location.hash=`#/pipelines/history/${this.graphId}`)}render(){const t=this._snapshot;return l`
665
- <ic-breadcrumb .items=${this._breadcrumbs}
666
- @navigate=${e=>this.dispatchEvent(new CustomEvent("navigate",{detail:e.detail,bubbles:!0,composed:!0}))}
667
- ></ic-breadcrumb>
668
-
669
- ${this._renderMobileSummary(t)}
670
-
671
- <div class="monitor-container">
672
- ${t?.error&&!t.loading?l`
673
- <div class="error-banner">
674
- <span>${t.error}</span>
675
- <button @click=${()=>this._initMonitor()}>Retry</button>
676
- </div>
677
- `:h}
678
-
679
- ${!t||t.loading?l`<div class="loading-container">Loading execution data...</div>`:l`
680
- <ic-monitor-status-bar
681
- .graphStatus=${t.graphStatus}
682
- ?isTerminal=${t.isTerminal}
683
- .elapsedMs=${t.elapsedMs}
684
- .stats=${t.stats}
685
- @cancel=${this._onCancelRequest}
686
- @view-outputs=${this._onViewOutputs}
687
- ></ic-monitor-status-bar>
688
-
689
- <div class="monitor-body">
690
- <div class="canvas-area">
691
- <ic-graph-canvas
692
- read-only
693
- .viewport=${this._viewport}
694
- .nodes=${this._canvasNodes}
695
- .edges=${t.edges}
696
- .selectedNodeIds=${new Set}
697
- .selectedEdgeId=${null}
698
- .nodeStatuses=${this._nodeStatuses}
699
- .edgeStatuses=${this._edgeStatuses}
700
- .highlightNodeIds=${[]}
701
- @viewport-change=${this._onViewportChange}
702
- @node-inspect=${this._onNodeInspect}
703
- @canvas-click=${this._onCanvasClick}
704
- ></ic-graph-canvas>
705
-
706
- <div class="minimap-container">
707
- <ic-graph-minimap
708
- .nodes=${this._canvasNodes.map(e=>({id:e.id,position:e.position,status:this._nodeStatuses.get(e.id)}))}
709
- .viewport=${this._viewport}
710
- .containerWidth=${this._containerWidth}
711
- .containerHeight=${this._containerHeight}
712
- @viewport-change=${this._onMinimapViewportChange}
713
- ></ic-graph-minimap>
714
- </div>
715
- </div>
716
-
717
- ${this._selectedNode?l`
718
- <ic-node-detail-panel
719
- .node=${this._selectedNode}
720
- .allNodes=${t.nodes}
721
- @close=${this._onDetailClose}
722
- @steer=${this._onSteer}
723
- ></ic-node-detail-panel>
724
- `:h}
725
- </div>
726
-
727
- <ic-execution-timeline
728
- .nodes=${t.nodes}
729
- .executionOrder=${t.executionOrder}
730
- .elapsedMs=${t.elapsedMs}
731
- .selectedNodeId=${t.selectedNodeId}
732
- @node-inspect=${this._onNodeInspect}
733
- ></ic-execution-timeline>
734
- `}
735
- </div>
736
-
737
- <!-- A11Y-03: ARIA live region for execution event announcements -->
738
- <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
739
- ${this._liveAnnouncement}
740
- </div>
741
-
742
- <!-- Cancel confirmation dialog -->
743
- <ic-confirm-dialog
744
- ?open=${this._showCancelConfirm}
745
- title="Cancel Pipeline"
746
- message="Are you sure you want to cancel this pipeline execution? Running nodes will be terminated."
747
- variant="danger"
748
- confirmLabel="Cancel Pipeline"
749
- @confirm=${this._onCancelConfirm}
750
- @cancel=${()=>{this._showCancelConfirm=!1}}
751
- ></ic-confirm-dialog>
644
+ `]}_computeBounds(){if(!this.nodes.length)return{minX:0,minY:0,maxX:400,maxY:300,graphW:400,graphH:300};let e=1/0,t=1/0,n=-1/0,r=-1/0;for(let i of this.nodes)e=Math.min(e,i.position.x),t=Math.min(t,i.position.y),n=Math.max(n,i.position.x+200),r=Math.max(r,i.position.y+80);return e-=40,t-=40,n+=40,r+=40,{minX:e,minY:t,maxX:n,maxY:r,graphW:n-e,graphH:r-t}}_computeScale(e,t){let n=A-M*2,r=j-M*2;return Math.min(n/e,r/t,1)}render(){let e=this._computeBounds(),n=this._computeScale(e.graphW,e.graphH),r=e.graphW*n,a=e.graphH*n,o=(A-r)/2,s=(j-a)/2,c=this.nodes.map(t=>i`<rect x="${o+(t.position.x-e.minX)*n}" y="${s+(t.position.y-e.minY)*n}" width="${Math.max(200*n,N)}" height="${Math.max(80*n,P)}" fill="${F[t.status??`pending`]??F.pending}" rx="1" />`),l=this.viewport,d=-l.x/l.scale,f=-l.y/l.scale,p=this.containerWidth/l.scale,m=this.containerHeight/l.scale,h=o+(d-e.minX)*n,g=s+(f-e.minY)*n,_=p*n,v=m*n,y=_<A*.95||v<j*.95;return t`
645
+ <svg
646
+ viewBox="0 0 ${A} ${j}"
647
+ @pointerdown=${this._onPointerDown}
648
+ @pointermove=${this._onPointerMove}
649
+ @pointerup=${this._onPointerUp}
650
+ @pointercancel=${this._onPointerUp}
651
+ >
652
+ <!-- Node dots -->
653
+ ${c}
752
654
 
753
- <!-- View Outputs navigates to history detail page -->
754
- `}_renderMobileSummary(t){if(!t)return l`
755
- <div class="mobile-summary">
756
- <h2>Pipeline Monitor</h2>
757
- <p>Loading...</p>
758
- </div>
759
- `;const e={pending:"#6b7280",ready:"#a78bfa",running:"#06b6d4",completed:"#22c55e",failed:"#ef4444",skipped:"#9ca3af"};return l`
760
- <div class="mobile-summary">
761
- <h2>Pipeline: ${t.graphId}</h2>
762
- <p>Status: ${t.graphStatus} | ${t.stats.completed}/${t.stats.total} complete</p>
763
- <div class="node-list">
764
- ${t.nodes.map(s=>l`
765
- <div class="node-item">
766
- <span class="status-dot" style="background: ${e[s.status]??"#6b7280"}"></span>
767
- <span>${s.id}: ${s.status}</span>
768
- </div>
769
- `)}
770
- </div>
771
- </div>
772
- `}};O.styles=[F,ht,B`
655
+ <!-- Viewport rectangle -->
656
+ ${y?i`
657
+ <rect class="viewport-fill" x="${h}" y="${g}" width="${_}" height="${v}" />
658
+ <rect
659
+ class="viewport-rect ${this._dragging?`dragging`:``}"
660
+ x="${h}" y="${g}" width="${_}" height="${v}"
661
+ />
662
+ `:u}
663
+ </svg>
664
+ `}};l([c({attribute:!1})],I.prototype,`nodes`,void 0),l([c({attribute:!1})],I.prototype,`viewport`,void 0),l([c({type:Number})],I.prototype,`containerWidth`,void 0),l([c({type:Number})],I.prototype,`containerHeight`,void 0),l([o()],I.prototype,`_dragging`,void 0),I=l([e(`ic-graph-minimap`)],I);var L=class extends r{constructor(...e){super(...e),this.rpcClient=null,this.graphId=``,this.eventDispatcher=null,this._snapshot=null,this._viewport={x:0,y:0,scale:1},this._showCancelConfirm=!1,this._liveAnnouncement=``,this._monitorState=null,this._stateUnsub=null,this._sseUnsubs=[],this._previousNodeStatuses=new Map,this._containerWidth=800,this._containerHeight=600,this._resizeObserver=null}static{this.styles=[s,a,n`
773
665
  :host { display: block; height: 100%; }
774
666
 
775
667
  .monitor-container {
@@ -969,4 +861,112 @@ import{s as F,i as B,n as g,a as G,b as l,t as q,f as ht,r as P,A as h,w as H,I
969
861
  flex-shrink: 0;
970
862
  }
971
863
  }
972
- `];E([g({attribute:!1})],O.prototype,"rpcClient",2);E([g()],O.prototype,"graphId",2);E([g({attribute:!1})],O.prototype,"eventDispatcher",2);E([P()],O.prototype,"_snapshot",2);E([P()],O.prototype,"_viewport",2);E([P()],O.prototype,"_showCancelConfirm",2);E([P()],O.prototype,"_liveAnnouncement",2);O=E([q("ic-pipeline-monitor")],O);export{O as IcPipelineMonitor};
864
+ `]}connectedCallback(){super.connectedCallback(),this._monitorState=g(),this._stateUnsub=this._monitorState.subscribe(()=>{let e=this._monitorState.getSnapshot();this._snapshot=e,this._announceNodeChanges(e.nodes)}),this._initMonitor()}firstUpdated(){let e=this.renderRoot.querySelector(`.canvas-area`);e&&(this._resizeObserver=new ResizeObserver(e=>{for(let t of e)this._containerWidth=t.contentRect.width,this._containerHeight=t.contentRect.height}),this._resizeObserver.observe(e))}disconnectedCallback(){for(let e of this._sseUnsubs)e();this._sseUnsubs=[],this._monitorState?.destroy(),this._monitorState=null,this._stateUnsub?.(),this._stateUnsub=null,this._resizeObserver?.disconnect(),this._resizeObserver=null,this._previousNodeStatuses.clear(),super.disconnectedCallback()}async _initMonitor(){if(!this.rpcClient||!this.graphId||!this._monitorState)return;let e=[],t=[];try{let n=await this.rpcClient.call(`graph.load`,{id:this.graphId});if(n?.nodes?.length){let r=n.nodes.map(e=>({id:e.id??e.nodeId,task:e.task??``,agentId:e.agentId??e.agent,dependsOn:e.dependsOn??[],maxSteps:e.maxSteps,timeoutMs:e.timeoutMs,barrierMode:e.barrierMode,modelId:e.modelId??e.model,position:e.position??{x:0,y:0}})),i=n.edges&&n.edges.length>0?n.edges:r.flatMap(e=>e.dependsOn.map(t=>({id:`${t}->${e.id}`,source:t,target:e.id})));if(r.length>0&&r.every(e=>e.position.x===0&&e.position.y===0)){let e=p(r,i);for(let t of r){let n=e.positions.get(t.id);n&&(t.position=n)}}e=r,t=i}}catch{}if(e.length===0)try{let n=await this.rpcClient.call(`graph.status`,{graphId:this.graphId}),r=n.executionOrder.map(e=>({id:e,task:e,dependsOn:[],position:{x:0,y:0}})),i=[];if(r.length>1)for(let e=1;e<n.executionOrder.length;e++)i.push({id:`${n.executionOrder[e-1]}->${n.executionOrder[e]}`,source:n.executionOrder[e-1],target:n.executionOrder[e]});let a=p(r,i);e=r.map(e=>{let t=a.positions.get(e.id);return t?{...e,position:t}:e}),t=i}catch{e=[],t=[]}e.length>0&&(this._monitorState.startPolling(this.rpcClient,this.graphId,e,t),setTimeout(()=>{e.length>0&&(this._viewport=f(e,this._containerWidth||800,this._containerHeight||600))},200),this._wireSSE())}_wireSSE(){for(let e of this._sseUnsubs)e();if(this._sseUnsubs=[],!this.eventDispatcher||!this._monitorState)return;for(let e of[`graph:started`,`graph:node_updated`,`graph:completed`])this._sseUnsubs.push(this.eventDispatcher.addEventListener(e,t=>{t.graphId===this.graphId&&this._monitorState?.applyEvent(e,t)}));this.eventDispatcher.connected&&this._monitorState.suspendPolling();let e=this.eventDispatcher.connected,t=setInterval(()=>{if(!this.eventDispatcher||!this._monitorState)return;let t=this.eventDispatcher.connected;t&&!e?(this._monitorState.resumePolling(),setTimeout(()=>{this._monitorState?.suspendPolling()},500)):!t&&e&&this._monitorState.resumePolling(),e=t},3e3);this._sseUnsubs.push(()=>clearInterval(t))}get _breadcrumbs(){return[{label:`Pipelines`,route:`pipelines`},{label:this.graphId||`Monitor`}]}get _nodeStatuses(){let e=new Map;if(!this._snapshot)return e;for(let t of this._snapshot.nodes)e.set(t.id,t.status);return e}get _edgeStatuses(){let e=new Map;if(!this._snapshot)return e;let t=this._nodeStatuses;for(let n of this._snapshot.edges){let r=t.get(n.source)??``,i=t.get(n.target)??``;r===`completed`&&i===`completed`?e.set(n.id,`completed`):r===`running`||i===`running`?e.set(n.id,`running`):r===`failed`||i===`failed`?e.set(n.id,`failed`):(r===`skipped`||i===`skipped`)&&e.set(n.id,`skipped`)}return e}get _selectedNode(){return this._snapshot?.selectedNodeId?this._snapshot.nodes.find(e=>e.id===this._snapshot.selectedNodeId)??null:null}get _canvasNodes(){return this._snapshot?this._snapshot.nodes.map(e=>({id:e.id,task:e.task,agentId:e.agentId,dependsOn:e.dependsOn,position:e.position})):[]}_announceNodeChanges(e){let t=[];for(let n of e)if(this._previousNodeStatuses.get(n.id)!==n.status)switch(n.status){case`running`:t.push(`Node ${n.id} started executing`);break;case`completed`:t.push(`Node ${n.id} completed successfully`);break;case`failed`:t.push(`Node ${n.id} failed`);break}this._previousNodeStatuses.clear();for(let t of e)this._previousNodeStatuses.set(t.id,t.status);t.length>0&&(this._liveAnnouncement=t.join(`. `))}_onNodeInspect(e){this._monitorState?.selectNode(e.detail.nodeId)}_onCanvasClick(){this._monitorState?.selectNode(null)}_onViewportChange(e){this._viewport=e.detail}_onMinimapViewportChange(e){this._viewport=e.detail}_onCancelRequest(){this._showCancelConfirm=!0}async _onCancelConfirm(){if(this._showCancelConfirm=!1,this.rpcClient)try{await this.rpcClient.call(`graph.cancel`,{graphId:this.graphId}),d.show(`Pipeline cancelled`,`warning`)}catch(e){d.show(`Cancel failed: ${e instanceof Error?e.message:String(e)}`,`error`)}}async _onSteer(e){if(this.rpcClient)try{await this.rpcClient.call(`subagent.steer`,{target:e.detail.runId,message:e.detail.message}),d.show(`Steer message sent`,`success`)}catch(e){d.show(`Steer failed: ${e instanceof Error?e.message:String(e)}`,`error`)}}_onDetailClose(){this._monitorState?.selectNode(null)}_onViewOutputs(){this.graphId&&(window.location.hash=`#/pipelines/history/${this.graphId}`)}render(){let e=this._snapshot;return t`
865
+ <ic-breadcrumb .items=${this._breadcrumbs}
866
+ @navigate=${e=>this.dispatchEvent(new CustomEvent(`navigate`,{detail:e.detail,bubbles:!0,composed:!0}))}
867
+ ></ic-breadcrumb>
868
+
869
+ ${this._renderMobileSummary(e)}
870
+
871
+ <div class="monitor-container">
872
+ ${e?.error&&!e.loading?t`
873
+ <div class="error-banner">
874
+ <span>${e.error}</span>
875
+ <button @click=${()=>this._initMonitor()}>Retry</button>
876
+ </div>
877
+ `:u}
878
+
879
+ ${!e||e.loading?t`<div class="loading-container">Loading execution data...</div>`:t`
880
+ <ic-monitor-status-bar
881
+ .graphStatus=${e.graphStatus}
882
+ ?isTerminal=${e.isTerminal}
883
+ .elapsedMs=${e.elapsedMs}
884
+ .stats=${e.stats}
885
+ @cancel=${this._onCancelRequest}
886
+ @view-outputs=${this._onViewOutputs}
887
+ ></ic-monitor-status-bar>
888
+
889
+ <div class="monitor-body">
890
+ <div class="canvas-area">
891
+ <ic-graph-canvas
892
+ read-only
893
+ .viewport=${this._viewport}
894
+ .nodes=${this._canvasNodes}
895
+ .edges=${e.edges}
896
+ .selectedNodeIds=${new Set}
897
+ .selectedEdgeId=${null}
898
+ .nodeStatuses=${this._nodeStatuses}
899
+ .edgeStatuses=${this._edgeStatuses}
900
+ .highlightNodeIds=${[]}
901
+ @viewport-change=${this._onViewportChange}
902
+ @node-inspect=${this._onNodeInspect}
903
+ @canvas-click=${this._onCanvasClick}
904
+ ></ic-graph-canvas>
905
+
906
+ <div class="minimap-container">
907
+ <ic-graph-minimap
908
+ .nodes=${this._canvasNodes.map(e=>({id:e.id,position:e.position,status:this._nodeStatuses.get(e.id)}))}
909
+ .viewport=${this._viewport}
910
+ .containerWidth=${this._containerWidth}
911
+ .containerHeight=${this._containerHeight}
912
+ @viewport-change=${this._onMinimapViewportChange}
913
+ ></ic-graph-minimap>
914
+ </div>
915
+ </div>
916
+
917
+ ${this._selectedNode?t`
918
+ <ic-node-detail-panel
919
+ .node=${this._selectedNode}
920
+ .allNodes=${e.nodes}
921
+ @close=${this._onDetailClose}
922
+ @steer=${this._onSteer}
923
+ ></ic-node-detail-panel>
924
+ `:u}
925
+ </div>
926
+
927
+ <ic-execution-timeline
928
+ .nodes=${e.nodes}
929
+ .executionOrder=${e.executionOrder}
930
+ .elapsedMs=${e.elapsedMs}
931
+ .selectedNodeId=${e.selectedNodeId}
932
+ @node-inspect=${this._onNodeInspect}
933
+ ></ic-execution-timeline>
934
+ `}
935
+ </div>
936
+
937
+ <!-- A11Y-03: ARIA live region for execution event announcements -->
938
+ <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
939
+ ${this._liveAnnouncement}
940
+ </div>
941
+
942
+ <!-- Cancel confirmation dialog -->
943
+ <ic-confirm-dialog
944
+ ?open=${this._showCancelConfirm}
945
+ title="Cancel Pipeline"
946
+ message="Are you sure you want to cancel this pipeline execution? Running nodes will be terminated."
947
+ variant="danger"
948
+ confirmLabel="Cancel Pipeline"
949
+ @confirm=${this._onCancelConfirm}
950
+ @cancel=${()=>{this._showCancelConfirm=!1}}
951
+ ></ic-confirm-dialog>
952
+
953
+ <!-- View Outputs navigates to history detail page -->
954
+ `}_renderMobileSummary(e){if(!e)return t`
955
+ <div class="mobile-summary">
956
+ <h2>Pipeline Monitor</h2>
957
+ <p>Loading...</p>
958
+ </div>
959
+ `;let n={pending:`#6b7280`,ready:`#a78bfa`,running:`#06b6d4`,completed:`#22c55e`,failed:`#ef4444`,skipped:`#9ca3af`};return t`
960
+ <div class="mobile-summary">
961
+ <h2>Pipeline: ${e.graphId}</h2>
962
+ <p>Status: ${e.graphStatus} | ${e.stats.completed}/${e.stats.total} complete</p>
963
+ <div class="node-list">
964
+ ${e.nodes.map(e=>t`
965
+ <div class="node-item">
966
+ <span class="status-dot" style="background: ${n[e.status]??`#6b7280`}"></span>
967
+ <span>${e.id}: ${e.status}</span>
968
+ </div>
969
+ `)}
970
+ </div>
971
+ </div>
972
+ `}};l([c({attribute:!1})],L.prototype,`rpcClient`,void 0),l([c()],L.prototype,`graphId`,void 0),l([c({attribute:!1})],L.prototype,`eventDispatcher`,void 0),l([o()],L.prototype,`_snapshot`,void 0),l([o()],L.prototype,`_viewport`,void 0),l([o()],L.prototype,`_showCancelConfirm`,void 0),l([o()],L.prototype,`_liveAnnouncement`,void 0),L=l([e(`ic-pipeline-monitor`)],L);export{L as IcPipelineMonitor};