🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

飞书助手 Nirvana-Jie/dsh-lark-agent

DeepSeek Harness
Nirvana-Jie1 天前有提交已提供中文文档扫描:含敏感能力

离开电脑,也能在飞书里找到你的 DeepSeek Harness 助手

32.9/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Nirvana-Jie/dsh-lark-agent
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · platform
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/24) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 108 处,展示前 108 条)
  • 读取本地文件
    src/artifact-publisher.ts:182
    const file = join(directory, 'preview.bin'), info = await stat(file);
  • 读取本地文件
    src/artifact-publisher.ts:184
    const image = await readFile(file);
  • 删除本地文件递归
    src/artifact-publisher.ts:191
    } finally {await rm(directory, {recursive: true, force: true});}
  • 写入本地文件
    src/artifacts.ts:78
    await mkdir(store.directory, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/artifacts.ts:79
    const dir = await lstat(store.directory);
  • 写入本地文件
    src/artifacts.ts:81
    await chmod(store.directory, 0o700);
  • 读取本地文件
    src/artifacts.ts:84
    try {info = await lstat(path);} catch (error) {if ((error as NodeJS.ErrnoException).code === 'ENOENT') return store; throw error;}
  • 写入本地文件
    src/artifacts.ts:110
    await rename(temporary, join(this.directory, 'artifacts.json'));
  • 删除本地文件
    src/artifacts.ts:116
    await unlink(temporary).catch(() => undefined); throw unavailable();
  • 读取本地文件
    src/bridge.ts:134
    try { real = await realpath(path); } catch { return {reason: '找不到这个文件'}; }
  • 读取本地文件
    src/bridge.ts:138
    try { info = await stat(real); } catch { return {reason: '无法读取'}; }
  • 读取本地文件
    src/bridge.ts:864
    const workspace = await realpath(lane.saved?.cwd ?? lane.user.cwd).catch(() => undefined);
  • 写入本地文件
    src/card-actions.ts:94
    await mkdir(directory, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/card-actions.ts:95
    const directoryStat = await lstat(directory);
  • 写入本地文件
    src/card-actions.ts:97
    await chmod(directory, 0o700);
  • 读取本地文件
    src/card-actions.ts:112
    const stat = await lstat(path);
  • 发起网络请求
    src/client/api.ts:191
    const value = await this.request(endpoint, payload, signal);
  • 发起网络请求
    src/client/api.ts:197
    const value = await this.request('profiles', {}, signal);
  • 发起网络请求
    src/client/api.ts:203
    try {return parseConnectionList(await this.request('connections', {}, signal));}
  • 发起网络请求
    src/client/api.ts:207
    const value = await this.request('add-connection', {}, signal);
  • 发起网络请求
    src/client/api.ts:215
    const value = object(await this.request('remove-connection', {connectionId: connectionId(id)}, signal));
  • 发起网络请求
    src/client/api.ts:223
    const value = await this.request('agent-catalog', {}, signal);
  • 读取本地文件
    src/config.ts:128
    return parseConfig(JSON.parse(await readFile(absolute, 'utf8')), dirname(absolute));
  • 写入本地文件
    src/direct-chats.ts:45
    await mkdir(directory, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/direct-chats.ts:46
    const directoryStat = await lstat(directory);
  • 写入本地文件
    src/direct-chats.ts:48
    await chmod(directory, 0o700);
  • 读取本地文件
    src/direct-chats.ts:53
    const before = await lstat(file);
  • 写入本地文件
    src/direct-chats.ts:103
    await rename(temporary, join(this.directory, 'direct-chats.json')); published = true;
  • 删除本地文件
    src/direct-chats.ts:108
    await unlink(temporary).catch(() => undefined);
  • 执行外部命令来自配置/变量
    src/lark-cli.ts:86
    child = spawn(options.executable ?? 'lark-cli', ['--profile', options.profile, 'event', 'status', '--current', '--json'],
  • 执行外部命令来自配置/变量
    src/lark-cli.ts:151
    return spawn(this.executable, ['--profile', this.profile, ...args], {
  • 读取本地文件
    src/lark-cli.ts:169
    const monitor = setInterval(() => {void lstat(path).then(info => {
  • 读取本地文件
    src/lark-cli.ts:176
    const info = await lstat(path);
  • 读取本地文件
    src/lark-cli.ts:178
    const bytes = await readFile(path);
  • 删除本地文件递归
    src/lark-cli.ts:181
    } finally {clearInterval(monitor); await rm(directory, {recursive: true, force: true});}
  • 写入本地文件
    src/ledger.ts:14
    await mkdir(directory, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/ledger.ts:17
    const rows: unknown = JSON.parse(await readFile(join(directory, 'messages.json'), 'utf8'));
  • 写入本地文件
    src/ledger.ts:38
    await writeFile(temp, JSON.stringify([...this.entries]), {mode: 0o600});
  • 写入本地文件
    src/ledger.ts:39
    await rename(temp, join(this.directory, 'messages.json'));
  • 读取本地文件
    src/lock.ts:55
    const [boot, stat] = await Promise.all([readFile('/proc/sys/kernel/random/boot_id', 'utf8'), readFile(`/proc/${pid}/stat`, 'utf8')]);
  • 执行外部命令固定命令
    src/lock.ts:61
    const start = await new Promise<string>((resolve, reject) => execFile('ps', ['-o', 'lstart=', '-p', String(pid)],
  • 读取本地文件
    src/lock.ts:73
    const info = await lstat(path);
  • 读取本地文件
    src/lock.ts:105
    try {info = await lstat(lock);} catch (error) {
  • 写入本地文件
    src/lock.ts:128
    try {await rename(lock, `${lock}.stale-${stale.ino}-${stale.token ?? 'untracked'}`);} catch (error) {
  • 读取本地文件
    src/lock.ts:138
    for (const name of await readdir(stateDir).catch(() => [])) {
  • 读取本地文件
    src/lock.ts:142
    const info = await lstat(path).catch(() => undefined);
  • 删除本地文件递归
    src/lock.ts:143
    if (info?.isDirectory() && Date.now() - info.ctimeMs > TOMBSTONE_RETENTION_MS) await rm(path, {recursive: true, force: true}).catch(() => undefined);
  • 写入本地文件
    src/lock.ts:150
    await mkdir(directory, {mode: 0o700});
  • 写入本地文件
    src/lock.ts:154
    await writeFile(join(directory, OWNER_FILE), JSON.stringify(owner), {mode: 0o600, flag: 'wx'});
  • 写入本地文件
    src/lock.ts:155
    await writeFile(join(directory, 'pid'), String(process.pid), {mode: 0o600, flag: 'wx'});
  • 删除本地文件递归
    src/lock.ts:157
    await rm(directory, {recursive: true, force: true});
  • 写入本地文件
    src/lock.ts:169
    await mkdir(stateDir, {recursive: true, mode: 0o700});
  • 写入本地文件
    src/lock.ts:175
    try {await rename(directory, path);} catch (error) {
  • 删除本地文件递归
    src/lock.ts:190
    if ((await readOwner(path)).token === token) await rm(path, {recursive: true, force: true});
  • 删除本地文件递归
    src/lock.ts:196
    await rm(directory, {recursive: true, force: true}).catch(() => undefined);
  • 执行外部命令固定命令
    src/media-input.ts:20
    const child = spawn('ffmpeg', ['-hide_banner', '-loglevel', 'error', '-protocol_whitelist', 'pipe', '-i', 'pipe:0',
  • 执行外部命令固定命令
    src/media-input.ts:55
    const child = spawn('ffmpeg', ['-version'], {shell: false, windowsHide: true, stdio: 'ignore'});
  • 写入本地文件
    src/memory-store.ts:165
    await mkdir(absolute, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/memory-store.ts:166
    const directoryInfo = await lstat(absolute);
  • 写入本地文件
    src/memory-store.ts:168
    await chmod(absolute, 0o700);
  • 读取本地文件
    src/memory-store.ts:172
    info = await lstat(file);
  • 写入本地文件
    src/memory-store.ts:178
    await chmod(file, 0o600);
  • 写入本地文件
    src/memory-store.ts:212
    await rename(temporary, join(this.directory, 'memory.json'));
  • 删除本地文件
    src/memory-store.ts:229
    if (!renamed) await unlink(temporary).catch(() => undefined);
  • 写入本地文件
    src/model-preferences.ts:125
    await mkdir(absolute, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/model-preferences.ts:126
    const directoryInfo = await lstat(absolute);
  • 写入本地文件
    src/model-preferences.ts:128
    await chmod(absolute, 0o700);
  • 读取本地文件
    src/model-preferences.ts:131
    try {info = await lstat(path);}
  • 写入本地文件
    src/model-preferences.ts:172
    await rename(temporary, join(this.directory, FILE_NAME));
  • 删除本地文件
    src/model-preferences.ts:177
    await unlink(temporary).catch(() => undefined);
  • 读取本地文件
    src/native-presentation.ts:94
    const root = await realpath(cwd), html = nativePresentationHtml(draft), digest = createHash('sha256').update(html).digest('hex');
  • 写入本地文件
    src/native-presentation.ts:98
    await mkdir(directory, {mode: 0o700}).catch(error => {if (error.code !== 'EEXIST') throw error;});
  • 读取本地文件
    src/native-presentation.ts:99
    const info = await lstat(directory);
  • 读取本地文件
    src/onboarding/agents.ts:81
    next.workspace = await realpath(next.workspace);
  • 读取本地文件
    src/onboarding/agents.ts:82
    if (!(await stat(next.workspace)).isDirectory()) throw new Error();
  • 写入本地文件
    src/onboarding/controller.ts:482
    await mkdir(cwd, {recursive: true, mode: 0o700});
  • 发起网络请求
    src/onboarding/host.ts:25
    register(route: {path: string; methods: string[]; requestBody: 'buffered'; fetch(request: Request): Promise<Response>}): () => void | Promise<void>;
  • 发起网络请求
    src/onboarding/host.ts:103
    async fetch(request) {
  • 读取本地文件
    src/onboarding/host.ts:156
    try {await access(candidate, constants.X_OK); return candidate;} catch { }
  • 读取本地文件
    src/onboarding/host.ts:164
    const value = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')) as {name?: unknown; version?: unknown};
  • 执行外部命令来自配置/变量
    src/onboarding/lark-platform.ts:98
    child = spawn(executable, [...args], {shell: false, windowsHide: true, stdio: 'pipe', cwd: options.cwd, env: {
  • 读取本地文件
    src/onboarding/settings-store.ts:13
    try {return this.parse(JSON.parse(await readFile(join(this.directory, this.filename), 'utf8')));}
  • 写入本地文件
    src/onboarding/settings-store.ts:20
    await mkdir(this.directory, {recursive: true, mode: 0o700});
  • 写入本地文件
    src/onboarding/settings-store.ts:27
    await rename(temp, join(this.directory, this.filename));
  • 删除本地文件
    src/onboarding/settings-store.ts:32
    await unlink(temp).catch(() => undefined);
  • 读取本地文件
    src/onboarding/store.ts:47
    try {return connectionRecord(JSON.parse(await readFile(join(this.directory, 'connection.json'), 'utf8')));}
  • 写入本地文件
    src/onboarding/store.ts:53
    await mkdir(this.directory, {recursive: true, mode: 0o700});
  • 写入本地文件
    src/onboarding/store.ts:58
    await rename(temp, join(this.directory, 'connection.json'));
  • 删除本地文件
    src/onboarding/store.ts:59
    } catch (error) {await file.close().catch(() => undefined); await rm(temp, {force: true}); throw error;}
  • 请求外部主机registry.npmjs.org
    src/onboarding/updates.ts:32
    const response = await fetch(`https://registry.npmjs.org/${name.replace('/', '%2f')}`,
  • 发起网络请求
    src/onboarding/updates.ts:32
    const response = await fetch(`https://registry.npmjs.org/${name.replace('/', '%2f')}`,
  • 写入本地文件
    src/permission-preferences.ts:72
    await mkdir(store.directory, {recursive: true, mode: 0o700});
  • 读取本地文件
    src/permission-preferences.ts:73
    const info = await lstat(store.directory);
  • 写入本地文件
    src/permission-preferences.ts:75
    await chmod(store.directory, 0o700);
  • 读取本地文件
    src/permission-preferences.ts:78
    try {file = await lstat(path);}
  • 写入本地文件
    src/permission-preferences.ts:130
    await rename(temporary, join(this.directory, FILE_NAME));
  • 删除本地文件
    src/permission-preferences.ts:135
    await unlink(temporary).catch(() => undefined);
  • 写入本地文件
    src/session-store.ts:143
    await mkdir(directory, {recursive: true, mode: 0o700});
  • 写入本地文件
    src/session-store.ts:144
    await chmod(directory, 0o700);
  • 读取本地文件
    src/session-store.ts:148
    store.document = parseDocument(JSON.parse(await readFile(file, 'utf8')));
  • 写入本地文件
    src/session-store.ts:149
    await chmod(file, 0o600);
  • 写入本地文件
    src/session-store.ts:182
    await rename(temporary, file);
  • 删除本地文件
    src/session-store.ts:189
    await unlink(temporary).catch(() => undefined);
  • 写入本地文件
    src/session-store.ts:314
    rename(context: SessionContext, title: string): Promise<SavedSession> {
  • 写入本地文件
    src/topic-store.ts:77
    await mkdir(directory, {recursive: true, mode: 0o700});
  • 写入本地文件
    src/topic-store.ts:78
    await chmod(directory, 0o700);
  • 写入本地文件
    src/topic-store.ts:164
    await rename(temporary, join(this.directory, 'topics.json'));
  • 删除本地文件
    src/topic-store.ts:169
    await unlink(temporary).catch(() => undefined);
扫描于 2026/11/2(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-scope@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence@deepseek-ai/dsh-session-persistence-jsonl@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-lark-agent 不在电脑前时,也能用飞书 / Lark 联系你的 DeepSeek Harness 助手。 dsh-lark-agent 给运行中的 DeepSeek Harness 加一个飞书 / Lark 私聊入口:交办任务、讨论方案、接着聊之前的话题,手机上就能做。飞书有自己独立的会话,绝不会抢占桌面应用或网页里已经打开的聊天。 dsh-lark-agent 图文演示(飞书聊天界面用演示数据重绘,非录屏):从 Harness 设置页进入飞书私聊,返回图表和表单卡片 安装 / 更新 开始之前: - DeepSeek Harness 已在运行,能正常聊天,并且选好了默认模型:PC App 0.2.1-rc.5(0.2.1-rc.2 和 rc.3 也可以),或 Web / dsh 命令行 0.1.1-rc.2。 - 启用插件之前,先在同一台机器上装好官方 Lark 命令行(需要 Node.js / npm): npm install -g @larksuite/cli@1.0.98 lark-cli --version 不要运行 lark-cli config init 或 lark-cli auth login:扫码时插件会自己创建一个专用命令行配置档,而 config init 可能覆盖已有的配置档。
展开完整文档(README 剩余 1 节)
dsh-lark-agent

不在电脑前时,也能用飞书 / Lark 联系你的 DeepSeek Harness 助手。

dsh-lark-agent 给运行中的 DeepSeek Harness 加一个飞书 / Lark 私聊入口:交办任务、讨论方案、接着聊之前的话题,手机上就能做。飞书有自己独立的会话,绝不会抢占桌面应用或网页里已经打开的聊天。

dsh-lark-agent 图文演示(飞书聊天界面用演示数据重绘,非录屏):从 Harness 设置页进入飞书私聊,返回图表和表单卡片

安装 / 更新

开始之前:

- DeepSeek Harness 已在运行,能正常聊天,并且选好了默认模型:PC App 0.2.1-rc.5(0.2.1-rc.2 和 rc.3 也可以),或 Web / dsh 命令行 0.1.1-rc.2。
- 启用插件之前,先在同一台机器上装好官方 Lark 命令行(需要 Node.js / npm):

npm install -g @larksuite/cli@1.0.98
lark-cli --version

不要运行 lark-cli config init 或 lark-cli auth login:扫码时插件会自己创建一个专用命令行配置档,而 config init 可能覆盖已有的配置档。

在 DeepSeek Harness 桌面应用里安装

在侧边栏打开 插件 → 添加插件(Plugins → Add plugin),输入 dsh-lark-agent,点 安装(Install),再点 立即启用(Enable now)。如果应用提示重启,就重启。

用 dsh 命令行安装

dsh plugin 底层跑的是 pnpm,所以 pnpm 必须在你的 PATH 里:

dsh plugin --profile web add dsh-lark-agent@0.6.2 --allow-build=protobufjs

然后重启 dsh web。

[!NOTE]
--allow-build=protobufjs 允许 Lark SDK 的一个依赖运行它的安装脚本。不加这个参数,pnpm 11 会以 ERR_PNPM_IGNORED_BUILDS 报错退出,dsh 也就不会启用插件。如果已经踩到这个坑,运行:

dsh plugin --profile web approve-builds '!protobufjs'

! 表示跳过这个可选脚本(它只打印一行版本提示),让 dsh 把插件启用完。然后重启 dsh web。

更新

新版本发布满一天后,飞书设置页会显示一条提示,列出升级步骤(在桌面应用里还会直接帮你打开插件列表)。在那之前,不带精确版本的安装(包括 @latest)仍会选中上一个版本,因为 pnpm 11 会跳过发布不足 24 小时的版本。想在新版本发布后立刻装上,请用上面安装示例里的精确版本。如果安装选到了旧版本,而 DeepSeek Harness 判定它不兼容,请看排障。

应用 0.2.1-rc.5 要求插件 0.6.1 或更高版本;插件 0.6.0 只声明支持到 rc.3。发布后请用上面的安装命令,或改用源码构建的包。

1. 在飞书设置页点击暂停连接,并按升级里的说明做好备份。
2. 桌面应用:添加插件对话框会提示,安装新版本前必须先卸载第三方插件,所以在插件页卸载 dsh-lark-agent,再重新添加(用本地构建升级已在 rc.5 上验证过;更早的源码构建显示为 dsh-larkbot)。命令行:运行 dsh plugin --profile web update dsh-lark-agent@latest,然后重启 dsh web。
3. 点击恢复连接,确认机器人能回复。

连接飞书

按钮文字按界面原样用中文引用,并附英文释义。

1. 在桌面应用打开设置 → 飞书 agent(Settings → Feishu agent),或在网页端打开设置 → 插件 → 飞书 agent。选一个机器人,点击扫码创建并连接(scan to create and connect)。要再加一个 Agent,用添加机器人(add robot);每个机器人有各自的预设和工作区设置。
2. 用你自己的飞书账号扫码并确认。如果组织要求管理员审批,等审批通过后点击重新检查(check again)。
3. 点击打开飞书私聊(open private chat),用扫码的那个账号,把配对词(DSH-…,10 分钟内有效)单独作为一条纯文本消息发出去,内容要和显示的一模一样。如果系统询问,用这是我,完成连接(this is me)确认。
4. 页面显示已连接(connected)后,给机器人发条消息。

连接时的模型检查不会在 Harness 里创建「飞书连接测试」会话。飞书入口只在宿主在线时可用:应用关闭、网页宿主停止或电脑休眠时都不可用。

能做什么

| 在飞书里,你…… | 助手会…… |
| 发一条请求 | 用 Harness 自带的工具处理(网页搜索、读取页面、工作区文件等),回复实时流式写进一张卡片;思考和工具步骤折叠在卡片里,像应用里那样一步步展示,卡片末尾注明所用的模型、思考深度和权限模式 |
| 让 Harness 把工作委派给子代理 | 子代理的消息再次唤醒 Harness 时,把后续结果和更新后的交付物发回同一个话题,包括首次回复已经结束之后 |
| 使用多个助手 | 在一个页面里管理最多 10 个飞书机器人,每个都有自己的 Agent 预设、工作区、连接和历史;暂停某个机器人即可编辑它的设置。宿主提供预设时可以选择预设 |
| 在私聊 Harness 会话里发图片 | 通过宿主的持久附件读取 PNG、JPEG、WebP 或 GIF,前提是所选模型支持图片;最多 4 张,每张 10 MB |
| 发语音消息 | 先为该机器人点 开通语音权限,然后暂停、启用语音输入并保存。可转写最长 60 秒的中文 / 英文语音,并以文字回复;需要 FFmpeg,以及支持 ASR 的租户套餐 |
| 请求需要你确认的操作 | 发送确认卡片:点 允许一次 或 拒绝;5 分钟内没有答复就不会执行 |
| Harness 让你做选择 | 发送选择卡片:点一个选项,或填写后提交 |
| 点 本话题设置,或在话题内使用 /settings | 编辑该话题的模型、思考深度和权限模式;保存后从下一轮开始生效。底部设置菜单可以选择话题,或编辑新话题的默认值。完全访问权限需要确认 |
| 索要结果文件 | 把工作区里的文件直接发到聊天 |
| 要求配图讲解 | 在回复里展示私聊 Harness 会话工作区中的本地图片,并附上讲解 |
| 说「以后先说结论」 | 记住这个偏好 |
| 在话题内继续对话,或使用 /sessions、/new | 每段对话都留在各自的原生飞书话题里;在新话题的入口卡片下回复,或用可搜索、分页的下拉菜单重新打开早先的话题 |
| 要求把一些数字画成柱状图 | 用原生飞书图表卡片回复 |
| 要求先让你在选项之间挑选 | 发送表单卡片,你提交后继续 |
| 要求架构图或报告 | 创建飞书文档(图表用白板),仅与你一人只读共享;在 App 0.2.1-rc.2 / rc.3 / rc.5 中,在应用里打开该飞书会话还会显示本地预览 |
| 使用 /model、/thinking | 在话题内只改该话题的模型和思考深度,并与同一个 App 会话同步;在主聊天里改的是新话题的默认值 |

默认只回复你自己的私聊。在这个聊天里,助手就是你的 Harness 本身:它能用哪些工具、哪些操作需要你确认,都遵循你电脑上的权限设置。会话和记忆留在运行 Harness 的电脑上;消息会经过飞书和你的模型服务商。
在主聊天里发新请求会开一个话题;之后在这个话题里继续对话,上下文就能保持住。已授权的群聊也是同样的机制,但每条消息仍需 @ 提及。/new 会再开一个话题,之前的话题仍然保留。

须知

- 更多文档:命令、隐私、升级、聊天底部菜单、团队部署和故障排查见 DEVELOPMENT.md(中文)。
- 兼容性:已在 PC App 0.2.1-rc.2 和 dsh 命令行 / Web 0.1.1-rc.2 上完整验证。PC App 0.2.1-rc.3 通过真实主机契约测试,插件也能在其上加载并连接(rc.3 上的首次扫码配置尚未测试)。在 PC App 0.2.1-rc.5 上,已验证真实主机契约测试、本地包升级、插件加载、恢复及暂停/恢复现有连接、主机重启;rc.5 上的首次扫码配置和真实私聊回复尚未测试。其他版本、平台和租户尚未验证。
- 语言:设置页、机器人内置消息(/help、状态文本、卡片按钮、底部菜单)和介绍视频均为中文。

许可证

MIT。DeepSeek 和飞书 / Lark 的品牌资产归各自所有者,不在 MIT 许可证覆盖范围内;这是独立开源插件,并非官方产品。
预览分享卡片长什么样 ↓Nirvana-Jie/dsh-lark-agent
分享 · DeepSeek Harness Hub
Nirvana-Jie/dsh-lark-agent

离开电脑,也能在飞书里找到你的 DeepSeek Harness 助手

回到顶部