dsh-tool-activator 0.2.1 → 0.3.0

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/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ## 核心行为
18
18
 
19
- 默认基础工具为 `read`、`glob`、`grep`、`skill`、`ask_user_question`、`todo_write`。
19
+ 默认基础工具为 `read`、`glob`、`grep`、`write`、`edit`、`skill`、`ask_user_question`、`todo_write`。
20
20
 
21
21
  | 运行状态 | 模型可见内容 |
22
22
  | --- | --- |
@@ -26,7 +26,7 @@
26
26
 
27
27
  ### 默认启用的工具
28
28
 
29
- `read`、`glob`、`grep`、`skill`、`ask_user_question`、`todo_write`
29
+ `read`、`glob`、`grep`、`write`、`edit`、`skill`、`ask_user_question`、`todo_write`
30
30
 
31
31
  ### 可通过 `activate_tools` 加载的工具
32
32
 
@@ -66,20 +66,20 @@
66
66
 
67
67
  ---
68
68
 
69
- ## 插件配置项
69
+ ## 配置
70
70
 
71
- 在官方插件管理页的 `dsh-tool-activator#tool-activator` 中可配置:
71
+ 进入官方插件管理页,打开 `dsh-tool-activator` 卡片,配置表单直接显示在该插件的页面上(公开 **`plugins.bundle.config`** 槽,key 为包名 `dsh-tool-activator`),不需要再点进某一行的"配置"。
72
72
 
73
- | 配置项 | 默认值 | 说明 |
74
- | --- | --- | --- |
75
- | `enabled` | `true` | 是否启用按需展示 |
76
- | `mode` | `automatic` | 运行模式 (`automatic` / `manual`) |
77
- | `basicTools` | 六个基础工具 | 默认直接展示的工具列表 |
78
- | `excludedTools` | `[]` | 不参与发现与激活的工具;**不是执行 deny list** |
79
- | `requireApproval` | `true` | 激活请求是否需经审批服务(仅 `allowed-once` 有效) |
80
- | `autoGroupMcp` | `true` | 按 server 聚合 `mcp__server__tool` 名称 |
81
- | `groups` | `[]` | 显式工具分组及说明 |
82
- | `sectionTools` | `{}` | 系统说明节到工具名的依赖映射 |
73
+ 表单只有一份工具列表:
74
+
75
+ | 分区 | 含义 |
76
+ | --- | --- |
77
+ | **默认激活工具(N 个)** | 每次请求都带完整 schema 的工具;插件自带的八个基础工具固定在此区并排在最前,标题右侧带"基础工具"标记,开关为禁用,不允许关闭 |
78
+ | **已安装但需先激活(M 个)** | 其余工具,模型用 `activate_tools` 按需获取 |
79
+
80
+ 打开某一项的开关即把它写进 `basicTools`(默认加载),关闭则移回按需区;工具清单与描述由宿主 Remote `toolActivator/catalog` 提供,覆盖当前所有 live agent 作用域。
81
+
82
+ 其余宿主字段(`mode`、`excludedTools`、`autoGroupMcp`、`groups`、`sectionTools`)仍保留在 schema 中并沿用默认值,但不再出现在表单里。
83
83
 
84
84
  ---
85
85
 
@@ -102,7 +102,7 @@ node node_modules/typescript/bin/tsc --noEmit
102
102
  node node_modules/vitest/vitest.mjs run
103
103
  ```
104
104
 
105
- * **测试情况**:已完成 5 次独立全量测试(包含 4 个 shuffle seed,共 12 个文件、313 个用例全部通过)。
105
+ * **测试情况**:已完成 5 次独立全量测试(包含 4 个 shuffle seed);配置界面重做为工具开关后,当前 11 个文件、288 个用例再次全部通过。
106
106
  * **未验证项**:本次未执行 Build、真实 GUI E2E、打包发布及真实 profile 验证。
107
107
 
108
108
  ---
@@ -23,7 +23,6 @@
23
23
  | `@deepseek-ai/schemastery` | 3.18.4 | Copyright (c) 2021-present Shigma;[MIT 原文](<licenses/Schemastery-MIT.txt>) |
24
24
  | `@deepseek-ai/cosmokit` | 1.8.5 | Copyright (c) 2021-present Shigma;与 schemastery 相同的 MIT 条款,见[MIT 原文](<licenses/Schemastery-MIT.txt>)。仅用于 schemastery 公开类型中 `Dict` / `Volatile` 的可移植引用 |
25
25
  | `zod` | 4.4.3 | Copyright (c) 2025 Colin McDonnell;[MIT 原文](<licenses/Zod-MIT.txt>) |
26
- | `css-render` | 0.15.14 | 已安装 package manifest 声明 MIT,但该包未包含独立许可全文;不能据此臆造 copyright notice。实际发布前需取得对应上游许可与所有被捆绑部分的 notice |
27
26
 
28
27
  其它开发/运行依赖以[包声明](<package.json>)和[依赖锁](<pnpm-lock.yaml>)为准;仅使用接口不等于其独立许可已被本项目替换。没有执行 Build,尚不能断言最终 bundle 具体包含哪些第三方代码。对最终产物、直接与传递依赖的完整版权/许可 inventory,仍需在准备发行时单独核查。
29
28
 
package/dist/client.js CHANGED
@@ -1,17 +1,27 @@
1
1
  window.__ModuleLoader__.load({id:"dsh-tool-activator",factory:(require)=>{var module={exports:{}};var exports=module.exports;
2
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require("react");l=c(l,1);let u=require("react/jsx-runtime");const d={enabled:!0,mode:`automatic`,basicTools:[`read`,`glob`,`grep`,`skill`,`ask_user_question`,`todo_write`],excludedTools:[],requireApproval:!0,autoGroupMcp:!0,groups:[],sectionTools:{}},f=`plugins.row.config`,p=`dsh-tool-activator-configuration`,m=/^[\w.-]+$/u,h=new Set([`identifier`,`name`,`description`,`tools`,`sections`]),g={root:`dsh-tool-activator-config`,header:`dsh-tool-activator-header`,title:`dsh-tool-activator-title`,description:`dsh-tool-activator-description`,notice:`dsh-tool-activator-notice`,error:`dsh-tool-activator-error`,success:`dsh-tool-activator-success`,fields:`dsh-tool-activator-fields`,field:`dsh-tool-activator-field`,checkbox:`dsh-tool-activator-checkbox`,help:`dsh-tool-activator-help`,actions:`dsh-tool-activator-actions`,advanced:`dsh-tool-activator-advanced`,version:`dsh-tool-activator-version`,icon:`dsh-tool-activator-icon`};function _(e){let t=e?.state;return t?.status===`ready`&&t.value!==void 0&&t.mode===`host`&&t.writable&&Number.isSafeInteger(t.revision)&&t.revision!==void 0&&t.revision>=0}function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function y(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function b(e){return{enabled:typeof e?.enabled==`boolean`?e.enabled:d.enabled,mode:e?.mode===`manual`?`manual`:d.mode,basicToolsText:y(e?.basicTools)?e.basicTools.join(`
3
- `):d.basicTools.join(`
4
- `),excludedToolsText:y(e?.excludedTools)?e.excludedTools.join(`
5
- `):d.excludedTools.join(`
6
- `),requireApproval:typeof e?.requireApproval==`boolean`?e.requireApproval:d.requireApproval,autoGroupMcp:typeof e?.autoGroupMcp==`boolean`?e.autoGroupMcp:d.autoGroupMcp,groupsText:JSON.stringify(Array.isArray(e?.groups)?e.groups:d.groups,null,2),sectionToolsText:JSON.stringify(v(e?.sectionTools)?e.sectionTools:d.sectionTools,null,2)}}function x(e,t){let n=[...new Set(e.split(/\r?\n/u).map(e=>e.trim()).filter(Boolean))];if(n.some(e=>!m.test(e)))throw Error(`${t}每行填写一个真实工具名,只能包含字母、数字、下划线、点和连字符。`);return n}function S(e,t){try{return JSON.parse(e)}catch{throw Error(`${t}不是有效 JSON。`)}}function C(e){let t=S(e,`工具分组`);if(!Array.isArray(t))throw Error(`工具分组必须是 JSON 数组。`);let n=new Set,r=new Set;return t.map((e,t)=>{let i=`第 ${t+1} 个工具分组`;if(!v(e)||Object.keys(e).some(e=>!h.has(e)))throw Error(`${i}只接受 identifier、name、description、tools 和 sections。`);if(typeof e.identifier!=`string`||!m.test(e.identifier))throw Error(`${i}需要有效的 identifier(字母、数字、下划线、点或连字符)。`);if(n.has(e.identifier))throw Error(`工具分组 identifier 重复:${e.identifier}。`);if(n.add(e.identifier),e.name!==void 0&&typeof e.name!=`string`)throw Error(`${i}的 name 必须是字符串。`);if(e.description!==void 0&&typeof e.description!=`string`)throw Error(`${i}的 description 必须是字符串。`);if(!y(e.tools)||e.tools.length===0||e.tools.some(e=>!m.test(e)))throw Error(`${i}的 tools 至少包含一个有效工具名。`);for(let t of e.tools){if(r.has(t))throw Error(`工具 ${t} 不能同时属于多个分组或在分组内重复。`);r.add(t)}if(e.sections!==void 0&&!y(e.sections))throw Error(`${i}的 sections 必须是字符串数组。`);return{identifier:e.identifier,name:typeof e.name==`string`?e.name:``,description:typeof e.description==`string`?e.description:``,tools:[...e.tools],sections:y(e.sections)?[...e.sections]:[]}})}function w(e){let t=S(e,`说明节依赖`);if(!v(t))throw Error(`说明节依赖必须是 JSON 对象。`);let n=Object.entries(t).map(([e,t])=>{if(!y(t)||t.some(e=>!m.test(e)))throw Error(`说明节依赖需要说明节名称和有效工具名数组。`);return[e,[...new Set(t)]]});return Object.fromEntries(n)}function T(e){try{return{ok:!0,policy:{enabled:e.enabled,mode:e.mode,basicTools:x(e.basicToolsText,`基础工具`),excludedTools:x(e.excludedToolsText,`排除工具`),requireApproval:e.requireApproval,autoGroupMcp:e.autoGroupMcp,groups:C(e.groupsText),sectionTools:w(e.sectionToolsText)}}}catch(e){return{ok:!1,message:e instanceof Error?e.message:`配置格式无效。`}}}function E(e){return Object.entries(e).map(([e,t])=>({op:`set`,path:[e],value:t}))}const D=e=>l.createElement(`svg`,Object.assign({xmlns:`http://www.w3.org/2000/svg`,width:16,height:16,fill:`none`,viewBox:`0 0 16 16`},e),l.createElement(`path`,{fill:`currentColor`,fillRule:`evenodd`,d:`m8.581 9.298.776.143q.311.059.643.059A3.5 3.5 0 0 0 13.5 6q0-.177-.027-.352l-1.39 1.39a1.58 1.58 0 0 1-1.114.462A2.47 2.47 0 0 1 8.5 5.03c0-.417.166-.817.461-1.112l1.39-1.39A2.4 2.4 0 0 0 10 2.5a3.5 3.5 0 0 0-3.441 4.143l.143.776-3.813 3.813a1.329 1.329 0 0 0 1.879 1.879zm3.817-6.787a.795.795 0 0 0-.411-1.018C11.87 1.432 11.014 1 10 1a5 5 0 0 0-4.916 5.916l-3.256 3.256a2.828 2.828 0 1 0 4 4l3.256-3.256Q9.53 11 10 11a5 5 0 0 0 5-5c0-1.014-.432-1.87-.493-1.987l-.014-.027a.795.795 0 0 0-1.273-.207l-2.198 2.2a.07.07 0 0 1-.053.021.97.97 0 0 1-.969-.97q0-.03.022-.052L12.22 2.78a.8.8 0 0 0 .178-.27`,clipRule:`evenodd`}));function O({view:e,form:t}){let n=(0,l.useId)(),r=(0,l.useRef)(!1),i=(0,l.useRef)(0),a=(0,l.useRef)(t);a.current=t;let o=_(t),s=t?.mutate,c=t?.state.value,d=t?.state.revision,[f,p]=(0,l.useState)(()=>({mutate:s,writable:o,value:c,revision:d,draft:b(c),pending:!1,feedback:void 0})),m=f.mutate!==s||f.writable!==o,h=f.value!==c||f.revision!==d;(m||h)&&(m&&(i.current+=1),p({mutate:s,writable:o,value:c,revision:d,draft:b(c),pending:!m&&f.pending,feedback:m||!f.pending?void 0:f.feedback}));let{draft:v,pending:y,feedback:x}=f,S=!o||y;(0,l.useEffect)(()=>(r.current=!0,()=>{r.current=!1,i.current+=1}),[]);function C(e,t){p(n=>({...n,draft:{...n.draft,[e]:t},feedback:void 0}))}function w(){p(e=>({...e,draft:b(a.current?.state.value),feedback:void 0}))}async function O(){let e=a.current;if(!e||!_(e)||y)return;let t=T(v);if(!t.ok){p(e=>({...e,feedback:{kind:`error`,message:t.message}}));return}let n=++i.current,o=e.mutate,s=e.state.revision;p(e=>({...e,pending:!0,feedback:void 0}));function c(){return r.current&&i.current===n&&a.current?.mutate===o&&_(a.current)}try{let n=await e.mutate(E(t.policy),s);if(!c())return;p(e=>({...e,feedback:n?{kind:`success`,message:`配置已保存。新的模型请求会使用最新工具策略。`}:{kind:`error`,message:`宿主未接受保存(配置冲突、校验失败或不可写)。请核对最新配置后重试。`}}))}catch(e){if(!c())return;p(t=>({...t,feedback:{kind:`error`,message:`保存失败:${e instanceof Error?e.message:`无法连接宿主。`}`}}))}finally{c()&&p(e=>({...e,pending:!1}))}}function k(e){e.preventDefault(),O()}return e===`summary`?(0,u.jsx)(`p`,{className:g.description,children:`默认仅提供基础工具;按需发现和激活其他工具。这不是执行权限授权。`}):(0,u.jsxs)(`section`,{className:g.root,"aria-labelledby":`${n}-title`,children:[(0,u.jsxs)(`header`,{className:g.header,children:[(0,u.jsx)(D,{className:g.icon,"aria-hidden":`true`}),(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h2`,{id:`${n}-title`,className:g.title,children:`按需工具加载`}),(0,u.jsx)(`p`,{className:g.description,children:`默认仅向模型展示基础工具,按当前会话和工具作用域发现、激活其他工具。`})]})]}),(0,u.jsx)(`p`,{className:g.notice,children:`工具展示不等于执行授权。隐藏、排除或激活工具不会绕过 DSH 的审批、沙箱和工具安全检查。`}),(0,u.jsxs)(`p`,{className:g.version,children:[`需要 DSH`,` `,`0.2.0-rc.2`,` `,`或以上,且须提供官方插件配置表单。不支持的版本应禁用本功能,不会使用私有 API。`]}),!t||t.state.status===`unavailable`?(0,u.jsx)(`p`,{role:`status`,className:g.notice,children:`此配置表单不可用。请检查宿主版本、插件加载状态及官方配置服务。`}):t.state.status===`loading`?(0,u.jsx)(`p`,{role:`status`,className:g.notice,children:`正在加载宿主配置…`}):o?null:(0,u.jsx)(`p`,{role:`status`,className:g.notice,children:`宿主配置只读或尚未同步。仅在 host 模式、配置可写且版本已同步时允许保存。`}),(0,u.jsxs)(`form`,{onSubmit:k,"aria-label":`工具激活策略`,"aria-busy":y,children:[(0,u.jsxs)(`fieldset`,{className:g.fields,disabled:S,children:[(0,u.jsx)(`legend`,{children:`工具策略`}),(0,u.jsxs)(`label`,{className:g.checkbox,children:[(0,u.jsx)(`input`,{type:`checkbox`,checked:v.enabled,onChange:e=>C(`enabled`,e.target.checked)}),`启用按需工具加载`]}),!v.enabled&&(0,u.jsx)(`p`,{className:g.help,children:`关闭时不进行工具展示过滤;仍遵守原有执行权限检查。`}),(0,u.jsxs)(`div`,{className:g.field,children:[(0,u.jsx)(`label`,{htmlFor:`${n}-mode`,children:`加载模式`}),(0,u.jsxs)(`select`,{id:`${n}-mode`,value:v.mode,onChange:e=>C(`mode`,e.target.value===`manual`?`manual`:`automatic`),"aria-describedby":`${n}-mode-help`,children:[(0,u.jsx)(`option`,{value:`automatic`,children:`自动:基础工具 + 按需激活`}),(0,u.jsx)(`option`,{value:`manual`,children:`手动:仅基础工具`})]}),(0,u.jsx)(`p`,{id:`${n}-mode-help`,className:g.help,children:v.mode===`manual`?`手动模式仅向模型提供基础工具,不允许通过本插件激活其他工具。`:`自动模式保留基础工具与发现、激活入口;激活只改变后续工具展示,不授予执行权限。`})]}),(0,u.jsxs)(`label`,{className:g.checkbox,children:[(0,u.jsx)(`input`,{type:`checkbox`,checked:v.requireApproval,onChange:e=>C(`requireApproval`,e.target.checked)}),`激活前请求用户确认`]}),(0,u.jsx)(`p`,{className:g.help,children:`默认开启;没有可用审批服务时拒绝激活。关闭此项也不会关闭核心安全审批。`}),(0,u.jsxs)(`label`,{className:g.checkbox,children:[(0,u.jsx)(`input`,{type:`checkbox`,checked:v.autoGroupMcp,onChange:e=>C(`autoGroupMcp`,e.target.checked)}),`自动按 MCP 服务分组`]}),(0,u.jsx)(`p`,{className:g.help,children:`只根据公开的 mcp__server__tool 工具名聚合,不推测服务器私有元数据。`}),(0,u.jsxs)(`div`,{className:g.field,children:[(0,u.jsx)(`label`,{htmlFor:`${n}-basic`,children:`基础工具(每行一个名称)`}),(0,u.jsx)(`textarea`,{id:`${n}-basic`,rows:6,value:v.basicToolsText,onChange:e=>C(`basicToolsText`,e.target.value),"aria-describedby":`${n}-basic-help`,spellCheck:!1}),(0,u.jsx)(`p`,{id:`${n}-basic-help`,className:g.help,children:`填写真实工具名;默认包含 read、glob、grep、skill、ask_user_question、todo_write。`})]}),(0,u.jsxs)(`div`,{className:g.field,children:[(0,u.jsx)(`label`,{htmlFor:`${n}-excluded`,children:`排除工具(每行一个名称)`}),(0,u.jsx)(`textarea`,{id:`${n}-excluded`,rows:3,value:v.excludedToolsText,onChange:e=>C(`excludedToolsText`,e.target.value),"aria-describedby":`${n}-excluded-help`,spellCheck:!1}),(0,u.jsx)(`p`,{id:`${n}-excluded-help`,className:g.help,children:`不纳入本插件的发现与激活目录;不是禁止执行名单,也不是安全权限边界。`})]}),(0,u.jsxs)(`details`,{className:g.advanced,children:[(0,u.jsx)(`summary`,{children:`高级:显式分组与说明节依赖`}),(0,u.jsxs)(`div`,{className:g.field,children:[(0,u.jsx)(`label`,{htmlFor:`${n}-groups`,children:`工具分组(JSON 数组)`}),(0,u.jsx)(`textarea`,{id:`${n}-groups`,rows:8,value:v.groupsText,onChange:e=>C(`groupsText`,e.target.value),"aria-describedby":`${n}-groups-help`,spellCheck:!1}),(0,u.jsx)(`p`,{id:`${n}-groups-help`,className:g.help,children:`每项包含唯一 identifier、至少一个 tools 工具名;可选 name、description、sections。每个工具只能属于一个分组。空名称和描述采用默认说明。`})]}),(0,u.jsxs)(`div`,{className:g.field,children:[(0,u.jsx)(`label`,{htmlFor:`${n}-sections`,children:`说明节依赖(JSON 对象)`}),(0,u.jsx)(`textarea`,{id:`${n}-sections`,rows:6,value:v.sectionToolsText,onChange:e=>C(`sectionToolsText`,e.target.value),"aria-describedby":`${n}-sections-help`,spellCheck:!1}),(0,u.jsx)(`p`,{id:`${n}-sections-help`,className:g.help,children:`将公开系统说明节名称映射到真实工具名数组;仅用于与工具一起显示相关说明,不改写核心安全说明。`})]})]})]}),x&&(0,u.jsx)(`p`,{role:x.kind===`error`?`alert`:`status`,className:x.kind===`error`?g.error:g.success,children:x.message}),y&&(0,u.jsx)(`p`,{role:`status`,className:g.help,children:`正在保存宿主配置…`}),(0,u.jsxs)(`div`,{className:g.actions,children:[(0,u.jsx)(`button`,{type:`submit`,disabled:S,children:y?`保存中…`:`保存配置`}),(0,u.jsx)(`button`,{type:`button`,disabled:S,onClick:w,children:`放弃未保存更改`})]})]})]})}var k=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.parseSelectorPath=void 0;function t(e){let t=0;for(let n=0;n<e.length;++n)e[n]===`&`&&++t;return t}let n=/\s*,(?![^(]*\))\s*/g,r=/\s+/g;function i(e,r){let i=[];return r.split(n).forEach(n=>{let r=t(n);if(!r){e.forEach(e=>{i.push((e&&e+` `)+n)});return}else if(r===1){e.forEach(e=>{i.push(n.replace(`&`,e))});return}let a=[n];for(;r--;){let t=[];a.forEach(n=>{e.forEach(e=>{t.push(n.replace(`&`,e))})}),a=t}a.forEach(e=>i.push(e))}),i}function a(e,t){let r=[];return t.split(n).forEach(t=>{e.forEach(e=>{r.push((e&&e+` `)+t)})}),r}function o(e){let t=[``];return e.forEach(e=>{e&&=e.trim(),e&&(t=e.includes(`&`)?i(t,e):a(t,e))}),t.join(`, `).replace(r,` `)}e.parseSelectorPath=o})),A=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.isMediaOrSupports=e.createElement=e.queryElement=e.removeElement=void 0;function t(e){if(!e)return;let t=e.parentElement;t&&t.removeChild(e)}e.removeElement=t;function n(e,t){return(t??document.head).querySelector(`style[cssr-id="${e}"]`)}e.queryElement=n;function r(e){let t=document.createElement(`style`);return t.setAttribute(`cssr-id`,e),t}e.createElement=r;function i(e){return e?/^\s*@(s|m)/.test(e):!1}e.isMediaOrSupports=i})),j=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.render=void 0;let t=k(),n=A(),r=/[A-Z]/g;function i(e){return e.replace(r,e=>`-`+e.toLowerCase())}function a(e,t=` `){return typeof e==`object`&&e?` {
7
- `+Object.entries(e).map(e=>t+` ${i(e[0])}: ${e[1]};`).join(`
8
- `)+`
9
- `+t+`}`:`: ${e};`}function o(e,t,n){return typeof e==`function`?e({context:t.context,props:n}):e}function s(e,t,n,r){if(!t)return``;let s=o(t,n,r);if(!s)return``;if(typeof s==`string`)return`${e} {\n${s}\n}`;let c=Object.keys(s);if(c.length===0)return n.config.keepEmptyBlock?e+` {
10
- }`:``;let l=e?[e+` {`]:[];return c.forEach(e=>{let t=s[e];if(e===`raw`){l.push(`
11
- `+t+`
12
- `);return}e=i(e),t!=null&&l.push(` ${e}${a(t)}`)}),e&&l.push(`}`),l.join(`
13
- `)}function c(e,t,n){e&&e.forEach(e=>{if(Array.isArray(e))c(e,t,n);else if(typeof e==`function`){let r=e(t);Array.isArray(r)?c(r,t,n):r&&n(r)}else e&&n(e)})}function l(e,r,i,a,o){let u=e.$,d=``;if(!u||typeof u==`string`)(0,n.isMediaOrSupports)(u)?d=u:r.push(u);else if(typeof u==`function`){let e=u({context:a.context,props:o});(0,n.isMediaOrSupports)(e)?d=e:r.push(e)}else if(u.before&&u.before(a.context),!u.$||typeof u.$==`string`)(0,n.isMediaOrSupports)(u.$)?d=u.$:r.push(u.$);else if(u.$){let e=u.$({context:a.context,props:o});(0,n.isMediaOrSupports)(e)?d=e:r.push(e)}let f=(0,t.parseSelectorPath)(r),p=s(f,e.props,a,o);d?i.push(`${d} {`):p.length&&i.push(p),e.children&&c(e.children,{context:a.context,props:o},e=>{if(typeof e==`string`){let t=s(f,{raw:e},a,o);i.push(t)}else l(e,r,i,a,o)}),r.pop(),d&&i.push(`}`),u&&u.after&&u.after(a.context)}function u(e,t,n){let r=[];return l(e,[],r,t,n),r.join(`
14
-
15
- `)}e.render=u})),M=o((e=>{function t(e){for(var t,n=0,r=0,i=e.length;i>=4;++r,i-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(i){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=t})),N=o(((e,t)=>{t.exports=M()})),P=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=N();Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),F=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.mount=e.unmount=void 0;let t=P(),n=A();typeof window<`u`&&(window.__cssrContext={});function r(e,t,r,i){let{els:a}=t;if(r===void 0)a.forEach(n.removeElement),t.els=[];else{let e=(0,n.queryElement)(r,i);e&&a.includes(e)&&((0,n.removeElement)(e),t.els=a.filter(t=>t!==e))}}e.unmount=r;function i(e,t){e.push(t)}function a(e,r,a,o,s,c,l,u,d){let f;if(a===void 0&&(f=r.render(o),a=(0,t.default)(f)),d){d.adapter(a,f??r.render(o));return}u===void 0&&(u=document.head);let p=(0,n.queryElement)(a,u);if(p!==null&&!c)return p;let m=p??(0,n.createElement)(a);if(f===void 0&&(f=r.render(o)),m.textContent=f,p!==null)return p;if(l){let e=u.querySelector(`meta[name="${l}"]`);if(e)return u.insertBefore(m,e),i(r.els,m),m}return s?u.insertBefore(m,u.querySelector(`style, link`)):u.appendChild(m),i(r.els,m),m}e.mount=a})),I=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.c=void 0;let t=j(),n=F();function r(e){return(0,t.render)(this,this.instance,e)}function i(e={}){let{id:t,ssr:r,props:i,head:a=!1,force:o=!1,anchorMetaName:s,parent:c}=e;return(0,n.mount)(this.instance,this,t,i,a,o,s,c,r)}function a(e={}){let{id:t,parent:r}=e;(0,n.unmount)(this.instance,this,t,r)}let o=function(e,t,n,o){return{instance:e,$:t,props:n,children:o,els:[],render:r,mount:i,unmount:a}};e.c=function(e,t,n,r){return Array.isArray(t)?o(e,{$:null},null,t):Array.isArray(n)?o(e,t,null,n):Array.isArray(r)?o(e,t,n,r):o(e,t,n,null)}})),L=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.CssRender=void 0;let t=I(),n=A();function r(e={}){let r={c:((...e)=>(0,t.c)(r,...e)),use:(e,...t)=>e.install(r,...t),find:n.queryElement,context:{},config:e};return r}e.CssRender=r})),R=o((e=>{Object.defineProperty(e,"__esModule",{value:!0})})),z=o((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.exists=void 0;let t=A();function n(e,n){if(e===void 0)return!1;if(n){let{context:{ids:t}}=n;return t.has(e)}return(0,t.queryElement)(e)!==null}e.exists=n})),B=o((e=>{var t=e&&e.__createBinding||(Object.create?(function(e,t,n,r){r===void 0&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}):(function(e,t,n,r){r===void 0&&(r=n),e[r]=t[n]})),n=e&&e.__exportStar||function(e,n){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(n,r)&&t(n,e,r)};Object.defineProperty(e,"__esModule",{value:!0}),e.CssRender=e.exists=e.hash=void 0;let r=L();Object.defineProperty(e,"CssRender",{enumerable:!0,get:function(){return r.CssRender}}),n(R(),e);var i=P();Object.defineProperty(e,"hash",{enumerable:!0,get:function(){return i.default}});var a=z();Object.defineProperty(e,"exists",{enumerable:!0,get:function(){return a.exists}}),e.default=r.CssRender}))();function V(){if(typeof document>`u`)return()=>{};let e=(0,B.CssRender)();if(e.find(`dsh-tool-activator-configuration`)!==null)return()=>{};let t=`.${g.root}`,n=e.c([e.c(t,{color:`inherit`,maxWidth:`54rem`,width:`100%`,padding:`1rem`,lineHeight:`1.6`},[e.c(`*, *::before, *::after`,{boxSizing:`border-box`}),e.c(`p`,{margin:`0.5rem 0`}),e.c(`label, legend, summary`,{fontWeight:`600`}),e.c(`legend`,{padding:`0 0.35rem`}),e.c(`textarea, select`,{width:`100%`,padding:`0.6rem 0.75rem`,border:`1px solid color-mix(in srgb, currentColor 30%, transparent)`,borderRadius:`0.5rem`,color:`inherit`,background:`inherit`,font:`inherit`}),e.c(`textarea`,{resize:`vertical`,fontFamily:`ui-monospace, monospace`}),e.c(`input[type="checkbox"]`,{accentColor:`currentColor`,width:`1rem`,height:`1rem`}),e.c(`button`,{border:`1px solid color-mix(in srgb, currentColor 35%, transparent)`,borderRadius:`0.5rem`,padding:`0.55rem 0.9rem`,color:`inherit`,background:`color-mix(in srgb, currentColor 6%, transparent)`,font:`inherit`,cursor:`pointer`}),e.c(`button:hover:not(:disabled)`,{background:`color-mix(in srgb, currentColor 12%, transparent)`}),e.c(`:disabled`,{opacity:`0.6`,cursor:`not-allowed`}),e.c(`fieldset:disabled`,{opacity:`1`}),e.c(`input:focus-visible, textarea:focus-visible, select:focus-visible, button:focus-visible, summary:focus-visible`,{outline:`2px solid currentColor`,outlineOffset:`3px`})]),e.c(`${t} .${g.header}`,{display:`flex`,alignItems:`flex-start`,gap:`0.75rem`,marginBottom:`1rem`}),e.c(`${t} .${g.icon}`,{width:`1.5rem`,height:`1.5rem`,flexShrink:`0`,marginTop:`0.3rem`}),e.c(`${t} .${g.title}`,{margin:`0`,fontSize:`1.25rem`,lineHeight:`1.4`}),e.c(`${t} .${g.description}`,{opacity:`0.8`}),e.c(`${t} .${g.notice}`,{borderLeft:`3px solid color-mix(in srgb, currentColor 55%, transparent)`,borderRadius:`0.25rem`,background:`color-mix(in srgb, currentColor 5%, transparent)`,padding:`0.65rem 0.8rem`}),e.c(`${t} .${g.version}, ${t} .${g.help}`,{fontSize:`0.875rem`,opacity:`0.8`}),e.c(`${t} .${g.fields}`,{display:`grid`,gap:`0.8rem`,border:`0`,padding:`0`,margin:`1rem 0`,minWidth:`0`}),e.c(`${t} .${g.field}`,{display:`grid`,gap:`0.35rem`,minWidth:`0`}),e.c(`${t} .${g.checkbox}`,{display:`flex`,alignItems:`center`,gap:`0.6rem`,cursor:`pointer`}),e.c(`${t} .${g.advanced}`,{borderTop:`1px solid color-mix(in srgb, currentColor 20%, transparent)`,paddingTop:`0.8rem`},[e.c(`summary`,{cursor:`pointer`,marginBottom:`0.8rem`}),e.c(`.${g.field}`,{marginBottom:`1rem`})]),e.c(`${t} .${g.actions}`,{display:`flex`,flexWrap:`wrap`,gap:`0.65rem`,marginTop:`1rem`}),e.c(`${t} .${g.error}`,{color:`var(--color-danger, #d63e3e)`,fontWeight:`600`}),e.c(`${t} .${g.success}`,{color:`inherit`,fontWeight:`600`})]);n.mount({id:p,head:!0});let r=e.find(p);return()=>{r!==null&&e.find(`dsh-tool-activator-configuration`)===r&&n.unmount({id:p})}}const H=[`slots`];function U(e){e.effect(V),e.slots.inject(f,()=>e.slots.register({name:f,key:`dsh-tool-activator#tool-activator`,registrant:`dsh-tool-activator`,priority:0},O))}exports.apply=U,exports.inject=H;
2
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("react"),t=require("react/jsx-runtime");const n=`plugins.bundle.config`,r=`dsh-tool-activator/config.css`,i={root:`dsh-tool-activator-config`,header:`dsh-tool-activator-header`,title:`dsh-tool-activator-title`,description:`dsh-tool-activator-description`,notice:`dsh-tool-activator-notice`,error:`dsh-tool-activator-error`,success:`dsh-tool-activator-success`,section:`dsh-tool-activator-section`,sectionTitle:`dsh-tool-activator-section-title`,list:`dsh-tool-activator-list`,row:`dsh-tool-activator-row`,rowText:`dsh-tool-activator-row-text`,rowName:`dsh-tool-activator-row-name`,rowMeta:`dsh-tool-activator-row-meta`,help:`dsh-tool-activator-help`};function a(e){let t=Reflect.get(e,`connection`),n=t?.rpc?.call;return typeof n==`function`?n.bind(t.rpc):void 0}async function o(e){let t=a(e);if(!t)throw Error(`连接服务不可用,无法读取工具列表。`);let n=await t(`/api`,`toolActivator/catalog`,{args:{}});if(n?.ok!==!0)throw Error(n?.error?.message??`读取工具列表失败。`);let r=n.value;if(!r||!Array.isArray(r.entries))throw Error(`工具列表返回格式无法识别。`);return r}function s(){return c(`Switch`)}function c(e){try{let t=require("@deepseek-ai/dsh-client-ui-primitives")?.[e];return typeof t==`function`?t:void 0}catch{return}}function l({checked:t,disabled:n,label:r,onChange:i}){return(0,e.createElement)(`button`,{"aria-checked":t,"aria-label":r,className:`dsh-tool-activator-switch`,disabled:n===!0,onClick:()=>i(!t),role:`switch`,type:`button`},(0,e.createElement)(`span`,{className:`dsh-tool-activator-switch-thumb`}))}function u({children:t,className:n}){return(0,e.createElement)(`span`,{className:n===void 0?`dsh-tool-activator-chip`:`dsh-tool-activator-chip ${n}`},t)}const d=s()??l,f=c(`Tag`)??u;function p(e){let t=e.getSnapshot().value?.basicTools;return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}function m(e){return Array.isArray(e.getSnapshot().value?.basicTools)}function h(e,t){return e.tools.length>0&&e.tools.every(e=>t.includes(e))}function g(e,t){return t.length>0&&e.tools.length>0&&e.tools.every(e=>t.includes(e))}function _({view:n,configScope:r,loadToolCatalog:a}){let[o,s]=(0,e.useState)(()=>p(r)),[c,l]=(0,e.useState)(void 0),[u,_]=(0,e.useState)(``),[v,y]=(0,e.useState)(!1),b=(0,e.useRef)(!0);(0,e.useEffect)(()=>(b.current=!0,()=>{b.current=!1}),[]),(0,e.useEffect)(()=>r.subscribe(()=>s(p(r))),[r]),(0,e.useEffect)(()=>{let e=!1;return a().then(t=>{e||(l(t),m(r)===!1&&s(t.basicTools))}).catch(t=>{e||_(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[r,a]);let x=(0,e.useMemo)(()=>{let e=c?.entries??[],t=c?.baseTools??[],n=[],r=[];for(let i of e)(g(i,t)||h(i,o)?n:r).push(i);let i=(e,n)=>{let r=Number(g(n,t))-Number(g(e,t));return r===0?e.name.localeCompare(n.name):r};return{active:n.sort(i),pending:r.sort(i)}},[o,c]),S=(0,e.useCallback)(async(e,t)=>{let n=r.getSnapshot();if(n.status!==`ready`||!n.writable||n.mode!==`host`){_(`当前配置不可写,无法保存。`);return}let i=new Set(o);for(let n of e.tools)t?i.add(n):i.delete(n);let a=[...i],c=o;s(a),y(!0),_(``);try{!await r.mutate([{op:`set`,path:[`basicTools`],value:a}],n.revision)&&b.current&&(s(c),_(`宿主拒绝了本次修改。`))}catch(e){b.current&&(s(c),_(e instanceof Error?e.message:String(e)))}finally{b.current&&y(!1)}},[o,r]);if(n===`summary`)return(0,t.jsx)(`p`,{className:i.description,children:`默认只提供基础工具,其余工具由模型按需加载。`});function C(e){let n=c?.baseTools??[];return(0,t.jsx)(`ul`,{className:i.list,children:e.map(e=>{let r=g(e,n);return(0,t.jsxs)(`li`,{className:i.row,children:[(0,t.jsxs)(`span`,{className:i.rowText,children:[(0,t.jsxs)(`span`,{className:i.rowName,children:[e.name,r?(0,t.jsx)(f,{tone:`neutral`,children:`基础工具`}):null]}),(0,t.jsx)(`span`,{className:i.rowMeta,title:e.description||e.tools.join(`、`),children:e.description||e.tools.join(`、`)})]}),(0,t.jsx)(d,{checked:r||h(e,o),disabled:v||r,label:`默认加载 ${e.name}`,onChange:t=>void S(e,t)})]},e.identifier)})})}return(0,t.jsxs)(`section`,{className:i.root,children:[(0,t.jsxs)(`header`,{className:i.header,children:[(0,t.jsx)(`h3`,{className:i.title,children:`工具`}),(0,t.jsx)(`p`,{className:i.description,children:`打开开关即默认加载;关闭后按需加载,由模型用 activate_tools 获取。`})]}),u===``?null:(0,t.jsx)(`p`,{className:i.error,role:`alert`,children:u}),c===void 0?(0,t.jsx)(`p`,{className:i.help,role:`status`,children:u===``?`正在读取工具列表…`:`工具列表不可用。`}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(`section`,{className:i.section,children:[(0,t.jsx)(`h4`,{className:i.sectionTitle,children:`默认激活工具(${x.active.length} 个)`}),x.active.length===0?(0,t.jsx)(`p`,{className:i.help,children:`当前没有默认激活的工具。`}):C(x.active)]}),(0,t.jsxs)(`section`,{className:i.section,children:[(0,t.jsx)(`h4`,{className:i.sectionTitle,children:`已安装但需先激活(${x.pending.length} 个)`}),x.pending.length===0?(0,t.jsx)(`p`,{className:i.help,children:`全部工具都已默认激活。`}):C(x.pending)]})]})]})}const v=`
3
+ .${i.root}{display:grid;gap:12px;color:var(--dsw-alias-label-primary,inherit);font-size:13px;line-height:20px}
4
+ .${i.header}{display:grid;gap:2px}
5
+ .${i.title}{margin:0;font-size:14px;font-weight:600;line-height:22px}
6
+ .${i.description}{margin:0;color:var(--dsw-alias-label-secondary,inherit)}
7
+ .${i.help}{margin:0;color:var(--dsw-alias-label-caption,inherit);font-size:12px;line-height:18px}
8
+ .${i.error}{margin:0;color:var(--dsw-alias-state-error-primary,#d63e3e)}
9
+ .${i.success}{margin:0;color:var(--dsw-alias-state-success-primary,inherit)}
10
+ .${i.section}{display:grid;gap:8px}
11
+ .${i.sectionTitle}{margin:0;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary,inherit)}
12
+ .${i.list}{display:grid;gap:0;margin:0;padding:0;list-style:none;border:.5px solid var(--dsw-alias-border-l4,rgba(127,127,127,.25));border-radius:16px;overflow:hidden}
13
+ .${i.row}{display:flex;align-items:center;gap:12px;padding:10px 12px;border-top:.5px solid var(--dsw-alias-border-l4,rgba(127,127,127,.25))}
14
+ .${i.row}:first-child{border-top:0}
15
+ .${i.rowText}{display:grid;gap:2px;min-width:0;flex:1 1 auto}
16
+ .${i.rowName}{display:flex;align-items:center;gap:6px;font-weight:500;overflow-wrap:anywhere}
17
+ .${i.rowMeta}{color:var(--dsw-alias-label-caption,inherit);font-size:12px;line-height:18px;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}
18
+ .dsh-tool-activator-chip{display:inline-flex;align-items:center;flex:0 0 auto;height:18px;padding:0 6px;border-radius:9px;font-size:11px;font-weight:400;line-height:16px;color:var(--dsw-alias-label-secondary,inherit);background:var(--dsw-alias-bg-layer-2,rgba(127,127,127,.12))}
19
+ .dsh-tool-activator-switch{box-sizing:border-box;position:relative;flex:0 0 auto;width:36px;height:20px;padding:2px;border:0;border-radius:10px;background:var(--dsw-alias-border-l3,rgba(127,127,127,.4));cursor:pointer}
20
+ .dsh-tool-activator-switch[aria-checked=true]{background:var(--dsw-alias-brand-primary,#4d6bfe)}
21
+ .dsh-tool-activator-switch:disabled{cursor:default;opacity:.5}
22
+ .dsh-tool-activator-switch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4d6bfe);outline-offset:2px}
23
+ .dsh-tool-activator-switch-thumb{display:block;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-primary-foreground,#fff);transition:transform .12s ease}
24
+ .dsh-tool-activator-switch[aria-checked=true] .dsh-tool-activator-switch-thumb{transform:translate(16px)}
25
+ `;function y(){return document.querySelector(`style[data-plugin-css="${r}"]`)}function b(){if(typeof document>`u`||y()!==null)return()=>{};let e=document.createElement(`style`);return e.dataset.plugin=`dsh-tool-activator`,e.dataset.pluginCss=r,e.textContent=v,document.head.append(e),()=>e.remove()}const x=[`slots`,`connection`];function S(e){e.effect(b);let t=()=>o(e);e.inject([`configForms`],e=>{let r=e.configForms.get(`tool-activator`);e.slots.inject(n,()=>e.slots.register({name:n,key:`dsh-tool-activator`,registrant:`dsh-tool-activator`,inject:()=>({configScope:r,loadToolCatalog:t})},_))})}exports.apply=S,exports.inject=x;
16
26
  return module.exports;}});
17
27
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["React","ToolActivatorIcon","exports"],"sources":["../src/shared.ts","../src/client/constants.ts","../src/client/configuration.ts","../node_modules/.pnpm/@gravity-ui+icons@2.22.0_react@19.3.0/node_modules/@gravity-ui/icons/esm/Wrench.js","../src/client/configuration-page.tsx","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/parse.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/utils.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/render.js","../node_modules/.pnpm/@emotion+hash@0.8.0/node_modules/@emotion/hash/dist/hash.cjs.prod.js","../node_modules/.pnpm/@emotion+hash@0.8.0/node_modules/@emotion/hash/dist/hash.cjs.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/hash.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/mount.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/c.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/CssRender.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/types.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/exists.js","../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/index.js","../src/client/styles.ts","../src/client/index.ts"],"sourcesContent":["export interface ToolGroup {\n identifier: string\n name: string\n description: string\n tools: readonly string[]\n sections: readonly string[]\n}\n\nexport interface ToolPolicy {\n enabled: boolean\n mode: 'automatic' | 'manual'\n basicTools: readonly string[]\n excludedTools: readonly string[]\n requireApproval: boolean\n autoGroupMcp: boolean\n groups: readonly ToolGroup[]\n sectionTools: Readonly<Record<string, readonly string[]>>\n}\n\nexport const DEFAULT_POLICY: ToolPolicy = {\n enabled: true,\n mode: 'automatic',\n basicTools: ['read', 'glob', 'grep', 'skill', 'ask_user_question', 'todo_write'],\n excludedTools: [],\n requireApproval: true,\n autoGroupMcp: true,\n groups: [],\n sectionTools: {},\n}\n\nexport const PACKAGE_NAME = 'dsh-tool-activator'\nexport const CONFIG_ROW_ID = 'tool-activator'\nexport const MINIMUM_CORE_VERSION = '0.2.0-rc.2'\n","import { CONFIG_ROW_ID, PACKAGE_NAME } from '../shared'\n\nexport const CONFIGURATION_SLOT = 'plugins.row.config'\nexport const CONFIGURATION_ID = `${PACKAGE_NAME}#${CONFIG_ROW_ID}`\nexport const CONFIGURATION_REGISTRANT = PACKAGE_NAME\nexport const CONFIGURATION_PRIORITY = 0\nexport const STYLE_ID = 'dsh-tool-activator-configuration'\nexport const TOOL_NAME_PATTERN = /^[\\w.-]+$/u\nexport const GROUP_FIELDS = new Set(['identifier', 'name', 'description', 'tools', 'sections'])\n\nexport const CLASSES = {\n root: 'dsh-tool-activator-config',\n header: 'dsh-tool-activator-header',\n title: 'dsh-tool-activator-title',\n description: 'dsh-tool-activator-description',\n notice: 'dsh-tool-activator-notice',\n error: 'dsh-tool-activator-error',\n success: 'dsh-tool-activator-success',\n fields: 'dsh-tool-activator-fields',\n field: 'dsh-tool-activator-field',\n checkbox: 'dsh-tool-activator-checkbox',\n help: 'dsh-tool-activator-help',\n actions: 'dsh-tool-activator-actions',\n advanced: 'dsh-tool-activator-advanced',\n version: 'dsh-tool-activator-version',\n icon: 'dsh-tool-activator-icon',\n} as const\n","import type { ConfigPageForm } from '@deepseek-ai/dsh-client-ui-plugin-manager/client'\nimport type { ToolGroup, ToolPolicy } from '../shared'\nimport type { ConfigMutationOps, PolicyDraftValidation, ToolPolicyDraft } from './types'\nimport { DEFAULT_POLICY } from '../shared'\nimport { GROUP_FIELDS, TOOL_NAME_PATTERN } from './constants'\n\nexport function canWriteConfiguration(form: ConfigPageForm | undefined): boolean {\n const state = form?.state\n return state?.status === 'ready'\n && state.value !== undefined\n && state.mode === 'host'\n && state.writable\n && Number.isSafeInteger(state.revision)\n && state.revision !== undefined\n && state.revision >= 0\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string')\n}\n\nexport function createPolicyDraft(value: Record<string, unknown> | undefined): ToolPolicyDraft {\n return {\n enabled: typeof value?.enabled === 'boolean' ? value.enabled : DEFAULT_POLICY.enabled,\n mode: value?.mode === 'manual' ? 'manual' : DEFAULT_POLICY.mode,\n basicToolsText: isStringArray(value?.basicTools) ? value.basicTools.join('\\n') : DEFAULT_POLICY.basicTools.join('\\n'),\n excludedToolsText: isStringArray(value?.excludedTools) ? value.excludedTools.join('\\n') : DEFAULT_POLICY.excludedTools.join('\\n'),\n requireApproval: typeof value?.requireApproval === 'boolean' ? value.requireApproval : DEFAULT_POLICY.requireApproval,\n autoGroupMcp: typeof value?.autoGroupMcp === 'boolean' ? value.autoGroupMcp : DEFAULT_POLICY.autoGroupMcp,\n groupsText: JSON.stringify(Array.isArray(value?.groups) ? value.groups : DEFAULT_POLICY.groups, null, 2),\n sectionToolsText: JSON.stringify(isRecord(value?.sectionTools) ? value.sectionTools : DEFAULT_POLICY.sectionTools, null, 2),\n }\n}\n\nfunction toolNames(text: string, label: string): string[] {\n const names = [...new Set(text.split(/\\r?\\n/u).map(name => name.trim()).filter(Boolean))]\n if (names.some(name => !TOOL_NAME_PATTERN.test(name)))\n throw new Error(`${label}每行填写一个真实工具名,只能包含字母、数字、下划线、点和连字符。`)\n return names\n}\n\nfunction jsonValue(text: string, label: string): unknown {\n try {\n return JSON.parse(text)\n }\n catch {\n throw new Error(`${label}不是有效 JSON。`)\n }\n}\n\nfunction readGroups(text: string): ToolGroup[] {\n const value = jsonValue(text, '工具分组')\n if (!Array.isArray(value))\n throw new Error('工具分组必须是 JSON 数组。')\n const identifiers = new Set<string>()\n const claimedTools = new Set<string>()\n return value.map((item: unknown, index: number): ToolGroup => {\n const label = `第 ${index + 1} 个工具分组`\n if (!isRecord(item) || Object.keys(item).some(key => !GROUP_FIELDS.has(key)))\n throw new Error(`${label}只接受 identifier、name、description、tools 和 sections。`)\n if (typeof item.identifier !== 'string' || !TOOL_NAME_PATTERN.test(item.identifier))\n throw new Error(`${label}需要有效的 identifier(字母、数字、下划线、点或连字符)。`)\n if (identifiers.has(item.identifier))\n throw new Error(`工具分组 identifier 重复:${item.identifier}。`)\n identifiers.add(item.identifier)\n if (item.name !== undefined && typeof item.name !== 'string')\n throw new Error(`${label}的 name 必须是字符串。`)\n if (item.description !== undefined && typeof item.description !== 'string')\n throw new Error(`${label}的 description 必须是字符串。`)\n if (!isStringArray(item.tools) || item.tools.length === 0 || item.tools.some(name => !TOOL_NAME_PATTERN.test(name)))\n throw new Error(`${label}的 tools 至少包含一个有效工具名。`)\n for (const name of item.tools) {\n if (claimedTools.has(name))\n throw new Error(`工具 ${name} 不能同时属于多个分组或在分组内重复。`)\n claimedTools.add(name)\n }\n if (item.sections !== undefined && !isStringArray(item.sections))\n throw new Error(`${label}的 sections 必须是字符串数组。`)\n return {\n identifier: item.identifier,\n name: typeof item.name === 'string' ? item.name : '',\n description: typeof item.description === 'string' ? item.description : '',\n tools: [...item.tools],\n sections: isStringArray(item.sections) ? [...item.sections] : [],\n }\n })\n}\n\nfunction readSectionTools(text: string): Readonly<Record<string, readonly string[]>> {\n const value = jsonValue(text, '说明节依赖')\n if (!isRecord(value))\n throw new Error('说明节依赖必须是 JSON 对象。')\n const entries = Object.entries(value).map(([section, names]): [string, string[]] => {\n if (!isStringArray(names) || names.some(name => !TOOL_NAME_PATTERN.test(name)))\n throw new Error('说明节依赖需要说明节名称和有效工具名数组。')\n return [section, [...new Set(names)]]\n })\n return Object.fromEntries(entries)\n}\n\nexport function validatePolicyDraft(draft: ToolPolicyDraft): PolicyDraftValidation {\n try {\n const policy: ToolPolicy = {\n enabled: draft.enabled,\n mode: draft.mode,\n basicTools: toolNames(draft.basicToolsText, '基础工具'),\n excludedTools: toolNames(draft.excludedToolsText, '排除工具'),\n requireApproval: draft.requireApproval,\n autoGroupMcp: draft.autoGroupMcp,\n groups: readGroups(draft.groupsText),\n sectionTools: readSectionTools(draft.sectionToolsText),\n }\n return { ok: true, policy }\n }\n catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : '配置格式无效。' }\n }\n}\n\nexport function policyMutationOps(policy: ToolPolicy): ConfigMutationOps {\n return Object.entries(policy).map(([field, value]) => ({ op: 'set', path: [field], value }))\n}\n","import * as React from 'react';\nconst Wrench = (props) => (React.createElement(\"svg\", Object.assign({ xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", viewBox: \"0 0 16 16\" }, props),\n React.createElement(\"path\", { fill: \"currentColor\", fillRule: \"evenodd\", d: \"m8.581 9.298.776.143q.311.059.643.059A3.5 3.5 0 0 0 13.5 6q0-.177-.027-.352l-1.39 1.39a1.58 1.58 0 0 1-1.114.462A2.47 2.47 0 0 1 8.5 5.03c0-.417.166-.817.461-1.112l1.39-1.39A2.4 2.4 0 0 0 10 2.5a3.5 3.5 0 0 0-3.441 4.143l.143.776-3.813 3.813a1.329 1.329 0 0 0 1.879 1.879zm3.817-6.787a.795.795 0 0 0-.411-1.018C11.87 1.432 11.014 1 10 1a5 5 0 0 0-4.916 5.916l-3.256 3.256a2.828 2.828 0 1 0 4 4l3.256-3.256Q9.53 11 10 11a5 5 0 0 0 5-5c0-1.014-.432-1.87-.493-1.987l-.014-.027a.795.795 0 0 0-1.273-.207l-2.198 2.2a.07.07 0 0 1-.053.021.97.97 0 0 1-.969-.97q0-.03.022-.052L12.22 2.78a.8.8 0 0 0 .178-.27\", clipRule: \"evenodd\" })));\nexport default Wrench;\n","import type { FormEvent, ReactElement } from 'react'\nimport type { ConfigurationEditorState, ToolActivatorConfigurationProps, ToolPolicyDraft } from './types'\nimport { useEffect, useId, useRef, useState } from 'react'\nimport { MINIMUM_CORE_VERSION } from '../shared'\nimport { canWriteConfiguration, createPolicyDraft, policyMutationOps, validatePolicyDraft } from './configuration'\nimport { CLASSES } from './constants'\nimport { ToolActivatorIcon } from './icons'\n\nexport function ToolActivatorConfiguration({ view, form }: ToolActivatorConfigurationProps): ReactElement {\n const fieldId = useId()\n const aliveRef = useRef(false)\n const requestSerialRef = useRef(0)\n const currentFormRef = useRef(form)\n currentFormRef.current = form\n const writable = canWriteConfiguration(form)\n const mutate = form?.mutate\n const snapshotValue = form?.state.value\n const snapshotRevision = form?.state.revision\n const [editor, setEditor] = useState<ConfigurationEditorState>(() => ({\n mutate,\n writable,\n value: snapshotValue,\n revision: snapshotRevision,\n draft: createPolicyDraft(snapshotValue),\n pending: false,\n feedback: undefined,\n }))\n const ownerChanged = editor.mutate !== mutate || editor.writable !== writable\n const snapshotChanged = editor.value !== snapshotValue || editor.revision !== snapshotRevision\n if (ownerChanged || snapshotChanged) {\n if (ownerChanged)\n requestSerialRef.current += 1\n setEditor({\n mutate,\n writable,\n value: snapshotValue,\n revision: snapshotRevision,\n draft: createPolicyDraft(snapshotValue),\n pending: ownerChanged ? false : editor.pending,\n feedback: ownerChanged || !editor.pending ? undefined : editor.feedback,\n })\n }\n const { draft, pending, feedback } = editor\n const fieldsDisabled = !writable || pending\n\n useEffect(() => {\n aliveRef.current = true\n return () => {\n aliveRef.current = false\n requestSerialRef.current += 1\n }\n }, [])\n\n function update<K extends keyof ToolPolicyDraft>(key: K, value: ToolPolicyDraft[K]): void {\n setEditor(previous => ({ ...previous, draft: { ...previous.draft, [key]: value }, feedback: undefined }))\n }\n\n function discard(): void {\n setEditor(previous => ({ ...previous, draft: createPolicyDraft(currentFormRef.current?.state.value), feedback: undefined }))\n }\n\n async function save(): Promise<void> {\n const acceptedForm = currentFormRef.current\n if (!acceptedForm || !canWriteConfiguration(acceptedForm) || pending)\n return\n const result = validatePolicyDraft(draft)\n if (!result.ok) {\n setEditor(previous => ({ ...previous, feedback: { kind: 'error', message: result.message } }))\n return\n }\n const serial = ++requestSerialRef.current\n const acceptedMutate = acceptedForm.mutate\n const revision = acceptedForm.state.revision\n setEditor(previous => ({ ...previous, pending: true, feedback: undefined }))\n function isCurrent(): boolean {\n return aliveRef.current\n && requestSerialRef.current === serial\n && currentFormRef.current?.mutate === acceptedMutate\n && canWriteConfiguration(currentFormRef.current)\n }\n try {\n const applied = await acceptedForm.mutate(policyMutationOps(result.policy), revision)\n if (!isCurrent())\n return\n setEditor(previous => ({\n ...previous,\n feedback: applied\n ? { kind: 'success', message: '配置已保存。新的模型请求会使用最新工具策略。' }\n : { kind: 'error', message: '宿主未接受保存(配置冲突、校验失败或不可写)。请核对最新配置后重试。' },\n }))\n }\n catch (error) {\n if (!isCurrent())\n return\n setEditor(previous => ({\n ...previous,\n feedback: { kind: 'error', message: `保存失败:${error instanceof Error ? error.message : '无法连接宿主。'}` },\n }))\n }\n finally {\n if (isCurrent())\n setEditor(previous => ({ ...previous, pending: false }))\n }\n }\n\n function submit(event: FormEvent<HTMLFormElement>): void {\n event.preventDefault()\n void save()\n }\n\n if (view === 'summary') {\n return (\n <p className={CLASSES.description}>\n 默认仅提供基础工具;按需发现和激活其他工具。这不是执行权限授权。\n </p>\n )\n }\n\n return (\n <section className={CLASSES.root} aria-labelledby={`${fieldId}-title`}>\n <header className={CLASSES.header}>\n <ToolActivatorIcon className={CLASSES.icon} aria-hidden=\"true\" />\n <div>\n <h2 id={`${fieldId}-title`} className={CLASSES.title}>按需工具加载</h2>\n <p className={CLASSES.description}>默认仅向模型展示基础工具,按当前会话和工具作用域发现、激活其他工具。</p>\n </div>\n </header>\n <p className={CLASSES.notice}>\n 工具展示不等于执行授权。隐藏、排除或激活工具不会绕过 DSH 的审批、沙箱和工具安全检查。\n </p>\n <p className={CLASSES.version}>\n 需要 DSH\n {' '}\n {MINIMUM_CORE_VERSION}\n {' '}\n 或以上,且须提供官方插件配置表单。不支持的版本应禁用本功能,不会使用私有 API。\n </p>\n {!form || form.state.status === 'unavailable'\n ? <p role=\"status\" className={CLASSES.notice}>此配置表单不可用。请检查宿主版本、插件加载状态及官方配置服务。</p>\n : form.state.status === 'loading'\n ? <p role=\"status\" className={CLASSES.notice}>正在加载宿主配置…</p>\n : !writable\n ? <p role=\"status\" className={CLASSES.notice}>宿主配置只读或尚未同步。仅在 host 模式、配置可写且版本已同步时允许保存。</p>\n : null}\n <form onSubmit={submit} aria-label=\"工具激活策略\" aria-busy={pending}>\n <fieldset className={CLASSES.fields} disabled={fieldsDisabled}>\n <legend>工具策略</legend>\n <label className={CLASSES.checkbox}>\n <input type=\"checkbox\" checked={draft.enabled} onChange={event => update('enabled', event.target.checked)} />\n 启用按需工具加载\n </label>\n {!draft.enabled && <p className={CLASSES.help}>关闭时不进行工具展示过滤;仍遵守原有执行权限检查。</p>}\n <div className={CLASSES.field}>\n <label htmlFor={`${fieldId}-mode`}>加载模式</label>\n <select id={`${fieldId}-mode`} value={draft.mode} onChange={event => update('mode', event.target.value === 'manual' ? 'manual' : 'automatic')} aria-describedby={`${fieldId}-mode-help`}>\n <option value=\"automatic\">自动:基础工具 + 按需激活</option>\n <option value=\"manual\">手动:仅基础工具</option>\n </select>\n <p id={`${fieldId}-mode-help`} className={CLASSES.help}>\n {draft.mode === 'manual'\n ? '手动模式仅向模型提供基础工具,不允许通过本插件激活其他工具。'\n : '自动模式保留基础工具与发现、激活入口;激活只改变后续工具展示,不授予执行权限。'}\n </p>\n </div>\n <label className={CLASSES.checkbox}>\n <input type=\"checkbox\" checked={draft.requireApproval} onChange={event => update('requireApproval', event.target.checked)} />\n 激活前请求用户确认\n </label>\n <p className={CLASSES.help}>默认开启;没有可用审批服务时拒绝激活。关闭此项也不会关闭核心安全审批。</p>\n <label className={CLASSES.checkbox}>\n <input type=\"checkbox\" checked={draft.autoGroupMcp} onChange={event => update('autoGroupMcp', event.target.checked)} />\n 自动按 MCP 服务分组\n </label>\n <p className={CLASSES.help}>只根据公开的 mcp__server__tool 工具名聚合,不推测服务器私有元数据。</p>\n <div className={CLASSES.field}>\n <label htmlFor={`${fieldId}-basic`}>基础工具(每行一个名称)</label>\n <textarea id={`${fieldId}-basic`} rows={6} value={draft.basicToolsText} onChange={event => update('basicToolsText', event.target.value)} aria-describedby={`${fieldId}-basic-help`} spellCheck={false} />\n <p id={`${fieldId}-basic-help`} className={CLASSES.help}>填写真实工具名;默认包含 read、glob、grep、skill、ask_user_question、todo_write。</p>\n </div>\n <div className={CLASSES.field}>\n <label htmlFor={`${fieldId}-excluded`}>排除工具(每行一个名称)</label>\n <textarea id={`${fieldId}-excluded`} rows={3} value={draft.excludedToolsText} onChange={event => update('excludedToolsText', event.target.value)} aria-describedby={`${fieldId}-excluded-help`} spellCheck={false} />\n <p id={`${fieldId}-excluded-help`} className={CLASSES.help}>不纳入本插件的发现与激活目录;不是禁止执行名单,也不是安全权限边界。</p>\n </div>\n <details className={CLASSES.advanced}>\n <summary>高级:显式分组与说明节依赖</summary>\n <div className={CLASSES.field}>\n <label htmlFor={`${fieldId}-groups`}>工具分组(JSON 数组)</label>\n <textarea id={`${fieldId}-groups`} rows={8} value={draft.groupsText} onChange={event => update('groupsText', event.target.value)} aria-describedby={`${fieldId}-groups-help`} spellCheck={false} />\n <p id={`${fieldId}-groups-help`} className={CLASSES.help}>每项包含唯一 identifier、至少一个 tools 工具名;可选 name、description、sections。每个工具只能属于一个分组。空名称和描述采用默认说明。</p>\n </div>\n <div className={CLASSES.field}>\n <label htmlFor={`${fieldId}-sections`}>说明节依赖(JSON 对象)</label>\n <textarea id={`${fieldId}-sections`} rows={6} value={draft.sectionToolsText} onChange={event => update('sectionToolsText', event.target.value)} aria-describedby={`${fieldId}-sections-help`} spellCheck={false} />\n <p id={`${fieldId}-sections-help`} className={CLASSES.help}>将公开系统说明节名称映射到真实工具名数组;仅用于与工具一起显示相关说明,不改写核心安全说明。</p>\n </div>\n </details>\n </fieldset>\n {feedback && (\n <p role={feedback.kind === 'error' ? 'alert' : 'status'} className={feedback.kind === 'error' ? CLASSES.error : CLASSES.success}>\n {feedback.message}\n </p>\n )}\n {pending && <p role=\"status\" className={CLASSES.help}>正在保存宿主配置…</p>}\n <div className={CLASSES.actions}>\n <button type=\"submit\" disabled={fieldsDisabled}>{pending ? '保存中…' : '保存配置'}</button>\n <button type=\"button\" disabled={fieldsDisabled} onClick={discard}>放弃未保存更改</button>\n </div>\n </form>\n </section>\n )\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseSelectorPath = void 0;\nfunction ampCount(selector) {\n let cnt = 0;\n for (let i = 0; i < selector.length; ++i) {\n if (selector[i] === '&')\n ++cnt;\n }\n return cnt;\n}\n/**\n * Don't just use ',' to separate css selector. For example:\n * x:(a, b) {} will be split into 'x:(a' and 'b)', which is not expected.\n * Make sure comma doesn't exist inside parentheses.\n */\nconst separatorRegex = /\\s*,(?![^(]*\\))\\s*/g;\nconst extraSpaceRegex = /\\s+/g;\n/**\n * selector must includes '&'\n * selector is trimmed\n * every part of amp is trimmed\n */\nfunction resolveSelectorWithAmp(amp, selector) {\n const nextAmp = [];\n selector.split(separatorRegex).forEach(partialSelector => {\n let round = ampCount(partialSelector);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!round) {\n amp.forEach(partialAmp => {\n nextAmp.push(\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n (partialAmp && partialAmp + ' ') + partialSelector);\n });\n return;\n }\n else if (round === 1) {\n amp.forEach(partialAmp => {\n nextAmp.push(partialSelector.replace('&', partialAmp));\n });\n return;\n }\n let partialNextAmp = [\n partialSelector\n ];\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n while (round--) {\n const nextPartialNextAmp = [];\n partialNextAmp.forEach(selectorItr => {\n amp.forEach(partialAmp => {\n nextPartialNextAmp.push(selectorItr.replace('&', partialAmp));\n });\n });\n partialNextAmp = nextPartialNextAmp;\n }\n partialNextAmp.forEach(part => nextAmp.push(part));\n });\n return nextAmp;\n}\n/**\n * selector mustn't includes '&'\n * selector is trimmed\n */\nfunction resolveSelector(amp, selector) {\n const nextAmp = [];\n selector.split(separatorRegex).forEach(partialSelector => {\n amp.forEach(partialAmp => {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n nextAmp.push(((partialAmp && partialAmp + ' ') + partialSelector));\n });\n });\n return nextAmp;\n}\nfunction parseSelectorPath(selectorPaths) {\n let amp = [''];\n selectorPaths.forEach(selector => {\n // eslint-disable-next-line\n selector = selector && selector.trim();\n if (\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n !selector) {\n /**\n * if it's a empty selector, do nothing\n */\n return;\n }\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (selector.includes('&')) {\n amp = resolveSelectorWithAmp(amp, selector);\n }\n else {\n amp = resolveSelector(amp, selector);\n }\n });\n return amp.join(', ').replace(extraSpaceRegex, ' ');\n}\nexports.parseSelectorPath = parseSelectorPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isMediaOrSupports = exports.createElement = exports.queryElement = exports.removeElement = void 0;\nfunction removeElement(el) {\n /* istanbul ignore if */\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!el)\n return;\n const parentElement = el.parentElement;\n /* istanbul ignore else */\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (parentElement)\n parentElement.removeChild(el);\n}\nexports.removeElement = removeElement;\nfunction queryElement(id, parent) {\n return (parent !== null && parent !== void 0 ? parent : document.head).querySelector(`style[cssr-id=\"${id}\"]`);\n}\nexports.queryElement = queryElement;\nfunction createElement(id) {\n const el = document.createElement('style');\n el.setAttribute('cssr-id', id);\n return el;\n}\nexports.createElement = createElement;\nfunction isMediaOrSupports(selector) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!selector)\n return false;\n return /^\\s*@(s|m)/.test(selector);\n}\nexports.isMediaOrSupports = isMediaOrSupports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.render = void 0;\nconst parse_1 = require(\"./parse\");\nconst utils_1 = require(\"./utils\");\nconst kebabRegex = /[A-Z]/g;\nfunction kebabCase(pattern) {\n return pattern.replace(kebabRegex, match => '-' + match.toLowerCase());\n}\n/** TODO: refine it to solve nested object */\nfunction unwrapProperty(prop, indent = ' ') {\n if (typeof prop === 'object' && prop !== null) {\n return (' {\\n' +\n Object.entries(prop).map(v => {\n return indent + ` ${kebabCase(v[0])}: ${v[1]};`;\n }).join('\\n') +\n '\\n' + indent + '}');\n }\n return `: ${prop};`;\n}\n/** unwrap properties */\nfunction unwrapProperties(props, instance, params) {\n if (typeof props === 'function') {\n return props({\n context: instance.context,\n props: params\n });\n }\n return props;\n}\nfunction createStyle(selector, props, instance, params) {\n if (!props)\n return '';\n // eslint-disable-next-line\n const unwrappedProps = unwrapProperties(props, instance, params);\n if (!unwrappedProps)\n return '';\n if (typeof unwrappedProps === 'string') {\n return `${selector} {\\n${unwrappedProps}\\n}`;\n }\n const propertyNames = Object.keys(unwrappedProps);\n if (propertyNames.length === 0) {\n if (instance.config.keepEmptyBlock)\n return selector + ' {\\n}';\n return '';\n }\n const statements = selector\n ? [\n selector + ' {'\n ]\n : [];\n propertyNames.forEach(propertyName => {\n const property = unwrappedProps[propertyName];\n if (propertyName === 'raw') {\n statements.push('\\n' + property + '\\n');\n return;\n }\n propertyName = kebabCase(propertyName);\n if (property !== null && property !== undefined) {\n statements.push(` ${propertyName}${unwrapProperty(property)}`);\n }\n });\n if (selector) {\n statements.push('}');\n }\n return statements.join('\\n');\n}\nfunction loopCNodeListWithCallback(children, options, callback) {\n /* istanbul ignore if */\n if (!children)\n return;\n children.forEach(child => {\n if (Array.isArray(child)) {\n loopCNodeListWithCallback(child, options, callback);\n }\n else if (typeof child === 'function') {\n const grandChildren = child(options);\n if (Array.isArray(grandChildren)) {\n loopCNodeListWithCallback(grandChildren, options, callback);\n }\n else if (grandChildren) {\n callback(grandChildren);\n }\n }\n else if (child) {\n callback(child);\n }\n });\n}\nfunction traverseCNode(node, selectorPaths, styles, instance, params) {\n const $ = node.$;\n let blockSelector = '';\n if (!$ || typeof $ === 'string') {\n if ((0, utils_1.isMediaOrSupports)($)) {\n blockSelector = $;\n }\n else {\n // as a string selector\n selectorPaths.push($);\n }\n }\n else if (typeof $ === 'function') {\n const selector = $({\n context: instance.context,\n props: params\n });\n if ((0, utils_1.isMediaOrSupports)(selector)) {\n blockSelector = selector;\n }\n else {\n // as a lazy selector\n selectorPaths.push(selector);\n }\n }\n else { // as a option selector\n if ($.before)\n $.before(instance.context);\n if (!$.$ || typeof $.$ === 'string') {\n if ((0, utils_1.isMediaOrSupports)($.$)) {\n blockSelector = $.$;\n }\n else {\n // as a string selector\n selectorPaths.push($.$);\n }\n }\n else /* istanbul ignore else */ if ($.$) {\n const selector = $.$({\n context: instance.context,\n props: params\n });\n if ((0, utils_1.isMediaOrSupports)(selector)) {\n blockSelector = selector;\n }\n else {\n // as a lazy selector\n selectorPaths.push(selector);\n }\n }\n }\n const selector = (0, parse_1.parseSelectorPath)(selectorPaths);\n const style = createStyle(selector, node.props, instance, params);\n if (blockSelector) {\n styles.push(`${blockSelector} {`);\n }\n else if (style.length) {\n styles.push(style);\n }\n if (node.children) {\n loopCNodeListWithCallback(node.children, {\n context: instance.context,\n props: params\n }, childNode => {\n if (typeof childNode === 'string') {\n const style = createStyle(selector, { raw: childNode }, instance, params);\n styles.push(style);\n }\n else {\n traverseCNode(childNode, selectorPaths, styles, instance, params);\n }\n });\n }\n selectorPaths.pop();\n if (blockSelector) {\n styles.push('}');\n }\n if ($ && $.after)\n $.after(instance.context);\n}\nfunction render(node, instance, props) {\n const styles = [];\n traverseCNode(node, [], styles, instance, props);\n return styles.join('\\n\\n');\n}\nexports.render = render;\n","\"use strict\";\n\nfunction murmur2(str) {\n for (var k, h = 0, i = 0, len = str.length; len >= 4; ++i, len -= 4) k = 1540483477 * (65535 & (k = 255 & str.charCodeAt(i) | (255 & str.charCodeAt(++i)) << 8 | (255 & str.charCodeAt(++i)) << 16 | (255 & str.charCodeAt(++i)) << 24)) + (59797 * (k >>> 16) << 16), \n h = 1540483477 * (65535 & (k ^= k >>> 24)) + (59797 * (k >>> 16) << 16) ^ 1540483477 * (65535 & h) + (59797 * (h >>> 16) << 16);\n switch (len) {\n case 3:\n h ^= (255 & str.charCodeAt(i + 2)) << 16;\n\n case 2:\n h ^= (255 & str.charCodeAt(i + 1)) << 8;\n\n case 1:\n h = 1540483477 * (65535 & (h ^= 255 & str.charCodeAt(i))) + (59797 * (h >>> 16) << 16);\n }\n return (((h = 1540483477 * (65535 & (h ^= h >>> 13)) + (59797 * (h >>> 16) << 16)) ^ h >>> 15) >>> 0).toString(36);\n}\n\nObject.defineProperty(exports, \"__esModule\", {\n value: !0\n}), exports.default = murmur2;\n","'use strict';\n\nif (process.env.NODE_ENV === \"production\") {\n module.exports = require(\"./hash.cjs.prod.js\");\n} else {\n module.exports = require(\"./hash.cjs.dev.js\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = void 0;\nvar hash_1 = require(\"@emotion/hash\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return hash_1.default; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mount = exports.unmount = void 0;\n/* eslint-disable @typescript-eslint/prefer-ts-expect-error */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\nconst hash_1 = require(\"./hash\");\nconst utils_1 = require(\"./utils\");\nif (typeof window !== 'undefined') {\n window.__cssrContext = {};\n}\nfunction unmount(instance, node, id, parent) {\n const { els } = node;\n // If id is undefined, unmount all styles\n if (id === undefined) {\n els.forEach(utils_1.removeElement);\n node.els = [];\n }\n else {\n const target = (0, utils_1.queryElement)(id, parent);\n // eslint-disable-next-line\n if (target && els.includes(target)) {\n (0, utils_1.removeElement)(target);\n node.els = els.filter((el) => el !== target);\n }\n }\n}\nexports.unmount = unmount;\nfunction addElementToList(els, target) {\n els.push(target);\n}\nfunction mount(instance, node, id, props, head, force, anchorMetaName, parent, ssrAdapter\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n) {\n let style;\n if (id === undefined) {\n style = node.render(props);\n id = (0, hash_1.default)(style);\n }\n if (ssrAdapter) {\n ssrAdapter.adapter(id, style !== null && style !== void 0 ? style : node.render(props));\n return;\n }\n if (parent === undefined) {\n parent = document.head;\n }\n const queriedTarget = (0, utils_1.queryElement)(id, parent);\n if (queriedTarget !== null && !force) {\n return queriedTarget;\n }\n const target = queriedTarget !== null && queriedTarget !== void 0 ? queriedTarget : (0, utils_1.createElement)(id);\n if (style === undefined)\n style = node.render(props);\n target.textContent = style;\n if (queriedTarget !== null)\n return queriedTarget;\n if (anchorMetaName) {\n const anchorMetaEl = parent.querySelector(`meta[name=\"${anchorMetaName}\"]`);\n if (anchorMetaEl) {\n parent.insertBefore(target, anchorMetaEl);\n addElementToList(node.els, target);\n return target;\n }\n }\n if (head) {\n parent.insertBefore(target, parent.querySelector('style, link'));\n }\n else {\n parent.appendChild(target);\n }\n addElementToList(node.els, target);\n return target;\n}\nexports.mount = mount;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.c = void 0;\nconst render_1 = require(\"./render\");\nconst mount_1 = require(\"./mount\");\nfunction wrappedRender(props) {\n return (0, render_1.render)(this, this.instance, props);\n}\n// do not guard node calling, it should throw an error.\nfunction wrappedMount(options = {}\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n) {\n const { id, ssr, props, head = false, force = false, anchorMetaName, parent } = options;\n const targetElement = (0, mount_1.mount)(this.instance, this, id, props, head, force, anchorMetaName, parent, ssr);\n return targetElement;\n}\nfunction wrappedUnmount(options = {}) {\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const { id, parent } = options;\n (0, mount_1.unmount)(this.instance, this, id, parent);\n}\nconst createCNode = function (instance, $, props, children) {\n return {\n instance,\n $,\n props,\n children,\n els: [],\n render: wrappedRender,\n mount: wrappedMount,\n unmount: wrappedUnmount\n };\n};\nexports.c = function (instance, $, props, children) {\n if (Array.isArray($)) {\n return createCNode(instance, { $: null }, null, $);\n }\n else if (Array.isArray(props)) {\n return createCNode(instance, $, null, props);\n }\n else if (Array.isArray(children)) {\n return createCNode(instance, $, props, children);\n }\n else {\n return createCNode(instance, $, props, null);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CssRender = void 0;\nconst c_1 = require(\"./c\");\nconst utils_1 = require(\"./utils\");\nfunction CssRender(config = {}) {\n const cssr = {\n c: ((...args) => (0, c_1.c)(cssr, ...args)),\n use: (plugin, ...args) => plugin.install(cssr, ...args),\n find: utils_1.queryElement,\n context: {},\n config\n };\n return cssr;\n}\nexports.CssRender = CssRender;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.exists = void 0;\nconst utils_1 = require(\"./utils\");\nfunction exists(id, ssr) {\n if (id === undefined)\n return false;\n if (ssr) {\n const { context: { ids } } = ssr;\n return ids.has(id);\n }\n return (0, utils_1.queryElement)(id) !== null;\n}\nexports.exists = exists;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CssRender = exports.exists = exports.hash = void 0;\n/* istanbul ignore file */\nconst CssRender_1 = require(\"./CssRender\");\nObject.defineProperty(exports, \"CssRender\", { enumerable: true, get: function () { return CssRender_1.CssRender; } });\n__exportStar(require(\"./types\"), exports);\nvar hash_1 = require(\"./hash\");\nObject.defineProperty(exports, \"hash\", { enumerable: true, get: function () { return hash_1.default; } });\nvar exists_1 = require(\"./exists\");\nObject.defineProperty(exports, \"exists\", { enumerable: true, get: function () { return exists_1.exists; } });\nexports.default = CssRender_1.CssRender;\n","// The client bundle is emitted as CJS, and node-mode interop replaces a CJS\n// dependency's `default` with the module object, so the default import would\n// resolve to a non-callable value at runtime. The named export survives.\nimport { CssRender } from 'css-render'\nimport { CLASSES, STYLE_ID } from './constants'\n\nexport function mountToolActivatorStyles(): () => void {\n if (typeof document === 'undefined')\n return () => {}\n const cssr = CssRender()\n if (cssr.find(STYLE_ID) !== null)\n return () => {}\n const root = `.${CLASSES.root}`\n const style = cssr.c([\n cssr.c(root, {\n color: 'inherit',\n maxWidth: '54rem',\n width: '100%',\n padding: '1rem',\n lineHeight: '1.6',\n }, [\n cssr.c('*, *::before, *::after', { boxSizing: 'border-box' }),\n cssr.c('p', { margin: '0.5rem 0' }),\n cssr.c('label, legend, summary', { fontWeight: '600' }),\n cssr.c('legend', { padding: '0 0.35rem' }),\n cssr.c('textarea, select', {\n width: '100%',\n padding: '0.6rem 0.75rem',\n border: '1px solid color-mix(in srgb, currentColor 30%, transparent)',\n borderRadius: '0.5rem',\n color: 'inherit',\n background: 'inherit',\n font: 'inherit',\n }),\n cssr.c('textarea', { resize: 'vertical', fontFamily: 'ui-monospace, monospace' }),\n cssr.c('input[type=\"checkbox\"]', { accentColor: 'currentColor', width: '1rem', height: '1rem' }),\n cssr.c('button', {\n border: '1px solid color-mix(in srgb, currentColor 35%, transparent)',\n borderRadius: '0.5rem',\n padding: '0.55rem 0.9rem',\n color: 'inherit',\n background: 'color-mix(in srgb, currentColor 6%, transparent)',\n font: 'inherit',\n cursor: 'pointer',\n }),\n cssr.c('button:hover:not(:disabled)', { background: 'color-mix(in srgb, currentColor 12%, transparent)' }),\n cssr.c(':disabled', { opacity: '0.6', cursor: 'not-allowed' }),\n cssr.c('fieldset:disabled', { opacity: '1' }),\n cssr.c('input:focus-visible, textarea:focus-visible, select:focus-visible, button:focus-visible, summary:focus-visible', {\n outline: '2px solid currentColor',\n outlineOffset: '3px',\n }),\n ]),\n cssr.c(`${root} .${CLASSES.header}`, { display: 'flex', alignItems: 'flex-start', gap: '0.75rem', marginBottom: '1rem' }),\n cssr.c(`${root} .${CLASSES.icon}`, { width: '1.5rem', height: '1.5rem', flexShrink: '0', marginTop: '0.3rem' }),\n cssr.c(`${root} .${CLASSES.title}`, { margin: '0', fontSize: '1.25rem', lineHeight: '1.4' }),\n cssr.c(`${root} .${CLASSES.description}`, { opacity: '0.8' }),\n cssr.c(`${root} .${CLASSES.notice}`, {\n borderLeft: '3px solid color-mix(in srgb, currentColor 55%, transparent)',\n borderRadius: '0.25rem',\n background: 'color-mix(in srgb, currentColor 5%, transparent)',\n padding: '0.65rem 0.8rem',\n }),\n cssr.c(`${root} .${CLASSES.version}, ${root} .${CLASSES.help}`, { fontSize: '0.875rem', opacity: '0.8' }),\n cssr.c(`${root} .${CLASSES.fields}`, { display: 'grid', gap: '0.8rem', border: '0', padding: '0', margin: '1rem 0', minWidth: '0' }),\n cssr.c(`${root} .${CLASSES.field}`, { display: 'grid', gap: '0.35rem', minWidth: '0' }),\n cssr.c(`${root} .${CLASSES.checkbox}`, { display: 'flex', alignItems: 'center', gap: '0.6rem', cursor: 'pointer' }),\n cssr.c(`${root} .${CLASSES.advanced}`, { borderTop: '1px solid color-mix(in srgb, currentColor 20%, transparent)', paddingTop: '0.8rem' }, [\n cssr.c('summary', { cursor: 'pointer', marginBottom: '0.8rem' }),\n cssr.c(`.${CLASSES.field}`, { marginBottom: '1rem' }),\n ]),\n cssr.c(`${root} .${CLASSES.actions}`, { display: 'flex', flexWrap: 'wrap', gap: '0.65rem', marginTop: '1rem' }),\n cssr.c(`${root} .${CLASSES.error}`, { color: 'var(--color-danger, #d63e3e)', fontWeight: '600' }),\n cssr.c(`${root} .${CLASSES.success}`, { color: 'inherit', fontWeight: '600' }),\n ])\n style.mount({ id: STYLE_ID, head: true })\n const ownedStyle = cssr.find(STYLE_ID)\n return () => {\n if (ownedStyle !== null && cssr.find(STYLE_ID) === ownedStyle)\n style.unmount({ id: STYLE_ID })\n }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { ToolActivatorConfiguration } from './configuration-page'\nimport { CONFIGURATION_ID, CONFIGURATION_PRIORITY, CONFIGURATION_REGISTRANT, CONFIGURATION_SLOT } from './constants'\nimport { mountToolActivatorStyles } from './styles'\n\nexport const inject = ['slots']\n\nexport function apply(ctx: Context): void {\n ctx.effect(mountToolActivatorStyles)\n ctx.slots.inject(CONFIGURATION_SLOT, () => ctx.slots.register({\n name: CONFIGURATION_SLOT,\n key: CONFIGURATION_ID,\n registrant: CONFIGURATION_REGISTRANT,\n priority: CONFIGURATION_PRIORITY,\n }, ToolActivatorConfiguration))\n}\n"],"x_google_ignoreList":[3,5,6,7,8,9,10,11,12,13,14,15,16],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../src/shared.ts","../src/client/constants.ts","../src/client/catalog.ts","../src/client/primitives.ts","../src/client/configuration-page.tsx","../src/client/styles.ts","../src/client/index.ts"],"sourcesContent":["export interface ToolGroup {\n identifier: string\n name: string\n description: string\n tools: readonly string[]\n sections: readonly string[]\n}\n\nexport interface ToolPolicy {\n enabled: boolean\n mode: 'automatic' | 'manual'\n basicTools: readonly string[]\n excludedTools: readonly string[]\n requireApproval: boolean\n autoGroupMcp: boolean\n groups: readonly ToolGroup[]\n sectionTools: Readonly<Record<string, readonly string[]>>\n}\n\n/**\n * The tools this plugin always keeps loaded. A stored configuration can add to\n * the default set but never shrink it: these stay visible with full schemas\n * even when the profile pins an older `basicTools` list.\n */\nexport const BASE_TOOLS: readonly string[] = ['read', 'glob', 'grep', 'write', 'edit', 'skill', 'ask_user_question', 'todo_write']\n\nexport const DEFAULT_POLICY: ToolPolicy = {\n enabled: true,\n mode: 'automatic',\n basicTools: [...BASE_TOOLS],\n excludedTools: [],\n requireApproval: true,\n autoGroupMcp: true,\n groups: [],\n sectionTools: {},\n}\n\nexport function withBaseTools(policy: ToolPolicy): ToolPolicy {\n return { ...policy, basicTools: [...new Set([...BASE_TOOLS, ...policy.basicTools])] }\n}\n\nexport const PACKAGE_NAME = 'dsh-tool-activator'\nexport const CONFIG_ROW_ID = 'tool-activator'\nexport const MINIMUM_CORE_VERSION = '0.2.0-rc.2'\n","import { CONFIG_ROW_ID, PACKAGE_NAME } from '../shared'\n\nexport const CONFIGURATION_SLOT = 'plugins.bundle.config'\nexport const CONFIGURATION_KEY = PACKAGE_NAME\nexport const CONFIGURATION_REGISTRANT = PACKAGE_NAME\nexport const CONFIGURATION_ENTRY_ID = CONFIG_ROW_ID\nexport const STYLE_TAG_ID = 'dsh-tool-activator/config.css'\nexport const TOOL_ACTIVATOR_REMOTE = 'toolActivator'\n\nexport const CLASSES = {\n root: 'dsh-tool-activator-config',\n header: 'dsh-tool-activator-header',\n title: 'dsh-tool-activator-title',\n description: 'dsh-tool-activator-description',\n notice: 'dsh-tool-activator-notice',\n error: 'dsh-tool-activator-error',\n success: 'dsh-tool-activator-success',\n section: 'dsh-tool-activator-section',\n sectionTitle: 'dsh-tool-activator-section-title',\n list: 'dsh-tool-activator-list',\n row: 'dsh-tool-activator-row',\n rowText: 'dsh-tool-activator-row-text',\n rowName: 'dsh-tool-activator-row-name',\n rowMeta: 'dsh-tool-activator-row-meta',\n help: 'dsh-tool-activator-help',\n} as const\n","import type { Context } from '@deepseek-ai/cordis'\nimport type { ActivationCatalog } from '../types'\nimport { TOOL_ACTIVATOR_REMOTE } from './constants'\n\ninterface RemoteEnvelope {\n error?: { message?: string }\n ok?: boolean\n value?: unknown\n}\n\ninterface ConnectionLike {\n rpc?: {\n call?: (path: string, method: string, payload: { args: Record<string, unknown> }) => Promise<RemoteEnvelope>\n }\n}\n\nfunction rpcOf(ctx: Context): NonNullable<ConnectionLike['rpc']>['call'] | undefined {\n const connection = Reflect.get(ctx, 'connection') as ConnectionLike | undefined\n const call = connection?.rpc?.call\n return typeof call === 'function' ? call.bind(connection!.rpc) : undefined\n}\n\nexport async function loadToolCatalog(ctx: Context): Promise<ActivationCatalog> {\n const call = rpcOf(ctx)\n if (!call)\n throw new Error('连接服务不可用,无法读取工具列表。')\n // A hand-written Remote reads its parameters by name, so the payload carries\n // exactly one plain-object `args` field — an empty one for a no-argument method.\n const answer = await call('/api', `${TOOL_ACTIVATOR_REMOTE}/catalog`, { args: {} })\n if (answer?.ok !== true)\n throw new Error(answer?.error?.message ?? '读取工具列表失败。')\n const catalog = answer.value as ActivationCatalog | undefined\n if (!catalog || !Array.isArray(catalog.entries))\n throw new Error('工具列表返回格式无法识别。')\n return catalog\n}\n","import type { ComponentType, ReactElement, ReactNode } from 'react'\nimport { createElement } from 'react'\n\nexport interface SwitchProps {\n checked: boolean\n disabled?: boolean\n label: string\n onChange: (next: boolean) => void\n}\n\ninterface PrimitivesModule {\n Switch?: ComponentType<SwitchProps>\n Tag?: ComponentType<TagProps>\n}\n\nexport interface TagProps {\n children?: ReactNode\n className?: string\n tone?: 'outline' | 'solid' | 'neutral' | 'quiet' | 'success' | 'info' | 'warning' | 'danger'\n}\n\nconst SWITCH_CAPABILITY = 'Switch'\nconst TAG_CAPABILITY = 'Tag'\n\n/**\n * The platform seeds its shared UI kit, but a host that does not must not brick\n * this plugin: the official control is preferred and the local one below copies\n * its markup and rules.\n */\nfunction primitiveSwitch(): ComponentType<SwitchProps> | undefined {\n return primitive<SwitchProps>(SWITCH_CAPABILITY)\n}\n\nfunction primitive<T>(capability: keyof PrimitivesModule): ComponentType<T> | undefined {\n try {\n // eslint-disable-next-line ts/no-require-imports -- the client bundle is lazy CJS and the platform seeds this module; a static import would brick the whole bundle on a host that omits it\n const primitives = require('@deepseek-ai/dsh-client-ui-primitives') as PrimitivesModule\n const candidate = primitives?.[capability]\n return typeof candidate === 'function' ? candidate as ComponentType<T> : undefined\n }\n catch {\n return undefined\n }\n}\n\nfunction LocalSwitch({ checked, disabled, label, onChange }: SwitchProps): ReactElement {\n return createElement('button', {\n 'aria-checked': checked,\n 'aria-label': label,\n 'className': 'dsh-tool-activator-switch',\n 'disabled': disabled === true,\n 'onClick': () => onChange(!checked),\n 'role': 'switch',\n 'type': 'button',\n }, createElement('span', { className: 'dsh-tool-activator-switch-thumb' }))\n}\n\nfunction LocalTag({ children, className }: TagProps): ReactElement {\n return createElement('span', { className: className === undefined ? 'dsh-tool-activator-chip' : `dsh-tool-activator-chip ${className}` }, children)\n}\n\nexport const ToolActivatorSwitch: ComponentType<SwitchProps> = primitiveSwitch() ?? LocalSwitch\nexport const ToolActivatorTag: ComponentType<TagProps> = primitive<TagProps>(TAG_CAPABILITY) ?? LocalTag\n","import type { ReactElement } from 'react'\nimport type { ActivationCatalog, ActivationCatalogEntry } from '../types'\nimport type { ConfigurationScope, ToolActivatorConfigurationProps } from './types'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { CLASSES } from './constants'\nimport { ToolActivatorSwitch, ToolActivatorTag } from './primitives'\n\nfunction readBasicTools(scope: ConfigurationScope): string[] {\n const value = scope.getSnapshot().value\n const list = value?.basicTools\n return Array.isArray(list) ? list.filter((name): name is string => typeof name === 'string') : []\n}\n\nfunction hasStoredBasicTools(scope: ConfigurationScope): boolean {\n return Array.isArray(scope.getSnapshot().value?.basicTools)\n}\n\nfunction isDefaultLoaded(entry: ActivationCatalogEntry, basicTools: readonly string[]): boolean {\n return entry.tools.length > 0 && entry.tools.every(tool => basicTools.includes(tool))\n}\n\n/** The plugin's own base tools stay loaded whether or not the document lists them. */\nfunction isBaseTool(entry: ActivationCatalogEntry, baseTools: readonly string[]): boolean {\n return baseTools.length > 0 && entry.tools.length > 0 && entry.tools.every(tool => baseTools.includes(tool))\n}\n\nexport function ToolActivatorConfiguration({ view, configScope, loadToolCatalog }: ToolActivatorConfigurationProps): ReactElement | null {\n const [basicTools, setBasicTools] = useState<string[]>(() => readBasicTools(configScope))\n const [catalog, setCatalog] = useState<ActivationCatalog | undefined>(undefined)\n const [failure, setFailure] = useState('')\n const [busy, setBusy] = useState(false)\n const aliveRef = useRef(true)\n\n useEffect(() => {\n aliveRef.current = true\n return () => {\n aliveRef.current = false\n }\n }, [])\n\n useEffect(() => {\n const sync = (): void => setBasicTools(readBasicTools(configScope))\n return configScope.subscribe(sync)\n }, [configScope])\n\n useEffect(() => {\n let cancelled = false\n loadToolCatalog()\n .then((next) => {\n if (cancelled)\n return\n setCatalog(next)\n // The stored document may carry no basicTools field at all; the host's\n // live policy is then the only source for what is currently default.\n if (hasStoredBasicTools(configScope) === false)\n setBasicTools(next.basicTools)\n })\n .catch((problem: unknown) => {\n if (!cancelled)\n setFailure(problem instanceof Error ? problem.message : String(problem))\n })\n return () => {\n cancelled = true\n }\n }, [configScope, loadToolCatalog])\n\n const groups = useMemo(() => {\n const entries = catalog?.entries ?? []\n const baseTools = catalog?.baseTools ?? []\n const active: ActivationCatalogEntry[] = []\n const pending: ActivationCatalogEntry[] = []\n for (const entry of entries)\n (isBaseTool(entry, baseTools) || isDefaultLoaded(entry, basicTools) ? active : pending).push(entry)\n // The plugin's own base tools head their section; everything the user added\n // after them, each group alphabetical.\n const byBaseThenName = (left: ActivationCatalogEntry, right: ActivationCatalogEntry): number => {\n const rank = Number(isBaseTool(right, baseTools)) - Number(isBaseTool(left, baseTools))\n return rank !== 0 ? rank : left.name.localeCompare(right.name)\n }\n return { active: active.sort(byBaseThenName), pending: pending.sort(byBaseThenName) }\n }, [basicTools, catalog])\n\n const toggle = useCallback(async (entry: ActivationCatalogEntry, next: boolean): Promise<void> => {\n const snapshot = configScope.getSnapshot()\n if (snapshot.status !== 'ready' || !snapshot.writable || snapshot.mode !== 'host') {\n setFailure('当前配置不可写,无法保存。')\n return\n }\n const names = new Set(basicTools)\n for (const tool of entry.tools)\n next ? names.add(tool) : names.delete(tool)\n const updated = [...names]\n const previous = basicTools\n setBasicTools(updated)\n setBusy(true)\n setFailure('')\n try {\n const accepted = await configScope.mutate([{ op: 'set', path: ['basicTools'], value: updated }], snapshot.revision)\n if (!accepted && aliveRef.current) {\n setBasicTools(previous)\n setFailure('宿主拒绝了本次修改。')\n }\n }\n catch (problem) {\n if (aliveRef.current) {\n setBasicTools(previous)\n setFailure(problem instanceof Error ? problem.message : String(problem))\n }\n }\n finally {\n if (aliveRef.current)\n setBusy(false)\n }\n }, [basicTools, configScope])\n\n if (view === 'summary')\n return <p className={CLASSES.description}>默认只提供基础工具,其余工具由模型按需加载。</p>\n\n function renderRows(entries: readonly ActivationCatalogEntry[]): ReactElement {\n const baseTools = catalog?.baseTools ?? []\n return (\n <ul className={CLASSES.list}>\n {entries.map((entry) => {\n const locked = isBaseTool(entry, baseTools)\n return (\n <li className={CLASSES.row} key={entry.identifier}>\n <span className={CLASSES.rowText}>\n <span className={CLASSES.rowName}>\n {entry.name}\n {locked ? <ToolActivatorTag tone=\"neutral\">基础工具</ToolActivatorTag> : null}\n </span>\n <span className={CLASSES.rowMeta} title={entry.description || entry.tools.join('、')}>{entry.description || entry.tools.join('、')}</span>\n </span>\n <ToolActivatorSwitch\n checked={locked || isDefaultLoaded(entry, basicTools)}\n disabled={busy || locked}\n label={`默认加载 ${entry.name}`}\n onChange={next => void toggle(entry, next)}\n />\n </li>\n )\n })}\n </ul>\n )\n }\n\n return (\n <section className={CLASSES.root}>\n <header className={CLASSES.header}>\n <h3 className={CLASSES.title}>工具</h3>\n <p className={CLASSES.description}>打开开关即默认加载;关闭后按需加载,由模型用 activate_tools 获取。</p>\n </header>\n {failure === '' ? null : <p className={CLASSES.error} role=\"alert\">{failure}</p>}\n {catalog === undefined\n ? <p className={CLASSES.help} role=\"status\">{failure === '' ? '正在读取工具列表…' : '工具列表不可用。'}</p>\n : (\n <>\n <section className={CLASSES.section}>\n <h4 className={CLASSES.sectionTitle}>{`默认激活工具(${groups.active.length} 个)`}</h4>\n {groups.active.length === 0\n ? <p className={CLASSES.help}>当前没有默认激活的工具。</p>\n : renderRows(groups.active)}\n </section>\n <section className={CLASSES.section}>\n <h4 className={CLASSES.sectionTitle}>{`已安装但需先激活(${groups.pending.length} 个)`}</h4>\n {groups.pending.length === 0\n ? <p className={CLASSES.help}>全部工具都已默认激活。</p>\n : renderRows(groups.pending)}\n </section>\n </>\n )}\n </section>\n )\n}\n","import { CLASSES, STYLE_TAG_ID } from './constants'\n\n/**\n * One stylesheet shipped as an owned `<style data-plugin-css>` tag, the\n * convention the client module system records (`ClientModuleRecord.styles`) and\n * drops with the bundle. No CSS-in-JS runtime is bundled: the plugin stays\n * independent of any host application's styling stack. Colours come from the\n * platform's design tokens, with plain fallbacks for a host that lacks them.\n */\nconst CSS = `\n.${CLASSES.root}{display:grid;gap:12px;color:var(--dsw-alias-label-primary,inherit);font-size:13px;line-height:20px}\n.${CLASSES.header}{display:grid;gap:2px}\n.${CLASSES.title}{margin:0;font-size:14px;font-weight:600;line-height:22px}\n.${CLASSES.description}{margin:0;color:var(--dsw-alias-label-secondary,inherit)}\n.${CLASSES.help}{margin:0;color:var(--dsw-alias-label-caption,inherit);font-size:12px;line-height:18px}\n.${CLASSES.error}{margin:0;color:var(--dsw-alias-state-error-primary,#d63e3e)}\n.${CLASSES.success}{margin:0;color:var(--dsw-alias-state-success-primary,inherit)}\n.${CLASSES.section}{display:grid;gap:8px}\n.${CLASSES.sectionTitle}{margin:0;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary,inherit)}\n.${CLASSES.list}{display:grid;gap:0;margin:0;padding:0;list-style:none;border:.5px solid var(--dsw-alias-border-l4,rgba(127,127,127,.25));border-radius:16px;overflow:hidden}\n.${CLASSES.row}{display:flex;align-items:center;gap:12px;padding:10px 12px;border-top:.5px solid var(--dsw-alias-border-l4,rgba(127,127,127,.25))}\n.${CLASSES.row}:first-child{border-top:0}\n.${CLASSES.rowText}{display:grid;gap:2px;min-width:0;flex:1 1 auto}\n.${CLASSES.rowName}{display:flex;align-items:center;gap:6px;font-weight:500;overflow-wrap:anywhere}\n.${CLASSES.rowMeta}{color:var(--dsw-alias-label-caption,inherit);font-size:12px;line-height:18px;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}\n.dsh-tool-activator-chip{display:inline-flex;align-items:center;flex:0 0 auto;height:18px;padding:0 6px;border-radius:9px;font-size:11px;font-weight:400;line-height:16px;color:var(--dsw-alias-label-secondary,inherit);background:var(--dsw-alias-bg-layer-2,rgba(127,127,127,.12))}\n.dsh-tool-activator-switch{box-sizing:border-box;position:relative;flex:0 0 auto;width:36px;height:20px;padding:2px;border:0;border-radius:10px;background:var(--dsw-alias-border-l3,rgba(127,127,127,.4));cursor:pointer}\n.dsh-tool-activator-switch[aria-checked=true]{background:var(--dsw-alias-brand-primary,#4d6bfe)}\n.dsh-tool-activator-switch:disabled{cursor:default;opacity:.5}\n.dsh-tool-activator-switch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4d6bfe);outline-offset:2px}\n.dsh-tool-activator-switch-thumb{display:block;width:16px;height:16px;border-radius:50%;background:var(--dsw-alias-label-primary-foreground,#fff);transition:transform .12s ease}\n.dsh-tool-activator-switch[aria-checked=true] .dsh-tool-activator-switch-thumb{transform:translate(16px)}\n`\n\nexport function ownedStyleTag(): HTMLStyleElement | null {\n return document.querySelector<HTMLStyleElement>(`style[data-plugin-css=\"${STYLE_TAG_ID}\"]`)\n}\n\nexport function mountToolActivatorStyles(): () => void {\n if (typeof document === 'undefined')\n return () => {}\n if (ownedStyleTag() !== null)\n return () => {}\n const tag = document.createElement('style')\n tag.dataset.plugin = 'dsh-tool-activator'\n tag.dataset.pluginCss = STYLE_TAG_ID\n tag.textContent = CSS\n document.head.append(tag)\n return () => tag.remove()\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { ActivationCatalog } from '../types'\nimport type { ConfigurationScope } from './types'\nimport { loadToolCatalog } from './catalog'\nimport { ToolActivatorConfiguration } from './configuration-page'\nimport { CONFIGURATION_ENTRY_ID, CONFIGURATION_KEY, CONFIGURATION_REGISTRANT, CONFIGURATION_SLOT } from './constants'\nimport { mountToolActivatorStyles } from './styles'\n\nexport const inject = ['slots', 'connection']\n\n/**\n * The configuration lives on this bundle's own page in the Plugins manager, so\n * the page itself owns the settings handle the platform exposes per entry.\n */\nexport function apply(ctx: Context): void {\n ctx.effect(mountToolActivatorStyles)\n const loadCatalog = (): Promise<ActivationCatalog> => loadToolCatalog(ctx)\n ctx.inject(['configForms'], (branch) => {\n const configScope = branch.configForms.get(CONFIGURATION_ENTRY_ID) as unknown as ConfigurationScope\n branch.slots.inject(CONFIGURATION_SLOT, () => branch.slots.register({\n name: CONFIGURATION_SLOT,\n key: CONFIGURATION_KEY,\n registrant: CONFIGURATION_REGISTRANT,\n inject: () => ({ configScope, loadToolCatalog: loadCatalog }),\n } as never, ToolActivatorConfiguration))\n })\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,23 +3,37 @@ import { ToolCallId } from "@deepseek-ai/dsh-llm";
3
3
  import { defineTool, renderToolsSdk, renderToolsSdkPy } from "@deepseek-ai/dsh-tools";
4
4
  import { renderPrompt } from "@deepseek-ai/dsh-system-prompt";
5
5
  //#region src/shared.ts
6
+ /**
7
+ * The tools this plugin always keeps loaded. A stored configuration can add to
8
+ * the default set but never shrink it: these stay visible with full schemas
9
+ * even when the profile pins an older `basicTools` list.
10
+ */
11
+ const BASE_TOOLS = [
12
+ "read",
13
+ "glob",
14
+ "grep",
15
+ "write",
16
+ "edit",
17
+ "skill",
18
+ "ask_user_question",
19
+ "todo_write"
20
+ ];
6
21
  const DEFAULT_POLICY = {
7
22
  enabled: true,
8
23
  mode: "automatic",
9
- basicTools: [
10
- "read",
11
- "glob",
12
- "grep",
13
- "skill",
14
- "ask_user_question",
15
- "todo_write"
16
- ],
24
+ basicTools: [...BASE_TOOLS],
17
25
  excludedTools: [],
18
26
  requireApproval: true,
19
27
  autoGroupMcp: true,
20
28
  groups: [],
21
29
  sectionTools: {}
22
30
  };
31
+ function withBaseTools(policy) {
32
+ return {
33
+ ...policy,
34
+ basicTools: [.../* @__PURE__ */ new Set([...BASE_TOOLS, ...policy.basicTools])]
35
+ };
36
+ }
23
37
  const MINIMUM_CORE_VERSION = "0.2.0-rc.2";
24
38
  //#endregion
25
39
  //#region src/config.ts
@@ -4102,6 +4116,7 @@ const ACTIVATOR_TOOL_NAME = "activate_tools";
4102
4116
  const ACTIVATION_PRODUCER = "dsh-tool-activator";
4103
4117
  const ACTIVATION_PROJECTION_KEY = "tool-activator:activation";
4104
4118
  const ACTIVATION_CONTEXT_NAME = "tool-activator:context";
4119
+ const SETTINGS_REMOTE_NAMESPACE = "toolActivator";
4105
4120
  const FIRST_PARTY_SECTION_TOOLS = {
4106
4121
  "tool:read": ["read"],
4107
4122
  "tool:write": ["write"],
@@ -4541,6 +4556,72 @@ function filterPromptAssembly(assembly, catalog, policy, enabledNames, sdk, skil
4541
4556
  };
4542
4557
  }
4543
4558
  //#endregion
4559
+ //#region src/remote.ts
4560
+ const REMOTE_METHODS = "@deepseek-ai/dsh-typert-protocol/remote-methods";
4561
+ /**
4562
+ * The settings page reads the live tool catalog from here. The catalog is
4563
+ * scope-dependent in general, so the page asks the host instead of guessing
4564
+ * from the config document.
4565
+ */
4566
+ var ToolActivatorRemote = class {
4567
+ ctx;
4568
+ policy;
4569
+ constructor(ctx, policy) {
4570
+ this.ctx = ctx;
4571
+ this.policy = policy;
4572
+ }
4573
+ /**
4574
+ * Every tool this installation can expose. A scope-less read only sees the
4575
+ * global registry, so the live agents' scopes are unioned in: those are the
4576
+ * tools a session can actually reach.
4577
+ */
4578
+ schemas() {
4579
+ const byName = /* @__PURE__ */ new Map();
4580
+ for (const schema of this.ctx.tools.schemas()) byName.set(schema.name, schema);
4581
+ for (const agent of this.agents()) for (const schema of this.ctx.tools.schemas(agent)) byName.set(schema.name, schema);
4582
+ return [...byName.values()];
4583
+ }
4584
+ agents() {
4585
+ const list = this.ctx.agents.list;
4586
+ return typeof list === "function" ? list.call(this.ctx.agents) : [];
4587
+ }
4588
+ catalog() {
4589
+ const policy = this.policy();
4590
+ return {
4591
+ enabled: policy.enabled,
4592
+ basicTools: [...policy.basicTools],
4593
+ baseTools: [...DEFAULT_POLICY.basicTools],
4594
+ entries: buildToolCatalog(this.schemas(), policy).map((entry) => ({
4595
+ identifier: entry.identifier,
4596
+ name: entry.name,
4597
+ description: entry.tools.length === 1 ? entry.tools[0].description : entry.description,
4598
+ tools: entry.tools.map((tool) => tool.name)
4599
+ }))
4600
+ };
4601
+ }
4602
+ };
4603
+ function provideToolActivatorRemote(ctx, policy) {
4604
+ Object.defineProperty(ToolActivatorRemote.prototype, REMOTE_METHODS, {
4605
+ value: Object.freeze({
4606
+ version: 1,
4607
+ methods: [Object.freeze({
4608
+ method: "catalog",
4609
+ invocation: Object.freeze({ kind: "direct" })
4610
+ })]
4611
+ }),
4612
+ enumerable: false,
4613
+ configurable: true,
4614
+ writable: false
4615
+ });
4616
+ const remote = new ToolActivatorRemote(ctx, policy);
4617
+ Reflect.set(remote, "typertRemote", Object.freeze({
4618
+ service: remote,
4619
+ serviceKey: SETTINGS_REMOTE_NAMESPACE,
4620
+ namespace: SETTINGS_REMOTE_NAMESPACE
4621
+ }));
4622
+ ctx.provide(SETTINGS_REMOTE_NAMESPACE, remote);
4623
+ }
4624
+ //#endregion
4544
4625
  //#region src/runtime.ts
4545
4626
  var ActivatorExecutionRuntime = class {
4546
4627
  service;
@@ -4782,6 +4863,7 @@ function installToolActivator(ctx, config) {
4782
4863
  apply: foldActivationEvent
4783
4864
  });
4784
4865
  ctx.tools.register(tool);
4866
+ provideToolActivatorRemote(ctx, policySnapshot);
4785
4867
  ctx.systemPrompt.variable("tool_activator_context", () => "");
4786
4868
  ctx.systemPrompt.context({
4787
4869
  name: ACTIVATION_CONTEXT_NAME,
@@ -4830,9 +4912,8 @@ function installToolActivator(ctx, config) {
4830
4912
  for (const [callId, value] of receipts) if (value.agent.session === session) receipts.delete(callId);
4831
4913
  });
4832
4914
  function policySnapshot() {
4833
- const policy = config.get();
4834
- validatePolicy(policy);
4835
- return policy;
4915
+ validatePolicy(config.get());
4916
+ return withBaseTools(config.get());
4836
4917
  }
4837
4918
  function requireAgent(agent) {
4838
4919
  if (lifetime.signal.aborted || !agent || ctx.agents.get(agent.id) !== agent) throw new Error("dsh-tool-activator requires an exact live agent");
@@ -14,7 +14,7 @@
14
14
  - `tsc --noEmit`:退出码 `0`。
15
15
  - `git diff --check`:退出码 `0`;Windows LF/CRLF 提示不是测试失败。
16
16
  - `pnpm install --ignore-scripts --frozen-lockfile`:退出码 `0`,确认 lockfile 可复用,未执行任何 lifecycle script。
17
- - 完整测试共 **12 个文件、313 个用例**,连续五次独立进程全部通过:标准顺序一次,以及 shuffle seeds `20261010`、`20261011`、`20261012`、`20261013` 各一次。
17
+ - 完整测试共 **12 个文件、313 个用例**,连续五次独立进程全部通过:标准顺序一次,以及 shuffle seeds `20261010`、`20261011`、`20261012`、`20261013` 各一次。该批测试早于配置界面重做;重做后删除旧表单用例,当前为 **11 个文件、288 个用例**,lint 与类型检查同样通过。
18
18
  - 完成下述 mutation 并恢复源码后,再次完整运行通过 **12 个文件、313 个用例**,并重新通过 lint 和类型检查。
19
19
 
20
20
  [Vitest 配置](<../vitest.config.ts>)分别运行 node 宿主和 jsdom 客户端项目,没有 watch 模式或 Build 前置步骤。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-tool-activator",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.3.0",
5
5
  "description": "Load only basic DeepSeek Harness tools by default and activate other tools on demand.",
6
6
  "author": "Hairy <wwu710632@gmail.com>",
7
7
  "license": "MIT",
@@ -47,6 +47,7 @@
47
47
  "dsh": {
48
48
  "client": {
49
49
  "inject": [
50
+ "@deepseek-ai/dsh-api-remotes",
50
51
  "@deepseek-ai/dsh-client-ui-renderer",
51
52
  "@deepseek-ai/dsh-client-ui-plugin-manager"
52
53
  ],
@@ -97,7 +98,6 @@
97
98
  "@types/react": "^19.3.0",
98
99
  "@types/react-dom": "^19.3.0",
99
100
  "bumpp": "^12.0.0",
100
- "css-render": "^0.15.14",
101
101
  "eslint": "^10.7.0",
102
102
  "eslint-plugin-react-refresh": "^0.5.7",
103
103
  "jsdom": "^30.1.2",