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,20 +1,4 @@
1
- import{s as x,i as _,n as u,a as $,b as s,t as w,S as k,I as h,A as n,f as C,r as v}from"./index-CEcM1R_C.js";import"./ic-breadcrumb-CUMpp3BL.js";import"./ic-tag-CPPUnDLF.js";import"./ic-confirm-dialog-CCDbB04e.js";import"./ic-relative-time-3FqpjeAI.js";var S=Object.defineProperty,D=Object.getOwnPropertyDescriptor,g=(e,t,a,i)=>{for(var r=i>1?void 0:i?D(t,a):t,c=e.length-1,l;c>=0;c--)(l=e[c])&&(r=(i?l(t,a,r):l(r))||r);return i&&r&&S(t,a,r),r};function y(e){return e.toLocaleString("en-US")}let p=class extends ${constructor(){super(...arguments),this.label="",this.used=0,this.total=0,this.warnThreshold=70,this.dangerThreshold=90}render(){if(this.total===0)return s`
2
- <div class="header">
3
- <span class="label">${this.label}</span>
4
- <span class="unlimited">unlimited</span>
5
- </div>
6
- `;const e=Math.min(100,Math.round(this.used/this.total*100)),t=e>=this.dangerThreshold?"bar-fill--danger":e>=this.warnThreshold?"bar-fill--warning":"bar-fill--success";return s`
7
- <div class="header">
8
- <span class="label">${this.label}</span>
9
- <span class="values">${y(this.used)} / ${y(this.total)} (${e}%)</span>
10
- </div>
11
- <div class="track">
12
- <div
13
- class="bar-fill ${t}"
14
- style="width: ${e}%"
15
- ></div>
16
- </div>
17
- `}};p.styles=[x,_`
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,i as d}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";function f(e){return e.toLocaleString(`en-US`)}var p=class extends r{constructor(...e){super(...e),this.label=``,this.used=0,this.total=0,this.warnThreshold=70,this.dangerThreshold=90}static{this.styles=[o,n`
18
2
  :host {
19
3
  display: block;
20
4
  }
@@ -69,261 +53,23 @@ import{s as x,i as _,n as u,a as $,b as s,t as w,S as k,I as h,A as n,f as C,r a
69
53
  color: var(--ic-text-dim, #6b7280);
70
54
  font-style: italic;
71
55
  }
72
- `];g([u()],p.prototype,"label",2);g([u({type:Number})],p.prototype,"used",2);g([u({type:Number})],p.prototype,"total",2);g([u({type:Number})],p.prototype,"warnThreshold",2);g([u({type:Number})],p.prototype,"dangerThreshold",2);p=g([w("ic-budget-bar")],p);var T=Object.defineProperty,P=Object.getOwnPropertyDescriptor,d=(e,t,a,i)=>{for(var r=i>1?void 0:i?P(t,a):t,c=e.length-1,l;c>=0;c--)(l=e[c])&&(r=(i?l(t,a,r):l(r))||r);return i&&r&&T(t,a,r),r};function M(e){if(e>=1e6){const t=e/1e6;return t%1===0?`${t}M`:`${t.toFixed(1)}M`}if(e>=1e3){const t=e/1e3;return t%1===0?`${t}K`:`${t.toFixed(1)}K`}return String(e)}function I(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function b(e){return e.toLocaleString("en-US")}const R={closed:"success",open:"error","half-open":"warning"};let o=class extends ${constructor(){super(...arguments),this.apiClient=null,this.rpcClient=null,this.eventDispatcher=null,this._sse=null,this._reloadDebounce=null,this.agentId="",this._agent=null,this._billing=null,this._skills=[],this._loadState="loading",this._error="",this._actionPending=!1,this._heartbeatState=null,this._deleteRequested=!1}connectedCallback(){super.connectedCallback(),this._initSse()}updated(e){(e.has("agentId")||e.has("rpcClient"))&&this.agentId&&this.rpcClient&&this._loadData(),e.has("eventDispatcher")&&this.eventDispatcher&&!this._sse&&this._initSse()}disconnectedCallback(){super.disconnectedCallback(),this._reloadDebounce!==null&&(clearTimeout(this._reloadDebounce),this._reloadDebounce=null)}_initSse(){!this.eventDispatcher||this._sse||(this._sse=new k(this,this.eventDispatcher,{"observability:token_usage":()=>{this._scheduleReload()},"scheduler:heartbeat_delivered":()=>{this._scheduleReload()}}))}_scheduleReload(e=300){this._reloadDebounce!==null&&clearTimeout(this._reloadDebounce),this._reloadDebounce=setTimeout(()=>{this._reloadDebounce=null,this._loadData()},e)}async _loadData(){if(!(!this.rpcClient||!this.agentId)){this._loadState="loading",this._error="";try{const e=await this.rpcClient.call("agents.get",{agentId:this.agentId});this._agent=this._mapToAgentDetail(e),this._loadState="loaded";const t=this.rpcClient;Promise.allSettled([t.call("obs.billing.byAgent",{agentId:this.agentId}),t.call("skills.list",{agentId:this.agentId}).then(a=>a.skills??[]),t.call("heartbeat.states",{}).then(a=>(a.agents??[]).find(i=>i.agentId===this.agentId)??null)]).then(([a,i,r])=>{this._billing=a.status==="fulfilled"?a.value:null,this._skills=i.status==="fulfilled"&&Array.isArray(i.value)?i.value:[],this._heartbeatState=r.status==="fulfilled"?r.value:null})}catch(e){this._error=e instanceof Error?e.message:"Failed to load agent",this._loadState="error"}}}_mapToAgentDetail(e){const t=e.config,a=t.circuitBreaker,i=t.contextGuard,r=t.sdkRetry,c=t.modelFailover,l=t.rag,m=t.session?.resetPolicy,f=t.concurrency;return{id:e.agentId,name:t.name??e.agentId,status:e.suspended?"suspended":"active",model:t.model??"",provider:t.provider??"",maxSteps:t.maxSteps,temperature:t.temperature,thinkingLevel:t.thinkingLevel,maxTokens:t.maxTokens,maxContextChars:t.maxContextChars,budgets:t.budgets,circuitBreaker:a?{state:"closed",failures:0,threshold:a.failureThreshold,resetTimeoutMs:a.resetTimeoutMs}:void 0,safety:{contextGuard:i?{enabled:i.enabled,warnPct:i.warnPercent,blockPct:i.blockPercent}:void 0,sdkRetry:r?{enabled:r.enabled,maxRetries:r.maxRetries,baseDelayMs:r.baseDelayMs}:void 0,modelFailover:c?{fallbackCount:(c.fallbackModels??[]).length}:void 0},rag:l?{enabled:l.enabled,maxResults:l.maxResults,minScore:l.minScore,trustLevels:l.includeTrustLevels}:void 0,sessionPolicy:m?{resetMode:m.mode,idleTimeoutMs:m.idleTimeoutMs,dailyResetHour:m.dailyResetHour,timezone:m.dailyResetTimezone}:void 0,concurrency:f?{maxConcurrent:f.maxConcurrentRuns,maxQueued:f.maxQueuedPerSession,queueMode:"followup"}:void 0,routingBindings:t.routingBindings}}_navigate(e){this.dispatchEvent(new CustomEvent("navigate",{detail:e,bubbles:!0,composed:!0}))}async _handleSuspendResume(){if(!this.rpcClient||!this._agent||this._actionPending)return;this._actionPending=!0;const e=this._agent.status==="suspended",t=e?"agents.resume":"agents.suspend",a=e?"resumed":"suspended";try{await this.rpcClient.call(t,{agentId:this.agentId}),h.show(`Agent ${this.agentId} ${a}`,"success"),await this._loadData()}catch(i){h.show(`Failed to ${e?"resume":"suspend"} agent: ${i instanceof Error?i.message:"Unknown error"}`,"error")}finally{this._actionPending=!1}}async _handleDelete(){if(!(!this.rpcClient||this._actionPending)){this._actionPending=!0;try{await this.rpcClient.call("agents.delete",{agentId:this.agentId}),h.show(`Agent ${this.agentId} deleted`,"success"),this._navigate("agents")}catch(e){h.show(`Failed to delete agent: ${e instanceof Error?e.message:"Unknown error"}`,"error")}finally{this._actionPending=!1}}}render(){switch(this._loadState){case"loading":return s`<ic-skeleton-view variant="detail"></ic-skeleton-view>`;case"error":return s`
73
- <div class="error-container">
74
- <div class="error-message">${this._error}</div>
75
- <button class="retry-btn" @click=${()=>this._loadData()}>Retry</button>
76
- </div>
77
- `;case"loaded":return this._renderDetail()}}_renderDetail(){if(!this._agent)return n;const e=this._agent,t=e.status==="suspended",a=t?"Resume":"Suspend";return s`
78
- <div class="header">
79
- <div class="header-left">
80
- <ic-breadcrumb
81
- .items=${[{label:"Agents",route:"agents"},{label:e.name??e.id}]}
82
- @navigate=${i=>this._navigate(i.detail)}
83
- ></ic-breadcrumb>
84
- <div class="agent-title">
85
- <h1>${e.name??e.id}</h1>
86
- <ic-tag variant=${t?"warning":"success"}>${e.status}</ic-tag>
87
- </div>
88
- </div>
89
- <div class="header-actions">
90
- <button
91
- class="btn btn--secondary"
92
- @click=${()=>this._navigate(`agents/${this.agentId}/workspace`)}
93
- >Workspace</button>
94
- <button
95
- class="btn btn--primary"
96
- @click=${()=>this._navigate(`agents/${this.agentId}/edit`)}
97
- >Edit</button>
98
- <button
99
- class="btn btn--secondary"
100
- ?disabled=${this._actionPending}
101
- @click=${()=>this._handleSuspendResume()}
102
- >${a}</button>
103
- <button
104
- class="btn btn--danger"
105
- ?disabled=${this._actionPending}
106
- @click=${()=>this._requestDelete()}
107
- >Delete</button>
108
- </div>
109
- </div>
110
-
111
- <div class="detail-layout">
112
- <div class="left-column">
113
- ${this._renderIdentityCard()}
114
- ${this._renderStatsCard()}
115
- ${this._renderConfigCard()}
116
- </div>
117
- <div class="right-column">
118
- ${this._renderBudgetGaugesCard()}
119
- ${this._renderCircuitBreakerCard()}
120
- ${this._renderSkillsCard()}
121
- ${this._renderHeartbeatCard()}
122
- </div>
123
- </div>
124
-
125
- <ic-confirm-dialog
126
- ?open=${this._deleteRequested}
127
- title="Delete Agent"
128
- message=${`Delete agent "${this.agentId}"? This action cannot be undone.`}
129
- variant="danger"
130
- confirmLabel="Delete"
131
- @confirm=${()=>this._handleDelete()}
132
- @cancel=${()=>{this._deleteRequested=!1}}
133
- ></ic-confirm-dialog>
134
- `}_requestDelete(){this._deleteRequested=!0}_renderIdentityCard(){const e=this._agent,t=[{label:"Agent ID",value:e.id,mono:!0},{label:"Display Name",value:e.name},{label:"Provider",value:e.provider},{label:"Model",value:e.model},{label:"Temperature",value:e.temperature!==void 0?String(e.temperature):"default"},{label:"Max Steps",value:e.maxSteps!==void 0?String(e.maxSteps):"default"},{label:"Max Tokens",value:e.maxTokens!==void 0?b(e.maxTokens):"default"},{label:"Thinking Level",value:e.thinkingLevel??"default"}];return s`
135
- <div class="card">
136
- <h3 class="card-title">Identity</h3>
137
- ${t.map(a=>s`
138
- <div class="identity-row">
139
- <span class="identity-label">${a.label}</span>
140
- <span class="identity-value ${a.mono?"identity-value--mono":""}">${a.value??"-"}</span>
141
- </div>
142
- `)}
143
- </div>
144
- `}_renderStatsCard(){const e=this._billing,t=b(e?.messagesToday??0),a=M(e?.tokensToday??0),i=String(e?.activeSessions??0),r=I(e?.costToday??0);return s`
145
- <div class="card">
146
- <h3 class="card-title">Stats</h3>
147
- <div class="stat-grid">
148
- <ic-stat-card label="Messages Today" value=${t}></ic-stat-card>
149
- <ic-stat-card label="Tokens Today" value=${a}></ic-stat-card>
150
- <ic-stat-card label="Cost Today" value=${r}></ic-stat-card>
151
- <ic-stat-card label="Active Sessions" value=${i}></ic-stat-card>
152
- </div>
153
- </div>
154
- `}_renderConfigCard(){const e=this._agent,t=e.sessionPolicy&&(e.sessionPolicy.resetMode||e.sessionPolicy.idleTimeoutMs),a=e.concurrency&&(e.concurrency.maxConcurrent||e.concurrency.maxQueued),i=e.safety&&(e.safety.contextGuard||e.safety.sdkRetry||e.safety.modelFailover);return!t&&!a&&!i?n:s`
155
- <div class="card">
156
- <h3 class="card-title">Configuration</h3>
157
-
158
- ${t?s`
159
- <div class="config-group">
160
- <h4 class="config-group-title">Session Policy</h4>
161
- ${e.sessionPolicy?.resetMode?s`
162
- <div class="identity-row">
163
- <span class="identity-label">Reset Mode</span>
164
- <span class="identity-value">${e.sessionPolicy.resetMode}</span>
165
- </div>
166
- `:n}
167
- ${e.sessionPolicy?.idleTimeoutMs?s`
168
- <div class="identity-row">
169
- <span class="identity-label">Idle Timeout</span>
170
- <span class="identity-value">${b(e.sessionPolicy.idleTimeoutMs)}ms</span>
171
- </div>
172
- `:n}
173
- ${e.sessionPolicy?.timezone?s`
174
- <div class="identity-row">
175
- <span class="identity-label">Timezone</span>
176
- <span class="identity-value">${e.sessionPolicy.timezone}</span>
177
- </div>
178
- `:n}
179
- </div>
180
- `:n}
181
-
182
- ${a?s`
183
- <div class="config-group">
184
- <h4 class="config-group-title">Concurrency</h4>
185
- ${e.concurrency?.maxConcurrent!==void 0?s`
186
- <div class="identity-row">
187
- <span class="identity-label">Max Concurrent</span>
188
- <span class="identity-value">${e.concurrency.maxConcurrent}</span>
189
- </div>
190
- `:n}
191
- ${e.concurrency?.maxQueued!==void 0?s`
192
- <div class="identity-row">
193
- <span class="identity-label">Queue Mode</span>
194
- <span class="identity-value">${e.concurrency.queueMode??"followup"}</span>
195
- </div>
196
- `:n}
197
- </div>
198
- `:n}
199
-
200
- ${i?s`
201
- <div class="config-group">
202
- <h4 class="config-group-title">Safety</h4>
203
- ${e.safety?.contextGuard?s`
204
- <div class="identity-row">
205
- <span class="identity-label">Context Guard</span>
206
- <span class="identity-value">
207
- ${e.safety.contextGuard.enabled?"enabled":"disabled"}
208
- (warn: ${e.safety.contextGuard.warnPct}%, block: ${e.safety.contextGuard.blockPct}%)
209
- </span>
210
- </div>
211
- `:n}
212
- ${e.safety?.sdkRetry?s`
213
- <div class="identity-row">
214
- <span class="identity-label">SDK Retry</span>
215
- <span class="identity-value">
216
- ${e.safety.sdkRetry.enabled?"enabled":"disabled"}
217
- (${e.safety.sdkRetry.maxRetries} retries)
218
- </span>
219
- </div>
220
- `:n}
221
- ${e.safety?.modelFailover?s`
222
- <div class="identity-row">
223
- <span class="identity-label">Model Failover</span>
224
- <span class="identity-value">${e.safety.modelFailover.fallbackCount} fallback models</span>
225
- </div>
226
- `:n}
227
- </div>
228
- `:n}
229
- </div>
230
- `}_renderBudgetGaugesCard(){const e=this._agent,t=this._billing,a=e.budgets,i=a&&(a.perExecution!==void 0||a.perHour!==void 0||a.perDay!==void 0);return s`
231
- <div class="card">
232
- <h3 class="card-title">Budget</h3>
233
- ${i?s`
234
- <div class="budget-gauges">
235
- ${a.perExecution!==void 0?s`
236
- <ic-metric-gauge
237
- .value=${this._budgetPct(t?.budgetUsed?.perExecution?.used??0,a.perExecution)}
238
- label="Per Exec"
239
- ></ic-metric-gauge>
240
- `:n}
241
- ${a.perHour!==void 0?s`
242
- <ic-metric-gauge
243
- .value=${this._budgetPct(t?.budgetUsed?.perHour?.used??0,a.perHour)}
244
- label="Per Hour"
245
- ></ic-metric-gauge>
246
- `:n}
247
- ${a.perDay!==void 0?s`
248
- <ic-metric-gauge
249
- .value=${this._budgetPct(t?.budgetUsed?.perDay?.used??0,a.perDay)}
250
- label="Per Day"
251
- ></ic-metric-gauge>
252
- `:n}
253
- </div>
254
- `:s`
255
- <p class="budget-empty">No budget set</p>
256
- `}
257
- </div>
258
- `}_budgetPct(e,t){return t<=0?0:Math.min(100,Math.round(e/t*100))}_renderCircuitBreakerCard(){const e=this._agent?.circuitBreaker;if(!e)return n;const t=R[e.state]??"default";return s`
259
- <div class="card">
260
- <h3 class="card-title">Circuit Breaker</h3>
261
- <div class="circuit-breaker">
262
- <div class="cb-row">
263
- <span class="cb-label">State:</span>
264
- <ic-tag variant=${t}>${e.state}</ic-tag>
265
- </div>
266
- <div class="cb-row">
267
- <span class="cb-label">Failures:</span>
268
- <span>${e.failures}</span>
269
- </div>
270
- ${e.threshold!==void 0?s`
271
- <div class="cb-row">
272
- <span class="cb-label">Threshold:</span>
273
- <span>${e.threshold}</span>
274
- </div>
275
- `:n}
276
- ${e.resetTimeoutMs!==void 0?s`
277
- <div class="cb-row">
278
- <span class="cb-label">Reset:</span>
279
- <span>${b(e.resetTimeoutMs)}ms</span>
280
- </div>
281
- `:n}
56
+ `]}render(){if(this.total===0)return t`
57
+ <div class="header">
58
+ <span class="label">${this.label}</span>
59
+ <span class="unlimited">unlimited</span>
282
60
  </div>
61
+ `;let e=Math.min(100,Math.round(this.used/this.total*100)),n=e>=this.dangerThreshold?`bar-fill--danger`:e>=this.warnThreshold?`bar-fill--warning`:`bar-fill--success`;return t`
62
+ <div class="header">
63
+ <span class="label">${this.label}</span>
64
+ <span class="values">${f(this.used)} / ${f(this.total)} (${e}%)</span>
283
65
  </div>
284
- `}_renderSkillsCard(){const e=this._skills,t=e.length;return s`
285
- <div class="card">
286
- <h3 class="card-title">Skills (${t})</h3>
287
- ${t>0?s`
288
- <div class="skill-chips">
289
- ${e.map(a=>{const i=a.source==="bundled"?"built-in":a.source==="local"?"prompt":a.source==="workspace"?"mcp":"built-in",r=a.source==="bundled"?"info":a.source==="local"?"success":"warning";return s`<ic-tag variant=${r} title=${a.description||a.name}>${a.name} (${i})</ic-tag>`})}
290
- </div>
291
- `:s`<p class="muted">No skills configured</p>`}
292
- </div>
293
- `}_renderHeartbeatCard(){const e=this._heartbeatState;if(!e)return n;const t=Date.now(),a=e.backoffUntilMs>t,i=e.consecutiveErrors>0,r=e.tickStartedAtMs>0;let c,l;return e.enabled?a?(c="backoff",l="warning"):i?(c="error",l="error"):(c="healthy",l="success"):(c="disabled",l="default"),s`
294
- <div class="card">
295
- <h3 class="card-title">Heartbeat</h3>
296
- <div class="heartbeat-info">
297
- <div class="hb-row">
298
- <span class="hb-label">Status:</span>
299
- <ic-tag variant=${l}>${c}</ic-tag>
300
- ${r?s`<span class="hb-running">running...</span>`:n}
301
- </div>
302
- <div class="hb-row">
303
- <span class="hb-label">Interval:</span>
304
- <span>${this._formatInterval(e.intervalMs)}</span>
305
- </div>
306
- ${e.lastRunMs>0?s`
307
- <div class="hb-row">
308
- <span class="hb-label">Last run:</span>
309
- <ic-relative-time .timestamp=${e.lastRunMs}></ic-relative-time>
310
- </div>
311
- `:n}
312
- ${e.nextDueMs>0?s`
313
- <div class="hb-row">
314
- <span class="hb-label">Next due:</span>
315
- <ic-relative-time .timestamp=${e.nextDueMs}></ic-relative-time>
316
- </div>
317
- `:n}
318
- ${i?s`
319
- <div class="hb-row">
320
- <span class="hb-label">Errors:</span>
321
- <span>${e.consecutiveErrors} consecutive${e.lastErrorKind?` (${e.lastErrorKind})`:""}</span>
322
- </div>
323
- `:n}
324
- </div>
66
+ <div class="track">
67
+ <div
68
+ class="bar-fill ${n}"
69
+ style="width: ${e}%"
70
+ ></div>
325
71
  </div>
326
- `}_formatInterval(e){return e>=36e5?`Every ${Math.round(e/36e5)}h`:e>=6e4?`Every ${Math.round(e/6e4)}m`:`Every ${Math.round(e/1e3)}s`}};o.styles=[x,C,_`
72
+ `}};c([s()],p.prototype,`label`,void 0),c([s({type:Number})],p.prototype,`used`,void 0),c([s({type:Number})],p.prototype,`total`,void 0),c([s({type:Number})],p.prototype,`warnThreshold`,void 0),c([s({type:Number})],p.prototype,`dangerThreshold`,void 0),p=c([e(`ic-budget-bar`)],p);function m(e){if(e>=1e6){let t=e/1e6;return t%1==0?`${t}M`:`${t.toFixed(1)}M`}if(e>=1e3){let t=e/1e3;return t%1==0?`${t}K`:`${t.toFixed(1)}K`}return String(e)}function h(e){return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:`USD`,minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function g(e){return e.toLocaleString(`en-US`)}var _={closed:`success`,open:`error`,"half-open":`warning`},v=class extends r{constructor(...e){super(...e),this.apiClient=null,this.rpcClient=null,this.eventDispatcher=null,this._sse=null,this._reloadDebounce=null,this.agentId=``,this._agent=null,this._billing=null,this._skills=[],this._loadState=`loading`,this._error=``,this._actionPending=!1,this._heartbeatState=null,this._deleteRequested=!1}static{this.styles=[o,i,n`
327
73
  :host {
328
74
  display: block;
329
75
  }
@@ -612,4 +358,258 @@ import{s as x,i as _,n as u,a as $,b as s,t as w,S as k,I as h,A as n,f as C,r a
612
358
  flex-wrap: wrap;
613
359
  }
614
360
  }
615
- `];d([u({attribute:!1})],o.prototype,"apiClient",2);d([u({attribute:!1})],o.prototype,"rpcClient",2);d([u({attribute:!1})],o.prototype,"eventDispatcher",2);d([u()],o.prototype,"agentId",2);d([v()],o.prototype,"_agent",2);d([v()],o.prototype,"_billing",2);d([v()],o.prototype,"_skills",2);d([v()],o.prototype,"_loadState",2);d([v()],o.prototype,"_error",2);d([v()],o.prototype,"_actionPending",2);d([v()],o.prototype,"_heartbeatState",2);d([v()],o.prototype,"_deleteRequested",2);o=d([w("ic-agent-detail")],o);export{o as IcAgentDetail,M as formatTokens};
361
+ `]}connectedCallback(){super.connectedCallback(),this._initSse()}updated(e){(e.has(`agentId`)||e.has(`rpcClient`))&&this.agentId&&this.rpcClient&&this._loadData(),e.has(`eventDispatcher`)&&this.eventDispatcher&&!this._sse&&this._initSse()}disconnectedCallback(){super.disconnectedCallback(),this._reloadDebounce!==null&&(clearTimeout(this._reloadDebounce),this._reloadDebounce=null)}_initSse(){!this.eventDispatcher||this._sse||(this._sse=new d(this,this.eventDispatcher,{"observability:token_usage":()=>{this._scheduleReload()},"scheduler:heartbeat_delivered":()=>{this._scheduleReload()}}))}_scheduleReload(e=300){this._reloadDebounce!==null&&clearTimeout(this._reloadDebounce),this._reloadDebounce=setTimeout(()=>{this._reloadDebounce=null,this._loadData()},e)}async _loadData(){if(!(!this.rpcClient||!this.agentId)){this._loadState=`loading`,this._error=``;try{let e=await this.rpcClient.call(`agents.get`,{agentId:this.agentId});this._agent=this._mapToAgentDetail(e),this._loadState=`loaded`;let t=this.rpcClient;Promise.allSettled([t.call(`obs.billing.byAgent`,{agentId:this.agentId}),t.call(`skills.list`,{agentId:this.agentId}).then(e=>e.skills??[]),t.call(`heartbeat.states`,{}).then(e=>(e.agents??[]).find(e=>e.agentId===this.agentId)??null)]).then(([e,t,n])=>{this._billing=e.status===`fulfilled`?e.value:null,this._skills=t.status===`fulfilled`&&Array.isArray(t.value)?t.value:[],this._heartbeatState=n.status===`fulfilled`?n.value:null})}catch(e){this._error=e instanceof Error?e.message:`Failed to load agent`,this._loadState=`error`}}}_mapToAgentDetail(e){let t=e.config,n=t.circuitBreaker,r=t.contextGuard,i=t.sdkRetry,a=t.modelFailover,o=t.rag,s=t.session?.resetPolicy,c=t.concurrency;return{id:e.agentId,name:t.name??e.agentId,status:e.suspended?`suspended`:`active`,model:t.model??``,provider:t.provider??``,maxSteps:t.maxSteps,temperature:t.temperature,thinkingLevel:t.thinkingLevel,maxTokens:t.maxTokens,maxContextChars:t.maxContextChars,budgets:t.budgets,circuitBreaker:n?{state:`closed`,failures:0,threshold:n.failureThreshold,resetTimeoutMs:n.resetTimeoutMs}:void 0,safety:{contextGuard:r?{enabled:r.enabled,warnPct:r.warnPercent,blockPct:r.blockPercent}:void 0,sdkRetry:i?{enabled:i.enabled,maxRetries:i.maxRetries,baseDelayMs:i.baseDelayMs}:void 0,modelFailover:a?{fallbackCount:(a.fallbackModels??[]).length}:void 0},rag:o?{enabled:o.enabled,maxResults:o.maxResults,minScore:o.minScore,trustLevels:o.includeTrustLevels}:void 0,sessionPolicy:s?{resetMode:s.mode,idleTimeoutMs:s.idleTimeoutMs,dailyResetHour:s.dailyResetHour,timezone:s.dailyResetTimezone}:void 0,concurrency:c?{maxConcurrent:c.maxConcurrentRuns,maxQueued:c.maxQueuedPerSession,queueMode:`followup`}:void 0,routingBindings:t.routingBindings}}_navigate(e){this.dispatchEvent(new CustomEvent(`navigate`,{detail:e,bubbles:!0,composed:!0}))}async _handleSuspendResume(){if(!this.rpcClient||!this._agent||this._actionPending)return;this._actionPending=!0;let e=this._agent.status===`suspended`,t=e?`agents.resume`:`agents.suspend`,n=e?`resumed`:`suspended`;try{await this.rpcClient.call(t,{agentId:this.agentId}),u.show(`Agent ${this.agentId} ${n}`,`success`),await this._loadData()}catch(t){u.show(`Failed to ${e?`resume`:`suspend`} agent: ${t instanceof Error?t.message:`Unknown error`}`,`error`)}finally{this._actionPending=!1}}async _handleDelete(){if(!(!this.rpcClient||this._actionPending)){this._actionPending=!0;try{await this.rpcClient.call(`agents.delete`,{agentId:this.agentId}),u.show(`Agent ${this.agentId} deleted`,`success`),this._navigate(`agents`)}catch(e){u.show(`Failed to delete agent: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}finally{this._actionPending=!1}}}render(){switch(this._loadState){case`loading`:return t`<ic-skeleton-view variant="detail"></ic-skeleton-view>`;case`error`:return t`
362
+ <div class="error-container">
363
+ <div class="error-message">${this._error}</div>
364
+ <button class="retry-btn" @click=${()=>this._loadData()}>Retry</button>
365
+ </div>
366
+ `;case`loaded`:return this._renderDetail()}}_renderDetail(){if(!this._agent)return l;let e=this._agent,n=e.status===`suspended`,r=n?`Resume`:`Suspend`;return t`
367
+ <div class="header">
368
+ <div class="header-left">
369
+ <ic-breadcrumb
370
+ .items=${[{label:`Agents`,route:`agents`},{label:e.name??e.id}]}
371
+ @navigate=${e=>this._navigate(e.detail)}
372
+ ></ic-breadcrumb>
373
+ <div class="agent-title">
374
+ <h1>${e.name??e.id}</h1>
375
+ <ic-tag variant=${n?`warning`:`success`}>${e.status}</ic-tag>
376
+ </div>
377
+ </div>
378
+ <div class="header-actions">
379
+ <button
380
+ class="btn btn--secondary"
381
+ @click=${()=>this._navigate(`agents/${this.agentId}/workspace`)}
382
+ >Workspace</button>
383
+ <button
384
+ class="btn btn--primary"
385
+ @click=${()=>this._navigate(`agents/${this.agentId}/edit`)}
386
+ >Edit</button>
387
+ <button
388
+ class="btn btn--secondary"
389
+ ?disabled=${this._actionPending}
390
+ @click=${()=>this._handleSuspendResume()}
391
+ >${r}</button>
392
+ <button
393
+ class="btn btn--danger"
394
+ ?disabled=${this._actionPending}
395
+ @click=${()=>this._requestDelete()}
396
+ >Delete</button>
397
+ </div>
398
+ </div>
399
+
400
+ <div class="detail-layout">
401
+ <div class="left-column">
402
+ ${this._renderIdentityCard()}
403
+ ${this._renderStatsCard()}
404
+ ${this._renderConfigCard()}
405
+ </div>
406
+ <div class="right-column">
407
+ ${this._renderBudgetGaugesCard()}
408
+ ${this._renderCircuitBreakerCard()}
409
+ ${this._renderSkillsCard()}
410
+ ${this._renderHeartbeatCard()}
411
+ </div>
412
+ </div>
413
+
414
+ <ic-confirm-dialog
415
+ ?open=${this._deleteRequested}
416
+ title="Delete Agent"
417
+ message=${`Delete agent "${this.agentId}"? This action cannot be undone.`}
418
+ variant="danger"
419
+ confirmLabel="Delete"
420
+ @confirm=${()=>this._handleDelete()}
421
+ @cancel=${()=>{this._deleteRequested=!1}}
422
+ ></ic-confirm-dialog>
423
+ `}_requestDelete(){this._deleteRequested=!0}_renderIdentityCard(){let e=this._agent;return t`
424
+ <div class="card">
425
+ <h3 class="card-title">Identity</h3>
426
+ ${[{label:`Agent ID`,value:e.id,mono:!0},{label:`Display Name`,value:e.name},{label:`Provider`,value:e.provider},{label:`Model`,value:e.model},{label:`Temperature`,value:e.temperature===void 0?`default`:String(e.temperature)},{label:`Max Steps`,value:e.maxSteps===void 0?`default`:String(e.maxSteps)},{label:`Max Tokens`,value:e.maxTokens===void 0?`default`:g(e.maxTokens)},{label:`Thinking Level`,value:e.thinkingLevel??`default`}].map(e=>t`
427
+ <div class="identity-row">
428
+ <span class="identity-label">${e.label}</span>
429
+ <span class="identity-value ${e.mono?`identity-value--mono`:``}">${e.value??`-`}</span>
430
+ </div>
431
+ `)}
432
+ </div>
433
+ `}_renderStatsCard(){let e=this._billing,n=g(e?.messagesToday??0),r=m(e?.tokensToday??0),i=String(e?.activeSessions??0);return t`
434
+ <div class="card">
435
+ <h3 class="card-title">Stats</h3>
436
+ <div class="stat-grid">
437
+ <ic-stat-card label="Messages Today" value=${n}></ic-stat-card>
438
+ <ic-stat-card label="Tokens Today" value=${r}></ic-stat-card>
439
+ <ic-stat-card label="Cost Today" value=${h(e?.costToday??0)}></ic-stat-card>
440
+ <ic-stat-card label="Active Sessions" value=${i}></ic-stat-card>
441
+ </div>
442
+ </div>
443
+ `}_renderConfigCard(){let e=this._agent,n=e.sessionPolicy&&(e.sessionPolicy.resetMode||e.sessionPolicy.idleTimeoutMs),r=e.concurrency&&(e.concurrency.maxConcurrent||e.concurrency.maxQueued),i=e.safety&&(e.safety.contextGuard||e.safety.sdkRetry||e.safety.modelFailover);return!n&&!r&&!i?l:t`
444
+ <div class="card">
445
+ <h3 class="card-title">Configuration</h3>
446
+
447
+ ${n?t`
448
+ <div class="config-group">
449
+ <h4 class="config-group-title">Session Policy</h4>
450
+ ${e.sessionPolicy?.resetMode?t`
451
+ <div class="identity-row">
452
+ <span class="identity-label">Reset Mode</span>
453
+ <span class="identity-value">${e.sessionPolicy.resetMode}</span>
454
+ </div>
455
+ `:l}
456
+ ${e.sessionPolicy?.idleTimeoutMs?t`
457
+ <div class="identity-row">
458
+ <span class="identity-label">Idle Timeout</span>
459
+ <span class="identity-value">${g(e.sessionPolicy.idleTimeoutMs)}ms</span>
460
+ </div>
461
+ `:l}
462
+ ${e.sessionPolicy?.timezone?t`
463
+ <div class="identity-row">
464
+ <span class="identity-label">Timezone</span>
465
+ <span class="identity-value">${e.sessionPolicy.timezone}</span>
466
+ </div>
467
+ `:l}
468
+ </div>
469
+ `:l}
470
+
471
+ ${r?t`
472
+ <div class="config-group">
473
+ <h4 class="config-group-title">Concurrency</h4>
474
+ ${e.concurrency?.maxConcurrent===void 0?l:t`
475
+ <div class="identity-row">
476
+ <span class="identity-label">Max Concurrent</span>
477
+ <span class="identity-value">${e.concurrency.maxConcurrent}</span>
478
+ </div>
479
+ `}
480
+ ${e.concurrency?.maxQueued===void 0?l:t`
481
+ <div class="identity-row">
482
+ <span class="identity-label">Queue Mode</span>
483
+ <span class="identity-value">${e.concurrency.queueMode??`followup`}</span>
484
+ </div>
485
+ `}
486
+ </div>
487
+ `:l}
488
+
489
+ ${i?t`
490
+ <div class="config-group">
491
+ <h4 class="config-group-title">Safety</h4>
492
+ ${e.safety?.contextGuard?t`
493
+ <div class="identity-row">
494
+ <span class="identity-label">Context Guard</span>
495
+ <span class="identity-value">
496
+ ${e.safety.contextGuard.enabled?`enabled`:`disabled`}
497
+ (warn: ${e.safety.contextGuard.warnPct}%, block: ${e.safety.contextGuard.blockPct}%)
498
+ </span>
499
+ </div>
500
+ `:l}
501
+ ${e.safety?.sdkRetry?t`
502
+ <div class="identity-row">
503
+ <span class="identity-label">SDK Retry</span>
504
+ <span class="identity-value">
505
+ ${e.safety.sdkRetry.enabled?`enabled`:`disabled`}
506
+ (${e.safety.sdkRetry.maxRetries} retries)
507
+ </span>
508
+ </div>
509
+ `:l}
510
+ ${e.safety?.modelFailover?t`
511
+ <div class="identity-row">
512
+ <span class="identity-label">Model Failover</span>
513
+ <span class="identity-value">${e.safety.modelFailover.fallbackCount} fallback models</span>
514
+ </div>
515
+ `:l}
516
+ </div>
517
+ `:l}
518
+ </div>
519
+ `}_renderBudgetGaugesCard(){let e=this._agent,n=this._billing,r=e.budgets;return t`
520
+ <div class="card">
521
+ <h3 class="card-title">Budget</h3>
522
+ ${r&&(r.perExecution!==void 0||r.perHour!==void 0||r.perDay!==void 0)?t`
523
+ <div class="budget-gauges">
524
+ ${r.perExecution===void 0?l:t`
525
+ <ic-metric-gauge
526
+ .value=${this._budgetPct(n?.budgetUsed?.perExecution?.used??0,r.perExecution)}
527
+ label="Per Exec"
528
+ ></ic-metric-gauge>
529
+ `}
530
+ ${r.perHour===void 0?l:t`
531
+ <ic-metric-gauge
532
+ .value=${this._budgetPct(n?.budgetUsed?.perHour?.used??0,r.perHour)}
533
+ label="Per Hour"
534
+ ></ic-metric-gauge>
535
+ `}
536
+ ${r.perDay===void 0?l:t`
537
+ <ic-metric-gauge
538
+ .value=${this._budgetPct(n?.budgetUsed?.perDay?.used??0,r.perDay)}
539
+ label="Per Day"
540
+ ></ic-metric-gauge>
541
+ `}
542
+ </div>
543
+ `:t`
544
+ <p class="budget-empty">No budget set</p>
545
+ `}
546
+ </div>
547
+ `}_budgetPct(e,t){return t<=0?0:Math.min(100,Math.round(e/t*100))}_renderCircuitBreakerCard(){let e=this._agent?.circuitBreaker;return e?t`
548
+ <div class="card">
549
+ <h3 class="card-title">Circuit Breaker</h3>
550
+ <div class="circuit-breaker">
551
+ <div class="cb-row">
552
+ <span class="cb-label">State:</span>
553
+ <ic-tag variant=${_[e.state]??`default`}>${e.state}</ic-tag>
554
+ </div>
555
+ <div class="cb-row">
556
+ <span class="cb-label">Failures:</span>
557
+ <span>${e.failures}</span>
558
+ </div>
559
+ ${e.threshold===void 0?l:t`
560
+ <div class="cb-row">
561
+ <span class="cb-label">Threshold:</span>
562
+ <span>${e.threshold}</span>
563
+ </div>
564
+ `}
565
+ ${e.resetTimeoutMs===void 0?l:t`
566
+ <div class="cb-row">
567
+ <span class="cb-label">Reset:</span>
568
+ <span>${g(e.resetTimeoutMs)}ms</span>
569
+ </div>
570
+ `}
571
+ </div>
572
+ </div>
573
+ `:l}_renderSkillsCard(){let e=this._skills,n=e.length;return t`
574
+ <div class="card">
575
+ <h3 class="card-title">Skills (${n})</h3>
576
+ ${n>0?t`
577
+ <div class="skill-chips">
578
+ ${e.map(e=>{let n=e.source===`bundled`?`built-in`:e.source===`local`?`prompt`:e.source===`workspace`?`mcp`:`built-in`;return t`<ic-tag variant=${e.source===`bundled`?`info`:e.source===`local`?`success`:`warning`} title=${e.description||e.name}>${e.name} (${n})</ic-tag>`})}
579
+ </div>
580
+ `:t`<p class="muted">No skills configured</p>`}
581
+ </div>
582
+ `}_renderHeartbeatCard(){let e=this._heartbeatState;if(!e)return l;let n=Date.now(),r=e.backoffUntilMs>n,i=e.consecutiveErrors>0,a=e.tickStartedAtMs>0,o,s;return e.enabled?r?(o=`backoff`,s=`warning`):i?(o=`error`,s=`error`):(o=`healthy`,s=`success`):(o=`disabled`,s=`default`),t`
583
+ <div class="card">
584
+ <h3 class="card-title">Heartbeat</h3>
585
+ <div class="heartbeat-info">
586
+ <div class="hb-row">
587
+ <span class="hb-label">Status:</span>
588
+ <ic-tag variant=${s}>${o}</ic-tag>
589
+ ${a?t`<span class="hb-running">running...</span>`:l}
590
+ </div>
591
+ <div class="hb-row">
592
+ <span class="hb-label">Interval:</span>
593
+ <span>${this._formatInterval(e.intervalMs)}</span>
594
+ </div>
595
+ ${e.lastRunMs>0?t`
596
+ <div class="hb-row">
597
+ <span class="hb-label">Last run:</span>
598
+ <ic-relative-time .timestamp=${e.lastRunMs}></ic-relative-time>
599
+ </div>
600
+ `:l}
601
+ ${e.nextDueMs>0?t`
602
+ <div class="hb-row">
603
+ <span class="hb-label">Next due:</span>
604
+ <ic-relative-time .timestamp=${e.nextDueMs}></ic-relative-time>
605
+ </div>
606
+ `:l}
607
+ ${i?t`
608
+ <div class="hb-row">
609
+ <span class="hb-label">Errors:</span>
610
+ <span>${e.consecutiveErrors} consecutive${e.lastErrorKind?` (${e.lastErrorKind})`:``}</span>
611
+ </div>
612
+ `:l}
613
+ </div>
614
+ </div>
615
+ `}_formatInterval(e){return e>=36e5?`Every ${Math.round(e/36e5)}h`:e>=6e4?`Every ${Math.round(e/6e4)}m`:`Every ${Math.round(e/1e3)}s`}};c([s({attribute:!1})],v.prototype,`apiClient`,void 0),c([s({attribute:!1})],v.prototype,`rpcClient`,void 0),c([s({attribute:!1})],v.prototype,`eventDispatcher`,void 0),c([s()],v.prototype,`agentId`,void 0),c([a()],v.prototype,`_agent`,void 0),c([a()],v.prototype,`_billing`,void 0),c([a()],v.prototype,`_skills`,void 0),c([a()],v.prototype,`_loadState`,void 0),c([a()],v.prototype,`_error`,void 0),c([a()],v.prototype,`_actionPending`,void 0),c([a()],v.prototype,`_heartbeatState`,void 0),c([a()],v.prototype,`_deleteRequested`,void 0),v=c([e(`ic-agent-detail`)],v);export{v as IcAgentDetail,m as formatTokens};