dsh-composer-plus 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="装有 Composer Plus 的 DeepSeek Harness:正在运行的项目在侧边栏中显示加载图标,改动面板显示 git diff"></p>
16
16
 
17
- 这是非官方的社区插件。插件只在检查更新时访问网络(GitHub releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词** 才会调用模型。**任务看板** 会为你在看板上开始的每个任务调用一次新对话的模型,用来生成标签。**目标检查**(默认开启)在智能体每次于自动轮次中把 `/goal` 标记为完成时调用一次模型。**手机连接**(默认关闭)只有在你开启后,才会接受来自本地网络或 tailnet 的 iPhone 连接。
17
+ 这是非官方的社区插件。插件只在检查更新时访问网络(GitHub releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词** 才会调用模型。**任务看板** 会为你在看板上开始的每个任务调用一次新对话的模型,用来生成标签。使用 **AI 摘要** 设置时(默认是 **快速(不用 AI)**),当你在看板或 Tether 中查看正在运行的任务的进度时,它还会调用该对话的模型,写一段简短的进度说明。**目标检查**(默认开启)在智能体每次于自动轮次中把 `/goal` 标记为完成时调用一次模型。**手机连接**(默认关闭)只有在你开启后,才会接受来自本地网络或 tailnet 的 iPhone 连接。
18
18
 
19
19
  ## 安装
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  然后重启 dsh。(CLI 无法安装到桌面版 profile 中;桌面版 profile 由应用自己管理。)
31
31
 
32
- > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.19.0`。
32
+ > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.20.0`。
33
33
 
34
34
  ## 功能
35
35
 
@@ -71,7 +71,7 @@ dsh plugin --profile web add dsh-composer-plus
71
71
  | **计划步骤** | <a id="feature-plannedsteps"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。智能体会获得工具 `plan_next_steps`:它可以在发出某条命令的同一条消息中,预先计划接下来的命令及其确切参数和条件,例如“构建通过后运行 `npm test`”。结果满足条件时,Composer Plus 会自行运行下一步,无需再次调用模型,因此长对话消耗的令牌更少。该步骤在对话中显示为一行简短说明“Composer Plus · Planned steps: ran `test` … without a model call”,随后是它的工具调用和结果。仅限 `bash`、`read`、`grep` 和 `glob` 步骤;审批、沙箱和受保护的文件照常作用于每一步。条件不满足、同时有两个步骤就绪、最后一步完成后以及你发送消息时,模型会重新作答。这个想法来自 HarnessMM(arXiv 2610.32813)。 | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="截图:计划步骤"></a> |
72
72
  | **受保护的文件** | <a id="feature-protectedfiles"></a>默认开启。智能体自己的文件工具不能读取或更改与你的模式匹配的文件:对于 **读取和写入** 模式,对文件使用的 `read`、`read_image` 和 `grep` 会被拒绝;两种模式下 `write`、`edit` 和 `str_replace_editor` 都会被拒绝。智能体会看到原因,并被告知要问你。默认模式是 `.env*`、`*.pem` 和 `*.key`。设置 → Composer Plus → **受保护的文件**:添加一个模式(例如 `published/**` 或 `config/*.yml`),点击它的类型可在 **读取和写入** 与 **仅写入** 之间切换,用 ✕ 移除它,或点击 **使用默认值**。不含 `/` 的模式会匹配任意文件夹中的文件名。这是护栏,不是沙箱:shell 命令(`cat .env`)、脚本或 MCP 工具仍能访问该文件(见“限制”)。 | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="截图:受保护的文件"></a> |
73
73
  | **禁止的命令** | <a id="feature-blockedcommands"></a>默认开启,列表为空。智能体的 shell 命令(`bash`、`pwsh`)不能运行与你的规则匹配的命令:**阻止** 规则会拒绝调用(智能体会看到原因,并被告知要问你),**先询问** 规则会显示 dsh 的审批卡片,只有你允许后命令才会运行。设置 → Composer Plus → **禁止的命令**:输入一条规则(例如 `npm publish`、`git push --force` 或 `ssh *192.168.2.19`),点击类型可在 **阻止** 与 **先询问** 之间切换,然后点击 **添加**;点击规则的类型可以更改它,用 ✕ 移除它。一条规则是一个命令名和必须按此顺序出现在它后面的词;`*` 匹配任意文本。它也能找到 `&&`、`;`、`\|` 之后,`$(…)`、`bash -c "…"` 或 `eval` 之中,以及 `sudo` 或 `env` 之后的命令。这是护栏,不是沙箱:变量(`$CMD`)、脚本文件或其他程序仍能运行该命令(见“限制”)。 | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="截图:禁止的命令"></a> |
74
- | **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**。dsh 对话的看板,显示与侧边栏相同的实时状态:等待你审批、回答或审阅计划的对话在**审核**中并带橙色圆点,运行中的对话在**进行中**,已完成的对话在**已完成**中(打开前为绿色)。在左侧选择一个项目或**所有项目**;“每个对话一个分支”的文件夹算作它所属的项目。**新建任务**(或按 `n`)只需输入提示:按 `Enter` 会在项目中开始一个新对话,卡片显示在**待办**中,dsh 为对话命名,对话的模型最多写出 3 个标签。点击卡片可打开它的对话。在橙色卡片上点击**回答**,即可直接在看板上回答:**拒绝**或**允许一次**;计划则选**同意执行**或**要求修改**;问题则选择选项或输入你自己的文字。**隐藏已完成**会在此设备上隐藏**已完成**。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="截图:任务看板"></a> |
74
+ | **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**。dsh 对话的看板,显示与侧边栏相同的实时状态:等待你审批、回答或审阅计划的对话在**审核**中并带橙色圆点,运行中的对话在**进行中**,已完成的对话在**已完成**中(打开前为绿色)。在左侧选择一个项目或**所有项目**;“每个对话一个分支”的文件夹算作它所属的项目。在列表上方的**搜索项目**中输入,可按名称查找项目(不区分大小写和重音符号;按 `Esc` 清空搜索框);点击**最近 2 小时内活跃**,则只显示有对话正在等待、正在运行、已完成但尚未查看,或在最近 2 小时内有变化的项目(此设置保存在此设备上)。**新建任务**(或按 `n`)会在看板显示的项目中打开 dsh 自己的新对话(选择**所有项目**时,在 dsh 的新会话所选的项目中打开),因此你可以像在任何对话中一样添加文件、使用命令和选择模型。你的第一条消息发出后,会自动回到看板。在此之前,该对话以**新建任务**显示在**待办**中:点击它即可写第一条消息。只有这时才显示**待办**列。有对话在等待你的项目,在项目列表中带橙色圆点。dsh 为对话命名,对话的模型根据这条消息最多写出 3 个标签。点击卡片可打开它的对话。在橙色卡片上点击**回答**,即可直接在看板上回答:**拒绝**或**允许一次**;计划则选**同意执行**或**要求修改**;问题则选择选项或输入你自己的文字。**隐藏已完成**会在此设备上隐藏**已完成**。将指针指向**进行中**里的卡片(或把键盘焦点移到卡片上),即可看到它的进度:运行了多久、待办列表中的当前步骤、正在运行的工具,以及智能体的最后一行。在设置 → Composer Plus → 任务看板中,**悬停显示进度**可选择**快速(不用 AI)**(默认:只读取对话)或 **AI 摘要**(再向对话的模型发送一次简短调用,额外写出一两句话)。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="截图:任务看板"></a> |
75
75
  | **项目记忆** | <a id="feature-projectmemory"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。每个项目文件夹都有自己的记忆,该项目之后的对话都会读取,就像 DS Bot 为每个 Bot 保存一份记忆。每个回合结束后,会用对话的模型调用一次,读取新消息(不含已回滚的消息),把你长期的偏好、决定和事实保存为简短笔记,并修改或删除旧笔记。智能体也可以自己保存、删除和搜索笔记(`memory_remember`、`memory_forget`、`memory_recall`)。笔记也可以是全局的:所有项目都会读取。新对话会在系统提示词中获得这些笔记;之后保存的笔记从下一个对话开始显示。文件是 dsh 主目录下的 Markdown(`storages/dsh-composer-plus/memory/`),绝不写入项目文件夹。 同一行的 **打开记忆** 会按项目(以及全局记忆)分组显示所有已保存的笔记,并可筛选。用你自己的话写下要修改的内容(例如“我从 yarn 换成了 pnpm”),然后点 **预览修改**:由 dsh 的默认模型提出修改,只有点 **应用** 才会保存。在 Tether 中:聊天标题菜单 → Project memory。 | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="截图:项目记忆"></a> |
76
76
  | **本对话内允许** | <a id="feature-allowforchat"></a>当 Auto Review 询问你时,审批卡片上会多出 **本对话内允许**:从此以后,同一对话中的同一工具都会被允许,参数不限,直到时限结束(默认 1 小时;可在 **设置 → Composer Plus → 本对话内允许** 中选择)。之后代理会再次询问。标题栏中的标签会列出这些授权及其结束时间,也可以撤销它们。授权在重启后仍然有效。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="截图:本对话内允许"></a> |
77
77
  | **项目状态** | <a id="feature-projectstatus"></a>侧边栏中的项目行会显示与其对话相同的加载图标 / 等待 / 完成标记。因此,即使项目已折叠,你也能知道其中有对话正在运行或需要你处理。等待你处理的对话优先显示,其次是你尚未打开的已完成对话(绿色圆点,即使另一个对话仍在运行也会显示),最后是加载图标。将鼠标悬停在上面可查看详情。在**按工作区树**中,父文件夹的行也会显示其中每个项目(例如 `.worktrees/` 中的每个分支文件夹)的对话状态,折叠时也一样。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:项目状态"></a> |
@@ -169,7 +169,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
169
169
  - **目标检查:** 只有当智能体在自动轮次中把 `/goal` 标记为完成时(或者你点击 **立即运行** 时)才会运行。Host 端在对话的文件夹中、按对话的沙箱模式运行测试命令(与 dsh 自己的 `bash` 工具相同:同样的文件访问策略;沙箱无法启动时,测试不会运行,检查判为失败)。为了找到命令,它只读取 `package.json`、`Makefile`、`Cargo.toml`、`go.mod`、`pyproject.toml` 和 `pytest.ini`,并且只读取文件夹内的普通文件(不跟随指向文件夹外部的符号链接,不读取 FIFO)。然后,它以一次不带工具的请求,把以下内容发送给在 **目标检查** 下选择的模型(默认为对话自己的模型):目标;从目标开始以来的对话(你的消息、智能体的回复、截断到 1,000 个字符的工具调用以及每个工具结果的最后 2,000 个字符;不含推理内容和已回退的步骤;最多约 60,000 个字符,最新的部分);`git status --short`;以及测试输出的末尾。工具输出可能包含智能体读取过的内容,因此这次请求可能包含你文件的一部分,与对话本身相同。对话和项目中都不会写入任何内容。你的测试命令、上限、上次结果(含其输出的末尾)和模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` 中(仅所有者可访问的文件,最新的 500 个对话)。
170
170
  - **在新对话中继续:** 在你点击之前,什么都不会运行。点击后,Host 端会把对话(与目标检查读取的方式相同:不含推理内容和已回退的步骤)发送给对话自己的模型,并显示交接说明;只有 **开始新对话** 才会创建新对话。项目中不会写入任何内容。
171
171
  - **上下文明细:** 只在 Host 上读取对话日志;不调用模型,不读取项目文件。
172
- - **任务看板:** 看板显示 dsh 自己的对话,数据来自 dsh 在此窗口中自己的列表;它不会添加自己的对话数据。你开始一个任务时,Host 端会在你选择的项目中新建一个对话,并把你的提示作为第一条消息发送给它,就像你在那里输入的一样,因此审批、沙箱和对话的模型照常适用。然后,它会以另一次不带工具的请求,把提示(只有前 4,000 个字符,没有其他内容)发送给该对话的模型,以获得最多 3 个标签。每个任务的提示、标签和开始时间保存在 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` 中(仅所有者可访问的文件,保留最新的 2,000 个);开关保存在旁边的 `board-switch.json` 中。不会向任何项目文件夹写入内容。**回答** 会把你的回答发送给 dsh 自己的待处理请求,与对话中自己的卡片做法相同。早期版本的旧任务列表(`board.json`)原样留在磁盘上,不会被读取。
172
+ - **任务看板:** 看板显示 dsh 自己的对话,数据来自 dsh 在此窗口中自己的列表;它不会添加自己的对话数据。**新建任务** 会打开 dsh 自己的新对话,你在 dsh 的输入框中写第一条消息,因此审批、沙箱和对话的模型照常适用。Host 端把该对话的第一条消息保存为卡片的提示,并以另一次不带工具的请求,把它(只有前 4,000 个字符,没有其他内容)发送给该对话的模型,以获得最多 3 个标签。每个任务的提示、标签和开始时间保存在 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` 中(仅所有者可访问的文件,保留最新的 2,000 个);开关保存在旁边的 `board-switch.json` 中。不会向任何项目文件夹写入内容。**回答** 会把你的回答发送给 dsh 自己的待处理请求,与对话中自己的卡片做法相同。早期版本的旧任务列表(`board.json`)原样留在磁盘上,不会被读取。**悬停显示进度** 在这台 Mac 上读取对话的日志。使用 **快速(不用 AI)**(默认)时,不发送任何内容。使用 **AI 摘要** 时,在正在运行的卡片的进度框显示期间(或在 Tether 的看板打开期间,最多 8 张正在运行的卡片),Host 端会把该对话最新的部分(最多约 6,000 个字符:你的消息、智能体的文字回复、它的工具调用及其结果的末尾;不含推理和已回退的消息)以一次不带工具的请求发送给该对话的模型。只有在对话有了新进展后才会再次发送,每个对话最多每 20 秒一次。说明只保存在内存中;设置保存在 `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` 中(仅所有者可访问的文件)。
173
173
  - **受保护的文件:** 列表和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` 中(仅所有者可访问的文件)。检查只读取每次文件工具调用的路径(及其真实路径),从不读取文件本身。
174
174
  - **禁止的命令:** 规则和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` 中(仅所有者可访问的文件)。检查只读取每次 `bash` 和 `pwsh` 调用的命令文本;它不运行任何内容,也不发送任何内容。
175
175
  - **项目记忆:** 在你开启之前一直关闭。开启后,每个顶层对话的回合结束时,Host 部分会把该对话自上次整理以来的新消息(你的消息和智能体的文字回复;不含工具输出、推理、隐藏上下文和已回滚的消息;分叉对话中复制自父对话的部分不算在内;最多约 16,000 个字符)和已保存的笔记,作为一次不带工具的请求发给对话自己的模型。笔记是 `$DSH_HOME/storages/dsh-composer-plus/memory/` 下的 Markdown 文件(仅所有者可读写):每个项目文件夹对应 `projects/<id>/`(`<id>` 是文件夹真实路径的哈希;`project.json` 记录文件夹路径),另有 `global/`、`journal.jsonl`(每次改动及改动前后的那一行)和 `reviewed.json`(每个对话读到的位置)。项目文件夹中不会写入任何内容。看起来像密钥、令牌、密码或证件号码的笔记会被拒绝。项目的笔记会进入该文件夹中每个新对话的系统提示词,因此该对话的每次请求都会把它们发给模型。开关保存在同一位置的 `memory.json` 中。在你点 **预览修改** 之前,**打开记忆** 不会发送任何内容;点了之后,它会把显示的笔记和你的文字作为一次不带工具的请求发给 dsh 的默认模型。修改只在点 **应用** 时写入,日志中记为 `editor`。Tether 通过同一路由读取和修改笔记。
@@ -194,7 +194,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
194
194
  - **对话行上没有分支标签:** 侧边栏不是“单列表”视图(在“按工作区”和“按工作区树”中,对话行都不显示标签);或者安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
195
195
  - **目标检查显示测试以代码 127 或 “not found” 退出:** 从 Finder 或程序坞启动的 dsh 的 PATH 可能比终端里的短,因此找不到 `npm`、`pnpm` 或 `cargo`。请从终端启动 dsh,或者在 **目标检查** → **编辑** 中用完整路径设置你自己的测试命令。**立即运行** 会马上显示结果。
196
196
  - **目标没有关闭,智能体一直在工作:** **目标检查** 发现了失败的测试或缺少的工作;目标下方的一行会显示原因(将鼠标悬停在结果上可查看详情)。请修正原因或测试命令,或者用 `/goal` 或目标栏自己完成目标(这不会被检查)。
197
- - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.19.0`),见上文的安装说明。
197
+ - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.20.0`),见上文的安装说明。
198
198
  - **立即备份显示“另一个备份操作正在进行”:** 另一个 dsh 窗口或救援控制台中正在运行一个操作(它们共用备份文件夹中的锁文件 `.composer-plus.lock`)。请等待它完成。如果没有操作在运行,下次点击时会接管已关闭进程留下的锁。
199
199
  - **救援控制台显示“dsh is running”:** 请先退出 dsh。如果 dsh 确实已关闭,消息中提到的文件是崩溃后留下的:删除它,然后重试。
200
200
  - **恢复后 dsh 无法启动或缺少插件:** 需要重新安装 profile 的插件包。恢复后,救援控制台会提供这一步;你也可以在它列出的 `$DSH_HOME/profiles/` 下的每个文件夹中运行 `pnpm install`。不在 vault 中的机密(另一台电脑)必须重新输入:控制台会列出它们。
@@ -249,7 +249,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
249
249
  - **在新对话中继续** 会把对话(消息、工具调用以及每个工具结果的末尾,最多约 60,000 个字符,最新的部分)发送给对话自己的模型。交接说明可能漏掉某个决定或文件:开始前请先阅读。新对话只知道这份交接说明和链接的对话(dsh 会把旧对话作为只读上下文附加进来);它的模型上下文从很小开始,旧对话保持不变。每个对话同一时间只能进行一次写说明或开始操作。
250
250
  - **上下文明细** 按 dsh 自己的规则显示估算值(每个 token 约 4 个字符),与 dsh 的上下文环使用相同的规则;模型自己的计数可能不同。工具定义取自最新的一次请求。它按对话日志中的样子显示上下文;正在运行的回合会在它的下一步之后出现。
251
251
  - **计划步骤** 只有在模型确实做了计划时才会节省令牌:开启后,每个请求都会带上 `plan_next_steps` 工具和一段简短说明(约 500 个令牌),即使在模型从不做计划的对话中也是如此。条件只证明它所写的内容(例如:构建的退出码为 0),并不证明工作正确。`ok` 读取 dsh 自己的结果标记(`[exit code: N]`、超时、沙箱拒绝);一个失败但退出码不为非零的命令会被视为通过。步骤一次只运行一个;同时就绪的两个步骤会交回给模型。该步骤的消息会作为对话模型的助手消息保存(dsh 没有标记插件所写消息的方式),因此它的文字会说明是 Composer Plus 运行的。Tether 中没有此功能。
252
- - **任务看板** 显示 dsh 在此窗口中列出的对话:不在项目中的对话只显示在**所有项目**中,“每个对话一个分支”的文件夹(`<project>/.worktrees/<name>`)算作它所属的项目。卡片所在的列就是对话的实时状态,因此卡片不能拖动:对话的回合结束时(包括出错或停止之后)会移到**已完成**,再次运行时会回到**进行中**。绿色圆点是 dsh 自己的完成圆点,dsh 只在此窗口中保留它:重新加载后,已完成的对话不再显示圆点。**已完成** 显示最新的 50 个对话(**显示更早的 N 个** 显示其余对话)。标签来自每个已开始任务的一次模型调用:它们可能不准确,不是在看板上开始的对话没有标签。标题是 dsh 自己的对话标题(由 dsh 的标题服务使用对话的模型生成);标题出现前,卡片显示提示的第一行。以 dsh 认识的 `/` 命令(`/plan`、`/goal`)开头的提示会作为该命令运行。**回答** 只回答对话最新的请求:如果对话已在别处(另一个窗口、Tether、Auto Review)回答了它,或提出了新的问题,面板会说明这一点,并且不发送任何内容。早期版本有带评论和智能体工具的任务列表;它们已被移除,旧的 `board.json` 不会显示。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。
252
+ - **任务看板** 显示 dsh 在此窗口中列出的对话:不在项目中的对话只显示在**所有项目**中,“每个对话一个分支”的文件夹(`<project>/.worktrees/<name>`)算作它所属的项目。卡片所在的列就是对话的实时状态,因此卡片不能拖动:对话的回合结束时(包括出错或停止之后)会移到**已完成**,再次运行时会回到**进行中**。绿色圆点是 dsh 自己的完成圆点,dsh 只在此窗口中保留它:重新加载后,已完成的对话不再显示圆点。**已完成** 显示最新的 50 个对话(**显示更早的 N 个** 显示其余对话)。**搜索项目** 只按名称查找项目,不按文件夹路径查找。当项目的所有对话都超过 2 小时、处于空闲且已读时,**最近 2 小时内活跃** 会隐藏该项目;看板仍会显示你选择的项目。**新建任务** 只记住此窗口中最新的一个新对话:如果你在发出第一条消息前打开了另一个对话,该对话会以 **新建任务** 留在 **待办** 中,直到你在其中写消息,但只有最新的那个对话会自动回到看板。重新加载后,没有消息的新对话不会出现在看板上(dsh 把它保留为自己的空白新会话)。标签来自每个任务根据其第一条消息进行的一次模型调用:它们可能不准确,不是在看板上开始的对话没有标签。标题是 dsh 自己的对话标题(由 dsh 的标题服务使用对话的模型生成);标题出现前,卡片显示第一条消息的第一行。**回答** 只回答对话最新的请求:如果对话已在别处(另一个窗口、Tether、Auto Review)回答了它,或提出了新的问题,面板会说明这一点,并且不发送任何内容。早期版本有带评论和智能体工具的任务列表;它们已被移除,旧的 `board.json` 不会显示。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。
253
253
  - **停止后发送的消息优先** 只在你停止对话后生效(或在某一轮失败后,或打开仍有队列的对话时):对话运行时发送的消息仍会排在队列末尾。它只会越过你自己的排队消息:如果队列中有目标轮次或问题回复,仍保持 dsh 自己的顺序。它会读取 dsh 中一个非公开 API 的部分(被停止的那一轮是否仍在结束中);如果 dsh 更新后改了它的名称,消息要等那一轮结束后才会被移到前面。子代理对话保持 dsh 自己的顺序。
254
254
  - **项目记忆** 属于对话的第一个文件夹(dsh 的项目文件夹):用 `cd` 更换文件夹的对话仍使用第一个项目的记忆;通过另一条路径打开的同一文件夹共用同一份记忆。对话开始时会冻结其记忆部分,所以之后保存的笔记从下一个对话开始显示(`memory_recall` 能立即找到)。整理只保留模型决定保留的内容:它可能漏掉某个事实,也可能保留错误的内容;请在 **打开记忆** 中检查并在那里修改,或在 dsh 关闭时手动编辑文件。**打开记忆** 会把所选项目的笔记和全局笔记(选择“全部笔记”时为所有项目;最多约 60,000 个字符,其余只计数,在该次请求中无法修改)以及你的文字发送给 dsh 的默认模型,而不是对话的模型。预览在 Mac 上保留 30 分钟,直到 dsh 重启;如果在此期间整理或智能体修改了笔记,**应用** 会拒绝,你需要重新预览。**应用** 要么保存预览中的全部修改,要么一项也不保存:只要有一项修改无法保存(例如 MEMORY.md 已满),笔记就保持原样,并显示原因。每个包含你的消息的回合结束后都会调用一次模型;调用失败时,下一个回合后会再次读取同样的消息。子智能体对话不做整理。这个思路和文件格式来自 [DS Bot](https://github.com/Fei2411/DS-Bot)(Apache-2.0);Composer Plus 没有使用它的代码,也从不读取或写入 DS Bot 自己的记忆。
255
255
  - **备份** 只使用一个固定文件夹 `~/Desktop/dsh-backups`(dsh-backup 的默认文件夹,因此它的归档仍然可用);没有设置可以改用其他文件夹。归档大小约等于不含 `cache/` 和 `dsh-runtimes/` 的 dsh 主目录(实测:在 Apple Silicon 上,1.6 GB 的文件约用 30 秒生成 830 MB 的归档;期间 dsh 保持响应)。读取期间发生变化的文件,会按备份打开它时的状态保存,因此打开中的对话的日志末尾可能是一条被截断的记录,dsh 会在下次写入时修复它。遮蔽按单行中的键名查找 yml 文件中的机密(`token:`、`apiKey:`、…);流式映射(`{token: x}`)中、此类键下的列表中、JSON 文件中(例如 `.json` 文件中某个 MCP 服务器的 `apiKey`)或使用其他名称的机密会留在归档中。dsh-backup 按类型生成的归档(`dsh-t-…`)不会列出。**用于另一台电脑** 会复制归档(在 APFS 上是克隆:不占用额外空间);vault 不会随之复制。**立即备份** 不会删除任何备份。自动备份会保留 Composer Plus 生成的最新备份(**自动备份** 的 **保留** 设置),并删除它生成的更早备份;升级前的快照单独计数(保留最新的 2 份)。dsh-backup 的归档永远不会被删除:请用 **删除** 移除它们。只要 dsh-backup 仍已安装,它就会把 Composer Plus 的归档计入自己的保留份数,并可能删除它们。
@@ -286,7 +286,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
286
286
 
287
287
  **智能体能像 DS Bot 的记忆那样,在不同对话之间记住我的偏好吗?** 可以,使用 **项目记忆**(默认关闭):在 **设置 → Composer Plus** 中开启。每个回合结束后,你长期的偏好和决定会作为简短笔记保存到该对话的项目中,该项目的每个新对话都会读取。让智能体记住某件事,它会立即保存。要查看或修改笔记,请点同一行的 **打开记忆**,写下要修改的内容。
288
288
 
289
- **我能把所有对话看成一个看板,并从中开始新对话吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它。每个对话都是一张卡片,位于**进行中**、**审核**(等待你处理)或**已完成**中。**新建任务**只需输入提示,并用它开始一个新对话;在橙色卡片上点击**回答**,无需打开对话即可回答。
289
+ **我能把所有对话看成一个看板,并从中开始新对话吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它。每个对话都是一张卡片,位于**进行中**、**审核**(等待你处理)或**已完成**中。**新建任务**会在项目中打开 dsh 的新对话,你的第一条消息发出后会回到看板;在橙色卡片上点击**回答**,无需打开对话即可回答。
290
290
 
291
291
  **dsh 能像 dsh-backup 那样备份我的对话和设置吗?** 可以:**设置 → Composer Plus → 备份 → 立即备份**。它把相同格式的归档写入同一个文件夹(`~/Desktop/dsh-backups`),因此 dsh-backup 的归档也会显示并可以恢复,你可以卸载 dsh-backup。打开 **自动备份** 即可按计划备份。
292
292
 
@@ -408,7 +408,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
408
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
409
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
410
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
- # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
411
+ # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, Hide finished, the switch
412
412
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
413
413
  ```
414
414
 
Binary file