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

原生编码工作台 skymecode/deepseek-harness-for-vscode

DeepSeek Harness
skymecode9 天前有提交已提供中文文档扫描:高危code

待发布更新修复了附带编辑器上下文时提问重复出现在回答之后的问题,保留流式回复及快速追问的显示顺序,并兼容原生子代理目录中…

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add skymecode/deepseek-harness-for-vscode
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/27) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包deepseek-harness-for-vscode(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖要求 0.2.1-rc.3 · 最新 0.2.1-rc.5 兼容
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 17:39:02

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 63 处,展示前 60 条)
  • 删除本地文件
    esbuild.mjs:9
    rm('dist/extension.cjs.map', { force: true }),
  • 删除本地文件
    esbuild.mjs:10
    rm('dist/runtime/gateway-runtime.mjs.map', { force: true }),
  • 删除本地文件
    esbuild.mjs:11
    rm('dist/webview/chat.js.map', { force: true }),
  • 读取本地文件
    src/editor/worktree-git.ts:72
    await stat(target)
  • 读取本地文件
    src/editor/worktree-git.ts:82
    const entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    src/editor/worktree-git.ts:114
    content = await readFile(gitDir, 'utf8')
  • 写入本地文件
    src/editor/worktree-git.ts:116
    await mkdir(dirnameLike(repoRoot, gitDir), { recursive: true })
  • 写入本地文件
    src/editor/worktree-git.ts:119
    await appendFile(gitDir, content.endsWith('\n') ? EXCLUDE_ENTRY : `\n${EXCLUDE_ENTRY}`)
  • 写入本地文件
    src/editor/worktree-service.ts:284
    await writeFile(patchFile, patch)
  • 删除本地文件
    src/editor/worktree-service.ts:290
    await rm(patchFile, { force: true }).catch(() => undefined)
  • 读取本地文件
    src/editor/worktree-service.ts:365
    const raw = await readFile(joinPathLike(root, '.git', DISK_REGISTRY_FILE), 'utf8')
  • 读取本地文件
    src/editor/worktree-service.ts:386
    const gitFile = await readFile(joinPathLike(worktreePath, '.git'), 'utf8')
  • 写入本地文件
    src/editor/worktree-service.ts:431
    await mkdir(dirnameLike(repoRoot, file), { recursive: true }).catch(() => undefined)
  • 写入本地文件
    src/editor/worktree-service.ts:432
    await writeFile(file, JSON.stringify(records, null, 2)).catch(() => undefined)
  • 发起网络请求
    src/gateway/node-gateway-client.ts:694
    return undiciFetch(input, request as Parameters<typeof undiciFetch>[1]) as Promise<Response>
  • 发起网络请求
    src/gateway/node-gateway-client.ts:716
    const LOOPBACK_DISPATCHER = new UndiciAgent({ connect: { timeout: 30_000 } })
  • 删除本地文件递归
    src/import/session-import-service.ts:100
    await Promise.all(leftovers.map((dir) => rm(dir, { recursive: true, force: true }).catch(() => undefined)))
  • 写入本地文件
    src/import/session-import-service.ts:281
    await mkdir(path.dirname(target), { recursive: true })
  • 写入本地文件
    src/import/session-import-service.ts:282
    await writeFile(target, entry.data)
  • 读取本地文件
    src/notifications/native-notifier.ts:20
    private readonly readProduct = async (root: string): Promise<unknown> => JSON.parse(await readFile(join(root, 'product.json'), 'utf8')),
  • 执行外部命令来自配置/变量
    src/notifications/native-notifier.ts:42
    const child = spawn(command.executable, [...command.args], {
  • 写入本地文件
    src/plugins/plugin-manager.ts:172
    await mkdir(vendorDir, { recursive: true })
  • 写入本地文件
    src/plugins/plugin-manager.ts:174
    await copyFile(source, path.join(vendorDir, filename))
  • 执行外部命令来自配置/变量
    src/plugins/plugin-manager.ts:213
    const child = spawn(launch.command, args, {
  • 写入本地文件
    src/plugins/plugin-manager.ts:258
    await writeFile(
  • 读取本地文件
    src/plugins/plugin-manager.ts:268
    return JSON.parse(await readFile(file, 'utf8')) as unknown
  • 读取本地文件
    src/runtime/bundled-runtime.ts:41
    access(entry, fsConstants.R_OK),
  • 读取本地文件
    src/runtime/bundled-runtime.ts:42
    access(node, process.platform === 'win32' ? fsConstants.R_OK : fsConstants.R_OK | fsConstants.X_OK),
  • 读取本地文件
    src/runtime/bundled-runtime.ts:43
    access(pnpm, fsConstants.R_OK),
  • 写入本地文件
    src/runtime/bundled-runtime.ts:77
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    src/runtime/bundled-runtime.ts:80
    await writeFile(wrapper, tooling.content, 'utf8')
  • 写入本地文件
    src/runtime/bundled-runtime.ts:81
    if (tooling.executable) await chmod(wrapper, 0o755)
  • 读取本地文件
    src/runtime/fallback-package-catalog.ts:44
    const value: unknown = JSON.parse(await readFile(file, 'utf8'))
  • 读取本地文件
    src/runtime/harness-home.ts:27
    if (!existsSync(legacySessionsRoot)) return { copied: 0, skipped: 0 }
  • 写入本地文件
    src/runtime/harness-home.ts:28
    mkdirSync(targetSessionsRoot, { recursive: true })
  • 读取本地文件
    src/runtime/harness-home.ts:31
    for (const project of readdirSync(legacySessionsRoot, { withFileTypes: true })) {
  • 读取本地文件
    src/runtime/harness-home.ts:37
    sessionNames = readdirSync(sourceProject, { withFileTypes: true })
  • 读取本地文件
    src/runtime/harness-home.ts:48
    if (!readdirSync(source, { withFileTypes: true }).some((entry) => entry.isFile() && SESSION_ARTIFACT_NAME.test(entry.name))) continue
  • 读取本地文件
    src/runtime/harness-home.ts:51
    if (existsSync(target)) {
  • 写入本地文件
    src/runtime/harness-home.ts:56
    mkdirSync(path.dirname(target), { recursive: true })
  • 读取本地文件
    src/runtime/harness-home.ts:122
    if (!existsSync(legacy)) {
  • 写入本地文件
    src/runtime/harness-home.ts:126
    mkdirSync(path.dirname(stable), { recursive: true })
  • 写入本地文件
    src/runtime/harness-home.ts:142
    mkdirSync(stable, { recursive: true })
  • 读取本地文件
    src/runtime/module-fallback-recovery.ts:29
    const canonicalHome = await realpath(home).catch((error: unknown) => {
  • 写入本地文件
    src/runtime/module-fallback-recovery.ts:55
    await mkdir(dirname(backup), { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/runtime/module-fallback-recovery.ts:56
    try { await rename(original, backup) }
  • 读取本地文件
    src/runtime/module-fallback-recovery.ts:80
    const stat = await lstat(entry).catch(missingOnly)
  • 读取本地文件
    src/runtime/module-fallback-recovery.ts:85
    const manifest = JSON.parse(await readFile(join(entry, 'package.json'), 'utf8')) as { dsh?: { moduleFallback?: { targets?: unknown } } } | null
  • 读取本地文件
    src/runtime/module-fallback-recovery.ts:95
    const stat = await lstat(directory).catch(missingOnly)
  • 读取本地文件
    src/runtime/profile-scope-prune.ts:27
    names = (await readdir(profileScopeDir, { withFileTypes: true }))
  • 写入本地文件
    src/runtime/profile-scope-prune.ts:41
    await mkdir(path.dirname(backup), { recursive: true })
  • 写入本地文件
    src/runtime/profile-scope-prune.ts:42
    await rename(path.join(profileScopeDir, name), backup)
  • 读取本地文件
    src/runtime/profile-scope-prune.ts:54
    const manifest = JSON.parse(await readFile(path.join(directory, 'package.json'), 'utf8')) as unknown
  • 读取本地文件
    src/runtime/projection-cache-recovery.ts:22
    const existing = candidates.filter((candidate) => existsSync(candidate))
  • 写入本地文件
    src/runtime/projection-cache-recovery.ts:26
    await mkdir(backup, { recursive: true })
  • 写入本地文件
    src/runtime/projection-cache-recovery.ts:29
    await rename(candidate, path.join(backup, path.basename(candidate)))
  • 写入本地文件
    src/runtime/web-runtime.ts:121
    await mkdir(home, { recursive: true })
  • 写入本地文件
    src/runtime/web-runtime.ts:172
    await writeFile(overlay, renderOverlay(configuration, gatewayPlugin, this.sharedHistoryValue ? sharedHome : runtimeHistoryHome, historyCompression), '
  • 执行外部命令来自配置/变量
    src/runtime/web-runtime.ts:241
    const child = spawn(launch.command, args, { cwd: home, env, windowsHide: true })
  • 执行外部命令固定命令
    src/runtime/web-runtime.ts:319
    const killed = spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

3 张 · 点击查看大图

功能亮点

  • 修复提问重复显示
  • 保留流式回复顺序
  • 兼容原生子代理目录

DeepSeek Harness 的 VS Code 原生编码智能体扩展。精简工作台,带会话管理、流式 Markdown、斜杠命令、插件中心,运行时零部署——不跑 WebUI,不用配 Harness

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness for VS Code 在 VS Code 中原生运行 DeepSeek Harness 的 AI 编码助手扩展。无需克隆上游仓库、安装 Node/npm 或手动部署 Harness;安装匹配平台的 VSIX 即可使用。 当前为社区维护的 0.6.1 代码及尚未发布的修复。源码内置官方 npm 包 @deepseek-ai/dsh@0.2.1-rc.3(Typert Remote 协议),已发布的 0.6.1 附件仍内置 0.2.1-alpha.1。DeepSeek Harness 仍处于 Developer Preview。 待发布更新修复了附带编辑器上下文时提问重复出现在回答之后的问题,保留流式回复及快速追问的显示顺序,并兼容原生子代理目录中的外部任务。详见更新日志。 运行时升级提示: Harness 已采用 V4 会话格式。恢复受支持的旧日志时会生成新一代文件,原文件仍保留;旧运行时无法读取新增的 V4 日志。建议升级前备份共享历史目录(默认 ~/.dsh)及扩展私有目录 ~/.dsh/vscode/harness-home,不要对正在使用的配置目录直接降级。依赖已移除的 ctx.agent 或运行时 Inbox API 的第三方插件需要自行适配。本扩展继续使用原生 VS Code 界面,不嵌套官方 Web UI。
展开完整文档(README 剩余 1 节)
DeepSeek Harness for VS Code

在 VS Code 中原生运行 DeepSeek Harness 的 AI 编码助手扩展。无需克隆上游仓库、安装 Node/npm 或手动部署 Harness;安装匹配平台的 VSIX 即可使用。

当前为社区维护的 0.6.1 代码及尚未发布的修复。源码内置官方 npm 包 @deepseek-ai/dsh@0.2.1-rc.3(Typert Remote 协议),已发布的 0.6.1 附件仍内置 0.2.1-alpha.1。DeepSeek Harness 仍处于 Developer Preview。

待发布更新修复了附带编辑器上下文时提问重复出现在回答之后的问题,保留流式回复及快速追问的显示顺序,并兼容原生子代理目录中的外部任务。详见更新日志。

运行时升级提示: Harness 已采用 V4 会话格式。恢复受支持的旧日志时会生成新一代文件,原文件仍保留;旧运行时无法读取新增的 V4 日志。建议升级前备份共享历史目录(默认 ~/.dsh)及扩展私有目录 ~/.dsh/vscode/harness-home,不要对正在使用的配置目录直接降级。依赖已移除的 ctx.agent 或运行时 Inbox API 的第三方插件需要自行适配。本扩展继续使用原生 VS Code 界面,不嵌套官方 Web UI。

启动优先使用官方运行时包解析器。仅在确认是旧版模块冲突时执行一次有备份的修复,不再在每次启动或安装插件前搬动普通配置包。

0.6.1 正式版更新

本次更新接入 DSH 0.2.1 原生能力,并精简当前工作台未使用的运行时资源:

- 后台任务:在“上下文 → 任务”查看进度、展开实时输出,并在确认后停止任务;断线续接、折叠取消订阅和流式焦点保持均已适配。
- 会话管理:原生置顶、工作区顺序、归档恢复,以及列出活动明细的“停止并归档”;搜索可同时找到普通和已归档会话。
- 定时提醒:当前 Profile 启用 Schedule 后,可在“上下文 → 定时任务”查看提醒卡片、删除任务和浏览投递历史;创建仍由 DSH 原生工具完成。
- 插件市场恢复:在线目录失败时显示来源和错误,保留本次运行中的缓存;重新打开面板可重试,不再误把三个内置条目显示成整个市场。
- 显示与兼容修复:思考不足一秒时显示 1s,改进跨平台文件引用跳转,并保留旧 code 模式的兼容声明。
- 更小的安装包:移除未使用的 LibreOfficeKit、官方 Web 文档预览及实验性语音资源。本地 macOS arm64 包约 94 MiB(98.58 MB),相比裁剪前约 196 MiB 减少一半以上;其他平台体积以发布附件为准。

如需安装已发布版本,请从 v0.6.1 正式版页面 下载对应平台 VSIX,安装后重新加载 VS Code。此版本不会自动发布到 Marketplace。完整中文变更见更新日志。

内核更新策略

本扩展会根据 DeepSeek Harness 上游版本的实际更新内容,有选择地升级内置内核(运行时),不会每发布一个上游版本就自动跟进。我们会评估与扩展相关的新功能、Bug 和安全修复,以及破坏性变更,完成兼容适配与回归验证后再引入,重点关注 Windows、macOS、Linux 的使用体验、已有会话历史和插件兼容性。早期 0.1.7 的能力核对记录在升级审计中;当前适配情况见本 README 和更新日志。

相比始终追随最新版本,我们优先保障稳定性和老用户的升级体验,减少未经充分验证的内核更新带来的回归问题。尚需验证或存在兼容风险的上游版本可能暂缓升级;扩展自身发布新版本时,也可能继续使用当前固定的内核版本。实际内置版本及升级注意事项会在本 README 和更新日志中说明。

功能

- 原生 VS Code 工作台:全部交互都在侧边栏完成;本地 Harness Gateway 只开放回环 API 传输,不再提供或嵌入官方 WebUI。
- 首次配置提示:未配置密钥时显示三步引导,可直接打开连接设置;隔离工作区会持续显示当前合并策略。
- 共享本机历史:扩展自带的运行时与独立安装的官方 DSH 可读取同一份已保存会话。无需额外安装官方 CLI;密钥和插件配置仍然隔离。
- 可分离工作台:可在编辑器区打开同步的对话面板,需要更大空间时可将其移到另一个 VS Code 窗口。
- 完整会话管理:持久化历史、新建、切换、重命名、分支、归档/恢复、导出,以及导入官方 DSH 会话 ZIP、ChatGPT 导出 ZIP 和其他 Agent 会话(通过 dsh-chat-import);切换 DSH 模式时以新模式开启新会话,上一段上下文压缩为隐藏摘要随下一条消息携带。
- Markdown 流式回复:支持标题、列表、表格、代码块、一键复制、安全外链及可点击跳转的工作区文件引用。
- 稳定增量渲染:流式更新保留推理/工具卡展开状态和用户滚动位置。
- 渐进式推理时间线:推理步骤出现时才创建节点,只连接同一轮已出现的推理步骤;结束后的时间线保留在可展开的过程区内。
- 会话标题:自动标题与手动重命名统一由官方会话服务管理。
- 逐轮文件更改:优先展示官方快照与历史差异,覆盖 shell 产生的改动;旧历史或快照不可用时标明仅有工具统计,不用当前工作区差异代替历史。
- 简洁的已完成轮次:思考、工具调用和中间说明收进“用时”折叠行,最终结论与文件更改保持可见。
- 阅读友好的流式输出:对话流式推进时仍可自由上滑查看历史内容——自动跟随会让位于你的滚动,仅在回到最底部后恢复。最终结论通过分隔线与思考块(无思考时位于消息顶部)清晰隔开。
- DeepSeek Harness 原生推理:推理以原生 reasoning 块呈现,默认折叠并实时更新摘要,用户可手动展开;流式更新保留展开状态。已完成思考的耗时显示下限为一秒。
- 编辑器上下文:选中代码会显示为可移除的上下文卡片;在输入框键入 @ 可模糊检索并附加工作区文件。
- 斜杠命令:支持 Harness 官方命令及 /model、/reasoning、/preset 扩展命令。
- Harness 原生能力:推理过程、工具调用、审批、结构化问题、Todo、Skills、Goal、Plan 和后台任务。
- 模型与 Agent 设置:模型能力和推理选项来自官方目录,新会话默认使用 deepseek-flash;PTC 预设使用 ptc,旧 code 会话保留兼容预设。
- Token 用量:在输入区显示当前会话输入和输出 Token。
- 原生 DSH 插件中心:搜索精选目录、按分类和原生兼容性筛选、查看已安装插件,或安装 npm/GitHub/本地/tarball 插件包。
- 安全的工作区合并默认值:新安装默认要求手动 Review / Merge;只有显式设置 deepseekHarness.worktreeAutoMerge 为 onTurnEnd 才自动合并隔离会话改动。
- 外部 MCP 服务:在 VS Code 设置中将 deepseekHarness.mcpServers 配置为 JSON 数组,扩展会把经过校验的 stdio 或 Streamable HTTP 条目写入 DSH Profile,并重启 Gateway;发现的工具会使用 mcp__github__create_issue 这类名称。toolCallTimeoutMs、maxInstructionBytes、failOnStartupError 和受限的 reconnect 选项会透传给 DSH 原生 MCP 客户端。
- 自动本地化:根据 VS Code 显示语言自动切换英文或简体中文。
- 免部署运行时:官方 dsh、pnpm 和独立 Node 22.22.3 随平台 VSIX 分发,生命周期由扩展管理。

快捷键:Windows/Linux 使用 Ctrl+Alt+H,macOS 使用 Cmd+Alt+H 打开工作台。

界面预览

以下截图使用 0.5.9 工作台界面和示例会话,不包含私人账户数据。此页展示中文界面,英文 README 展示对应英文界面。点击缩略图可查看原始分辨率截图。

0.5.9 工作台 —— 折叠过程、最终结论与逐轮文件更改 Flash/Pro、四种 DSH 模式与推理等级滑杆

安装

1. 如需安装已发布版本,请从 0.6.1 正式版页面 下载与你的平台匹配的 VSIX。
2. 打开 VS Code 扩展面板(Cmd/Ctrl+Shift+X)。
3. 点击右上角 ... → 从 VSIX 安装...,选择下载的文件。
4. 按提示重新加载 VS Code 窗口。

例如,Apple Silicon Mac 应选择 darwin-arm64 包。

快速开始

1. 打开要开发的代码项目。
2. 点击 Activity Bar 中的 DeepSeek Harness 图标。
3. 打开“连接设置”,配置 DeepSeek 官方来源或添加中转来源;也可以运行 DeepSeek Harness: 设置 API Key 为官方来源保存密钥。
4. 首次使用建议保持默认的手动合并策略;确认变更后再在设置中启用 onTurnEnd。
5. 在输入框描述任务并发送。

无需执行任何 Harness 安装或启动命令。

与官方 DSH 共享历史

扩展仍自带并启动经过测试的 Harness/Node 运行时,不要求单独安装官方 CLI,也不会自动替换成 PATH 中的任意版本。同一台机器、同一系统用户下,两个独立后端默认使用官方历史位置:

| 系统 | 共享历史根目录 |
| Windows | %USERPROFILE%\.dsh |
| macOS | ~/.dsh |
| Linux | ~/.dsh |

继承的 DSH_HOME 优先。官方 DSH 使用其他目录时,可在应用级设置 deepseekHarness.historyHome 中填写同一个绝对路径。仅共享 sessions/ 和 attachments/;扩展密钥、插件配置与缓存仍保存在 ~/.dsh/vscode/harness-home,归档和置顶使用扩展私有 Home 下的 DSH 原生工作区注册表,与独立启动的官方 DSH 仍各自保存。标签与 VS Code 历史筛选仍属于当前工作台。卸载 VS Code 扩展不会移除共享历史。

升级时通过官方日志编解码迁移旧私有目录/globalStorage 中的会话,原日志保留:相同记录不重复导入;单边追加的兼容历史仅在获得写权限后补齐;已分叉的历史,或目标正被占用的新副本,会另存为带“VS Code 历史副本”标记的分支。迁移记录避免反复导入。旧来源仍被占用时延后处理;迁移失败时,本次继续显示原私有历史并提示原因,不会静默切换成空历史。

打开 VS Code 的历史面板会刷新列表;官方 Web UI 可刷新页面发现另一端新建的会话。VS Code 默认按当前项目过滤,官方界面可能将 worktree 会话列在独立工作区或未分组列表中。共享的是已保存的历史,不是跨进程转发实时 token。同一会话仍受系统写锁保护:关闭持有它的后端后再从另一端继续,或新建分支;两边的模型密钥和插件分别配置。

两个运行时必须支持相同日志格式:本版使用 V4/DSH 0.2.1-rc.3。旧官方 CLI 无法读取新增的 V4 日志,需升级后使用共享功能;保留 V2/V3 原文件不代表支持降级双向同步。这不是云端、跨设备或 Windows/WSL 跨内核同步,请勿通过网络盘/同步盘同时运行共享日志。大版本升级前建议备份共享目录和原私有目录。

DSH 插件

点击工作台标题栏的 ⊞ 插件,可以直接浏览 dsh-plugin GitHub Topic 中的仓库。市场结果还会合并 Awesome DSH Plugin 的精选分类、中文介绍和 npm 安装参数。在“已安装”页可直接输入 npm 包、github:owner/repository、不含 shell 元字符的本地路径或 tarball URL。

0.5.9 插件中心 —— 展示内置目录示例,并非完整的实时 GitHub 市场

在线目录由 GitHub Topic 和精选目录合并;若网络失败,界面会报告失败来源并保留本次运行中已成功加载的结果,可点击右上角刷新重试。首次加载失败且没有缓存时,只显示三个扩展内置条目。

普通插件包改用运行中的官方 Plugin Manager 安装、取消、启停和卸载,并显示只读、被覆盖或需要重启的结果。Node/pnpm 随包提供,无需系统包管理器。可选 Routing Suite 保留预设安装编排及停机 CLI 流程。Super Injector 不再自动安装,用户已有安装仍保留。

插件提供的宿主工具、策略和运行时服务可以在本扩展中工作。部分插件还包含专门面向上游 DSH 浏览器应用的客户端 UI,这些界面无法由原生 VS Code 工作台通用渲染,因此会标记为 官方 Web UI。

市场卡片会把已知插件标记为 Agent 功能兼容、Agent 功能可用 · Web UI 不可用 或 仅官方 Web UI。纯主题、布局等 UI 插件不能改变原生工作台,因此安装按钮会被禁用;只有 GitHub 元数据、尚未进入精选目录的仓库会标记为 兼容性未知。

配置

当前源码使用 DSH 0.2.1-rc.3(npm next 渠道,扩展版本仍为 0.6.1)。在 VS Code 设置中,deepseekHarness.webSearchProvider 可选 messages(默认:Messages 搜索+本地 HTTP 抓取)或 search-api(原生 DeepSeek Search/Fetch API)。修改后重载工作台生效。直接 API 使用官方 DeepSeek 凭据,与聊天提供商独立,需账号具备对应 API 权限。关闭 deepseekHarness.webSearch 会禁用两种 DeepSeek 网页提供者,保留本地 HTTP 抓取。与官方 DSH 一致,Search API 请求可能附带触发问题的前 128 个字符。

DSH 0.2.1 的官方 DeepSeek 适配器仅支持 Messages,默认地址为 https://api.deepseek.com/anthropic。旧手工配置中的 llm-deepseek.protocol 需删除;需要 Chat Completions 的端点应配置为自定义提供商。第三方提供商的协议保持不变。

MCP 配置示例:

[
{
"serverName": "github",
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "$env:GITHUB_TOKEN" }
}
]

MCP 默认关闭。启用前请检查 MCP Server 的代码、权限和网络行为。

默认关闭 OTel、请求附带会话日志 dsh_session_log 和插件清单 dsh_plugin_packages。正常模型请求仍包含用户提交的消息、上下文和附件。

工作区文件使用官方持久上传凭据提交,支持任意文件类型(每个 20 MiB、每次总计 40 MiB、最多 8 个);选区文本继续由 VS Code 提供。交付文件可打开到 VS Code 编辑器或已安装的格式查看器。子代理会话暂不接收二进制附件。

本版不提供官方 Web 的 Office/PDF 内嵌预览和语音输入,对应的大型运行时已从 VSIX 排除,Office 转 PDF/文档预览 Profile 行已禁用。文件上传、编辑器打开和 DSH 文件 API 继续可用。会话终端恢复、SSH/Browser Use/Computer Use 专用界面尚未接入;新增这些功能需单独适配,不能只安装 Web UI 插件。实验性权限不会因升级自动开启。

| 设置 | 默认值 | 说明 |
| deepseekHarness.model | deepseek-flash | 新会话默认模型 |
| deepseekHarness.reasoningEffort | high | off / low / high / max |
| deepseekHarness.agentPreset | standard | 新会话默认 Agent Preset |
| deepseekHarness.provider | deepseek-official | 在扩展“连接设置”面板中选择的默认来源 |
| deepseekHarness.permissionMode | workspace-write | read-only / workspace-write / danger-full-access |
| deepseekHarness.autoAttachSelection | true | 发送时自动附加当前编辑器选区 |

提供商端点与只写凭据引用统一交给内置 Harness 设置/凭据服务管理。API Key 保存在扩展私有的 Harness Home 中,不会回传给 Webview,也不会写入项目 .vscode/settings.json。本地 OpenAI 兼容端点可以不填写 API Key。旧版 deepseekHarness.apiKey、baseUrl 和 providers 会在首次连接时迁移并清除。

可在“连接设置”面板中新增、编辑、测试或移除 OpenAI 兼容或 Anthropic Messages 来源。自定义来源通过上游 llm-pi-ai 适配器实时注册;测试连接可导入其公布的模型 ID,也可手动填写。本地端点(如 llama-server、llama-swap、Ollama 兼容服务)可以不填写 API Key。已配置的来源及其模型会按提供商分组显示在模型面板中。

模型输入能力、上下文窗口与推理选项来自官方 LLM 解析器。端点未公布上下文大小时,可填写 model-id:32k 等显式覆盖。编辑提供商保留已有模型声明,新建空目录不会虚构 DeepSeek 模型;扩展不再维护独立容量表或视觉名称猜测。

自动附加的选区最长为 16 KB,超出部分会截断。手动附加同一文件选区后,宿主不会再次自动附加。

命令

| 命令 | 说明 |
| DeepSeek Harness: 打开工作台 | 打开侧边栏工作台 |
| DeepSeek Harness: 在新窗口打开工作台 | 打开可分离的编辑器区工作台 |
| DeepSeek Harness: 重新加载工作台 | 重启运行时并重新连接 |
| DeepSeek Harness: 设置 API Key | 保存 API Key |
| DeepSeek Harness: 清除 API Key | 清除 API Key |
| DeepSeek Harness: 显示日志 | 打开诊断日志 |
| DeepSeek Harness: 导入会话 | 导入 DSH ZIP、ChatGPT ZIP 或其他 Agent 会话 |

系统通知

当前和后台会话工作结束后使用 Windows/macOS 原生系统通知,不再使用 VS Code 窗口内的完成弹窗。重复空闲事件、子 Agent 完成,以及在本扩展中主动停止都不会额外提醒。排队追问在队列处理结束、Agent 空闲时提醒一次;打开历史不会补发通知。审批和提问提示保持原样。

用户设置(立即生效,无需重启 Harness):

"deepseekHarness.systemNotifications.enabled": true,
"deepseekHarness.systemNotifications.sound": false,
"deepseekHarness.systemNotifications.includeConversationTitle": false

在命令面板运行 DeepSeek Harness:测试系统通知,无需调用模型即可测试。失败信息写入 DeepSeek Harness:显示日志,不会回退到窗口内弹窗。通知不会包含回复正文或详细错误;开启会话标题后,标题可能显示在锁屏上。

- macOS: 使用系统 AppleScript 通知服务。在“系统设置 → 通知”中允许对应发送者的通知和横幅(可能显示为 Script Editor/脚本编辑器/osascript,不是单独的 Harness 应用)。
- Windows: 使用系统 Windows PowerShell 调用 Windows Toast,读取当前 VS Code 的 AppUserModelID,兼容 Insiders。需要已安装、已注册开始菜单快捷方式的 VS Code;便携版或缺少通知身份的自定义构建可能无法显示。不会修改注册表,无需管理员权限或额外安装通知包。
- 系统权限、专注/勿扰模式、企业策略可能阻止横幅,即使系统提交已经成功。当前仅支持本地桌面扩展宿主,暂不支持 Linux、Remote SSH、WSL、容器和浏览器版 VS Code;断线期间结束的工作不会在重连后补发。

语言

扩展默认语言为英文,并提供简体中文语言包。命令、设置说明、宿主弹窗和对话工作台都会跟随 VS Code 的显示语言。修改显示语言后执行 Developer: Reload Window 即可生效。

安全与隐私

- Harness Gateway 只监听 127.0.0.1 随机端口。
- Webview 使用严格 CSP,不加载远程脚本或 iframe。
- 插件目录 JSON 由 Extension Host 获取并投影为严格校验的 UI 数据,文字统一通过 textContent 渲染。
- Markdown 原始 HTML 默认禁用,渲染结果经过 DOMPurify 白名单净化。
- Markdown 远程图片默认禁用;http(s) 外链会先经扩展宿主校验。
- 文件和命令访问由 permissionMode 与 Harness 审批策略控制。
- API Key 不发送给 Webview,也不会写入扩展日志。
- 第三方 DSH 插件属于受信任的 Extension Host 依赖,会在 Agent 沙箱之外运行;安装前请检查源码。

平台支持

扩展 ID 和 Marketplace 产品始终只有一个,但由于内置 Node、PTY 和 sandbox 包含原生二进制,需要分别构建平台 VSIX:

- macOS:darwin-arm64、darwin-x64
- Linux:linux-arm64、linux-x64
- Windows:win32-arm64、win32-x64

当前 GitHub Actions 托管矩阵覆盖 darwin-arm64、linux-arm64、linux-x64 和 win32-x64。其他架构需要自托管 runner 或本机打包。

开发与打包

npm install
npm run check-types
npm run lint
npm test
npm run compile
npm run package

npm run package 会根据当前操作系统和 CPU 架构生成对应 VSIX。npm ci 会执行原生依赖所需的生命周期脚本,因此请只在可信提交和锁文件上构建。

项目提交信息统一使用英文。架构与安全边界详见 docs/ARCHITECTURE.md。

许可证

扩展代码采用 MIT License。DeepSeek Harness、Node.js 和其他依赖的许可信息见 THIRD_PARTY_NOTICES.md 及各依赖附带的许可证文件。
预览分享卡片长什么样 ↓skymecode/deepseek-harness-for-vscode
分享 · DeepSeek Harness Hub
skymecode/deepseek-harness-for-vscode

待发布更新修复了附带编辑器上下文时提问重复出现在回答之后的问题,保留流式回复及快速追问的显示顺序,并兼容原生子代理目录中…

回到顶部