Passer au contenu principal
C

dsh-task-manager

caipanjin/dsh-task-manager

Task manager for the DeepSeek Harness chat: tasks proposed by the model or added by the user, shown in a draggable floating panel, with origin badges and a confirm-before-done flow — click a task to hand it to the model.

Installer

dsh plugin --profile web add github:caipanjin/dsh-task-manager

README

dsh-task-manager

Listed on dsh-plugin.org

在 DeepSeek Harness 的聊天里管理任务:模型会提议任务,你也可以自己添加(甚至直接框选对话里的文字变成任务),点一下就能把某个任务交给模型开始执行。

一个无依赖的小插件,为 Harness 提供一个悬浮任务面板。任务可以来自模型本身(比如它给出一个实施顺序建议),也可以来自你自己(在面板里手动输入,或在对话里选中一段文字点「+ 添加为任务」)。每条任务都会标注来源——模型建议 还是 手动添加——让你随时清楚它的出处。当模型判断某个任务已完成时,面板不会悄悄把任务标为完成,而是弹出一个批量确认提示,由你来拍板。选中某条任务点「开始」,会先弹一条确认,确认后才把「开始执行这个任务:<标题>」发送到对话框,交给模型执行。

任务面板

功能特性

  • 两种任务来源 —— 模型建议(通过 task_write 工具)与用户手动添加(在面板输入),每行带来源徽标(模型建议 / 手动添加)。
  • 一份共享的任务列表 —— 你在面板里的每一次操作(加任务、改状态、确认完成、删除)都会写回会话本身,模型下一次查列表看到的就是你看到的;重开会话、fork 之后用户任务依然在。
  • 选中文字即建任务 —— 在对话里选中一段文字,旁边浮出「+ 添加为任务」按钮。若选中的是渲染出来的列表(- / 1. / 2. 等),按钮会变成「+ 添加 N 个任务」,一次为每个列表项建一条任务。列表标记是 CSS ::marker 画出来的、不在选中文字里,所以插件直接读 DOM 的 <li> 结构来识别条目,而不是靠正则匹配文本。
  • 悬浮、可拖动面板 —— 位于 shell 浮层之上,从一个紧凑的小胶囊展开,可拖到任意位置并记住位置(按浏览器保存)。
  • 状态清晰 —— 每行有状态圆点 加状态文字(待办 / 进行中 / 已完成),颜色只是辅助:待办灰、进行中琥珀、已完成绿。不再需要靠颜色猜状态。
  • 显式完成 + 先确认后完成 —— 每行只有一个随状态变化的操作按钮(「标记进行中」→「✓ 完成」→「重新打开」)。当模型判断任务完成时,只是提议完成,面板会显示 全部确认 / 忽略 横幅;未经你确认,不会真正落定。
  • 从列表直接启动任务 —— 点「开始」先弹确认条,点「发送」才把任务发到聊天,随后面板自动收起让路。
  • 两种任务都能删 —— 模型任务和用户任务都带「✕」;「清除已完成」可批量移除已完成项。
  • 浅色 / 深色自适应 —— 只使用 Harness 真实主题 token,自动跟随应用主题。
  • 中英双语 —— 简体中文与 English。

安装

已发布到 npm(当前版本 1.1.7,历史版本见下方更新记录):

dsh plugin --profile web add @caipj/dsh-task-manager

或直接从源码安装:

dsh plugin --profile web add github:caipanjin/dsh-task-manager

安装后重启一次 Harness 宿主(让宿主侧工具 task_write 注册生效),并刷新窗口。任务小胶囊会出现在右下角;点击展开,拖动可移动。

使用说明

  • 添加任务:展开胶囊,在输入框里输入后点「添加」。任务只留在列表里——不会被复制到聊天框。
  • 从对话文字添加:在对话里选中文字(单段或列表),点浮出的「+ 添加为任务」/「+ 添加 N 个任务」。
  • 模型任务:当模型调用 task_write(例如提议一个工作顺序)时,任务会自动出现,标注「模型建议」。
  • 切换状态:待办点「标记进行中」;进行中点「✓ 完成」;已完成点「重新打开」。
  • 启动任务:点某行的「开始」,确认条出现后点「发送」,提示会被发送到对话。
  • 完成确认:若模型报告完成,会出现确认横幅,可用「全部确认」或逐行「确认」。模型上报时除了任务 id,也可以直接写任务标题(标题需唯一命中;大小写、空格、标点差异会自动忽略),不必为了找 id 先查一遍列表。
  • 删除 / 清空:每行「✕」删除该任务(模型任务与用户任务都支持);「清除已完成」批量移除。

工作原理

  • 宿主端(index.js)注册一个面向模型的工具 task_write(add / set_status / propose_done / remove / replace / clear / list)、一个面向界面的命令 tasks-sync,以及一个会话投影 taskManager。工具的渲染结果内嵌一行机器标记 TASK_STATE::<json>,携带完整任务列表;投影从既有的 tool/result 事件(模型写入)与 command/done 事件(界面写入)中折叠出这些标记——不引入任何自定义会话事件类型。标记只在自己人写的结果里生效:tool/result 必须对应一个名为 task_write 的 tool/call,command/done 必须对应一个名为 tasks-sync 的 command/run,否则忽略。这样即使你把会话日志 cat 出来、或某次搜索命中了这行标记,也不会被当成任务写进投影。
  • 客户端(client.js)把两个挂件注册到 shell.overlay 插槽:任务卡片,以及选中文字时出现的浮层按钮。它从投影读取任务,用户的所有改动(加任务、改状态、确认完成、删除)都通过 ctx.remote.commands.execute() 调 /tasks-sync 写回宿主投影,因此只有一份真相源:界面和模型看到的是同一个列表,用户任务在重开会话、fork 之后依然存在,模型下次 list 也能看到。写回是串行的(同一会话的写排队执行),失败会在卡片里给出可见提示。开始 调用当前会话的 conversation.send(text)。

兼容性

  • 平台:web(Harness 桌面 / 网页 UI)。
  • 需要暴露 shell.overlay 插槽、sessionProjections 服务、commands 宿主服务(tasks-sync),以及 conversation.send / sessions.scope / remote.commands 客户端服务的 Harness 版本。仅使用公开、稳定的主题 token(--dsw-alias-*)。

权限 / 信任

  • 无网络请求、无外部服务、无遥测。
  • 读写当前会话投影中的任务;只写入自己的 localStorage 键 @caipj/dsh-task-manager:widget-pos(仅记住面板位置)。
  • 新增一个模型工具(task_write)和一个内部命令(tasks-sync,供面板写回任务列表;不会出现在对话流里),不触碰其他任何东西。

已知限制

  • 面板的写回走 Harness 的 commands 通道,因此每次界面操作都会在会话日志里留下一条 command/run + command/done 记录(面板已在聊天流里隐藏这些节点,但日志里能看到)。这是"界面与模型共享同一份任务列表"的代价。
  • /tasks-sync 会出现在斜杠命令菜单里(框架不提供隐藏命令的字段);正常使用不需要手动输入它。
  • 选中文字建任务依赖 DOM 结构识别列表条目;如果文字来自代码块或纯文本(标记是真实字符),则退回按文本中的 - / 1. 标记切分。

更新记录

1.1.7

  • 重大改进:界面与模型共享同一份任务列表(双向同步)。以前你在面板里加的任务、改的状态、点的「确认完成」只存在浏览器 localStorage 里,模型看不见、换个会话就丢;现在这些操作全部通过宿主命令 tasks-sync 写回会话投影,和模型用 task_write 写的是同一个列表。
  • 结果:模型下一次 list 能看到你手动加的任务和你改过的状态;用户任务在重开会话、fork 之后依然在;「确认完成」会真正把状态落到宿主(不再只是本地覆盖)。
  • 改进:写回是串行的,连点两次「添加」不会丢任务;写回失败时卡片里会出现一条可关闭的错误提示,而不是静默失败。
  • 改进:面板写回产生的命令节点在聊天流里隐藏,不会在你和模型的对话中间插入一张「命令已执行」的卡片。
  • 修复:任务标记现在会核对来源。以前投影只看结果文本里有没有 TASK_STATE::,不校验是谁写的——把会话日志打印到对话里(cat、grep、读文件)就会把日志里的旧任务"折叠"进当前会话,凭空多出一批你没加过的任务。现在 tool/result 必须对应一个 task_write 调用、command/done 必须对应一个 tasks-sync 命令,其余一律忽略;投影 stateVersion 升到 2,已经写坏的缓存会自动作废重算。
  • 移除:localStorage 里的用户任务列表、完成确认记录、对模型任务的本地覆盖三套存储(只剩面板拖拽位置还在本地)。

1.1.6

  • 改进:任务卡片和「选中文字 → 加为任务」的气泡只在会话页显示。切到插件管理、设置、市场等全局页面时自动隐藏,不再浮在那些页面上面挡内容。
  • 说明:判定依据是框架的主面板标识(activePanelId)——为 null 即会话页。框架不提供该信息时(旧版本)卡片照常显示,不会突然消失。

1.1.5

  • 修复:模型用 replace 重写任务列表(工具描述本来就在推荐这种做法来登记实施顺序)时,每条任务都会拿到新 id,导致你在客户端做的隐藏 / 状态修改 / 完成确认全部丢失——因为这些状态只能存在浏览器本地,且按 id 记录。现在 replace 会按标题复用已有任务的 id,只有真正新增的任务才生成新 id。
  • 说明:标题复用同样走「忽略大小写 / 全半角 / 空格 / 标点」的归一化匹配,所以重写时标题微调也不会丢状态。

1.1.4

  • 新增:propose_done 除了任务 id,也可以直接传任务标题。标题按「忽略大小写 / 全半角 / 空格 / 标点」归一化后匹配,唯一命中即生效,唯一前缀也接受;命中多个时直接报错并列出候选,不会猜错任务。
  • 改进:工具描述里补充了这条用法,模型忘记 id 时不必再先 list 一轮。

1.1.3

  • 修复:点「忽略」驳回一个完成提议后,该任务会永远停在「待确认完成」徽标(横幅已消失但行还卡着)。现在只有未作答的提议才算待确认,驳回即回落到待办、接受即视为已完成。
  • 修复:点「开始」时写入的「忽略」不再永久封杀模型之后对同一个任务的完成提议——当同一任务重新出现在提议中时自动清除旧答复,也就是确认按每一次提议生效,而不是按任务永久生效。
  • 修复:选中文字过长(>800 字)或选区没有可用几何信息时,浮出的按钮不隐藏,点它会加入上一次的旧文本;现在这类情况一律隐藏。
  • 修复:保存的悬浮窗位置在小屏上可能开出屏幕外、拖不回来;现在读取时按当前窗口尺寸夹取。
  • 修复:添加任务输入框的回车判断 isComposing / keyCode 229,中文输入法选词时的回车不再把半截拼音加成任务。
  • 修复:浮出按钮的 tooltip 与按钮文案一致(多条目时悬停也显示「添加 N 个任务」)。
  • 清理:删除 4 个未使用的文案键与一个空 useEffect。

1.1.2

  • 修复:「清除已完成」只清了用户任务,模型建议任务永远清不掉。现在两类任务都会被清除(待确认的除外,避免你在回答前就消失)。
  • 修复:确认「发送」后任务状态没有标记为「进行中」;现在发送成功会自动置为进行中(不会把已完成的任务降级)。

1.1.1

  • 修复:npm 页面的截图裂图——README 改用绝对图片地址,并把 docs/*.png 纳入发布文件。

1.1.0

  • 新增:选中对话文字直接建任务;选中渲染出来的列表时按条目批量建任务(「+ 添加 N 个任务」)。
  • 新增:每行显示状态文字(待办 / 进行中 / 已完成),不再只能靠颜色猜。
  • 新增:单键切换状态(标记进行中 → ✓ 完成 → 重新打开);模型任务也能改状态、能删除。
  • 新增:点「开始」先弹确认条,确认后才发送到对话。
  • 修复:深色模式下主按钮白底白字不可读(brand-primary 是会反转的中性色);「进行中」改用琥珀色。
  • 修复:浮出的「添加为任务」按钮被原生「引用文本」气泡挡住。

许可证

MIT © caipanjin

Plugins associés