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,323 @@
1
+ import{s as y,f as w,i as $,n as c,a as C,g as _,c as x,d as S,A as g,b as l,t as D,S as v,I as u,r as m}from"./index-CEcM1R_C.js";import"./ic-confirm-dialog-CCDbB04e.js";import"./ic-empty-state-60l2ePhd.js";import"./ic-icon-xeGTVhVG.js";var T=Object.defineProperty,A=Object.getOwnPropertyDescriptor,p=(e,t,s,a)=>{for(var i=a>1?void 0:a?A(t,s):t,d=e.length-1,n;d>=0;d--)(n=e[d])&&(i=(a?n(t,s,i):n(i))||i);return a&&i&&T(t,s,i),i};let o=class extends C{constructor(){super(...arguments),this.channelType="",this.name="",this.status="disconnected",this.enabled=!1,this.isStale=!1,this.messageCount=0,this.uptime=0,this.lastActivity=0}_formatUptime(e){if(e<60)return"0m";const t=Math.floor(e/86400),s=Math.floor(e%86400/3600),a=Math.floor(e%3600/60);return t>0?`${t}d ${s}h`:s>0?`${s}h`:`${a}m`}_formatTimeAgo(e){if(e<=0)return"unknown";const t=Date.now()-e,s=Math.floor(t/1e3);if(s<60)return"just now";const a=Math.floor(s/60);if(a<60)return`${a}m ago`;const i=Math.floor(a/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}_getHealthVisual(){return this.isStale?_("stale"):_(this.status)}_handleAction(e,t){t.stopPropagation(),this.dispatchEvent(new CustomEvent("channel-action",{detail:{action:e,channelType:this.channelType},bubbles:!0,composed:!0}))}render(){const e=this.name||this.channelType||"Unknown",t=this._getHealthVisual(),s=this.uptime>0&&x(S(this.status)),a=new Intl.NumberFormat("en-US");return l`
2
+ <div class="card" role="group" aria-label="${e} channel - ${t.label}">
3
+ <div class="card-header">
4
+ <ic-platform-icon .platform=${this.channelType} size="20px"></ic-platform-icon>
5
+ <span class="channel-name">${e}</span>
6
+ <span
7
+ class="status-dot ${t.pulse?"pulse":""}"
8
+ style="background: ${t.color}"
9
+ role="status"
10
+ aria-label="Status: ${t.label}"
11
+ ></span>
12
+ <span class="status-text" style="font-size: 0.75rem; color: ${t.color};">${t.label}</span>
13
+ </div>
14
+
15
+ <div class="metrics">
16
+ <div class="metric-row">
17
+ <span class="metric-label">Messages</span>
18
+ <span class="metric-value">${a.format(this.messageCount)}</span>
19
+ </div>
20
+ ${s?l`
21
+ <div class="metric-row">
22
+ <span class="metric-label">Uptime</span>
23
+ <span class="metric-value">${this._formatUptime(this.uptime)}</span>
24
+ </div>
25
+ `:g}
26
+ </div>
27
+
28
+ ${this.isStale&&this.lastActivity>0?l`
29
+ <div class="stale-warning">
30
+ Last seen ${this._formatTimeAgo(this.lastActivity)}
31
+ </div>
32
+ `:g}
33
+
34
+ <div class="card-actions">
35
+ ${this.enabled?l`
36
+ <button
37
+ class="action-btn"
38
+ aria-label="Configure ${e}"
39
+ @click=${i=>this._handleAction("configure",i)}
40
+ >Configure</button>
41
+ <button
42
+ class="action-btn"
43
+ aria-label="Restart ${e}"
44
+ @click=${i=>this._handleAction("restart",i)}
45
+ >Restart</button>
46
+ `:l`
47
+ <button
48
+ class="action-btn"
49
+ aria-label="Enable ${e}"
50
+ @click=${i=>this._handleAction("enable",i)}
51
+ >Enable</button>
52
+ `}
53
+ </div>
54
+ </div>
55
+ `}};o.styles=[y,w,$`
56
+ :host {
57
+ display: block;
58
+ min-width: 280px;
59
+ }
60
+
61
+ .card {
62
+ background: var(--ic-surface);
63
+ border: 1px solid var(--ic-border);
64
+ border-radius: 0.75rem;
65
+ padding: 1.25rem;
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 0.75rem;
69
+ transition: border-color 0.15s;
70
+ }
71
+
72
+ .card:hover {
73
+ border-color: var(--ic-border-hover, #374151);
74
+ }
75
+
76
+ .card-header {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 0.625rem;
80
+ }
81
+
82
+ .channel-name {
83
+ font-size: 1rem;
84
+ font-weight: 600;
85
+ color: var(--ic-text);
86
+ flex: 1;
87
+ text-transform: capitalize;
88
+ }
89
+
90
+ .status-dot {
91
+ width: 0.5rem;
92
+ height: 0.5rem;
93
+ border-radius: 50%;
94
+ flex-shrink: 0;
95
+ }
96
+
97
+ .status-dot.pulse {
98
+ animation: pulse 2s ease-in-out infinite;
99
+ }
100
+
101
+ @keyframes pulse {
102
+ 0%, 100% { opacity: 1; }
103
+ 50% { opacity: 0.4; }
104
+ }
105
+
106
+ @media (prefers-reduced-motion: reduce) {
107
+ .status-dot.pulse { animation: none; }
108
+ }
109
+
110
+ .metrics {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 0.375rem;
114
+ }
115
+
116
+ .metric-row {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ font-size: 0.8125rem;
121
+ }
122
+
123
+ .metric-label {
124
+ color: var(--ic-text-dim);
125
+ }
126
+
127
+ .metric-value {
128
+ color: var(--ic-text-muted);
129
+ font-family: ui-monospace, monospace;
130
+ font-size: 0.75rem;
131
+ }
132
+
133
+ .stale-warning {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: 0.375rem;
137
+ padding: 0.375rem 0.625rem;
138
+ background: var(--ic-warning)0d;
139
+ border: 1px solid var(--ic-warning)33;
140
+ border-radius: 0.375rem;
141
+ font-size: 0.75rem;
142
+ color: var(--ic-warning);
143
+ }
144
+
145
+ .card-actions {
146
+ display: flex;
147
+ gap: 0.5rem;
148
+ padding-top: 0.75rem;
149
+ border-top: 1px solid var(--ic-border);
150
+ }
151
+
152
+ .action-btn {
153
+ flex: 1;
154
+ display: inline-flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ padding: 0.375rem 0.5rem;
158
+ background: transparent;
159
+ border: 1px solid var(--ic-border);
160
+ border-radius: 0.375rem;
161
+ color: var(--ic-text-dim);
162
+ font-size: 0.75rem;
163
+ font-family: inherit;
164
+ cursor: pointer;
165
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
166
+ }
167
+
168
+ .action-btn:hover {
169
+ background: var(--ic-surface-2, #1f2937);
170
+ color: var(--ic-text);
171
+ border-color: var(--ic-text-dim);
172
+ }
173
+ `];p([c({type:String})],o.prototype,"channelType",2);p([c({type:String})],o.prototype,"name",2);p([c({type:String})],o.prototype,"status",2);p([c({type:Boolean})],o.prototype,"enabled",2);p([c({type:Boolean})],o.prototype,"isStale",2);p([c({type:Number})],o.prototype,"messageCount",2);p([c({type:Number})],o.prototype,"uptime",2);p([c({type:Number})],o.prototype,"lastActivity",2);o=p([D("ic-channel-card")],o);var P=Object.defineProperty,k=Object.getOwnPropertyDescriptor,h=(e,t,s,a)=>{for(var i=a>1?void 0:a?k(t,s):t,d=e.length-1,n;d>=0;d--)(n=e[d])&&(i=(a?n(t,s,i):n(i))||i);return a&&i&&P(t,s,i),i};function O(e){if(e<=0)return"0m";const t=Math.floor(e/86400),s=Math.floor(e%86400/3600),a=Math.floor(e%3600/60);return t>0?`${t}d ${s}h`:s>0?`${s}h ${a}m`:`${a}m`}function b(e){return e?e.charAt(0).toUpperCase()+e.slice(1):""}let r=class extends C{constructor(){super(...arguments),this.apiClient=null,this.rpcClient=null,this.eventDispatcher=null,this._sse=null,this._reloadDebounce=null,this._loadState="loading",this._error="",this._channels=[],this._staleTypes=new Set,this._actionPending=new Set,this._confirmDisable=null,this._hasLoaded=!1}connectedCallback(){super.connectedCallback(),this.eventDispatcher&&!this._sse&&(this._sse=new v(this,this.eventDispatcher,{"channel:registered":()=>{this._scheduleReload()},"channel:deregistered":()=>{this._scheduleReload()},"diagnostic:channel_health":()=>{this._scheduleReload(500)}}))}disconnectedCallback(){super.disconnectedCallback(),this._reloadDebounce!==null&&(clearTimeout(this._reloadDebounce),this._reloadDebounce=null)}updated(e){(e.has("apiClient")||e.has("rpcClient"))&&this.apiClient&&!this._hasLoaded&&this._loadData(),e.has("eventDispatcher")&&this.eventDispatcher&&!this._sse&&(this._sse=new v(this,this.eventDispatcher,{"channel:registered":()=>{this._scheduleReload()},"channel:deregistered":()=>{this._scheduleReload()},"diagnostic:channel_health":()=>{this._scheduleReload(500)}}))}_scheduleReload(e=300){this._reloadDebounce!==null&&clearTimeout(this._reloadDebounce),this._reloadDebounce=setTimeout(()=>{this._reloadDebounce=null,this._loadData()},e)}async _loadData(){if(this.apiClient){this._loadState="loading",this._error="";try{const e=await this.apiClient.getChannels();this._channels=e.map(t=>({...t,uptime:0,messageCount:0,lastActivity:0})),this._loadState="loaded",this._hasLoaded=!0,this.rpcClient&&this.rpcClient.status==="connected"&&Promise.allSettled([this.rpcClient.call("obs.channels.all"),this.rpcClient.call("obs.channels.stale")]).then(([t,s])=>{const a=t.status==="fulfilled"?t.value:null,i=s.status==="fulfilled"?s.value:null,d=new Map((a?.channels??[]).map(n=>[n.channelType,n]));this._channels=e.map(n=>{const f=d.get(n.type);return{...n,uptime:0,messageCount:f?f.messagesSent+f.messagesReceived:0,lastActivity:f?.lastActiveAt??0}}),this._staleTypes=new Set((i?.channels??[]).map(n=>n.channelType))})}catch(e){this._error=e instanceof Error?e.message:"Failed to load channels",this._loadState="error"}}}async _handleRestart(e){if(this.rpcClient){this._actionPending=new Set([...this._actionPending,e]);try{await this.rpcClient.call("channels.restart",{channel_type:e}),u.show(`${b(e)} restarted`,"success"),await this._loadData()}catch{u.show(`Failed to restart ${e}`,"error")}finally{const t=new Set(this._actionPending);t.delete(e),this._actionPending=t}}}async _handleEnable(e){if(this.rpcClient){this._actionPending=new Set([...this._actionPending,e]);try{await this.rpcClient.call("channels.enable",{channel_type:e}),u.show(`${b(e)} enabled`,"success"),await this._loadData()}catch{u.show(`Failed to enable ${e}`,"error")}finally{const t=new Set(this._actionPending);t.delete(e),this._actionPending=t}}}async _handleDisable(e){if(this.rpcClient){this._actionPending=new Set([...this._actionPending,e]);try{await this.rpcClient.call("channels.disable",{channel_type:e}),u.show(`${b(e)} disabled`,"success"),await this._loadData()}catch{u.show(`Failed to disable ${e}`,"error")}finally{const t=new Set(this._actionPending);t.delete(e),this._actionPending=t}}}_handleConfigure(e){this.dispatchEvent(new CustomEvent("navigate",{detail:`channels/${e}`,bubbles:!1,composed:!1}))}_handleCardAction(e){const{action:t,channelType:s}=e.detail;switch(t){case"configure":this._handleConfigure(s);break;case"restart":this._handleRestart(s);break;case"enable":this._handleEnable(s);break;case"disable":this._confirmDisable=s;break}}_confirmDisableAction(){this._confirmDisable&&(this._handleDisable(this._confirmDisable),this._confirmDisable=null)}_cancelDisable(){this._confirmDisable=null}render(){if(this._loadState==="loading")return l`<ic-skeleton-view variant="list"></ic-skeleton-view>`;if(this._loadState==="error")return l`
174
+ <div class="error-container">
175
+ <div class="error-message">${this._error}</div>
176
+ <button class="retry-btn" @click=${()=>{this._loadData()}}>
177
+ Retry
178
+ </button>
179
+ </div>
180
+ `;if(this._channels.length===0)return l`
181
+ <h1 class="page-title">Channels</h1>
182
+ <ic-empty-state
183
+ icon="radio"
184
+ message="No channels connected"
185
+ description="Connect a chat platform to start receiving messages."
186
+ >
187
+ <button class="retry-btn" @click=${()=>{window.location.hash="#/config"}}>Open Settings</button>
188
+ </ic-empty-state>
189
+ `;const e=this._channels.filter(a=>a.enabled&&(a.status==="healthy"||a.status==="idle")).length,t=this._channels.filter(a=>!a.enabled).length,s=this._channels.filter(a=>a.enabled&&this._staleTypes.has(a.type)).length;return l`
190
+ <div role="region" aria-label="Channels">
191
+ <h1 class="page-title">Channels</h1>
192
+
193
+ <div class="stats-row">
194
+ <span class="stat-badge">
195
+ <span class="stat-count">${this._channels.length}</span> Total
196
+ </span>
197
+ <span class="stat-badge stat-badge--connected">
198
+ <span class="stat-count">${e}</span> Connected
199
+ </span>
200
+ <span class="stat-badge stat-badge--disconnected">
201
+ <span class="stat-count">${t}</span> Disabled
202
+ </span>
203
+ ${s>0?l`<span class="stat-badge stat-badge--stale">
204
+ <span class="stat-count">${s}</span> Stale
205
+ </span>`:g}
206
+ </div>
207
+
208
+ <div class="card-grid">
209
+ ${this._channels.map(a=>l`
210
+ <ic-channel-card
211
+ .channelType=${a.type}
212
+ .name=${b(a.type)}
213
+ .status=${a.enabled?a.status:"disconnected"}
214
+ ?enabled=${a.enabled}
215
+ ?isStale=${a.enabled&&this._staleTypes.has(a.type)}
216
+ .messageCount=${a.messageCount}
217
+ .uptime=${a.uptime}
218
+ .lastActivity=${a.lastActivity}
219
+ @channel-action=${i=>this._handleCardAction(i)}
220
+ ></ic-channel-card>
221
+ `)}
222
+ </div>
223
+
224
+ </div>
225
+
226
+ <ic-confirm-dialog
227
+ ?open=${this._confirmDisable!==null}
228
+ title="Disable Channel"
229
+ message="Disable ${this._confirmDisable?b(this._confirmDisable):""}? This will disconnect the channel."
230
+ confirmLabel="Disable"
231
+ variant="danger"
232
+ @confirm=${this._confirmDisableAction}
233
+ @cancel=${this._cancelDisable}
234
+ ></ic-confirm-dialog>
235
+ `}};r.styles=[y,w,$`
236
+ :host {
237
+ display: block;
238
+ }
239
+
240
+ .page-title {
241
+ font-size: 1.5rem;
242
+ font-weight: 700;
243
+ margin: 0 0 var(--ic-space-sm) 0;
244
+ }
245
+
246
+ /* Summary stats row */
247
+ .stats-row {
248
+ display: flex;
249
+ flex-wrap: wrap;
250
+ gap: var(--ic-space-sm, 0.5rem);
251
+ margin-bottom: var(--ic-space-lg, 1.5rem);
252
+ }
253
+
254
+ .stat-badge {
255
+ display: inline-flex;
256
+ align-items: center;
257
+ gap: 0.25rem;
258
+ padding: 0.25rem 0.625rem;
259
+ border-radius: 9999px;
260
+ font-size: 0.75rem;
261
+ font-weight: 500;
262
+ background: var(--ic-surface, #111827);
263
+ border: 1px solid var(--ic-border, #374151);
264
+ color: var(--ic-text-muted, #9ca3af);
265
+ }
266
+
267
+ .stat-badge--connected {
268
+ color: var(--ic-success, #22c55e);
269
+ border-color: color-mix(in srgb, var(--ic-success, #22c55e) 30%, var(--ic-border, #374151));
270
+ }
271
+
272
+ .stat-badge--disconnected {
273
+ color: var(--ic-text-dim, #6b7280);
274
+ }
275
+
276
+ .stat-badge--stale {
277
+ color: var(--ic-warning, #f59e0b);
278
+ border-color: color-mix(in srgb, var(--ic-warning, #f59e0b) 30%, var(--ic-border, #374151));
279
+ }
280
+
281
+ .stat-count {
282
+ font-weight: 700;
283
+ }
284
+
285
+ /* Card grid */
286
+ .card-grid {
287
+ display: grid;
288
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
289
+ gap: var(--ic-space-lg, 1.5rem);
290
+ }
291
+
292
+ /* Error state */
293
+ .error-container {
294
+ padding: var(--ic-space-xl, 2rem);
295
+ text-align: center;
296
+ }
297
+
298
+ .error-message {
299
+ color: var(--ic-error, #f87171);
300
+ margin-bottom: var(--ic-space-md, 1rem);
301
+ }
302
+
303
+ .retry-btn {
304
+ padding: 0.5rem 1rem;
305
+ background: var(--ic-accent, #3b82f6);
306
+ color: white;
307
+ border: none;
308
+ border-radius: var(--ic-radius-md, 0.5rem);
309
+ cursor: pointer;
310
+ font-size: var(--ic-text-sm, 0.875rem);
311
+ }
312
+
313
+ .retry-btn:hover {
314
+ background: var(--ic-accent-hover, #2563eb);
315
+ }
316
+
317
+ /* Loading */
318
+ .loading-container {
319
+ display: flex;
320
+ justify-content: center;
321
+ padding: var(--ic-space-2xl, 3rem);
322
+ }
323
+ `];h([c({attribute:!1})],r.prototype,"apiClient",2);h([c({attribute:!1})],r.prototype,"rpcClient",2);h([c({attribute:!1})],r.prototype,"eventDispatcher",2);h([m()],r.prototype,"_loadState",2);h([m()],r.prototype,"_error",2);h([m()],r.prototype,"_channels",2);h([m()],r.prototype,"_staleTypes",2);h([m()],r.prototype,"_actionPending",2);h([m()],r.prototype,"_confirmDisable",2);r=h([D("ic-channel-list")],r);export{r as IcChannelList,O as formatUptime};