dsh-m 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/DESIGN.md +5 -2
- package/lib/client.js +30 -11
- package/package.json +2 -2
- package/registry.json +28 -17
package/README.en.md
CHANGED
|
@@ -40,7 +40,7 @@ The default registry includes DSH Skins, ModSearch, the Lark / QQ / Weixin / WeC
|
|
|
40
40
|
| **Installed** | What your web profile actually has, annotated "via market / non-market"; update badges, upgrade, two-step confirm uninstall; 📖 README preview (64KB cap) |
|
|
41
41
|
| **Settings** | Registry address draft with "Validate & apply / Restore default / Download default registry.json / Check entries reachability"; configured vs active address and status at a glance; force refresh; dsh-m self-update |
|
|
42
42
|
|
|
43
|
-
After any mutation a "⚡ Restart" banner appears — under systemd, the DSH launcher's `appExit` hook hands the restart back to a unit configured with `Restart=on-failure` or `Restart=always`, avoiding a `systemctl` helper inside the unit cgroup that is about to stop; if `appExit` is unavailable, the fallback uses a manager-owned transient `systemd-run` service and only then a detached helper. The client confirms the replacement by boot id and dismisses the banner, leaving DSH Web's own background connection recovery in control; it does not force a full-page reload during the auth/route handoff. The current DSH Web `0.1.5-rc.1` runtime has now live-loaded dsh-m `0.2.11`; `/dshm` ping returned version `0.2.11`, and an authenticated page request completed `303 → 200`. The reported 404 was not reproducible once the service stabilized; journal evidence showed repeated `status=75/TEMPFAIL` restarts during the incident. Live DSH `0.1.2-rc.1`, transient-fallback, and repeated install/uninstall E2E experiments remain pre-release gaps. Installs stream live pnpm progress (resolve → download → link → build).
|
|
43
|
+
After any mutation, the already-open Market and Installed views refresh the profile state together, keeping badges and cards in sync without closing and reopening the marketplace; a "⚡ Restart" banner appears — under systemd, the DSH launcher's `appExit` hook hands the restart back to a unit configured with `Restart=on-failure` or `Restart=always`, avoiding a `systemctl` helper inside the unit cgroup that is about to stop; if `appExit` is unavailable, the fallback uses a manager-owned transient `systemd-run` service and only then a detached helper. The client confirms the replacement by boot id and dismisses the banner, leaving DSH Web's own background connection recovery in control; it does not force a full-page reload during the auth/route handoff. The current DSH Web `0.1.5-rc.1` runtime has now live-loaded dsh-m `0.2.11`; `/dshm` ping returned version `0.2.11`, and an authenticated page request completed `303 → 200`. The reported 404 was not reproducible once the service stabilized; journal evidence showed repeated `status=75/TEMPFAIL` restarts during the incident. Live DSH `0.1.2-rc.1`, transient-fallback, and repeated install/uninstall E2E experiments remain pre-release gaps. Installs stream live pnpm progress (resolve → download → link → build).
|
|
44
44
|
|
|
45
45
|
## Agent tools (7)
|
|
46
46
|
|
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
| **已装** | web profile 实装列表,标注「市场安装 / 非市场安装」;可升级徽标、升级、两段式确认卸载;📖 README 预览(64KB 截断) |
|
|
41
41
|
| **设置** | registry 地址草稿 +「校验并应用 / 恢复默认 / 下载默认 registry.json / 检查条目可达性」;配置地址、生效来源与状态一目了然;强制刷新;dsh-m 自更新 |
|
|
42
42
|
|
|
43
|
-
安装 / 卸载 /
|
|
43
|
+
安装 / 卸载 / 升级完成后,当前已打开的市场页与已装页会一起重新读取 profile 状态并同步徽标/卡片,不需要关闭后重新打开插件市场;随后出现「⚡ 一键重启」横幅——受 systemd 管理时通过 DSH launcher 的 `appExit` 交给服务的 `Restart` 策略,避免在待停止 unit 的 cgroup 内启动 `systemctl` helper;无 `appExit` 的 systemd 兜底改用 manager-owned transient `systemd-run`,最后才退回 detached-helper。客户端按 boot id 确认新进程已恢复后关闭横幅,交由 DSH Web 自身的后台连接重试恢复页面,不强制整页刷新,避免认证/路由切换期间白屏。已完成当前 DSH Web `0.1.5-rc.1` 运行时的 live 核验:web profile 已加载 dsh-m `0.2.11`,重启后 `/dshm` ping 返回 `version: 0.2.11`,携带当前认证 token 的页面请求流程为 `303 → 200`;无认证请求会被拒绝。此次白屏截图对应的 404 在服务稳定后未复现;journal 显示截图时段发生多次 `status=75/TEMPFAIL` 重启,当前暂判定为重启/认证过渡窗口现象,未发现 dsh-m Host 路由崩溃。DSH `0.1.2-rc.1` live E2E、transient fallback live E2E,以及连续安装/卸载实验仍是正式发布前的验证 gap。安装过程实时显示 pnpm 进度(解析 → 下载 → 链接 → 构建)。
|
|
44
44
|
|
|
45
45
|
## Agent 工具(7 个)
|
|
46
46
|
|
package/docs/DESIGN.md
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"id": "dsh-skins", // slug,唯一
|
|
40
40
|
"name": "DSH Skins",
|
|
41
41
|
"description": "中文描述", // v1 只有中文
|
|
42
|
-
"category": "ui", // market|tools|ui|search|
|
|
42
|
+
"category": "ui", // market|tools|ui|search|other 五选一
|
|
43
43
|
"tags": ["主题"],
|
|
44
44
|
"source": "github", // npm|github
|
|
45
45
|
"npm": "可选;source=npm 时必填",
|
|
@@ -59,6 +59,9 @@
|
|
|
59
59
|
4. npm 条目可查;GitHub 条目 repo 存在;`icon`/`homepage` URL 可达(icon 允许为空)。
|
|
60
60
|
自定义 registry 不经过官方 CI——设置页对自定义源展示未校验信任提示。
|
|
61
61
|
|
|
62
|
+
### 2.4 收录文案(registry-copy-guide 定稿)
|
|
63
|
+
`description`/`tags` 的写法另见 [`docs/registry-copy-guide.md`](./registry-copy-guide.md):全条 ≤60 全角当量(对齐卡片收起态两行截断)、统一前置/依赖/兼容三种句式、依赖关系不入 tags。CI 对文案超限打软警告不阻断(§2.3 第 4 步之后追加)。
|
|
64
|
+
|
|
62
65
|
## 3. 安装 / 卸载 / 升级 / 重启
|
|
63
66
|
|
|
64
67
|
底层原语(本机实证):`dsh plugin --profile web add|remove|update`(转发 pnpm,作用于 `$DSH_HOME/profiles/web`)。**profile 的 `package.json` 就是唯一事实源**——不引入任何额外状态文件。
|
|
@@ -95,7 +98,7 @@ npm 安装 / GitHub 安装 / 升级 / 自升级 / 卸载是**同一个事务模
|
|
|
95
98
|
|
|
96
99
|
3 个视图,卡片展开式详情(不做独立详情页),**中文优先**,跟随 DSH Web 深色主题:
|
|
97
100
|
|
|
98
|
-
1. **市场页**(默认):registry 卡片流;搜索/分类为**服务端过滤**(Host 强制 `withLatest=true`、每页 50、1,000 条清单第一页只探测当前页);`MarketPanel` 是市场/已装数据唯一 owner(请求 generation + AbortController
|
|
101
|
+
1. **市场页**(默认):registry 卡片流;搜索/分类为**服务端过滤**(Host 强制 `withLatest=true`、每页 50、1,000 条清单第一页只探测当前页);`MarketPanel` 是市场/已装数据唯一 owner(请求 generation + AbortController 丢弃旧响应);安装/卸载/升级完成后通过统一协调器同时刷新市场与已装快照,不要求关闭并重新打开面板;分页控件 + 超过 200 条性能提示 + 默认/自定义/缓存/不可用短提示(不含本地路径);卡片详情保留 README markdown 预览与 npm/GitHub 官方外链。
|
|
99
102
|
2. **已装页**:profile 实际安装列表,标注来源(市场/非市场/未知);registry 不可用时仍列出已装并标记;「可升级 → x.y.z」徽标 +「升级」;「卸载」。
|
|
100
103
|
3. **设置页**:registry 地址草稿 +「校验并应用」(先校验候选再写 settings,失败不落盘)/「恢复默认」/「下载默认 registry.json」(不改当前配置)/「检查条目可达性」(probe 统计 + 最多 100 条 issue,只读不改配置);同时展示配置地址、当前生效配置、生效来源与 configStatus(含 rejected/回滚原因与维护性 warnings);完整本地路径仅在此页显示。registry 配置为 **live 生效,不出现安装类重启横幅**;安装/卸载/升级仍保留重启横幅。
|
|
101
104
|
|
package/lib/client.js
CHANGED
|
@@ -410,6 +410,23 @@ var init_restart_wait = __esm({
|
|
|
410
410
|
}
|
|
411
411
|
});
|
|
412
412
|
|
|
413
|
+
// src/client/view-refresh.js
|
|
414
|
+
var view_refresh_exports = {};
|
|
415
|
+
__export(view_refresh_exports, {
|
|
416
|
+
refreshAfterMutation: () => refreshAfterMutation
|
|
417
|
+
});
|
|
418
|
+
async function refreshAfterMutation({ marketReload, installedReload }) {
|
|
419
|
+
await Promise.all([
|
|
420
|
+
marketReload(false),
|
|
421
|
+
installedReload()
|
|
422
|
+
]);
|
|
423
|
+
}
|
|
424
|
+
var init_view_refresh = __esm({
|
|
425
|
+
"src/client/view-refresh.js"() {
|
|
426
|
+
"use strict";
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
|
|
413
430
|
// src/client/main.jsx
|
|
414
431
|
var React = require("react");
|
|
415
432
|
var rd = require("react-dom");
|
|
@@ -423,6 +440,7 @@ var { ExtLink, MdImg, renderMarkdown } = createMarkdown2(h);
|
|
|
423
440
|
var { installedViewModel: installedViewModel2, registrySourceKey: registrySourceKey2 } = (init_installed_view(), __toCommonJS(installed_view_exports));
|
|
424
441
|
var { pickPayload: pickPayload2, parseToolArgs: parseToolArgs2 } = (init_tool_view(), __toCommonJS(tool_view_exports));
|
|
425
442
|
var { RESTART_POLL_MS: RESTART_POLL_MS2, RESTART_DEADLINE_MS: RESTART_DEADLINE_MS2, nextRestartWait: nextRestartWait2, isAmbiguousRestartRequestError: isAmbiguousRestartRequestError2 } = (init_restart_wait(), __toCommonJS(restart_wait_exports));
|
|
443
|
+
var { refreshAfterMutation: refreshAfterMutation2 } = (init_view_refresh(), __toCommonJS(view_refresh_exports));
|
|
426
444
|
var ZH = {
|
|
427
445
|
"market.title": "\u63D2\u4EF6\u5E02\u573A",
|
|
428
446
|
"tab.market": "\u5E02\u573A",
|
|
@@ -1056,7 +1074,7 @@ function RestartBanner({ note, onDone }) {
|
|
|
1056
1074
|
phase === "idle" && !err ? h("button", { className: "dshm-btn sm", onClick: () => onDone(false) }, lookup("common.later")) : null
|
|
1057
1075
|
);
|
|
1058
1076
|
}
|
|
1059
|
-
function MarketTab({ notify, market }) {
|
|
1077
|
+
function MarketTab({ notify, market, onMutation }) {
|
|
1060
1078
|
const { data, loading, error, reload, query, updateQuery } = market;
|
|
1061
1079
|
const [openId, setOpenId] = useState(null);
|
|
1062
1080
|
const [busyId, setBusyId] = useState(null);
|
|
@@ -1084,7 +1102,7 @@ function MarketTab({ notify, market }) {
|
|
|
1084
1102
|
needsRestart: true,
|
|
1085
1103
|
text: lookup("notify.installed", { pkg: res.pkg, version: res.version ? ` v${res.version}` : "" }) + (res.usedAllowAllBuilds ? lookup("notify.allowbuilds") : "")
|
|
1086
1104
|
});
|
|
1087
|
-
await reload(false);
|
|
1105
|
+
await (onMutation ? onMutation() : reload(false));
|
|
1088
1106
|
} catch (e) {
|
|
1089
1107
|
notify({ kind: "err", text: lookup("failed.install", { err: e && e.message || e }) });
|
|
1090
1108
|
} finally {
|
|
@@ -1242,7 +1260,7 @@ function ReadmeBlock({ pkg }) {
|
|
|
1242
1260
|
state.truncated ? h("div", { className: "dshm-md-note" }, lookup("readme.truncated")) : null
|
|
1243
1261
|
);
|
|
1244
1262
|
}
|
|
1245
|
-
function InstalledTab({ notify, installed }) {
|
|
1263
|
+
function InstalledTab({ notify, installed, onMutation }) {
|
|
1246
1264
|
const { loading, data, error, reload } = installed;
|
|
1247
1265
|
const [openPkg, setOpenPkg] = useState(null);
|
|
1248
1266
|
const [readmePkg, setReadmePkg] = useState(null);
|
|
@@ -1256,7 +1274,7 @@ function InstalledTab({ notify, installed }) {
|
|
|
1256
1274
|
needsRestart: true,
|
|
1257
1275
|
text: lookup("notify.uninstalled", { pkg: res.pkg }) + (res.liveDisabled ? lookup("notify.livedisabled") : "") + (res.leftovers && res.leftovers.length ? lookup("notify.leftovers", { paths: res.leftovers.join(", ") }) : "")
|
|
1258
1276
|
});
|
|
1259
|
-
await reload();
|
|
1277
|
+
await (onMutation ? onMutation() : reload());
|
|
1260
1278
|
} catch (e) {
|
|
1261
1279
|
notify({ kind: "err", text: lookup("failed.uninstall", { err: e && e.message || e }) });
|
|
1262
1280
|
} finally {
|
|
@@ -1276,7 +1294,7 @@ function InstalledTab({ notify, installed }) {
|
|
|
1276
1294
|
to: res.version ? `v${res.version}` : res.sha ? res.sha.slice(0, 7) : "latest"
|
|
1277
1295
|
}) + (res.usedAllowAllBuilds ? lookup("notify.upgradehint") : "")
|
|
1278
1296
|
});
|
|
1279
|
-
await reload();
|
|
1297
|
+
await (onMutation ? onMutation() : reload());
|
|
1280
1298
|
} catch (e) {
|
|
1281
1299
|
notify({ kind: "err", text: lookup("failed.upgrade", { err: e && e.message || e }) });
|
|
1282
1300
|
} finally {
|
|
@@ -1632,10 +1650,11 @@ function MarketPanel({ onClose }) {
|
|
|
1632
1650
|
const [tab, setTab] = useState("market");
|
|
1633
1651
|
const market = useMarketData();
|
|
1634
1652
|
const installed = useAsync(() => api("installed"), []);
|
|
1635
|
-
const
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1653
|
+
const refreshViews = useCallback(
|
|
1654
|
+
() => refreshAfterMutation2({ marketReload: market.reload, installedReload: installed.reload }),
|
|
1655
|
+
[market.reload, installed.reload]
|
|
1656
|
+
);
|
|
1657
|
+
const onRegistryChanged = refreshViews;
|
|
1639
1658
|
const counts = {
|
|
1640
1659
|
market: market.data ? market.data.total : null,
|
|
1641
1660
|
installed: installed.data ? installed.data.items.length : null
|
|
@@ -1693,8 +1712,8 @@ function MarketPanel({ onClose }) {
|
|
|
1693
1712
|
h(
|
|
1694
1713
|
"div",
|
|
1695
1714
|
{ className: "dshm-body" },
|
|
1696
|
-
tab === "market" ? h(MarketTab, { notify, market }) : null,
|
|
1697
|
-
tab === "installed" ? h(InstalledTab, { notify, installed }) : null,
|
|
1715
|
+
tab === "market" ? h(MarketTab, { notify, market, onMutation: refreshViews }) : null,
|
|
1716
|
+
tab === "installed" ? h(InstalledTab, { notify, installed, onMutation: refreshViews }) : null,
|
|
1698
1717
|
tab === "settings" ? h(SettingsTab, { notify, onRegistryChanged }) : null
|
|
1699
1718
|
),
|
|
1700
1719
|
toast ? h(
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-m",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "DSH
|
|
3
|
+
"version": "0.2.13",
|
|
4
|
+
"description": "可自定义收录清单的 DSH 插件市场:收录、安装、卸载、升级一站完成,附 agent 工具与 dshm CLI。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "lib/host.js",
|
package/registry.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
{
|
|
5
5
|
"id": "dsh-m",
|
|
6
6
|
"name": "DSH Marketplace",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "可自定义收录清单的 DSH 插件市场:收录、安装、卸载、升级一站完成,附 agent 工具与 dshm CLI。",
|
|
8
8
|
"category": "market",
|
|
9
9
|
"tags": ["市场", "插件管理"],
|
|
10
10
|
"source": "npm",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
{
|
|
16
16
|
"id": "dsh-skins",
|
|
17
17
|
"name": "DSH Skins",
|
|
18
|
-
"description": "
|
|
18
|
+
"description": "DSH Web 皮肤插件:多套品牌皮肤侧栏热切换,一键回到官方界面。",
|
|
19
19
|
"category": "ui",
|
|
20
|
-
"tags": ["主题", "美化"],
|
|
20
|
+
"tags": ["皮肤", "主题", "美化"],
|
|
21
21
|
"source": "npm",
|
|
22
22
|
"npm": "@iasiv5/dsh-skins",
|
|
23
23
|
"github": "iasiv5/dsh-skins",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{
|
|
27
27
|
"id": "dsh-copilot-auth",
|
|
28
28
|
"name": "DSH Copilot Auth",
|
|
29
|
-
"description": "
|
|
29
|
+
"description": "为内置 Copilot 提供方补设备码登录/注销设置页,预置开箱路由;凭据入内置凭据库,模型目录兜底不覆盖定制。",
|
|
30
30
|
"category": "tools",
|
|
31
31
|
"tags": ["Copilot", "认证", "模型接入"],
|
|
32
32
|
"source": "npm",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
{
|
|
38
38
|
"id": "dsh-skip-browser-auth",
|
|
39
39
|
"name": "DSH Skip Browser Auth",
|
|
40
|
-
"description": "
|
|
40
|
+
"description": "替换官方 Connection 提供方跳过 BrowserAuth,免输 Token;已适配 0.1.2-rc.1 与 0.1.5-rc.1/rc.2,详见仓库。",
|
|
41
41
|
"category": "tools",
|
|
42
42
|
"tags": ["BrowserAuth", "连接", "安全"],
|
|
43
43
|
"source": "npm",
|
|
@@ -45,10 +45,21 @@
|
|
|
45
45
|
"github": "iasiv5/dsh-skip-browser-auth",
|
|
46
46
|
"homepage": "https://github.com/iasiv5/dsh-skip-browser-auth"
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
"id": "dsh-surf",
|
|
50
|
+
"name": "DSH Surf",
|
|
51
|
+
"description": "网络冲浪入口:设置一级菜单一键打开自托管 Selkies/Chrome 远程桌面,视频流直连;需自建容器并挂认证反代。",
|
|
52
|
+
"category": "tools",
|
|
53
|
+
"tags": ["浏览器", "远程桌面", "Selkies", "网络冲浪"],
|
|
54
|
+
"source": "npm",
|
|
55
|
+
"npm": "@iasiv5/dsh-surf",
|
|
56
|
+
"github": "iasiv5/dsh-surf",
|
|
57
|
+
"homepage": "https://github.com/iasiv5/dsh-surf"
|
|
58
|
+
},
|
|
48
59
|
{
|
|
49
60
|
"id": "dsh-better-sidebar",
|
|
50
61
|
"name": "DSH Better Sidebar",
|
|
51
|
-
"description": "
|
|
62
|
+
"description": "开放的侧边栏底座,支持三方拓展注册侧边栏页面;内置文件编辑、终端、侧边对话、Git 与子代理页。",
|
|
52
63
|
"category": "ui",
|
|
53
64
|
"tags": ["侧边栏", "文件编辑", "终端", "Git"],
|
|
54
65
|
"source": "npm",
|
|
@@ -70,9 +81,9 @@
|
|
|
70
81
|
{
|
|
71
82
|
"id": "dsh-docs-panel",
|
|
72
83
|
"name": "DSH Docs Panel",
|
|
73
|
-
"description": "
|
|
84
|
+
"description": "侧边栏「全局文档」:全局 Markdown 笔记任何工作区可读,支持大纲跳转与一键转编辑器;需 better-sidebar ≥0.4.0。",
|
|
74
85
|
"category": "ui",
|
|
75
|
-
"tags": ["文档", "Markdown", "侧边栏"
|
|
86
|
+
"tags": ["文档", "Markdown", "侧边栏"],
|
|
76
87
|
"source": "npm",
|
|
77
88
|
"npm": "dsh-docs-panel",
|
|
78
89
|
"github": "mlosun/dsh-docs-panel",
|
|
@@ -81,9 +92,9 @@
|
|
|
81
92
|
{
|
|
82
93
|
"id": "dsh-server-deck",
|
|
83
94
|
"name": "DSH Server Deck",
|
|
84
|
-
"description": "
|
|
95
|
+
"description": "服务器卡片仪表盘:实时 CPU/内存/磁盘与趋势图(1h~30d),点卡片进 xterm 终端;可选集成 better-sidebar。",
|
|
85
96
|
"category": "tools",
|
|
86
|
-
"tags": ["服务器", "监控", "终端", "
|
|
97
|
+
"tags": ["服务器", "监控", "终端", "趋势图"],
|
|
87
98
|
"source": "npm",
|
|
88
99
|
"npm": "dsh-server-deck",
|
|
89
100
|
"github": "meyaomiao/dsh-server-deck",
|
|
@@ -92,9 +103,9 @@
|
|
|
92
103
|
{
|
|
93
104
|
"id": "dsh-flowglass",
|
|
94
105
|
"name": "DSH Flowglass",
|
|
95
|
-
"description": "
|
|
106
|
+
"description": "流镜:把当前会话画成三列泳道流程图,展示工具调用、并行分组与子代理分支;可选集成 better-sidebar。",
|
|
96
107
|
"category": "ui",
|
|
97
|
-
"tags": ["可视化", "流程图", "会话"
|
|
108
|
+
"tags": ["可视化", "流程图", "会话"],
|
|
98
109
|
"source": "npm",
|
|
99
110
|
"npm": "dsh-flowglass",
|
|
100
111
|
"github": "Iwctwbh/dsh-flowglass",
|
|
@@ -103,7 +114,7 @@
|
|
|
103
114
|
{
|
|
104
115
|
"id": "dsh-auth",
|
|
105
116
|
"name": "DSH Auth",
|
|
106
|
-
"description": "DSH Web
|
|
117
|
+
"description": "DSH Web 管理员认证:Argon2id 口令与可撤销会话,经 Caddy forward_auth 保护页面、API、下载、SSE 与 WebSocket。",
|
|
107
118
|
"category": "tools",
|
|
108
119
|
"tags": ["认证", "安全"],
|
|
109
120
|
"source": "npm",
|
|
@@ -114,7 +125,7 @@
|
|
|
114
125
|
{
|
|
115
126
|
"id": "deepseek-harness-lark",
|
|
116
127
|
"name": "DeepSeek Harness Lark",
|
|
117
|
-
"description": "飞书 / Lark
|
|
128
|
+
"description": "飞书 / Lark 通道插件:把飞书消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
118
129
|
"category": "other",
|
|
119
130
|
"tags": ["飞书", "Lark", "通道"],
|
|
120
131
|
"source": "npm",
|
|
@@ -125,7 +136,7 @@
|
|
|
125
136
|
{
|
|
126
137
|
"id": "deepseek-harness-qqbot",
|
|
127
138
|
"name": "DeepSeek Harness QQBot",
|
|
128
|
-
"description": "QQ Bot
|
|
139
|
+
"description": "QQ Bot 通道插件:把 QQ 机器人消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
129
140
|
"category": "other",
|
|
130
141
|
"tags": ["QQ", "通道"],
|
|
131
142
|
"source": "npm",
|
|
@@ -147,7 +158,7 @@
|
|
|
147
158
|
{
|
|
148
159
|
"id": "deepseek-harness-wecom",
|
|
149
160
|
"name": "DeepSeek Harness WeCom",
|
|
150
|
-
"description": "企业微信 AI Bot
|
|
161
|
+
"description": "企业微信 AI Bot 通道插件:把企业微信消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
151
162
|
"category": "other",
|
|
152
163
|
"tags": ["企业微信", "通道"],
|
|
153
164
|
"source": "npm",
|
|
@@ -158,7 +169,7 @@
|
|
|
158
169
|
{
|
|
159
170
|
"id": "deepseek-harness-dingtalk",
|
|
160
171
|
"name": "DeepSeek Harness DingTalk",
|
|
161
|
-
"description": "钉钉 Stream
|
|
172
|
+
"description": "钉钉 Stream 通道插件:把钉钉消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
162
173
|
"category": "other",
|
|
163
174
|
"tags": ["钉钉", "通道"],
|
|
164
175
|
"source": "npm",
|