muyuanjin/dsh-ptc-plus
A session-bound agent-native REPL for DeepSeek Harness PTC mode.
Project Overview项目介绍
dsh-ptc-plus is a DSH plugin that adds a session-bound persistent TypeScript REPL to PTC mode. Its core capability: consecutive run_code calls share variables, imports, and the project directory; AST adaptation allows top-level import/export, and edit_run_code applies diffs without resending full source. Use it for multi-turn debugging, long sessions, and cross-call state reuse in TypeScript PTC mode. Caveat: it requires danger-full-access; the worker isolates lifecycle only, not untrusted code.
dsh-ptc-plus 是 DeepSeek Harness 的 PTC 模式插件,提供会话绑定的持久 TypeScript REPL。核心能力:让连续 run_code 共享变量、导入与项目目录,通过 AST 适配 import/export,支持 edit_run_code 局部修复,避免重复发送整段代码。适用于需多轮调试、长会话、跨调用复用状态的 PTC 场景。需 danger-full-access,工作进程仅隔离生命周期,不沙箱化恶意代码。
请帮我了解并安装插件:【dsh-ptc-plus】【https://github.com/muyuanjin/dsh-ptc-plus】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add dsh-ptc-plus
把 muyuanjin/dsh-ptc-plus 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
简体中文 · English
PTC Plus 让 DSH 的 PTC 模式拥有连续的 TypeScript REPL。 上一次 run_code 的变量、导入和计算结果,下一次可以直接复用。默认允许直接同名修订:已有闭包读取更新后的绑定,导入可被局部覆盖再重新导入,失败的声明不会永久占住名称。
[!NOTE] 社区插件,与 DeepSeek 或 DSH 无隶属、无背书。
[!IMPORTANT] 面向
danger-full-access设计:代码可直接访问 Node.js 与操作系统,插件不另加沙箱。仅在可接受此权限的环境使用。
安装
需要 Node.js ^22.19.0 || >=24.0.0 和支持 TypeScript PTC 模式的官方 DSH。安装到你使用的 profile,然后重启 DSH 并选择 PTC 模式:
dsh plugin --profile <profile> add dsh-ptc-plus
无需修改 DSH 或使用定制版本。其他安装方式、升级和故障排查见安装指南。
默认 PTC 模式的问题
默认 PTC 模式每次执行都从新环境开始,模型需要重新发送准备代码。PTC Plus 保留会话中的计算状态,让后续调用可以接着完成任务。
| 场景 | 默认 PTC 模式 | 使用 PTC Plus |
|---|---|---|
| 接着上次计算 | 每次从新环境开始,需重发准备代码 | 直接复用已有变量、函数、导入和结果 |
| 修改一处错误 | 修正后重新发送整段代码 | 用 edit_run_code 只发修改内容,再执行修正后的完整代码 |
| 使用模块语法 | 函数体内不能直接写静态 import、export |
在 cell 中直接写,插件自动适配 |
| 传递特殊值 | JSON 无法完整表达 undefined、BigInt、循环引用等 |
在支持的值范围内保留特殊值及引用关系,供后续计算与恢复 |
| 查找可用工具 | 从提供给模型的工具接口说明中查找 | 可在代码中列出、搜索工具,并按需查看参数说明 |
| 调用漏填摘要 | 缺少 run_code.description 时校验失败 |
自动补充显示摘要,合法代码可继续执行 |
| 误发顶层工具调用 | PTC 模式下未声明的顶层调用被拒绝 | 当前工具定义能唯一确认目标且参数合法时,自动转为 run_code |
| 访问项目文件 | Node 相对路径依赖宿主进程目录 | 按会话记录的项目目录解析文件路径、模块和默认子进程目录 |
| 定位代码错误 | 返回原生错误与堆栈 | 对应到 cell 源码位置;末尾缺少单个闭合符且修正可唯一验证时,给出编辑建议 |
| 查看计算状态 | 执行结束后不保留可继续使用的会话变量 | REPL 页签展示保留的变量、定义来源和有界值预览 |
| 编写并复用 helper | 需自行保存代码,并在后续执行中重新加载 | 用 /binding 编写草稿,在输入框上方审阅后保存;启用后跨会话使用,并向模型提供接口说明 |
| 手动试运行 helper | 没有全局绑定的专用代码工作台 | 在工作台运行未保存源码,连续测试并查看结果,临时状态与 Agent 会话分开 |
| 重启后继续 | 没有跨调用的计算状态可恢复 | 从会话记录恢复可验证的状态,无法恢复的部分明确提示 |
全局绑定需在设置中开启;其余可选行为和恢复范围见下方设置与范围。
三个最直接的场景
状态跨调用
模型第一次执行:
import { readFile } from 'node:fs/promises'
const manifest = JSON.parse(await readFile('package.json', 'utf8'))
const deps = Object.keys(manifest.dependencies ?? {})
return deps.length
下一次直接接着用:
return deps.map(dep => dep + '@' + manifest.dependencies[dep])
deps 和 manifest 仍在当前会话里,无需重发准备代码。
修错不重发
模型可以只提交替换内容:
edit_run_code({ edits: [{ old_string: 'deps.length', new_string: 'deps' }] })
编辑会重新执行完整 cell。已经写文件或调用外部服务的代码,仍需确认可以安全重试。语法错误会指出位置;能够明确定位的末尾缺符号错误还会给出修正建议。

让 Agent 编写可复用 helper
在设置中开启“全局用户绑定”,然后输入:
/binding new 创建 textTools,清理文本首尾空白,保留内部空格
/binding edit <id> 增加逐行清理功能
Agent 可以在会话 REPL 中用内存样例逐步测试和修正,再交出草稿;编写时的测试不得修改外部文件或服务。草稿在输入框上方展开,你可以检查源码和模型提示词,选择“保存为停用”“保存并启用”或“丢弃草稿”。测试和提交本身不会保存全局绑定。
草稿面板可折叠或关闭,输入框星光按钮上的角标可重新打开。保存或丢弃成功后自动关闭,历史请求保留当时的源码和结果。
会话开始前也可以悬停或点击星光按钮,查看并启停全局绑定;这些选择对所有会话生效,但该入口只在当前会话使用 ptc 或兼容 code preset 时注册。菜单同时提供编写新绑定、修改已有绑定和完整管理入口;REPL 可复用绑定列表按后续 cell 源码中的静态引用显示每项复用次数和总复用次数,重定义或重声明不会清零。
已启用绑定的接口会提供给新会话中的模型,也会在现有会话的下一次允许请求中更新。每个绑定可以另写使用提示词,或关闭接口展示;仅改提示词不会重置 helper 的运行状态。在会话中给某个名字赋值或重声明只覆盖该名字,同一条目的其他名字继续可用,会话内的覆盖也不会写回保存的条目。详细操作见全局绑定使用指南。
设置
打开 设置 → 插件配置 → PTC Plus。总开关控制插件,其余设置按用途分组:
- 调用容错:允许缺少摘要的
run_code,修复可以准确识别的顶层工具误调用。 - REPL 语法:
bindingUpdates默认是stateful,允许跨 cell 更新变量、函数、类和 import alias,也允许同一 cell 内同一逻辑 scope 的重复声明更新同一身份;protected可选择名称保护。tools与注入的错误类是请求保留的程序绑定,既不能重声明也不能写入:冲突在 preflight 报PTC-N001,赋值在执行时以指明该名称的错误失败,不会静默丢弃。旧版五个细分开关仅在迁移旧配置时生效;设置页明确显示尚未迁移的状态,可直接选择任一种统一策略。模块语法默认可用。 - 模块互操作:PTC 管理的 namespace 支持实时读取和局部覆盖,传给外部函数后仍保留这些语义。外部代码自行原生导入编译模块不承诺同一 namespace 或可写导出语义,详见运行时说明。
- 状态与恢复:控制重启恢复和按需错误提示。
- 工具扩展:开启全局绑定,或供高级用户使用的官方 Cordis 工具。
- 界面显示:控制增强工具卡片、REPL 页签和绑定编写快捷入口。
- 资源限制:调整执行时间、内存和输出上限。
全局绑定与 Cordis 工具默认关闭。设置通常即时生效;活动 worker 存在时不能更改其内存上限。字段、默认值和限制见配置参考。
PTC Plus 对 run_code、edit_run_code、插件自有子计算及用户绑定入口使用共同的有状态计算契约。用户主动调用 eval、Function、node:vm 或其他外部引擎时,动态源码保留对应的原生语法规则与结果;直接 eval 仍须访问调用处的逻辑作用域,间接 eval 和 Function 使用所属 realm 的逻辑根环境,不能因内部名称改写而读错状态。模块接口与原生互操作边界见 ADR 0025。
间接 eval 和四种 Function 构造器使用所属 realm 的 root,作为原生回调传递时也一样,例如 const value=41 后的 ["typeof value"].map(eval) 返回 ["number"]。函数源码观察保留原始 JavaScript 源码及其真实依赖,自包含函数可用 Function 重新编译;函数值本身、用户改写和另外创建的 realm 保持各自语义。
切换计算模式时,旧闭包仍保留原有执行环境和已保存的函数身份,包括异步继续执行中的直接 eval 与 Function.prototype.toString。各代源码取得稳定的回调接口,全局和原型属性保持原值;兼容模式通过原生 REPL 环境复用已有逻辑绑定,原有原生声明仍优先,其模块导入也通过 PTC 管理的 namespace 读取。

在 REPL 页签查看会话绑定、搜索名称和检查定义,也可以管理全局绑定。全局绑定工作台中的代码控制台支持试运行未保存的源码,拥有独立的临时状态;执行的文件或网络操作仍会产生真实效果。

宽屏下,会话头部的绿色 PTC Plus 标识提供快捷绑定清单;窄屏可从 REPL 页签查看:

范围
DSH 继续负责工具权限、审批、取消和沙箱策略。PTC Plus 不保证所有状态都能跨重启恢复;外部输入、无法验证的历史或上下文压缩都可能缩小恢复范围。恢复不会重做或撤销历史外部操作。
值预览有大小和类型限制,无法可靠读取的对象会显示“不可读取”。绑定的启用配置也不等于初始化一定成功,具体失败会在执行结果中说明。更多行为见运行时参考。
模型调用和 token 用量取决于任务与模型;已有配对观测及其限制见评测说明。
文档
全局绑定使用指南 · 安装与升级 · 运行时参考 · 开发与架构 · 验证与测试并发 · 全部文档
使用 MIT License。
alaliqing/claude-paper
qkycir-123/dsh-run2skill
PKUfudawei/dsh-capability-menu
houyanchao/dsh-timeline
Chael-Chael/dsh-reference-anything
lw-storm/dsh-plugin-masterprompt
Zzzzkd/dsh-prompt-rail