把 DSH 智能体接入飞书/Lark,扫码 30 秒上线,飞书里直接对话 Agent、收发图片文件、切换模型模式。
- 语言
- TypeScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add dsh-lark-link在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 amlyczz/dsh-lark-link:先查看仓库 https://github.com/amlyczz/dsh-lark-link 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
把 DeepSeek Harness(DSH)智能体接入飞书/Lark,让你在飞书聊天窗口里直接和 Agent 对话、跑工具、发图收图。扫码 30 秒创建一个飞书机器人,无需手动配置回调或开放平台。
核心能力
- 扫码一键创建飞书机器人,省去手动注册开放平台、配置回调和公网服务器
- 每个飞书会话绑定一个独立 Agent,工作区、模型、Agent 模式按飞书对话隔离
- 切换类命令(
/mode/permission/model)全部用卡片单选按钮,点一下即切换 - 出站消息走持久 Outbox(JSONL 落盘 + 幂等键 + at-least-once),插件/DSH 重启后自动续投不丢失
- 入站请求在交给 Agent 之前先持久化(WAL),中途崩溃后自动重新触发这条用户消息
- 飞书发的图片自动给多模态模型看,发文件做文本提取后并入提示词
- 模型主动回传本地文件/图片到当前飞书会话(工作区内 + 大小校验)
技术实现
- 语言: TypeScript
- 关键依赖:
@larksuiteoapi/node-sdk(飞书官方 SDK)、@deepseek-ai/cordis(DSH 插件运行时)、@deepseek-ai/dsh-*-*(DSH 业务服务)、qrcode(注册二维码)、fflate(诊断包压缩) - 架构模式: Cordis
dsh.bundle格式插件(cordis.patch.yml自动并入宿主 profile),分层:host(SDK 适配+认证)→inbound(传输+群触发+断连补偿+Inbound WAL)→application(命令路由+消息编排+诊断)→outbound(Outbox+事件转发+卡片)→sessions(每会话 Agent 管理)。同时附带一个 Web 客户端子包(./client)注入 DSH Web GUI 侧边栏,显示桥接状态和扫码面板 - 入口文件:
src/index.ts(Cordis 插件主入口,~2700 行装配层);客户端入口src/client/index.ts
适用场景
把 DSH 装进手机飞书,让 Agent 跟着你走:通勤路上让 Agent 帮你改代码、调数据、看图,不需要守在终端前。也适合把 Agent 拉进工作群,作为团队可对话的工具人;对每个飞书对话/群独立隔离工作区和会话,多人共用一个 DSH 实例互不干扰。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH 宿主 | 0.1.0-rc.6+ | 通过 @deepseek-ai/dsh-* 系列的多个 peer 依赖锁定,需与 DSH Web GUI 配套使用 |
| Node.js | >=24.0.0 | engines.node 字段声明 |
| 平台 | 跨平台 | macOS / Windows / Linux 均支持;Windows 路径、: 等保留字符在文件名/工作区切换中已加固处理 |
| 原生模块 | 无 | 仅依赖纯 JS 包,无 node-gyp/平台原生库 |
安装方式
dsh plugin --profile web add github:amlyczz/dsh-lark-link
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
groupPolicy | string | 群聊触发策略:open(免 @ 全触发)/ mention / keywords / reply | open |
groupKeywords | string[] | keywords 模式下的触发词列表 | ["lark","小斯"] |
alsoOnReply | boolean | 当用户回复机器人消息时是否也触发(reply/mention 策略相关) | true |
agentPreset | string | Agent preset:standard / code / minimal / cordis,或 GUI 自建 preset id | code |
permissionMode | string | Agent 权限档位:read-only / workspace-write / danger-full-access(仅作用于桥会话) | danger-full-access |
streaming.enabled | boolean | 启用 CardKit schema 2.0 流式卡片,逐字打印(默认关,节省流量) | false |
reactions.enabled | boolean | 表情回执(收到消息随机表情、完成时打 DONE) | true |
allowlist | string[] | 允许对话的飞书 open_id 白名单,空 = 不限制 | [] |
denyList | string[] | 直接拒绝的命令前缀列表(无回复无卡片) | [] |
workspaceRoot | string | 桥会话的工作区根目录(cwd),空 = 当前进程目录 | "" |
attachments.dir | string | 入站图片/文件落盘根目录(空 = 系统临时目录,重启生效) | "" |
attachments.retentionHours | number | 入站媒体保留时长(小时;0 = 永久保留),可用 /lark-config 热改 | 168(7 天) |
飞书应用凭据(appId / appSecret)存放在 DSH credentials 服务而非配置文件,扫码或环境变量
DSH_LARK_APP_ID/DSH_LARK_APP_SECRET写入。所有配置支持/lark-config key=value热改并立即生效。
常见问题
Q: 怎么把 DSH 装进飞书?
A: 安装插件后在 DSH Web GUI 输入框运行 /lark setup,侧边栏 Lark 面板会显示二维码;手机飞书扫码确认后自动创建飞书应用、订阅消息事件并授予所需权限。完成后 /lark start 启动桥接,飞书里搜索你的机器人发消息即可。
Q: 不想扫码,能不能手动填 appId/appSecret?
A: 可以。在环境变量里设 DSH_LARK_APP_ID 和 DSH_LARK_APP_SECRET(国际版加设 DSH_LARK_DOMAIN=lark),再运行 /lark setup,凭据会写入 DSH credentials 服务并跳过 QR 流程。
Q: 群聊必须 @ 机器人吗?
A: 默认 groupPolicy=open,免 @ 全触发,群聊里直接说话就行。需要收紧时用 /lark-config groupPolicy=mention|keywords|reply 热改;keywords 模式下默认触发词是「lark」和「小斯」,可改 groupKeywords。
Q: 消息会不会丢?插件崩了会怎样?
A: 出站消息全部经过持久 Outbox(JSONL 落盘、at-least-once、幂等键),插件或 DSH 进程被杀后下次启动自动续投;入站请求在交给 Agent 之前先写入 Inbound WAL,如果 Agent 处理中途崩溃,重启后这条用户消息会被自动重新触发,不静默丢请求。
Q: 飞书发的图片和文件 Agent 怎么看到?
A: 图片自动下载到本地(系统临时目录,默认保留 7 天)并生成视觉模型的 ImageBlock,多模态模型可识别;非视觉模型改走纯文本路径,会在提示词里告诉 Agent 图片已保存到本地路径,Agent 可用文件工具读取。文件则做有界文本提取后并入提示词。
Q: 怎么卸载?凭据会被清除吗?
A: 在飞书或 GUI 侧运行 /lark uninstall-clean:停止桥接、清除 DSH credentials 里的 appId/appSecret、删除状态目录(配置/路由/Outbox/WAL)。再 /lark setup 即可重新配置。仅删除插件包不会清凭据,状态保留。
Q: 出问题了怎么排查?
A: 在飞书给机器人发 /doctor,会回传一个 ZIP 诊断包(含当前会话的 DSH session log + 脱敏配置 + ISSUE.md 模板),贴给任意 AI 即可定位;/status 实时显示连接状态、Outbox 待发/失败条数、Inbound WAL 待补发数。
上手难度
入门 — 装插件 → /lark setup 扫码 → /lark start 三步就能用,常用配置通过 /lark-config key=value 热改无需重启,普通用户可独立完成。
已知问题与限制
- 飞书 CardKit 流式卡片依赖应用已开通
cardkit:card权限并使用较新版本飞书客户端;未开通或客户端过旧时首次创建失败会在聊天里提示一次,后续自动回退到普通消息发送 - 流式功能默认关闭,开启后(
/lark-config streaming.enabled=true)会显著增加飞书 OpenAPI 调用频次,需自行评估配额 /lark setup扫码通道有 30 秒二维码有效期;过期后重跑命令即可重新生成- 入站附件默认存系统临时目录(OS 可能随时回收),如需长期保留需将
attachments.dir指向持久目录并把attachments.retentionHours设为0
🪶 dsh-lark-link
DeepSeek Harness × 飞书/Lark 双向桥接 — 把你的 DSH 智能体装进飞书,扫码 30 秒上线,随时随地对话
中文
全网统一昵称:小斯syzs · B站 @小斯syzs · 抖音 · 小红书 · 快手(全网同名)
💬 小斯syzs 邀请你加入飞书群 —— 点此一键加入
DeepSeek Harness × 飞书/Lark 双向桥接插件 —— 把你的 DSH 智能体装进飞书:扫码 30 秒上线、消息零丢失、卡片化交互、每飞书会话独立 Agent。手机上随时给 Agent 派任务、看结果、切模型切模式——不用守着终端。
🌟 为什么选 dsh-lark-link
- 零门槛:扫码即建飞书应用,不用手搓开放平台、不用配回调、不用公网服务器
- 零丢失:出站 Outbox + 入站 WAL 双持久化,进程崩溃 / 插件热更 / dsh 重启,消息和回答都补得回来
- 零学习成本:所有切换类命令都是单选卡片,点一下即生效;DSH 原生命令(/goal /compact …)直接用
- 真 Agent:不是聊天机器人——bash/文件/子代理/工作流全套工具,飞书里跑完整 Harness
✨ 特性
| 能力 | 说明 |
|---|---|
| 🎯 一键认证 | /lark setup 扫码创建飞书应用(自动订阅消息事件 + 群聊全量 + 表情权限),30 秒上线,无需手搓开放平台;也支持 DSH_LARK_APP_ID/SECRET 手动通道 |
| 🧠 多模式 Agent | 标准 / Code / 极简 / Cordis preset + 你在 GUI 自建的 preset,飞书发 /mode 出单选卡片即切(默认 Code:一次执行多步工具调用,更快更省) |
| 🎛 权限分级 | 只读 / 工作区写 / Full access 三种权限,/permission 卡片即切;默认 Full access 全放行 |
| 🎨 卡片化命令 | /mode /permission /model 全部是单选按钮卡片——点一下即切换,不用记命令拼写;模型选择按供应商分组展示 |
| 💬 意图确认转发 | 模型提问(ask_user_question)→ 飞书意图确认卡片(选项按钮 + 下拉多选 + 自定义输入),答完模型继续,飞书里完成完整交互闭环 |
| 😊 表情回执 | 收到消息随机表情"已收到";回复完成 / 命令完成打 DONE ✅(只使用飞书实测有效 emoji) |
| 💪 出站零丢失 | 持久 Outbox(JSONL + at-least-once + 幂等键 + 分航道并行 + 失败离队不阻塞 + 周期清理),kill 重启自动续投;桥命令回复同样走 Outbox |
| 🆕 入站请求补发 | Agent 处理到一半插件/dsh 崩溃/重启,重启后自动重新触发这条用户消息(不再静默丢请求)——Inbound WAL 持久化 + 启动对账 + 次数上限/时间窗防空转;/status 显示待补发条数 |
| 🛡 连接自愈 | probe 驱动受控重连 + QuotaGovernor 配额熔断(窗口过期自动解除、自动重连)+ 断连补偿;环境代理自动规避 |
| 🔀 命令三级分流 | 桥特有命令桥处理;DSH 注册命令原生执行;/goal、未知 /xxx、普通消息原样注入 Agent(无拦截无门禁);skill 无前缀——直接描述任务,模型自动加载 |
| 📎 入站多媒体 | 飞书图片 → 视觉模型看图(attachment 存储);文件 → 有界文本提取进提示词 |
| 📤 出站多媒体 | 模型经 lark_send_local_file 主动回传本地图片/文件(工作区白名单 + 大小校验 + 格式自动降级) |
| 🩺 一键诊断 | /doctor → ZIP 诊断包(含当前会话完整 DSH session log + 脱敏配置 + ISSUE.md),发回飞书,贴给 AI 即可定位 |
| ✍️ Markdown 渲染 | 回复自动检测 markdown → CardKit 卡片渲染(标题/列表/代码块/表格),纯文本走文本消息 |
| 🌊 可选流式输出 | /lark-config streaming.enabled=true 热开 CardKit schema 2.0 流式卡片,逐字打印(默认关,省流量) |
| 🆕 会话管理 | /new 当前工作区新起会话(不进 Agent);/resume 恢复当前工作区的历史会话(点选/序号/id 前缀,接续历史上下文);/workspace <路径> 切换工作区(~ 展开,Windows 盘符/UNC 路径可用);重启后会话 id 持久化,不丢会话行 |
| 🖥 复用 DSH Web GUI | 桥 Agent = 原生 DSH session,聊天/流式/工具卡/设置全由 GUI 呈现;会话自动归入对应工作区(不再"未分组");Web 面板实时显示 Outbox/补发计数 |
| 👥 访问控制 | allowlist 限定可对话的 open_id 白名单;groupPolicy 群聊触发策略(open / mention / keywords / reply);denyList 命令前缀拒绝兜底 |
| 🔓 默认 Full access | 沙箱全访问 + 审批 never,零打扰 |
🚀 快速开始
前置:Node.js ≥ 24,已安装 DeepSeek Harness(npm i -g @deepseek-ai/dsh)。
安装(官方 dsh plugin 机制,无侵入)——包以官方 bundle 格式分发(package.json 的 dsh.bundle + cordis.patch.yml),安装后自动并入 profile 的 dsh.profile.bundles 层:
# 1. 安装插件(npm 官方包,装预构建产物,无需构建许可):
dsh plugin --profile web add dsh-lark-link@latest --ignore-scripts
# 升级:
# dsh plugin --profile web update dsh-lark-link --latest --ignore-scripts
#
# 或本地 tarball(先在源码目录 npm pack 生成,离线/内网友好):
# dsh plugin --profile web add ./dsh-lark-link-<version>.tgz --ignore-scripts
#
# 或 GitHub 源码(需 prepare 构建 + allowBuilds 许可):
# dsh plugin --profile web add github:amlyczz/dsh-lark-link
--ignore-scripts:飞书 SDK 的传递依赖 protobufjs 带一个可忽略的 postinstall,pnpm 11 安全策略会拦截并返回非零退出码;加此参数跳过(protobufjs 不执行 postinstall 完全可用)。若你的 pnpm 已全局放行,可不加。
--profile web:指定安装到哪个 profile(web / tui / headless)。dsh plugin是 pnpm 的转发命令,用法为dsh plugin --profile <name> <pnpm 参数>。想让飞书和 GUI 共用 web profile 就保持web。
每次发布后:更新到最新版
不要依赖 @latest:它读的是镜像返回的 dist-tags.latest 标签——npmmirror 等镜像的标签缓存可能没刷新(版本元数据已同步、tag 还指着旧版),pnpm 看到「已装版本 == tag」就报 Already up to date,哪怕新版早就发布了。tag 是镜像说了算,版本号是你说了算。
# 1. 绕过标签,直接看官方源的真实版本列表:
npm view dsh-lark-link versions --registry https://registry.npmjs.org
# 2. 显式版本号安装(最可靠,不依赖镜像标签):
dsh plugin --profile web add dsh-lark-link@<新版本号> --ignore-scripts
# 3. 或强制官方源再走 @latest:
dsh plugin --profile web add dsh-lark-link@latest --ignore-scripts --registry https://registry.npmjs.org
再遇 Already up to date 但怀疑有新版:先 dsh plugin --profile web outdated 看它认为的版本——outdated 都显示旧版,基本就是镜像标签没刷新,用上面的显式版本号绕开。装完重启 dsh web 生效。
# 2. 启动 DSH Web GUI
dsh web
# 3. 在 GUI 的输入框(或终端 CLI)执行:
/lark setup # 扫码创建飞书应用(30 秒,面板显示二维码)
/lark start # 启动桥接
然后飞书搜索你的机器人,发任意消息——收到表情回执 + 完整回复即端到端连通。群聊免 @,直接说话即可。
⌨️ 命令
DSH 侧(GUI 或终端)
/lark setup 扫码一键建应用(或 DSH_LARK_APP_ID/SECRET 手动通道)
/lark start|stop|restart|status 桥接生命周期与全链路健康
/lark uninstall-clean 清除凭据与状态目录
飞书侧(卡片化单选,无需记忆拼写)
| 类别 | 命令 | 行为 |
|---|---|---|
| 选择类 | /mode /permission /model | 单选按钮卡片,点选即切换 |
| 状态类 | /status /sessions /help | 全链路健康(含 Outbox/补发计数)/ 会话列表 / 帮助卡片 |
| 会话类 | /new /resume [序号|id] /stop /workspace <路径> | 新会话 / 恢复历史会话 / 停当前任务 / 切工作区 |
| 诊断 | /doctor | ZIP 诊断包(session log + 配置 + ISSUE.md) |
| 热改 | /lark-config key=value | 热改配置(如 groupPolicy=open、agentPreset=standard、streaming.enabled=true) |
| DSH 命令 | /goal /compact 等 | 原生执行,结果回飞书 |
| 多媒体 | 发图片/文件 | 图片→视觉模型;文件→文本提取 |
| 意图确认 | 模型提问 | 自动转飞书意图确认卡片,选项或输入作答 |
命令无拦截、无门禁:一切
/消息要么桥处理,要么原样交 DSH——绝不停默丢弃。skill 无前缀,直接说任务即可。
⚙️ 常用配置(/lark-config 热改,立即生效并持久化)
| 配置键 | 默认 | 说明 |
|---|---|---|
groupPolicy | open | 群聊触发策略:open(免 @ 全触发)/ mention / keywords / reply |
groupKeywords | ["lark","小斯"] | keywords 模式下的触发词 |
agentPreset | code | Agent preset(shipped:standard/code/minimal/cordis,或 GUI 自建 id) |
permissionMode | danger-full-access | 权限:read-only / workspace-write / danger-full-access |
streaming.enabled | false | CardKit 流式卡片(开=逐字打印) |
reactions.enabled | true | 表情回执 |
allowlist | [] | open_id 白名单,空 = 所有人可对话 |
denyList | [] | 命令前缀拒绝兜底 |
workspaceRoot | `` | 桥会话工作区根目录(空 = process.cwd()) |
attachments.retentionHours | 168 | 入站图片/文件的保留时长(小时,默认 7 天;0 = 永久保留)。默认存系统临时目录,到期自动清扫 |
attachments.dir | `` | 入站媒体根目录覆盖(空 = 系统 tmpdir;重启生效) |
凭据(appId/appSecret)存放在 DSH credentials 服务,不进配置文件;
/lark setup扫码自动写入。
🩺 遇到问题?
- 飞书发
/doctor,得到 ZIP 诊断包(完整 session log + 脱敏配置 + ISSUE.md 模板) - 把诊断包贴给任意 AI(或在 飞书群 里发出来),即可快速定位
/status可随时看连接 / Outbox / 补发 / 会话全链路健康
🛠 开发者
npm run dev:link # 链接本地 DSH checkout(类型检查/测试需要)
npm run check # tsc --noEmit
npm test # 162 项单元 + 集成测试
npm run build # tsdown → dist/(宿主 ESM + client bundle)
npm pack # 产出可分发 tarball
架构:桥 = Cordis 插件(dsh.bundle 格式),分层清晰:
host(SDK 适配/认证)→ inbound(传输/群触发/断连补偿/Inbound WAL)→ application(命令路由/消息编排/诊断)→ outbound(Outbox/事件转发/卡片)→ sessions(每会话 Agent 管理)。
CI(GitHub Actions):push/PR 自动跑类型检查 + 162 项测试 + 构建;发布 npm 走 tag release 的 Publish workflow。
💬 加入飞书群
小斯syzs 邀请你加入飞书群,可以交流使用问题、反馈建议、一起玩 DSH × 飞书:
📄 许可
MIT — 自由使用、修改、分发。
本项目为社区插件,与 DeepSeek、飞书或 Lark 无隶属关系。
English
DeepSeek Harness × Feishu/Lark bridge — put your DSH agent inside Feishu. Scan a QR code and go live in 30 seconds; chat from anywhere.
🌟 Why dsh-lark-link
- Zero setup friction: QR-scan app creation — no Open Platform fiddling, no callback URL, no public server
- Zero message loss: durable Outbox (outbound) + Inbound WAL — crashes, hot reloads, and dsh restarts all recover
- Zero learning curve: every toggle is a single-select card; native DSH commands (
/goal/compact…) just work - A real agent: full tool belt (bash / files / subagents / workflows) driven from Feishu
✨ Features
| Capability | Description |
|---|---|
| 🎯 One-click auth | /lark setup scans a QR to create the Feishu app (auto-subscribes message events + group-all + reactions). 30-second onboarding; manual DSH_LARK_APP_ID/SECRET channel also supported |
| 🧠 Multi-mode Agent | Standard / Code / Minimal / Cordis presets + your custom GUI presets; /mode shows a single-select card — tap to switch (default Code: multi-step tools in one shot) |
| 🎛 Permission tiers | Read-only / workspace-write / Full access; /permission card switches instantly (Full access by default) |
| 🎨 Card-based commands | /mode /permission /model are all single-select button cards — tap, no typing; models grouped by provider |
| 💬 Intent confirmation | Model questions (ask_user_question) land as Feishu intent-confirmation cards (option buttons + multi-select dropdown + custom text); answer and the agent resumes |
| 😊 Reaction receipts | Random "got it" reaction on inbound; DONE ✅ on completion (only Feishu-validated emojis) |
| 💪 Outbound zero-loss | Persistent Outbox (JSONL + at-least-once + idempotency + per-lane parallel + failure quarantine + periodic prune), resumes after kill/restart; bridge command replies ride the Outbox too |
| 🆕 Inbound request replay | If the agent dies / plugin reloads / dsh restarts MID-TURN, the interrupted user message is auto re-triggered on boot (no more silently dropped requests) — durable Inbound WAL + boot reconciliation + attempt/time caps; /status shows the pending-replay count |
| 🛡 Self-healing connection | Probe-driven controlled reconnect + QuotaGovernor circuit breaker (auto-unblocks and reconnects after the quota window) + missed-message compensation; auto-avoids proxy env |
| 🔀 3-tier command routing | Bridge commands → bridge; DSH commands → native; /goal, unknown /xxx, plain text → injected verbatim (no gates). Skills need no prefix — just describe the task |
| 📎 Inbound media | Feishu images → visual model (attachment-backed); files → bounded text extraction |
| 📤 Outbound media | Model sends local files/images via lark_send_local_file (workspace whitelist + size/format checks) |
| 🩺 One-click diagnostics | /doctor → ZIP bundle (full DSH session log + sanitized config + ISSUE.md) back to the chat |
| ✍️ Markdown rendering | Replies auto-render as CardKit cards (headings/lists/code/tables); plain text stays plain |
| 🌊 Optional streaming | /lark-config streaming.enabled=true hot-enables CardKit schema 2.0 streaming cards (off by default, saves traffic) |
| 🆕 Session management | /new opens a fresh session; /resume picks up a historical session of the current workspace (button/index/id-prefix); /workspace <path> switches (with ~, Windows drive/UNC paths OK); session ids persist across restarts |
| 🖥 Reuses DSH Web GUI | Bridge agents are native DSH sessions; conversations auto-group under their workspace; the web panel shows live Outbox/replay counters |
| 👥 Access control | allowlist restricts inbound to specific open_ids; groupPolicy (open / mention / keywords / reply); denyList command-prefix deny |
| 🔓 Full access by default | Sandbox full access + never-ask approvals |
🚀 Quickstart
Prerequisites: Node.js ≥ 24 and DeepSeek Harness installed (npm i -g @deepseek-ai/dsh).
dsh plugin --profile web add dsh-lark-link@latest --ignore-scripts
dsh web
/lark setup # scan QR (30s)
/lark start
Open Feishu, find your bot, send anything — reaction receipt + full reply = end-to-end. Group chats need no @-mention.
Install variants: local tarball (npm pack, then dsh plugin --profile web add ./dsh-lark-link-<version>.tgz --ignore-scripts) or GitHub source (github:amlyczz/dsh-lark-link, requires build approval). Upgrade with dsh plugin --profile web update dsh-lark-link --latest --ignore-scripts.
Updating after each release
Don't rely on @latest: it resolves the mirror's dist-tags.latest label — npmmirror-style mirrors can serve a stale tag (version metadata synced, tag still pointing at an older release), so pnpm sees Already up to date even though a newer version exists. The tag is what the mirror says; the version number is what you say.
# 1. See the real version list, bypassing tags:
npm view dsh-lark-link versions --registry https://registry.npmjs.org
# 2. Install by explicit version (most reliable):
dsh plugin --profile web add dsh-lark-link@<new-version> --ignore-scripts
# 3. Or force the official registry with @latest:
dsh plugin --profile web add dsh-lark-link@latest --ignore-scripts --registry https://registry.npmjs.org
Suspicious Already up to date? Run dsh plugin --profile web outdated first — if it also shows the old version, the mirror tag is stale; use an explicit version. Restart dsh web after installing.
⌨️ Commands (Feishu side)
- Selectors (single-select cards):
/mode/permission/model - Status:
/status/sessions/help - Sessions:
/new/resume [index|id]/stop/workspace <path> - Diagnostics:
/doctor(ZIP with session log) - Hot reload:
/lark-config key=value - DSH commands run natively:
/goal/compact… - Media: send images/files to the bot
- Intent confirmations auto-arrive as cards
⚙️ Configuration (/lark-config, hot-reloaded & persisted)
| Key | Default | Meaning |
|---|---|---|
groupPolicy | open | group trigger: open / mention / keywords / reply |
agentPreset | code | agent preset (standard/code/minimal/cordis or custom) |
permissionMode | danger-full-access | read-only / workspace-write / danger-full-access |
streaming.enabled | false | CardKit streaming cards |
reactions.enabled | true | reaction receipts |
allowlist | [] | open_id allowlist (empty = everyone) |
denyList | [] | command-prefix deny |
workspaceRoot | `` | workspace root for bridge sessions |
attachments.retentionHours | 168 | retention (hours) for inbound images/files (default 7 days; 0 = keep forever). Stored under the OS temp dir and swept by age |
attachments.dir | `` | inbound media root override (empty = OS tmpdir; applies after reload) |
Credentials (appId/appSecret) live in the DSH credentials service, never in config files.
🩺 Troubleshooting
Send /doctor in Feishu — you get a ZIP with the full session log, sanitized config, and an ISSUE.md template. Hand it to any AI (or drop it in the Feishu group). /status shows live connection / Outbox / replay health.
🛠 Development
npm run dev:link && npm run check && npm test && npm run build
162 unit + integration tests. GitHub Actions CI runs typecheck + tests + build on every push/PR; npm publishing rides the release-tagged Publish workflow.
Architecture (Cordis plugin, dsh.bundle format):
host (SDK adapter/auth) → inbound (transport/group policy/compensation/Inbound WAL) → application (command routing/orchestration/diagnostics) → outbound (Outbox/event forwarding/cards) → sessions (per-chat agent management).
💬 Join the Feishu group
小斯syzs invites you to join the Feishu group — ask questions, share feedback, and play with DSH × Feishu together:
📄 License
MIT — free to use, modify, and distribute.
This is a community plugin, not affiliated with DeepSeek, Feishu, or Lark.
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/amlyczz/dsh-lark-link)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。