dsh-tool-activator 0.0.0-stage → 0.2.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/LICENSE.md +21 -0
- package/README.md +126 -2
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/cordis.patch.yml +3 -0
- package/dist/client.js +17 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +5037 -0
- package/docs/verification.md +72 -0
- package/icon.svg +1 -0
- package/licenses/DeepSeek-MIT.txt +21 -0
- package/licenses/Gravity-Icons-MIT.txt +21 -0
- package/licenses/Schemastery-MIT.txt +21 -0
- package/licenses/Zod-MIT.txt +21 -0
- package/licenses/template-MIT.txt +21 -0
- package/package.json +119 -3
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hairy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,127 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-tool-activator
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[![npm version][npm-version-src]][npm-version-href]
|
|
4
|
+
[![npm downloads][npm-downloads-src]][npm-downloads-href]
|
|
5
|
+
[![bundle][bundle-src]][bundle-href]
|
|
6
|
+
[![JSDocs][jsdocs-src]][jsdocs-href]
|
|
7
|
+
[![License][license-src]][license-href]
|
|
8
|
+
|
|
9
|
+
为 DeepSeek Harness (DSH) 减少初始工具上下文:默认仅展示基础工具,其余工具通过 `activate_tools` 按需加载。
|
|
10
|
+
|
|
11
|
+
* **系统要求**:DSH $\ge$ `0.2.0-rc.2`;Node.js $\ge$ `22.19.0`。
|
|
12
|
+
* **交付状态**:当前为源码交付,未发布 npm 包。
|
|
13
|
+
* **定位声明**:本插件**不是权限系统**,仅影响模型可见的 schema 和提示词,不替代核心审批与沙箱机制。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 核心行为
|
|
18
|
+
|
|
19
|
+
默认基础工具为 `read`、`glob`、`grep`、`skill`、`ask_user_question`、`todo_write`。
|
|
20
|
+
|
|
21
|
+
| 运行状态 | 模型可见内容 |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| `automatic`(默认) | 基础工具、已激活工具、`activate_tools`,以及其余工具的 `<available_tools>` 简述目录 |
|
|
24
|
+
| `manual` | 仅基础工具(无发现目录或 `activate_tools`) |
|
|
25
|
+
| `enabled: false` | 禁用过滤,完全移除激活入口 |
|
|
26
|
+
|
|
27
|
+
### 默认启用的工具
|
|
28
|
+
|
|
29
|
+
`read`、`glob`、`grep`、`skill`、`ask_user_question`、`todo_write`
|
|
30
|
+
|
|
31
|
+
### 可通过 `activate_tools` 加载的工具
|
|
32
|
+
|
|
33
|
+
其余已安装且在当前 agent 作用域可见的工具默认隐藏,由模型按标识激活。常见内置工具:
|
|
34
|
+
|
|
35
|
+
| 分类 | 工具标识 |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| 文件写入 | `write`、`edit` |
|
|
38
|
+
| 命令执行 | `bash`、`pwsh` |
|
|
39
|
+
| 联网 | `web_search`、`web_fetch` |
|
|
40
|
+
| 后台任务 | `job_output`、`job_list`、`job_kill` |
|
|
41
|
+
| 终端 | `terminal_open`、`terminal_send`、`terminal_read`、`terminal_signal`、`terminal_close`、`terminal_list` |
|
|
42
|
+
| 目标 | `get_goal`、`create_goal`、`update_goal` |
|
|
43
|
+
| 会话检索 | `session_search`、`session_event_search`、`session_trace`、`session_event_trace`、`session_event_read` |
|
|
44
|
+
| 代码智能 | `lsp` |
|
|
45
|
+
| 编排 | `subagent`、`subagent_fork`、`workflow`、`ralph`、`structured_output` |
|
|
46
|
+
|
|
47
|
+
此外,任意已安装插件的工具都可作为标识请求;开启 `autoGroupMcp` 时,`mcp__server__tool` 还会按 server 聚合为 `mcp.server`。
|
|
48
|
+
|
|
49
|
+
实际可用集合以当次 `<available_tools>` 目录为准:未知、已移除、作用域不可见或被 `excludedTools` 排除的标识不会因此被注册或授权。该目录随提示词注入给模型,只有标识、名称和一句简述:
|
|
50
|
+
|
|
51
|
+
```xml
|
|
52
|
+
<available_tools description="These tools are installed but not yet enabled. Use activate_tools to enable them when needed.">
|
|
53
|
+
<tool identifier="web_search" name="web_search">Search the public web for current information.</tool>
|
|
54
|
+
<tool identifier="mcp.mail" name="mail">send: Send a message through the mailbox.</tool>
|
|
55
|
+
</available_tools>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
模型可按需请求加载工具或组:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"identifiers": ["web_search", "web_fetch"],
|
|
63
|
+
"reason": "需要检索并核对用户要求的公开资料"
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 插件配置项
|
|
70
|
+
|
|
71
|
+
在官方插件管理页的 `dsh-tool-activator#tool-activator` 中可配置:
|
|
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` | `{}` | 系统说明节到工具名的依赖映射 |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 状态、审批与生命周期
|
|
87
|
+
|
|
88
|
+
* **执行路由**:通过 DSH 原有 dispatcher 执行,不改变底层沙箱或运行路由。
|
|
89
|
+
* **持久化与恢复**:已完成的激活状态随标准会话日志和 seed 恢复,不依赖中途内存状态。
|
|
90
|
+
* **生命周期**:Cordis 负责注册、监听及 HMR 清理,卸载时自动清理样式与实例。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 源码验证与交付边界
|
|
95
|
+
|
|
96
|
+
根目录下可执行以下命令进行验证:
|
|
97
|
+
|
|
98
|
+
```powershell
|
|
99
|
+
$env:CI = 'true'
|
|
100
|
+
node node_modules/eslint/bin/eslint.js . --fix
|
|
101
|
+
node node_modules/typescript/bin/tsc --noEmit
|
|
102
|
+
node node_modules/vitest/vitest.mjs run
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
* **测试情况**:已完成 5 次独立全量测试(包含 4 个 shuffle seed,共 12 个文件、313 个用例全部通过)。
|
|
106
|
+
* **未验证项**:本次未执行 Build、真实 GUI E2E、打包发布及真实 profile 验证。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 许可证
|
|
111
|
+
|
|
112
|
+
MIT
|
|
113
|
+
|
|
114
|
+
第三方声明见 [THIRD_PARTY_NOTICES.md](<THIRD_PARTY_NOTICES.md>)。
|
|
115
|
+
|
|
116
|
+
<!-- Badges -->
|
|
117
|
+
|
|
118
|
+
[npm-version-src]: https://img.shields.io/npm/v/dsh-tool-activator?style=flat&colorA=080f12&colorB=1fa669
|
|
119
|
+
[npm-version-href]: https://npmjs.com/package/dsh-tool-activator
|
|
120
|
+
[npm-downloads-src]: https://img.shields.io/npm/dm/dsh-tool-activator?style=flat&colorA=080f12&colorB=1fa669
|
|
121
|
+
[npm-downloads-href]: https://npmjs.com/package/dsh-tool-activator
|
|
122
|
+
[bundle-src]: https://img.shields.io/bundlephobia/minzip/dsh-tool-activator?style=flat&colorA=080f12&colorB=1fa669&label=minzip
|
|
123
|
+
[bundle-href]: https://bundlephobia.com/result?p=dsh-tool-activator
|
|
124
|
+
[jsdocs-src]: https://img.shields.io/badge/jsdocs-reference-080f12?style=flat&colorA=080f12&colorB=1fa669
|
|
125
|
+
[jsdocs-href]: https://www.jsdocs.io/package/dsh-tool-activator
|
|
126
|
+
[license-src]: https://img.shields.io/github/license/hairyf/dsh-tool-activator.svg?style=flat&colorA=080f12&colorB=1fa669
|
|
127
|
+
[license-href]: https://github.com/hairyf/dsh-tool-activator/blob/main/LICENSE.md
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 第三方来源与许可声明
|
|
2
|
+
|
|
3
|
+
本文件记录本项目使用的模板、图标与已核对依赖的原始版权和许可,不构成法律确权或完整依赖 SBOM。本项目自身代码按[根许可](<LICENSE.md>)(MIT)提供。
|
|
4
|
+
|
|
5
|
+
## starter-plugin 模板
|
|
6
|
+
|
|
7
|
+
- 来源:[DSH starter-plugin 固定 commit](<https://github.com/dsh-tauri/starter-plugin/tree/ff0c32c923172c3505044763de9d6420611146bd>),SHA `ff0c32c923172c3505044763de9d6420611146bd`。
|
|
8
|
+
- 原始版权:**Copyright (c) 2025-PRESENT dsh-tauri-desk.**
|
|
9
|
+
- [完整 MIT 原文](<licenses/template-MIT.txt>)来自本仓库初始未改动的许可文件;原 notice 和授权条款完整保留。
|
|
10
|
+
- 保留模板的包与 host/client 构建骨架,并修改为本插件入口、官方 client module-loader 导出、兼容性声明及测试布局。模板 MIT 仅适用于其相应部分。
|
|
11
|
+
|
|
12
|
+
## Gravity UI Icons
|
|
13
|
+
|
|
14
|
+
- 来源:`@gravity-ui/icons` **2.22.0**;所用图标为 `Wrench`。本包[SVG 图标](<icon.svg>)复制自该版本原始 Wrench SVG;[客户端图标模块](<src/client/icons.ts>)使用同一公开组件。
|
|
15
|
+
- 原始版权:**Copyright (c) 2022 YANDEX LLC.**
|
|
16
|
+
- [完整 MIT 原文](<licenses/Gravity-Icons-MIT.txt>)已保留;本次未改写 SVG 路径数据。公开 manifest/icon 资源接线不代表图标作者或官方插件页对本项目背书。
|
|
17
|
+
|
|
18
|
+
## 已核对依赖
|
|
19
|
+
|
|
20
|
+
| 组件 | 核对版本/来源 | 许可副本与说明 |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| DeepSeek Harness 公开工具接口 | `@deepseek-ai/dsh-tools` 0.2.0-rc.2 | Copyright (c) 2026 DeepSeek;[MIT 原文](<licenses/DeepSeek-MIT.txt>)。这里只使用公开接口与 standalone SDK renderer,不复制或改动核心 routing/approval/sandbox 实现 |
|
|
23
|
+
| `@deepseek-ai/schemastery` | 3.18.4 | Copyright (c) 2021-present Shigma;[MIT 原文](<licenses/Schemastery-MIT.txt>) |
|
|
24
|
+
| `@deepseek-ai/cosmokit` | 1.8.5 | Copyright (c) 2021-present Shigma;与 schemastery 相同的 MIT 条款,见[MIT 原文](<licenses/Schemastery-MIT.txt>)。仅用于 schemastery 公开类型中 `Dict` / `Volatile` 的可移植引用 |
|
|
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
|
+
|
|
28
|
+
其它开发/运行依赖以[包声明](<package.json>)和[依赖锁](<pnpm-lock.yaml>)为准;仅使用接口不等于其独立许可已被本项目替换。没有执行 Build,尚不能断言最终 bundle 具体包含哪些第三方代码。对最终产物、直接与传递依赖的完整版权/许可 inventory,仍需在准备发行时单独核查。
|
|
29
|
+
|
|
30
|
+
## 发行前要求
|
|
31
|
+
|
|
32
|
+
1. 本项目自身代码按 [MIT](<LICENSE.md>) 提供;模板、图标与依赖仍保留各自原始许可,不能被本项目的 MIT 声明替换。
|
|
33
|
+
2. 分发时保留上述原始 Copyright、授权全文和适用 attribution,并同步更新实际 bundle 涉及的第三方清单。
|
|
34
|
+
3. 未执行 Build、打包、发布或商业授权申请;包元数据的 `SEE LICENSE IN LICENSE.md` 只是查阅入口,不是额外授权。
|
package/cordis.patch.yml
ADDED
package/dist/client.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
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=c(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}))(),1);function V(){if(typeof document>`u`)return()=>{};let e=(0,B.default)();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;
|
|
16
|
+
return module.exports;}});
|
|
17
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +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","import 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import Schema from "@deepseek-ai/schemastery";
|
|
2
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
3
|
+
//#region src/config.d.ts
|
|
4
|
+
declare const Config: Schema<NoInfer<Schemastery.ObjectS<NoInfer<{
|
|
5
|
+
enabled: Schema<boolean, boolean, "defined">;
|
|
6
|
+
mode: Schema<"automatic" | "manual", "automatic" | "manual", "defined">;
|
|
7
|
+
basicTools: Schema<string[], string[], "defined">;
|
|
8
|
+
excludedTools: Schema<string[], string[], "defined">;
|
|
9
|
+
requireApproval: Schema<boolean, boolean, "defined">;
|
|
10
|
+
autoGroupMcp: Schema<boolean, boolean, "defined">;
|
|
11
|
+
groups: Schema<({
|
|
12
|
+
identifier?: string | null | undefined;
|
|
13
|
+
name?: string | null | undefined;
|
|
14
|
+
description?: string | null | undefined;
|
|
15
|
+
tools?: string[] | null | undefined;
|
|
16
|
+
sections?: string[] | null | undefined;
|
|
17
|
+
} & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<NoInfer<{
|
|
18
|
+
identifier: Schema<string, string, "defined">;
|
|
19
|
+
name: Schema<string, string, "defined">;
|
|
20
|
+
description: Schema<string, string, "defined">;
|
|
21
|
+
tools: Schema<string[], string[], "defined">;
|
|
22
|
+
sections: Schema<string[], string[], "defined">;
|
|
23
|
+
}>>[], "defined">;
|
|
24
|
+
sectionTools: Schema<import("@deepseek-ai/cosmokit").Dict<string[], string>, import("@deepseek-ai/cosmokit").Dict<string[], string>, "defined">;
|
|
25
|
+
}>>>, NoInfer<Schemastery.ObjectT<NoInfer<{
|
|
26
|
+
enabled: Schema<boolean, boolean, "defined">;
|
|
27
|
+
mode: Schema<"automatic" | "manual", "automatic" | "manual", "defined">;
|
|
28
|
+
basicTools: Schema<string[], string[], "defined">;
|
|
29
|
+
excludedTools: Schema<string[], string[], "defined">;
|
|
30
|
+
requireApproval: Schema<boolean, boolean, "defined">;
|
|
31
|
+
autoGroupMcp: Schema<boolean, boolean, "defined">;
|
|
32
|
+
groups: Schema<({
|
|
33
|
+
identifier?: string | null | undefined;
|
|
34
|
+
name?: string | null | undefined;
|
|
35
|
+
description?: string | null | undefined;
|
|
36
|
+
tools?: string[] | null | undefined;
|
|
37
|
+
sections?: string[] | null | undefined;
|
|
38
|
+
} & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<NoInfer<{
|
|
39
|
+
identifier: Schema<string, string, "defined">;
|
|
40
|
+
name: Schema<string, string, "defined">;
|
|
41
|
+
description: Schema<string, string, "defined">;
|
|
42
|
+
tools: Schema<string[], string[], "defined">;
|
|
43
|
+
sections: Schema<string[], string[], "defined">;
|
|
44
|
+
}>>[], "defined">;
|
|
45
|
+
sectionTools: Schema<import("@deepseek-ai/cosmokit").Dict<string[], string>, import("@deepseek-ai/cosmokit").Dict<string[], string>, "defined">;
|
|
46
|
+
}>>>, "volatile-defined">;
|
|
47
|
+
type ToolActivatorConfig = ReturnType<typeof Config>;
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/index.d.ts
|
|
50
|
+
declare const name = "tool-activator";
|
|
51
|
+
declare const inject: string[];
|
|
52
|
+
declare function apply(ctx: Context, config: ToolActivatorConfig): void;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { Config, apply, inject, name };
|