dsh-mcp-connector 0.2.81 → 0.2.82
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/CHANGELOG.md +27 -1
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/DATA-MCP-CONTRIBUTION-REVIEW.md +60 -0
- package/docs/SHAREABLE-CONNECTION-TEMPLATES.md +92 -0
- package/docs/tutorials/SHARING-AUTHOR-ASSETS.md +32 -0
- package/docs/tutorials/SHARING-KIT.md +2 -0
- package/docs/tutorials/SHARING-UI-INTEGRATION.md +63 -0
- package/lib/catalog.js +13 -0
- package/lib/index.js +9 -1
- package/lib/shareable-connection-template.js +389 -0
- package/lib/web.js +1 -0
- package/package.json +5 -3
- package/scripts/ui-harness.mjs +12 -1
- package/ui/connection-template-sharing.js +382 -0
- package/ui/index.html +155 -0
- package/ui/sharing-experience.js +438 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/);首个公开版本从 `0.1.0` 开始。
|
|
4
4
|
|
|
5
|
+
## [0.2.82] - 2026-10-26
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- 新增首次使用只读引导,将安装、授权、工具发现/缓存和真实业务调用拆成独立阶段;只读取当前作用域内的状态和缓存,不把“已安装”“有缓存”或“已复制草稿”误判为业务成功。
|
|
10
|
+
- 新增“分享使用体验”草稿编辑器。用户选择公开教程模板、按实际情况填写版本与步骤状态后,只有明确点击才会把脱敏文本带入会话草稿;Host 返回成功前不宣称已带入,失败时保留预览供修正重试。
|
|
11
|
+
- 新增确定性安全连接模板分享。输出只包含白名单允许的固定结构和审核过的公开目录引用;自定义 URL、连接名称、凭据、Header、OAuth Grant、stdio 命令与环境变量不会进入分享结果。
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- 增强外部分发源审计:以 npm `latest` 为规范版本,严格检查 awesome-dsh-plugin/DSH Market、dshopen 及受监控目录的版本与 npm 安装元数据;`stale`、`invalid`、`missing`、`unavailable` 均不能通过同步门禁。
|
|
16
|
+
- 分发漂移继续由单一自动跟踪项维护;已有目录等待同步或元数据修正时,不重复提交外部上架 PR/Issue。
|
|
17
|
+
|
|
18
|
+
### Security and privacy
|
|
19
|
+
|
|
20
|
+
- 所有分享行为均需用户明确操作;插件不会自动发送消息、调用业务工具、公开发帖或上传业务数据。本版本不新增遥测,也不读取完整对话、真实工具返回、账号、凭据或现有连接配置来推断分享状态。
|
|
21
|
+
- 非法版本或模板输入失败时保持选择器、内容和预览一致,并给出可纠正提示,不以半更新界面继续生成草稿。
|
|
22
|
+
|
|
23
|
+
### Verification scope and known limitations
|
|
24
|
+
|
|
25
|
+
- 完整 `npm run check`:502 项测试,494 通过、8 项按环境条件跳过、0 失败;99 个发布文件通过白名单以及凭据/本机路径扫描。跳过项不计作通过。
|
|
26
|
+
- 自动化、无凭据 UI harness 与缓存/localhost 合成测试只证明代码路径和安全边界,不替代真实 DSH Host、真实 OAuth、真实连接、付费业务调用或搜索排名验收。
|
|
27
|
+
- 2026-10-16 的企业简介证据只证明当时已有连接完成过一次获准的真实只读调用,不能外推为 v0.2.82 首次安装、首次授权、JSON 迁移、连接恢复或所有业务工具成功。
|
|
28
|
+
- 仓库截图和 GIF 是标注版本的无凭据 Mock 素材;分发版本/安装元数据同步也不等于搜索排名、曝光、安装转化或业务成功。
|
|
29
|
+
|
|
5
30
|
## [0.2.81] - 2026-10-25
|
|
6
31
|
|
|
7
32
|
### Documentation
|
|
@@ -1072,7 +1097,8 @@
|
|
|
1072
1097
|
- 外部 URL 与导入 Header 执行安全校验。
|
|
1073
1098
|
- iframe 消息校验同源和消息来源。
|
|
1074
1099
|
|
|
1075
|
-
[Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.
|
|
1100
|
+
[Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.82...HEAD
|
|
1101
|
+
[0.2.82]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.81...v0.2.82
|
|
1076
1102
|
[0.2.48]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.47...v0.2.48
|
|
1077
1103
|
[0.2.47]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.46...v0.2.47
|
|
1078
1104
|
[0.2.46]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.45...v0.2.46
|
package/README.en.md
CHANGED
|
@@ -231,7 +231,7 @@ npm run dev:ui
|
|
|
231
231
|
|
|
232
232
|
Every Registry merge regenerates `catalog-stats.json`; an hourly workflow in this repository synchronizes the Chinese and English product copy plus a local stats snapshot. The static npm README updates with package releases, while the live badges above read the Registry directly and therefore stay current without another npm release.
|
|
233
233
|
|
|
234
|
-
The current public version is [`dsh-mcp-connector@0.2.
|
|
234
|
+
The current public version is [`dsh-mcp-connector@0.2.82`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.82](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.82).
|
|
235
235
|
|
|
236
236
|
See [CHANGELOG.md](CHANGELOG.md) for version history and [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md) for the Desktop release checklist.
|
|
237
237
|
|
package/README.md
CHANGED
|
@@ -226,7 +226,7 @@ npm run dev:ui
|
|
|
226
226
|
|
|
227
227
|
公共 Registry 每次合并后会生成 `catalog-stats.json`;本仓库的定时工作流每小时同步中英文介绍和统计快照。npm 页面中的静态正文随版本发布更新,上方动态统计徽标则直接读取 Registry,可在不发布新 npm 版本时保持实时数量一致。
|
|
228
228
|
|
|
229
|
-
当前公开版本为 [`dsh-mcp-connector@0.2.
|
|
229
|
+
当前公开版本为 [`dsh-mcp-connector@0.2.82`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.82](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.82)。
|
|
230
230
|
|
|
231
231
|
版本能力与变更记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
232
232
|
Desktop 发版回归见 [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md)。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 数据 MCP 贡献与验收模板
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
自动发现分数、`initialize`、`tools/list` 或元数据工具成功,都不等于业务数据验收通过。新卡片只能在官方证据、条款、去重、限定范围真实只读调用与具名人工批准都完成后进入 Registry PR。
|
|
6
|
+
|
|
7
|
+
## 禁止推荐清单
|
|
8
|
+
|
|
9
|
+
以 Registry `docs/DEFERRED-CONNECTORS.md` 为当前人工决策依据,本轮继续保留全部 5 项,不因自动发现命中而重新推荐:
|
|
10
|
+
|
|
11
|
+
- `dsh-qixin-insight-mcp-oauth`
|
|
12
|
+
- `dsh-plugin-xparse`
|
|
13
|
+
- `shuididata/mcp-server`(机器规则中的稳定身份为 `shuidi-enterprise-data`)
|
|
14
|
+
- `mcp-cnbs`
|
|
15
|
+
- `chinese-law-mcp`
|
|
16
|
+
|
|
17
|
+
注:`discovery-sources/exclusions.json` 当前只稳定阻断后 3 类身份;启信慧眼与 TextIn xParse 仍需在 Registry 的独立变更中补齐机器规则和回归测试。本工作线不修改 Registry。
|
|
18
|
+
|
|
19
|
+
## 候选提交字段
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
候选名称:
|
|
23
|
+
提供方与国内/海外属性:
|
|
24
|
+
用途与数据范围:
|
|
25
|
+
官方页面 / 官方仓库 / Official Registry / 包或端点:
|
|
26
|
+
鉴权、付费与额度:
|
|
27
|
+
代码许可证、数据许可与服务条款:
|
|
28
|
+
维护状态(是否归档、最近更新、版本):
|
|
29
|
+
重复关系(稳定身份、端点、上游数据、已上架卡片):
|
|
30
|
+
协议验收(initialize / tools/list / 只读注解):
|
|
31
|
+
业务验收(指定工具、最小参数、返回字段、来源、单位、时间范围、缺失值):
|
|
32
|
+
状态:PASS / SKIP / FAIL / DEFERRED
|
|
33
|
+
失败或延期原因:
|
|
34
|
+
评分与下一步:
|
|
35
|
+
审核人与日期:
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
不记录凭据、完整业务响应、客户数据、个人数据或本机路径。运行证据只保留时间、版本、工具名、状态、字段摘要与脱敏哈希。
|
|
39
|
+
|
|
40
|
+
## 验收门槛
|
|
41
|
+
|
|
42
|
+
| 层级 | 通过条件 | 未通过时状态 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 身份与条款 | 提供方、代码/数据许可、服务条款、鉴权与费用可核对 | `DEFERRED` 或 `SKIP` |
|
|
45
|
+
| 去重与排除 | 与现有卡片、稳定身份及禁止清单完成对照 | `SKIP` |
|
|
46
|
+
| 协议 | `initialize`、`tools/list` 成功,工具的读写/破坏性边界明确 | `DEFERRED` 或 `FAIL` |
|
|
47
|
+
| 业务数据 | 至少一次限定范围的真实只读调用,并核对字段、来源、时间、单位与缺失值 | `DEFERRED` |
|
|
48
|
+
| 人工决策 | 具名批准且范围与已验收能力一致 | 不得创建正式卡片 |
|
|
49
|
+
|
|
50
|
+
## 2026-10-25 候选证据清单
|
|
51
|
+
|
|
52
|
+
最新 [Issue #17](https://github.com/duhu2000/dsh-mcp-connector-registry/issues/17) 报告扫描 3,187 条、识别 606 个数据候选,自动 `selected` 仍为 0。[Issue #19](https://github.com/duhu2000/dsh-mcp-connector-registry/issues/19) 的自动排序不替代许可、条款与真实调用验收。本轮没有可直接上架的新候选:
|
|
53
|
+
|
|
54
|
+
| 候选 | 已有证据 | 未完成 | 状态 |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| HKEX 上市公司公告检索(社区) | 协议可达,4 个工具,`get_server_info` 元数据调用成功 | 未执行公告检索/读取,未核对来源、字段与时间范围 | `DEFERRED` |
|
|
57
|
+
| UNESCO UIS 全球教育统计(社区) | 协议可达,5 个工具,`uis_list_geo_units` 元数据调用成功 | 未查询统计值,未核对单位、版本、来源与缺失值 | `DEFERRED` |
|
|
58
|
+
| Shumi 加密市场研究 | 协议可达,33 个工具有 `readOnlyHint` | 无授权测试 Key,业务调用、额度与条款边界未验收 | `DEFERRED` |
|
|
59
|
+
|
|
60
|
+
结论:三者都不得因协议或元数据成功而标为业务 `PASS`,不创建新卡片、不批量上架。
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# 安全可分享连接模板
|
|
2
|
+
|
|
3
|
+
## 定位
|
|
4
|
+
|
|
5
|
+
可分享模板不是完整配置备份,也不是可自动执行的安装脚本。它只保留让另一位用户理解“连什么”所必需的最小字段;凭据必须在目标本机重新填写,OAuth 和 stdio 目录项必须回到市场重新授权或确认。
|
|
6
|
+
|
|
7
|
+
## 核心契约
|
|
8
|
+
|
|
9
|
+
`lib/shareable-connection-template.js` 导出:
|
|
10
|
+
|
|
11
|
+
- `createShareableTemplateFromConnection(record, options)`:仅用于用户明确选择的连接;复用已有脱敏导出后再按白名单重建。
|
|
12
|
+
- `createShareableTemplateFromCatalog({connectorId, serverKey})`:只按 ID 从包内已审计、已发布目录解析;不接受用户粘贴的 descriptor。
|
|
13
|
+
- `assertShareableConnectionTemplate(input)`:严格白名单校验,未知字段直接拒绝,不静默过滤。
|
|
14
|
+
- `previewShareableConnectionTemplate(input)`:返回预览、待补字段、后续动作和 `requiresExplicitConfirmation=true`;不连接、不写入。
|
|
15
|
+
- `stringifyShareableConnectionTemplate(input)`:只序列化已通过上述严格校验的文档。
|
|
16
|
+
|
|
17
|
+
导入仍使用现有 `normalizeJsonImport()` 与 Host 显式确认链。凭据占位符 `<REDACTED:REENTER>` 未替换时,现有导入器会整体拒绝。本模块不提供绕过确认的执行 API。
|
|
18
|
+
|
|
19
|
+
## 允许与拒绝
|
|
20
|
+
|
|
21
|
+
| 输入 | 结果 | 原因 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| 无额外 Header 的用户自定义 HTTP | 允许,但 URL、显示名和 serverName 都改为固定重填/公开值 | host、路径、子域名与自定义名称都可能携带租户或凭据 |
|
|
24
|
+
| Bearer/API Key HTTP | 允许,凭据改为占位符 | 目标用户必须在本机重填;API Key Header 只允许四个通用名称 |
|
|
25
|
+
| 用户自定义 URL(包括 userinfo、子域、路径、查询串、fragment、IP) | 不输出原值 | 整个 URL 改为重填占位符,不分享端点、租户或内网拓扑 |
|
|
26
|
+
| 自定义 Headers | 拒绝 | 不用 Header 名黑名单猜测值是否敏感 |
|
|
27
|
+
| 自定义 stdio | 拒绝 | 命令、参数、env、cwd 可能含凭据、本机路径或任意执行 |
|
|
28
|
+
| 包内已审计公开目录连接(HTTP / OAuth / stdio) | 仅输出 `connectorId/serverKey` 及 `connect-from-catalog` 引用 | 目标端从当前已审计目录重新解析;不复制 URL、Header、Grant、CLI、args 或 env |
|
|
29
|
+
| 用户粘贴或伪造的“公开 descriptor” | 拒绝 | `redacted=true` 不能证明 ID、名称或子域是公开信息 |
|
|
30
|
+
| 含未知字段的“模板” | 拒绝 | fail closed,不做过滤后继续 |
|
|
31
|
+
|
|
32
|
+
### 允许样例(节选)
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"format": "dsh-mcp-connector.share-template",
|
|
37
|
+
"version": 1,
|
|
38
|
+
"redacted": true,
|
|
39
|
+
"source": { "kind": "user-provided" },
|
|
40
|
+
"connections": [{
|
|
41
|
+
"name": "自定义 MCP 连接",
|
|
42
|
+
"serverName": "custom-mcp",
|
|
43
|
+
"transport": "streamable-http",
|
|
44
|
+
"url": "<REDACTED:REENTER>",
|
|
45
|
+
"headers": {},
|
|
46
|
+
"authMode": "api-key",
|
|
47
|
+
"apiKeyHeader": "X-Api-Key",
|
|
48
|
+
"apiKeyValue": "<REDACTED:REENTER>",
|
|
49
|
+
"redactedFields": ["url", "apiKeyValue"]
|
|
50
|
+
}]
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 拒绝样例
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"transport": "stdio",
|
|
59
|
+
"command": "<LOCAL_PATH>/private-mcp",
|
|
60
|
+
"args": ["--token", "secret"],
|
|
61
|
+
"env": { "VENDOR_TOKEN": "secret" }
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
拒绝结果不回显上述值,只说明应改用经审计的公开目录模板。
|
|
66
|
+
|
|
67
|
+
## P0 前端接入
|
|
68
|
+
|
|
69
|
+
`ui/connection-template-sharing.js` 是无数据权限的纯前端 ES module。它不将安全性交给 LLM,而是在浏览器内执行确定性的白名单转换,然后由用户显式选择复制、下载或带入新会话草稿。
|
|
70
|
+
|
|
71
|
+
宿主必须把当前已审计且 `published !== false` 的目录转换为仅含 `connectorId/serverKey/name/serverName` 的 `catalogReferences`;不能将用户 JSON 当成白名单。
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
import { mount } from '/mcp-connector/ui/connection-template-sharing.js';
|
|
75
|
+
|
|
76
|
+
const dispose = mount(container, {
|
|
77
|
+
catalogReferences: publishedCatalog.flatMap((connector) =>
|
|
78
|
+
connector.servers.map((server) => ({
|
|
79
|
+
connectorId: connector.id,
|
|
80
|
+
serverKey: server.serverKey,
|
|
81
|
+
name: connector.name,
|
|
82
|
+
serverName: server.serverName,
|
|
83
|
+
}))),
|
|
84
|
+
openDraft: async (text) => { /* start-session → Host setDraft,不发送 */ },
|
|
85
|
+
showMessage: (message, type) => { /* type 为 'success' 或 'error' */ },
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// 卸载面板时
|
|
89
|
+
dispose();
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
模块不读取 API、storage、真实连接、凭据或业务结果,也不提供粘贴 URL/Token/Header 值的输入框。预览本身不产生外部写入;复制、下载和 `openDraft(text)` 都要求独立点击。`openDraft` 只接收已生成的安全 JSON,文本只进入新会话草稿,不自动发送。样式在模块内按 `.mcp-safe-template-share` 作用域注入,无第三方依赖。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 分享体验作者素材索引
|
|
2
|
+
|
|
3
|
+
本索引帮助作者区分真实业务证据、真实界面观察、Mock 界面和仅有流程/测试的材料。素材可引用不等于流程已经验收;每次分享仍应由用户主动编辑,并按实际状态填写“成功 / 失败 / 未测试”。
|
|
4
|
+
|
|
5
|
+
## 案例与教程
|
|
6
|
+
|
|
7
|
+
| 素材 | 证据类别 | 已证明 | 未证明 | 公开使用边界 |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| [企业简介首次成功案例](ONE-SUCCESS-CASE.md) | 历史真实只读调用的脱敏摘要 | 2026-10-16 已有 `qcc-company` 连接完成一次 `get_company_profile` 只读调用,返回主体名称一致 | v0.2.81 当前流程、首次安装、首次 OAuth、JSON 迁移、连接恢复 | 可引用文档中的脱敏结论;不得复制原始业务正文、账号或凭据 |
|
|
10
|
+
| [JSON 迁移教程](JSON-MIGRATION.md) | 流程文档 + localhost/合成测试 | 导入标准化、连接记录、Host 透传等代码路径有自动化覆盖 | 获授权真实 Server 的导入、发现和业务调用端到端成功 | 必须写“自动测试通过;真实 E2E 未测试/待验收” |
|
|
11
|
+
| [工具查找与恢复教程](TOOL-SEARCH-RECOVERY.md) | 流程文档 + localhost/合成测试 | 失败保留最后成功缓存、重新发现恢复、筛选/分页/限流等代码路径有自动化覆盖 | 真实连接从故障到恢复,以及恢复后的真实业务调用 | 缓存、健康检查和重新发现都不能写成业务调用成功 |
|
|
12
|
+
| [社区分享素材包](SHARING-KIT.md) | 作者指引 | 提供可复现提纲、披露和人工记录方法 | 尚未发生的发帖、转化或业务成功 | 不要求好评、Star 或转发;当前没有自动公开发布 |
|
|
13
|
+
|
|
14
|
+
## 截图与视频
|
|
15
|
+
|
|
16
|
+
仓库公开截图和 GIF 的尺寸、SHA-256、采集日期与来源版本见[截图来源说明](../screenshots/README.md)和 [`assets.json`](../screenshots/assets.json)。它们全部是无凭据 Mock 界面素材:
|
|
17
|
+
|
|
18
|
+
| 资产 | 来源版本 | 可以说明 | 不能说明 | 建议图注 |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
| `01`、`02`、`04`、`07` | v0.2.73 | 市场、OAuth 详情、JSON 导入、连接诊断的界面结构 | 真实授权、真实连接或业务调用成功 | “MCP连接器界面演示,v0.2.73 无凭据 Mock;实际界面以安装版本为准。” |
|
|
21
|
+
| `03` | v0.2.37 | 历史工具发现界面 | 当前版本行为或业务可用性 | “历史界面演示,v0.2.37 无凭据 Mock。” |
|
|
22
|
+
| `05`、`06`、`demo.gif` | v0.2.46 | 历史统一搜索、参数和演示流程 | 当前版本行为、真实恢复或业务成功 | “历史界面演示,v0.2.46 无凭据 Mock。” |
|
|
23
|
+
|
|
24
|
+
`workspace/p0-evidence-2026-10-16/` 中的图片是本机真实 DSH Market 搜索页面,但仅用于搜索排名复核,未上传公共仓库且仍需隐私审查;它们不能证明连接、恢复或业务调用成功。
|
|
25
|
+
|
|
26
|
+
## 不作为公开素材的证据
|
|
27
|
+
|
|
28
|
+
- `workspace/MCP-CONNECTOR-P1-QCC-READONLY-EVIDENCE-2026-10-16.md` 保存内部真实调用证据,可能包含不应扩散的原始业务内容。公开分享只引用 `ONE-SUCCESS-CASE.md` 中的脱敏结论。
|
|
29
|
+
- Token、API Key、OAuth 回调参数、账号/组织标识、本机绝对路径、完整对话和完整工具返回均不得进入体验草稿。
|
|
30
|
+
- npm 下载量、连接数量、工具缓存、草稿预览或“复制到会话草稿”成功均不是业务调用证据。
|
|
31
|
+
|
|
32
|
+
应用内接入契约与样式类见[分享体验模块接入说明](SHARING-UI-INTEGRATION.md)。
|
|
@@ -41,3 +41,5 @@
|
|
|
41
41
|
自愿提交脱敏案例或问题到 [Issues](https://github.com/duhu2000/dsh-mcp-connector/issues)。希望参与开发可看[贡献指南](../../CONTRIBUTING.md)。Star 表达认可,Fork 用于实际修改与贡献,都不是使用条件。
|
|
42
42
|
|
|
43
43
|
首轮邀请 5–10 位自愿体验者,手工记录安装、授权、工具发现、首次调用各阶段的成功/失败/未测试、实际耗时和阻塞原因。未计时不补估值,不新增遥测;样本仅用于改进体验,不外推整体转化率。npm 下载量也不等于独立用户或成功调用人数。
|
|
44
|
+
|
|
45
|
+
作者在引用案例、教程、截图或 GIF 前,应先查看[分享体验作者素材索引](SHARING-AUTHOR-ASSETS.md),区分历史真实只读摘要、流程/合成测试和 Mock 界面素材。应用内草稿模块的 P0 接入契约见[分享体验模块接入说明](SHARING-UI-INTEGRATION.md)。
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# 分享体验模块接入说明
|
|
2
|
+
|
|
3
|
+
独立模块位于 [`ui/sharing-experience.js`](../../ui/sharing-experience.js)。本文件只描述 P0 集成契约;当前模块不会自行出现在 `ui/index.html`,也不会自动读取或发布任何内容。
|
|
4
|
+
|
|
5
|
+
## 挂载接口
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import { mount } from './sharing-experience.js';
|
|
9
|
+
|
|
10
|
+
const dispose = mount(container, {
|
|
11
|
+
openDraft: async (text) => {
|
|
12
|
+
const session = await startSession();
|
|
13
|
+
await host.setDraft(session, text);
|
|
14
|
+
},
|
|
15
|
+
showMessage: (text, type) => showMessage(text, type),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// 面板卸载时调用
|
|
19
|
+
dispose();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
接口约束:
|
|
23
|
+
|
|
24
|
+
- `mount(container, { openDraft, showMessage })` 返回一个 `dispose()` 函数。
|
|
25
|
+
- `openDraft(text)` **只在用户点击“复制到会话草稿”后调用**。P0 负责复用现有 `start-session → Host setDraft` 流程;只写入输入草稿,不发送消息。
|
|
26
|
+
- `showMessage(text, type)` 是可选宿主提示;调用失败不会改变或发送草稿。
|
|
27
|
+
- 未提供 `openDraft` 时按钮禁用,预览与编辑仍可使用。
|
|
28
|
+
- 模块不接收会话、连接、工具缓存、工具返回、凭据或账号对象,不访问网络、storage、剪贴板或遥测接口。
|
|
29
|
+
|
|
30
|
+
## 纯函数接口
|
|
31
|
+
|
|
32
|
+
- `createSharingExperience(input)`:只接受 `task`、`versions`、`steps`、`limitations`(及固定 `schemaVersion`)。未知字段拒绝。
|
|
33
|
+
- `createSharingExperienceFromTemplate(templateId, versions)`:加载 `companyProfile`、`jsonMigration`、`toolRecovery` 三个公开教程模板;所有步骤默认“未测试”。
|
|
34
|
+
- `editSharingExperience(current, patch)`:显式编辑白名单字段,不修改原对象。
|
|
35
|
+
- `renderSharingExperiencePreview(draft)`:生成纯 Markdown 预览,转义用户文本。
|
|
36
|
+
- `createSharingCopyPayload(draft)`:返回纯文本载荷,固定 `copied: false`、`businessOutcome: unchanged`,不执行复制。
|
|
37
|
+
- `SHARING_AUTHOR_ASSETS`:提供案例、教程和 Mock 截图的来源/边界索引。
|
|
38
|
+
|
|
39
|
+
疑似 Bearer、API Key、Token/Secret、OAuth `code/state/token` 回调、`file:` URL,以及 macOS/Linux/Windows 用户绝对路径会被拒绝并要求先脱敏。版本字段为空时显示“未填写”;填写时必须是语义版本。
|
|
40
|
+
|
|
41
|
+
## 样式与依赖
|
|
42
|
+
|
|
43
|
+
模块无第三方依赖,不注入样式。P0 可在共享 UI 中按现有设计系统样式化以下类:
|
|
44
|
+
|
|
45
|
+
- `.sharing-experience`
|
|
46
|
+
- `.sharing-experience-form`
|
|
47
|
+
- `.sharing-experience-field`
|
|
48
|
+
- `.sharing-experience-steps`
|
|
49
|
+
- `.sharing-experience-step`
|
|
50
|
+
- `.sharing-experience-actions`
|
|
51
|
+
- `.sharing-experience-message`
|
|
52
|
+
- `.sharing-experience-preview`
|
|
53
|
+
|
|
54
|
+
预览节点使用 `<pre>.textContent`,不得改为把 Markdown 作为 HTML 注入。
|
|
55
|
+
|
|
56
|
+
## 测试
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
node --test test/sharing-experience.test.mjs
|
|
60
|
+
npm run check
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
专门测试覆盖模板默认状态、显式编辑、未知信号拒绝、凭据/回调/路径拒绝、Markdown 转义、素材证据分类、用户点击前不调用 `openDraft`、复制后业务状态不变、销毁监听器,以及源码无网络/storage/剪贴板/连接访问。
|
package/lib/catalog.js
CHANGED
|
@@ -42,6 +42,19 @@ export function loadBundledCatalog() {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/** Sharing trust root: fixed package catalog only, never merged/config/remote sources. */
|
|
46
|
+
export function bundledTemplateReferences() {
|
|
47
|
+
return loadBundledCatalog().filter((item) => item.published !== false).flatMap((item) => {
|
|
48
|
+
const descriptor = auditDescriptor(item);
|
|
49
|
+
return descriptor.servers.map((server) => ({
|
|
50
|
+
connectorId: descriptor.id,
|
|
51
|
+
serverKey: server.serverKey,
|
|
52
|
+
name: descriptor.name,
|
|
53
|
+
serverName: server.serverName,
|
|
54
|
+
}));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
45
58
|
/** 安全审计:目录禁止携带密钥、URL 协议白名单、header 名白名单。 */
|
|
46
59
|
export function auditDescriptor(descriptor) {
|
|
47
60
|
const oauthHttpResources = new Set(
|
package/lib/index.js
CHANGED
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
} from './constants.js';
|
|
27
27
|
import { defineConnectorDomain, ConnectionStore, GrantStore, CatalogStore, SnapshotStore, GovernanceStore, ConnectionScopeStore, ToolCatalogStore } from './stores.js';
|
|
28
28
|
import { normalizeConnectorDescriptor, normalizeConnectionRecord } from './schema.js';
|
|
29
|
-
import { loadBundledCatalog, fetchRemoteCatalogWithFallback, visibleDynamicDescriptors, mergeCatalog, listCatalog, auditDescriptor, auditRawDescriptor, readLimitedJson } from './catalog.js';
|
|
29
|
+
import { bundledTemplateReferences, loadBundledCatalog, fetchRemoteCatalogWithFallback, visibleDynamicDescriptors, mergeCatalog, listCatalog, auditDescriptor, auditRawDescriptor, readLimitedJson } from './catalog.js';
|
|
30
30
|
import { describeOAuthAuthorizationError, oauthAuthorize } from './connectors/oauth-connector.js';
|
|
31
31
|
import { buildManualRecord } from './connectors/manual-connector.js';
|
|
32
32
|
import { normalizeJsonImport } from './connectors/json-connector.js';
|
|
@@ -1897,6 +1897,14 @@ export async function apply(ctx, config) {
|
|
|
1897
1897
|
}
|
|
1898
1898
|
},
|
|
1899
1899
|
|
|
1900
|
+
async templateCatalogReferences() {
|
|
1901
|
+
try {
|
|
1902
|
+
return { ok: true, detail: { items: bundledTemplateReferences() } };
|
|
1903
|
+
} catch {
|
|
1904
|
+
return { ok: false, message: '随包公开目录不可用,未读取任何本机连接。' };
|
|
1905
|
+
}
|
|
1906
|
+
},
|
|
1907
|
+
|
|
1900
1908
|
async catalog({ category, keyword, workspaceId } = {}) {
|
|
1901
1909
|
const items = listCatalog(state.merged, { category, keyword, publishedOnly: true }).map((d) => {
|
|
1902
1910
|
const health = connectorHealth(d.id);
|