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

持久笔记本 beihzb/dsh-notebook

DeepSeek Harnessv0.3.1
beihzb3 天前有提交已提供中文文档扫描:含敏感能力codedata

为 DeepSeek Harness 打造原生 Jupyter 风格笔记本:真实 ipykernel 边车 + 对齐 VS Code 的单元格界面,tqdm 进度条、内联图表、逐单元格 AI 改写。

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @beihaizb/dsh-notebook
npm 源 · @beihaizb/dsh-notebook 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@beihaizb/dsh-notebook @ 0.3.1
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 10:22:02

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 49 处,展示前 21 条)
  • 读取本地文件
    lib/index.js:227
    const data = readFileSync("/proc/cpuinfo", "utf8")
  • 读取本地文件
    lib/index.js:342
    const doc = JSON.parse(readFileSync(envselStatePath(), "utf8"))
  • 读取本地文件
    lib/index.js:357
    return cmd && existsSync(cmd) ? cmd : null
  • 读取本地文件
    lib/index.js:370
    if (process.env.DSH_ENV_PYTHON && existsSync(process.env.DSH_ENV_PYTHON)) {
  • 读取本地文件
    lib/index.js:396
    for (const c of cands) if (existsSync(c)) return c
  • 读取本地文件
    lib/index.js:405
    for (const c of direct) if (existsSync(c)) return true
  • 执行外部命令来自配置/变量
    lib/index.js:545
    const child = spawn(exe, [DRIVER], {
  • 发起网络请求
    lib/index.js:658
    const res = await sc.request("start", { interpreter: exe, cwd: state.cwd || state.workspaceRoot || initialWorkspaceRoot }, 60000)
  • 写入本地文件
    lib/index.js:764
    await mkdir(dir, { recursive: true })
  • 发起网络请求
    lib/index.js:822
    const res = await sc.request("load_ipynb", { path: abs }, 30000)
  • 写入本地文件
    lib/index.js:866
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/index.js:873
    await mkdir(dirname(dest), { recursive: true })
  • 发起网络请求
    lib/index.js:879
    const res = await sc.request(
  • 写入本地文件
    lib/index.js:1105
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    lib/index.js:1108
    await writeFile(p, stdout, "utf8")
  • 写入本地文件
    lib/index.js:1113
    await writeFile(p, stderr, "utf8")
  • 发起网络请求
    lib/index.js:1246
    const res = await sc.request(
  • 发起网络请求
    lib/index.js:1397
    await sc.request("interrupt", {}, 4000)
  • 发起网络请求
    lib/index.js:1402
    await sc.request("restart", {}, 30000)
  • 发起网络请求
    lib/client.js:319
    return fetch("/nb/" + method, {
  • 写入剪贴板
    lib/client.js:1370
    navigator.clipboard.writeText(text).catch(function () { fallbackCopy(text); });
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

界面预览

1 张 · 点击查看大图

功能亮点

  • 逐单元格AI改写
v0.4.02026-10-31
· dsh-notebook v0.4.0 R 内核、不再依赖 nbformat 的笔记本格式,还有一个能重新找回来的大小核提示。 · R 内核 IRkernel 现在是一等内核,发现方式和 Jupyter 一致: · 用户数据目录里的 kernelspec(%APPDATA%\jupyter\kernels、~/.local/share/jupyter/kernels), · conda 环境里自带的 kernelspec(/share/jupyter/kernels), · R 库里装了 IRkernel 的 conda 环境——为它们合成一个 kernelspec。 两个让它真正能用的细节: · conda 里的 R 需要它所在环境的 DLL 目录。直接启动 /lib/R/bin/x64/R.exe 会立刻以 0xC0000135(找不到 DLL)退出。启动内核时把环境的 bin/Library/bin 目录加到 PATH 前面并设置 R_HOME——等同于 conda activate,但不用 shell。 · 不信任 argv[0]。conda 环境自带的 kernelspec 通常写的是 "R",只有激活该环境时才能解析(而且往往缺 .exe)。改为替换成绝对路径的二进制,并在临时目录里重新生成 spec,通过 JUPYTER_PATH 暴露,这样你的 Jupyter 配置不受影响,也不用装任何东西。 nb_list_vars / nb_inspect_object 有 R 实现(ls/class/deparse;data.frame 额外报告行数、列数和列类型)。保存时写入真实的 kernelspec.language(r 或 python)。 R 内核是可选开启的:新建笔记本仍默认 Python。在内核下拉菜单里选一个(R · ggtree、R · hdWGCNA……)。同时装了 Python 和 R 的环境由 dsh-envsel 0.3.1 报告给智能体,它现在会说明所选 python 环境的 Rscript。 · 不再依赖 nbformat 以前打开笔记本会在 sidecar 里 import nbformat,而 sidecar 跑在你选定的解释器上。任何装了 ipykernel + jupyter_client 但没装 nbformat 的 conda 环境,打开时都会失败: Operation failed: No module named 'nbformat' 这种配置很常见——nbformat 不是 ipykernel 的依赖——精简环境或纯 R 环境永远不会有它。现在读写 .ipynb 改用标准库,输出与 nbformat.write() 逐字节一致:同样的 indent=1 / sort_keys / ensure_ascii=False,多行字符串同样用行列表形式,同样只拆分 text/* mime 载荷,image/png 的 base64 保持为单个字符串,同样的 CRLF 和结尾换行。文件在 git 里不会反复变动。 jupyter_client 和 ipykernel 仍是硬性要求;缺了哪个现在会如实报告(内核下拉菜单也会把该环境标为不可用),而不是抛出原始的 ModuleNotFoundError。 · 无损的笔记本往返 插件没有建模的内容都能在加载 → 保存后保留:markdown 附件(粘贴的图片)、每个输出的元数据(widget 视图尺寸)、metadata.widgets 状态、厂商自定义键。文件格式不允许的输出(update_display_data)会降级为 display_data;重复或缺失的 cell id 会重新生成,结果总能通过 nbformat.validate。 nbformat 3 的笔记本——worksheets / input / prompt_number 以及 png/html/json 的 mime 别名——在读取时升级(对应 nbformat.v4.convert),而不是当成空笔记本读入、下次保存时被清空。4.0–4.4 的文件会像 nbformat.read(as_version=4) 那样补上稳定的 cell id,并记录 orig_nbformat_minor。既不是 v4 也不是 v3 结构的文档会被拒绝,而不是当成空文档处理。 · 大小核提示可以重新打开 以前关掉后整个浏览器会话内都永久消失,哪里都找不到入口。现在 CPU 探测结果留在会话里,工具栏的 ⚡ 大小核 / ⚡ Hybrid CPU 按钮能重新打开同一个面板——只有自动弹窗保持关闭。 · 验证 · tmp/verify-ipyn
v0.3.12026-10-10
· v0.3.1 默认内核现在跟随当前会话的 dsh-envsel 选择,自身没有选择的会话——每个被委派的子代理——继承它所属的最近一个做过选择的会话。 · 问题 defaultKernelEntry() 通过 envselPython() 解析 envsel 环境,这里有两个毛病: 1. 它根本找不到会话。函数先读 process.env.DSH_ENV_PYTHON,再回退到读 ~/.dsh/envsel-state.json 并取文件里最后一条记录,完全无视会话: const selections = Object.values((doc && doc.selections) || {}) for (let i = selections.length - 1; i >= 0; i--) { … } // ← 哪个会话最后追加就是哪个 存储按会话 id 索引、按创建顺序追加,所以「最后一条」指的是最近创建、做过任意选择的会话——一个毫不相干的会话。在一个新会话里选个环境,所有 notebook 的默认内核都跟着它走。 2. process.env.DSH_ENV_PYTHON 永远设不上。harness 每次执行 shell 时通过 shellEnv 注册表解析 DSH_ENV_*,把结果传给那一个子进程,从不写进 DSH 宿主进程。所以第一个分支是死代码,文件回退是唯一走到的路径。 被委派的子代理更惨,不只是「错」:DSH 给每个子代理单独的会话(origin: "subagent",delegationDepth: 1),它什么都匹配不上,悄悄拿到第一个支持 ipykernel 的环境。 · 修复 · 按会话解析,再按血缘解析。解释器按目标会话解析:先查它自己的 envsel-state.json 记录,再查它所属会话中最近的一条记录,血缘来自每次 notebook 工具调用时记录的 exec.agent.session.header.parentSession。回溯有上限(8 跳),遇到重复 id 就停,什么都不匹配时返回 null——这时插件像以前一样回退到第一个支持 ipykernel 的环境。 · 读取存储时校验版本。文档版本必须是 1;无法识别的结构直接忽略而不是误读,因为这个插件不拥有那套 schema。 · 尊重 $DSH_HOME,不再硬编码 ~/.dsh。 · 读取加短缓存(2 秒),状态轮询不必每次快照都读盘。 · 每个按会话的入口现在都感知会话:sidecar 启动(pythonExe)、内核启动(ensureKernel)和公开快照。与会话无关的 CPU 探测刻意保持原样。 · 兼容性 manifest 没变:peerDependencies 仍是 @deepseek-ai/dsh-tools: ^0.1.0-rc.6 || ^0.2.0-rc.1,客户端 bundle 未动。本次发布只涉及宿主侧(lib/index.js)。 dsh-envsel 仍是可选的。搭配 @beihaizb/dsh-envsel@0.3.0 使用,选择从那个版本开始也会以文本形式传给模型;本次发布让 notebook 内核与它保持一致。 · 验证 tmp/verify-0.3.1.mjs(不需要浏览器,也不需要 DSH)从 lib/index.js 提取实际发布的函数,在受控沙箱里运行——25 项检查全部通过: · 源码断言:感知会话的入口存在、「最后一条」循环已删除、版本标记有校验、尊重 DSH_HOME、与会话无关的探测保留; · 行为:自己的记录优先;直接父级可继承;未选择的中间层跳过;最近的祖先胜出;空血缘返回 null;外部存储版本返回 null;解释器文件缺失不采用;继承在跳数上限内生效、超出即停;血缘成环会终止;读取缓存在 TTL 后过期。 · 安装 dsh plugin --profile web add @beihaizb/dsh-notebook@0.3.1 然后重启 dsh web。 版本锁定:如果发布后不久就安装,pnpm 的供应链策略(minimumReleaseAge)可能跳过刚发布的版本、装成旧版。显式锁定版本(@beihaizb/dsh-notebook@0.3.1),或等发布超过策略窗口后用 @latest。
v0.3.02026-10-09
· v0.3.0 长输出折叠真正可用了,超大输出按头尾渲染,全新会话里也能打开 Notebook,切换 View 后滚动位置不再丢失,另外兼容 DSH 0.2.0。 · 兼容性(重要) **如果插件的 @deepseek-ai/dsh* peer 范围不包含当前运行的运行时,DSH 会拒绝启动该插件。** 这道校验在 @deepseek-ai/dsh-app-boot(evaluatePluginCompatibility,启动时抛错)和 @deepseek-ai/dsh-plugin-manager(incompatible-version)里,只检查 @deepseek-ai/dsh / @deepseek-ai/dsh-* 这些 peer。 v0.2.4 声明了 @deepseek-ai/dsh-tools: ^0.1.0-rc.6,其上限是 clientHeight + 8,而测量对象正是被折叠类限制高度的那个元素。没有这个限制时两个值相等,溢出永远检测不到:按钮从不渲染,输出也从不折叠。现在改为测量内层未限制高度的元素,并与 CSS 限制共用的 FOLD_PX 常量比较。 · 切换 View 时滚动位置被重置:外壳一次只渲染一个 View,切到「对话」会卸载 notebook 并销毁它的滚动容器,位置回到顶部。现在按会话记住偏移量(等单元格列表足够高时再恢复,状态加载期间有次数上限的重试)。 · 折叠/展开的选择留不住:展开的单元格每次切换 View 都会重新折叠。现在每个单元格的选择也会记住。 · 功能 · 长输出折叠有了真正的操作入口:按钮显示隐藏了多少内容(「展开全部(3,000 行)」),折叠框保留渐变提示。 · 超大输出按头尾渲染:单个文本块超过 4,000 行或 200 KB 时,只渲染前 300 行和后 100 行,并明确标出「… 省略 N 行」,附一键「显示全部 N 行」。500 KB 的流不必再为了折叠而整个塞进 DOM。 · 空白会话里也能打开 Notebook:会话为空时 DSH 不提供 conversation.view 槽位(视图区返回 null,View 标签也隐藏),所以以前 Notebook 标签得先发一条消息才出现。插件现在额外注册一个 uiConversation View 定义(让它的目标算作对话活动),并在会话为空时于输入框上方提供「📓 在本会话中打开 Notebook」入口;激活目标后外壳会把会话视为已开始,正常 View 标签随之出现。该入口只在会话为空时渲染,整条路径都有保护——在没有 uiConversation 的运行时上,插件行为与之前完全一致。 · 安装 dsh plugin --profile web add @beihaizb/dsh-notebook@0.3.0 然后重启 dsh web。会话顶部会出现 Notebook 标签。 版本锁定:如果在本版本发布后不久安装,pnpm 的供应链策略(minimumReleaseAge)可能跳过刚发布的版本而装成旧版。请显式锁定版本(@beihaizb/dsh-notebook@0.3.0),或等发布超过策略窗口后再用 @latest。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
@beihaizb/dsh-notebook 面向 DeepSeek Harness 的、由 Agent 操控的持久化 Jupyter 计算工作空间。 一个真正的 ipykernel runtime,DSH Agent 可以读取、编辑、执行并检查它的状态——把 notebook 从静态产物变成 Agent 可以操作的对象。 这不是又一个 Notebook 前端。内核是真正持久的(变量跨 cell 保持)、notebook 可保存/重新加载,而且 Agent 拥有读取、修改、运行、推理 cell 及其输出的工具。这给了 Agent 一个真实的 Agent ↔ 内核 ↔ 产物 闭环。 Agent 工作流 这个插件的意义在于:DSH Agent 不在运行一次性脚本,而是在驱动一个活跃的计算会话: 用户:"把 Harmony 换成 scVI。" → Agent 找到相关 cell → 读取源码和上下文 → 修改 cell → 执行 → 检查 stdout / traceback → 必要时继续迭代。 因为内核是持久的,Agent 操作的是有状态 runtime(一个 Anndata、一个 GPU 模型、已加载的数据),而不只是拼接代码字符串。 演示 / 截图 - 实时 tqdm 进度条、内联图可点击放大。
展开完整文档(README 剩余 1 节)
@beihaizb/dsh-notebook

面向 DeepSeek Harness 的、由 Agent 操控的持久化 Jupyter 计算工作空间。 一个真正的 ipykernel runtime,DSH Agent 可以读取、编辑、执行并检查它的状态——把 notebook 从静态产物变成 Agent 可以操作的对象。

这不是又一个 Notebook 前端。内核是真正持久的(变量跨 cell 保持)、notebook 可保存/重新加载,而且 Agent 拥有读取、修改、运行、推理 cell 及其输出的工具。这给了 Agent 一个真实的 Agent ↔ 内核 ↔ 产物 闭环。

Agent 工作流

这个插件的意义在于:DSH Agent 不在运行一次性脚本,而是在驱动一个活跃的计算会话:

用户:"把 Harmony 换成 scVI。"
→ Agent 找到相关 cell → 读取源码和上下文 → 修改 cell → 执行 → 检查 stdout / traceback → 必要时继续迭代。

因为内核是持久的,Agent 操作的是有状态 runtime(一个 Anndata、一个 GPU 模型、已加载的数据),而不只是拼接代码字符串。

演示 / 截图

- 实时 tqdm 进度条、内联图可点击放大。
- 可点击 traceback(Cell In[N])跳转到对应 cell。
- 逐 cell 「交给 AI」 修改意见:输入需求,Agent 修改并重跑该 cell。
- VS Code 对齐的 cell 行为(排队 / 运行中 / 执行语义)。

功能(已实现)

- 真正的持久内核:ipykernel + jupyter_client sidecar,变量跨 cell 保持。R 内核(IRkernel)同样支持,在同一个下拉框里选。
- Agent 工具:读取、编辑、运行、检查 cell(nb_get / nb_edit_cell / nb_run_cell …),结构化访问输出与 traceback。
- Agent 运行时自省:nb_context、nb_list_vars、nb_inspect_object 暴露活内核变量和压缩后的 notebook 状态;pandas DataFrame 会返回 shape / dtype / 缺失值 / head / summary 等元信息。
- 安全 AI 修改闭环:更完整的逐 cell 版本快照,配合 nb_cell_history、nb_revert_cell、nb_error_context、nb_edit_and_run_cell 支持可审计的修错并重跑流程。
- VS Code 对齐的 cell UI:圆形运行控件、Queued / Executing 状态栏、执行序号。
- VS Code 对齐的执行语义:重启保留已完成输出、中断只停当前 cell、Run All 遇错停止、Clear Outputs / Restart & Clear。
- tqdm 进度条、长输出折叠、多图网格。
- 错误定位(点击 traceback 跳到对应 cell)。
- 更稳的前端:加了 React 错误边界,输出渲染异常时不再整块空白;修复了一个 hooks 顺序 bug 导致的界面偶发消失。
- 更快的实时更新:运行中进度节流并只发尾部输出、状态轮询降频、高频更新不再重复带完整内核列表。
- 跟随会话的工作目录:notebook 默认 cwd / workspace 跟随当前 DSH 会话;手动“设置工作目录”与打开 notebook 保存的 cwd 优先级更高。
- 会话隔离:每个 DSH 会话拥有独立的 notebook、内核和工作目录,无跨会话状态泄漏。多会话可同时运行内核。
- 内核管理器:工具栏弹窗列出所有会话的活跃内核(会话 ID、内核名、状态),可直接关闭任一会话的内核。
- 内核活跃指示:状态栏显示当前会话内核是否活跃,多会话同时开内核时提醒注意内存/资源。
- 孤儿进程自动清理:dsh web 被强杀时,Python sidecar 检测到父进程死亡后自动关闭 ipykernel,不留孤儿进程(跨平台:POSIX 用 getppid,Windows 用 OpenProcess)。
- 中英双语界面:整个界面默认英文,工具栏一键切换中文,选择持久化保存。
- 大小核 CPU 提示:在混合架构(P+E 核)机器上,提示如何把 Python 进程固定到性能核(Windows 任务管理器 / 活动监视器 / taskset),并附一键复制的 psutil 片段。它不再"关掉就永久消失":工具栏的「⚡ 大小核」按钮可随时重新打开(只关闭"自动弹出",不关闭入口)。
- Jedi 内核补全(df. / plt. / 变量名;Tab 接受;悬停看 docstring)。
- 每 cell AI 修改意见(版本栈在 cell.metadata.dsh)。
- 标准 .ipynb 保存 / 读取,自动保存 + 未保存提醒;不需要 nbformat,未知字段也不会在往返中丢失。
- 内核选择:conda 环境 和 R 内核都能选;缺 ipykernel / jupyter_client / IRkernel 时给友好安装提示。
- 兼容 scoped 安装:bundle 现在在 host 补丁(cordis.patch.yml)和 client 加载器里都注册为 @beihaizb/dsh-notebook,dsh plugin add @beihaizb/dsh-notebook 可直接加载(此前补丁名不带 scope,无法对上 npm 的 scoped 包名)。
- 「交给 AI」更可靠:修复了一个回归(局部变量遮蔽 i18n 翻译函数),此前提交的意见会在发送前被静默丢弃——现在 cell 代码和你的请求一定能送达 agent。
- 编辑器跟随主题:CodeMirror 编辑器跟随 DSH 深浅主题——深色用 oneDark,浅色用清爽的浅色方案(行号柔和灰),切换主题时实时重绘。
- CPU 提示片段本地化:一键复制的 psutil 片段注释跟随界面语言(中 / EN)。
- 结构化执行结果(v0.2.2):所有运行工具(nb_run_cell、nb_edit_and_run_cell、nb_run_all)现在返回统一执行信封——status、execution_count、duration_ms、kernel_state、合并的 stdout/stderr、outputs_summary、图片路径、error + traceback_text、execution_index——为 Agent 建立可靠执行循环。
- 长输出不撑爆上下文(v0.2.2):三层防线防止失控输出灌爆 Agent 上下文——driver 单流上限(500 KB)、信封内 6 KB 头尾摘要、完整合并文本落盘到 <notebook>_files/ 并返回路径供 Agent 按需读取。base64 图片只留在 UI,信封给文件路径。
- 逐次执行历史(v0.2.2):每次运行都记录到 cell.metadata.dsh.executions(每 cell 上限 50 条,随 notebook 持久化)——执行历史 UI 与重放式恢复的地基。
- Run All 完成提示更诚实(v0.2.2):只有所有 cell 真正跑到终态(ok/error)才弹「全部运行完成」,不再在请求一返回就假完成。
- 排队即时反馈(v0.2.2):运行第二个 cell 时立刻显示 Queued 状态(HTTP 运行端点不再为 UI 阻塞等待),且运行中不会出现快照交换导致的编辑器闪空。
- ANSI 流输出不再乱码(v0.2.4):含 ANSI 转义码但不含 \r 的内核流输出(彩色 Pdb 提示符、colorama 彩色打印)现在会在渲染前剥离转义码——此前虽然算出了清洗文本,渲染时却回退到原始 o.text,导致 [32m/[0m 垃圾原样显示在输出区。错误标题(evalue)同样处理。
- 长输出折叠真正可用(v0.3.0):v0.2.2 加上的折叠从未生效——唯一产生高度钳制的 fold 类,其判定却来自"已被钳制元素"的测量,溢出永远测不到,按钮也就不出现。现在改为测量内层未被钳制的元素,且折叠高度与判定共用同一个 FOLD_PX 常量;按钮还会显示隐藏规模(如「展开全部(3,000 行)」)。
- 超大输出只渲染头尾(v0.3.0):单个文本块超过 4,000 行或 200 KB 时,只渲染前 300 行 + 后 100 行,并明确标注「… 已省略 N 行」与一键「显示全部 N 行」——500 KB 的流不必为了折叠而全部驻留 DOM。
- 全新会话也能进 Notebook(v0.3.0):会话空白时 DSH 不渲染 conversation.view slot,所以此前必须先发一句话才能看到 Notebook 标签。现在空白会话的输入框上方会出现「📓 在本会话打开 Notebook」入口,点击即激活本视图并让常规视图标签栏出现(随后宿主会记住该会话的选择)。
- 切换视图不再丢滚动位置(v0.3.0):宿主同一时刻只渲染一个视图,切到「对话」会卸载 notebook 并把位置重置到顶部。现在滚动偏移与每个 cell 的展开/折叠选择都按会话记忆,切回来自动恢复。
- 支持 DSH 0.2.0(v0.3.0):peerDependencies 现在同时覆盖 0.1.x-rc 与 0.2.0-rc 两条线(@deepseek-ai/dsh-tools: ^0.1.0-rc.6 || ^0.2.0-rc.1),DSH 启动期的兼容性门禁不再拒绝本插件——旧的 ^0.1.0-rc.6 上界是 <0.2.0,而只要有 @deepseek-ai/dsh peer 不满足当前运行版本,门禁会跳过整个 bundle。client 清单里也改为指向真正提供 slots 服务的 client row @deepseek-ai/dsh-client-ui-renderer,不再引用根本不存在的 @deepseek-ai/dsh-client-runtime。
- 默认内核跟随本会话(v0.3.1):默认内核现在读取当前会话的 dsh-envsel 选择。此前它取的是存储文件里"最后一个"选择,于是 notebook 可能落到某个不相干会话挑的环境上;而被派出的子代理因为各自拥有独立会话,根本查不到任何选择。现在自身没有选择的会话会继承它向上最近的那个有选择的会话。
- 支持 R 内核(v0.4.0):内核下拉框现在会列出 R 内核,来源与 Jupyter 一致——用户数据目录里的 kernelspec、conda 环境自带的 <env>/share/jupyter/kernels、以及只在 R library 里装了 IRkernel 的 conda 环境(自动合成)。conda 的 R 启动时会把该环境的 DLL 目录塞进 PATH 并设好 R_HOME,否则直接起二进制会以 0xC0000135(找不到 DLL)秒退;kernelspec 里 argv[0] 只写 "R" 的情况会解析成绝对路径,因此在未激活环境时也能用。nb_list_vars / nb_inspect_object 有对应的 R 实现(ls/class/deparse,data.frame 额外给行数/列数/列类型),保存时写入真实的 kernelspec.language(r 或 python)。
- 不再需要 nbformat(v0.4.0):.ipynb 的读写改用标准库完成。此前 sidecar 在打开/保存 notebook 时会 import nbformat,于是一个有 ipykernel + jupyter_client 却没有 nbformat 的 conda 环境会直接报 Operation failed: No module named 'nbformat'——而精简环境或纯 R 环境根本装不了它。现在写出的字节与 nbformat.write() 完全一致(缩进/排序/CRLF/拆行规则全部对齐),用 Jupyter 打开再保存不会在 git 里炸开 diff。
- notebook 往返无损(v0.4.0):插件不认识的东西一律原样保留——markdown 的 attachments(粘贴的图片)、每个 output 的 metadata(widget 视图尺寸)、全局 metadata.widgets 状态、第三方自定义键,保存时不会被吞掉。nbformat 3 的老 notebook(worksheets/input/prompt_number/png 别名)会在读取时升级到 v4,而不是被读成空 notebook、再在下次保存时把文件清空;4.0–4.4 的文件按 nbformat.read 的行为补齐 cell id。
- 大小核提示可以重新打开(v0.4.0):以前点「知道了,不再提示」后整个浏览器会话都没有入口。现在 CPU 探测结果会留在会话里,工具栏的「⚡ 大小核」按钮可重新打开同一个面板;被关掉的只是自动弹出。

Roadmap

方向是完整的 Agent 计算工作空间,而不是堆更多 Notebook UI:

- AnnData / 科学对象自省 —— 扩展 nb_inspect_object("adata"),返回 n_obs、layers、obsm、obs / var 列摘要。
- 执行历史 / diff UI —— 不只在工具里记录,也在界面里展示可审计的 cell 版本(逐次执行记录已开始收集)。
- 上下文相关的 cell 选择 —— 分层 / 查询"哪个 cell 定义了某变量、哪些依赖它",而不是把整个 notebook 塞进上下文。
- 执行安全 —— 把操作分类为 只读 / 轻量 / 修改型 / 重 / 破坏性;破坏性或超长运行前要求确认。
- Checkpoint / 回滚 —— 不只恢复代码,还能恢复 runtime 状态。
- 远程 / SLURM 内核 —— 内核跑在服务器 / 作业节点上,Agent 通过同一接口驱动它。

兼容性

支持的 DSH 运行时线:0.1.x-rc 与 0.2.0-rc,已在 0.1.7-rc.2 与 0.2.0-rc.2 上核对(插件声明 @deepseek-ai/dsh-tools: ^0.1.0-rc.6 || ^0.2.0-rc.1)。若插件的 @deepseek-ai/dsh peer 区间不包含当前运行版本,DSH 会在启动时拒绝并跳过整个 bundle——在尚未验证的新版本线上,请用精确版本豁免(dsh plugin allow-version 或插件管理器),而不是强行加载。

安装

dsh plugin --profile web add @beihaizb/dsh-notebook@0.4.0

然后重启 dsh web。会话顶部会出现 Notebook 标签。

版本锁定说明:如果刚发布不久就安装,pnpm 的供应链策略(minimumReleaseAge)可能跳过刚发布的版本、自动装到旧版。遇到这种情况请像上面那样显式指定版本号(@beihaizb/dsh-notebook@0.4.0),或等发布超过策略窗口后用 @beihaizb/dsh-notebook@latest。

内核选择

- dsh-envsel 是可选依赖。 装了环境选择器时,插件读取它的选择($DSH_HOME 下的存储,即 ~/.dsh/envsel-state.json),用你在本会话选的 conda 环境作为默认内核。自身没有选择的会话(例如被派出的子代理)会继承它向上最近的那个有选择的会话,因此被委托的 notebook 工作会落在委托它的那个会话所用的环境里。

dsh plugin --profile web add @beihaizb/dsh-envsel

(源码:github.com/beihzb/dsh-envsel)

- 没装 dsh-envsel 时,回退到第一个发现的有 ipykernel 的 conda 环境。读取存储时会先校验其版本戳,因此未来换了格式的 envsel 状态会被忽略,而不是被误读。
- 随时可切换。 用工具栏下拉框切换任意其他环境(Python 或 R)。

内核依赖

| 内核 | 需要 |
| Python | ipykernel 和 jupyter_client——前者跑内核,后者跑与它通信的 sidecar |
| R | 该 R 的 library 里有 IRkernel;不需要任何 Python 包(sidecar 借用某个 Python 环境,优先用 dsh-envsel 选的 python) |

nbformat 不需要——notebook 文件用标准库读写。

jupyter_client 与 ipykernel 是真正第三方的协议实现,缺了会给出精确的安装命令,而不是抛原始 ModuleNotFoundError;内核下拉框也会把这类环境标记为不可用,避免你选到一个起不来的内核。

R 内核需要主动选择:新建 notebook 不会悄悄启动 R。要跑 R notebook 就在下拉框里选 R · ggtree、R · hdWGCNA 等。而一个只有 Python、但顺带装了 R 的 conda 环境(很常见)仍会被 dsh-envsel 写进运行时上下文,agent 因此知道两条调用路径。

工具

nb_new / nb_open / nb_save / nb_get / nb_context / nb_list /
nb_list_vars / nb_inspect_object /
nb_add_cell / nb_delete_cell / nb_move_cell / nb_edit_cell / nb_edit_and_run_cell /
nb_cell_history / nb_revert_cell / nb_error_context /
nb_run_cell / nb_run_all / nb_apply_suggestion /
nb_kernel_restart / nb_kernel_restart_and_clear / nb_kernel_interrupt /
nb_kernel_list / nb_kernel_select / nb_clear_outputs / nb_set_cwd

License

MIT
预览分享卡片长什么样 ↓beihzb/dsh-notebook
分享 · DeepSeek Harness Hub
beihzb/dsh-notebook

为 DeepSeek Harness 打造原生 Jupyter 风格笔记本:真实 ipykernel 边车 + 对齐 VS Code 的单元格界面,tqdm 进度条、内联图表、逐单元格 AI 改写。

这是你的仓库?认领条目

回到顶部