getkova 2026.4.21 → 2026.4.22

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 (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1,918 @@
1
+ import{i as e,n as t}from"./lit-zdTgzAJI.js";import{t as n}from"./preload-helper-Chd9yIcd.js";import{l as r}from"./format-BahKhiOC.js";import{A as i,C as a,D as o,E as s,F as c,G as l,I as u,L as d,M as f,O as p,P as m,S as h,T as g,_,b as v,i as y,j as b,k as x,n as S,o as C,r as w,v as T,w as E,x as D,y as ee}from"./index-XGDpaFxG.js";import{r as O}from"./channel-config-extras-YNNd-4PG.js";import{i as k,n as A,r as j,t as M}from"./skills-shared-Bg0Qcnkp.js";function N(n){let{agent:r,configForm:i,agentFilesList:c,configLoading:l,configSaving:u,configDirty:d,onConfigReload:f,onConfigSave:m,onModelChange:h,onModelFallbacksChange:_,onSelectPanel:v}=n,y=g(i,r.id),b=r.model,x=(c&&c.agentId===r.id?c.workspace:null)||y.entry?.workspace||y.defaults?.workspace||r.workspace||`default`,S=y.entry?.model?o(y.entry?.model):y.defaults?.model?o(y.defaults?.model):o(b),C=o(y.defaults?.model??b),w=p(y.entry?.model),T=p(y.defaults?.model)||(C===`-`?null:a(C))||(i?null:p(b)),D=w??T??null,O=s(y.entry?.model)??s(y.defaults?.model)??(i?null:s(b))??[],k=Array.isArray(y.entry?.skills)?y.entry?.skills:null,A=k?.length??null,j=!!(n.defaultId&&r.id===n.defaultId),M=!i||l||u,N=e=>{let t=O.filter((t,n)=>n!==e);_(r.id,t)};return e`
2
+ <section class="card">
3
+ <div class="card-title">Overview</div>
4
+ <div class="card-sub">Workspace paths and identity metadata.</div>
5
+
6
+ <div class="agents-overview-grid" style="margin-top: 16px;">
7
+ <div class="agent-kv">
8
+ <div class="label">Workspace</div>
9
+ <div>
10
+ <button
11
+ type="button"
12
+ class="workspace-link mono"
13
+ @click=${()=>v(`files`)}
14
+ title="Open Files tab"
15
+ >
16
+ ${x}
17
+ </button>
18
+ </div>
19
+ </div>
20
+ <div class="agent-kv">
21
+ <div class="label">Primary Model</div>
22
+ <div class="mono">${S}</div>
23
+ </div>
24
+ <div class="agent-kv">
25
+ <div class="label">Skills Filter</div>
26
+ <div>${k?`${A} selected`:`all skills`}</div>
27
+ </div>
28
+ </div>
29
+
30
+ ${d?e`
31
+ <div class="callout warn" style="margin-top: 16px">
32
+ You have unsaved config changes.
33
+ </div>
34
+ `:t}
35
+
36
+ <div class="agent-model-select" style="margin-top: 20px;">
37
+ <div class="label">Model Selection</div>
38
+ <div class="agent-model-fields">
39
+ <label class="field">
40
+ <span>Primary model${j?` (default)`:``}</span>
41
+ <select
42
+ .value=${j?D??``:w??``}
43
+ ?disabled=${M}
44
+ @change=${e=>h(r.id,e.target.value||null)}
45
+ >
46
+ ${j?e` <option value="">Not set</option> `:e`
47
+ <option value="">
48
+ ${T?`Inherit default (${T})`:`Inherit default`}
49
+ </option>
50
+ `}
51
+ ${ee(i,D??void 0,n.modelCatalog)}
52
+ </select>
53
+ </label>
54
+ <div class="field">
55
+ <span>Fallbacks</span>
56
+ <div
57
+ class="agent-chip-input"
58
+ @click=${e=>{let t=e.currentTarget.querySelector(`input`);t&&t.focus()}}
59
+ >
60
+ ${O.map((t,n)=>e`
61
+ <span class="chip">
62
+ ${t}
63
+ <button
64
+ type="button"
65
+ class="chip-remove"
66
+ ?disabled=${M}
67
+ @click=${()=>N(n)}
68
+ >
69
+ &times;
70
+ </button>
71
+ </span>
72
+ `)}
73
+ <input
74
+ ?disabled=${M}
75
+ placeholder=${O.length===0?`provider/model`:``}
76
+ @keydown=${e=>{let t=e.target;if(e.key===`Enter`||e.key===`,`){e.preventDefault();let n=E(t.value);n.length>0&&(_(r.id,[...O,...n]),t.value=``)}}}
77
+ @blur=${e=>{let t=e.target,n=E(t.value);n.length>0&&(_(r.id,[...O,...n]),t.value=``)}}
78
+ />
79
+ </div>
80
+ </div>
81
+ </div>
82
+ <div class="agent-model-actions">
83
+ <button
84
+ type="button"
85
+ class="btn btn--sm"
86
+ ?disabled=${l}
87
+ @click=${f}
88
+ >
89
+ Reload Config
90
+ </button>
91
+ <button
92
+ type="button"
93
+ class="btn btn--sm primary"
94
+ ?disabled=${u||!d}
95
+ @click=${m}
96
+ >
97
+ ${u?`Saving…`:`Save`}
98
+ </button>
99
+ </div>
100
+ </div>
101
+ </section>
102
+ `}var P=Object.defineProperty,te=(e,t,n)=>t in e?P(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,F=(e,t,n)=>te(e,typeof t==`symbol`?t:t+``,n),I={classPrefix:`cm-`,theme:`github`,linkTarget:`_blank`,sanitize:!1,plugins:[],customRenderers:{}};function L(e){return{...I,...e,plugins:e?.plugins??[],customRenderers:e?.customRenderers??{}}}function ne(e,t){return typeof t==`function`?t(e):e}function R(e,t){let n=L(t),r=n.classPrefix,i=e;for(let e of n.plugins)e.transformBlock&&(i=i.map(e.transformBlock));let a=`<div class="${r}preview">${i.map(e=>{for(let t of n.plugins)if(t.renderBlock){let r=t.renderBlock(e,()=>z(e,n));if(r!==null)return r}let t=n.customRenderers[e.type];return t?t(e):z(e,n)}).join(`
103
+ `)}</div>`;return a=ne(a,n.sanitize),a}async function re(e,t){let n=L(t);for(let e of n.plugins)e.init&&await e.init();let r=R(e,t);for(let e of n.plugins)e.postProcess&&(r=await e.postProcess(r));return r}function z(e,t){let n=t.classPrefix;switch(e.type){case`paragraph`:return`<p class="${n}paragraph">${K(e.content,t)}</p>`;case`heading`:return ie(e,t);case`bulletList`:return ae(e,t);case`numberedList`:return B(e,t);case`checkList`:return V(e,t);case`codeBlock`:return H(e,t);case`blockquote`:return`<blockquote class="${n}blockquote">${K(e.content,t)}</blockquote>`;case`table`:return U(e,t);case`image`:return W(e,t);case`divider`:return`<hr class="${n}divider" />`;case`callout`:return G(e,t);default:return`<div class="${n}unknown">${K(e.content,t)}</div>`}}function ie(e,t){let n=t.classPrefix,r=e.props.level,i=`h${r}`;return`<${i} class="${n}heading ${n}h${r}">${K(e.content,t)}</${i}>`}function ae(e,t){return`<ul class="${t.classPrefix}bullet-list">
104
+ ${e.children.map(e=>`<li>${K(e.content,t)}</li>`).join(`
105
+ `)}
106
+ </ul>`}function B(e,t){return`<ol class="${t.classPrefix}numbered-list">
107
+ ${e.children.map(e=>`<li>${K(e.content,t)}</li>`).join(`
108
+ `)}
109
+ </ol>`}function V(e,t){let n=t.classPrefix,r=e.props.checked;return`
110
+ <div class="${n}checklist-item">
111
+ <input type="checkbox" ${r?`checked disabled`:`disabled`} />
112
+ <span class="${r?`${n}checked`:``}">${K(e.content,t)}</span>
113
+ </div>`.trim()}function H(e,t){let n=t.classPrefix,r=e.content.map(e=>e.text).join(``),i=e.props.language||``,a=J(r),o=i?` language-${i}`:``;return`<pre class="${n}code-block"${i?` data-language="${i}"`:``}><code class="${n}code${o}">${a}</code></pre>`}function U(e,t){let n=t.classPrefix,{headers:r,rows:i,alignments:a}=e.props,o=e=>{let t=a?.[e];return t?` style="text-align: ${t}"`:``};return`<table class="${n}table">
114
+ ${r.length>0?`<thead><tr>${r.map((e,t)=>`<th${o(t)}>${J(e)}</th>`).join(``)}</tr></thead>`:``}
115
+ <tbody>
116
+ ${i.map(e=>`<tr>${e.map((e,t)=>`<td${o(t)}>${J(e)}</td>`).join(``)}</tr>`).join(`
117
+ `)}
118
+ </tbody>
119
+ </table>`}function W(e,t){let n=t.classPrefix,{url:r,alt:i,title:a,width:o,height:s}=e.props,c=i?` alt="${J(i)}"`:` alt=""`,l=a?` title="${J(a)}"`:``,u=o?` width="${o}"`:``,d=s?` height="${s}"`:``;return`<figure class="${n}image">${`<img src="${J(r)}"${c}${l}${u}${d} />`}${i?`<figcaption>${J(i)}</figcaption>`:``}</figure>`}function G(e,t){let n=t.classPrefix,r=e.props.type;return`
120
+ <div class="${n}callout ${n}callout-${r}" role="alert">
121
+ <strong class="${n}callout-title">${r}</strong>
122
+ <div class="${n}callout-content">${K(e.content,t)}</div>
123
+ </div>`.trim()}function K(e,t){return e.map(e=>q(e,t)).join(``)}function q(e,t){let n=J(e.text),r=e.styles;if(r.code&&(n=`<code>${n}</code>`),r.highlight&&(n=`<mark>${n}</mark>`),r.strikethrough&&(n=`<del>${n}</del>`),r.underline&&(n=`<u>${n}</u>`),r.italic&&(n=`<em>${n}</em>`),r.bold&&(n=`<strong>${n}</strong>`),r.link){let e=t.linkTarget===`_blank`?` target="_blank" rel="noopener noreferrer"`:``,i=r.link.title?` title="${J(r.link.title)}"`:``;n=`<a href="${J(r.link.url)}"${i}${e}>${n}</a>`}return n}function J(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`)}function oe(e){return[...[1,2,3,4,5,6].map(t=>({tag:`h${t}`,classes:[`${e}heading`,`${e}h${t}`]})),{tag:`p`,classes:[`${e}paragraph`]},{tag:`ul`,classes:[`${e}bullet-list`]},{tag:`ol`,classes:[`${e}numbered-list`]},{tag:`pre`,classes:[`${e}code-block`]},{tag:`blockquote`,classes:[`${e}blockquote`]},{tag:`hr`,classes:[`${e}divider`]},{tag:`table`,classes:[`${e}table`]},{tag:`figure`,classes:[`${e}image`]}]}function se(e,t){let n=t.join(` `),r=/\bclass\s*=\s*"([^"]*)"/i,i=e.match(r);return i?e.replace(r,`class="${n} ${i[1]}"`):e.endsWith(`/>`)?e.slice(0,-2)+` class="${n}" />`:e.slice(0,-1)+` class="${n}">`}function ce(e,t){return e.replace(/(?<!<figure[^>]*>\s*)(<img\s[^>]*\/?>)(?!\s*<\/figure>)/gi,`<figure class="${t}image">$1</figure>`)}function le(e,t){let n=t?.classPrefix??`cm-`,r=t?.wrapperClass??`${n}preview`,i=oe(n),a=e;for(let{tag:e,classes:t}of i){let n=RegExp(`<${e}(\\s[^>]*)?>|<${e}\\s*\\/?>`,`gi`);a=a.replace(n,e=>se(e,t))}return a=ce(a,n),a=`<div class="${r}">${a}</div>`,typeof t?.sanitize==`function`&&(a=t.sanitize(a)),a}async function ue(e){try{return(await n(()=>import(`./dist-D8DZLmCF.js`),[],import.meta.url)).parse(e)}catch{throw Error(`@create-markdown/core is required to parse markdown in <markdown-preview>. Install it, or provide pre-parsed blocks via the blocks attribute / setBlocks().`)}}F(class extends HTMLElement{constructor(){super(),F(this,`_shadow`,null),F(this,`plugins`,[]),F(this,`defaultTheme`,`github`),F(this,`styleElement`),F(this,`contentElement`);let e=this.constructor._shadowMode;e!==`none`&&(this._shadow=this.attachShadow({mode:e})),this.styleElement=document.createElement(`style`),this.renderRoot.appendChild(this.styleElement),this.contentElement=document.createElement(`div`),this.contentElement.className=`markdown-preview-content`,this.renderRoot.appendChild(this.contentElement),this.updateStyles()}static get observedAttributes(){return[`theme`,`link-target`,`async`]}get renderRoot(){return this._shadow??this}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){this.render()}setPlugins(e){this.plugins=e,this.render()}setDefaultTheme(e){this.defaultTheme=e,this.render()}getMarkdown(){let e=this.getAttribute(`blocks`);if(e)try{return JSON.parse(e).map(e=>e.content.map(e=>e.text).join(``)).join(`
124
+
125
+ `)}catch{return``}return this.textContent||``}setMarkdown(e){this.textContent=e,this.render()}setBlocks(e){this.setAttribute(`blocks`,JSON.stringify(e)),this.render()}getOptions(){return{theme:this.getAttribute(`theme`)||this.defaultTheme,linkTarget:this.getAttribute(`link-target`)||`_blank`,plugins:this.plugins}}async getBlocks(){let e=this.getAttribute(`blocks`);if(e)try{return JSON.parse(e)}catch{return console.warn(`Invalid blocks JSON in markdown-preview element`),[]}return ue(this.textContent||``)}async render(){let e=await this.getBlocks(),t=this.getOptions(),n=this.hasAttribute(`async`)||this.plugins.length>0;try{let r;r=n?await re(e,t):R(e,t),this.contentElement.innerHTML=r}catch(e){console.error(`Error rendering markdown preview:`,e),this.contentElement.innerHTML=`<div class="error">Error rendering content</div>`}}updateStyles(){let e=this.plugins.filter(e=>e.getCSS).map(e=>e.getCSS()).join(`
126
+
127
+ `),t=this._shadow?`:host { display: block; }`:`markdown-preview { display: block; }`;this.styleElement.textContent=`
128
+ ${t}
129
+
130
+ .markdown-preview-content {
131
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
132
+ font-size: 16px;
133
+ line-height: 1.6;
134
+ }
135
+
136
+ .error {
137
+ color: #cf222e;
138
+ padding: 1rem;
139
+ background: #ffebe9;
140
+ border-radius: 6px;
141
+ }
142
+
143
+ ${e}
144
+ `.trim()}},`_shadowMode`,`open`);function Y(t,n,r){return e`
145
+ <section class="card">
146
+ <div class="card-title">Agent Context</div>
147
+ <div class="card-sub">${n}</div>
148
+ <div class="agents-overview-grid" style="margin-top: 16px;">
149
+ <div class="agent-kv">
150
+ <div class="label">Workspace</div>
151
+ <div>
152
+ <button
153
+ type="button"
154
+ class="workspace-link mono"
155
+ @click=${()=>r(`files`)}
156
+ title="Open Files tab"
157
+ >
158
+ ${t.workspace}
159
+ </button>
160
+ </div>
161
+ </div>
162
+ <div class="agent-kv">
163
+ <div class="label">Primary Model</div>
164
+ <div class="mono">${t.model}</div>
165
+ </div>
166
+ <div class="agent-kv">
167
+ <div class="label">Identity Name</div>
168
+ <div>${t.identityName}</div>
169
+ </div>
170
+ <div class="agent-kv">
171
+ <div class="label">Identity Avatar</div>
172
+ <div>${t.identityAvatar}</div>
173
+ </div>
174
+ <div class="agent-kv">
175
+ <div class="label">Skills Filter</div>
176
+ <div>${t.skillsLabel}</div>
177
+ </div>
178
+ <div class="agent-kv">
179
+ <div class="label">Default</div>
180
+ <div>${t.isDefault?`yes`:`no`}</div>
181
+ </div>
182
+ </div>
183
+ </section>
184
+ `}function de(e,t){let n=e.channelMeta?.find(e=>e.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function fe(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:de(e,t),accounts:e.channelAccounts?.[t]??[]}))}var pe=[`groupPolicy`,`streamMode`,`dmPolicy`];function me(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1;(i.connected===!0||i.running===!0||e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function he(n){let i=fe(n.snapshot),a=n.lastSuccess?r(n.lastSuccess):`never`;return e`
185
+ <section class="grid grid-cols-2">
186
+ ${Y(n.context,`Workspace, identity, and model configuration.`,n.onSelectPanel)}
187
+ <section class="card">
188
+ <div class="row" style="justify-content: space-between;">
189
+ <div>
190
+ <div class="card-title">Channels</div>
191
+ <div class="card-sub">Gateway-wide channel status snapshot.</div>
192
+ </div>
193
+ <button class="btn btn--sm" ?disabled=${n.loading} @click=${n.onRefresh}>
194
+ ${n.loading?`Refreshing…`:`Refresh`}
195
+ </button>
196
+ </div>
197
+ <div class="muted" style="margin-top: 8px;">Last refresh: ${a}</div>
198
+ ${n.error?e`<div class="callout danger" style="margin-top: 12px;">${n.error}</div>`:t}
199
+ ${n.snapshot?t:e`
200
+ <div class="callout info" style="margin-top: 12px">
201
+ Load channels to see live status.
202
+ </div>
203
+ `}
204
+ ${i.length===0?e` <div class="muted" style="margin-top: 16px">No channels found.</div> `:e`
205
+ <div class="list" style="margin-top: 16px;">
206
+ ${i.map(r=>{let i=me(r.accounts),a=i.total?`${i.connected}/${i.total} connected`:`no accounts`,o=i.configured?`${i.configured} configured`:`not configured`,s=i.total?`${i.enabled} enabled`:`disabled`,c=O({configForm:n.configForm,channelId:r.id,fields:pe});return e`
207
+ <div class="list-item">
208
+ <div class="list-main">
209
+ <div class="list-title">${r.label}</div>
210
+ <div class="list-sub mono">${r.id}</div>
211
+ </div>
212
+ <div class="list-meta">
213
+ <div>${a}</div>
214
+ <div>${o}</div>
215
+ <div>${s}</div>
216
+ ${i.configured===0?e`
217
+ <div>
218
+ <a
219
+ href="https://docs.kova.ai/channels"
220
+ target="_blank"
221
+ rel="noopener"
222
+ style="color: var(--accent); font-size: 12px"
223
+ >Setup guide</a
224
+ >
225
+ </div>
226
+ `:t}
227
+ ${c.length>0?c.map(t=>e`<div>${t.label}: ${t.value}</div>`):t}
228
+ </div>
229
+ </div>
230
+ `})}
231
+ </div>
232
+ `}
233
+ </section>
234
+ </section>
235
+ `}function ge(n){let r=n.jobs.filter(e=>e.agentId===n.agentId);return e`
236
+ <section class="grid grid-cols-2">
237
+ ${Y(n.context,`Workspace and scheduling targets.`,n.onSelectPanel)}
238
+ <section class="card">
239
+ <div class="row" style="justify-content: space-between;">
240
+ <div>
241
+ <div class="card-title">Scheduler</div>
242
+ <div class="card-sub">Gateway cron status.</div>
243
+ </div>
244
+ <button class="btn btn--sm" ?disabled=${n.loading} @click=${n.onRefresh}>
245
+ ${n.loading?`Refreshing…`:`Refresh`}
246
+ </button>
247
+ </div>
248
+ <div class="stat-grid" style="margin-top: 16px;">
249
+ <div class="stat">
250
+ <div class="stat-label">Enabled</div>
251
+ <div class="stat-value">
252
+ ${n.status?n.status.enabled?`Yes`:`No`:`n/a`}
253
+ </div>
254
+ </div>
255
+ <div class="stat">
256
+ <div class="stat-label">Jobs</div>
257
+ <div class="stat-value">${n.status?.jobs??`n/a`}</div>
258
+ </div>
259
+ <div class="stat">
260
+ <div class="stat-label">Next wake</div>
261
+ <div class="stat-value">${C(n.status?.nextWakeAtMs??null)}</div>
262
+ </div>
263
+ </div>
264
+ ${n.error?e`<div class="callout danger" style="margin-top: 12px;">${n.error}</div>`:t}
265
+ </section>
266
+ </section>
267
+ <section class="card">
268
+ <div class="card-title">Agent Cron Jobs</div>
269
+ <div class="card-sub">Scheduled jobs targeting this agent.</div>
270
+ ${r.length===0?e` <div class="muted" style="margin-top: 16px">No jobs assigned.</div> `:e`
271
+ <div class="list" style="margin-top: 16px;">
272
+ ${r.map(r=>e`
273
+ <div class="list-item">
274
+ <div class="list-main">
275
+ <div class="list-title">${r.name}</div>
276
+ ${r.description?e`<div class="list-sub">${r.description}</div>`:t}
277
+ <div class="chip-row" style="margin-top: 6px;">
278
+ <span class="chip">${w(r)}</span>
279
+ <span class="chip ${r.enabled?`chip-ok`:`chip-warn`}">
280
+ ${r.enabled?`enabled`:`disabled`}
281
+ </span>
282
+ <span class="chip">${r.sessionTarget}</span>
283
+ </div>
284
+ </div>
285
+ <div class="list-meta">
286
+ <div class="mono">${y(r)}</div>
287
+ <div class="muted">${S(r)}</div>
288
+ <button
289
+ class="btn btn--sm"
290
+ style="margin-top: 6px;"
291
+ ?disabled=${!r.enabled}
292
+ @click=${()=>n.onRunNow(r.id)}
293
+ >
294
+ Run Now
295
+ </button>
296
+ </div>
297
+ </div>
298
+ `)}
299
+ </div>
300
+ `}
301
+ </section>
302
+ `}function _e(n){let r=n.agentFilesList?.agentId===n.agentId?n.agentFilesList:null,i=r?.files??[],a=n.agentFileActive??null,o=a?i.find(e=>e.name===a)??null:null,s=a?n.agentFileContents[a]??``:``,l=a?n.agentFileDrafts[a]??s:``,f=a?l!==s:!1;return e`
303
+ <section class="card">
304
+ <div class="row" style="justify-content: space-between;">
305
+ <div>
306
+ <div class="card-title">Core Files</div>
307
+ <div class="card-sub">Bootstrap persona, identity, and tool guidance.</div>
308
+ </div>
309
+ <button
310
+ class="btn btn--sm"
311
+ ?disabled=${n.agentFilesLoading}
312
+ @click=${()=>n.onLoadFiles(n.agentId)}
313
+ >
314
+ ${n.agentFilesLoading?`Loading…`:`Refresh`}
315
+ </button>
316
+ </div>
317
+ ${r?e`<div class="muted mono" style="margin-top: 8px;">
318
+ Workspace: <span>${r.workspace}</span>
319
+ </div>`:t}
320
+ ${n.agentFilesError?e`<div class="callout danger" style="margin-top: 12px;">
321
+ ${n.agentFilesError}
322
+ </div>`:t}
323
+ ${r?i.length===0?e` <div class="muted" style="margin-top: 16px">No files found.</div> `:e`
324
+ <div class="agent-tabs" style="margin-top: 14px;">
325
+ ${i.map(r=>{let i=a===r.name,o=r.name.replace(/\.md$/i,``);return e`
326
+ <button
327
+ class="agent-tab ${i?`active`:``} ${r.missing?`agent-tab--missing`:``}"
328
+ @click=${()=>n.onSelectFile(r.name)}
329
+ >
330
+ ${o}${r.missing?e` <span class="agent-tab-badge">missing</span> `:t}
331
+ </button>
332
+ `})}
333
+ </div>
334
+ ${o?e`
335
+ <div class="agent-file-header" style="margin-top: 14px;">
336
+ <div>
337
+ <div class="agent-file-sub mono">${o.path}</div>
338
+ </div>
339
+ <div class="agent-file-actions">
340
+ <button
341
+ class="btn btn--sm"
342
+ title="Preview rendered markdown"
343
+ @click=${e=>{let t=e.currentTarget.closest(`.card`)?.querySelector(`dialog`);t&&t.showModal()}}
344
+ >
345
+ ${u.eye} Preview
346
+ </button>
347
+ <button
348
+ class="btn btn--sm"
349
+ ?disabled=${!f}
350
+ @click=${()=>n.onFileReset(o.name)}
351
+ >
352
+ Reset
353
+ </button>
354
+ <button
355
+ class="btn btn--sm primary"
356
+ ?disabled=${n.agentFileSaving||!f}
357
+ @click=${()=>n.onFileSave(o.name)}
358
+ >
359
+ ${n.agentFileSaving?`Saving…`:`Save`}
360
+ </button>
361
+ </div>
362
+ </div>
363
+ ${o.missing?e`
364
+ <div class="callout info" style="margin-top: 10px">
365
+ This file is missing. Saving will create it in the agent workspace.
366
+ </div>
367
+ `:t}
368
+ <label class="field agent-file-field" style="margin-top: 12px;">
369
+ <span>Content</span>
370
+ <textarea
371
+ class="agent-file-textarea"
372
+ .value=${l}
373
+ @input=${e=>n.onFileDraftChange(o.name,e.target.value)}
374
+ ></textarea>
375
+ </label>
376
+ <dialog
377
+ class="md-preview-dialog"
378
+ @click=${e=>{let t=e.currentTarget;e.target===t&&t.close()}}
379
+ @close=${e=>{e.currentTarget.querySelector(`.md-preview-dialog__panel`)?.classList.remove(`fullscreen`)}}
380
+ >
381
+ <div class="md-preview-dialog__panel">
382
+ <div class="md-preview-dialog__header">
383
+ <div class="md-preview-dialog__title mono">${o.name}</div>
384
+ <div class="md-preview-dialog__actions">
385
+ <button
386
+ class="btn btn--sm md-preview-expand-btn"
387
+ title="Toggle fullscreen"
388
+ @click=${e=>{let t=e.currentTarget,n=t.closest(`.md-preview-dialog__panel`);if(!n)return;let r=n.classList.toggle(`fullscreen`);t.classList.toggle(`is-fullscreen`,r)}}
389
+ >
390
+ <span class="when-normal">${u.maximize} Expand</span
391
+ ><span class="when-fullscreen">${u.minimize} Collapse</span>
392
+ </button>
393
+ <button
394
+ class="btn btn--sm"
395
+ title="Edit file"
396
+ @click=${e=>{e.currentTarget.closest(`dialog`)?.close(),document.querySelector(`.agent-file-textarea`)?.focus()}}
397
+ >
398
+ ${u.edit} Editor
399
+ </button>
400
+ <button
401
+ class="btn btn--sm"
402
+ @click=${e=>{e.currentTarget.closest(`dialog`)?.close()}}
403
+ >
404
+ ${u.x} Close
405
+ </button>
406
+ </div>
407
+ </div>
408
+ <div class="md-preview-dialog__body">
409
+ ${d(le(m.parse(l,{gfm:!0,breaks:!0}),{sanitize:e=>c.sanitize(e)}))}
410
+ </div>
411
+ </div>
412
+ </dialog>
413
+ `:e` <div class="muted" style="margin-top: 16px">Select a file to edit.</div> `}
414
+ `:e`
415
+ <div class="callout info" style="margin-top: 12px">
416
+ Load the agent workspace files to edit core instructions.
417
+ </div>
418
+ `}
419
+ </section>
420
+ `}function ve(n,r){let i=r.source??n.source,a=r.pluginId??n.pluginId,o=[];return i===`plugin`&&a?o.push(`plugin:${a}`):i===`core`&&o.push(`core`),r.optional&&o.push(`optional`),o.length===0?t:e`
421
+ <div style="display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px;">
422
+ ${o.map(t=>e`<span class="agent-pill">${t}</span>`)}
423
+ </div>
424
+ `}function ye(e){return e.source===`plugin`?e.pluginId?`Connected: ${e.pluginId}`:`Connected`:e.source===`channel`?e.channelId?`Channel: ${e.channelId}`:`Channel`:`Built-in`}function be(n){let r=g(n.configForm,n.agentId),a=r.entry?.tools??{},o=r.globalTools??{},s=a.profile??o.profile??`full`,c=i(n.toolsCatalogResult),l=b(n.toolsCatalogResult),u=a.profile?`agent override`:o.profile?`global default`:`default`,d=Array.isArray(a.allow)&&a.allow.length>0,p=Array.isArray(o.allow)&&o.allow.length>0,m=!!n.configForm&&!n.configLoading&&!n.configSaving&&!d&&!(n.toolsCatalogLoading&&!n.toolsCatalogResult&&!n.toolsCatalogError),h=d?[]:Array.isArray(a.alsoAllow)?a.alsoAllow:[],_=d?[]:Array.isArray(a.deny)?a.deny:[],y=d?{allow:a.allow??[],deny:a.deny??[]}:x(s)??void 0,S=l.flatMap(e=>e.tools.map(e=>e.id)),C=e=>{let t=v(e,y),n=D(e,h),r=D(e,_);return{allowed:(t||n)&&!r,baseAllowed:t,denied:r}},w=S.filter(e=>C(e).allowed).length,T=(e,t)=>{let r=new Set(h.map(e=>f(e)).filter(e=>e.length>0)),i=new Set(_.map(e=>f(e)).filter(e=>e.length>0)),a=C(e).baseAllowed,o=f(e);t?(i.delete(o),a||r.add(o)):(r.delete(o),i.add(o)),n.onOverridesChange(n.agentId,[...r],[...i])},E=e=>{let t=new Set(h.map(e=>f(e)).filter(e=>e.length>0)),r=new Set(_.map(e=>f(e)).filter(e=>e.length>0));for(let n of S){let i=C(n).baseAllowed,a=f(n);e?(r.delete(a),i||t.add(a)):(t.delete(a),r.add(a))}n.onOverridesChange(n.agentId,[...t],[...r])};return e`
425
+ <section class="card">
426
+ <div class="row" style="justify-content: space-between; flex-wrap: wrap;">
427
+ <div style="min-width: 0;">
428
+ <div class="card-title">Tool Access</div>
429
+ <div class="card-sub">
430
+ Profile + per-tool overrides for this agent.
431
+ <span class="mono">${w}/${S.length}</span> enabled.
432
+ </div>
433
+ </div>
434
+ <div class="row" style="gap: 8px; flex-wrap: wrap;">
435
+ <button class="btn btn--sm" ?disabled=${!m} @click=${()=>E(!0)}>
436
+ Enable All
437
+ </button>
438
+ <button class="btn btn--sm" ?disabled=${!m} @click=${()=>E(!1)}>
439
+ Disable All
440
+ </button>
441
+ <button
442
+ class="btn btn--sm"
443
+ ?disabled=${n.configLoading}
444
+ @click=${n.onConfigReload}
445
+ >
446
+ Reload Config
447
+ </button>
448
+ <button
449
+ class="btn btn--sm primary"
450
+ ?disabled=${n.configSaving||!n.configDirty}
451
+ @click=${n.onConfigSave}
452
+ >
453
+ ${n.configSaving?`Saving…`:`Save`}
454
+ </button>
455
+ </div>
456
+ </div>
457
+
458
+ ${n.configForm?t:e`
459
+ <div class="callout info" style="margin-top: 12px">
460
+ Load the gateway config to adjust tool profiles.
461
+ </div>
462
+ `}
463
+ ${d?e`
464
+ <div class="callout info" style="margin-top: 12px">
465
+ This agent is using an explicit allowlist in config. Tool overrides are managed in the
466
+ Config tab.
467
+ </div>
468
+ `:t}
469
+ ${p?e`
470
+ <div class="callout info" style="margin-top: 12px">
471
+ Global tools.allow is set. Agent overrides cannot enable tools that are globally
472
+ blocked.
473
+ </div>
474
+ `:t}
475
+ ${n.toolsCatalogLoading&&!n.toolsCatalogResult&&!n.toolsCatalogError?e`
476
+ <div class="callout info" style="margin-top: 12px">Loading runtime tool catalog…</div>
477
+ `:t}
478
+ ${n.toolsCatalogError?e`
479
+ <div class="callout info" style="margin-top: 12px">
480
+ Could not load runtime tool catalog. Showing built-in fallback list instead.
481
+ </div>
482
+ `:t}
483
+
484
+ <div class="agent-tools-meta" style="margin-top: 16px;">
485
+ <div class="agent-kv">
486
+ <div class="label">Profile</div>
487
+ <div class="mono">${s}</div>
488
+ </div>
489
+ <div class="agent-kv">
490
+ <div class="label">Source</div>
491
+ <div>${u}</div>
492
+ </div>
493
+ ${n.configDirty?e`
494
+ <div class="agent-kv">
495
+ <div class="label">Status</div>
496
+ <div class="mono">unsaved</div>
497
+ </div>
498
+ `:t}
499
+ </div>
500
+
501
+ <div style="margin-top: 18px;">
502
+ <div class="label">Available Right Now</div>
503
+ <div class="card-sub">
504
+ What this agent can use in the current chat session.
505
+ <span class="mono">${n.runtimeSessionKey||`no session`}</span>
506
+ </div>
507
+ ${n.runtimeSessionMatchesSelectedAgent?n.toolsEffectiveLoading&&!n.toolsEffectiveResult&&!n.toolsEffectiveError?e`
508
+ <div class="callout info" style="margin-top: 12px">Loading available tools…</div>
509
+ `:n.toolsEffectiveError?e`
510
+ <div class="callout info" style="margin-top: 12px">
511
+ Could not load available tools for this session.
512
+ </div>
513
+ `:(n.toolsEffectiveResult?.groups?.length??0)===0?e`
514
+ <div class="callout info" style="margin-top: 12px">
515
+ No tools are available for this session right now.
516
+ </div>
517
+ `:e`
518
+ <div class="agent-tools-grid" style="margin-top: 16px;">
519
+ ${n.toolsEffectiveResult?.groups.map(t=>e`
520
+ <div class="agent-tools-section">
521
+ <div class="agent-tools-header">${t.label}</div>
522
+ <div class="agent-tools-list">
523
+ ${t.tools.map(t=>e`
524
+ <div class="agent-tool-row">
525
+ <div>
526
+ <div class="agent-tool-title">${t.label}</div>
527
+ <div class="agent-tool-sub">${t.description}</div>
528
+ <div
529
+ style="display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px;"
530
+ >
531
+ <span class="agent-pill"
532
+ >${ye(t)}</span
533
+ >
534
+ </div>
535
+ </div>
536
+ </div>
537
+ `)}
538
+ </div>
539
+ </div>
540
+ `)}
541
+ </div>
542
+ `:e`
543
+ <div class="callout info" style="margin-top: 12px">
544
+ Switch chat to this agent to view its live runtime tools.
545
+ </div>
546
+ `}
547
+ </div>
548
+
549
+ <div class="agent-tools-presets" style="margin-top: 16px;">
550
+ <div class="label">Quick Presets</div>
551
+ <div class="agent-tools-buttons">
552
+ ${c.map(t=>e`
553
+ <button
554
+ class="btn btn--sm ${s===t.id?`active`:``}"
555
+ ?disabled=${!m}
556
+ @click=${()=>n.onProfileChange(n.agentId,t.id,!0)}
557
+ >
558
+ ${t.label}
559
+ </button>
560
+ `)}
561
+ <button
562
+ class="btn btn--sm"
563
+ ?disabled=${!m}
564
+ @click=${()=>n.onProfileChange(n.agentId,null,!1)}
565
+ >
566
+ Inherit
567
+ </button>
568
+ </div>
569
+ </div>
570
+
571
+ <div class="agent-tools-grid" style="margin-top: 20px;">
572
+ ${l.map(n=>e`
573
+ <div class="agent-tools-section">
574
+ <div class="agent-tools-header">
575
+ ${n.label}
576
+ ${n.source===`plugin`&&n.pluginId?e`<span class="agent-pill" style="margin-left: 8px;"
577
+ >plugin:${n.pluginId}</span
578
+ >`:t}
579
+ </div>
580
+ <div class="agent-tools-list">
581
+ ${n.tools.map(t=>{let{allowed:r}=C(t.id);return e`
582
+ <div class="agent-tool-row">
583
+ <div>
584
+ <div class="agent-tool-title mono">${t.label}</div>
585
+ <div class="agent-tool-sub">${t.description}</div>
586
+ ${ve(n,t)}
587
+ </div>
588
+ <label class="cfg-toggle">
589
+ <input
590
+ type="checkbox"
591
+ .checked=${r}
592
+ ?disabled=${!m}
593
+ @change=${e=>T(t.id,e.target.checked)}
594
+ />
595
+ <span class="cfg-toggle__track"></span>
596
+ </label>
597
+ </div>
598
+ `})}
599
+ </div>
600
+ </div>
601
+ `)}
602
+ </div>
603
+ </section>
604
+ `}function xe(n){let r=!!n.configForm&&!n.configLoading&&!n.configSaving,i=g(n.configForm,n.agentId),a=Array.isArray(i.entry?.skills)?i.entry?.skills:void 0,o=new Set((a??[]).map(e=>e.trim()).filter(Boolean)),s=a!==void 0,c=!!(n.report&&n.activeAgentId===n.agentId),l=c?n.report?.skills??[]:[],u=n.filter.trim().toLowerCase(),d=u?l.filter(e=>[e.name,e.description,e.source].join(` `).toLowerCase().includes(u)):l,f=k(d),p=s?l.filter(e=>o.has(e.name)).length:l.length,m=l.length;return e`
605
+ <section class="card">
606
+ <div class="row" style="justify-content: space-between; flex-wrap: wrap;">
607
+ <div style="min-width: 0;">
608
+ <div class="card-title">Skills</div>
609
+ <div class="card-sub">
610
+ Per-agent skill allowlist and workspace skills.
611
+ ${m>0?e`<span class="mono">${p}/${m}</span>`:t}
612
+ </div>
613
+ </div>
614
+ <div class="row" style="gap: 8px; flex-wrap: wrap;">
615
+ <div
616
+ class="row"
617
+ style="gap: 4px; border: 1px solid var(--border); border-radius: var(--radius-md); padding: 2px;"
618
+ >
619
+ <button
620
+ class="btn btn--sm"
621
+ ?disabled=${!r}
622
+ @click=${()=>n.onClear(n.agentId)}
623
+ >
624
+ Enable All
625
+ </button>
626
+ <button
627
+ class="btn btn--sm"
628
+ ?disabled=${!r}
629
+ @click=${()=>n.onDisableAll(n.agentId)}
630
+ >
631
+ Disable All
632
+ </button>
633
+ <button
634
+ class="btn btn--sm"
635
+ ?disabled=${!r||!s}
636
+ @click=${()=>n.onClear(n.agentId)}
637
+ title="Remove per-agent allowlist and use all skills"
638
+ >
639
+ Reset
640
+ </button>
641
+ </div>
642
+ <button
643
+ class="btn btn--sm"
644
+ ?disabled=${n.configLoading}
645
+ @click=${n.onConfigReload}
646
+ >
647
+ Reload Config
648
+ </button>
649
+ <button class="btn btn--sm" ?disabled=${n.loading} @click=${n.onRefresh}>
650
+ ${n.loading?`Loading…`:`Refresh`}
651
+ </button>
652
+ <button
653
+ class="btn btn--sm primary"
654
+ ?disabled=${n.configSaving||!n.configDirty}
655
+ @click=${n.onConfigSave}
656
+ >
657
+ ${n.configSaving?`Saving…`:`Save`}
658
+ </button>
659
+ </div>
660
+ </div>
661
+
662
+ ${n.configForm?t:e`
663
+ <div class="callout info" style="margin-top: 12px">
664
+ Load the gateway config to set per-agent skills.
665
+ </div>
666
+ `}
667
+ ${s?e`
668
+ <div class="callout info" style="margin-top: 12px">
669
+ This agent uses a custom skill allowlist.
670
+ </div>
671
+ `:e`
672
+ <div class="callout info" style="margin-top: 12px">
673
+ All skills are enabled. Disabling any skill will create a per-agent allowlist.
674
+ </div>
675
+ `}
676
+ ${!c&&!n.loading?e`
677
+ <div class="callout info" style="margin-top: 12px">
678
+ Load skills for this agent to view workspace-specific entries.
679
+ </div>
680
+ `:t}
681
+ ${n.error?e`<div class="callout danger" style="margin-top: 12px;">${n.error}</div>`:t}
682
+
683
+ <div class="filters" style="margin-top: 14px;">
684
+ <label class="field" style="flex: 1;">
685
+ <span>Filter</span>
686
+ <input
687
+ .value=${n.filter}
688
+ @input=${e=>n.onFilterChange(e.target.value)}
689
+ placeholder="Search skills"
690
+ autocomplete="off"
691
+ name="agent-skills-filter"
692
+ />
693
+ </label>
694
+ <div class="muted">${d.length} shown</div>
695
+ </div>
696
+
697
+ ${d.length===0?e` <div class="muted" style="margin-top: 16px">No skills found.</div> `:e`
698
+ <div class="agent-skills-groups" style="margin-top: 16px;">
699
+ ${f.map(e=>Se(e,{agentId:n.agentId,allowSet:o,usingAllowlist:s,editable:r,onToggle:n.onToggle}))}
700
+ </div>
701
+ `}
702
+ </section>
703
+ `}function Se(t,n){return e`
704
+ <details class="agent-skills-group" ?open=${!(t.id===`workspace`||t.id===`built-in`)}>
705
+ <summary class="agent-skills-header">
706
+ <span>${t.label}</span>
707
+ <span class="muted">${t.skills.length}</span>
708
+ </summary>
709
+ <div class="list skills-grid">
710
+ ${t.skills.map(e=>Ce(e,{agentId:n.agentId,allowSet:n.allowSet,usingAllowlist:n.usingAllowlist,editable:n.editable,onToggle:n.onToggle}))}
711
+ </div>
712
+ </details>
713
+ `}function Ce(n,r){let i=r.usingAllowlist?r.allowSet.has(n.name):!0,a=M(n),o=A(n);return e`
714
+ <div class="list-item agent-skill-row">
715
+ <div class="list-main">
716
+ <div class="list-title">${n.emoji?`${n.emoji} `:``}${n.name}</div>
717
+ <div class="list-sub">${n.description}</div>
718
+ ${j({skill:n})}
719
+ ${a.length>0?e`<div class="muted" style="margin-top: 6px;">Missing: ${a.join(`, `)}</div>`:t}
720
+ ${o.length>0?e`<div class="muted" style="margin-top: 6px;">Reason: ${o.join(`, `)}</div>`:t}
721
+ </div>
722
+ <div class="list-meta">
723
+ <label class="cfg-toggle">
724
+ <input
725
+ type="checkbox"
726
+ .checked=${i}
727
+ ?disabled=${!r.editable}
728
+ @change=${e=>r.onToggle(r.agentId,n.name,e.target.checked)}
729
+ />
730
+ <span class="cfg-toggle__track"></span>
731
+ </label>
732
+ </div>
733
+ </div>
734
+ `}function X(n){let r=n.agentsList?.agents??[],i=n.agentsList?.defaultId??null,a=n.selectedAgentId??i??r[0]?.id??null,o=a?r.find(e=>e.id===a)??null:null,s=Oe(r,n.agentIdentityById,n.agentSoulContentById),c=r.find(e=>e.id===`main`)??null,l=r.filter(e=>e.id!==`main`&&!Z(e.id,n.agentSoulContentById[e.id])),u=a&&n.agentSkills.agentId===a?n.agentSkills.report?.skills?.length??null:null,d=n.channels.snapshot?Object.keys(n.channels.snapshot.channelAccounts??{}).length:null,f=a?n.cron.jobs.filter(e=>e.agentId===a).length:null,p={files:n.agentFiles.list?.files?.length??null,skills:u,channels:d,cron:f||null};return e`
735
+ <div class="agents-layout">
736
+ <section class="card agents-toolbar agents-toolbar--kova">
737
+ <div class="agents-toolbar-row">
738
+ <div>
739
+ <div class="card-title">Kova Employees</div>
740
+ <div class="card-sub">
741
+ Choose a teammate, jump into chat, or inspect their agent workspace below.
742
+ </div>
743
+ </div>
744
+ <div class="agents-toolbar-actions">
745
+ ${o?e`
746
+ <button
747
+ type="button"
748
+ class="btn btn--sm btn--ghost"
749
+ @click=${()=>void navigator.clipboard.writeText(o.id)}
750
+ title="Copy agent ID to clipboard"
751
+ >
752
+ Copy ID
753
+ </button>
754
+ <button
755
+ type="button"
756
+ class="btn btn--sm btn--ghost"
757
+ ?disabled=${!!(i&&o.id===i)}
758
+ @click=${()=>n.onSetDefault(o.id)}
759
+ title=${i&&o.id===i?`Already the default agent`:`Set as the default agent`}
760
+ >
761
+ ${i&&o.id===i?`Default`:`Set Default`}
762
+ </button>
763
+ `:t}
764
+ <button
765
+ class="btn btn--sm agents-refresh-btn"
766
+ ?disabled=${n.loading}
767
+ @click=${n.onRefresh}
768
+ >
769
+ ${n.loading?`Loading…`:`Refresh`}
770
+ </button>
771
+ </div>
772
+ </div>
773
+ ${n.error?e`<div class="callout danger">${n.error}</div>`:t}
774
+ </section>
775
+
776
+ <section class="agents-section">
777
+ <div
778
+ class="agents-section__header"
779
+ style="display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap;"
780
+ >
781
+ <div>
782
+ <div class="card-title">Kova Team</div>
783
+ <div class="card-sub">All Kova employees and custom teammates live here.</div>
784
+ </div>
785
+ <button type="button" class="btn btn--sm primary" @click=${n.onOpenAgentCreator}>
786
+ + New Employee
787
+ </button>
788
+ </div>
789
+ ${n.agentCreatorSuccess?e`<div class="callout success" style="margin-top: 12px;">${n.agentCreatorSuccess}</div>`:t}
790
+ ${s.length===0?e`<div class="card" style="margin-top: 12px;">
791
+ <div class="card-sub">No Kova employees are available yet.</div>
792
+ </div>`:e`<div class="agents-employee-grid">
793
+ ${s.map(e=>we({meta:e,selectedId:a,defaultId:i,onSelectAgent:n.onSelectAgent,onNavigateToChat:n.onNavigateToChat,onNavigateToActivity:n.onNavigateToActivity}))}
794
+ </div>`}
795
+ </section>
796
+
797
+ <section class="agents-section">
798
+ <div class="agents-section__header">
799
+ <div class="card-title">System</div>
800
+ <div class="card-sub">The default Kova Core Agent lives here.</div>
801
+ </div>
802
+ ${c?Te({agent:c,selectedId:a,defaultId:i,onSelectAgent:n.onSelectAgent}):e`
803
+ <div class="card agents-system-card agents-system-card--empty">
804
+ <div class="card-sub">The <code>main</code> agent is not available in the current list.</div>
805
+ </div>
806
+ `}
807
+ </section>
808
+
809
+ ${l.length>0?e`
810
+ <section class="agents-section">
811
+ <div class="agents-section__header">
812
+ <div class="card-title">Other Agents</div>
813
+ <div class="card-sub">Any additional configured agents stay available here.</div>
814
+ </div>
815
+ <div class="agents-other-grid">
816
+ ${l.map(e=>Ee({agent:e,selectedId:a,defaultId:i,onSelectAgent:n.onSelectAgent}))}
817
+ </div>
818
+ </section>
819
+ `:t}
820
+
821
+ <section class="agents-main">
822
+ ${o?e`
823
+ ${Ae(n.activePanel,e=>n.onSelectPanel(e),p)}
824
+ ${n.activePanel===`overview`?N({agent:o,basePath:n.basePath,defaultId:i,configForm:n.config.form,agentFilesList:n.agentFiles.list,agentIdentity:n.agentIdentityById[o.id]??null,agentIdentityError:n.agentIdentityError,agentIdentityLoading:n.agentIdentityLoading,configLoading:n.config.loading,configSaving:n.config.saving,configDirty:n.config.dirty,modelCatalog:n.modelCatalog,onConfigReload:n.onConfigReload,onConfigSave:n.onConfigSave,onModelChange:n.onModelChange,onModelFallbacksChange:n.onModelFallbacksChange,onSelectPanel:n.onSelectPanel}):t}
825
+ ${n.activePanel===`files`?_e({agentId:o.id,agentFilesList:n.agentFiles.list,agentFilesLoading:n.agentFiles.loading,agentFilesError:n.agentFiles.error,agentFileActive:n.agentFiles.active,agentFileContents:n.agentFiles.contents,agentFileDrafts:n.agentFiles.drafts,agentFileSaving:n.agentFiles.saving,onLoadFiles:n.onLoadFiles,onSelectFile:n.onSelectFile,onFileDraftChange:n.onFileDraftChange,onFileReset:n.onFileReset,onFileSave:n.onFileSave}):t}
826
+ ${n.activePanel===`tools`?be({agentId:o.id,configForm:n.config.form,configLoading:n.config.loading,configSaving:n.config.saving,configDirty:n.config.dirty,toolsCatalogLoading:n.toolsCatalog.loading,toolsCatalogError:n.toolsCatalog.error,toolsCatalogResult:n.toolsCatalog.result,toolsEffectiveLoading:n.toolsEffective.loading,toolsEffectiveError:n.toolsEffective.error,toolsEffectiveResult:n.toolsEffective.result,runtimeSessionKey:n.runtimeSessionKey,runtimeSessionMatchesSelectedAgent:n.runtimeSessionMatchesSelectedAgent,onProfileChange:n.onToolsProfileChange,onOverridesChange:n.onToolsOverridesChange,onConfigReload:n.onConfigReload,onConfigSave:n.onConfigSave}):t}
827
+ ${n.activePanel===`skills`?xe({agentId:o.id,report:n.agentSkills.report,loading:n.agentSkills.loading,error:n.agentSkills.error,activeAgentId:n.agentSkills.agentId,configForm:n.config.form,configLoading:n.config.loading,configSaving:n.config.saving,configDirty:n.config.dirty,filter:n.agentSkills.filter,onFilterChange:n.onSkillsFilterChange,onRefresh:n.onSkillsRefresh,onToggle:n.onAgentSkillToggle,onClear:n.onAgentSkillsClear,onDisableAll:n.onAgentSkillsDisableAll,onConfigReload:n.onConfigReload,onConfigSave:n.onConfigSave}):t}
828
+ ${n.activePanel===`channels`?he({context:T(o,n.config.form,n.agentFiles.list,i,n.agentIdentityById[o.id]??null),configForm:n.config.form,snapshot:n.channels.snapshot,loading:n.channels.loading,error:n.channels.error,lastSuccess:n.channels.lastSuccess,onRefresh:n.onChannelsRefresh,onSelectPanel:n.onSelectPanel}):t}
829
+ ${n.activePanel===`cron`?ge({context:T(o,n.config.form,n.agentFiles.list,i,n.agentIdentityById[o.id]??null),agentId:o.id,jobs:n.cron.jobs,status:n.cron.status,loading:n.cron.loading,error:n.cron.error,onRefresh:n.onCronRefresh,onRunNow:n.onCronRunNow,onSelectPanel:n.onSelectPanel}):t}
830
+ `:e`
831
+ <div class="card">
832
+ <div class="card-title">Select an agent</div>
833
+ <div class="card-sub">Pick an agent above to inspect its workspace and tools.</div>
834
+ </div>
835
+ `}
836
+ </section>
837
+ </div>
838
+ `}function we(n){let{meta:r,selectedId:i,defaultId:a}=n,o=i===r.agent.id,s=a===r.agent.id,c=De(r.autonomy);return e`
839
+ <article
840
+ class="card agents-employee-card ${o?`is-selected`:``}"
841
+ @click=${()=>n.onSelectAgent(r.agent.id)}
842
+ >
843
+ <div class="agents-employee-card__header">
844
+ <div class="agents-employee-card__avatar">${r.avatar}</div>
845
+ <div class="agents-employee-card__identity">
846
+ <div class="agents-employee-card__name-row">
847
+ <div class="agents-employee-card__name">${r.name}</div>
848
+ ${s?e`<span class="agents-chip">Default</span>`:t}
849
+ ${o?e`<span class="agents-chip agents-chip--selected">Selected</span>`:t}
850
+ </div>
851
+ <div class="agents-employee-card__role">${r.role}</div>
852
+ </div>
853
+ </div>
854
+ <div class="agents-employee-card__meta-row">
855
+ <span class="agents-autonomy-badge ${c}">${r.autonomy}</span>
856
+ <span class="agents-employee-card__agent-id">${r.agent.id}</span>
857
+ </div>
858
+ <div class="agents-employee-card__actions">
859
+ <button
860
+ type="button"
861
+ class="btn btn--sm"
862
+ @click=${e=>{e.stopPropagation(),n.onNavigateToChat(r.agent.id)}}
863
+ >
864
+ Chat
865
+ </button>
866
+ <button
867
+ type="button"
868
+ class="btn btn--sm btn--ghost"
869
+ @click=${e=>{e.stopPropagation(),n.onNavigateToActivity(r.agent.id)}}
870
+ >
871
+ Activity
872
+ </button>
873
+ </div>
874
+ </article>
875
+ `}function Te(n){let{agent:r,selectedId:i,defaultId:a}=n,o=r.id===i,s=_(r.id,a);return e`
876
+ <article
877
+ class="card agents-system-card ${o?`is-selected`:``}"
878
+ @click=${()=>n.onSelectAgent(r.id)}
879
+ >
880
+ <div class="agents-system-card__content">
881
+ <div class="agents-system-card__icon">⚙️</div>
882
+ <div>
883
+ <div class="agents-system-card__title-row">
884
+ <div class="agents-system-card__title">${h(r)}</div>
885
+ ${s?e`<span class="agents-chip">${s}</span>`:t}
886
+ </div>
887
+ <div class="agents-system-card__sub">Kova Core</div>
888
+ </div>
889
+ </div>
890
+ <button type="button" class="btn btn--sm btn--ghost">Inspect</button>
891
+ </article>
892
+ `}function Ee(n){let{agent:r,selectedId:i,defaultId:a}=n,o=r.id===i,s=_(r.id,a);return e`
893
+ <article class="card agents-other-card ${o?`is-selected`:``}">
894
+ <div>
895
+ <div class="agents-other-card__title-row">
896
+ <div class="agents-other-card__title">${h(r)}</div>
897
+ ${s?e`<span class="agents-chip">${s}</span>`:t}
898
+ </div>
899
+ <div class="agents-other-card__sub">${r.id}</div>
900
+ </div>
901
+ <button type="button" class="btn btn--sm btn--ghost" @click=${()=>n.onSelectAgent(r.id)}>
902
+ Inspect
903
+ </button>
904
+ </article>
905
+ `}function De(e){switch(e){case`Supervised`:return`agents-autonomy-badge--supervised`;case`Autonomous`:return`agents-autonomy-badge--autonomous`;default:return`agents-autonomy-badge--act-notify`}}function Oe(e,t,n){let r=new Map(l.map((e,t)=>[e.id,t]));return e.filter(e=>e.id!==`main`&&Z(e.id,n[e.id])).map(e=>{let i=l.find(t=>t.id===e.id),a=t[e.id],o=Q(n[e.id]);return{id:e.id,name:o?.name??a?.name??i?.name??h(e),role:o?.role??i?.role??`Kova Employee`,avatar:o?.emoji??a?.emoji??i?.avatar??`🤖`,autonomy:o?.autonomy??i?.autonomy??`Act + Notify`,agent:e,order:r.get(e.id)??l.length}}).toSorted((e,t)=>e.order===t.order?e.name.localeCompare(t.name):e.order-t.order)}function Z(e,t){return e.startsWith(`kova-`)||Q(t)?.kova===!0}function Q(e){if(!e)return null;let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/),n=t?.[1]??``,r=t?e.slice(t[0].length):e,i={kova:!1};for(let e of n.split(/\r?\n/)){let t=e.indexOf(`:`);if(t<0)continue;let n=e.slice(0,t).trim().toLowerCase(),r=ke(e.slice(t+1).trim());switch(n){case`kova`:i.kova=/^(true|1|yes)$/i.test(r);break;case`name`:i.name=r||void 0;break;case`role`:i.role=r||void 0;break;case`emoji`:i.emoji=r||void 0;break;case`autonomy`:i.autonomy=$(r)??i.autonomy;break;default:break}}let a=r.match(/^#\s+(\S+)\s+(.+?)\s+[—-]\s+(.+)$/m);a&&(i.emoji??=a[1]?.trim()||void 0,i.name??=a[2]?.trim()||void 0,i.role??=a[3]?.trim()||void 0);let o=r.match(/^Level:\s*(.+)$/m);return o&&(i.autonomy??=$(o[1])),i}function ke(e){if(e.startsWith(`"`)&&e.endsWith(`"`)||e.startsWith(`'`)&&e.endsWith(`'`))try{return JSON.parse(e)}catch{return e.slice(1,-1)}return e}function $(e){switch(e?.trim().toLowerCase()){case`1`:case`supervised`:return`Supervised`;case`2`:case`act + notify`:case`act+notify`:case`act-notify`:return`Act + Notify`;case`3`:case`autonomous`:return`Autonomous`;default:return}}function Ae(n,r,i){return e`
906
+ <div class="agent-tabs">
907
+ ${[{id:`overview`,label:`Overview`},{id:`files`,label:`Files`},{id:`tools`,label:`Tools`},{id:`skills`,label:`Skills`},{id:`channels`,label:`Channels`},{id:`cron`,label:`Cron Jobs`}].map(a=>e`
908
+ <button
909
+ class="agent-tab ${n===a.id?`active`:``}"
910
+ type="button"
911
+ @click=${()=>r(a.id)}
912
+ >
913
+ ${a.label}${i[a.id]==null?t:e`<span class="agent-tab-count">${i[a.id]}</span>`}
914
+ </button>
915
+ `)}
916
+ </div>
917
+ `}export{X as renderAgents};
918
+ //# sourceMappingURL=agents-CLtFQRXd.js.map