comisai 1.0.16 → 1.0.18

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 (90) 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/dist/wizard/non-interactive.js +1 -0
  4. package/node_modules/@comis/cli/dist/wizard/steps/01-detect-existing.js +2 -0
  5. package/node_modules/@comis/cli/dist/wizard/steps/07-gateway.js +9 -0
  6. package/node_modules/@comis/cli/dist/wizard/steps/10-write-config.js +2 -0
  7. package/node_modules/@comis/cli/dist/wizard/steps/12-finish.js +5 -2
  8. package/node_modules/@comis/cli/dist/wizard/types.d.ts +1 -0
  9. package/node_modules/@comis/cli/package.json +1 -1
  10. package/node_modules/@comis/core/dist/config/schema-gateway.d.ts +17 -2
  11. package/node_modules/@comis/core/dist/config/schema-gateway.js +11 -0
  12. package/node_modules/@comis/core/dist/config/schema.d.ts +60 -57
  13. package/node_modules/@comis/core/package.json +1 -1
  14. package/node_modules/@comis/daemon/dist/wiring/setup-gateway.js +34 -6
  15. package/node_modules/@comis/daemon/package.json +1 -1
  16. package/node_modules/@comis/gateway/package.json +1 -1
  17. package/node_modules/@comis/infra/package.json +1 -1
  18. package/node_modules/@comis/memory/package.json +1 -1
  19. package/node_modules/@comis/scheduler/package.json +1 -1
  20. package/node_modules/@comis/shared/package.json +1 -1
  21. package/node_modules/@comis/skills/package.json +1 -1
  22. package/node_modules/@comis/web/dist/android-chrome-192x192.png +0 -0
  23. package/node_modules/@comis/web/dist/android-chrome-512x512.png +0 -0
  24. package/node_modules/@comis/web/dist/apple-touch-icon.png +0 -0
  25. package/node_modules/@comis/web/dist/assets/agent-detail-BG9MGWWj.js +615 -0
  26. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +2173 -0
  27. package/node_modules/@comis/web/dist/assets/agent-list-LHCJ4rw2.js +504 -0
  28. package/node_modules/@comis/web/dist/assets/approvals-q9VH_IKr.js +54 -0
  29. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +375 -0
  30. package/node_modules/@comis/web/dist/assets/channel-detail-CaInesJM.js +681 -0
  31. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +323 -0
  32. package/node_modules/@comis/web/dist/assets/chat-console-CNmzl0JW.js +943 -0
  33. package/node_modules/@comis/web/dist/assets/config-editor-DX4ITw6y.js +1374 -0
  34. package/node_modules/@comis/web/dist/assets/context-dag-browser-BwiaF5tf.js +393 -0
  35. package/node_modules/@comis/web/dist/assets/context-engine-BZ5Am6hA.js +393 -0
  36. package/node_modules/@comis/web/dist/assets/delivery-view-OfBZof-m.js +392 -0
  37. package/node_modules/@comis/web/dist/assets/diagnostics-view-YFwCxgr2.js +231 -0
  38. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +1 -0
  39. package/node_modules/@comis/web/dist/assets/extract-variables-BM5qyK-s.js +149 -0
  40. package/node_modules/@comis/web/dist/assets/ic-array-editor-B7m6x7-S.js +118 -0
  41. package/node_modules/@comis/web/dist/assets/ic-breadcrumb-CUMpp3BL.js +75 -0
  42. package/node_modules/@comis/web/dist/assets/ic-budget-segment-bar-BtJ6x5mN.js +64 -0
  43. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +352 -0
  44. package/node_modules/@comis/web/dist/assets/ic-confirm-dialog-CCDbB04e.js +110 -0
  45. package/node_modules/@comis/web/dist/assets/ic-connection-dot-CnT1b8xr.js +54 -0
  46. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +277 -0
  47. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +67 -0
  48. package/node_modules/@comis/web/dist/assets/ic-detail-panel-BF83r-if.js +116 -0
  49. package/node_modules/@comis/web/dist/assets/ic-empty-state-60l2ePhd.js +52 -0
  50. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +359 -0
  51. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +33 -0
  52. package/node_modules/@comis/web/dist/assets/ic-layer-waterfall-COvEYMg5.js +69 -0
  53. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +12 -0
  54. package/node_modules/@comis/web/dist/assets/ic-search-input-CSOxY9g7.js +92 -0
  55. package/node_modules/@comis/web/dist/assets/ic-select-Ce-Raudx.js +127 -0
  56. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +95 -0
  57. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +33 -0
  58. package/node_modules/@comis/web/dist/assets/ic-time-range-picker-CypCT68y.js +93 -0
  59. package/node_modules/@comis/web/dist/assets/ic-tool-call-7MaXSsCW.js +146 -0
  60. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +2830 -0
  61. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +1 -0
  62. package/node_modules/@comis/web/dist/assets/mcp-management-BNZPnpDn.js +582 -0
  63. package/node_modules/@comis/web/dist/assets/media-config-BBvTYxOX.js +314 -0
  64. package/node_modules/@comis/web/dist/assets/media-test-BkK3RCRK.js +496 -0
  65. package/node_modules/@comis/web/dist/assets/memory-inspector-1hDGCGat.js +1139 -0
  66. package/node_modules/@comis/web/dist/assets/message-center-CXefwsUu.js +785 -0
  67. package/node_modules/@comis/web/dist/assets/models-C1qcU_j3.js +894 -0
  68. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +1 -0
  69. package/node_modules/@comis/web/dist/assets/observe-view-C0VBhX4C.js +814 -0
  70. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +1496 -0
  71. package/node_modules/@comis/web/dist/assets/pipeline-history-DkfOQ6SW.js +317 -0
  72. package/node_modules/@comis/web/dist/assets/pipeline-history-detail-hyHgD0ai.js +287 -0
  73. package/node_modules/@comis/web/dist/assets/pipeline-list-BPW8hV-q.js +518 -0
  74. package/node_modules/@comis/web/dist/assets/pipeline-monitor-Bip16T7e.js +972 -0
  75. package/node_modules/@comis/web/dist/assets/scheduler-BGgwKd06.js +1182 -0
  76. package/node_modules/@comis/web/dist/assets/security-D15st4xx.js +1224 -0
  77. package/node_modules/@comis/web/dist/assets/session-detail-SGEYNJ0M.js +632 -0
  78. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +1 -0
  79. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +231 -0
  80. package/node_modules/@comis/web/dist/assets/setup-wizard-nT0tz9QP.js +853 -0
  81. package/node_modules/@comis/web/dist/assets/skills-D8yVfSUy.js +1051 -0
  82. package/node_modules/@comis/web/dist/assets/subagents-HHXMeHYo.js +193 -0
  83. package/node_modules/@comis/web/dist/assets/workspace-manager-BQlr10iH.js +785 -0
  84. package/node_modules/@comis/web/dist/comis-logo.png +0 -0
  85. package/node_modules/@comis/web/dist/favicon-16x16.png +0 -0
  86. package/node_modules/@comis/web/dist/favicon-32x32.png +0 -0
  87. package/node_modules/@comis/web/dist/favicon.ico +0 -0
  88. package/node_modules/@comis/web/dist/index.html +17 -0
  89. package/node_modules/@comis/web/package.json +29 -0
  90. package/package.json +15 -13
@@ -0,0 +1,972 @@
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`
22
+ :host {
23
+ display: block;
24
+ }
25
+
26
+ .bar {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 1rem;
30
+ padding: var(--ic-space-sm) var(--ic-space-md);
31
+ background: var(--ic-surface);
32
+ border-bottom: 1px solid var(--ic-border);
33
+ font-size: var(--ic-text-sm);
34
+ color: var(--ic-text);
35
+ flex-wrap: wrap;
36
+ }
37
+
38
+ /* Status badge pills */
39
+ .status-badge {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ padding: 2px 10px;
43
+ border-radius: 9999px;
44
+ font-weight: 600;
45
+ font-size: var(--ic-text-xs);
46
+ text-transform: capitalize;
47
+ line-height: 1.4;
48
+ }
49
+ .status-badge--running {
50
+ background: color-mix(in srgb, var(--ic-info, #06b6d4) 20%, transparent);
51
+ color: var(--ic-info, #06b6d4);
52
+ }
53
+ .status-badge--completed {
54
+ background: color-mix(in srgb, var(--ic-success, #22c55e) 20%, transparent);
55
+ color: var(--ic-success, #22c55e);
56
+ }
57
+ .status-badge--failed {
58
+ background: color-mix(in srgb, var(--ic-error, #ef4444) 20%, transparent);
59
+ color: var(--ic-error, #ef4444);
60
+ }
61
+ .status-badge--cancelled {
62
+ background: color-mix(in srgb, var(--ic-warning, #eab308) 20%, transparent);
63
+ color: var(--ic-warning, #eab308);
64
+ }
65
+
66
+ .elapsed,
67
+ .progress,
68
+ .tokens {
69
+ font-variant-numeric: tabular-nums;
70
+ color: var(--ic-text-muted);
71
+ }
72
+
73
+ .cancel-btn {
74
+ margin-left: auto;
75
+ padding: 4px 12px;
76
+ border-radius: var(--ic-radius-sm);
77
+ border: 1px solid var(--ic-error, #ef4444);
78
+ background: color-mix(in srgb, var(--ic-error) 15%, transparent);
79
+ color: var(--ic-error, #ef4444);
80
+ font-size: var(--ic-text-xs);
81
+ font-weight: 600;
82
+ cursor: pointer;
83
+ transition: background var(--ic-transition);
84
+ }
85
+ .cancel-btn:hover {
86
+ background: color-mix(in srgb, var(--ic-error) 25%, transparent);
87
+ }
88
+ .cancel-btn:focus-visible {
89
+ outline: 2px solid var(--ic-accent);
90
+ outline-offset: 2px;
91
+ }
92
+
93
+ .outputs-btn {
94
+ margin-left: auto;
95
+ padding: 4px 12px;
96
+ border: 1px solid color-mix(in srgb, var(--ic-accent, #3b82f6) 30%, transparent);
97
+ border-radius: var(--ic-radius-sm);
98
+ background: color-mix(in srgb, var(--ic-accent, #3b82f6) 10%, transparent);
99
+ color: var(--ic-accent, #3b82f6);
100
+ font-size: var(--ic-text-xs);
101
+ font-weight: 600;
102
+ cursor: pointer;
103
+ transition: background var(--ic-transition);
104
+ }
105
+ .outputs-btn:hover {
106
+ background: color-mix(in srgb, var(--ic-accent, #3b82f6) 20%, transparent);
107
+ }
108
+ .outputs-btn:focus-visible {
109
+ outline: 2px solid var(--ic-accent);
110
+ outline-offset: 2px;
111
+ }
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>
210
+ </div>
211
+ `}};A.styles=[F,ht,B`
212
+ :host {
213
+ display: block;
214
+ width: 320px;
215
+ border-left: 1px solid var(--ic-border);
216
+ overflow-y: auto;
217
+ background: var(--ic-surface);
218
+ padding: 16px;
219
+ }
220
+
221
+ .header {
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: space-between;
225
+ margin-bottom: var(--ic-space-md, 12px);
226
+ }
227
+
228
+ .header h3 {
229
+ margin: 0;
230
+ font-size: var(--ic-text-sm, 14px);
231
+ font-weight: 600;
232
+ overflow: hidden;
233
+ text-overflow: ellipsis;
234
+ white-space: nowrap;
235
+ flex: 1;
236
+ min-width: 0;
237
+ }
238
+
239
+ .close-btn {
240
+ background: none;
241
+ border: none;
242
+ color: var(--ic-text-muted, #9ca3af);
243
+ cursor: pointer;
244
+ font-size: 18px;
245
+ padding: 4px;
246
+ line-height: 1;
247
+ flex-shrink: 0;
248
+ }
249
+ .close-btn:hover {
250
+ color: var(--ic-text);
251
+ }
252
+
253
+ .section-header {
254
+ font-size: var(--ic-text-xs, 11px);
255
+ color: var(--ic-text-dim, #6b7280);
256
+ text-transform: uppercase;
257
+ margin-top: var(--ic-space-md, 12px);
258
+ margin-bottom: var(--ic-space-xs, 4px);
259
+ letter-spacing: 0.05em;
260
+ font-weight: 600;
261
+ }
262
+
263
+ .status-badge {
264
+ display: inline-block;
265
+ padding: 2px 8px;
266
+ border-radius: 9999px;
267
+ font-size: var(--ic-text-xs, 11px);
268
+ font-weight: 600;
269
+ color: #fff;
270
+ text-transform: uppercase;
271
+ letter-spacing: 0.03em;
272
+ }
273
+
274
+ .retry-badge {
275
+ display: inline-block;
276
+ padding: 2px 6px;
277
+ margin-left: 6px;
278
+ border-radius: 9999px;
279
+ font-size: 10px;
280
+ font-weight: 600;
281
+ color: #f97316;
282
+ background: rgba(249, 115, 22, 0.15);
283
+ text-transform: uppercase;
284
+ letter-spacing: 0.03em;
285
+ vertical-align: middle;
286
+ }
287
+
288
+ .field-row {
289
+ display: flex;
290
+ justify-content: space-between;
291
+ align-items: center;
292
+ padding: 3px 0;
293
+ font-size: var(--ic-text-xs, 11px);
294
+ }
295
+
296
+ .field-label {
297
+ color: var(--ic-text-dim, #6b7280);
298
+ }
299
+
300
+ .field-value {
301
+ color: var(--ic-text);
302
+ max-width: 180px;
303
+ overflow: hidden;
304
+ text-overflow: ellipsis;
305
+ white-space: nowrap;
306
+ }
307
+
308
+ .field-value.mono {
309
+ font-family: var(--ic-font-mono, monospace);
310
+ }
311
+
312
+ .task-box {
313
+ background: var(--ic-surface-2, #1e1e2e);
314
+ border: 1px solid var(--ic-border);
315
+ border-radius: var(--ic-radius-sm, 4px);
316
+ padding: 8px;
317
+ font-size: var(--ic-text-xs, 11px);
318
+ max-height: 120px;
319
+ overflow-y: auto;
320
+ word-wrap: break-word;
321
+ white-space: pre-wrap;
322
+ line-height: 1.5;
323
+ }
324
+
325
+ .dep-row {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 6px;
329
+ padding: 2px 0;
330
+ font-size: var(--ic-text-xs, 11px);
331
+ }
332
+
333
+ .dep-dot {
334
+ width: 8px;
335
+ height: 8px;
336
+ border-radius: 50%;
337
+ flex-shrink: 0;
338
+ }
339
+
340
+ .dep-label {
341
+ font-family: var(--ic-font-mono, monospace);
342
+ }
343
+
344
+ pre.output-block {
345
+ font-family: var(--ic-font-mono, monospace);
346
+ font-size: var(--ic-text-xs, 11px);
347
+ white-space: pre-wrap;
348
+ word-break: break-all;
349
+ background: var(--ic-surface-2, #1e1e2e);
350
+ border: 1px solid var(--ic-border);
351
+ border-radius: var(--ic-radius-sm, 4px);
352
+ padding: 8px;
353
+ margin: 4px 0;
354
+ max-height: 200px;
355
+ overflow-y: auto;
356
+ line-height: 1.4;
357
+ }
358
+
359
+ pre.error-block {
360
+ font-family: var(--ic-font-mono, monospace);
361
+ font-size: var(--ic-text-xs, 11px);
362
+ white-space: pre-wrap;
363
+ word-break: break-all;
364
+ background: var(--ic-surface-2, #1e1e2e);
365
+ border: 1px solid var(--ic-error, #ef4444);
366
+ border-radius: var(--ic-radius-sm, 4px);
367
+ padding: 8px;
368
+ margin: 4px 0;
369
+ max-height: 200px;
370
+ overflow-y: auto;
371
+ color: var(--ic-error, #ef4444);
372
+ line-height: 1.4;
373
+ }
374
+
375
+ .truncated-note {
376
+ font-size: 10px;
377
+ color: var(--ic-text-dim, #6b7280);
378
+ font-style: italic;
379
+ margin-top: 2px;
380
+ }
381
+
382
+ .view-full-btn,
383
+ .steer-btn,
384
+ .send-btn,
385
+ .copy-btn,
386
+ .modal-close-btn {
387
+ background: var(--ic-surface-2, #1e1e2e);
388
+ border: 1px solid var(--ic-border);
389
+ color: var(--ic-text);
390
+ padding: 4px 12px;
391
+ border-radius: var(--ic-radius-sm, 4px);
392
+ cursor: pointer;
393
+ font-size: var(--ic-text-xs, 11px);
394
+ margin-top: 4px;
395
+ }
396
+ .view-full-btn:hover,
397
+ .steer-btn:hover,
398
+ .send-btn:hover,
399
+ .copy-btn:hover,
400
+ .modal-close-btn:hover {
401
+ background: var(--ic-border);
402
+ }
403
+
404
+ .steer-btn {
405
+ background: var(--ic-accent, #3b82f6);
406
+ border-color: var(--ic-accent, #3b82f6);
407
+ color: #fff;
408
+ }
409
+ .steer-btn:hover {
410
+ opacity: 0.9;
411
+ background: var(--ic-accent, #3b82f6);
412
+ }
413
+
414
+ .send-btn {
415
+ background: var(--ic-accent, #3b82f6);
416
+ border-color: var(--ic-accent, #3b82f6);
417
+ color: #fff;
418
+ }
419
+ .send-btn:hover {
420
+ opacity: 0.9;
421
+ background: var(--ic-accent, #3b82f6);
422
+ }
423
+
424
+ .steer-area {
425
+ margin-top: 8px;
426
+ }
427
+
428
+ .steer-area textarea {
429
+ width: 100%;
430
+ min-height: 60px;
431
+ background: var(--ic-surface-2, #1e1e2e);
432
+ border: 1px solid var(--ic-border);
433
+ border-radius: var(--ic-radius-sm, 4px);
434
+ color: var(--ic-text);
435
+ padding: 8px;
436
+ font-family: var(--ic-font-sans);
437
+ font-size: var(--ic-text-xs, 11px);
438
+ resize: vertical;
439
+ }
440
+
441
+ .steer-area .send-row {
442
+ display: flex;
443
+ justify-content: flex-end;
444
+ margin-top: 4px;
445
+ }
446
+
447
+ /* Modal overlay */
448
+ .modal-backdrop {
449
+ position: fixed;
450
+ inset: 0;
451
+ background: rgba(0, 0, 0, 0.7);
452
+ z-index: 100;
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ }
457
+
458
+ .modal-content {
459
+ background: var(--ic-surface, #181825);
460
+ border: 1px solid var(--ic-border);
461
+ border-radius: var(--ic-radius-md, 8px);
462
+ max-width: 640px;
463
+ width: 90%;
464
+ max-height: 80vh;
465
+ display: flex;
466
+ flex-direction: column;
467
+ padding: 16px;
468
+ }
469
+
470
+ .modal-header {
471
+ display: flex;
472
+ justify-content: space-between;
473
+ align-items: center;
474
+ margin-bottom: 12px;
475
+ }
476
+
477
+ .modal-header h4 {
478
+ margin: 0;
479
+ font-size: var(--ic-text-sm, 14px);
480
+ }
481
+
482
+ .modal-actions {
483
+ display: flex;
484
+ gap: 8px;
485
+ }
486
+
487
+ .modal-body {
488
+ overflow-y: auto;
489
+ flex: 1;
490
+ min-height: 0;
491
+ }
492
+
493
+ .modal-body pre {
494
+ font-family: var(--ic-font-mono, monospace);
495
+ font-size: var(--ic-text-xs, 11px);
496
+ white-space: pre-wrap;
497
+ word-break: break-all;
498
+ margin: 0;
499
+ line-height: 1.4;
500
+ }
501
+
502
+ .empty-state {
503
+ color: var(--ic-text-dim, #6b7280);
504
+ font-size: var(--ic-text-xs, 11px);
505
+ font-style: italic;
506
+ padding: 8px 0;
507
+ }
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`
556
+ :host {
557
+ display: block;
558
+ height: 200px;
559
+ background: var(--ic-surface);
560
+ border-top: 1px solid var(--ic-border);
561
+ overflow-x: auto;
562
+ overflow-y: auto;
563
+ }
564
+
565
+ svg {
566
+ display: block;
567
+ }
568
+
569
+ .bar {
570
+ cursor: pointer;
571
+ }
572
+
573
+ .bar:hover {
574
+ filter: brightness(1.2);
575
+ }
576
+
577
+ .label-text {
578
+ font-family: var(--ic-font-mono, monospace);
579
+ font-size: 10px;
580
+ fill: var(--ic-text-muted, #9ca3af);
581
+ dominant-baseline: central;
582
+ }
583
+
584
+ .time-marker {
585
+ font-size: 9px;
586
+ fill: var(--ic-text-dim, #6b7280);
587
+ text-anchor: middle;
588
+ dominant-baseline: hanging;
589
+ }
590
+
591
+ .time-line {
592
+ stroke: var(--ic-border, #374151);
593
+ stroke-width: 0.5;
594
+ stroke-dasharray: 2 2;
595
+ }
596
+
597
+ .row-bg {
598
+ fill: var(--ic-surface-2, #1e1e2e);
599
+ opacity: 0.3;
600
+ }
601
+
602
+ .selected-highlight {
603
+ stroke: var(--ic-accent, #3b82f6);
604
+ stroke-width: 2;
605
+ fill: none;
606
+ }
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}
617
+
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}
626
+ </svg>
627
+ `}};T.styles=[F,B`
628
+ :host {
629
+ display: block;
630
+ width: ${z}px;
631
+ height: ${R}px;
632
+ background: var(--ic-surface, #181825);
633
+ border: 1px solid var(--ic-border);
634
+ border-radius: var(--ic-radius-md, 8px);
635
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
636
+ overflow: hidden;
637
+ user-select: none;
638
+ touch-action: none;
639
+ }
640
+
641
+ svg {
642
+ display: block;
643
+ width: 100%;
644
+ height: 100%;
645
+ }
646
+
647
+ .viewport-rect {
648
+ fill: none;
649
+ stroke: var(--ic-accent, #3b82f6);
650
+ stroke-opacity: 0.4;
651
+ stroke-width: 1.5;
652
+ cursor: grab;
653
+ }
654
+
655
+ .viewport-rect.dragging {
656
+ cursor: grabbing;
657
+ stroke-opacity: 0.7;
658
+ }
659
+
660
+ .viewport-fill {
661
+ fill: var(--ic-accent, #3b82f6);
662
+ fill-opacity: 0.05;
663
+ }
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>
752
+
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`
773
+ :host { display: block; height: 100%; }
774
+
775
+ .monitor-container {
776
+ display: flex;
777
+ flex-direction: column;
778
+ height: calc(100vh - 120px);
779
+ }
780
+
781
+ .monitor-body {
782
+ display: flex;
783
+ flex: 1;
784
+ overflow: hidden;
785
+ }
786
+
787
+ .canvas-area {
788
+ flex: 1;
789
+ position: relative;
790
+ border: 1px solid var(--ic-border);
791
+ border-radius: var(--ic-radius-md);
792
+ overflow: hidden;
793
+ }
794
+
795
+ .minimap-container {
796
+ position: absolute;
797
+ bottom: 12px;
798
+ right: 12px;
799
+ z-index: 10;
800
+ }
801
+
802
+ .loading-container {
803
+ display: flex;
804
+ align-items: center;
805
+ justify-content: center;
806
+ flex: 1;
807
+ color: var(--ic-text-muted);
808
+ font-size: var(--ic-text-sm);
809
+ }
810
+
811
+ .error-banner {
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: space-between;
815
+ padding: var(--ic-space-sm) var(--ic-space-md);
816
+ background: color-mix(in srgb, var(--ic-error) 15%, transparent);
817
+ border: 1px solid var(--ic-error);
818
+ border-radius: var(--ic-radius-sm);
819
+ color: var(--ic-error);
820
+ font-size: var(--ic-text-sm);
821
+ margin-bottom: var(--ic-space-sm);
822
+ }
823
+
824
+ .error-banner button {
825
+ padding: 4px 12px;
826
+ background: var(--ic-surface-2);
827
+ border: 1px solid var(--ic-border);
828
+ border-radius: var(--ic-radius-sm);
829
+ color: var(--ic-text);
830
+ font-size: var(--ic-text-xs);
831
+ cursor: pointer;
832
+ }
833
+ .error-banner button:hover {
834
+ background: var(--ic-border);
835
+ }
836
+
837
+ /* Screen-reader-only text for ARIA live region */
838
+ .sr-only {
839
+ position: absolute;
840
+ width: 1px;
841
+ height: 1px;
842
+ padding: 0;
843
+ margin: -1px;
844
+ overflow: hidden;
845
+ clip: rect(0, 0, 0, 0);
846
+ white-space: nowrap;
847
+ border: 0;
848
+ }
849
+
850
+ /* Graph outputs modal */
851
+ .outputs-overlay {
852
+ position: fixed;
853
+ inset: 0;
854
+ background: rgba(0, 0, 0, 0.5);
855
+ z-index: 100;
856
+ display: flex;
857
+ align-items: center;
858
+ justify-content: center;
859
+ }
860
+
861
+ .outputs-modal {
862
+ background: var(--ic-surface);
863
+ border: 1px solid var(--ic-border);
864
+ border-radius: var(--ic-radius-md);
865
+ width: 600px;
866
+ max-width: 90vw;
867
+ max-height: 80vh;
868
+ display: flex;
869
+ flex-direction: column;
870
+ }
871
+
872
+ .outputs-header {
873
+ display: flex;
874
+ justify-content: space-between;
875
+ align-items: center;
876
+ padding: 12px 16px;
877
+ border-bottom: 1px solid var(--ic-border);
878
+ }
879
+
880
+ .outputs-header h3 {
881
+ margin: 0;
882
+ font-size: var(--ic-text-base);
883
+ }
884
+
885
+ .outputs-close {
886
+ border: none;
887
+ background: none;
888
+ color: var(--ic-text-muted);
889
+ cursor: pointer;
890
+ font-size: var(--ic-text-base);
891
+ padding: 4px 8px;
892
+ }
893
+ .outputs-close:hover {
894
+ color: var(--ic-text);
895
+ }
896
+
897
+ .outputs-body {
898
+ padding: 16px;
899
+ overflow-y: auto;
900
+ flex: 1;
901
+ }
902
+
903
+ .output-entry {
904
+ margin-bottom: 16px;
905
+ }
906
+ .output-entry:last-child {
907
+ margin-bottom: 0;
908
+ }
909
+
910
+ .output-node-id {
911
+ font-weight: 600;
912
+ font-size: var(--ic-text-sm);
913
+ color: var(--ic-accent);
914
+ margin-bottom: 4px;
915
+ }
916
+
917
+ .output-text {
918
+ margin: 0;
919
+ padding: 8px;
920
+ background: var(--ic-bg);
921
+ border: 1px solid var(--ic-border);
922
+ border-radius: var(--ic-radius-sm);
923
+ font-size: var(--ic-text-xs);
924
+ font-family: var(--ic-font-mono);
925
+ white-space: pre-wrap;
926
+ word-break: break-word;
927
+ max-height: 200px;
928
+ overflow-y: auto;
929
+ }
930
+
931
+ .outputs-empty {
932
+ text-align: center;
933
+ color: var(--ic-text-muted);
934
+ padding: 24px;
935
+ font-size: var(--ic-text-sm);
936
+ }
937
+
938
+ /* Mobile responsive: show summary instead of canvas */
939
+ .mobile-summary { display: none; }
940
+
941
+ @media (max-width: 767px) {
942
+ .monitor-container { display: none; }
943
+ .mobile-summary {
944
+ display: block;
945
+ padding: 1.5rem;
946
+ color: var(--ic-text-muted);
947
+ text-align: center;
948
+ }
949
+ .mobile-summary h2 {
950
+ font-size: 1.25rem;
951
+ font-weight: 600;
952
+ margin-bottom: 0.5rem;
953
+ }
954
+ .mobile-summary .node-list {
955
+ text-align: left;
956
+ font-size: var(--ic-text-sm);
957
+ margin-top: 1rem;
958
+ }
959
+ .mobile-summary .node-item {
960
+ display: flex;
961
+ align-items: center;
962
+ gap: 8px;
963
+ padding: 4px 0;
964
+ }
965
+ .mobile-summary .status-dot {
966
+ width: 8px;
967
+ height: 8px;
968
+ border-radius: 50%;
969
+ flex-shrink: 0;
970
+ }
971
+ }
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};