dsh-at-file
FSMargoo/dsh-at-fileCodex 风格的 `@file` 文件引用,输入框里直接搜索并引用工作区文件。
English | 中文
一个可热插拔的 DeepSeek Harness (DSH) 客户端 GUI 插件:在侧边栏「新会话」下方增加 任务看板入口,点击后中间列整体切换为多列看板视图;任务以 DSH 自身的会话机制 真实执行(session.prompt),执行状态实时回写卡片。
dsh-web-ui/packages/skins/skin-center 一致)。[data-pane="sidebar"],DSH 0.1.0-rc.6 AppFrame 布局为 [class*="sidebarCol"])内、新会话按钮下方注入「任务看板」入口行(宽栏显示图标+文字,折叠 rail 显示纯图标,随 DSH 皮肤 token 自适应)。workspaces.connectWorkspace,空白会话复用或 host 新建),把任务标题设为会话名,以任务 Prompt 调用 session.prompt([{ type: 'text', text }], 'queue') 驱动真实 agent;随后订阅该会话快照,轮次真实结束后把卡片置为 已完成/已失败 并记录执行结果。执行会话会出现在会话列表,可点进对话查看真实 transcript。* / */n / a-b / 逗号列表)+ 常用预设(每天 09:00、每小时、每 10 分钟、每周一 09:00);启用即计算并持久化「下次运行时间」,卡片显示定时标识;到点自动走真实执行链路(同手动执行),执行会话照常可跳转。src/index.ts)通过 SystemPrompt.section 注册 plugin:task-board 段(order 200),向每个 agent 声明本插件存在、能力与限制——插件在组合中(mount 后重启 DSH)即注入,移出组合(unmount 后重启)即消失,agent 无需任何外部文档就能知道如何与本看板协作。package.json / tsconfig.json / tsdown.config.ts # 独立仓库构建
build/tsdown.client.ts + build/web/src/platform.ts # 从 DSH checkout 复制的 client bundle 预设(与运行版本保持同步)
src/index.ts / src/invariant.ts # host 半边:仅注入 SystemPrompt section(其余无行为)
src/client/index.ts # apply(ctx):接线 runtime 服务 + 挂载 DOM
src/client/sidebar-entry.ts # 侧边栏入口注入(自愈式 MutationObserver)
src/client/board-mount.tsx # 中间列看板挂载 + 显隐切换
src/client/board/*.tsx # React 看板视图(列/卡片/详情/新建/确认)
src/client/board.module.css # 样式(--dsw-* token,随主题/皮肤自适应)
src/core/tasks.ts # 任务模型 + 状态机(纯函数)
src/core/schedule.ts # cron 解析 + 下次运行时刻(纯函数)
src/core/scheduler.ts # 浏览器调度器(每分钟 tick 触发到期任务)
src/core/store.ts # 持久化(TaskStore 接口 + localStorage 实现)
src/core/execution.ts # 真实执行服务(会话连接/prompt/结算观察)
src/core/controller.ts # 控制器(台账状态、视图状态、导航感知)
tests/*.spec.ts # 存储/状态流转/执行触发/cron/调度 自动化测试
scripts/dsh-task-board.js # 一键挂载/卸载/状态 CLI
sidebar.workspaces / sidebar.settings 两个 single 槽位,且已被 ui-workspace / ui-settings 占用;外部插件无法注册新槽位(声明即占有,重复声明抛错)。因此入口行走 skin 先例的 DOM 注入,并用 MutationObserver 自愈(React 重渲染波及该节点时同帧内重新插入,无闪烁)。conversation 槽位是 single 且已被 ui-conversation 占用。看板视图以 DOM 方式挂在中间列(旧版 [data-pane="conversation"],DSH 0.1.0-rc.6 AppFrame 布局为 [class*="centerCol"];挂载选择器两者都保留)内(React 不管的尾部子节点),通过 <html data-dsh-taskboard-active> 属性切换显隐,底下的对话子树保持挂载有状态。cordis.patch.yml 的调研结论一致);localStorage 也是 DSH 客户端自身快照存储(createSnapshotStore persist)的持久化方式。ctx.sessions.list 订阅会话状态(running / byId),ctx.workspaces.connectWorkspace() 创建/复用会话,session.prompt() 真实驱动 agent,ctx.sessions.open() 跳转 transcript。LocalStorageTaskStore.subscribeExternal),删除的任务不会在其他标签页的内存副本里残留触发,也不会被其他标签页的后续持久化写回复活。推荐直接安装全家桶聚合包 @linxin666/dsh-web-ui-all(一个包装齐全部功能插件与皮肤),或单独安装本插件:
### 从 npm 安装(推荐)
dsh plugin --profile web add @linxin666/dsh-client-ui-task-board
### 从仓库安装(开发调试)
git clone https://github.com/zhu1090093659/dsh-web-ui.git
cd dsh-web-ui
pnpm install && pnpm -r build
dsh plugin --profile web add link:$(pwd)/packages/dsh-task-board
安装后重启 dsh web,侧边栏「新会话」下方出现「任务看板」入口即生效;页面刷新不够,需重启进程。
前置:Node ≥ 20,官方 NPM SDK 可访问(若仍使用私有 scope 认证则配置 NPM_TOKEN 环境变量 + 项目 .npmrc,见仓库 docs/plugins.md)。类型与运行时 API 全部来自官方 NPM SDK(@deepseek-ai/* devDependencies),无需任何 DSH 源码 checkout。
cd ~/code/dsh-web-ui/packages/dsh-task-board
pnpm install # 首次(workspace 根执行 pnpm install)
pnpm run build # 产出 lib/index.js + lib/client.js(tsdown + shared/tsdown.client.ts 预设)
pnpm run typecheck # 类型检查(node_modules 的 SDK 包类型)
pnpm test # vitest:存储读写 / 状态流转 / 执行触发
本插件采用官方 profile-bundle 形态(package.json 声明 dsh.bundle.patch + dsh.client,见 cordis.patch.yml)。挂载 = 在 web profile 清单(~/.dsh/profiles/web/package.json)注册依赖与 bundle 行并安装:
# 挂载(dependencies + dsh.profile.bundles 注册,pnpm install;重启 GUI 后生效)
node scripts/dsh-task-board.js mount
# 查看状态
node scripts/dsh-task-board.js status
# 卸载(移除注册行;重启 GUI 后恢复原状;任务数据保留)
node scripts/dsh-task-board.js unmount
profile 清单中注册的行:
{
"dependencies": { "@linxin666/dsh-client-ui-task-board": "link:/Users/zcl/code/dsh-web-ui/packages/dsh-task-board" },
"dsh": { "profile": { "bundles": [ "...", "@linxin666/dsh-client-ui-task-board" ] } }
}
注意:profile 层(bundle 行、
dsh.client元数据)在 dsh web 进程启动时读取,挂载/卸载后需要重启 dsh web GUI 才生效(页面刷新不够)。
dsh.taskBoard.v1(来源为 http://127.0.0.1:<dsh web 端口>,同一来源跨刷新/重启持久)。localStorage.removeItem("dsh.taskBoard.v1")。TaskStore 接口(src/core/store.ts),后续可换成 IndexedDB 或 host 文件通道而不动上层逻辑。npm run build → node scripts/dsh-task-board.js mount → 刷新 http://127.0.0.1:3080。*/10 * * * *),卡片出现定时标识;等待下一个整 10 分钟点,观察卡片自动进入「进行中」并最终完成,详情「上次触发」出现时间、执行记录新增一条(会话可跳转)。