comisai 1.0.16 → 1.0.17

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 +4 -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,392 @@
1
+ import{s as _,i as g,n as p,a as y,b as i,t as b,A as m,f as x,r as d}from"./index-CEcM1R_C.js";import"./ic-time-range-picker-CypCT68y.js";import"./ic-relative-time-3FqpjeAI.js";import"./ic-delivery-row-GP5Fkygs.js";import"./ic-detail-panel-BF83r-if.js";import"./ic-empty-state-60l2ePhd.js";import"./ic-tag-CPPUnDLF.js";import"./ic-icon-xeGTVhVG.js";var w=Object.defineProperty,$=Object.getOwnPropertyDescriptor,h=(e,t,a,r)=>{for(var s=r>1?void 0:r?$(t,a):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(s=(r?o(t,a,s):o(s))||s);return r&&s&&w(t,a,s),s};function f(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}let u=class extends y{constructor(){super(...arguments),this.steps=[],this.totalDurationMs=0}_getTotalDuration(){return this.totalDurationMs>0?this.totalDurationMs:this.steps.reduce((e,t)=>e+t.durationMs,0)}render(){if(this.steps.length===0)return i`<div class="empty">No trace steps available</div>`;const e=this._getTotalDuration();let t=0;return i`
2
+ ${this.steps.map(a=>{const r=e>0?t/e*100:0,s=e>0?a.durationMs/e*100:0;return t+=a.durationMs,i`
3
+ <div class="step-row">
4
+ <span class="step-name" title="${a.name}">${a.name}</span>
5
+ <div class="track">
6
+ <div
7
+ class="fill fill--${a.status}"
8
+ style="left: ${r}%; width: ${s}%;"
9
+ title="${a.name}: ${f(a.durationMs)}"
10
+ ></div>
11
+ </div>
12
+ <span class="duration">${f(a.durationMs)}</span>
13
+ </div>
14
+ ${a.error?i`<div class="error-text">${a.error}</div>`:""}
15
+ `})}
16
+ `}};u.styles=[_,g`
17
+ :host {
18
+ display: block;
19
+ }
20
+
21
+ .step-row {
22
+ display: grid;
23
+ grid-template-columns: 140px 1fr 60px;
24
+ align-items: center;
25
+ gap: var(--ic-space-sm);
26
+ padding: 2px 0;
27
+ }
28
+
29
+ .step-name {
30
+ font-size: var(--ic-text-xs);
31
+ color: var(--ic-text-dim);
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ white-space: nowrap;
35
+ }
36
+
37
+ .track {
38
+ height: 16px;
39
+ background: var(--ic-surface-2, #1f2937);
40
+ border-radius: var(--ic-radius-sm, 4px);
41
+ position: relative;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .fill {
46
+ position: absolute;
47
+ top: 0;
48
+ height: 100%;
49
+ border-radius: var(--ic-radius-sm, 4px);
50
+ min-width: 2px;
51
+ transition: width var(--ic-transition, 150ms ease),
52
+ left var(--ic-transition, 150ms ease);
53
+ }
54
+
55
+ .fill--ok {
56
+ background: var(--ic-success);
57
+ }
58
+
59
+ .fill--error {
60
+ background: var(--ic-error);
61
+ }
62
+
63
+ .duration {
64
+ font-size: var(--ic-text-xs);
65
+ color: var(--ic-text-dim);
66
+ font-family: var(--ic-font-mono, ui-monospace, monospace);
67
+ text-align: right;
68
+ }
69
+
70
+ .error-text {
71
+ grid-column: 1 / -1;
72
+ font-size: var(--ic-text-xs);
73
+ color: var(--ic-error);
74
+ padding-left: 140px;
75
+ padding-bottom: 2px;
76
+ }
77
+
78
+ .empty {
79
+ font-size: var(--ic-text-sm);
80
+ color: var(--ic-text-dim);
81
+ font-style: italic;
82
+ }
83
+ `];h([p({attribute:!1})],u.prototype,"steps",2);h([p({type:Number})],u.prototype,"totalDurationMs",2);u=h([b("ic-trace-timeline")],u);var S=Object.defineProperty,T=Object.getOwnPropertyDescriptor,c=(e,t,a,r)=>{for(var s=r>1?void 0:r?T(t,a):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(s=(r?o(t,a,s):o(s))||s);return r&&s&&S(t,a,s),s};const C=3e4,M=6048e5;let l=class extends y{constructor(){super(...arguments),this.rpcClient=null,this._loadState="loading",this._sinceMs=M,this._selectedRange="7d",this._searchQuery="",this._statusFilter="all",this._channelFilter="all",this._deliveryStats=null,this._traces=[],this._selectedTrace=null,this._detailOpen=!1,this._latencyPercentiles=null,this._refreshInterval=null,this._rpcStatusUnsub=null,this._fmtNum=new Intl.NumberFormat("en-US")}connectedCallback(){super.connectedCallback()}disconnectedCallback(){super.disconnectedCallback(),this._refreshInterval!==null&&(clearInterval(this._refreshInterval),this._refreshInterval=null),this._rpcStatusUnsub?.(),this._rpcStatusUnsub=null}willUpdate(e){e.has("rpcClient")&&this.rpcClient&&this._tryLoad()}_tryLoad(){if(!this.rpcClient){this._loadState="loaded";return}this._rpcStatusUnsub?.(),this.rpcClient.status==="connected"?this._startLoading():this._rpcStatusUnsub=this.rpcClient.onStatusChange(e=>{e==="connected"&&this._startLoading()})}_startLoading(){this._loadData(),this._refreshInterval===null&&(this._refreshInterval=setInterval(()=>{this._loadData()},C))}async _loadData(){if(!this.rpcClient||this.rpcClient.status!=="connected"){this._loadState="loaded";return}const e=this.rpcClient;try{const[t,a]=await Promise.allSettled([e.call("obs.delivery.stats",{sinceMs:this._sinceMs}),e.call("obs.delivery.recent",{sinceMs:this._sinceMs,limit:200})]);if(t.status==="rejected"&&a.status==="rejected")throw t.reason;if(t.status==="fulfilled"){const r=t.value;this._deliveryStats={total:Number(r.totalDelivered??r.total??0),successes:Number(r.successes??Math.round(Number(r.totalDelivered??0)*Number(r.successRate??0)/100)),failures:Number(r.failed??r.failures??0),avgLatencyMs:Number(r.avgLatencyMs??0)}}if(a.status==="fulfilled"){const r=a.value;if(Array.isArray(r))this._traces=r.map(s=>this._normalizeTrace(s));else{const s=r,n=Array.isArray(s.traces)?s.traces:Array.isArray(s.deliveries)?s.deliveries:[];this._traces=n.map(o=>this._normalizeTrace(o))}}this._computeLatencyPercentiles(),this._loadState="loaded"}catch{this._loadState="error"}}_normalizeTrace(e){const t=String(e.traceId??`${e.sourceChannelId??"unknown"}-${e.deliveredAt??Date.now()}`),a=Number(e.timestamp??e.deliveredAt??Date.now()),r=String(e.sourceChannelType??e.targetChannelType??e.channelType??"unknown"),s=String(e.metadata?.messagePreview??(typeof e.message=="string"?e.message.slice(0,80):e.messagePreview??"...")),n=e.status==="failed"?"failed":e.status==="timeout"?"timeout":typeof e.success=="boolean"?e.success?"success":"failed":"success",o=e.latencyMs!=null?Number(e.latencyMs):null,v=Array.isArray(e.steps)?e.steps:[];return{traceId:t,timestamp:a,channelType:r,messagePreview:s,status:n,latencyMs:o,stepCount:v.length,steps:v}}_computeLatencyPercentiles(){const e=this._traces.map(t=>t.latencyMs).filter(t=>t!=null).sort((t,a)=>t-a);if(e.length===0){this._latencyPercentiles=null;return}this._latencyPercentiles={p50:e[Math.floor(e.length*.5)],p95:e[Math.floor(e.length*.95)],p99:e[Math.floor(e.length*.99)]}}get _filteredTraces(){let e=this._traces;if(this._searchQuery){const t=this._searchQuery.toLowerCase();e=e.filter(a=>a.messagePreview.toLowerCase().includes(t)||a.channelType.toLowerCase().includes(t))}return this._statusFilter!=="all"&&(e=e.filter(t=>t.status===this._statusFilter)),this._channelFilter!=="all"&&(e=e.filter(t=>t.channelType===this._channelFilter)),e}get _uniqueChannels(){return[...new Set(this._traces.map(e=>e.channelType))].sort()}get _successRate(){if(this._deliveryStats&&this._deliveryStats.total>0)return Math.round(this._deliveryStats.successes/this._deliveryStats.total*100);if(this._traces.length===0)return 0;const e=this._traces.filter(t=>t.status==="success").length;return Math.round(e/this._traces.length*100)}get _channelRates(){const e=new Map;for(const t of this._traces){const a=e.get(t.channelType)??{ok:0,total:0};a.total++,t.status==="success"&&a.ok++,e.set(t.channelType,a)}return[...e.entries()].map(([t,a])=>({channel:t,rate:Math.round(a.ok/a.total*100)})).sort((t,a)=>t.channel.localeCompare(a.channel))}_onTimeRangeChange(e){this._sinceMs=e.detail.sinceMs,this._selectedRange=e.detail.label,this._loadData()}_onSearchInput(e){this._searchQuery=e.target.value}_onStatusFilter(e){this._statusFilter=e.target.value}_onChannelFilter(e){this._channelFilter=e.target.value}_onTraceClick(e){const t=this._traces.find(a=>a.traceId===e.detail);t&&(this._selectedTrace=t,this._detailOpen=!0)}_closeDetail(){this._detailOpen=!1,this._selectedTrace=null}_formatLatency(e,t=!1){if(e==null)return"--";const a=t?"~":"";return e>=1e3?`${a}${(e/1e3).toFixed(1)}s`:`${a}${e}ms`}_rateClass(e){return e>=95?"rate-good":e>=90?"rate-warn":"rate-bad"}_renderStats(){const e=this._successRate,t=this._latencyPercentiles,a=this._traces.length<10,r=this._deliveryStats?.total??this._traces.length;return i`
84
+ <div class="stats-row">
85
+ <ic-stat-card
86
+ label="Success Rate"
87
+ .value=${`${e}%`}
88
+ ></ic-stat-card>
89
+ <ic-stat-card
90
+ label="P50 Latency"
91
+ .value=${t?this._formatLatency(t.p50,a):"--"}
92
+ ></ic-stat-card>
93
+ <ic-stat-card
94
+ label="P95 Latency"
95
+ .value=${t?this._formatLatency(t.p95,a):"--"}
96
+ ></ic-stat-card>
97
+ <ic-stat-card
98
+ label="P99 Latency"
99
+ .value=${t?this._formatLatency(t.p99,a):"--"}
100
+ ></ic-stat-card>
101
+ <ic-stat-card
102
+ label="Total Deliveries"
103
+ .value=${this._fmtNum.format(r)}
104
+ ></ic-stat-card>
105
+ </div>
106
+ ${this._channelRates.length>1?i`
107
+ <div class="channel-rates">
108
+ ${this._channelRates.map(s=>i`
109
+ <span class="channel-rate">
110
+ ${s.channel}:
111
+ <span class="channel-rate-value ${this._rateClass(s.rate)}">${s.rate}%</span>
112
+ </span>
113
+ `)}
114
+ </div>
115
+ `:m}
116
+ `}_renderFilters(){const e=this._filteredTraces;return i`
117
+ <div class="filter-row">
118
+ <input
119
+ class="filter-input"
120
+ type="text"
121
+ placeholder="Search traces..."
122
+ .value=${this._searchQuery}
123
+ @input=${this._onSearchInput}
124
+ />
125
+ <select class="filter-select" @change=${this._onStatusFilter}>
126
+ <option value="all">All Status</option>
127
+ <option value="success" ?selected=${this._statusFilter==="success"}>Success</option>
128
+ <option value="failed" ?selected=${this._statusFilter==="failed"}>Failed</option>
129
+ <option value="timeout" ?selected=${this._statusFilter==="timeout"}>Timeout</option>
130
+ </select>
131
+ <select class="filter-select" @change=${this._onChannelFilter}>
132
+ <option value="all">All Channels</option>
133
+ ${this._uniqueChannels.map(t=>i`<option value=${t} ?selected=${this._channelFilter===t}>${t}</option>`)}
134
+ </select>
135
+ <span class="filter-count">Showing ${e.length} of ${this._traces.length} traces</span>
136
+ </div>
137
+ `}_renderTraceTable(){const e=this._filteredTraces;return e.length===0?i`<ic-empty-state icon="activity" message="No delivery traces match your filters"></ic-empty-state>`:i`
138
+ <div class="trace-table" role="table" aria-label="Delivery traces">
139
+ <div class="table-header" role="row">
140
+ <div class="cell" role="columnheader">Time</div>
141
+ <div class="cell" role="columnheader">Channel</div>
142
+ <div class="cell" role="columnheader">Message</div>
143
+ <div class="cell" role="columnheader">Status</div>
144
+ <div class="cell" role="columnheader">Latency</div>
145
+ <div class="cell" role="columnheader">Steps</div>
146
+ </div>
147
+ ${e.map(t=>i`
148
+ <ic-delivery-row
149
+ .trace=${t}
150
+ @trace-click=${this._onTraceClick}
151
+ ></ic-delivery-row>
152
+ `)}
153
+ </div>
154
+ `}_renderDetailDrawer(){const e=this._selectedTrace;if(!e)return m;const t=e.steps??[],a=new Date(e.timestamp).toLocaleString();return i`
155
+ <ic-detail-panel
156
+ ?open=${this._detailOpen}
157
+ .panelTitle=${"Trace "+e.traceId.slice(0,16)}
158
+ @close=${this._closeDetail}
159
+ >
160
+ <div class="detail-cards">
161
+ <div class="detail-card">
162
+ <div class="detail-card-label">Channel</div>
163
+ <div class="detail-card-value">${e.channelType}</div>
164
+ </div>
165
+ <div class="detail-card">
166
+ <div class="detail-card-label">Status</div>
167
+ <div class="detail-card-value status-${e.status}">${e.status}</div>
168
+ </div>
169
+ <div class="detail-card">
170
+ <div class="detail-card-label">Latency</div>
171
+ <div class="detail-card-value">${this._formatLatency(e.latencyMs)}</div>
172
+ </div>
173
+ <div class="detail-card">
174
+ <div class="detail-card-label">Timestamp</div>
175
+ <div class="detail-card-value">${a}</div>
176
+ </div>
177
+ </div>
178
+
179
+ <div class="section-title">Execution Timeline</div>
180
+ ${t.length>0?i`<ic-trace-timeline .steps=${t}></ic-trace-timeline>`:i`<p class="no-steps">No step details available</p>`}
181
+ </ic-detail-panel>
182
+ `}render(){return this._loadState==="loading"&&!this.rpcClient?i`<ic-skeleton-view variant="table"></ic-skeleton-view>`:this._loadState==="error"?i`
183
+ <div class="error-container">
184
+ <span class="error-message">Failed to load delivery data</span>
185
+ <button class="retry-btn" @click=${()=>this._tryLoad()}>Retry</button>
186
+ </div>
187
+ `:i`
188
+ <div class="delivery-view">
189
+ <div class="header">
190
+ <span class="header-title">Delivery</span>
191
+ <ic-time-range-picker
192
+ .selected=${this._selectedRange}
193
+ @time-range-change=${this._onTimeRangeChange}
194
+ ></ic-time-range-picker>
195
+ </div>
196
+ ${this._renderStats()}
197
+ ${this._renderFilters()}
198
+ ${this._renderTraceTable()}
199
+ ${this._renderDetailDrawer()}
200
+ </div>
201
+ `}};l.styles=[_,x,g`
202
+ :host { display: block; }
203
+
204
+ .delivery-view { padding: 0; }
205
+
206
+ .header {
207
+ display: flex;
208
+ justify-content: space-between;
209
+ align-items: center;
210
+ margin-bottom: var(--ic-space-lg);
211
+ flex-wrap: wrap;
212
+ gap: var(--ic-space-sm);
213
+ }
214
+
215
+ .header-title {
216
+ font-size: var(--ic-text-base);
217
+ font-weight: 600;
218
+ color: var(--ic-text);
219
+ }
220
+
221
+ .stats-row {
222
+ display: grid;
223
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
224
+ gap: var(--ic-space-md);
225
+ margin-bottom: var(--ic-space-lg);
226
+ }
227
+
228
+ .filter-row {
229
+ display: flex;
230
+ gap: var(--ic-space-sm);
231
+ flex-wrap: wrap;
232
+ margin-bottom: var(--ic-space-md);
233
+ align-items: center;
234
+ }
235
+
236
+ .filter-input {
237
+ background: var(--ic-surface);
238
+ border: 1px solid var(--ic-border);
239
+ border-radius: var(--ic-radius-md);
240
+ color: var(--ic-text);
241
+ padding: 0.375rem 0.625rem;
242
+ font-size: var(--ic-text-sm);
243
+ font-family: inherit;
244
+ min-width: 12rem;
245
+ }
246
+
247
+ .filter-input::placeholder { color: var(--ic-text-dim); }
248
+ .filter-input:focus-visible { outline: 2px solid var(--ic-accent); outline-offset: 2px; }
249
+
250
+ .filter-select {
251
+ background: var(--ic-surface);
252
+ border: 1px solid var(--ic-border);
253
+ border-radius: var(--ic-radius-md);
254
+ color: var(--ic-text);
255
+ padding: 0.375rem 0.625rem;
256
+ font-size: var(--ic-text-sm);
257
+ cursor: pointer;
258
+ font-family: inherit;
259
+ }
260
+
261
+ .filter-select:focus-visible { outline: 2px solid var(--ic-accent); outline-offset: 2px; }
262
+
263
+ .filter-count {
264
+ font-size: var(--ic-text-xs);
265
+ color: var(--ic-text-dim);
266
+ margin-left: auto;
267
+ }
268
+
269
+ .trace-table {
270
+ display: grid;
271
+ grid-template-columns: auto auto 1fr auto auto auto;
272
+ gap: 0;
273
+ font-size: var(--ic-text-sm);
274
+ }
275
+
276
+ .table-header {
277
+ display: contents;
278
+ }
279
+
280
+ .table-header > .cell {
281
+ font-weight: 600;
282
+ color: var(--ic-text-dim);
283
+ text-transform: uppercase;
284
+ letter-spacing: 0.05em;
285
+ font-size: var(--ic-text-xs);
286
+ padding: var(--ic-space-sm) var(--ic-space-md);
287
+ border-bottom: 1px solid var(--ic-border);
288
+ }
289
+
290
+ .section { margin-bottom: var(--ic-space-xl); }
291
+
292
+ .section-title {
293
+ font-size: var(--ic-text-base);
294
+ font-weight: 600;
295
+ color: var(--ic-text);
296
+ margin-bottom: var(--ic-space-md);
297
+ }
298
+
299
+ .card {
300
+ background: var(--ic-surface);
301
+ border: 1px solid var(--ic-border);
302
+ border-radius: var(--ic-radius-lg);
303
+ padding: var(--ic-space-lg);
304
+ }
305
+
306
+ /* Detail drawer content */
307
+ .detail-cards {
308
+ display: grid;
309
+ grid-template-columns: 1fr 1fr;
310
+ gap: var(--ic-space-sm);
311
+ margin-bottom: var(--ic-space-lg);
312
+ }
313
+
314
+ .detail-card {
315
+ background: var(--ic-surface-2, #1f2937);
316
+ border: 1px solid var(--ic-border);
317
+ border-radius: var(--ic-radius-md);
318
+ padding: var(--ic-space-sm) var(--ic-space-md);
319
+ }
320
+
321
+ .detail-card-label {
322
+ font-size: var(--ic-text-xs);
323
+ color: var(--ic-text-dim);
324
+ text-transform: uppercase;
325
+ letter-spacing: 0.05em;
326
+ }
327
+
328
+ .detail-card-value {
329
+ font-size: var(--ic-text-sm);
330
+ font-weight: 600;
331
+ color: var(--ic-text);
332
+ margin-top: 2px;
333
+ }
334
+
335
+ .detail-card-value.status-success { color: var(--ic-success); }
336
+ .detail-card-value.status-failed { color: var(--ic-error); }
337
+ .detail-card-value.status-timeout { color: var(--ic-warning); }
338
+
339
+ .no-steps {
340
+ font-size: var(--ic-text-sm);
341
+ color: var(--ic-text-dim);
342
+ font-style: italic;
343
+ }
344
+
345
+ /* Per-channel success rates */
346
+ .channel-rates {
347
+ display: flex;
348
+ gap: var(--ic-space-md);
349
+ flex-wrap: wrap;
350
+ margin-top: var(--ic-space-sm);
351
+ }
352
+
353
+ .channel-rate {
354
+ display: flex;
355
+ align-items: center;
356
+ gap: var(--ic-space-xs);
357
+ font-size: var(--ic-text-xs);
358
+ color: var(--ic-text-dim);
359
+ }
360
+
361
+ .channel-rate-value {
362
+ font-weight: 600;
363
+ font-family: var(--ic-font-mono, ui-monospace, monospace);
364
+ }
365
+
366
+ .channel-rate-value.rate-good { color: var(--ic-success); }
367
+ .channel-rate-value.rate-warn { color: var(--ic-warning); }
368
+ .channel-rate-value.rate-bad { color: var(--ic-error); }
369
+
370
+ .error-container {
371
+ display: flex;
372
+ flex-direction: column;
373
+ align-items: center;
374
+ gap: 0.75rem;
375
+ padding: 3rem;
376
+ }
377
+
378
+ .error-message { color: var(--ic-error); font-size: 0.875rem; }
379
+
380
+ .retry-btn {
381
+ padding: 0.5rem 1rem;
382
+ background: var(--ic-surface);
383
+ border: 1px solid var(--ic-border);
384
+ border-radius: 0.375rem;
385
+ color: var(--ic-text);
386
+ font-size: 0.8125rem;
387
+ cursor: pointer;
388
+ font-family: inherit;
389
+ }
390
+
391
+ .retry-btn:hover { background: var(--ic-surface-alt, #374151); }
392
+ `];c([p({attribute:!1})],l.prototype,"rpcClient",2);c([d()],l.prototype,"_loadState",2);c([d()],l.prototype,"_sinceMs",2);c([d()],l.prototype,"_selectedRange",2);c([d()],l.prototype,"_searchQuery",2);c([d()],l.prototype,"_statusFilter",2);c([d()],l.prototype,"_channelFilter",2);c([d()],l.prototype,"_deliveryStats",2);c([d()],l.prototype,"_traces",2);c([d()],l.prototype,"_selectedTrace",2);c([d()],l.prototype,"_detailOpen",2);c([d()],l.prototype,"_latencyPercentiles",2);l=c([b("ic-delivery-view")],l);export{l as IcDeliveryView};
@@ -0,0 +1,231 @@
1
+ import{a as g,S as m,b as l,A as _,s as f,f as b,i as y,n as u,r as o,t as x}from"./index-CEcM1R_C.js";import{a as d,d as v}from"./observability-types-D7jUtSde.js";import"./ic-time-range-picker-CypCT68y.js";import"./ic-tag-CPPUnDLF.js";import"./ic-relative-time-3FqpjeAI.js";import"./ic-empty-state-60l2ePhd.js";import"./ic-icon-xeGTVhVG.js";var S=Object.defineProperty,C=Object.getOwnPropertyDescriptor,a=(t,e,i,n)=>{for(var r=n>1?void 0:n?C(e,i):e,c=t.length-1,p;c>=0;c--)(p=t[c])&&(r=(n?p(e,i,r):p(r))||r);return n&&r&&S(e,i,r),r};const w=3e4,D=6048e5,h={info:"var(--ic-text-dim)",warn:"var(--ic-warning)",error:"var(--ic-error)"};let s=class extends g{constructor(){super(...arguments),this.rpcClient=null,this.eventDispatcher=null,this._sse=null,this._reloadDebounce=null,this._loadState="loading",this._sinceMs=D,this._selectedRange="7d",this._events=[],this._selectedCategories=new Set,this._selectedSeverities=new Set,this._eventCounts={},this._refreshInterval=null,this._rpcStatusUnsub=null}connectedCallback(){super.connectedCallback(),this._initSse()}_initSse(){!this.eventDispatcher||this._sse||(this._sse=new m(this,this.eventDispatcher,{"observability:reset":()=>{this._scheduleReload()}}))}_scheduleReload(t=300){this._reloadDebounce!==null&&clearTimeout(this._reloadDebounce),this._reloadDebounce=setTimeout(()=>{this._reloadDebounce=null,this._loadData()},t)}disconnectedCallback(){super.disconnectedCallback(),this._reloadDebounce!==null&&(clearTimeout(this._reloadDebounce),this._reloadDebounce=null),this._refreshInterval!==null&&(clearInterval(this._refreshInterval),this._refreshInterval=null),this._rpcStatusUnsub?.(),this._rpcStatusUnsub=null}willUpdate(t){t.has("rpcClient")&&this.rpcClient&&this._tryLoad(),t.has("eventDispatcher")&&this.eventDispatcher&&!this._sse&&this._initSse()}_tryLoad(){if(!this.rpcClient){this._loadState="loaded";return}this._rpcStatusUnsub?.(),this.rpcClient.status==="connected"?this._startLoading():this._rpcStatusUnsub=this.rpcClient.onStatusChange(t=>{t==="connected"&&this._startLoading()})}_startLoading(){this._loadData(),this._refreshInterval===null&&(this._refreshInterval=setInterval(()=>{this._loadData()},w))}async _loadData(){if(!this.rpcClient||this.rpcClient.status!=="connected"){this._loadState="loaded";return}const t=this.rpcClient;try{const e=await t.call("obs.diagnostics",{sinceMs:this._sinceMs,limit:500});if(Array.isArray(e))this._events=e,this._eventCounts=this._computeCounts(e);else{const i=Array.isArray(e.events)?e.events:[];this._events=i,this._eventCounts=e.counts??this._computeCounts(i)}this._loadState="loaded"}catch{this._loadState="error"}}_computeCounts(t){const e={};for(const i of t)e[i.category]=(e[i.category]??0)+1;return e}get _filteredEvents(){let t=this._events;return this._selectedCategories.size>0&&(t=t.filter(e=>this._selectedCategories.has(e.category))),this._selectedSeverities.size>0&&(t=t.filter(e=>this._selectedSeverities.has(d(e)))),t.sort((e,i)=>i.timestamp-e.timestamp)}get _categoryOptions(){return[...new Set(this._events.map(e=>e.category))].sort().map(e=>({value:e,label:`${e} (${this._eventCounts[e]??0})`}))}get _severityOptions(){return[...new Set(this._events.map(e=>d(e)))].sort().map(e=>({value:e,label:e,color:h[e]}))}_onTimeRangeChange(t){this._sinceMs=t.detail.sinceMs,this._selectedRange=t.detail.label,this._loadData()}_onCategoryFilter(t){this._selectedCategories=t.detail.selected}_onSeverityFilter(t){this._selectedSeverities=t.detail.selected}_exportJsonl(){const t=this._filteredEvents;if(t.length===0)return;const e=t.map(c=>JSON.stringify(c)).join(`
2
+ `),i=new Blob([e],{type:"application/jsonl"}),n=URL.createObjectURL(i),r=document.createElement("a");r.href=n,r.download=`diagnostics-${new Date().toISOString().slice(0,10)}.jsonl`,r.click(),URL.revokeObjectURL(n)}_renderFilters(){return l`
3
+ <div class="filter-section">
4
+ <div class="filter-group">
5
+ <span class="filter-label">Category</span>
6
+ <ic-filter-chips
7
+ .options=${this._categoryOptions}
8
+ .selected=${this._selectedCategories}
9
+ @filter-change=${this._onCategoryFilter}
10
+ ></ic-filter-chips>
11
+ </div>
12
+ <div class="filter-group">
13
+ <span class="filter-label">Severity</span>
14
+ <ic-filter-chips
15
+ .options=${this._severityOptions}
16
+ .selected=${this._selectedSeverities}
17
+ @filter-change=${this._onSeverityFilter}
18
+ ></ic-filter-chips>
19
+ </div>
20
+ </div>
21
+ `}_renderSummary(){const t=this._filteredEvents;return l`
22
+ <div class="summary-bar">
23
+ Showing ${t.length} of ${this._events.length} events
24
+ </div>
25
+ `}_renderEventTable(){const t=this._filteredEvents;return t.length===0?l`<ic-empty-state icon="activity" message="No diagnostic events match your filters"></ic-empty-state>`:l`
26
+ <div class="event-table" role="table" aria-label="Diagnostic events">
27
+ <div class="table-header" role="row">
28
+ <div class="cell" role="columnheader">Timestamp</div>
29
+ <div class="cell" role="columnheader">Category</div>
30
+ <div class="cell" role="columnheader">Message</div>
31
+ <div class="cell" role="columnheader">Severity</div>
32
+ </div>
33
+ ${t.map(e=>l`
34
+ <div class="event-row" role="row">
35
+ <div class="cell" role="cell">
36
+ <ic-relative-time .timestamp=${e.timestamp}></ic-relative-time>
37
+ </div>
38
+ <div class="cell" role="cell">
39
+ <ic-tag>${e.category}</ic-tag>
40
+ </div>
41
+ <div class="cell cell-message" role="cell" title=${v(e)}>
42
+ ${v(e)}
43
+ </div>
44
+ <div class="cell" role="cell">
45
+ <ic-tag
46
+ style="--tag-color: ${h[d(e)]??"var(--ic-text-dim)"}"
47
+ >${d(e)}</ic-tag>
48
+ </div>
49
+ </div>
50
+ `)}
51
+ </div>
52
+ `}render(){if(this._loadState==="loading"&&!this.rpcClient)return l`<ic-skeleton-view variant="table"></ic-skeleton-view>`;if(this._loadState==="error")return l`
53
+ <div class="error-container">
54
+ <span class="error-message">Failed to load diagnostics data</span>
55
+ <button class="retry-btn" @click=${()=>this._tryLoad()}>Retry</button>
56
+ </div>
57
+ `;const t=this._filteredEvents;return l`
58
+ <div class="diagnostics-view">
59
+ <div class="header">
60
+ <div class="header-left">
61
+ <span class="header-title">Diagnostics</span>
62
+ </div>
63
+ <div class="header-right">
64
+ <button
65
+ class="export-btn"
66
+ ?disabled=${t.length===0}
67
+ @click=${this._exportJsonl}
68
+ >
69
+ Export JSONL (${t.length} events)
70
+ </button>
71
+ <ic-time-range-picker
72
+ .selected=${this._selectedRange}
73
+ @time-range-change=${this._onTimeRangeChange}
74
+ ></ic-time-range-picker>
75
+ </div>
76
+ </div>
77
+ ${this._events.length>0?this._renderFilters():_}
78
+ ${this._renderSummary()}
79
+ ${this._renderEventTable()}
80
+ </div>
81
+ `}};s.styles=[f,b,y`
82
+ :host { display: block; }
83
+
84
+ .diagnostics-view { padding: 0; }
85
+
86
+ .header {
87
+ display: flex;
88
+ justify-content: space-between;
89
+ align-items: center;
90
+ margin-bottom: var(--ic-space-lg);
91
+ flex-wrap: wrap;
92
+ gap: var(--ic-space-sm);
93
+ }
94
+
95
+ .header-left {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: var(--ic-space-md);
99
+ }
100
+
101
+ .header-title {
102
+ font-size: var(--ic-text-base);
103
+ font-weight: 600;
104
+ color: var(--ic-text);
105
+ }
106
+
107
+ .header-right {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: var(--ic-space-sm);
111
+ }
112
+
113
+ .export-btn {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: var(--ic-space-xs);
117
+ padding: 0.375rem 0.75rem;
118
+ background: var(--ic-surface);
119
+ border: 1px solid var(--ic-border);
120
+ border-radius: var(--ic-radius-md);
121
+ color: var(--ic-text);
122
+ font-size: var(--ic-text-sm);
123
+ cursor: pointer;
124
+ font-family: inherit;
125
+ transition: background var(--ic-transition), border-color var(--ic-transition);
126
+ }
127
+
128
+ .export-btn:hover:not(:disabled) {
129
+ background: var(--ic-surface-2, #1f2937);
130
+ border-color: var(--ic-text-dim);
131
+ }
132
+
133
+ .export-btn:disabled {
134
+ opacity: 0.5;
135
+ cursor: not-allowed;
136
+ }
137
+
138
+ .export-btn:focus-visible { outline: 2px solid var(--ic-accent); outline-offset: 2px; }
139
+
140
+ .filter-section {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: var(--ic-space-sm);
144
+ margin-bottom: var(--ic-space-md);
145
+ }
146
+
147
+ .filter-group {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: var(--ic-space-sm);
151
+ }
152
+
153
+ .filter-label {
154
+ font-size: var(--ic-text-xs);
155
+ color: var(--ic-text-dim);
156
+ text-transform: uppercase;
157
+ letter-spacing: 0.05em;
158
+ min-width: 5rem;
159
+ }
160
+
161
+ .summary-bar {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: var(--ic-space-sm);
165
+ margin-bottom: var(--ic-space-md);
166
+ font-size: var(--ic-text-sm);
167
+ color: var(--ic-text-dim);
168
+ }
169
+
170
+ .event-table {
171
+ display: grid;
172
+ grid-template-columns: auto auto 1fr auto;
173
+ gap: 0;
174
+ font-size: var(--ic-text-sm);
175
+ }
176
+
177
+ .table-header {
178
+ display: contents;
179
+ }
180
+
181
+ .table-header > .cell {
182
+ font-weight: 600;
183
+ color: var(--ic-text-dim);
184
+ text-transform: uppercase;
185
+ letter-spacing: 0.05em;
186
+ font-size: var(--ic-text-xs);
187
+ padding: var(--ic-space-sm) var(--ic-space-md);
188
+ border-bottom: 1px solid var(--ic-border);
189
+ }
190
+
191
+ .event-row {
192
+ display: contents;
193
+ }
194
+
195
+ .event-row > .cell {
196
+ padding: var(--ic-space-xs) var(--ic-space-md);
197
+ border-bottom: 1px solid var(--ic-border);
198
+ color: var(--ic-text);
199
+ display: flex;
200
+ align-items: center;
201
+ }
202
+
203
+ .cell-message {
204
+ overflow: hidden;
205
+ text-overflow: ellipsis;
206
+ white-space: nowrap;
207
+ }
208
+
209
+ .error-container {
210
+ display: flex;
211
+ flex-direction: column;
212
+ align-items: center;
213
+ gap: 0.75rem;
214
+ padding: 3rem;
215
+ }
216
+
217
+ .error-message { color: var(--ic-error); font-size: 0.875rem; }
218
+
219
+ .retry-btn {
220
+ padding: 0.5rem 1rem;
221
+ background: var(--ic-surface);
222
+ border: 1px solid var(--ic-border);
223
+ border-radius: 0.375rem;
224
+ color: var(--ic-text);
225
+ font-size: 0.8125rem;
226
+ cursor: pointer;
227
+ font-family: inherit;
228
+ }
229
+
230
+ .retry-btn:hover { background: var(--ic-surface-alt, #374151); }
231
+ `];a([u({attribute:!1})],s.prototype,"rpcClient",2);a([u({attribute:!1})],s.prototype,"eventDispatcher",2);a([o()],s.prototype,"_loadState",2);a([o()],s.prototype,"_sinceMs",2);a([o()],s.prototype,"_selectedRange",2);a([o()],s.prototype,"_events",2);a([o()],s.prototype,"_selectedCategories",2);a([o()],s.prototype,"_selectedSeverities",2);a([o()],s.prototype,"_eventCounts",2);s=a([x("ic-diagnostics-view")],s);export{s as IcDiagnosticsView};
@@ -0,0 +1 @@
1
+ const s={CHILD:2},$=r=>(...t)=>({_$litDirective$:r,values:t});class _{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{$ as e,_ as i,s as t};