comisai 1.0.15 → 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 (124) hide show
  1. package/node_modules/@comis/agent/dist/bootstrap/types.d.ts +1 -1
  2. package/node_modules/@comis/agent/dist/bridge/pi-event-bridge.js +12 -11
  3. package/node_modules/@comis/agent/dist/context-engine/constants.d.ts +11 -0
  4. package/node_modules/@comis/agent/dist/context-engine/constants.js +11 -0
  5. package/node_modules/@comis/agent/dist/context-engine/index.d.ts +1 -1
  6. package/node_modules/@comis/agent/dist/context-engine/index.js +1 -1
  7. package/node_modules/@comis/agent/dist/context-engine/llm-compaction.js +32 -18
  8. package/node_modules/@comis/agent/dist/executor/cache-break-diff-writer.d.ts +2 -0
  9. package/node_modules/@comis/agent/dist/executor/cache-break-diff-writer.js +36 -0
  10. package/node_modules/@comis/agent/dist/executor/executor-post-execution.d.ts +12 -0
  11. package/node_modules/@comis/agent/dist/executor/executor-post-execution.js +117 -27
  12. package/node_modules/@comis/agent/dist/executor/executor-prompt-runner.d.ts +1 -0
  13. package/node_modules/@comis/agent/dist/executor/executor-prompt-runner.js +16 -4
  14. package/node_modules/@comis/agent/dist/executor/executor-stream-setup.js +17 -1
  15. package/node_modules/@comis/agent/dist/executor/executor-tool-assembly.js +27 -1
  16. package/node_modules/@comis/agent/dist/executor/session-snapshot-cleanup.js +3 -1
  17. package/node_modules/@comis/agent/dist/executor/stream-wrappers/index.d.ts +2 -0
  18. package/node_modules/@comis/agent/dist/executor/stream-wrappers/index.js +2 -0
  19. package/node_modules/@comis/agent/dist/executor/stream-wrappers/request-body-injector.d.ts +9 -0
  20. package/node_modules/@comis/agent/dist/executor/stream-wrappers/request-body-injector.js +65 -3
  21. package/node_modules/@comis/agent/dist/executor/stream-wrappers/stub-filter-injector.d.ts +28 -0
  22. package/node_modules/@comis/agent/dist/executor/stream-wrappers/stub-filter-injector.js +63 -0
  23. package/node_modules/@comis/agent/dist/executor/tool-deferral.d.ts +18 -1
  24. package/node_modules/@comis/agent/dist/executor/tool-deferral.js +275 -133
  25. package/node_modules/@comis/agent/dist/executor/ttl-guard.d.ts +6 -0
  26. package/node_modules/@comis/agent/dist/executor/ttl-guard.js +8 -0
  27. package/node_modules/@comis/agent/package.json +1 -1
  28. package/node_modules/@comis/channels/dist/shared/typing-controller.d.ts +7 -0
  29. package/node_modules/@comis/channels/dist/shared/typing-controller.js +33 -0
  30. package/node_modules/@comis/channels/package.json +1 -1
  31. package/node_modules/@comis/cli/dist/commands/daemon.js +116 -28
  32. package/node_modules/@comis/cli/dist/wizard/non-interactive.js +1 -0
  33. package/node_modules/@comis/cli/dist/wizard/steps/01-detect-existing.js +4 -0
  34. package/node_modules/@comis/cli/dist/wizard/steps/07-gateway.js +9 -0
  35. package/node_modules/@comis/cli/dist/wizard/steps/10-write-config.js +2 -0
  36. package/node_modules/@comis/cli/dist/wizard/steps/12-finish.js +5 -2
  37. package/node_modules/@comis/cli/dist/wizard/types.d.ts +1 -0
  38. package/node_modules/@comis/cli/package.json +1 -1
  39. package/node_modules/@comis/core/dist/config/schema-agent.d.ts +10 -0
  40. package/node_modules/@comis/core/dist/config/schema-agent.js +8 -0
  41. package/node_modules/@comis/core/dist/config/schema-gateway.d.ts +17 -2
  42. package/node_modules/@comis/core/dist/config/schema-gateway.js +11 -0
  43. package/node_modules/@comis/core/dist/config/schema-skills.d.ts +16 -2
  44. package/node_modules/@comis/core/dist/config/schema-skills.js +9 -2
  45. package/node_modules/@comis/core/dist/config/schema.d.ts +66 -60
  46. package/node_modules/@comis/core/package.json +1 -1
  47. package/node_modules/@comis/daemon/dist/wiring/setup-gateway.js +34 -6
  48. package/node_modules/@comis/daemon/package.json +1 -1
  49. package/node_modules/@comis/gateway/package.json +1 -1
  50. package/node_modules/@comis/infra/package.json +1 -1
  51. package/node_modules/@comis/memory/package.json +1 -1
  52. package/node_modules/@comis/scheduler/package.json +1 -1
  53. package/node_modules/@comis/shared/package.json +1 -1
  54. package/node_modules/@comis/skills/dist/builtin/platform/gateway-tool.d.ts +1 -1
  55. package/node_modules/@comis/skills/package.json +1 -1
  56. package/node_modules/@comis/web/dist/android-chrome-192x192.png +0 -0
  57. package/node_modules/@comis/web/dist/android-chrome-512x512.png +0 -0
  58. package/node_modules/@comis/web/dist/apple-touch-icon.png +0 -0
  59. package/node_modules/@comis/web/dist/assets/agent-detail-BG9MGWWj.js +615 -0
  60. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +2173 -0
  61. package/node_modules/@comis/web/dist/assets/agent-list-LHCJ4rw2.js +504 -0
  62. package/node_modules/@comis/web/dist/assets/approvals-q9VH_IKr.js +54 -0
  63. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +375 -0
  64. package/node_modules/@comis/web/dist/assets/channel-detail-CaInesJM.js +681 -0
  65. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +323 -0
  66. package/node_modules/@comis/web/dist/assets/chat-console-CNmzl0JW.js +943 -0
  67. package/node_modules/@comis/web/dist/assets/config-editor-DX4ITw6y.js +1374 -0
  68. package/node_modules/@comis/web/dist/assets/context-dag-browser-BwiaF5tf.js +393 -0
  69. package/node_modules/@comis/web/dist/assets/context-engine-BZ5Am6hA.js +393 -0
  70. package/node_modules/@comis/web/dist/assets/delivery-view-OfBZof-m.js +392 -0
  71. package/node_modules/@comis/web/dist/assets/diagnostics-view-YFwCxgr2.js +231 -0
  72. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +1 -0
  73. package/node_modules/@comis/web/dist/assets/extract-variables-BM5qyK-s.js +149 -0
  74. package/node_modules/@comis/web/dist/assets/ic-array-editor-B7m6x7-S.js +118 -0
  75. package/node_modules/@comis/web/dist/assets/ic-breadcrumb-CUMpp3BL.js +75 -0
  76. package/node_modules/@comis/web/dist/assets/ic-budget-segment-bar-BtJ6x5mN.js +64 -0
  77. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +352 -0
  78. package/node_modules/@comis/web/dist/assets/ic-confirm-dialog-CCDbB04e.js +110 -0
  79. package/node_modules/@comis/web/dist/assets/ic-connection-dot-CnT1b8xr.js +54 -0
  80. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +277 -0
  81. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +67 -0
  82. package/node_modules/@comis/web/dist/assets/ic-detail-panel-BF83r-if.js +116 -0
  83. package/node_modules/@comis/web/dist/assets/ic-empty-state-60l2ePhd.js +52 -0
  84. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +359 -0
  85. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +33 -0
  86. package/node_modules/@comis/web/dist/assets/ic-layer-waterfall-COvEYMg5.js +69 -0
  87. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +12 -0
  88. package/node_modules/@comis/web/dist/assets/ic-search-input-CSOxY9g7.js +92 -0
  89. package/node_modules/@comis/web/dist/assets/ic-select-Ce-Raudx.js +127 -0
  90. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +95 -0
  91. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +33 -0
  92. package/node_modules/@comis/web/dist/assets/ic-time-range-picker-CypCT68y.js +93 -0
  93. package/node_modules/@comis/web/dist/assets/ic-tool-call-7MaXSsCW.js +146 -0
  94. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +2830 -0
  95. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +1 -0
  96. package/node_modules/@comis/web/dist/assets/mcp-management-BNZPnpDn.js +582 -0
  97. package/node_modules/@comis/web/dist/assets/media-config-BBvTYxOX.js +314 -0
  98. package/node_modules/@comis/web/dist/assets/media-test-BkK3RCRK.js +496 -0
  99. package/node_modules/@comis/web/dist/assets/memory-inspector-1hDGCGat.js +1139 -0
  100. package/node_modules/@comis/web/dist/assets/message-center-CXefwsUu.js +785 -0
  101. package/node_modules/@comis/web/dist/assets/models-C1qcU_j3.js +894 -0
  102. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +1 -0
  103. package/node_modules/@comis/web/dist/assets/observe-view-C0VBhX4C.js +814 -0
  104. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +1496 -0
  105. package/node_modules/@comis/web/dist/assets/pipeline-history-DkfOQ6SW.js +317 -0
  106. package/node_modules/@comis/web/dist/assets/pipeline-history-detail-hyHgD0ai.js +287 -0
  107. package/node_modules/@comis/web/dist/assets/pipeline-list-BPW8hV-q.js +518 -0
  108. package/node_modules/@comis/web/dist/assets/pipeline-monitor-Bip16T7e.js +972 -0
  109. package/node_modules/@comis/web/dist/assets/scheduler-BGgwKd06.js +1182 -0
  110. package/node_modules/@comis/web/dist/assets/security-D15st4xx.js +1224 -0
  111. package/node_modules/@comis/web/dist/assets/session-detail-SGEYNJ0M.js +632 -0
  112. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +1 -0
  113. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +231 -0
  114. package/node_modules/@comis/web/dist/assets/setup-wizard-nT0tz9QP.js +853 -0
  115. package/node_modules/@comis/web/dist/assets/skills-D8yVfSUy.js +1051 -0
  116. package/node_modules/@comis/web/dist/assets/subagents-HHXMeHYo.js +193 -0
  117. package/node_modules/@comis/web/dist/assets/workspace-manager-BQlr10iH.js +785 -0
  118. package/node_modules/@comis/web/dist/comis-logo.png +0 -0
  119. package/node_modules/@comis/web/dist/favicon-16x16.png +0 -0
  120. package/node_modules/@comis/web/dist/favicon-32x32.png +0 -0
  121. package/node_modules/@comis/web/dist/favicon.ico +0 -0
  122. package/node_modules/@comis/web/dist/index.html +17 -0
  123. package/node_modules/@comis/web/package.json +29 -0
  124. package/package.json +15 -13
@@ -0,0 +1,615 @@
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,_`
18
+ :host {
19
+ display: block;
20
+ }
21
+
22
+ .header {
23
+ display: flex;
24
+ justify-content: space-between;
25
+ align-items: baseline;
26
+ margin-bottom: 4px;
27
+ }
28
+
29
+ .label {
30
+ font-size: var(--ic-text-sm, 0.875rem);
31
+ color: var(--ic-text, #f3f4f6);
32
+ font-weight: 500;
33
+ }
34
+
35
+ .values {
36
+ font-size: var(--ic-text-xs, 0.75rem);
37
+ color: var(--ic-text-dim, #6b7280);
38
+ }
39
+
40
+ .track {
41
+ width: 100%;
42
+ height: 8px;
43
+ background: var(--ic-surface-2, #1f2937);
44
+ border-radius: var(--ic-radius-sm, 0.25rem);
45
+ overflow: hidden;
46
+ }
47
+
48
+ .bar-fill {
49
+ height: 100%;
50
+ border-radius: var(--ic-radius-sm, 0.25rem);
51
+ transition: width var(--ic-transition, 150ms ease);
52
+ min-width: 0;
53
+ }
54
+
55
+ .bar-fill--success {
56
+ background: var(--ic-success);
57
+ }
58
+
59
+ .bar-fill--warning {
60
+ background: var(--ic-warning);
61
+ }
62
+
63
+ .bar-fill--danger {
64
+ background: var(--ic-error);
65
+ }
66
+
67
+ .unlimited {
68
+ font-size: var(--ic-text-xs, 0.75rem);
69
+ color: var(--ic-text-dim, #6b7280);
70
+ font-style: italic;
71
+ }
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}
282
+ </div>
283
+ </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>
325
+ </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,_`
327
+ :host {
328
+ display: block;
329
+ }
330
+
331
+ /* Header */
332
+ .header {
333
+ display: flex;
334
+ justify-content: space-between;
335
+ align-items: center;
336
+ margin-bottom: var(--ic-space-lg, 1.5rem);
337
+ }
338
+
339
+ .header-left {
340
+ display: flex;
341
+ flex-direction: column;
342
+ gap: var(--ic-space-xs, 0.25rem);
343
+ }
344
+
345
+ .agent-title {
346
+ display: flex;
347
+ align-items: center;
348
+ gap: var(--ic-space-sm, 0.5rem);
349
+ }
350
+
351
+ .agent-title h1 {
352
+ font-size: var(--ic-text-xl, 1.25rem);
353
+ font-weight: 700;
354
+ margin: 0;
355
+ }
356
+
357
+ .header-actions {
358
+ display: flex;
359
+ gap: var(--ic-space-sm, 0.5rem);
360
+ }
361
+
362
+ .btn {
363
+ display: inline-flex;
364
+ align-items: center;
365
+ gap: var(--ic-space-xs, 0.25rem);
366
+ padding: var(--ic-space-sm, 0.5rem) var(--ic-space-md, 0.75rem);
367
+ border: 1px solid var(--ic-border, #374151);
368
+ border-radius: var(--ic-radius-md, 0.5rem);
369
+ font-size: var(--ic-text-sm, 0.875rem);
370
+ font-weight: 500;
371
+ font-family: inherit;
372
+ cursor: pointer;
373
+ transition: background var(--ic-transition, 150ms ease),
374
+ border-color var(--ic-transition, 150ms ease),
375
+ color var(--ic-transition, 150ms ease);
376
+ }
377
+
378
+ .btn--primary {
379
+ background: var(--ic-accent, #3b82f6);
380
+ color: #fff;
381
+ border-color: var(--ic-accent, #3b82f6);
382
+ }
383
+
384
+ .btn--primary:hover {
385
+ background: var(--ic-accent-hover, #2563eb);
386
+ }
387
+
388
+ .btn--secondary {
389
+ background: transparent;
390
+ color: var(--ic-text, #f3f4f6);
391
+ }
392
+
393
+ .btn--secondary:hover {
394
+ background: var(--ic-surface-2, #1f2937);
395
+ border-color: var(--ic-accent, #3b82f6);
396
+ }
397
+
398
+ .btn--danger {
399
+ background: transparent;
400
+ color: var(--ic-error, #f87171);
401
+ border-color: var(--ic-error, #f87171);
402
+ }
403
+
404
+ .btn--danger:hover {
405
+ background: color-mix(in srgb, var(--ic-error, #f87171) 10%, transparent);
406
+ }
407
+
408
+ .btn:disabled {
409
+ opacity: 0.5;
410
+ cursor: not-allowed;
411
+ }
412
+
413
+ /* Two-column layout */
414
+ .detail-layout {
415
+ display: grid;
416
+ grid-template-columns: 3fr 2fr;
417
+ gap: var(--ic-space-lg, 1.5rem);
418
+ }
419
+
420
+ .left-column,
421
+ .right-column {
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: var(--ic-space-lg, 1.5rem);
425
+ }
426
+
427
+ /* Card */
428
+ .card {
429
+ background: var(--ic-surface, #111827);
430
+ border: 1px solid var(--ic-border, #374151);
431
+ border-radius: var(--ic-radius-md, 0.5rem);
432
+ padding: var(--ic-space-lg, 1.5rem);
433
+ }
434
+
435
+ .card-title {
436
+ font-size: var(--ic-text-md, 1rem);
437
+ font-weight: 600;
438
+ margin: 0 0 var(--ic-space-md, 0.75rem) 0;
439
+ }
440
+
441
+ /* Identity rows */
442
+ .identity-row {
443
+ display: flex;
444
+ justify-content: space-between;
445
+ align-items: baseline;
446
+ padding: var(--ic-space-xs, 0.25rem) 0;
447
+ border-bottom: 1px solid color-mix(in srgb, var(--ic-border, #374151) 50%, transparent);
448
+ }
449
+
450
+ .identity-row:last-child {
451
+ border-bottom: none;
452
+ }
453
+
454
+ .identity-label {
455
+ font-size: var(--ic-text-sm, 0.875rem);
456
+ color: var(--ic-text-dim, #858d9d);
457
+ }
458
+
459
+ .identity-value {
460
+ font-size: var(--ic-text-sm, 0.875rem);
461
+ color: var(--ic-text, #f3f4f6);
462
+ font-weight: 500;
463
+ }
464
+
465
+ .identity-value--mono {
466
+ font-family: var(--ic-font-mono, monospace);
467
+ font-size: var(--ic-text-xs, 0.75rem);
468
+ }
469
+
470
+ /* Stats 2x2 grid */
471
+ .stat-grid {
472
+ display: grid;
473
+ grid-template-columns: 1fr 1fr;
474
+ gap: var(--ic-space-sm, 0.5rem);
475
+ }
476
+
477
+ /* Config groups */
478
+ .config-group {
479
+ margin-bottom: var(--ic-space-md, 0.75rem);
480
+ }
481
+
482
+ .config-group:last-child {
483
+ margin-bottom: 0;
484
+ }
485
+
486
+ .config-group-title {
487
+ font-size: var(--ic-text-xs, 0.75rem);
488
+ font-weight: 600;
489
+ text-transform: uppercase;
490
+ letter-spacing: 0.05em;
491
+ color: var(--ic-text-dim, #858d9d);
492
+ margin: 0 0 var(--ic-space-xs, 0.25rem) 0;
493
+ }
494
+
495
+ /* Budget gauges */
496
+ .budget-gauges {
497
+ display: flex;
498
+ justify-content: space-around;
499
+ gap: var(--ic-space-md, 0.75rem);
500
+ }
501
+
502
+ .budget-empty {
503
+ color: var(--ic-text-dim, #858d9d);
504
+ font-size: var(--ic-text-sm, 0.875rem);
505
+ font-style: italic;
506
+ text-align: center;
507
+ padding: var(--ic-space-md, 0.75rem) 0;
508
+ }
509
+
510
+ /* Circuit breaker */
511
+ .circuit-breaker {
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: var(--ic-space-xs, 0.25rem);
515
+ }
516
+
517
+ .cb-row {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: var(--ic-space-sm, 0.5rem);
521
+ font-size: var(--ic-text-sm, 0.875rem);
522
+ }
523
+
524
+ .cb-label {
525
+ color: var(--ic-text-dim, #858d9d);
526
+ min-width: 80px;
527
+ }
528
+
529
+ /* Skills */
530
+ .skill-chips {
531
+ display: flex;
532
+ flex-wrap: wrap;
533
+ gap: var(--ic-space-xs, 0.25rem);
534
+ }
535
+
536
+ .muted {
537
+ color: var(--ic-text-dim, #858d9d);
538
+ font-size: var(--ic-text-sm, 0.875rem);
539
+ font-style: italic;
540
+ }
541
+
542
+ /* Heartbeat */
543
+ .heartbeat-info {
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: var(--ic-space-xs, 0.25rem);
547
+ }
548
+
549
+ .hb-row {
550
+ display: flex;
551
+ align-items: center;
552
+ gap: var(--ic-space-sm, 0.5rem);
553
+ font-size: var(--ic-text-sm, 0.875rem);
554
+ }
555
+
556
+ .hb-label {
557
+ color: var(--ic-text-dim, #858d9d);
558
+ min-width: 100px;
559
+ }
560
+
561
+ .hb-running {
562
+ color: var(--ic-accent, #3b82f6);
563
+ font-size: var(--ic-text-xs, 0.75rem);
564
+ font-style: italic;
565
+ }
566
+
567
+ /* Error state */
568
+ .error-container {
569
+ text-align: center;
570
+ padding: var(--ic-space-2xl, 3rem);
571
+ color: var(--ic-text-muted, #9ca3af);
572
+ }
573
+
574
+ .error-message {
575
+ margin-bottom: var(--ic-space-md, 0.75rem);
576
+ color: var(--ic-error, #f87171);
577
+ }
578
+
579
+ .retry-btn {
580
+ padding: var(--ic-space-sm, 0.5rem) var(--ic-space-md, 0.75rem);
581
+ background: transparent;
582
+ border: 1px solid var(--ic-border, #374151);
583
+ border-radius: var(--ic-radius-md, 0.5rem);
584
+ color: var(--ic-text, #f3f4f6);
585
+ font-size: var(--ic-text-sm, 0.875rem);
586
+ font-family: inherit;
587
+ cursor: pointer;
588
+ }
589
+
590
+ .retry-btn:hover {
591
+ border-color: var(--ic-accent, #3b82f6);
592
+ color: var(--ic-accent, #3b82f6);
593
+ }
594
+
595
+ /* Responsive */
596
+ @media (max-width: 767px) {
597
+ .detail-layout {
598
+ grid-template-columns: 1fr;
599
+ }
600
+
601
+ .stat-grid {
602
+ grid-template-columns: 1fr;
603
+ }
604
+
605
+ .header {
606
+ flex-direction: column;
607
+ align-items: flex-start;
608
+ gap: var(--ic-space-sm, 0.5rem);
609
+ }
610
+
611
+ .budget-gauges {
612
+ flex-wrap: wrap;
613
+ }
614
+ }
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};