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.
- package/node_modules/@comis/agent/package.json +1 -1
- package/node_modules/@comis/channels/package.json +1 -1
- package/node_modules/@comis/cli/package.json +1 -1
- package/node_modules/@comis/core/dist/bootstrap.js +5 -0
- package/node_modules/@comis/core/dist/config/env-layer.d.ts +31 -0
- package/node_modules/@comis/core/dist/config/env-layer.js +41 -0
- package/node_modules/@comis/core/dist/config/layered.d.ts +9 -0
- package/node_modules/@comis/core/dist/config/layered.js +11 -0
- package/node_modules/@comis/core/package.json +1 -1
- package/node_modules/@comis/daemon/dist/daemon.js +3 -0
- package/node_modules/@comis/daemon/package.json +1 -1
- package/node_modules/@comis/gateway/package.json +1 -1
- package/node_modules/@comis/infra/package.json +1 -1
- package/node_modules/@comis/memory/package.json +1 -1
- package/node_modules/@comis/scheduler/package.json +1 -1
- package/node_modules/@comis/shared/package.json +1 -1
- package/node_modules/@comis/skills/package.json +1 -1
- package/node_modules/@comis/web/dist/assets/{agent-detail-BG9MGWWj.js → agent-detail-ru-AhppM.js} +270 -270
- package/node_modules/@comis/web/dist/assets/agent-editor-hjwRuFVp.js +2173 -0
- package/node_modules/@comis/web/dist/assets/{agent-list-LHCJ4rw2.js → agent-list-6Uotjatr.js} +170 -170
- package/node_modules/@comis/web/dist/assets/{approvals-q9VH_IKr.js → approvals-C-K6hN2U.js} +13 -13
- package/node_modules/@comis/web/dist/assets/billing-view-CxysXH0p.js +375 -0
- package/node_modules/@comis/web/dist/assets/{channel-detail-CaInesJM.js → channel-detail-BBCKtmne.js} +265 -265
- package/node_modules/@comis/web/dist/assets/channel-list-FkfeOLBQ.js +323 -0
- package/node_modules/@comis/web/dist/assets/{chat-console-CNmzl0JW.js → chat-console-BumBaIgO.js} +243 -246
- package/node_modules/@comis/web/dist/assets/{config-editor-DX4ITw6y.js → config-editor-C9BSwHGy.js} +477 -477
- package/node_modules/@comis/web/dist/assets/{context-dag-browser-BwiaF5tf.js → context-dag-browser-BHm00mJD.js} +105 -105
- package/node_modules/@comis/web/dist/assets/{context-engine-BZ5Am6hA.js → context-engine-BENY3pWE.js} +136 -136
- package/node_modules/@comis/web/dist/assets/decorate-BvWYovGE.js +38 -0
- package/node_modules/@comis/web/dist/assets/{delivery-view-OfBZof-m.js → delivery-view-BCnkPsAp.js} +134 -134
- package/node_modules/@comis/web/dist/assets/{diagnostics-view-YFwCxgr2.js → diagnostics-view-C_jQFG2H.js} +82 -82
- package/node_modules/@comis/web/dist/assets/directive-BOYXJ-K-.js +1 -0
- package/node_modules/@comis/web/dist/assets/{extract-variables-BM5qyK-s.js → extract-variables-B7-Doo7l.js} +39 -39
- package/node_modules/@comis/web/dist/assets/{ic-array-editor-B7m6x7-S.js → ic-array-editor-BLoEyeLS.js} +29 -29
- package/node_modules/@comis/web/dist/assets/{ic-breadcrumb-CUMpp3BL.js → ic-breadcrumb-DqN6G3gc.js} +16 -16
- package/node_modules/@comis/web/dist/assets/{ic-budget-segment-bar-BtJ6x5mN.js → ic-budget-segment-bar-zLsMzjDO.js} +20 -20
- package/node_modules/@comis/web/dist/assets/ic-chat-message-FdQcZsSQ.js +352 -0
- package/node_modules/@comis/web/dist/assets/{ic-confirm-dialog-CCDbB04e.js → ic-confirm-dialog-DGlPbV1T.js} +26 -26
- package/node_modules/@comis/web/dist/assets/{ic-connection-dot-CnT1b8xr.js → ic-connection-dot-BgYiK2N4.js} +13 -13
- package/node_modules/@comis/web/dist/assets/ic-data-table-CKIvr-ag.js +277 -0
- package/node_modules/@comis/web/dist/assets/ic-delivery-row-B3YwjjuM.js +67 -0
- package/node_modules/@comis/web/dist/assets/{ic-detail-panel-BF83r-if.js → ic-detail-panel-DiCe4hLr.js} +27 -27
- package/node_modules/@comis/web/dist/assets/{ic-empty-state-60l2ePhd.js → ic-empty-state-CM3Wbj2f.js} +19 -19
- package/node_modules/@comis/web/dist/assets/ic-graph-canvas-ByRjij68.js +359 -0
- package/node_modules/@comis/web/dist/assets/ic-icon-BGNCCPpZ.js +33 -0
- package/node_modules/@comis/web/dist/assets/{ic-layer-waterfall-COvEYMg5.js → ic-layer-waterfall-WkaFyu-l.js} +18 -18
- package/node_modules/@comis/web/dist/assets/ic-relative-time-B3UAnTqg.js +12 -0
- package/node_modules/@comis/web/dist/assets/{ic-search-input-CSOxY9g7.js → ic-search-input-B02AGw1i.js} +22 -22
- package/node_modules/@comis/web/dist/assets/{ic-select-Ce-Raudx.js → ic-select-BqfZISjw.js} +29 -29
- package/node_modules/@comis/web/dist/assets/ic-tabs-yBjkWKJH.js +95 -0
- package/node_modules/@comis/web/dist/assets/ic-tag-CvMVQFRR.js +33 -0
- package/node_modules/@comis/web/dist/assets/{ic-time-range-picker-CypCT68y.js → ic-time-range-picker-DXbYeBmY.js} +31 -31
- package/node_modules/@comis/web/dist/assets/{ic-tool-call-7MaXSsCW.js → ic-tool-call-DMPHsLyx.js} +51 -51
- package/node_modules/@comis/web/dist/assets/index-CVEaS9aY.css +2 -0
- package/node_modules/@comis/web/dist/assets/index-FLPhHz8p.js +2792 -0
- package/node_modules/@comis/web/dist/assets/{mcp-management-BNZPnpDn.js → mcp-management-5jyScQis.js} +209 -209
- package/node_modules/@comis/web/dist/assets/{media-config-BBvTYxOX.js → media-config-J9oT9PPs.js} +154 -154
- package/node_modules/@comis/web/dist/assets/{media-test-BkK3RCRK.js → media-test-DGTCtM8-.js} +259 -259
- package/node_modules/@comis/web/dist/assets/{memory-inspector-1hDGCGat.js → memory-inspector-D5Re9ptG.js} +450 -450
- package/node_modules/@comis/web/dist/assets/{message-center-CXefwsUu.js → message-center-cRLK6ZmG.js} +290 -290
- package/node_modules/@comis/web/dist/assets/{models-C1qcU_j3.js → models-D5vu07MR.js} +371 -371
- package/node_modules/@comis/web/dist/assets/observability-types-D0tkwElU.js +1 -0
- package/node_modules/@comis/web/dist/assets/{observe-view-C0VBhX4C.js → observe-view-CalNNEmd.js} +399 -399
- package/node_modules/@comis/web/dist/assets/pipeline-builder-DUYDGwZf.js +1495 -0
- package/node_modules/@comis/web/dist/assets/{pipeline-history-DkfOQ6SW.js → pipeline-history-BAO8brOe.js} +124 -124
- package/node_modules/@comis/web/dist/assets/{pipeline-history-detail-hyHgD0ai.js → pipeline-history-detail-DectIoQt.js} +65 -65
- package/node_modules/@comis/web/dist/assets/{pipeline-list-BPW8hV-q.js → pipeline-list-BHlaBKww.js} +227 -227
- package/node_modules/@comis/web/dist/assets/{pipeline-monitor-Bip16T7e.js → pipeline-monitor-BhtpNEHf.js} +298 -298
- package/node_modules/@comis/web/dist/assets/{scheduler-BGgwKd06.js → scheduler-VafN_8xi.js} +486 -486
- package/node_modules/@comis/web/dist/assets/{security-D15st4xx.js → security-QQXMRTlo.js} +389 -389
- package/node_modules/@comis/web/dist/assets/{session-detail-SGEYNJ0M.js → session-detail-BpZ_8Yih.js} +294 -294
- package/node_modules/@comis/web/dist/assets/session-key-parser-Dkqcj2Ss.js +1 -0
- package/node_modules/@comis/web/dist/assets/session-list-DfCm8Cec.js +231 -0
- package/node_modules/@comis/web/dist/assets/{setup-wizard-nT0tz9QP.js → setup-wizard-C-z477CG.js} +486 -494
- package/node_modules/@comis/web/dist/assets/{skills-D8yVfSUy.js → skills-BCOGPf6s.js} +329 -329
- package/node_modules/@comis/web/dist/assets/{subagents-HHXMeHYo.js → subagents-l-auUraL.js} +74 -74
- package/node_modules/@comis/web/dist/assets/{workspace-manager-BQlr10iH.js → workspace-manager-DlvBixiq.js} +236 -236
- package/node_modules/@comis/web/dist/index.html +3 -2
- package/node_modules/@comis/web/package.json +1 -1
- package/package.json +15 -15
- package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +0 -2173
- package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +0 -375
- package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +0 -323
- package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +0 -1
- package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +0 -352
- package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +0 -277
- package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +0 -67
- package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +0 -359
- package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +0 -33
- package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +0 -12
- package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +0 -95
- package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +0 -33
- package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +0 -2830
- package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +0 -1
- package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +0 -1
- package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +0 -1496
- package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +0 -1
- package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +0 -231
|
@@ -1,331 +1,4 @@
|
|
|
1
|
-
import{
|
|
2
|
-
${b.map(e=>a`
|
|
3
|
-
<div class="category-header">${e.label}</div>
|
|
4
|
-
<div class="tool-grid">
|
|
5
|
-
${e.tools.map(t=>a`
|
|
6
|
-
<div class="tool-card">
|
|
7
|
-
<div class="tool-card-header">
|
|
8
|
-
<span class="tool-name">${t}</span>
|
|
9
|
-
</div>
|
|
10
|
-
<span class="tool-desc">${T[t]??""}</span>
|
|
11
|
-
${_[t]?a`<ul class="tool-params">
|
|
12
|
-
${_[t].map(i=>a`<li>${i}</li>`)}
|
|
13
|
-
</ul>`:v}
|
|
14
|
-
</div>
|
|
15
|
-
`)}
|
|
16
|
-
</div>
|
|
17
|
-
`)}
|
|
18
|
-
<p class="tool-hint">Enable or disable tools per agent in the agent editor.</p>
|
|
19
|
-
|
|
20
|
-
<hr style="border: none; border-top: 1px solid var(--ic-border); margin: var(--ic-space-xl) 0;" />
|
|
21
|
-
|
|
22
|
-
<div class="section-header" style="font-size: var(--ic-text-base); font-weight: 600; color: var(--ic-text); margin-bottom: var(--ic-space-sm);">Platform Tools</div>
|
|
23
|
-
<p class="tool-hint" style="margin-top: 0;">
|
|
24
|
-
Platform tools are always available to agents. They are governed by the tool policy and trust level.
|
|
25
|
-
</p>
|
|
26
|
-
${z.map(e=>a`
|
|
27
|
-
<div class="category-header">${e.label}</div>
|
|
28
|
-
<div class="tool-grid">
|
|
29
|
-
${e.tools.map(t=>a`
|
|
30
|
-
<div class="tool-card">
|
|
31
|
-
<div class="tool-card-header">
|
|
32
|
-
<span class="tool-name">${t}</span>
|
|
33
|
-
</div>
|
|
34
|
-
<span class="tool-desc">${P[t]??""}</span>
|
|
35
|
-
</div>
|
|
36
|
-
`)}
|
|
37
|
-
</div>
|
|
38
|
-
`)}
|
|
39
|
-
|
|
40
|
-
<hr style="border: none; border-top: 1px solid var(--ic-border); margin: var(--ic-space-xl) 0;" />
|
|
41
|
-
|
|
42
|
-
<div class="section-header" style="font-size: var(--ic-text-base); font-weight: 600; color: var(--ic-text); margin-bottom: var(--ic-space-sm);">Tool Policy</div>
|
|
43
|
-
<div class="policy-section">
|
|
44
|
-
<p class="tool-hint" style="margin-top: 0;">
|
|
45
|
-
Tool policy controls which platform tools an agent can use. Profiles (minimal, coding, messaging, supervisor, full)
|
|
46
|
-
define baseline sets, with allow/deny lists for fine-grained overrides.
|
|
47
|
-
</p>
|
|
48
|
-
<p class="tool-hint">Configure tool policy per agent in the agent editor.</p>
|
|
49
|
-
</div>
|
|
50
|
-
`}async _onPromptFieldChange(e,t){await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[e]:t}})&&this._skillsConfig&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[e]:t}})}async _addToList(e,t,i){if(!i.trim()||!this._skillsConfig)return;const l=[...this._skillsConfig.promptSkills[t]];if(l.includes(i.trim()))return;const r=[...l,i.trim()];await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[t]:r}})&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[t]:r}})}async _removeFromList(e,t,i){if(!this._skillsConfig)return;const l=this._skillsConfig.promptSkills[t].filter(o=>o!==i);await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[t]:l}})&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[t]:l}})}_renderSkillList(e,t,i,l,r){const o=this._searchQuery?t.filter(n=>n.toLowerCase().includes(this._searchQuery.toLowerCase())):t;return a`
|
|
51
|
-
<div class="list-section">
|
|
52
|
-
<div class="list-title">${e}</div>
|
|
53
|
-
${o.length>0?a`
|
|
54
|
-
<div class="list-items">
|
|
55
|
-
${o.map(n=>a`
|
|
56
|
-
<span class="list-item">
|
|
57
|
-
${n}
|
|
58
|
-
<button
|
|
59
|
-
class="list-item-remove"
|
|
60
|
-
aria-label="Remove ${n}"
|
|
61
|
-
@click=${()=>this._removeFromList("promptSkills",i,n)}
|
|
62
|
-
>\u2715</button>
|
|
63
|
-
</span>
|
|
64
|
-
`)}
|
|
65
|
-
</div>
|
|
66
|
-
`:a`<div class="empty-list">No items</div>`}
|
|
67
|
-
<div class="list-add-row">
|
|
68
|
-
<input
|
|
69
|
-
class="list-add-input"
|
|
70
|
-
type="text"
|
|
71
|
-
placeholder="Skill name..."
|
|
72
|
-
.value=${l}
|
|
73
|
-
@input=${n=>r(n.target.value)}
|
|
74
|
-
@keydown=${n=>{n.key==="Enter"&&(n.preventDefault(),this._addToList("promptSkills",i,l),r(""))}}
|
|
75
|
-
/>
|
|
76
|
-
<button
|
|
77
|
-
class="list-add-btn"
|
|
78
|
-
@click=${()=>{this._addToList("promptSkills",i,l),r("")}}
|
|
79
|
-
>Add</button>
|
|
80
|
-
</div>
|
|
81
|
-
</div>
|
|
82
|
-
`}_triggerFolderUpload(){this.shadowRoot?.querySelector("#skill-folder-input")?.click()}async _handleFolderSelected(e){const t=e.target,i=t.files;if(!i||i.length===0||!this.rpcClient)return;const r=i[0].webkitRelativePath.split("/")[0];if(!r){m.show("Could not determine folder name","error");return}this._isUploadingSkill=!0;try{const o=[];for(const n of Array.from(i)){const h=n.webkitRelativePath.split("/").slice(1).join("/");if(!h)continue;const g=await n.text();o.push({path:h,content:g})}if(o.length===0){m.show("No files found in folder","error");return}await this.rpcClient.call("skills.upload",{name:r,files:o,agentId:this._installScope==="agent"?this._installAgent:this._defaultAgentId,scope:this._installScope==="shared"?"shared":"local"}),m.show(`Skill "${r}" uploaded`,"success"),await this._refreshSkills()}catch(o){m.show(`Failed to upload skill: ${o instanceof Error?o.message:"Unknown error"}`,"error")}finally{this._isUploadingSkill=!1,t.value=""}}async _handleImportSkill(){const e=this._importUrl.trim();if(!(!e||!this.rpcClient||this._isImportingSkill)){this._isImportingSkill=!0;try{const t=await this.rpcClient.call("skills.import",{url:e,agentId:this._installScope==="agent"?this._installAgent:this._defaultAgentId,scope:this._installScope==="shared"?"shared":"local"});m.show(`Skill "${t.name}" imported (${t.fileCount} files)`,"success"),this._importUrl="",await this._refreshSkills()}catch(t){m.show(`Failed to import skill: ${t instanceof Error?t.message:"Unknown error"}`,"error")}finally{this._isImportingSkill=!1}}}_handleDeleteSkill(e){!this.rpcClient||this._deletingSkill||(this._deletingSkill=e)}async _confirmDeleteSkill(){if(!this.rpcClient||!this._deletingSkill)return;const e=this._deletingSkill;try{const t=k(this._discoveredSkills.find(i=>i.name===e)?.location??"");await this.rpcClient.call("skills.delete",{name:e,agentId:t||this._defaultAgentId,scope:t?"local":"shared"}),m.show(`Skill "${e}" deleted`,"success"),this._deletingSkill=null,await this._refreshSkills()}catch(t){m.show(`Failed to delete skill: ${t instanceof Error?t.message:"Unknown error"}`,"error"),this._deletingSkill=null}}async _onAgentChange(e){this._targetAgentId=e,this._skillScope="all",await this._loadData()}async _refreshSkills(){if(this.rpcClient)try{const e=await this.rpcClient.call("skills.list",{agentId:this._targetAgentId});this._discoveredSkills=e.skills??[]}catch{}}_renderDiscoveredSkills(){const e=this._searchQuery?this._discoveredSkills.filter(s=>s.name.toLowerCase().includes(this._searchQuery.toLowerCase())||s.description.toLowerCase().includes(this._searchQuery.toLowerCase())):this._discoveredSkills,t=this._discoveredSkills.length>0,i=t?e.filter(s=>s.source==="local"):[],l=t?e.filter(s=>s.source!=="local"):[],r=this._skillScope==="all"||this._skillScope==="shared",o=this._skillScope==="all"||this._skillScope==="local",n=r?i:[],h=o?l:[],g=n.length===0&&h.length===0;return a`
|
|
83
|
-
${!t||g?a`
|
|
84
|
-
<ic-empty-state
|
|
85
|
-
icon="skills"
|
|
86
|
-
message=${t?"No skills match the current filter":"No prompt skills discovered"}
|
|
87
|
-
description=${t?"Try changing the scope filter or search query.":"Upload a skill folder or import from GitHub to get started."}
|
|
88
|
-
></ic-empty-state>
|
|
89
|
-
`:a`
|
|
90
|
-
${n.length>0?a`
|
|
91
|
-
<div class="category-header">Shared Skills (${n.length})</div>
|
|
92
|
-
<div class="tool-grid">
|
|
93
|
-
${n.map(s=>a`
|
|
94
|
-
<div class="tool-card">
|
|
95
|
-
<div class="tool-card-header">
|
|
96
|
-
<span class="tool-name">${s.name}</span>
|
|
97
|
-
<div style="display: flex; gap: 0.25rem; align-items: center;">
|
|
98
|
-
${s.disableModelInvocation?a`<ic-tag variant="warning">manual</ic-tag>`:v}
|
|
99
|
-
<ic-tag variant="info">SHARED</ic-tag>
|
|
100
|
-
<button
|
|
101
|
-
class="skill-delete-btn"
|
|
102
|
-
aria-label="Delete ${s.name}"
|
|
103
|
-
@click=${()=>this._handleDeleteSkill(s.name)}
|
|
104
|
-
>\u2715</button>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
<span class="tool-desc">${s.description.length>150?s.description.slice(0,150)+"...":s.description}</span>
|
|
108
|
-
</div>
|
|
109
|
-
`)}
|
|
110
|
-
</div>
|
|
111
|
-
`:v}
|
|
112
|
-
|
|
113
|
-
${o?a`
|
|
114
|
-
<div class="category-header">Agent Skills (${h.length})</div>
|
|
115
|
-
${h.length>0?a`
|
|
116
|
-
<div class="tool-grid">
|
|
117
|
-
${h.map(s=>{const f=k(s.location);return a`
|
|
118
|
-
<div class="tool-card">
|
|
119
|
-
<div class="tool-card-header">
|
|
120
|
-
<span class="tool-name">${s.name}</span>
|
|
121
|
-
<div style="display: flex; gap: 0.25rem; align-items: center;">
|
|
122
|
-
${s.disableModelInvocation?a`<ic-tag variant="warning">manual</ic-tag>`:v}
|
|
123
|
-
${f?a`<ic-tag variant="accent">${f}</ic-tag>`:a`<ic-tag variant="accent">AGENT</ic-tag>`}
|
|
124
|
-
<button
|
|
125
|
-
class="skill-delete-btn"
|
|
126
|
-
aria-label="Delete ${s.name}"
|
|
127
|
-
@click=${()=>this._handleDeleteSkill(s.name)}
|
|
128
|
-
>\u2715</button>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
<span class="tool-desc">${s.description.length>150?s.description.slice(0,150)+"...":s.description}</span>
|
|
132
|
-
</div>
|
|
133
|
-
`})}
|
|
134
|
-
</div>
|
|
135
|
-
`:a`
|
|
136
|
-
<p style="font-size: var(--ic-text-sm); color: var(--ic-text-dim); font-style: italic;">
|
|
137
|
-
No agent-specific skills installed. Upload or import skills below.
|
|
138
|
-
</p>
|
|
139
|
-
`}
|
|
140
|
-
`:v}
|
|
141
|
-
`}
|
|
142
|
-
|
|
143
|
-
<!-- Add Skill panel -->
|
|
144
|
-
<div class="add-skill-panel">
|
|
145
|
-
<div class="add-skill-title">Add Skill</div>
|
|
146
|
-
|
|
147
|
-
<!-- Install target selector -->
|
|
148
|
-
<div class="install-target">
|
|
149
|
-
<span class="install-target-label">Install to:</span>
|
|
150
|
-
<select
|
|
151
|
-
class="install-target-select"
|
|
152
|
-
.value=${this._installScope}
|
|
153
|
-
@change=${s=>{this._installScope=s.target.value,this._installScope==="agent"&&!this._installAgent&&(this._installAgent=this._agentIds[0]??this._defaultAgentId)}}
|
|
154
|
-
>
|
|
155
|
-
<option value="shared" ?selected=${this._installScope==="shared"}>Shared (all agents)</option>
|
|
156
|
-
<option value="agent" ?selected=${this._installScope==="agent"}>Specific agent</option>
|
|
157
|
-
</select>
|
|
158
|
-
${this._installScope==="agent"?a`
|
|
159
|
-
<select
|
|
160
|
-
class="install-target-select"
|
|
161
|
-
.value=${this._installAgent}
|
|
162
|
-
@change=${s=>{this._installAgent=s.target.value}}
|
|
163
|
-
>
|
|
164
|
-
${this._agentIds.map(s=>a`
|
|
165
|
-
<option value=${s} ?selected=${s===this._installAgent}>${s}</option>
|
|
166
|
-
`)}
|
|
167
|
-
</select>
|
|
168
|
-
`:v}
|
|
169
|
-
<span class="install-target-hint">
|
|
170
|
-
${this._installScope==="shared"?"Skill will be available to all agents":`Skill will only be available to ${this._installAgent||"the selected agent"}`}
|
|
171
|
-
</span>
|
|
172
|
-
</div>
|
|
173
|
-
|
|
174
|
-
<!-- Two methods side by side -->
|
|
175
|
-
<div class="add-skill-methods">
|
|
176
|
-
<div class="add-skill-method">
|
|
177
|
-
<div class="add-skill-method-title">Upload folder</div>
|
|
178
|
-
<div class="add-skill-method-body">
|
|
179
|
-
<input
|
|
180
|
-
id="skill-folder-input"
|
|
181
|
-
type="file"
|
|
182
|
-
webkitdirectory
|
|
183
|
-
hidden
|
|
184
|
-
@change=${s=>this._handleFolderSelected(s)}
|
|
185
|
-
/>
|
|
186
|
-
<button
|
|
187
|
-
class="upload-skill-btn"
|
|
188
|
-
?disabled=${this._isUploadingSkill}
|
|
189
|
-
@click=${()=>this._triggerFolderUpload()}
|
|
190
|
-
>${this._isUploadingSkill?"Uploading...":"+ Select Skill Folder"}</button>
|
|
191
|
-
</div>
|
|
192
|
-
<p class="upload-skill-hint">Folder must contain a SKILL.md file</p>
|
|
193
|
-
</div>
|
|
194
|
-
|
|
195
|
-
<div class="add-skill-method">
|
|
196
|
-
<div class="add-skill-method-title">Import from GitHub</div>
|
|
197
|
-
<div class="add-skill-method-body">
|
|
198
|
-
<div class="import-skill-row" style="width: 100%;">
|
|
199
|
-
<input
|
|
200
|
-
type="text"
|
|
201
|
-
.value=${this._importUrl}
|
|
202
|
-
placeholder="https://github.com/owner/repo/tree/main/skills/name"
|
|
203
|
-
@input=${s=>{this._importUrl=s.target.value}}
|
|
204
|
-
@keydown=${s=>{s.key==="Enter"&&(s.preventDefault(),this._handleImportSkill())}}
|
|
205
|
-
/>
|
|
206
|
-
<button
|
|
207
|
-
class="import-skill-btn"
|
|
208
|
-
?disabled=${this._isImportingSkill||!this._importUrl.trim()}
|
|
209
|
-
@click=${()=>this._handleImportSkill()}
|
|
210
|
-
>${this._isImportingSkill?"Importing...":"Import"}</button>
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
<p class="upload-skill-hint">Paste a GitHub URL to a skill folder</p>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
</div>
|
|
217
|
-
|
|
218
|
-
<!-- Delete confirmation dialog -->
|
|
219
|
-
<ic-confirm-dialog
|
|
220
|
-
?open=${this._deletingSkill!==null}
|
|
221
|
-
title="Delete Skill"
|
|
222
|
-
message=${`Delete skill "${this._deletingSkill}"? This will remove the skill files from disk.`}
|
|
223
|
-
variant="danger"
|
|
224
|
-
confirmLabel="Delete"
|
|
225
|
-
@confirm=${()=>this._confirmDeleteSkill()}
|
|
226
|
-
@cancel=${()=>{this._deletingSkill=null}}
|
|
227
|
-
></ic-confirm-dialog>
|
|
228
|
-
`}_renderSkillsTab(){return a`
|
|
229
|
-
<ic-search-input
|
|
230
|
-
placeholder="Filter skill names..."
|
|
231
|
-
@search=${e=>{this._searchQuery=e.detail}}
|
|
232
|
-
></ic-search-input>
|
|
233
|
-
|
|
234
|
-
<div style="margin-top: var(--ic-space-md);">
|
|
235
|
-
${this._renderDiscoveredSkills()}
|
|
236
|
-
</div>
|
|
237
|
-
|
|
238
|
-
<p class="tool-hint">Configure prompt skill settings (max body length, auto-inject, allowed/denied lists) per agent in the agent editor.</p>
|
|
239
|
-
`}async _onProfileChange(e){if(!this._skillsConfig)return;await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,profile:e}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,profile:e}})}async _addPolicyItem(e,t){if(!t.trim()||!this._skillsConfig)return;const i=[...this._skillsConfig.toolPolicy[e]];if(i.includes(t.trim()))return;const l=[...i,t.trim()];await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,[e]:l}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,[e]:l}})}async _removePolicyItem(e,t){if(!this._skillsConfig)return;const i=this._skillsConfig.toolPolicy[e].filter(r=>r!==t);await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,[e]:i}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,[e]:i}})}_getResolvedTools(){if(!this._skillsConfig)return{included:[],denied:[]};const e=this._skillsConfig.toolPolicy,t=L[e.profile]??[],i=new Set([...t,...e.allow]),l=new Set(e.deny),r=[...i].filter(n=>!l.has(n)),o=[...i].filter(n=>l.has(n));return{included:r,denied:o}}_renderPolicyList(e,t,i,l,r){return a`
|
|
240
|
-
<div class="list-section">
|
|
241
|
-
<div class="list-title">${e}</div>
|
|
242
|
-
${t.length>0?a`
|
|
243
|
-
<div class="list-items">
|
|
244
|
-
${t.map(o=>a`
|
|
245
|
-
<span class="list-item">
|
|
246
|
-
${o}
|
|
247
|
-
<button
|
|
248
|
-
class="list-item-remove"
|
|
249
|
-
aria-label="Remove ${o}"
|
|
250
|
-
@click=${()=>this._removePolicyItem(i,o)}
|
|
251
|
-
>\u2715</button>
|
|
252
|
-
</span>
|
|
253
|
-
`)}
|
|
254
|
-
</div>
|
|
255
|
-
`:a`<div class="empty-list">No items</div>`}
|
|
256
|
-
<div class="list-add-row">
|
|
257
|
-
<input
|
|
258
|
-
class="list-add-input"
|
|
259
|
-
type="text"
|
|
260
|
-
placeholder="Tool name..."
|
|
261
|
-
.value=${l}
|
|
262
|
-
@input=${o=>r(o.target.value)}
|
|
263
|
-
@keydown=${o=>{o.key==="Enter"&&(o.preventDefault(),this._addPolicyItem(i,l),r(""))}}
|
|
264
|
-
/>
|
|
265
|
-
<button
|
|
266
|
-
class="list-add-btn"
|
|
267
|
-
@click=${()=>{this._addPolicyItem(i,l),r("")}}
|
|
268
|
-
>Add</button>
|
|
269
|
-
</div>
|
|
270
|
-
</div>
|
|
271
|
-
`}_renderRecentActivity(){return this._recentSkillEvents.length===0?v:a`
|
|
272
|
-
<div class="recent-activity">
|
|
273
|
-
<h3>Recent Activity <span class="recent-activity-count">(${this._recentSkillEvents.length})</span></h3>
|
|
274
|
-
<div class="event-list">
|
|
275
|
-
${this._recentSkillEvents.slice(0,20).map(e=>a`
|
|
276
|
-
<div class="event-entry">
|
|
277
|
-
<span class="event-skill">${e.skillName}</span>
|
|
278
|
-
<span class="event-agent">${e.agentId||"—"}</span>
|
|
279
|
-
<span class=${e.outcome==="executed"?"event-outcome--executed":"event-outcome--rejected"}>
|
|
280
|
-
${e.outcome}${e.reason?a` <span class="event-reason">(${e.reason})</span>`:""}
|
|
281
|
-
</span>
|
|
282
|
-
<span class="event-time">${new Date(e.timestamp).toLocaleTimeString()}</span>
|
|
283
|
-
</div>
|
|
284
|
-
`)}
|
|
285
|
-
</div>
|
|
286
|
-
</div>
|
|
287
|
-
`}_renderTabContent(){switch(this._activeTab){case"tools":return this._renderToolsTab();case"skills":return this._renderSkillsTab();default:return v}}render(){return this._loadState==="loading"?a`<ic-skeleton-view variant="list"></ic-skeleton-view>`:this._loadState==="error"?a`
|
|
288
|
-
<div class="error-container">
|
|
289
|
-
<span class="error-message">${this._error}</span>
|
|
290
|
-
<button class="retry-btn" @click=${()=>this._tryLoad()}>Retry</button>
|
|
291
|
-
</div>
|
|
292
|
-
`:a`
|
|
293
|
-
<div class="view-header">
|
|
294
|
-
<div class="view-title">Skills & Tools</div>
|
|
295
|
-
${this._agentIds.length>1?a`
|
|
296
|
-
<div style="display: flex; gap: var(--ic-space-sm); align-items: center;">
|
|
297
|
-
<select
|
|
298
|
-
class="form-input"
|
|
299
|
-
.value=${this._targetAgentId}
|
|
300
|
-
@change=${e=>this._onAgentChange(e.target.value)}
|
|
301
|
-
>
|
|
302
|
-
<option value="" ?selected=${this._targetAgentId===""}>All Agents</option>
|
|
303
|
-
${this._agentIds.map(e=>a`
|
|
304
|
-
<option value=${e} ?selected=${e===this._targetAgentId}>${e}</option>
|
|
305
|
-
`)}
|
|
306
|
-
</select>
|
|
307
|
-
<select
|
|
308
|
-
class="form-input"
|
|
309
|
-
.value=${this._skillScope}
|
|
310
|
-
@change=${e=>{this._skillScope=e.target.value}}
|
|
311
|
-
>
|
|
312
|
-
<option value="all" ?selected=${this._skillScope==="all"}>All Skills</option>
|
|
313
|
-
<option value="local" ?selected=${this._skillScope==="local"}>Agent Skills</option>
|
|
314
|
-
<option value="shared" ?selected=${this._skillScope==="shared"}>Shared Skills</option>
|
|
315
|
-
</select>
|
|
316
|
-
</div>
|
|
317
|
-
`:v}
|
|
318
|
-
</div>
|
|
319
|
-
<ic-tabs
|
|
320
|
-
.tabs=${E}
|
|
321
|
-
.activeTab=${this._activeTab}
|
|
322
|
-
@tab-change=${e=>{this._activeTab=e.detail}}
|
|
323
|
-
></ic-tabs>
|
|
324
|
-
<div style="margin-top: var(--ic-space-md);">
|
|
325
|
-
${this._renderTabContent()}
|
|
326
|
-
</div>
|
|
327
|
-
${this._renderRecentActivity()}
|
|
328
|
-
`}};c.styles=[w,S,$`
|
|
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-tag-CvMVQFRR.js";import"./ic-confirm-dialog-DGlPbV1T.js";import"./ic-search-input-B02AGw1i.js";import"./ic-empty-state-CM3Wbj2f.js";import"./ic-tabs-yBjkWKJH.js";var f={read:`Read file contents with line numbers and pagination`,write:`Write or overwrite files; auto-creates parent directories`,edit:`Surgical search-and-replace on files (exact text match)`,grep:`Regex search across files (ripgrep-based)`,find:`Find files by glob pattern (fd-based)`,ls:`List directory contents alphabetically`,exec:`Shell command execution with foreground/background modes`,process:`Background process management (list, kill, status, log)`,webSearch:`Multi-provider web search (Brave, DuckDuckGo, Perplexity, Grok, Tavily, Exa, Jina, SearXNG)`,webFetch:`Fetch and extract content from URLs (markdown, text, readability modes)`,browser:`Headless browser control (requires Playwright/Chromium)`},p={webSearch:[`freshness: pd (past day), pw (past week), pm (past month), py (past year), or YYYY-MM-DDtoYYYY-MM-DD`,`deepFetch: 0-5 - auto-fetch full page content for top N results`,`provider: override search provider per call`]},m=[{label:`File Operations`,tools:[`read`,`write`,`edit`,`find`,`ls`]},{label:`Execution`,tools:[`exec`,`process`]},{label:`Search`,tools:[`grep`]},{label:`Web`,tools:[`webSearch`,`webFetch`,`browser`]}],h={minimal:[`exec`],coding:[`read`,`write`,`edit`,`grep`,`find`,`ls`,`exec`,`process`],messaging:[`exec`,`webSearch`,`webFetch`],supervisor:[`read`,`write`,`edit`,`grep`,`find`,`ls`,`exec`,`process`,`webSearch`,`webFetch`],full:[...m.flatMap(e=>e.tools)]};function g(e){let t=e.match(/\/workspace-([^/]+)\/skills\//);return t?t[1]:/\/workspace\/skills\//.test(e)?`default`:``}var _={memory_search:`Semantic hybrid search across memory and session transcripts`,memory_get:`Read specific memory file sections by path with line ranges`,memory_store:`Store facts, preferences, or context in long-term memory`,memory_manage:`Stats, browse, delete, flush, and export memory entries`,session_status:`View current session model, token usage, and duration`,sessions_list:`List active sessions filtered by kind and recency`,sessions_history:`View conversation history for a session with pagination`,sessions_send:`Send a message into another session (fire-and-forget, wait, or ping-pong)`,sessions_spawn:`Spawn a sub-agent session for background work (sync or async)`,sessions_manage:`Delete, reset, export, or compact session lifecycles`,agents_list:`List all configured agent IDs in the system`,agents_manage:`Create, inspect, update, suspend/resume, and delete agents`,subagents:`List, kill, or steer running sub-agents`,message:`Send, reply, react, edit, delete, and fetch messages across all channels`,discord_action:`Pin/unpin, kick/ban, roles, threads, channels, bot presence`,telegram_action:`Pin/unpin, polls, stickers, chat info, ban/promote members`,slack_action:`Pin/unpin, topics, archive, create channels, invite/kick, bookmarks`,whatsapp_action:`Group info, participants, settings, invite codes, profile status`,image_analyze:`Analyze images using vision AI from files, URLs, or base64`,tts_synthesize:`Generate speech audio from text via configured TTS provider`,transcribe_audio:`Transcribe audio/voice attachments to text with language hints`,describe_video:`Generate text descriptions of video attachments`,extract_document:`Extract text from PDF, CSV, TXT, and other document formats`,cron:`Create, list, update, remove, and trigger scheduled jobs`,gateway:`Read/patch config, set secrets, restart, rollback, and status`,browser:`Headless browser: navigate, snapshot, screenshot, click, type, tabs`,obs_query:`Query diagnostics, billing, delivery traces, and channel activity`,models_manage:`List available models and test provider availability`,tokens_manage:`List, create, revoke, and rotate gateway auth tokens`,channels_manage:`List, enable, disable, and restart channel adapters`,skills_manage:`List, import from GitHub, and delete prompt skills`},v=[{label:`MEMORY`,tools:[`memory_search`,`memory_get`,`memory_store`,`memory_manage`]},{label:`SESSIONS`,tools:[`session_status`,`sessions_list`,`sessions_history`,`sessions_send`,`sessions_spawn`,`sessions_manage`]},{label:`AGENTS`,tools:[`agents_list`,`agents_manage`,`subagents`]},{label:`MESSAGING`,tools:[`message`,`discord_action`,`telegram_action`,`slack_action`,`whatsapp_action`]},{label:`MEDIA`,tools:[`image_analyze`,`tts_synthesize`,`transcribe_audio`,`describe_video`,`extract_document`]},{label:`INFRASTRUCTURE`,tools:[`cron`,`gateway`,`browser`,`obs_query`]},{label:`FLEET MANAGEMENT`,tools:[`models_manage`,`tokens_manage`,`channels_manage`,`skills_manage`]}],y=[{id:`tools`,label:`Built-in Tools`},{id:`skills`,label:`Prompt Skills`}],b=class extends r{constructor(...e){super(...e),this.apiClient=null,this.rpcClient=null,this.eventDispatcher=null,this._sse=null,this._reloadDebounce=null,this._loadState=`loading`,this._recentSkillEvents=[],this._error=``,this._activeTab=`tools`,this._skillsConfig=null,this._discoveredSkills=[],this._targetAgentId=``,this._agentIds=[],this._skillScope=`all`,this._defaultAgentId=`default`,this._searchQuery=``,this._importUrl=``,this._isImportingSkill=!1,this._isUploadingSkill=!1,this._deletingSkill=null,this._installAgent=``,this._installScope=`shared`,this._newAllowedSkill=``,this._newDeniedSkill=``,this._newPolicyAllow=``,this._newPolicyDeny=``,this._rpcStatusUnsub=null,this._dataLoaded=!1}static{this.styles=[o,i,n`
|
|
329
2
|
:host {
|
|
330
3
|
display: block;
|
|
331
4
|
}
|
|
@@ -1048,4 +721,331 @@ import{a as y,S as x,I as m,A as v,b as a,s as w,f as S,i as $,n as u,r as p,t a
|
|
|
1048
721
|
color: var(--ic-text-dim);
|
|
1049
722
|
white-space: nowrap;
|
|
1050
723
|
}
|
|
1051
|
-
`]
|
|
724
|
+
`]}connectedCallback(){super.connectedCallback(),this._initSse()}disconnectedCallback(){super.disconnectedCallback(),this._rpcStatusUnsub?.(),this._rpcStatusUnsub=null,this._reloadDebounce!==null&&(clearTimeout(this._reloadDebounce),this._reloadDebounce=null)}updated(e){e.has(`rpcClient`)&&this.rpcClient&&this._tryLoad(),e.has(`eventDispatcher`)&&this.eventDispatcher&&!this._sse&&this._initSse()}_scheduleReload(e=300){this._reloadDebounce!==null&&clearTimeout(this._reloadDebounce),this._reloadDebounce=setTimeout(()=>{this._reloadDebounce=null,this._loadData()},e)}_initSse(){!this.eventDispatcher||this._sse||(this._sse=new d(this,this.eventDispatcher,{"skill:loaded":()=>{this._scheduleReload()},"skill:registry_reset":()=>{this._scheduleReload()},"agent:hot_added":()=>{this._scheduleReload()},"agent:hot_removed":()=>{this._scheduleReload()},"skill:executed":e=>{let t=e;this._recentSkillEvents=[{skillName:t.skillName??`unknown`,agentId:t.agentId??``,timestamp:t.timestamp??Date.now(),outcome:`executed`},...this._recentSkillEvents].slice(0,50)},"skill:rejected":e=>{let t=e;this._recentSkillEvents=[{skillName:t.skillName??`unknown`,agentId:t.agentId??``,timestamp:t.timestamp??Date.now(),outcome:`rejected`,reason:t.reason},...this._recentSkillEvents].slice(0,50)}}))}_tryLoad(){this.rpcClient&&(this._rpcStatusUnsub?.(),this.rpcClient.status===`connected`?this._loadData():this._rpcStatusUnsub=this.rpcClient.onStatusChange(e=>{e===`connected`&&!this._dataLoaded&&this._loadData()}))}async _loadData(){if(this.rpcClient){this._loadState=`loading`,this._error=``;try{let e=await this.rpcClient.call(`config.read`),t=e.config?.agents;this._agentIds=t?Object.keys(t):[];let n=this._agentIds[0];this._targetAgentId&&n&&!this._agentIds.includes(this._targetAgentId)&&(this._targetAgentId=n);let r=e.config?.routing;if(this._defaultAgentId=r?.defaultAgentId??`default`,this._skillsConfig=this._targetAgentId&&this._agentIds.includes(this._targetAgentId)?t[this._targetAgentId].skills??null:null,this._dataLoaded=!0,this._loadState=`loaded`,this._targetAgentId)this.rpcClient.call(`skills.list`,{agentId:this._targetAgentId}).then(e=>{this._discoveredSkills=e.skills??[]}).catch(()=>{this._discoveredSkills=[]});else{let e=this.rpcClient;Promise.allSettled(this._agentIds.map(t=>e.call(`skills.list`,{agentId:t}))).then(e=>{let t=new Map;for(let n of e)if(n.status===`fulfilled`)for(let e of n.value.skills??[]){let n=e.source===`local`?e.name:`${e.name}:${e.location}`;t.has(n)||t.set(n,e)}this._discoveredSkills=[...t.values()]})}}catch(e){this._error=e instanceof Error?e.message:`Failed to load skills configuration`,this._loadState=`error`}}}async _patchConfig(e,t){if(!this.rpcClient)return!1;try{let n=e.indexOf(`.`),r=n>0?e.slice(0,n):e,i=n>0?e.slice(n+1):void 0;return await this.rpcClient.call(`config.patch`,{section:r,key:i,value:t}),u.show(`Configuration updated`,`success`),!0}catch(e){let t=e instanceof Error?e.message:`Failed to update configuration`;return u.show(t,`error`),!1}}async _onToolToggle(e,t){await this._patchConfig(`agents.${this._targetAgentId}.skills`,{builtinTools:{[e]:t}})&&this._skillsConfig&&(this._skillsConfig={...this._skillsConfig,builtinTools:{...this._skillsConfig.builtinTools,[e]:t}})}_renderToolsTab(){return t`
|
|
725
|
+
${m.map(e=>t`
|
|
726
|
+
<div class="category-header">${e.label}</div>
|
|
727
|
+
<div class="tool-grid">
|
|
728
|
+
${e.tools.map(e=>t`
|
|
729
|
+
<div class="tool-card">
|
|
730
|
+
<div class="tool-card-header">
|
|
731
|
+
<span class="tool-name">${e}</span>
|
|
732
|
+
</div>
|
|
733
|
+
<span class="tool-desc">${f[e]??``}</span>
|
|
734
|
+
${p[e]?t`<ul class="tool-params">
|
|
735
|
+
${p[e].map(e=>t`<li>${e}</li>`)}
|
|
736
|
+
</ul>`:l}
|
|
737
|
+
</div>
|
|
738
|
+
`)}
|
|
739
|
+
</div>
|
|
740
|
+
`)}
|
|
741
|
+
<p class="tool-hint">Enable or disable tools per agent in the agent editor.</p>
|
|
742
|
+
|
|
743
|
+
<hr style="border: none; border-top: 1px solid var(--ic-border); margin: var(--ic-space-xl) 0;" />
|
|
744
|
+
|
|
745
|
+
<div class="section-header" style="font-size: var(--ic-text-base); font-weight: 600; color: var(--ic-text); margin-bottom: var(--ic-space-sm);">Platform Tools</div>
|
|
746
|
+
<p class="tool-hint" style="margin-top: 0;">
|
|
747
|
+
Platform tools are always available to agents. They are governed by the tool policy and trust level.
|
|
748
|
+
</p>
|
|
749
|
+
${v.map(e=>t`
|
|
750
|
+
<div class="category-header">${e.label}</div>
|
|
751
|
+
<div class="tool-grid">
|
|
752
|
+
${e.tools.map(e=>t`
|
|
753
|
+
<div class="tool-card">
|
|
754
|
+
<div class="tool-card-header">
|
|
755
|
+
<span class="tool-name">${e}</span>
|
|
756
|
+
</div>
|
|
757
|
+
<span class="tool-desc">${_[e]??``}</span>
|
|
758
|
+
</div>
|
|
759
|
+
`)}
|
|
760
|
+
</div>
|
|
761
|
+
`)}
|
|
762
|
+
|
|
763
|
+
<hr style="border: none; border-top: 1px solid var(--ic-border); margin: var(--ic-space-xl) 0;" />
|
|
764
|
+
|
|
765
|
+
<div class="section-header" style="font-size: var(--ic-text-base); font-weight: 600; color: var(--ic-text); margin-bottom: var(--ic-space-sm);">Tool Policy</div>
|
|
766
|
+
<div class="policy-section">
|
|
767
|
+
<p class="tool-hint" style="margin-top: 0;">
|
|
768
|
+
Tool policy controls which platform tools an agent can use. Profiles (minimal, coding, messaging, supervisor, full)
|
|
769
|
+
define baseline sets, with allow/deny lists for fine-grained overrides.
|
|
770
|
+
</p>
|
|
771
|
+
<p class="tool-hint">Configure tool policy per agent in the agent editor.</p>
|
|
772
|
+
</div>
|
|
773
|
+
`}async _onPromptFieldChange(e,t){await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[e]:t}})&&this._skillsConfig&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[e]:t}})}async _addToList(e,t,n){if(!n.trim()||!this._skillsConfig)return;let r=[...this._skillsConfig.promptSkills[t]];if(r.includes(n.trim()))return;let i=[...r,n.trim()];await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[t]:i}})&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[t]:i}})}async _removeFromList(e,t,n){if(!this._skillsConfig)return;let r=this._skillsConfig.promptSkills[t].filter(e=>e!==n);await this._patchConfig(`agents.${this._targetAgentId}.skills`,{promptSkills:{[t]:r}})&&(this._skillsConfig={...this._skillsConfig,promptSkills:{...this._skillsConfig.promptSkills,[t]:r}})}_renderSkillList(e,n,r,i,a){let o=this._searchQuery?n.filter(e=>e.toLowerCase().includes(this._searchQuery.toLowerCase())):n;return t`
|
|
774
|
+
<div class="list-section">
|
|
775
|
+
<div class="list-title">${e}</div>
|
|
776
|
+
${o.length>0?t`
|
|
777
|
+
<div class="list-items">
|
|
778
|
+
${o.map(e=>t`
|
|
779
|
+
<span class="list-item">
|
|
780
|
+
${e}
|
|
781
|
+
<button
|
|
782
|
+
class="list-item-remove"
|
|
783
|
+
aria-label="Remove ${e}"
|
|
784
|
+
@click=${()=>this._removeFromList(`promptSkills`,r,e)}
|
|
785
|
+
>\u2715</button>
|
|
786
|
+
</span>
|
|
787
|
+
`)}
|
|
788
|
+
</div>
|
|
789
|
+
`:t`<div class="empty-list">No items</div>`}
|
|
790
|
+
<div class="list-add-row">
|
|
791
|
+
<input
|
|
792
|
+
class="list-add-input"
|
|
793
|
+
type="text"
|
|
794
|
+
placeholder="Skill name..."
|
|
795
|
+
.value=${i}
|
|
796
|
+
@input=${e=>a(e.target.value)}
|
|
797
|
+
@keydown=${e=>{e.key===`Enter`&&(e.preventDefault(),this._addToList(`promptSkills`,r,i),a(``))}}
|
|
798
|
+
/>
|
|
799
|
+
<button
|
|
800
|
+
class="list-add-btn"
|
|
801
|
+
@click=${()=>{this._addToList(`promptSkills`,r,i),a(``)}}
|
|
802
|
+
>Add</button>
|
|
803
|
+
</div>
|
|
804
|
+
</div>
|
|
805
|
+
`}_triggerFolderUpload(){(this.shadowRoot?.querySelector(`#skill-folder-input`))?.click()}async _handleFolderSelected(e){let t=e.target,n=t.files;if(!n||n.length===0||!this.rpcClient)return;let r=n[0].webkitRelativePath.split(`/`)[0];if(!r){u.show(`Could not determine folder name`,`error`);return}this._isUploadingSkill=!0;try{let e=[];for(let t of Array.from(n)){let n=t.webkitRelativePath.split(`/`).slice(1).join(`/`);if(!n)continue;let r=await t.text();e.push({path:n,content:r})}if(e.length===0){u.show(`No files found in folder`,`error`);return}await this.rpcClient.call(`skills.upload`,{name:r,files:e,agentId:this._installScope===`agent`?this._installAgent:this._defaultAgentId,scope:this._installScope===`shared`?`shared`:`local`}),u.show(`Skill "${r}" uploaded`,`success`),await this._refreshSkills()}catch(e){u.show(`Failed to upload skill: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}finally{this._isUploadingSkill=!1,t.value=``}}async _handleImportSkill(){let e=this._importUrl.trim();if(!(!e||!this.rpcClient||this._isImportingSkill)){this._isImportingSkill=!0;try{let t=await this.rpcClient.call(`skills.import`,{url:e,agentId:this._installScope===`agent`?this._installAgent:this._defaultAgentId,scope:this._installScope===`shared`?`shared`:`local`});u.show(`Skill "${t.name}" imported (${t.fileCount} files)`,`success`),this._importUrl=``,await this._refreshSkills()}catch(e){u.show(`Failed to import skill: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}finally{this._isImportingSkill=!1}}}_handleDeleteSkill(e){!this.rpcClient||this._deletingSkill||(this._deletingSkill=e)}async _confirmDeleteSkill(){if(!this.rpcClient||!this._deletingSkill)return;let e=this._deletingSkill;try{let t=g(this._discoveredSkills.find(t=>t.name===e)?.location??``);await this.rpcClient.call(`skills.delete`,{name:e,agentId:t||this._defaultAgentId,scope:t?`local`:`shared`}),u.show(`Skill "${e}" deleted`,`success`),this._deletingSkill=null,await this._refreshSkills()}catch(e){u.show(`Failed to delete skill: ${e instanceof Error?e.message:`Unknown error`}`,`error`),this._deletingSkill=null}}async _onAgentChange(e){this._targetAgentId=e,this._skillScope=`all`,await this._loadData()}async _refreshSkills(){if(this.rpcClient)try{let e=await this.rpcClient.call(`skills.list`,{agentId:this._targetAgentId});this._discoveredSkills=e.skills??[]}catch{}}_renderDiscoveredSkills(){let e=this._searchQuery?this._discoveredSkills.filter(e=>e.name.toLowerCase().includes(this._searchQuery.toLowerCase())||e.description.toLowerCase().includes(this._searchQuery.toLowerCase())):this._discoveredSkills,n=this._discoveredSkills.length>0,r=n?e.filter(e=>e.source===`local`):[],i=n?e.filter(e=>e.source!==`local`):[],a=this._skillScope===`all`||this._skillScope===`shared`,o=this._skillScope===`all`||this._skillScope===`local`,s=a?r:[],c=o?i:[],u=s.length===0&&c.length===0;return t`
|
|
806
|
+
${!n||u?t`
|
|
807
|
+
<ic-empty-state
|
|
808
|
+
icon="skills"
|
|
809
|
+
message=${n?`No skills match the current filter`:`No prompt skills discovered`}
|
|
810
|
+
description=${n?`Try changing the scope filter or search query.`:`Upload a skill folder or import from GitHub to get started.`}
|
|
811
|
+
></ic-empty-state>
|
|
812
|
+
`:t`
|
|
813
|
+
${s.length>0?t`
|
|
814
|
+
<div class="category-header">Shared Skills (${s.length})</div>
|
|
815
|
+
<div class="tool-grid">
|
|
816
|
+
${s.map(e=>t`
|
|
817
|
+
<div class="tool-card">
|
|
818
|
+
<div class="tool-card-header">
|
|
819
|
+
<span class="tool-name">${e.name}</span>
|
|
820
|
+
<div style="display: flex; gap: 0.25rem; align-items: center;">
|
|
821
|
+
${e.disableModelInvocation?t`<ic-tag variant="warning">manual</ic-tag>`:l}
|
|
822
|
+
<ic-tag variant="info">SHARED</ic-tag>
|
|
823
|
+
<button
|
|
824
|
+
class="skill-delete-btn"
|
|
825
|
+
aria-label="Delete ${e.name}"
|
|
826
|
+
@click=${()=>this._handleDeleteSkill(e.name)}
|
|
827
|
+
>\u2715</button>
|
|
828
|
+
</div>
|
|
829
|
+
</div>
|
|
830
|
+
<span class="tool-desc">${e.description.length>150?e.description.slice(0,150)+`...`:e.description}</span>
|
|
831
|
+
</div>
|
|
832
|
+
`)}
|
|
833
|
+
</div>
|
|
834
|
+
`:l}
|
|
835
|
+
|
|
836
|
+
${o?t`
|
|
837
|
+
<div class="category-header">Agent Skills (${c.length})</div>
|
|
838
|
+
${c.length>0?t`
|
|
839
|
+
<div class="tool-grid">
|
|
840
|
+
${c.map(e=>{let n=g(e.location);return t`
|
|
841
|
+
<div class="tool-card">
|
|
842
|
+
<div class="tool-card-header">
|
|
843
|
+
<span class="tool-name">${e.name}</span>
|
|
844
|
+
<div style="display: flex; gap: 0.25rem; align-items: center;">
|
|
845
|
+
${e.disableModelInvocation?t`<ic-tag variant="warning">manual</ic-tag>`:l}
|
|
846
|
+
${n?t`<ic-tag variant="accent">${n}</ic-tag>`:t`<ic-tag variant="accent">AGENT</ic-tag>`}
|
|
847
|
+
<button
|
|
848
|
+
class="skill-delete-btn"
|
|
849
|
+
aria-label="Delete ${e.name}"
|
|
850
|
+
@click=${()=>this._handleDeleteSkill(e.name)}
|
|
851
|
+
>\u2715</button>
|
|
852
|
+
</div>
|
|
853
|
+
</div>
|
|
854
|
+
<span class="tool-desc">${e.description.length>150?e.description.slice(0,150)+`...`:e.description}</span>
|
|
855
|
+
</div>
|
|
856
|
+
`})}
|
|
857
|
+
</div>
|
|
858
|
+
`:t`
|
|
859
|
+
<p style="font-size: var(--ic-text-sm); color: var(--ic-text-dim); font-style: italic;">
|
|
860
|
+
No agent-specific skills installed. Upload or import skills below.
|
|
861
|
+
</p>
|
|
862
|
+
`}
|
|
863
|
+
`:l}
|
|
864
|
+
`}
|
|
865
|
+
|
|
866
|
+
<!-- Add Skill panel -->
|
|
867
|
+
<div class="add-skill-panel">
|
|
868
|
+
<div class="add-skill-title">Add Skill</div>
|
|
869
|
+
|
|
870
|
+
<!-- Install target selector -->
|
|
871
|
+
<div class="install-target">
|
|
872
|
+
<span class="install-target-label">Install to:</span>
|
|
873
|
+
<select
|
|
874
|
+
class="install-target-select"
|
|
875
|
+
.value=${this._installScope}
|
|
876
|
+
@change=${e=>{this._installScope=e.target.value,this._installScope===`agent`&&!this._installAgent&&(this._installAgent=this._agentIds[0]??this._defaultAgentId)}}
|
|
877
|
+
>
|
|
878
|
+
<option value="shared" ?selected=${this._installScope===`shared`}>Shared (all agents)</option>
|
|
879
|
+
<option value="agent" ?selected=${this._installScope===`agent`}>Specific agent</option>
|
|
880
|
+
</select>
|
|
881
|
+
${this._installScope===`agent`?t`
|
|
882
|
+
<select
|
|
883
|
+
class="install-target-select"
|
|
884
|
+
.value=${this._installAgent}
|
|
885
|
+
@change=${e=>{this._installAgent=e.target.value}}
|
|
886
|
+
>
|
|
887
|
+
${this._agentIds.map(e=>t`
|
|
888
|
+
<option value=${e} ?selected=${e===this._installAgent}>${e}</option>
|
|
889
|
+
`)}
|
|
890
|
+
</select>
|
|
891
|
+
`:l}
|
|
892
|
+
<span class="install-target-hint">
|
|
893
|
+
${this._installScope===`shared`?`Skill will be available to all agents`:`Skill will only be available to ${this._installAgent||`the selected agent`}`}
|
|
894
|
+
</span>
|
|
895
|
+
</div>
|
|
896
|
+
|
|
897
|
+
<!-- Two methods side by side -->
|
|
898
|
+
<div class="add-skill-methods">
|
|
899
|
+
<div class="add-skill-method">
|
|
900
|
+
<div class="add-skill-method-title">Upload folder</div>
|
|
901
|
+
<div class="add-skill-method-body">
|
|
902
|
+
<input
|
|
903
|
+
id="skill-folder-input"
|
|
904
|
+
type="file"
|
|
905
|
+
webkitdirectory
|
|
906
|
+
hidden
|
|
907
|
+
@change=${e=>this._handleFolderSelected(e)}
|
|
908
|
+
/>
|
|
909
|
+
<button
|
|
910
|
+
class="upload-skill-btn"
|
|
911
|
+
?disabled=${this._isUploadingSkill}
|
|
912
|
+
@click=${()=>this._triggerFolderUpload()}
|
|
913
|
+
>${this._isUploadingSkill?`Uploading...`:`+ Select Skill Folder`}</button>
|
|
914
|
+
</div>
|
|
915
|
+
<p class="upload-skill-hint">Folder must contain a SKILL.md file</p>
|
|
916
|
+
</div>
|
|
917
|
+
|
|
918
|
+
<div class="add-skill-method">
|
|
919
|
+
<div class="add-skill-method-title">Import from GitHub</div>
|
|
920
|
+
<div class="add-skill-method-body">
|
|
921
|
+
<div class="import-skill-row" style="width: 100%;">
|
|
922
|
+
<input
|
|
923
|
+
type="text"
|
|
924
|
+
.value=${this._importUrl}
|
|
925
|
+
placeholder="https://github.com/owner/repo/tree/main/skills/name"
|
|
926
|
+
@input=${e=>{this._importUrl=e.target.value}}
|
|
927
|
+
@keydown=${e=>{e.key===`Enter`&&(e.preventDefault(),this._handleImportSkill())}}
|
|
928
|
+
/>
|
|
929
|
+
<button
|
|
930
|
+
class="import-skill-btn"
|
|
931
|
+
?disabled=${this._isImportingSkill||!this._importUrl.trim()}
|
|
932
|
+
@click=${()=>this._handleImportSkill()}
|
|
933
|
+
>${this._isImportingSkill?`Importing...`:`Import`}</button>
|
|
934
|
+
</div>
|
|
935
|
+
</div>
|
|
936
|
+
<p class="upload-skill-hint">Paste a GitHub URL to a skill folder</p>
|
|
937
|
+
</div>
|
|
938
|
+
</div>
|
|
939
|
+
</div>
|
|
940
|
+
|
|
941
|
+
<!-- Delete confirmation dialog -->
|
|
942
|
+
<ic-confirm-dialog
|
|
943
|
+
?open=${this._deletingSkill!==null}
|
|
944
|
+
title="Delete Skill"
|
|
945
|
+
message=${`Delete skill "${this._deletingSkill}"? This will remove the skill files from disk.`}
|
|
946
|
+
variant="danger"
|
|
947
|
+
confirmLabel="Delete"
|
|
948
|
+
@confirm=${()=>this._confirmDeleteSkill()}
|
|
949
|
+
@cancel=${()=>{this._deletingSkill=null}}
|
|
950
|
+
></ic-confirm-dialog>
|
|
951
|
+
`}_renderSkillsTab(){return t`
|
|
952
|
+
<ic-search-input
|
|
953
|
+
placeholder="Filter skill names..."
|
|
954
|
+
@search=${e=>{this._searchQuery=e.detail}}
|
|
955
|
+
></ic-search-input>
|
|
956
|
+
|
|
957
|
+
<div style="margin-top: var(--ic-space-md);">
|
|
958
|
+
${this._renderDiscoveredSkills()}
|
|
959
|
+
</div>
|
|
960
|
+
|
|
961
|
+
<p class="tool-hint">Configure prompt skill settings (max body length, auto-inject, allowed/denied lists) per agent in the agent editor.</p>
|
|
962
|
+
`}async _onProfileChange(e){this._skillsConfig&&await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,profile:e}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,profile:e}})}async _addPolicyItem(e,t){if(!t.trim()||!this._skillsConfig)return;let n=[...this._skillsConfig.toolPolicy[e]];if(n.includes(t.trim()))return;let r=[...n,t.trim()];await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,[e]:r}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,[e]:r}})}async _removePolicyItem(e,t){if(!this._skillsConfig)return;let n=this._skillsConfig.toolPolicy[e].filter(e=>e!==t);await this._patchConfig(`agents.${this._targetAgentId}.skills`,{toolPolicy:{...this._skillsConfig.toolPolicy,[e]:n}})&&(this._skillsConfig={...this._skillsConfig,toolPolicy:{...this._skillsConfig.toolPolicy,[e]:n}})}_getResolvedTools(){if(!this._skillsConfig)return{included:[],denied:[]};let e=this._skillsConfig.toolPolicy,t=h[e.profile]??[],n=new Set([...t,...e.allow]),r=new Set(e.deny);return{included:[...n].filter(e=>!r.has(e)),denied:[...n].filter(e=>r.has(e))}}_renderPolicyList(e,n,r,i,a){return t`
|
|
963
|
+
<div class="list-section">
|
|
964
|
+
<div class="list-title">${e}</div>
|
|
965
|
+
${n.length>0?t`
|
|
966
|
+
<div class="list-items">
|
|
967
|
+
${n.map(e=>t`
|
|
968
|
+
<span class="list-item">
|
|
969
|
+
${e}
|
|
970
|
+
<button
|
|
971
|
+
class="list-item-remove"
|
|
972
|
+
aria-label="Remove ${e}"
|
|
973
|
+
@click=${()=>this._removePolicyItem(r,e)}
|
|
974
|
+
>\u2715</button>
|
|
975
|
+
</span>
|
|
976
|
+
`)}
|
|
977
|
+
</div>
|
|
978
|
+
`:t`<div class="empty-list">No items</div>`}
|
|
979
|
+
<div class="list-add-row">
|
|
980
|
+
<input
|
|
981
|
+
class="list-add-input"
|
|
982
|
+
type="text"
|
|
983
|
+
placeholder="Tool name..."
|
|
984
|
+
.value=${i}
|
|
985
|
+
@input=${e=>a(e.target.value)}
|
|
986
|
+
@keydown=${e=>{e.key===`Enter`&&(e.preventDefault(),this._addPolicyItem(r,i),a(``))}}
|
|
987
|
+
/>
|
|
988
|
+
<button
|
|
989
|
+
class="list-add-btn"
|
|
990
|
+
@click=${()=>{this._addPolicyItem(r,i),a(``)}}
|
|
991
|
+
>Add</button>
|
|
992
|
+
</div>
|
|
993
|
+
</div>
|
|
994
|
+
`}_renderRecentActivity(){return this._recentSkillEvents.length===0?l:t`
|
|
995
|
+
<div class="recent-activity">
|
|
996
|
+
<h3>Recent Activity <span class="recent-activity-count">(${this._recentSkillEvents.length})</span></h3>
|
|
997
|
+
<div class="event-list">
|
|
998
|
+
${this._recentSkillEvents.slice(0,20).map(e=>t`
|
|
999
|
+
<div class="event-entry">
|
|
1000
|
+
<span class="event-skill">${e.skillName}</span>
|
|
1001
|
+
<span class="event-agent">${e.agentId||`—`}</span>
|
|
1002
|
+
<span class=${e.outcome===`executed`?`event-outcome--executed`:`event-outcome--rejected`}>
|
|
1003
|
+
${e.outcome}${e.reason?t` <span class="event-reason">(${e.reason})</span>`:``}
|
|
1004
|
+
</span>
|
|
1005
|
+
<span class="event-time">${new Date(e.timestamp).toLocaleTimeString()}</span>
|
|
1006
|
+
</div>
|
|
1007
|
+
`)}
|
|
1008
|
+
</div>
|
|
1009
|
+
</div>
|
|
1010
|
+
`}_renderTabContent(){switch(this._activeTab){case`tools`:return this._renderToolsTab();case`skills`:return this._renderSkillsTab();default:return l}}render(){return this._loadState===`loading`?t`<ic-skeleton-view variant="list"></ic-skeleton-view>`:this._loadState===`error`?t`
|
|
1011
|
+
<div class="error-container">
|
|
1012
|
+
<span class="error-message">${this._error}</span>
|
|
1013
|
+
<button class="retry-btn" @click=${()=>this._tryLoad()}>Retry</button>
|
|
1014
|
+
</div>
|
|
1015
|
+
`:t`
|
|
1016
|
+
<div class="view-header">
|
|
1017
|
+
<div class="view-title">Skills & Tools</div>
|
|
1018
|
+
${this._agentIds.length>1?t`
|
|
1019
|
+
<div style="display: flex; gap: var(--ic-space-sm); align-items: center;">
|
|
1020
|
+
<select
|
|
1021
|
+
class="form-input"
|
|
1022
|
+
.value=${this._targetAgentId}
|
|
1023
|
+
@change=${e=>this._onAgentChange(e.target.value)}
|
|
1024
|
+
>
|
|
1025
|
+
<option value="" ?selected=${this._targetAgentId===``}>All Agents</option>
|
|
1026
|
+
${this._agentIds.map(e=>t`
|
|
1027
|
+
<option value=${e} ?selected=${e===this._targetAgentId}>${e}</option>
|
|
1028
|
+
`)}
|
|
1029
|
+
</select>
|
|
1030
|
+
<select
|
|
1031
|
+
class="form-input"
|
|
1032
|
+
.value=${this._skillScope}
|
|
1033
|
+
@change=${e=>{this._skillScope=e.target.value}}
|
|
1034
|
+
>
|
|
1035
|
+
<option value="all" ?selected=${this._skillScope===`all`}>All Skills</option>
|
|
1036
|
+
<option value="local" ?selected=${this._skillScope===`local`}>Agent Skills</option>
|
|
1037
|
+
<option value="shared" ?selected=${this._skillScope===`shared`}>Shared Skills</option>
|
|
1038
|
+
</select>
|
|
1039
|
+
</div>
|
|
1040
|
+
`:l}
|
|
1041
|
+
</div>
|
|
1042
|
+
<ic-tabs
|
|
1043
|
+
.tabs=${y}
|
|
1044
|
+
.activeTab=${this._activeTab}
|
|
1045
|
+
@tab-change=${e=>{this._activeTab=e.detail}}
|
|
1046
|
+
></ic-tabs>
|
|
1047
|
+
<div style="margin-top: var(--ic-space-md);">
|
|
1048
|
+
${this._renderTabContent()}
|
|
1049
|
+
</div>
|
|
1050
|
+
${this._renderRecentActivity()}
|
|
1051
|
+
`}};c([s({attribute:!1})],b.prototype,`apiClient`,void 0),c([s({attribute:!1})],b.prototype,`rpcClient`,void 0),c([s({attribute:!1})],b.prototype,`eventDispatcher`,void 0),c([a()],b.prototype,`_loadState`,void 0),c([a()],b.prototype,`_recentSkillEvents`,void 0),c([a()],b.prototype,`_error`,void 0),c([a()],b.prototype,`_activeTab`,void 0),c([a()],b.prototype,`_skillsConfig`,void 0),c([a()],b.prototype,`_discoveredSkills`,void 0),c([a()],b.prototype,`_targetAgentId`,void 0),c([a()],b.prototype,`_agentIds`,void 0),c([a()],b.prototype,`_skillScope`,void 0),c([a()],b.prototype,`_defaultAgentId`,void 0),c([a()],b.prototype,`_searchQuery`,void 0),c([a()],b.prototype,`_importUrl`,void 0),c([a()],b.prototype,`_isImportingSkill`,void 0),c([a()],b.prototype,`_isUploadingSkill`,void 0),c([a()],b.prototype,`_deletingSkill`,void 0),c([a()],b.prototype,`_installAgent`,void 0),c([a()],b.prototype,`_installScope`,void 0),c([a()],b.prototype,`_newAllowedSkill`,void 0),c([a()],b.prototype,`_newDeniedSkill`,void 0),c([a()],b.prototype,`_newPolicyAllow`,void 0),c([a()],b.prototype,`_newPolicyDeny`,void 0),b=c([e(`ic-skills-view`)],b);export{b as IcSkillsView};
|