dsh-composer-plus 1.12.0 → 1.13.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.de.md +36 -13
- package/README.es.md +36 -13
- package/README.fr.md +36 -13
- package/README.hi.md +36 -13
- package/README.id.md +36 -13
- package/README.ja.md +36 -13
- package/README.ko.md +36 -13
- package/README.md +36 -13
- package/README.pt-BR.md +36 -13
- package/README.ru.md +36 -13
- package/README.tr.md +36 -13
- package/README.vi.md +36 -13
- package/README.zh.md +36 -13
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/client.js +917 -133
- package/index.js +439 -83
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +98 -28
package/README.zh.md
CHANGED
|
@@ -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.
|
|
32
|
+
> dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.13.0`。
|
|
33
33
|
|
|
34
34
|
## 功能
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
37
37
|
|
|
38
38
|
| 功能 | 使用方法 | 截图 |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **改动面板** | <a id="feature-changespanel"></a>右侧边栏 → `+` → **改动**。选择 **未提交**、**未暂存**、**已暂存** 或 **分支**,即可查看有改动的文件及其 `+/-` 行数;点击某个文件可查看它的差异。**上一轮** 会打开 dsh
|
|
40
|
+
| **改动面板** | <a id="feature-changespanel"></a>右侧边栏 → `+` → **改动**。选择 **未提交**、**未暂存**、**已暂存** 或 **分支**,即可查看有改动的文件及其 `+/-` 行数;点击某个文件可查看它的差异。**上一轮** 会打开 dsh 自带的最近一轮改动审阅。点击分支名(或选择 **树**)即可查看分支树:点击上方的分支会跳到该分支,点击提交可查看它的文件及差异。**本对话** 只列出当前对话的文件工具(write、edit)在所有轮次中写入的文件,以及从第一条消息起的总差异。**␣** 按钮可隐藏空白改动(`git diff -w`):仅缩进或换行符改变的行不显示。 | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="截图:改动面板"></a> |
|
|
41
41
|
| **功能创意** | <a id="feature-featureideas"></a>右侧边栏 → `+` → **功能创意** → **推荐功能**。对话自己的模型会读取对话所属项目的简短概要(顶层文件、README 和清单文件的开头部分、最近 15 次提交),并推荐最多 8 个功能。这些功能以一叠卡片的形式显示,语言与 dsh 的界面语言一致。向右滑动卡片(或点击 **✓**,或按 `→`;无论哪种方式,卡片都会飞向对应的一侧),即可在同一项目中新建对话:新对话以计划模式启动,并把该创意作为请求,因此在你批准计划之前不会有任何改动。要跳过计划,请点击 **▶ 直接实现**(或按 `↑`;卡片会向上飞出):新对话会立即启动,并把该创意作为普通请求,模型会做出改动并运行检查(审批照常适用)。向左滑动(或点击 **✕**,或按 `←`)可跳过;**撤销**(或按 `Z`)可找回跳过的卡片。点击 **↓**(或按 `↓`)可把好的创意留到以后:它会进入项目的 **稍后** 列表,同一项目文件夹中的每个对话都会显示这个列表(重启后也一样)。**稍后(N)** 会打开这个列表;**规划** 会为该创意启动同样的计划模式对话,**直接实现** 则启动不做规划的对话,两者都会把它从列表中移除;**全部合并规划(N)** 会为列表中的所有创意启动一个计划模式对话,因此共同的部分只需规划一次;**从列表中移除** 会删除它。**复制为清单** 会把整个列表以 Markdown 清单的形式复制到剪贴板(`- [ ] Title — Summary`,每个创意一行),可用于问题跟踪器或 TODO 文件;它不会发起任何网络请求。**更多创意** 会添加更多卡片。如果只想获得某一方面的创意,请在 **推荐功能** 旁边的输入框中输入一个简短的 **关注主题**(最多 80 个字符;按 `Enter` 也会开始推荐),或点击输入框下方的某个固定主题:**性能**、**无障碍**、**测试**、**安全**、**易用性** 或 **文档**(再次点击可清除)。之后,模型只会推荐与该主题相关的功能;输入框为空表示不限主题。同一项目中不会重复推荐同一个创意:每个推荐过的创意(跳过的、留到以后的或已开始的)都会进入项目的 **历史**,模型会被告知不要再推荐这些创意,标题重复的创意会被丢弃。**历史** 会列出这些创意,并标为 **已开始** 或 **已建议**;**忘记**(或 **全部忘记**)可让某个创意再次出现;仍在 **稍后** 列表中的创意不会被推荐,直到你从该列表中移除它。只有在你点击时才会调用模型。 | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="截图:功能创意"></a> |
|
|
42
42
|
| **内容搜索** | <a id="feature-contentsearch"></a>dsh 自带的侧边栏搜索(**工作区** 旁边的放大镜;桌面应用中按 `Cmd+K`,浏览器中按 `Cmd+Alt+K`)不仅能按标题查找对话,还能按你的消息和回复中的词语查找对话,并在对话下方显示匹配的文字。dsh 本身已经带有这个搜索功能,但默认是关闭的;本功能会开启它,并在你的电脑上为它提供一个搜索索引文件。每次启动后的第一次搜索会创建索引(250 个对话约需 15 秒,见“限制”),之后的启动会继续使用这个索引。默认开启;更改在重启 dsh 后生效。 | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="截图:内容搜索"></a> |
|
|
43
|
-
| **回合回退** | <a id="feature-turnrollback"></a>将鼠标悬停在你的某条消息上,点击 **↶**(在“复制”旁边)。**仅对话** 会把这条消息及其后的所有内容(回复、工具调用)从对话和模型上下文中移除,并把这条消息放回输入框:修改后再次发送即可。**对话和文件** 会先列出这条消息之后发生变化的项目文件,然后把它们也恢复原样。这也包括命令(`bash`)所做的更改,而不只是 dsh 编辑工具所做的更改。正在运行的回合会先停止。对话日志永远不会被重写:一个隐藏标记会隐藏被撤回的部分,方式与 dsh 自带的 `/compact` 隐藏旧消息相同。如果安装了 [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin),则由它负责这项工作,Composer Plus
|
|
43
|
+
| **回合回退** | <a id="feature-turnrollback"></a>将鼠标悬停在你的某条消息上,点击 **↶**(在“复制”旁边)。**仅对话** 会把这条消息及其后的所有内容(回复、工具调用)从对话和模型上下文中移除,并把这条消息放回输入框:修改后再次发送即可。**对话和文件** 会先列出这条消息之后发生变化的项目文件,然后把它们也恢复原样。这也包括命令(`bash`)所做的更改,而不只是 dsh 编辑工具所做的更改。正在运行的回合会先停止。对话日志永远不会被重写:一个隐藏标记会隐藏被撤回的部分,方式与 dsh 自带的 `/compact` 隐藏旧消息相同。如果安装了 [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin),则由它负责这项工作,Composer Plus 不会再显示第二个按钮。回退之后,输入框上方会出现 **重新应用** 栏:它会从回退之前开始一个新对话(消息和上下文相同),选择 **对话和文件** 时还会恢复文件;回退之后你更改过的文件会被列出并保留,除非你勾选覆盖它的选项。 | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="截图:回合回退"></a> |
|
|
44
44
|
| **删除对话** | <a id="feature-deletechat"></a>侧边栏 → 对话的 **…** 菜单(或右键点击)→ **删除…** → **删除**。dsh 本身只能归档。对话会停止(包括它的回合、后台任务、子代理和定时任务,与 dsh 自带的归档相同),它保存的历史记录连同子代理对话会移到 macOS 废纸篓(在其他系统上为 `$DSH_HOME/trash`)。要找回它,请把文件夹放回原处并重启 dsh:它会显示在侧边栏的 **仅显示已归档** 视图中。 | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="截图:删除对话"></a> |
|
|
45
45
|
| **输入框中的项目名称** | <a id="feature-projectname"></a>输入框下方那一行(回合数、token、缓存命中、上下文)以对话的项目名称开头,让你随时知道对话在哪个项目中工作。这里显示的是 dsh 自己的项目标题;项目没有标题时,显示文件夹名称。将鼠标悬停在上面可查看完整的文件夹路径。点击它可在侧边栏中找到该对话(列表视图和项目视图均可):侧边栏和项目会展开(折叠的项目及其 **展开其余 N 个会话** 也会展开),列表会滚动到该对话,该对话会闪烁 5 秒。 | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="截图:输入框中的项目名称"></a> |
|
|
46
46
|
| **输入历史** | <a id="feature-inputhistory"></a>在空输入框中按 `↑` / `↓`,可以像在终端里一样浏览你发送过的消息。 | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="截图:输入历史"></a> |
|
|
@@ -49,22 +49,25 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
49
49
|
| **一键继续** | <a id="feature-continuebutton"></a>回合被停止、失败或中断后,空输入框会显示 **▶**。点击一次即可在现有对话的基础上继续,不需要在输入框中输入内容,也不会添加可见的对话消息(模型会收到一条简短的隐藏提示“从停止的地方继续”,因为部分提供商,例如 Claude,会拒绝以助手回复结尾的请求)。队列中的消息会保留:▶ 只继续被停止的任务,之后再运行队列。已完成的回合仍显示普通的发送按钮。 | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="截图:一键继续"></a> |
|
|
50
50
|
| **重启后继续** | <a id="feature-resumeafterrestart"></a>默认关闭:请在 **设置 → Composer Plus** 中开启。如果你在对话仍在运行时退出 dsh(或 dsh 被关闭),再次打开 dsh 后,该对话会自动继续,并使用与“一键继续”相同的隐藏提示。如果当时有目标轮次(`/goal`)正在运行,该目标会继续下一轮(dsh 每次启动时都会暂停目标,直到你恢复它们)。你停止的、已完成的或失败的对话不会继续。dsh 本身没有这项设置:它只会把这样的回合标记为已中断。 | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="截图:重启后继续"></a> |
|
|
51
51
|
| **队列拖拽排序** | <a id="feature-queuereorder"></a>排队的消息会带一个把手(⠿)。拖动它即可调整顺序,或者让把手获得焦点后按 `↑` / `↓`。按 `Esc` 取消。 | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="截图:队列拖拽排序"></a> |
|
|
52
|
+
| **原地编辑排队消息** | <a id="feature-queueedit"></a>双击一条排队的消息,它会变成 dsh 自带的编辑框:修改文字后按 `Enter` 保存,按 `Esc` 取消。消息在队列中的位置不变。带图片或文件的消息不能这样编辑(dsh 的队列只能编辑文字)。 | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="截图:原地编辑排队消息"></a> |
|
|
52
53
|
| **复制会话链接** | <a id="feature-copydeeplink"></a>在侧边栏中右键点击对话 → **复制会话链接**。把 `dsh-session:…` 链接粘贴到另一个对话中,即可把那个对话作为只读上下文附加进来。dsh 0.2.1 自带 **复制 Session ID**,它只复制纯 ID;本菜单项紧跟在它后面。 | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="截图:复制会话链接"></a> |
|
|
54
|
+
| **复制消息链接** | <a id="feature-copymessagelink"></a>将鼠标悬停在一条消息上,点击 **🔗**(在它的操作栏中;回答的按钮在时间旁边)。链接是会话链接加上消息编号:`dsh-session:…#42`。把它粘贴到消息中并发送:在 dsh 0.2.1 及更高版本中,链接显示为一个标签,点击它会打开那个对话、滚动到该消息并高亮显示 2 秒。和会话链接一样,它也会把那个对话作为只读上下文附加进来。 | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="截图:复制消息链接"></a> |
|
|
53
55
|
| **将对话导出为 Markdown** | <a id="feature-exportmarkdown"></a>在侧边栏中右键点击对话(或打开它的 **…** 菜单)→ **导出为 Markdown…**。对话框会显示该对话有多少条消息;**复制到剪贴板** 会把对话以 Markdown 格式复制,**保存 .md 文件** 会通过浏览器的下载功能把它保存为 `<chat title>.md`(dsh 桌面版:按你的系统设置,保存到“下载”文件夹或打开保存对话框)。文件包含对话标题、项目名称和日期,之后每条消息各有一个 `## 你` 或 `## 助手` 部分。代码块保持原样;如果某条消息中的代码块没有闭合,它会被闭合。 | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="截图:将对话导出为 Markdown"></a> |
|
|
54
56
|
| **复制项目路径** | <a id="feature-copyprojectpath"></a>在侧边栏中右键点击项目 → **复制路径**,即可复制它的文件夹的完整路径。 | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="截图:复制项目路径"></a> |
|
|
55
57
|
| **新对话中的项目搜索** | <a id="feature-projectpicker"></a>新对话 → 输入框上方的项目按钮。项目按 A–Z 顺序显示,顶部有 **搜索项目** 框。输入名称的一部分(不区分大小写和重音符号),按 `Enter` 即可选择第一个匹配项。没有匹配项时会显示 **没有匹配的项目**。侧边栏中 dsh 保存的项目顺序不会改变。 | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="截图:新对话中的项目搜索"></a> |
|
|
56
58
|
| **下一条消息预测** | <a id="feature-nextprediction"></a>默认开启;可在 **设置 → Composer Plus** 中关闭。智能体完成一个回合后(被停止或失败的回合除外),空输入框会以灰色文字显示对你下一条消息的猜测,并带有 **按 Tab 接受** 提示。`Tab` 会把文字放入输入框,但不会发送。`Esc` 会在本回合隐藏它。开始输入也会隐藏它,新的回合会替换它。开关下方的 **模型** 菜单列出 dsh 自己的模型(与 dsh 模型菜单的列表相同)。默认选中 **dsh 默认**,它跟随 dsh 的默认模型。每完成一个回合会进行一次简短的模型调用。在 Tether 中,猜测显示在空输入框上方:轻点它即可放入输入框。 | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="截图:下一条消息预测"></a> |
|
|
57
59
|
| **输入时补全** | <a id="feature-typingcompletion"></a>默认关闭;可在 **设置 → Composer Plus** 中开启。输入时,光标后紧跟的灰色文字会显示你的消息可能的后续内容。`Tab` 会把它添加到消息中,但不会发送。`Esc` 会隐藏它。它只建议你自己接下来要写的话:不会回答你,也不会编造错误信息或名称。消息看起来已完整,或模型不确定时,不显示任何内容。继续输入灰色文字中接下来的字符时,它会保留,不会再次调用模型。它的开关下方有自己的 **模型** 菜单。第一项 **与“下一条消息预测”相同**(默认)使用 **下一条消息预测** 的模型;选择其他模型,就可以为每个功能使用不同的模型,例如为补全选择更快的模型。你每次输入停顿时,它都会调用一次模型,因此消耗的 token 比预测多得多:请选择快速、低成本的模型。输入斜杠命令、消息中带有文件标签,或光标不在末尾时,它不会运行。在 Tether 中,输入时剩余部分会显示在输入框上方:轻点它即可添加。 | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="截图:输入时补全"></a> |
|
|
58
60
|
| **优化提示词** | <a id="feature-promptimprove"></a>输入一个粗略的请求,然后点击模型菜单旁边的魔法棒(**优化提示词**)。一次模型调用会把它改写成更清晰的提示词:先写目标,有多个部分时列出简短的编号步骤,并写明要运行的检查。它会读取此对话(已回滚的消息除外)、项目的 README、AGENTS.md 和清单文件、已更改的文件以及文件名与你的用词匹配的文件,并保留你的语言。它从不编造文件名。新文本会替换你的草稿,但不会发送:阅读、修改后再按 `Enter`。`Cmd/Ctrl+Z` 一步即可恢复你的原文,该按钮(**撤销优化**)也可以。如果你在它处理时继续输入,你的新文本会保留。`Esc` 或再次点击可取消。它在设置中有自己的 **模型** 菜单(默认:**与对话的模型相同**)。不适用于斜杠命令或带文件标签的消息。在 Tether 中,魔法棒位于输入框旁边。 | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="截图:优化提示词"></a> |
|
|
59
|
-
| **本对话内允许** | <a id="feature-allowforchat"></a>当 Auto Review 询问你时,审批卡片上会多出
|
|
61
|
+
| **本对话内允许** | <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> |
|
|
60
62
|
| **项目状态** | <a id="feature-projectstatus"></a>侧边栏中的项目行会显示与其对话相同的加载图标 / 等待 / 完成标记。因此,即使项目已折叠,你也能知道其中有对话正在运行或需要你处理。等待你处理的对话优先显示,其次是你尚未打开的已完成对话(绿色圆点,即使另一个对话仍在运行也会显示),最后是加载图标。将鼠标悬停在上面可查看详情。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:项目状态"></a> |
|
|
63
|
+
| **全部标为已读** | <a id="feature-markprojectread"></a>在侧边栏中,点击项目的 **…** 按钮 → **全部标为已读**。该项目中所有对话的绿色未读圆点会立即消失;其他项目的圆点保持不变。项目中没有未读对话时,此项显示为灰色(**没有未读对话**)。 | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="截图:全部标为已读"></a> |
|
|
61
64
|
| **活跃项目置顶** | <a id="feature-activeprojectsfirst"></a>当某个对话开始运行或需要你处理时,它所在的项目会移到侧边栏顶部,并使用 dsh 自带的行动画(与把它拖到那里的效果相同)。已完成的项目保持原位;你可以像往常一样把它们拖到任意位置。移动会保存到 dsh 的项目顺序中,因此关闭此功能后会保留当前顺序。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:活跃项目置顶"></a> |
|
|
62
65
|
| **近期项目筛选** | <a id="feature-recentprojects"></a>侧边栏 → 视图选项(滑块图标)→ **最近 2 小时内活跃**。选中后,侧边栏只显示最近 2 小时内有活跃对话的项目。活跃对话包括:这段时间内更新过的对话、正在运行或等待中的对话、当前打开的对话,以及你尚未打开的已完成对话(dsh 的绿色“完成”圆点),超过 2 小时后也一样。没有这类对话的项目会被隐藏,新建的空项目也会被隐藏。再次选择该项即可显示所有项目。这个选择保存在本设备上。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="截图:近期项目筛选"></a> |
|
|
63
66
|
| **折叠全部项目** | <a id="feature-collapseprojects"></a>侧边栏中有项目展开时,视图选项(滑块图标)旁边会出现一个按钮。点击它可以一次折叠所有展开的项目,例如 5 个项目中展开的 3 个。没有展开的项目时,这个按钮会再次隐藏。 | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="截图:折叠全部项目"></a> |
|
|
64
67
|
| **按状态排序** | <a id="feature-statusorder"></a>侧边栏 → 视图选项 → **排序方式** → **按状态**(配合 **单列表** 使用)。已完成的对话排在最前(即带 dsh “完成”圆点的对话,以出错结束的回合也会显示这个圆点),然后是正在运行或等待中的对话,再然后是带有活跃自动化任务(Schedule)的对话,其余对话按 dsh 的顺序排列。打开已完成的对话后,它会往下移。只有视图会改变:选择 **手动排序** 或 **最近更新** 即可恢复。 | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="截图:按状态排序"></a> |
|
|
65
68
|
| **后台通知** | <a id="feature-notifications"></a>dsh 在后台时,如果回合完成(通知显示回复的第一行),或对话确实在等你处理,你都会收到通知。等你处理的情况包括:审批(显示工具名称)、回答(显示问题)或计划审阅。请求必须在 1.5 秒后仍未处理,才会发出通知,因此被自动处理的审批(Auto Review 授权、其他插件)不会发出通知;请求一旦得到处理,对应的通知也会立即撤回。程序坞/任务栏角标会显示等待中的对话数量。点击通知会打开对应的对话。 | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="截图:后台通知"></a> |
|
|
66
69
|
| **应用语言** | <a id="feature-language"></a>设置 → Composer Plus → **应用语言** 可以把整个 dsh 界面切换为 Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt 或 हिन्दी(见下文)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="截图:应用语言"></a> |
|
|
67
|
-
| **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether:没有它,相机无法打开这个二维码。手机可以显示你的对话、发送消息、回答审批和问题,以及切换模型和智能体。你可以配对任意多台 Mac:点击应用左上角的 Mac
|
|
70
|
+
| **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether:没有它,相机无法打开这个二维码。手机可以显示你的对话、发送消息、回答审批和问题,以及切换模型和智能体。你可以配对任意多台 Mac:点击应用左上角的 Mac 名称即可在它们之间切换。**手机连接** 面板会列出已配对的 iPhone 及其上次连接时间:点击 **Remove** 可立即断开其中一部。“Tailscale only”会拒绝来自本地网络的连接(适用于共享 Wi-Fi),访问日志会显示谁尝试过连接。在 Tether 中,“Settings → Privacy”可以用 Face ID 锁定应用。 | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="截图:手机连接(iPhone)"></a> |
|
|
68
71
|
| **自动更新** | <a id="feature-autoupdate"></a>dsh 启动时,插件会检查 [最新的 GitHub release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)。如果它比当前版本新,并且已发布到 npm,插件会通过 dsh 自带的插件管理器(与 设置 → 插件 相同的途径)安装这个确切的版本,并通知你。重启 dsh 即可加载新版本。**设置 → Composer Plus → Composer Plus 更新** 会显示版本号,并提供 **检查更新** / **立即更新**。dsh 第一次以新版本启动时,会显示一次 **Composer Plus N 的新功能** 窗口,内容是该版本的发布说明(来自同一次更新检查,不会额外联网);点击 **关闭** 或按 `Esc` 关闭。 | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="截图:自动更新"></a> |
|
|
69
72
|
|
|
70
73
|
<!-- END GENERATED FEATURES -->
|
|
@@ -119,15 +122,15 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
119
122
|
- **继续:** 经过身份验证的本地接口只会恢复最后一个被中断的回合,会拒绝过期或重复的请求,并保留现有的审批钩子。它不会发送新的用户消息。
|
|
120
123
|
- **重启后继续:** 在你开启之前一直关闭。Host 端只在 `$DSH_HOME/storages/dsh-composer-plus/resume.json`(仅所有者可访问)中保存对话 ID 和开始时间,任何数据都不会离开你的电脑。只有当 dsh 自己的日志表明是 dsh(而不是你)停止了最后一个回合时,它才会继续该对话。审批和 Auto Review 照常适用于继续的回合。
|
|
121
124
|
|
|
122
|
-
- **改动面板:** git 在你的电脑上、在对话自己的文件夹中以只读方式运行,并通过 dsh 经过身份验证的 `/api` 通道调用。它从不提交、暂存或拉取,只显示 git
|
|
125
|
+
- **改动面板:** git 在你的电脑上、在对话自己的文件夹中以只读方式运行,并通过 dsh 经过身份验证的 `/api` 通道调用。它从不提交、暂存或拉取,只显示 git 自己列出的路径。树最多显示本地和远程分支最新的 300 个提交,且从不切换(checkout)分支。在没有 commit-graph 文件的超大仓库中,打开树可能需要几秒。**本对话** 会读取对话自己的日志,找出它的文件工具写入的文件,并在一个会立即删除的临时文件夹中,把它们与该对话的回合回退快照进行比较;它不会向你的仓库或快照存储写入任何内容。
|
|
123
126
|
- **功能创意:** 在你点击 **推荐功能** 之前,什么都不会运行。点击后,Host 端只读取对话自己的文件夹(浏览器从不发送路径):顶层条目的名称,README、AGENTS.md 和清单文件(`package.json`、`pyproject.toml`、`Cargo.toml`、`go.mod` 等)的前 6 kB,以及 `git log --oneline -15`,总计最多 16 kB。它会跳过 `.env*`、密钥文件和 `node_modules` 等文件夹,并且只读取位于该文件夹内的普通文件:指向文件夹外部的符号链接、FIFO 或设备文件都会被跳过。这份概要会通过 dsh 自己的提供商设置,以一次请求的形式发送给对话所用的模型;它不会被添加到任何对话中。项目中的任何内容都不会被写入。向右滑动的创意会以计划模式新建对话,因此审批和计划审阅照常适用。**直接实现** 不使用计划模式启动对话:模型可以立即修改文件,对话平常的审批和 Auto Review 照常适用。留到以后的创意(标题、概要、理由、工作量)会与项目的文件夹路径一起,保存在 dsh home 下的 `storages/dsh-composer-plus/later.json` 中(仅所有者可访问的文件);不会向项目写入任何内容。推荐过的创意的历史(标题、概要、理由、工作量、日期、是否已启动)也以同样方式保存在 `storages/dsh-composer-plus/idea-history.json` 中,每个项目最多 200 条(最早的先被移除);该项目下次 **推荐功能** 时,这些标题会发送给模型。
|
|
124
127
|
- **内容搜索:** 没有新的代码来搜索你的对话:插件只是开启 dsh 自带的消息索引(SQLite FTS5,`dsh-session-query-sqlite`),并为它提供一个文件 `$DSH_HOME/cache/composer-plus/session-search.db`(文件和文件夹仅所有者可访问)。这个文件包含你的用户消息和助手消息的文本,因此它的私密程度与 `$DSH_HOME/sessions` 中的对话日志相同。任何数据都不会离开你的电脑。它是 dsh 可以重新生成的副本:你可以在 dsh 关闭时删除它。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/content-search.json` 中。
|
|
125
|
-
- **回合回退:** 在你发送每条消息之前,Host 会在它自己的存储 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(仅所有者可访问的文件夹)中,为对话的文件夹创建一个 git 快照。快照保存该文件夹中 git 能看到的文件(不包括被忽略的文件)的副本,因此它的私密程度与项目相同。它会读取你仓库中的对象(不会再复制一份 git 已有的内容),并且从不写入你仓库的索引、`HEAD`、分支、标签、stash 或配置;git 在你的仓库中做出的唯一更改,是更新它复用的对象文件的时间戳(这会推迟 `git gc` 对这些文件的清理)。带文件的回退只会写入对话文件夹内的普通文件;它会跳过符号链接、管道以及文件夹外的任何内容。任何数据都不会离开你的电脑。你可以在 dsh 关闭时删除这个存储(此后在发送新消息之前,回退只能用于对话本身)。**删除对话** 也会删除对话的存储。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/rollback.json`
|
|
128
|
+
- **回合回退:** 在你发送每条消息之前,Host 会在它自己的存储 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(仅所有者可访问的文件夹)中,为对话的文件夹创建一个 git 快照。快照保存该文件夹中 git 能看到的文件(不包括被忽略的文件)的副本,因此它的私密程度与项目相同。它会读取你仓库中的对象(不会再复制一份 git 已有的内容),并且从不写入你仓库的索引、`HEAD`、分支、标签、stash 或配置;git 在你的仓库中做出的唯一更改,是更新它复用的对象文件的时间戳(这会推迟 `git gc` 对这些文件的清理)。带文件的回退只会写入对话文件夹内的普通文件;它会跳过符号链接、管道以及文件夹外的任何内容。任何数据都不会离开你的电脑。你可以在 dsh 关闭时删除这个存储(此后在发送新消息之前,回退只能用于对话本身)。**删除对话** 也会删除对话的存储。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/rollback.json` 中。带文件的回退还会保留回退之前那一刻的文件(同一存储中的 `refs/r/…`),供 **重新应用** 使用;已重新应用的回退记录在 `$DSH_HOME/storages/dsh-composer-plus/redone.json` 中(仅所有者可访问)。
|
|
126
129
|
- **将对话导出为 Markdown:** Host 端只读取对话自己的日志(即 dsh 显示的那些消息),并把它们交给页面;它不读取任何项目文件,也不通过网络发送任何内容。Markdown 只会进入你的剪贴板或你保存的文件。
|
|
127
130
|
- **删除对话:** 把对话自己的日志文件夹(`$DSH_HOME/sessions/<project>/<chat>`)移到废纸篓。它不会触碰项目文件夹。
|
|
128
|
-
- **本对话内允许:**
|
|
131
|
+
- **本对话内允许:** 授权连同授予时间一起保存在 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` 中(仅所有者可访问)。一项授权只覆盖一个对话中的一个确切工具,直到时限结束(默认 1 小时)。如果该工具可以写入,授权也覆盖任何写入操作。可以在标题栏的标签中撤销授权。
|
|
129
132
|
- Auto Review 仍会检查每一次调用;审查失败的调用永远不会被自动允许。
|
|
130
|
-
- **手机连接:** 在你开启之前一直关闭。开启后,Host 端会运行 Tether 网关:端口 19390 上的 HTTPS 服务只接受你的 Wi-Fi 子网和你的 tailnet(100.64.0.0/10);另有一个位于 `127.0.0.1:19391` 的配对页面(仅限这台 Mac)。手机需要二维码中的一次性代码(5 分钟内有效),还需要你在 Mac 上点击 **Approve**。手机会固定(pin)网关的证书。Mac 只保存每部手机令牌的哈希值(有效期 30 天,使用期间会续期);**Remove** 会立即关闭该手机的连接。手机只能调用允许列表中的 dsh
|
|
133
|
+
- **手机连接:** 在你开启之前一直关闭。开启后,Host 端会运行 Tether 网关:端口 19390 上的 HTTPS 服务只接受你的 Wi-Fi 子网和你的 tailnet(100.64.0.0/10);另有一个位于 `127.0.0.1:19391` 的配对页面(仅限这台 Mac)。手机需要二维码中的一次性代码(5 分钟内有效),还需要你在 Mac 上点击 **Approve**。手机会固定(pin)网关的证书。Mac 只保存每部手机令牌的哈希值(有效期 30 天,使用期间会续期);**Remove** 会立即关闭该手机的连接。手机只能调用允许列表中的 dsh 方法(对话、提示词、附件、斜杠命令、审批、问题、模型、智能体、目标),不能访问设置、凭据、文件浏览器或终端。“Tailscale only”会拒绝来自本地网络的所有连接,包括已经打开的连接。访问日志在 `access.json` 中保存最新的 200 次连接尝试(时间、IP 地址、设备名称、允许或拒绝,以及原因);其中从不包含令牌或配对代码。数据:`$DSH_HOME/storages/dsh-composer-plus/mobile/`(仅所有者可访问的文件)。详情:[tether/README.md](tether/README.md)。
|
|
131
134
|
- **更新:** Host 端会向 `api.github.com` 查询最新版本,并向 `registry.npmjs.org` 查询这个确切的版本;不会发送任何关于你或你的对话的信息。安装使用 dsh 的插件管理器(`pnpm add dsh-composer-plus@<version>`;如果 dsh 0.2.1 对已安装的插件拒绝这样做,则使用 `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`,之后 profile 会把这个 URL 列为插件的来源),因此 dsh 自己的 registry、脚本和版本兼容性检查都会生效。预发布标签和旧版本永远不会被安装。
|
|
132
135
|
- **下一条消息预测:** 默认开启;在 **设置 → Composer Plus** 中关闭它,即可停止这些模型调用。每完成一个回合,Host 端会把该对话中你自己的消息和智能体的文字回复(不含工具输出、隐藏上下文和推理内容),最多约 6,000 个字符(最新的部分),发送给所选的模型(除非你另选,否则为 dsh 的默认模型)。它通过 dsh 自己的提供商设置,以一次请求的形式发送。对话中不会保存任何内容:猜测不会被添加到对话历史中。开关和模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/predict.json` 中(仅所有者可访问的文件)。
|
|
133
136
|
- **输入时补全:** 在你开启之前一直关闭。开启后,你每次输入停顿时,Host 端会把你目前已输入的文字,以及该对话中你自己的消息和智能体的文字回复(不含工具输出、隐藏上下文和推理内容;对话部分最多约 3,000 个字符),发送给在 **输入时补全** 下选择的模型(默认为 **下一条消息预测** 的模型)。新的停顿会停止较早的请求。对话中不会保存任何内容。开关保存在 `$DSH_HOME/storages/dsh-composer-plus/complete.json` 中(仅所有者可访问的文件)。
|
|
@@ -144,8 +147,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
144
147
|
- **我的消息上没有 ↶ 按钮:** 回合回退已关闭;或者该对话是子代理对话;或者已安装 dsh-rewind-plugin(请使用它的 ↶ 按钮)。更新后,请重启 dsh。
|
|
145
148
|
- **“对话和文件”显示为灰色:** 项目不是 git 仓库;或者没有这条消息之前的快照(这条消息比插件更早,或者它的快照已被最新的 50 个快照替换);或者没有文件发生变化。
|
|
146
149
|
- **删除时提示另一个 dsh 已打开此对话:** 使用同一 dsh home 的另一个 dsh 持有该对话的锁。关闭那个窗口或那个 dsh,然后再次删除。在此期间,对话会保持归档状态。
|
|
150
|
+
- **开启“Tailscale only”后 iPhone 无法连接:** Mac 和 iPhone 上都必须开启 Tailscale。Mac 上的 Tailscale 关闭时,手机连接面板会发出警告。访问日志会显示每次被拒绝的尝试及其原因。
|
|
147
151
|
- **重启后对话没有继续:** dsh 退出时“重启后继续”处于关闭状态;或者你自己停止了那个回合;或者回合已经结束(完成或失败);或者对话已被归档;或者当时有超过 20 个对话正在运行(只有最新的 20 个会继续)。
|
|
148
|
-
- **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.
|
|
152
|
+
- **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.13.0`),见上文的安装说明。
|
|
149
153
|
|
|
150
154
|
## 限制
|
|
151
155
|
|
|
@@ -161,9 +165,14 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
161
165
|
- **删除对话** 需要 dsh 的归档功能(dsh 0.2.0 及更高版本)。如果对话(或它的某个子代理对话)在 15 秒内没有停止,或被另一个 dsh 持有,它会保持归档状态,不会移动任何内容。在 macOS 以外的系统上,废纸篓文件夹必须与对话历史位于同一磁盘。你删除的已打开对话会以归档和隐藏的状态留在 dsh 的内存中,直到 dsh 重启。请自行清倒废纸篓;dsh 不会替你清倒。
|
|
162
166
|
- dsh 的队列没有 `move` 操作,所以由插件的 Host 端在 dsh 的队列中直接移动排队的消息本身(一次改动,还是同一条消息)。带有图片或文件的消息也能移动。只有你自己的消息可以移动:队列中的目标轮次或对问题的回答会留在原处。如果在你拖动时有消息开始发送,则不会移动任何消息,并会显示一条提示说明这一点。
|
|
163
167
|
- 如果新版本不改动任何 dsh 设置,dsh 0.2.1 会立即加载更新;否则(以及在 dsh 0.2.0 上),请重启 dsh 来加载更新。插件从不替你重启 dsh。没有 dsh 插件管理器的网页版/CLI profile 只会提示有新版本。
|
|
168
|
+
- **本对话内允许** 从授权的那一刻开始计算时限。新的时限会立即应用于仍在生效的授权,因此更短的时限可能会让它们立即结束。1.12 及更早版本的授权没有时间信息:更新后,代理会就这些工具再询问一次。
|
|
164
169
|
- **保持输入框焦点** 只在发送 `/` 命令或技能后才会把焦点还给输入框。dsh 解析命令时,输入框会有几毫秒处于只读状态,因此这段时间内按下的键会丢失。如果 dsh 的 `/` 菜单仍然打开,`Enter` 会选择高亮的行,而不会发送。
|
|
165
|
-
- **手机连接** 只适用于 macOS(它使用 `en0`、`openssl`、`swift` 和 `dns-sd`)。它使用固定端口 19390 和 19391,因此每台 Mac 上同一时间只能有一个 dsh 运行它(每台 Mac 是手机 Mac 列表中的一项)。只有在 Tether 打开或刚转入后台时,手机才能收到通知(没有推送服务)。iOS 应用尚未上架 App Store:请用 Xcode 从 `tether/ios`
|
|
166
|
-
-
|
|
170
|
+
- **手机连接** 只适用于 macOS(它使用 `en0`、`openssl`、`swift` 和 `dns-sd`)。它使用固定端口 19390 和 19391,因此每台 Mac 上同一时间只能有一个 dsh 运行它(每台 Mac 是手机 Mac 列表中的一项)。只有在 Tether 打开或刚转入后台时,手机才能收到通知(没有推送服务)。iOS 应用尚未上架 App Store:请用 Xcode 从 `tether/ios` 构建它。“Tailscale only”仍然需要 Mac 有 Wi-Fi 或以太网地址(只有在有这样的地址时,网关才会启动)。访问日志按 Mac 分别保存,只保留最新的 200 次尝试;一分钟内重复的尝试不会新增一行,而是把同一行的次数加一。Tether 的应用锁不会隐藏 iPhone 锁定屏幕上的通知预览:请在 iOS 设置中关闭它们。Tether 的绿点跟随 Mac:在 dsh 中打开的对话,手机上的绿点也会消失。在 Tether 中打开的对话,只在手机上消失;Mac 上 dsh 自己的绿点会一直保留,直到你在 Mac 上打开该对话。
|
|
171
|
+
- 会话链接在对话中有效;点击它不会打开对应的对话。用 **复制消息链接** 复制的链接,只在 dsh 0.2.1 及更高版本中、并且只从对话中的消息里才能打开对应的消息(dsh 0.2.0 没有用户文本规则,所以链接仍会被复制,但只显示为普通文本)。被回退移除的消息,或被压缩从 dsh 加载的历史中移除的消息,无法显示:此时链接会给出提示。🔗 按钮依附在 dsh 的消息行上;如果 dsh 更新改变了这部分标记,按钮就不会显示。
|
|
172
|
+
- **全部标为已读** 通过 dsh 中一个不是公开 API 的部分(dsh 会话状态中的 `completionUnread` 列表)来更改 dsh 自己的未读圆点。如果 dsh 更新重命名了它,该菜单项就不会显示。该菜单项放在 dsh 项目的“…”菜单中,而这个菜单没有给插件的插槽;如果 dsh 修改了这个菜单,该菜单项也不会显示。
|
|
173
|
+
- **原地编辑排队消息** 打开的是 dsh 自带的队列编辑器,因此也有它的限制:带图片或文件的消息不能编辑;在此期间已经开始发送的消息不会被修改(dsh 会显示它自己的错误)。
|
|
174
|
+
- **重新应用** 从不更改被回退的对话:它会从回退之前开始一个新对话(dsh 自带的分叉,模型上下文相同),因此新对话有新的 id 和标题。只有对话中最新的一次回退可以重新应用,只能一次,并且只在它之后没有新内容时可用(发送新消息后该选项消失)。回退之后你更改过的文件会被保留,除非你勾选覆盖它的选项。重新应用需要回退时保留的快照(同样是最新 50 个快照的范围);在此版本之前做的回退,或用 **仅对话** 做的回退,只会恢复消息。
|
|
175
|
+
- **本对话** 只统计 dsh 的文件工具(`write`、`edit`、`str_replace_editor`)写入的文件。命令(`bash`)更改的文件不在这个视图中;它们显示在 **未提交** 下。如果没有该对话的回合回退快照(回合回退已关闭、安装了 dsh-rewind-plugin,或对话比插件更早),视图会与最后一次提交比较,并给出提示。回合回退为每个对话保留最新的 50 个快照:在更长的对话中,视图与保留的最早快照比较,说明从哪条消息开始,并且不计入更早的改动。**隐藏空白改动** 就是 `git diff -w`:只在行内空格上有变化的行也会被隐藏。
|
|
167
176
|
- 重启前发出的通知,点击后只会把 dsh 带到前台。
|
|
168
177
|
- 活跃项目通过 dsh 保存的项目顺序来移动,因此新顺序在重启后依然保留。不属于任何项目的对话(“未分组”)无法移动;dsh 总是把它们列在最后。
|
|
169
178
|
- dsh 在侧边栏的视图选项菜单中没有扩展点,所以近期项目选项被添加到 dsh 自己的菜单中。如果 dsh 更新修改了这个菜单,该选项将不会显示,所有项目都保持可见。筛选作用于项目行,因此 **单列表** 不会被筛选。请与 **按工作区** 一起使用:在 **按工作区树** 中,被隐藏的父文件夹也会隐藏其中的活跃项目。**按状态** 也有同类限制:dsh 没有排序插槽,因此该菜单项和行顺序依赖 dsh 的菜单和列表标记。
|
|
@@ -200,7 +209,21 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
200
209
|
|
|
201
210
|
**如何在 dsh 中调整排队消息的顺序?** 拖动排队消息上的 ⠿ 把手,或者让它获得焦点后按 `↑` / `↓`。
|
|
202
211
|
|
|
203
|
-
|
|
212
|
+
**如何修改排队消息中的错字?** 在队列中双击这条消息,修改文字后按 `Enter`(按 `Esc` 取消)。它在队列中的位置不变。
|
|
213
|
+
|
|
214
|
+
**如何一次清除一个项目的所有未读圆点?** 侧边栏 → 项目的 **…** 按钮 → **全部标为已读**。
|
|
215
|
+
|
|
216
|
+
**可以链接到长对话中的某一条消息吗?** 可以:将鼠标悬停在这条消息上,点击 **🔗**。在对话中发送这个链接:在 dsh 0.2.1 及更高版本中,点击它会打开那个对话并定位到这条消息。
|
|
217
|
+
|
|
218
|
+
**我误回退了一个回合。可以找回来吗?** 可以:回退之后,立即使用输入框上方的 **重新应用**。它会从回退之前开始一个新对话,消息相同;如果回退时选择了 **对话和文件**,它还会把文件恢复回来。
|
|
219
|
+
|
|
220
|
+
**如何只查看一个对话更改过的文件?** 右侧边栏 → **改动** → **本对话**。点击 **␣** 可隐藏只有空白的改动。
|
|
221
|
+
|
|
222
|
+
**如何让 Auto Review 在同一个对话中不再反复询问同一个工具?** 点击审批卡片上的 **本对话内允许**。它只覆盖该对话中的这个确切工具,默认有效 1 小时;可以在标题栏的标签中撤销它。在 **设置 → Composer Plus → 本对话内允许** 中更改时间。
|
|
223
|
+
|
|
224
|
+
**我的 iPhone 丢了。如何阻止它访问我的 Mac?** 点击侧边栏左下角的 **手机连接**,然后点击该 iPhone 旁边的 **Remove**。它的密钥会立即失效;只有通过你在 Mac 上批准的新配对,它才能重新连接。
|
|
225
|
+
|
|
226
|
+
**可以用 Face ID 锁定 Tether 吗?** 可以:在 Tether 中打开“Settings → Privacy → Lock with Face ID”。之后,Tether 在打开时以及你回到它时,都会要求 Face ID(或密码)。
|
|
204
227
|
|
|
205
228
|
**如何在 dsh 侧边栏中只显示我今天用过的项目?** 侧边栏 → 视图选项(滑块图标)→ **最近 2 小时内活跃**。再次选择该项即可显示所有项目。
|
|
206
229
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|