comisai 1.0.24 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/node_modules/@comis/agent/package.json +1 -1
  2. package/node_modules/@comis/channels/package.json +1 -1
  3. package/node_modules/@comis/cli/package.json +1 -1
  4. package/node_modules/@comis/core/dist/bootstrap.js +5 -0
  5. package/node_modules/@comis/core/dist/config/env-layer.d.ts +31 -0
  6. package/node_modules/@comis/core/dist/config/env-layer.js +41 -0
  7. package/node_modules/@comis/core/dist/config/layered.d.ts +9 -0
  8. package/node_modules/@comis/core/dist/config/layered.js +11 -0
  9. package/node_modules/@comis/core/package.json +1 -1
  10. package/node_modules/@comis/daemon/dist/daemon.js +3 -0
  11. package/node_modules/@comis/daemon/package.json +1 -1
  12. package/node_modules/@comis/gateway/package.json +1 -1
  13. package/node_modules/@comis/infra/package.json +1 -1
  14. package/node_modules/@comis/memory/package.json +1 -1
  15. package/node_modules/@comis/scheduler/package.json +1 -1
  16. package/node_modules/@comis/shared/package.json +1 -1
  17. package/node_modules/@comis/skills/package.json +1 -1
  18. package/node_modules/@comis/web/dist/assets/{agent-detail-BG9MGWWj.js → agent-detail-ru-AhppM.js} +270 -270
  19. package/node_modules/@comis/web/dist/assets/agent-editor-hjwRuFVp.js +2173 -0
  20. package/node_modules/@comis/web/dist/assets/{agent-list-LHCJ4rw2.js → agent-list-6Uotjatr.js} +170 -170
  21. package/node_modules/@comis/web/dist/assets/{approvals-q9VH_IKr.js → approvals-C-K6hN2U.js} +13 -13
  22. package/node_modules/@comis/web/dist/assets/billing-view-CxysXH0p.js +375 -0
  23. package/node_modules/@comis/web/dist/assets/{channel-detail-CaInesJM.js → channel-detail-BBCKtmne.js} +265 -265
  24. package/node_modules/@comis/web/dist/assets/channel-list-FkfeOLBQ.js +323 -0
  25. package/node_modules/@comis/web/dist/assets/{chat-console-CNmzl0JW.js → chat-console-BumBaIgO.js} +243 -246
  26. package/node_modules/@comis/web/dist/assets/{config-editor-DX4ITw6y.js → config-editor-C9BSwHGy.js} +477 -477
  27. package/node_modules/@comis/web/dist/assets/{context-dag-browser-BwiaF5tf.js → context-dag-browser-BHm00mJD.js} +105 -105
  28. package/node_modules/@comis/web/dist/assets/{context-engine-BZ5Am6hA.js → context-engine-BENY3pWE.js} +136 -136
  29. package/node_modules/@comis/web/dist/assets/decorate-BvWYovGE.js +38 -0
  30. package/node_modules/@comis/web/dist/assets/{delivery-view-OfBZof-m.js → delivery-view-BCnkPsAp.js} +134 -134
  31. package/node_modules/@comis/web/dist/assets/{diagnostics-view-YFwCxgr2.js → diagnostics-view-C_jQFG2H.js} +82 -82
  32. package/node_modules/@comis/web/dist/assets/directive-BOYXJ-K-.js +1 -0
  33. package/node_modules/@comis/web/dist/assets/{extract-variables-BM5qyK-s.js → extract-variables-B7-Doo7l.js} +39 -39
  34. package/node_modules/@comis/web/dist/assets/{ic-array-editor-B7m6x7-S.js → ic-array-editor-BLoEyeLS.js} +29 -29
  35. package/node_modules/@comis/web/dist/assets/{ic-breadcrumb-CUMpp3BL.js → ic-breadcrumb-DqN6G3gc.js} +16 -16
  36. package/node_modules/@comis/web/dist/assets/{ic-budget-segment-bar-BtJ6x5mN.js → ic-budget-segment-bar-zLsMzjDO.js} +20 -20
  37. package/node_modules/@comis/web/dist/assets/ic-chat-message-FdQcZsSQ.js +352 -0
  38. package/node_modules/@comis/web/dist/assets/{ic-confirm-dialog-CCDbB04e.js → ic-confirm-dialog-DGlPbV1T.js} +26 -26
  39. package/node_modules/@comis/web/dist/assets/{ic-connection-dot-CnT1b8xr.js → ic-connection-dot-BgYiK2N4.js} +13 -13
  40. package/node_modules/@comis/web/dist/assets/ic-data-table-CKIvr-ag.js +277 -0
  41. package/node_modules/@comis/web/dist/assets/ic-delivery-row-B3YwjjuM.js +67 -0
  42. package/node_modules/@comis/web/dist/assets/{ic-detail-panel-BF83r-if.js → ic-detail-panel-DiCe4hLr.js} +27 -27
  43. package/node_modules/@comis/web/dist/assets/{ic-empty-state-60l2ePhd.js → ic-empty-state-CM3Wbj2f.js} +19 -19
  44. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-ByRjij68.js +359 -0
  45. package/node_modules/@comis/web/dist/assets/ic-icon-BGNCCPpZ.js +33 -0
  46. package/node_modules/@comis/web/dist/assets/{ic-layer-waterfall-COvEYMg5.js → ic-layer-waterfall-WkaFyu-l.js} +18 -18
  47. package/node_modules/@comis/web/dist/assets/ic-relative-time-B3UAnTqg.js +12 -0
  48. package/node_modules/@comis/web/dist/assets/{ic-search-input-CSOxY9g7.js → ic-search-input-B02AGw1i.js} +22 -22
  49. package/node_modules/@comis/web/dist/assets/{ic-select-Ce-Raudx.js → ic-select-BqfZISjw.js} +29 -29
  50. package/node_modules/@comis/web/dist/assets/ic-tabs-yBjkWKJH.js +95 -0
  51. package/node_modules/@comis/web/dist/assets/ic-tag-CvMVQFRR.js +33 -0
  52. package/node_modules/@comis/web/dist/assets/{ic-time-range-picker-CypCT68y.js → ic-time-range-picker-DXbYeBmY.js} +31 -31
  53. package/node_modules/@comis/web/dist/assets/{ic-tool-call-7MaXSsCW.js → ic-tool-call-DMPHsLyx.js} +51 -51
  54. package/node_modules/@comis/web/dist/assets/index-CVEaS9aY.css +2 -0
  55. package/node_modules/@comis/web/dist/assets/index-FLPhHz8p.js +2792 -0
  56. package/node_modules/@comis/web/dist/assets/{mcp-management-BNZPnpDn.js → mcp-management-5jyScQis.js} +209 -209
  57. package/node_modules/@comis/web/dist/assets/{media-config-BBvTYxOX.js → media-config-J9oT9PPs.js} +154 -154
  58. package/node_modules/@comis/web/dist/assets/{media-test-BkK3RCRK.js → media-test-DGTCtM8-.js} +259 -259
  59. package/node_modules/@comis/web/dist/assets/{memory-inspector-1hDGCGat.js → memory-inspector-D5Re9ptG.js} +450 -450
  60. package/node_modules/@comis/web/dist/assets/{message-center-CXefwsUu.js → message-center-cRLK6ZmG.js} +290 -290
  61. package/node_modules/@comis/web/dist/assets/{models-C1qcU_j3.js → models-D5vu07MR.js} +371 -371
  62. package/node_modules/@comis/web/dist/assets/observability-types-D0tkwElU.js +1 -0
  63. package/node_modules/@comis/web/dist/assets/{observe-view-C0VBhX4C.js → observe-view-CalNNEmd.js} +399 -399
  64. package/node_modules/@comis/web/dist/assets/pipeline-builder-DUYDGwZf.js +1495 -0
  65. package/node_modules/@comis/web/dist/assets/{pipeline-history-DkfOQ6SW.js → pipeline-history-BAO8brOe.js} +124 -124
  66. package/node_modules/@comis/web/dist/assets/{pipeline-history-detail-hyHgD0ai.js → pipeline-history-detail-DectIoQt.js} +65 -65
  67. package/node_modules/@comis/web/dist/assets/{pipeline-list-BPW8hV-q.js → pipeline-list-BHlaBKww.js} +227 -227
  68. package/node_modules/@comis/web/dist/assets/{pipeline-monitor-Bip16T7e.js → pipeline-monitor-BhtpNEHf.js} +298 -298
  69. package/node_modules/@comis/web/dist/assets/{scheduler-BGgwKd06.js → scheduler-VafN_8xi.js} +486 -486
  70. package/node_modules/@comis/web/dist/assets/{security-D15st4xx.js → security-QQXMRTlo.js} +389 -389
  71. package/node_modules/@comis/web/dist/assets/{session-detail-SGEYNJ0M.js → session-detail-BpZ_8Yih.js} +294 -294
  72. package/node_modules/@comis/web/dist/assets/session-key-parser-Dkqcj2Ss.js +1 -0
  73. package/node_modules/@comis/web/dist/assets/session-list-DfCm8Cec.js +231 -0
  74. package/node_modules/@comis/web/dist/assets/{setup-wizard-nT0tz9QP.js → setup-wizard-C-z477CG.js} +486 -494
  75. package/node_modules/@comis/web/dist/assets/{skills-D8yVfSUy.js → skills-BCOGPf6s.js} +329 -329
  76. package/node_modules/@comis/web/dist/assets/{subagents-HHXMeHYo.js → subagents-l-auUraL.js} +74 -74
  77. package/node_modules/@comis/web/dist/assets/{workspace-manager-BQlr10iH.js → workspace-manager-DlvBixiq.js} +236 -236
  78. package/node_modules/@comis/web/dist/index.html +3 -2
  79. package/node_modules/@comis/web/package.json +1 -1
  80. package/package.json +15 -15
  81. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +0 -2173
  82. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +0 -375
  83. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +0 -323
  84. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +0 -1
  85. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +0 -352
  86. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +0 -277
  87. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +0 -67
  88. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +0 -359
  89. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +0 -33
  90. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +0 -12
  91. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +0 -95
  92. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +0 -33
  93. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +0 -2830
  94. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +0 -1
  95. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +0 -1
  96. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +0 -1496
  97. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +0 -1
  98. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +0 -231
@@ -1,296 +1,4 @@
1
- import{a as u,I as p,b as o,A as v,s as h,f as g,i as f,n as b,r as n,t as x}from"./index-CEcM1R_C.js";import{p as _,f as y,c as $}from"./session-key-parser-DPORMVyU.js";import{c as w}from"./ic-tool-call-7MaXSsCW.js";import"./ic-breadcrumb-CUMpp3BL.js";import"./ic-tag-CPPUnDLF.js";import"./ic-relative-time-3FqpjeAI.js";import"./ic-budget-segment-bar-BtJ6x5mN.js";import"./ic-layer-waterfall-COvEYMg5.js";import"./ic-chat-message-CFyDJd0z.js";import"./ic-confirm-dialog-CCDbB04e.js";import"./ic-empty-state-60l2ePhd.js";import"./ic-icon-xeGTVhVG.js";import"./directive-DoeGSK_T.js";var C=Object.defineProperty,S=Object.getOwnPropertyDescriptor,i=(t,e,r,s)=>{for(var c=s>1?void 0:s?S(e,r):e,l=t.length-1,m;l>=0;l--)(m=t[l])&&(c=(s?m(e,r,c):m(c))||c);return s&&c&&C(e,r,c),c};function d(t){if(t>=1e3){const e=t/1e3;return e>=100?`${Math.round(e)}K`:`${e.toFixed(1)}K`}return String(t)}function k(t){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(t)}let a=class extends u{constructor(){super(...arguments),this.apiClient=null,this.rpcClient=null,this.sessionKey="",this._session=null,this._messages=[],this._loading=!1,this._error="",this._showConfirm=!1,this._confirmAction="",this._activeTab="conversation",this._contextLoaded=!1,this._metricsLoaded=!1,this._pipelineSnapshots=[],this._dagCompactions=[],this._selectedSnapshot=null,this._sessionBilling=null}connectedCallback(){super.connectedCallback()}updated(t){(t.has("apiClient")||t.has("sessionKey"))&&this.apiClient&&this.sessionKey&&this._loadSession()}async _loadSession(){if(!(!this.apiClient||!this.sessionKey)){this._loading=!0,this._error="";try{const t=await this.apiClient.getSessionDetail(this.sessionKey);this._session=t.session,this._messages=t.messages}catch{this._error="Failed to load session. Please try again."}finally{this._loading=!1}}}_switchTab(t){this._activeTab=t,t==="context"&&!this._contextLoaded&&this._loadContextData(),t==="metrics"&&!this._metricsLoaded&&this._loadMetricsData()}async _loadContextData(){if(!(!this.rpcClient||!this._session))try{const t=this._session.agentId,[e,r]=await Promise.all([this.rpcClient.call("obs.context.pipeline",{agentId:t,limit:100}),this.rpcClient.call("obs.context.dag",{agentId:t,limit:50})]),s=Array.isArray(e)?e:[];this._pipelineSnapshots=s.filter(l=>l.sessionKey===this.sessionKey);const c=Array.isArray(r)?r:[];this._dagCompactions=c.filter(l=>l.sessionKey===this.sessionKey),this._pipelineSnapshots.length>0&&(this._selectedSnapshot=this._pipelineSnapshots[0]),this._contextLoaded=!0}catch{this._contextLoaded=!0}}async _loadMetricsData(){if(!this.rpcClient){this._metricsLoaded=!0;return}try{const t=await this.rpcClient.call("obs.billing.bySession",{sessionKey:this.sessionKey});this._sessionBilling=t??null}catch{this._sessionBilling=null}this._metricsLoaded=!0}_handleBreadcrumbNavigate(t){window.location.hash=`#/${t.detail}`}_showActionConfirm(t){this._confirmAction=t,this._showConfirm=!0}_handleConfirmCancel(){this._showConfirm=!1,this._confirmAction=""}async _handleConfirm(){if(this._showConfirm=!1,!!this.apiClient){try{this._confirmAction==="reset"?(await this.apiClient.resetSession(this.sessionKey),p.show("Session reset","success"),await this._loadSession()):this._confirmAction==="compact"?(await this.apiClient.compactSession(this.sessionKey),p.show("Session compacted","success"),await this._loadSession()):this._confirmAction==="delete"&&(await this.apiClient.deleteSession(this.sessionKey),p.show("Session deleted","success"),window.location.hash="#/sessions")}catch{p.show("Operation failed. Please try again.","error")}this._confirmAction=""}}async _handleExport(){if(this.apiClient)try{const t=await this.apiClient.exportSession(this.sessionKey),e=new Blob([t],{type:"application/jsonl"}),r=URL.createObjectURL(e),s=document.createElement("a");s.href=r,s.download=`session-${this.sessionKey}.jsonl`,s.click(),URL.revokeObjectURL(r),p.show("Session exported","success")}catch{p.show("Export failed. Please try again.","error")}}_truncateKey(t){return t.length>20?t.slice(0,16)+"...":t}_getBreadcrumbLabel(){const t=_(this.sessionKey);return t?y(t):this._truncateKey(this.sessionKey)}_isCompactionBoundary(t){if(t.role!=="system")return!1;const e=t.content.toLowerCase();return e.includes("compacted")||e.includes("summary")||e.includes("[compacted]")}_getConfirmProps(){switch(this._confirmAction){case"delete":return{title:"Delete Session",message:"Are you sure you want to delete this session? This action cannot be undone.",variant:"danger",label:"Delete"};case"compact":return{title:"Compact Session",message:"Are you sure you want to compact this session? Older messages will be summarized.",variant:"default",label:"Compact"};default:return{title:"Reset Session",message:"Are you sure you want to reset this session? All conversation history will be cleared.",variant:"default",label:"Reset"}}}_renderConversation(){return o`
2
- <div class="conversation">
3
- ${this._messages.map(t=>{if(this._isCompactionBoundary(t))return o`
4
- <div class="compaction-marker" data-testid="compaction-marker">
5
- <hr />
6
- <span>Context was compacted here</span>
7
- <hr />
8
- </div>
9
- `;if(t.role==="tool"){let e=t.content;try{e=JSON.parse(t.content)}catch{}return o`
10
- <ic-tool-call
11
- .toolName=${t.toolName??"tool"}
12
- .output=${e}
13
- .status=${"success"}
14
- .expanded=${!1}
15
- ></ic-tool-call>
16
- `}return o`
17
- <ic-chat-message
18
- .role=${t.role}
19
- .content=${w(t.content,t.role)}
20
- .timestamp=${t.timestamp}
21
- .showActions=${!1}
22
- ></ic-chat-message>
23
- `})}
24
- </div>
25
- `}_renderContextState(){if(!this._contextLoaded)return o`<div class="loading-container"><ic-loading size="md"></ic-loading></div>`;if(this._pipelineSnapshots.length===0)return o`<ic-empty-state
26
- icon="activity"
27
- message="No pipeline data for this session"
28
- ></ic-empty-state>`;const t=this._pipelineSnapshots[0],e=Math.max(0,t.tokensLoaded-t.tokensEvicted),r=[{label:"System",tokens:e,color:"var(--ic-accent)"},{label:"Evicted",tokens:t.tokensEvicted,color:"var(--ic-error)"},{label:"Masked",tokens:t.tokensMasked,color:"var(--ic-warning)"},{label:"Available",tokens:Math.max(0,Math.round((1-t.budgetUtilization)*(e+t.tokensEvicted+t.tokensMasked))),color:"var(--ic-surface-2, #1f2937)"}].filter(s=>s.tokens>0);return o`
29
- <!-- Latest snapshot summary -->
30
- <div class="context-summary">
31
- <div class="context-badge">
32
- Budget <span class="badge-value">${Math.round(t.budgetUtilization*100)}%</span>
33
- </div>
34
- <span class="cache-badge ${t.cacheHitTokens>0?"cache-badge--hit":"cache-badge--miss"}">
35
- ${t.cacheHitTokens>0?"Cache HIT":"Cache MISS"}
36
- </span>
37
- <div class="context-badge">
38
- Loaded <span class="badge-value">${d(t.tokensLoaded)}</span>
39
- </div>
40
- <div class="context-badge">
41
- Evicted <span class="badge-value">${d(t.tokensEvicted)}</span>
42
- </div>
43
- <div class="context-badge">
44
- Duration <span class="badge-value">${t.durationMs}ms</span>
45
- </div>
46
- </div>
47
-
48
- <!-- Budget segment bar -->
49
- <div class="budget-section">
50
- <div class="budget-section-title">Token Budget</div>
51
- <ic-budget-segment-bar .segments=${r}></ic-budget-segment-bar>
52
- </div>
53
-
54
- <!-- Execution list -->
55
- <div class="budget-section-title">Pipeline Executions</div>
56
- <div class="execution-list">
57
- ${this._pipelineSnapshots.map(s=>o`
58
- <button
59
- class="execution-row ${this._selectedSnapshot===s?"selected":""}"
60
- @click=${()=>{this._selectedSnapshot=s}}
61
- >
62
- <span class="exec-time">${new Date(s.timestamp).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"})}</span>
63
- <span class="exec-duration">${s.durationMs}ms</span>
64
- <span class="cache-badge ${s.cacheHitTokens>0?"cache-badge--hit":"cache-badge--miss"}">
65
- ${s.cacheHitTokens>0?"HIT":"MISS"}
66
- </span>
67
- <span class="exec-tokens">${d(s.tokensLoaded)} loaded</span>
68
- </button>
69
- `)}
70
- </div>
71
-
72
- <!-- Waterfall for selected snapshot -->
73
- ${this._selectedSnapshot&&this._selectedSnapshot.layers.length>0?o`
74
- <div class="waterfall-card">
75
- <ic-layer-waterfall
76
- .layers=${this._selectedSnapshot.layers.map(s=>({name:s.name,durationMs:s.durationMs,messagesIn:s.messagesIn,messagesOut:s.messagesOut}))}
77
- .totalDurationMs=${this._selectedSnapshot.durationMs}
78
- ></ic-layer-waterfall>
79
- </div>
80
- `:v}
81
- `}_renderMetrics(){if(!this._session)return v;const t=this._session,e=$(t.lastActiveAt);return o`
82
- <!-- Cost & Usage -->
83
- <div class="metrics-section-title">Cost & Usage</div>
84
- <div class="metrics-grid">
85
- <ic-stat-card
86
- label="Total Cost"
87
- value=${this._sessionBilling?k(this._sessionBilling.totalCost):"--"}
88
- ></ic-stat-card>
89
- <ic-stat-card
90
- label="Total Tokens"
91
- value=${d(t.totalTokens)}
92
- ></ic-stat-card>
93
- <ic-stat-card
94
- label="Input Tokens"
95
- value=${d(t.inputTokens)}
96
- ></ic-stat-card>
97
- <ic-stat-card
98
- label="Output Tokens"
99
- value=${d(t.outputTokens)}
100
- ></ic-stat-card>
101
- </div>
102
-
103
- <!-- Activity -->
104
- <div class="metrics-section-title">Activity</div>
105
- <div class="metrics-grid">
106
- <ic-stat-card
107
- label="Tool Calls"
108
- value=${String(t.toolCalls)}
109
- ></ic-stat-card>
110
- <ic-stat-card
111
- label="Compactions"
112
- value=${String(t.compactions)}
113
- ></ic-stat-card>
114
- <ic-stat-card
115
- label="Resets"
116
- value=${String(t.resetCount)}
117
- ></ic-stat-card>
118
- <ic-stat-card
119
- label="API Calls"
120
- value=${this._sessionBilling?String(this._sessionBilling.callCount):"--"}
121
- ></ic-stat-card>
122
- </div>
123
-
124
- <!-- Session Health -->
125
- <div class="metrics-section-title">Session Health</div>
126
- <div class="metrics-grid">
127
- <ic-stat-card
128
- label="Created"
129
- value=${new Date(t.createdAt).toLocaleDateString()}
130
- ></ic-stat-card>
131
- <ic-stat-card
132
- label="Last Active"
133
- value=${new Date(t.lastActiveAt).toLocaleString()}
134
- ></ic-stat-card>
135
- <ic-stat-card label="Status" .value=${""}>
136
- </ic-stat-card>
137
- </div>
138
- <div style="margin-top: calc(-1 * var(--ic-space-md));">
139
- <span class="status-badge status-badge--${e}" data-testid="session-status">${e}</span>
140
- </div>
141
- `}render(){const t=[{label:"Sessions",route:"sessions"},{label:this._getBreadcrumbLabel()}];if(this._loading)return o`
142
- <div class="breadcrumb-area">
143
- <ic-breadcrumb
144
- .items=${t}
145
- @navigate=${this._handleBreadcrumbNavigate}
146
- ></ic-breadcrumb>
147
- </div>
148
- <ic-skeleton-view variant="detail"></ic-skeleton-view>
149
- `;if(this._error)return o`
150
- <div class="breadcrumb-area">
151
- <ic-breadcrumb
152
- .items=${t}
153
- @navigate=${this._handleBreadcrumbNavigate}
154
- ></ic-breadcrumb>
155
- </div>
156
- <div class="error-container">
157
- <div class="error-message">${this._error}</div>
158
- <button class="retry-btn" @click=${()=>this._loadSession()}>
159
- Retry
160
- </button>
161
- </div>
162
- `;if(!this._session)return o`
163
- <div class="breadcrumb-area">
164
- <ic-breadcrumb
165
- .items=${t}
166
- @navigate=${this._handleBreadcrumbNavigate}
167
- ></ic-breadcrumb>
168
- </div>
169
- <div class="error-container">
170
- <div class="error-message">Session not found</div>
171
- </div>
172
- `;const e=this._session,r=this._getConfirmProps();return o`
173
- <div class="breadcrumb-area">
174
- <ic-breadcrumb
175
- .items=${t}
176
- @navigate=${this._handleBreadcrumbNavigate}
177
- ></ic-breadcrumb>
178
- </div>
179
-
180
- <div class="session-info">
181
- <div class="info-item">
182
- <span class="info-label">Agent</span>
183
- <span class="info-value">${e.agentId}</span>
184
- </div>
185
- <div class="info-item">
186
- <span class="info-label">Channel</span>
187
- <span class="info-value"
188
- ><ic-tag variant=${e.channelType}
189
- >${e.channelType}</ic-tag
190
- ></span
191
- >
192
- </div>
193
- <div class="info-item">
194
- <span class="info-label">Messages</span>
195
- <span class="info-value">${e.messageCount}</span>
196
- </div>
197
- <div class="info-item">
198
- <span class="info-label">Tokens</span>
199
- <span class="info-value">${d(e.totalTokens)}</span>
200
- </div>
201
- <div class="info-item">
202
- <span class="info-label">Created</span>
203
- <span class="info-value"
204
- >${new Date(e.createdAt).toLocaleDateString()}</span
205
- >
206
- </div>
207
- ${e.label?o`
208
- <div class="info-item">
209
- <span class="info-label">Label</span>
210
- <span class="info-value">${e.label}</span>
211
- </div>
212
- `:v}
213
- </div>
214
-
215
- <div class="actions-bar">
216
- <button
217
- class="btn btn-ghost"
218
- @click=${()=>this._showActionConfirm("reset")}
219
- >
220
- Reset
221
- </button>
222
- <button
223
- class="btn btn-ghost"
224
- @click=${()=>this._showActionConfirm("compact")}
225
- >
226
- Compact
227
- </button>
228
- <button class="btn btn-ghost" @click=${this._handleExport}>
229
- Export JSONL
230
- </button>
231
- <button
232
- class="btn btn-danger"
233
- @click=${()=>this._showActionConfirm("delete")}
234
- >
235
- Delete
236
- </button>
237
- </div>
238
-
239
- <!-- Tab bar -->
240
- <div class="tab-bar" role="tablist">
241
- <button
242
- class="tab ${this._activeTab==="conversation"?"tab--active":""}"
243
- role="tab"
244
- aria-selected=${this._activeTab==="conversation"}
245
- @click=${()=>this._switchTab("conversation")}
246
- >
247
- Conversation
248
- </button>
249
- <button
250
- class="tab ${this._activeTab==="context"?"tab--active":""}"
251
- role="tab"
252
- aria-selected=${this._activeTab==="context"}
253
- @click=${()=>this._switchTab("context")}
254
- >
255
- Context State
256
- </button>
257
- <button
258
- class="tab ${this._activeTab==="metrics"?"tab--active":""}"
259
- role="tab"
260
- aria-selected=${this._activeTab==="metrics"}
261
- @click=${()=>this._switchTab("metrics")}
262
- >
263
- Metrics
264
- </button>
265
- </div>
266
-
267
- <!-- Tab content: use display:none to preserve scroll position -->
268
- <div
269
- class="tab-content ${this._activeTab==="conversation"?"tab-content--active":""}"
270
- >
271
- ${this._renderConversation()}
272
- </div>
273
- <div
274
- class="tab-content ${this._activeTab==="context"?"tab-content--active":""}"
275
- >
276
- ${this._renderContextState()}
277
- </div>
278
- <div
279
- class="tab-content ${this._activeTab==="metrics"?"tab-content--active":""}"
280
- >
281
- ${this._renderMetrics()}
282
- </div>
283
-
284
- <ic-confirm-dialog
285
- ?open=${this._showConfirm}
286
- title=${r.title}
287
- message=${r.message}
288
- variant=${r.variant}
289
- confirmLabel=${r.label}
290
- @confirm=${this._handleConfirm}
291
- @cancel=${this._handleConfirmCancel}
292
- ></ic-confirm-dialog>
293
- `}};a.styles=[h,g,f`
1
+ import{c as e,f as t,h as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"./decorate-BvWYovGE.js";import{a as u}from"./index-FLPhHz8p.js";import"./ic-breadcrumb-DqN6G3gc.js";import"./ic-tag-CvMVQFRR.js";import"./ic-confirm-dialog-DGlPbV1T.js";import"./ic-relative-time-B3UAnTqg.js";import"./ic-empty-state-CM3Wbj2f.js";import{n as d,r as f,t as p}from"./session-key-parser-Dkqcj2Ss.js";import{t as m}from"./ic-tool-call-DMPHsLyx.js";import"./ic-chat-message-FdQcZsSQ.js";import"./ic-budget-segment-bar-zLsMzjDO.js";import"./ic-layer-waterfall-WkaFyu-l.js";function h(e){if(e>=1e3){let t=e/1e3;return t>=100?`${Math.round(t)}K`:`${t.toFixed(1)}K`}return String(e)}function g(e){return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:`USD`}).format(e)}var _=class extends r{constructor(...e){super(...e),this.apiClient=null,this.rpcClient=null,this.sessionKey=``,this._session=null,this._messages=[],this._loading=!1,this._error=``,this._showConfirm=!1,this._confirmAction=``,this._activeTab=`conversation`,this._contextLoaded=!1,this._metricsLoaded=!1,this._pipelineSnapshots=[],this._dagCompactions=[],this._selectedSnapshot=null,this._sessionBilling=null}static{this.styles=[o,i,n`
294
2
  :host {
295
3
  display: block;
296
4
  }
@@ -629,4 +337,296 @@ import{a as u,I as p,b as o,A as v,s as h,f as g,i as f,n as b,r as n,t as x}fro
629
337
  .retry-btn:hover {
630
338
  background: var(--ic-accent-hover);
631
339
  }
632
- `];i([b({attribute:!1})],a.prototype,"apiClient",2);i([b({attribute:!1})],a.prototype,"rpcClient",2);i([b()],a.prototype,"sessionKey",2);i([n()],a.prototype,"_session",2);i([n()],a.prototype,"_messages",2);i([n()],a.prototype,"_loading",2);i([n()],a.prototype,"_error",2);i([n()],a.prototype,"_showConfirm",2);i([n()],a.prototype,"_confirmAction",2);i([n()],a.prototype,"_activeTab",2);i([n()],a.prototype,"_contextLoaded",2);i([n()],a.prototype,"_metricsLoaded",2);i([n()],a.prototype,"_pipelineSnapshots",2);i([n()],a.prototype,"_dagCompactions",2);i([n()],a.prototype,"_selectedSnapshot",2);i([n()],a.prototype,"_sessionBilling",2);a=i([x("ic-session-detail")],a);export{a as IcSessionDetail};
340
+ `]}connectedCallback(){super.connectedCallback()}updated(e){(e.has(`apiClient`)||e.has(`sessionKey`))&&this.apiClient&&this.sessionKey&&this._loadSession()}async _loadSession(){if(!(!this.apiClient||!this.sessionKey)){this._loading=!0,this._error=``;try{let e=await this.apiClient.getSessionDetail(this.sessionKey);this._session=e.session,this._messages=e.messages}catch{this._error=`Failed to load session. Please try again.`}finally{this._loading=!1}}}_switchTab(e){this._activeTab=e,e===`context`&&!this._contextLoaded&&this._loadContextData(),e===`metrics`&&!this._metricsLoaded&&this._loadMetricsData()}async _loadContextData(){if(!(!this.rpcClient||!this._session))try{let e=this._session.agentId,[t,n]=await Promise.all([this.rpcClient.call(`obs.context.pipeline`,{agentId:e,limit:100}),this.rpcClient.call(`obs.context.dag`,{agentId:e,limit:50})]),r=Array.isArray(t)?t:[];this._pipelineSnapshots=r.filter(e=>e.sessionKey===this.sessionKey);let i=Array.isArray(n)?n:[];this._dagCompactions=i.filter(e=>e.sessionKey===this.sessionKey),this._pipelineSnapshots.length>0&&(this._selectedSnapshot=this._pipelineSnapshots[0]),this._contextLoaded=!0}catch{this._contextLoaded=!0}}async _loadMetricsData(){if(!this.rpcClient){this._metricsLoaded=!0;return}try{let e=await this.rpcClient.call(`obs.billing.bySession`,{sessionKey:this.sessionKey});this._sessionBilling=e??null}catch{this._sessionBilling=null}this._metricsLoaded=!0}_handleBreadcrumbNavigate(e){window.location.hash=`#/${e.detail}`}_showActionConfirm(e){this._confirmAction=e,this._showConfirm=!0}_handleConfirmCancel(){this._showConfirm=!1,this._confirmAction=``}async _handleConfirm(){if(this._showConfirm=!1,this.apiClient){try{this._confirmAction===`reset`?(await this.apiClient.resetSession(this.sessionKey),u.show(`Session reset`,`success`),await this._loadSession()):this._confirmAction===`compact`?(await this.apiClient.compactSession(this.sessionKey),u.show(`Session compacted`,`success`),await this._loadSession()):this._confirmAction===`delete`&&(await this.apiClient.deleteSession(this.sessionKey),u.show(`Session deleted`,`success`),window.location.hash=`#/sessions`)}catch{u.show(`Operation failed. Please try again.`,`error`)}this._confirmAction=``}}async _handleExport(){if(this.apiClient)try{let e=await this.apiClient.exportSession(this.sessionKey),t=new Blob([e],{type:`application/jsonl`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`session-${this.sessionKey}.jsonl`,r.click(),URL.revokeObjectURL(n),u.show(`Session exported`,`success`)}catch{u.show(`Export failed. Please try again.`,`error`)}}_truncateKey(e){return e.length>20?e.slice(0,16)+`...`:e}_getBreadcrumbLabel(){let e=f(this.sessionKey);return e?d(e):this._truncateKey(this.sessionKey)}_isCompactionBoundary(e){if(e.role!==`system`)return!1;let t=e.content.toLowerCase();return t.includes(`compacted`)||t.includes(`summary`)||t.includes(`[compacted]`)}_getConfirmProps(){switch(this._confirmAction){case`delete`:return{title:`Delete Session`,message:`Are you sure you want to delete this session? This action cannot be undone.`,variant:`danger`,label:`Delete`};case`compact`:return{title:`Compact Session`,message:`Are you sure you want to compact this session? Older messages will be summarized.`,variant:`default`,label:`Compact`};default:return{title:`Reset Session`,message:`Are you sure you want to reset this session? All conversation history will be cleared.`,variant:`default`,label:`Reset`}}}_renderConversation(){return t`
341
+ <div class="conversation">
342
+ ${this._messages.map(e=>{if(this._isCompactionBoundary(e))return t`
343
+ <div class="compaction-marker" data-testid="compaction-marker">
344
+ <hr />
345
+ <span>Context was compacted here</span>
346
+ <hr />
347
+ </div>
348
+ `;if(e.role===`tool`){let n=e.content;try{n=JSON.parse(e.content)}catch{}return t`
349
+ <ic-tool-call
350
+ .toolName=${e.toolName??`tool`}
351
+ .output=${n}
352
+ .status=${`success`}
353
+ .expanded=${!1}
354
+ ></ic-tool-call>
355
+ `}return t`
356
+ <ic-chat-message
357
+ .role=${e.role}
358
+ .content=${m(e.content,e.role)}
359
+ .timestamp=${e.timestamp}
360
+ .showActions=${!1}
361
+ ></ic-chat-message>
362
+ `})}
363
+ </div>
364
+ `}_renderContextState(){if(!this._contextLoaded)return t`<div class="loading-container"><ic-loading size="md"></ic-loading></div>`;if(this._pipelineSnapshots.length===0)return t`<ic-empty-state
365
+ icon="activity"
366
+ message="No pipeline data for this session"
367
+ ></ic-empty-state>`;let e=this._pipelineSnapshots[0],n=Math.max(0,e.tokensLoaded-e.tokensEvicted),r=[{label:`System`,tokens:n,color:`var(--ic-accent)`},{label:`Evicted`,tokens:e.tokensEvicted,color:`var(--ic-error)`},{label:`Masked`,tokens:e.tokensMasked,color:`var(--ic-warning)`},{label:`Available`,tokens:Math.max(0,Math.round((1-e.budgetUtilization)*(n+e.tokensEvicted+e.tokensMasked))),color:`var(--ic-surface-2, #1f2937)`}].filter(e=>e.tokens>0);return t`
368
+ <!-- Latest snapshot summary -->
369
+ <div class="context-summary">
370
+ <div class="context-badge">
371
+ Budget <span class="badge-value">${Math.round(e.budgetUtilization*100)}%</span>
372
+ </div>
373
+ <span class="cache-badge ${e.cacheHitTokens>0?`cache-badge--hit`:`cache-badge--miss`}">
374
+ ${e.cacheHitTokens>0?`Cache HIT`:`Cache MISS`}
375
+ </span>
376
+ <div class="context-badge">
377
+ Loaded <span class="badge-value">${h(e.tokensLoaded)}</span>
378
+ </div>
379
+ <div class="context-badge">
380
+ Evicted <span class="badge-value">${h(e.tokensEvicted)}</span>
381
+ </div>
382
+ <div class="context-badge">
383
+ Duration <span class="badge-value">${e.durationMs}ms</span>
384
+ </div>
385
+ </div>
386
+
387
+ <!-- Budget segment bar -->
388
+ <div class="budget-section">
389
+ <div class="budget-section-title">Token Budget</div>
390
+ <ic-budget-segment-bar .segments=${r}></ic-budget-segment-bar>
391
+ </div>
392
+
393
+ <!-- Execution list -->
394
+ <div class="budget-section-title">Pipeline Executions</div>
395
+ <div class="execution-list">
396
+ ${this._pipelineSnapshots.map(e=>t`
397
+ <button
398
+ class="execution-row ${this._selectedSnapshot===e?`selected`:``}"
399
+ @click=${()=>{this._selectedSnapshot=e}}
400
+ >
401
+ <span class="exec-time">${new Date(e.timestamp).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}</span>
402
+ <span class="exec-duration">${e.durationMs}ms</span>
403
+ <span class="cache-badge ${e.cacheHitTokens>0?`cache-badge--hit`:`cache-badge--miss`}">
404
+ ${e.cacheHitTokens>0?`HIT`:`MISS`}
405
+ </span>
406
+ <span class="exec-tokens">${h(e.tokensLoaded)} loaded</span>
407
+ </button>
408
+ `)}
409
+ </div>
410
+
411
+ <!-- Waterfall for selected snapshot -->
412
+ ${this._selectedSnapshot&&this._selectedSnapshot.layers.length>0?t`
413
+ <div class="waterfall-card">
414
+ <ic-layer-waterfall
415
+ .layers=${this._selectedSnapshot.layers.map(e=>({name:e.name,durationMs:e.durationMs,messagesIn:e.messagesIn,messagesOut:e.messagesOut}))}
416
+ .totalDurationMs=${this._selectedSnapshot.durationMs}
417
+ ></ic-layer-waterfall>
418
+ </div>
419
+ `:l}
420
+ `}_renderMetrics(){if(!this._session)return l;let e=this._session,n=p(e.lastActiveAt);return t`
421
+ <!-- Cost & Usage -->
422
+ <div class="metrics-section-title">Cost & Usage</div>
423
+ <div class="metrics-grid">
424
+ <ic-stat-card
425
+ label="Total Cost"
426
+ value=${this._sessionBilling?g(this._sessionBilling.totalCost):`--`}
427
+ ></ic-stat-card>
428
+ <ic-stat-card
429
+ label="Total Tokens"
430
+ value=${h(e.totalTokens)}
431
+ ></ic-stat-card>
432
+ <ic-stat-card
433
+ label="Input Tokens"
434
+ value=${h(e.inputTokens)}
435
+ ></ic-stat-card>
436
+ <ic-stat-card
437
+ label="Output Tokens"
438
+ value=${h(e.outputTokens)}
439
+ ></ic-stat-card>
440
+ </div>
441
+
442
+ <!-- Activity -->
443
+ <div class="metrics-section-title">Activity</div>
444
+ <div class="metrics-grid">
445
+ <ic-stat-card
446
+ label="Tool Calls"
447
+ value=${String(e.toolCalls)}
448
+ ></ic-stat-card>
449
+ <ic-stat-card
450
+ label="Compactions"
451
+ value=${String(e.compactions)}
452
+ ></ic-stat-card>
453
+ <ic-stat-card
454
+ label="Resets"
455
+ value=${String(e.resetCount)}
456
+ ></ic-stat-card>
457
+ <ic-stat-card
458
+ label="API Calls"
459
+ value=${this._sessionBilling?String(this._sessionBilling.callCount):`--`}
460
+ ></ic-stat-card>
461
+ </div>
462
+
463
+ <!-- Session Health -->
464
+ <div class="metrics-section-title">Session Health</div>
465
+ <div class="metrics-grid">
466
+ <ic-stat-card
467
+ label="Created"
468
+ value=${new Date(e.createdAt).toLocaleDateString()}
469
+ ></ic-stat-card>
470
+ <ic-stat-card
471
+ label="Last Active"
472
+ value=${new Date(e.lastActiveAt).toLocaleString()}
473
+ ></ic-stat-card>
474
+ <ic-stat-card label="Status" .value=${``}>
475
+ </ic-stat-card>
476
+ </div>
477
+ <div style="margin-top: calc(-1 * var(--ic-space-md));">
478
+ <span class="status-badge status-badge--${n}" data-testid="session-status">${n}</span>
479
+ </div>
480
+ `}render(){let e=[{label:`Sessions`,route:`sessions`},{label:this._getBreadcrumbLabel()}];if(this._loading)return t`
481
+ <div class="breadcrumb-area">
482
+ <ic-breadcrumb
483
+ .items=${e}
484
+ @navigate=${this._handleBreadcrumbNavigate}
485
+ ></ic-breadcrumb>
486
+ </div>
487
+ <ic-skeleton-view variant="detail"></ic-skeleton-view>
488
+ `;if(this._error)return t`
489
+ <div class="breadcrumb-area">
490
+ <ic-breadcrumb
491
+ .items=${e}
492
+ @navigate=${this._handleBreadcrumbNavigate}
493
+ ></ic-breadcrumb>
494
+ </div>
495
+ <div class="error-container">
496
+ <div class="error-message">${this._error}</div>
497
+ <button class="retry-btn" @click=${()=>this._loadSession()}>
498
+ Retry
499
+ </button>
500
+ </div>
501
+ `;if(!this._session)return t`
502
+ <div class="breadcrumb-area">
503
+ <ic-breadcrumb
504
+ .items=${e}
505
+ @navigate=${this._handleBreadcrumbNavigate}
506
+ ></ic-breadcrumb>
507
+ </div>
508
+ <div class="error-container">
509
+ <div class="error-message">Session not found</div>
510
+ </div>
511
+ `;let n=this._session,r=this._getConfirmProps();return t`
512
+ <div class="breadcrumb-area">
513
+ <ic-breadcrumb
514
+ .items=${e}
515
+ @navigate=${this._handleBreadcrumbNavigate}
516
+ ></ic-breadcrumb>
517
+ </div>
518
+
519
+ <div class="session-info">
520
+ <div class="info-item">
521
+ <span class="info-label">Agent</span>
522
+ <span class="info-value">${n.agentId}</span>
523
+ </div>
524
+ <div class="info-item">
525
+ <span class="info-label">Channel</span>
526
+ <span class="info-value"
527
+ ><ic-tag variant=${n.channelType}
528
+ >${n.channelType}</ic-tag
529
+ ></span
530
+ >
531
+ </div>
532
+ <div class="info-item">
533
+ <span class="info-label">Messages</span>
534
+ <span class="info-value">${n.messageCount}</span>
535
+ </div>
536
+ <div class="info-item">
537
+ <span class="info-label">Tokens</span>
538
+ <span class="info-value">${h(n.totalTokens)}</span>
539
+ </div>
540
+ <div class="info-item">
541
+ <span class="info-label">Created</span>
542
+ <span class="info-value"
543
+ >${new Date(n.createdAt).toLocaleDateString()}</span
544
+ >
545
+ </div>
546
+ ${n.label?t`
547
+ <div class="info-item">
548
+ <span class="info-label">Label</span>
549
+ <span class="info-value">${n.label}</span>
550
+ </div>
551
+ `:l}
552
+ </div>
553
+
554
+ <div class="actions-bar">
555
+ <button
556
+ class="btn btn-ghost"
557
+ @click=${()=>this._showActionConfirm(`reset`)}
558
+ >
559
+ Reset
560
+ </button>
561
+ <button
562
+ class="btn btn-ghost"
563
+ @click=${()=>this._showActionConfirm(`compact`)}
564
+ >
565
+ Compact
566
+ </button>
567
+ <button class="btn btn-ghost" @click=${this._handleExport}>
568
+ Export JSONL
569
+ </button>
570
+ <button
571
+ class="btn btn-danger"
572
+ @click=${()=>this._showActionConfirm(`delete`)}
573
+ >
574
+ Delete
575
+ </button>
576
+ </div>
577
+
578
+ <!-- Tab bar -->
579
+ <div class="tab-bar" role="tablist">
580
+ <button
581
+ class="tab ${this._activeTab===`conversation`?`tab--active`:``}"
582
+ role="tab"
583
+ aria-selected=${this._activeTab===`conversation`}
584
+ @click=${()=>this._switchTab(`conversation`)}
585
+ >
586
+ Conversation
587
+ </button>
588
+ <button
589
+ class="tab ${this._activeTab===`context`?`tab--active`:``}"
590
+ role="tab"
591
+ aria-selected=${this._activeTab===`context`}
592
+ @click=${()=>this._switchTab(`context`)}
593
+ >
594
+ Context State
595
+ </button>
596
+ <button
597
+ class="tab ${this._activeTab===`metrics`?`tab--active`:``}"
598
+ role="tab"
599
+ aria-selected=${this._activeTab===`metrics`}
600
+ @click=${()=>this._switchTab(`metrics`)}
601
+ >
602
+ Metrics
603
+ </button>
604
+ </div>
605
+
606
+ <!-- Tab content: use display:none to preserve scroll position -->
607
+ <div
608
+ class="tab-content ${this._activeTab===`conversation`?`tab-content--active`:``}"
609
+ >
610
+ ${this._renderConversation()}
611
+ </div>
612
+ <div
613
+ class="tab-content ${this._activeTab===`context`?`tab-content--active`:``}"
614
+ >
615
+ ${this._renderContextState()}
616
+ </div>
617
+ <div
618
+ class="tab-content ${this._activeTab===`metrics`?`tab-content--active`:``}"
619
+ >
620
+ ${this._renderMetrics()}
621
+ </div>
622
+
623
+ <ic-confirm-dialog
624
+ ?open=${this._showConfirm}
625
+ title=${r.title}
626
+ message=${r.message}
627
+ variant=${r.variant}
628
+ confirmLabel=${r.label}
629
+ @confirm=${this._handleConfirm}
630
+ @cancel=${this._handleConfirmCancel}
631
+ ></ic-confirm-dialog>
632
+ `}};c([s({attribute:!1})],_.prototype,`apiClient`,void 0),c([s({attribute:!1})],_.prototype,`rpcClient`,void 0),c([s()],_.prototype,`sessionKey`,void 0),c([a()],_.prototype,`_session`,void 0),c([a()],_.prototype,`_messages`,void 0),c([a()],_.prototype,`_loading`,void 0),c([a()],_.prototype,`_error`,void 0),c([a()],_.prototype,`_showConfirm`,void 0),c([a()],_.prototype,`_confirmAction`,void 0),c([a()],_.prototype,`_activeTab`,void 0),c([a()],_.prototype,`_contextLoaded`,void 0),c([a()],_.prototype,`_metricsLoaded`,void 0),c([a()],_.prototype,`_pipelineSnapshots`,void 0),c([a()],_.prototype,`_dagCompactions`,void 0),c([a()],_.prototype,`_selectedSnapshot`,void 0),c([a()],_.prototype,`_sessionBilling`,void 0),_=c([e(`ic-session-detail`)],_);export{_ as IcSessionDetail};
@@ -0,0 +1 @@
1
+ var e=300*1e3,t=3600*1e3;function n(e){if(!e||typeof e!=`string`)return;let t=e.split(`:`),n;if(t[0]===`agent`&&t.length>=5&&(n=t[1],t=t.slice(2)),t.length<3)return;let r={tenantId:t[0],userId:t[1],channelId:t[2]};n!==void 0&&(r.agentId=n);for(let e=3;e<t.length;e++)t[e]===`peer`&&e+1<t.length?r.peerId=t[++e]:t[e]===`guild`&&e+1<t.length?r.guildId=t[++e]:t[e]===`thread`&&e+1<t.length&&(r.threadId=t[++e]);return r}function r(e){return e.userId.length>16?e.userId.slice(0,14)+`...`:e.userId}function i(n){let r=Date.now()-n;return r<e?`active`:r<t?`idle`:`expired`}export{r as n,n as r,i as t};