dsh-composer-plus 1.12.0 → 1.14.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 +96 -19
- package/README.es.md +96 -19
- package/README.fr.md +96 -19
- package/README.hi.md +96 -19
- package/README.id.md +96 -19
- package/README.ja.md +96 -19
- package/README.ko.md +96 -19
- package/README.md +96 -19
- package/README.pt-BR.md +96 -19
- package/README.ru.md +96 -19
- package/README.tr.md +96 -19
- package/README.vi.md +96 -19
- package/README.zh.md +96 -19
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1983 -199
- package/index.js +1824 -106
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +100 -29
package/README.vi.md
CHANGED
|
@@ -14,7 +14,7 @@ Các tính năng tiện ích kiểu Codex cho ứng dụng desktop và giao di
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness với Composer Plus: dự án đang chạy hiện biểu tượng xoay trên thanh bên và Bảng thay đổi hiện một git diff"></p>
|
|
16
16
|
|
|
17
|
-
Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
|
|
17
|
+
Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Kiểm tra mục tiêu** (mặc định bật) gọi mô hình một lần mỗi khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
|
|
18
18
|
|
|
19
19
|
## Cách cài đặt
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Sau đó khởi động lại dsh. (CLI không cài được vào profile desktop; ứng dụng tự quản lý profile này.)
|
|
31
31
|
|
|
32
|
-
> pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.
|
|
32
|
+
> pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.14.0`.
|
|
33
33
|
|
|
34
34
|
## Tính năng
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
|
|
|
37
37
|
|
|
38
38
|
| Tính năng | Cách dùng | Ảnh chụp màn hình |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **Bảng thay đổi** | <a id="feature-changespanel"></a>Thanh bên phải → `+` → **Thay đổi**. Chọn **Chưa commit**, **Chưa stage**, **Đã stage** hoặc **Branch** để xem các tệp đã thay đổi kèm số dòng `+/-`. Nhấp vào một tệp để xem diff của tệp đó. **Lượt gần nhất** mở trang xem lại của chính dsh cho lượt mới nhất. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Ảnh chụp màn hình: Bảng thay đổi"></a> |
|
|
41
|
-
| **Ý tưởng tính năng** | <a id="feature-featureideas"></a>Thanh bên phải → `+` → **Ý tưởng tính năng** → **Đề xuất tính năng**. Mô hình của chính cuộc trò chuyện đọc bản tóm tắt ngắn về dự án của cuộc trò chuyện (các tệp ở cấp cao nhất, phần đầu của README và tệp manifest,
|
|
40
|
+
| **Bảng thay đổi** | <a id="feature-changespanel"></a>Thanh bên phải → `+` → **Thay đổi**. Chọn **Chưa commit**, **Chưa stage**, **Đã stage** hoặc **Branch** để xem các tệp đã thay đổi kèm số dòng `+/-`. Nhấp vào một tệp để xem diff của tệp đó. **Lượt gần nhất** mở trang xem lại của chính dsh cho lượt mới nhất. Nhấp vào tên branch (hoặc chọn **Cây**) để xem cây branch: nhấp vào một branch phía trên để đi tới branch đó, nhấp vào một commit để xem các tệp và diff của commit đó. **Cuộc trò chuyện này** chỉ liệt kê các tệp mà công cụ tệp (write, edit) của cuộc trò chuyện đang mở đã ghi, trong mọi lượt của nó, cùng tổng diff kể từ tin nhắn đầu tiên. Nút **␣** ẩn các thay đổi khoảng trắng (`git diff -w`): các dòng chỉ thay đổi về thụt lề hoặc ký tự xuống dòng sẽ không hiện. Menu **…** của một tệp → **Các cuộc trò chuyện đã thay đổi tệp này** liệt kê các cuộc trò chuyện của cùng repository có công cụ ghi hoặc sửa đã thay đổi tệp đó, mới nhất ở trên cùng, kèm yêu cầu đã tạo ra thay đổi; nhấp vào sẽ mở cuộc trò chuyện đó tại yêu cầu đó. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Ảnh chụp màn hình: Bảng thay đổi"></a> |
|
|
41
|
+
| **Ý tưởng tính năng** | <a id="feature-featureideas"></a>Thanh bên phải → `+` → **Ý tưởng tính năng** → **Đề xuất tính năng**. Mô hình của chính cuộc trò chuyện đọc bản tóm tắt ngắn về dự án của cuộc trò chuyện (các tệp ở cấp cao nhất, phần đầu của README và tệp manifest, dàn ý phần còn lại của README, tiêu đề các commit gần nhất). Sau đó mô hình đề xuất tối đa 8 tính năng, hiện thành một chồng thẻ bằng ngôn ngữ giao diện của dsh. Vuốt thẻ sang phải (hoặc nhấp **✓**, hoặc nhấn `→`; trong mọi trường hợp, thẻ bay về phía tương ứng) để bắt đầu một cuộc trò chuyện mới trong cùng dự án. Cuộc trò chuyện này bắt đầu ở chế độ kế hoạch, với ý tưởng làm yêu cầu, nên không có gì thay đổi trước khi bạn phê duyệt kế hoạch. Để bỏ qua kế hoạch, nhấp **▶ Xây dựng ngay** (hoặc nhấn `↑`; thẻ bay lên trên): cuộc trò chuyện mới bắt đầu ngay với ý tưởng làm yêu cầu bình thường, và mô hình thực hiện thay đổi rồi chạy các bước kiểm tra (phê duyệt vẫn áp dụng như thường lệ). Vuốt sang trái (hoặc **✕**, hoặc `←`) để bỏ qua. **Hoàn tác** (hoặc `Z`) đưa thẻ đã bỏ qua trở lại. Nhấp **↓** (hoặc nhấn `↓`) để lưu một ý tưởng hay để làm sau. Ý tưởng đi vào danh sách **Để sau** của dự án. Mọi cuộc trò chuyện trong cùng thư mục dự án đều hiện danh sách này (kể cả sau khi khởi động lại). **Để sau (N)** mở danh sách. **Lập kế hoạch** bắt đầu cùng kiểu cuộc trò chuyện ở chế độ kế hoạch cho ý tưởng đó, còn **Xây dựng ngay** bắt đầu cuộc trò chuyện không có kế hoạch; cả hai đều gỡ ý tưởng khỏi danh sách. **Lập kế hoạch tất cả (N)** bắt đầu một cuộc trò chuyện duy nhất ở chế độ kế hoạch cho mọi ý tưởng trong danh sách, nên các phần chung chỉ cần lập kế hoạch một lần. **Xóa khỏi danh sách** xóa ý tưởng. **Sao chép dạng danh sách kiểm tra** sao chép toàn bộ danh sách vào bộ nhớ tạm dưới dạng danh sách kiểm tra Markdown (`- [ ] Title — Summary`, mỗi ý tưởng một dòng) để dùng trong trình theo dõi vấn đề hoặc tệp TODO; tính năng này không gửi gì qua mạng. **Mở issue trên GitHub** trên một ý tưởng sẽ mở một issue với tiêu đề và tóm tắt của ý tưởng (và lý do nó quan trọng) trong repository GitHub của dự án, bằng đăng nhập GitHub CLI (`gh`) của chính bạn; sau đó liên kết **Issue #N** hiện bên cạnh ý tưởng và mở issue đó. **Thêm ý tưởng** thêm thẻ mới. Để chỉ nhận ý tưởng về một lĩnh vực, hãy nhập một **Chủ đề trọng tâm** ngắn vào ô bên cạnh **Đề xuất tính năng** (tối đa 80 ký tự; `Enter` cũng đề xuất), hoặc nhấp một trong các chủ đề cố định bên dưới ô: **Hiệu năng**, **Trợ năng**, **Kiểm thử**, **Bảo mật**, **Dễ dùng** hoặc **Tài liệu** (nhấp lại để xóa chủ đề). Khi đó, mô hình chỉ đề xuất các tính năng về chủ đề đó; ô trống nghĩa là tính năng bất kỳ. Trong một dự án, ý tưởng không được đề xuất hai lần: mọi ý tưởng đã đề xuất (đã bỏ qua, đã lưu hoặc đã bắt đầu) đều vào **Lịch sử** của dự án, mô hình được dặn không đề xuất lại những ý tưởng đó, và tiêu đề lặp lại sẽ bị loại bỏ. **Lịch sử** liệt kê chúng với nhãn **Đã bắt đầu** hoặc **Đã đề xuất**; **Quên** (hoặc **Quên tất cả**) cho phép một ý tưởng xuất hiện lại; ý tưởng vẫn còn trong danh sách **Để sau** sẽ không được đề xuất cho đến khi bạn xóa nó khỏi đó. Mô hình chỉ chạy khi bạn nhấp. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Ảnh chụp màn hình: Ý tưởng tính năng"></a> |
|
|
42
42
|
| **Tìm trong nội dung** | <a id="feature-contentsearch"></a>Ô tìm kiếm có sẵn trên thanh bên của dsh (kính lúp cạnh **Không gian làm việc**; `Cmd+K` trong ứng dụng desktop, `Cmd+Alt+K` trong trình duyệt) cũng tìm cuộc trò chuyện theo các từ trong tin nhắn của bạn và trong câu trả lời, không chỉ theo tiêu đề. Đoạn văn khớp hiện bên dưới cuộc trò chuyện. dsh đã có sẵn tìm kiếm này nhưng để tắt. Tính năng này bật nó lên, với một tệp chỉ mục tìm kiếm trên máy tính của bạn. Chỉ mục được tạo ở lần tìm đầu tiên sau khi khởi động (khoảng 15 giây cho 250 cuộc trò chuyện, xem Giới hạn) và được giữ lại cho các lần khởi động sau. Mặc định bật. Thay đổi có hiệu lực sau khi bạn khởi động lại dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Ảnh chụp màn hình: Tìm trong nội dung"></a> |
|
|
43
|
-
| **Hoàn tác lượt** | <a id="feature-turnrollback"></a>Di chuột lên một tin nhắn của bạn và nhấp **↶** (cạnh nút Sao chép). **Chỉ cuộc trò chuyện** đưa tin nhắn đó và mọi thứ sau nó (câu trả lời, lệnh gọi công cụ) ra khỏi cuộc trò chuyện và ra khỏi ngữ cảnh của mô hình. Tin nhắn trở lại khung soạn thảo: bạn sửa rồi gửi lại. **Cuộc trò chuyện và tệp** trước tiên liệt kê các tệp của dự án đã thay đổi kể từ tin nhắn đó, rồi đưa cả các tệp này về trạng thái cũ. Việc này gồm cả thay đổi do lệnh (`bash`) tạo ra, không chỉ thay đổi từ công cụ sửa tệp của dsh. Nếu một lượt đang chạy, lượt đó dừng trước. Nhật ký cuộc trò chuyện không bao giờ bị ghi lại: một dấu ẩn duy nhất che phần đã rút lại, giống cách lệnh `/compact` của dsh ẩn các tin nhắn cũ. Khi [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) đã được cài, plugin đó làm việc này và Composer Plus không hiện nút thứ hai. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Ảnh chụp màn hình: Hoàn tác lượt"></a> |
|
|
43
|
+
| **Hoàn tác lượt** | <a id="feature-turnrollback"></a>Di chuột lên một tin nhắn của bạn và nhấp **↶** (cạnh nút Sao chép). **Chỉ cuộc trò chuyện** đưa tin nhắn đó và mọi thứ sau nó (câu trả lời, lệnh gọi công cụ) ra khỏi cuộc trò chuyện và ra khỏi ngữ cảnh của mô hình. Tin nhắn trở lại khung soạn thảo: bạn sửa rồi gửi lại. **Cuộc trò chuyện và tệp** trước tiên liệt kê các tệp của dự án đã thay đổi kể từ tin nhắn đó, rồi đưa cả các tệp này về trạng thái cũ. Việc này gồm cả thay đổi do lệnh (`bash`) tạo ra, không chỉ thay đổi từ công cụ sửa tệp của dsh. Nếu một lượt đang chạy, lượt đó dừng trước. Nhật ký cuộc trò chuyện không bao giờ bị ghi lại: một dấu ẩn duy nhất che phần đã rút lại, giống cách lệnh `/compact` của dsh ẩn các tin nhắn cũ. Khi [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) đã được cài, plugin đó làm việc này và Composer Plus không hiện nút thứ hai. Sau khi hoàn tác, một thanh **Làm lại** hiện phía trên khung soạn thảo. Thanh này bắt đầu một cuộc trò chuyện mới từ ngay trước lúc hoàn tác (cùng các tin nhắn và ngữ cảnh), và với **Cuộc trò chuyện và tệp**, đưa cả các tệp trở lại. Tệp mà bạn đã thay đổi sau khi hoàn tác được liệt kê và giữ lại, trừ khi bạn đánh dấu ô ghi đè tệp đó. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Ảnh chụp màn hình: Hoàn tác lượt"></a> |
|
|
44
44
|
| **Xóa cuộc trò chuyện** | <a id="feature-deletechat"></a>Thanh bên → menu **…** của một cuộc trò chuyện (hoặc nhấp chuột phải) → **Xóa…** → **Xóa**. Bản thân dsh chỉ có thể lưu trữ. Cuộc trò chuyện dừng lại (lượt đang chạy, tác vụ nền, subagent và tác vụ tự động của nó cũng dừng, giống như khi dsh lưu trữ). Lịch sử đã lưu, cùng các cuộc trò chuyện subagent, được chuyển vào Thùng rác của macOS (trên hệ thống khác: `$DSH_HOME/trash`). Để lấy lại, hãy đưa thư mục về chỗ cũ và khởi động lại dsh: cuộc trò chuyện hiện trong chế độ xem **Chỉ mục đã lưu trữ** của thanh bên. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Ảnh chụp màn hình: Xóa cuộc trò chuyện"></a> |
|
|
45
45
|
| **Tên dự án trong khung soạn** | <a id="feature-projectname"></a>Dòng bên dưới khung soạn thảo (số lượt, token, tỷ lệ trúng cache, ngữ cảnh) bắt đầu bằng tên dự án của cuộc trò chuyện. Nhờ đó bạn luôn biết cuộc trò chuyện đang làm việc trong dự án nào. Đây là tiêu đề dự án của chính dsh, hoặc tên thư mục khi dự án không có tiêu đề. Di chuột lên tên để xem đường dẫn đầy đủ của thư mục. Nhấp vào tên để tìm cuộc trò chuyện trên thanh bên, trong chế độ xem danh sách hoặc theo dự án: thanh bên và dự án mở ra (kể cả dự án đã thu gọn và mục **Hiện thêm N phiên** của nó), danh sách cuộn đến cuộc trò chuyện và cuộc trò chuyện nhấp nháy trong 5 giây. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Ảnh chụp màn hình: Tên dự án trong khung soạn"></a> |
|
|
46
46
|
| **Lịch sử nhập** | <a id="feature-inputhistory"></a>Trong khung soạn thảo trống, nhấn `↑` / `↓` để duyệt qua các tin nhắn bạn đã gửi, giống như trong terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Ảnh chụp màn hình: Lịch sử nhập"></a> |
|
|
@@ -49,22 +49,30 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
|
|
|
49
49
|
| **Tiếp tục bằng một cú nhấp** | <a id="feature-continuebutton"></a>Sau một lượt đã dừng, thất bại hoặc bị cắt ngang, khung soạn thảo trống hiện **▶**. Một cú nhấp sẽ tiếp tục từ cuộc hội thoại hiện có, không cần gõ gì vào ô nhập và không thêm tin nhắn hiển thị vào cuộc trò chuyện. (Mô hình nhận một ghi chú ẩn ngắn “tiếp tục từ chỗ đã dừng”, vì một số nhà cung cấp như Claude từ chối yêu cầu kết thúc bằng câu trả lời của trợ lý.) Tin nhắn trong hàng đợi vẫn ở đó: ▶ chỉ tiếp tục tác vụ đã dừng, sau đó hàng đợi mới chạy. Lượt đã hoàn tất vẫn giữ nút Gửi thông thường. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Ảnh chụp màn hình: Tiếp tục bằng một cú nhấp"></a> |
|
|
50
50
|
| **Tiếp tục sau khi khởi động lại** | <a id="feature-resumeafterrestart"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Nếu bạn thoát dsh (hoặc dsh bị đóng) khi một cuộc trò chuyện đang làm việc, cuộc trò chuyện đó tự tiếp tục khi bạn mở lại dsh, với cùng ghi chú ẩn như Tiếp tục bằng một cú nhấp. Nếu một vòng mục tiêu (`/goal`) đang chạy, mục tiêu tiếp tục với vòng kế tiếp (mỗi lần khởi động, dsh tạm dừng các mục tiêu cho đến khi bạn tiếp tục chúng). Các cuộc trò chuyện bạn đã dừng, đã xong hoặc đã thất bại không tiếp tục. Bản thân dsh không có cài đặt cho việc này: dsh chỉ đánh dấu lượt như vậy là bị ngắt. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Ảnh chụp màn hình: Tiếp tục sau khi khởi động lại"></a> |
|
|
51
51
|
| **Kéo thả hàng đợi** | <a id="feature-queuereorder"></a>Tin nhắn trong hàng đợi có một tay nắm (⠿). Kéo để sắp xếp lại, hoặc đặt tiêu điểm vào tay nắm rồi nhấn `↑` / `↓`. `Esc` hủy thao tác. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Ảnh chụp màn hình: Kéo thả hàng đợi"></a> |
|
|
52
|
+
| **Sửa tin nhắn trong hàng đợi tại chỗ** | <a id="feature-queueedit"></a>Nhấp đúp vào một tin nhắn trong hàng đợi. Tin nhắn biến thành ô chỉnh sửa của chính dsh: sửa văn bản, rồi nhấn `Enter` để lưu hoặc `Esc` để hủy. Tin nhắn giữ nguyên vị trí trong hàng đợi. Không thể sửa theo cách này các tin nhắn có hình ảnh hoặc tệp (hàng đợi của dsh chỉ sửa văn bản). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Ảnh chụp màn hình: Sửa tin nhắn trong hàng đợi tại chỗ"></a> |
|
|
52
53
|
| **Sao chép liên kết phiên** | <a id="feature-copydeeplink"></a>Nhấp chuột phải vào một cuộc trò chuyện trên thanh bên → **Sao chép liên kết phiên**. Dán liên kết `dsh-session:…` vào một cuộc trò chuyện khác để đính kèm cuộc trò chuyện đó làm ngữ cảnh chỉ đọc. dsh 0.2.1 có mục **Sao chép ID phiên** riêng, mục này chỉ sao chép ID thuần; mục của plugin nằm ngay sau nó. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Ảnh chụp màn hình: Sao chép liên kết phiên"></a> |
|
|
54
|
+
| **Sao chép liên kết tin nhắn** | <a id="feature-copymessagelink"></a>Di chuột lên một tin nhắn và nhấp **🔗** (trong hàng thao tác của tin nhắn; với câu trả lời, nút nằm cạnh thời gian). Liên kết là liên kết phiên cộng với số thứ tự của tin nhắn: `dsh-session:…#42`. Dán liên kết vào một tin nhắn rồi gửi. Trên dsh 0.2.1 trở lên, liên kết hiện dưới dạng một nhãn nhỏ. Nhấp vào nhãn sẽ mở cuộc trò chuyện đó, cuộn tới tin nhắn và tô sáng tin nhắn trong 2 giây. Giống liên kết phiên, liên kết này cũng đính kèm cuộc trò chuyện đó làm ngữ cảnh chỉ đọc. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Ảnh chụp màn hình: Sao chép liên kết tin nhắn"></a> |
|
|
53
55
|
| **Xuất cuộc trò chuyện dạng Markdown** | <a id="feature-exportmarkdown"></a>Nhấp chuột phải vào một cuộc trò chuyện trên thanh bên (hoặc mở menu **…** của nó) → **Xuất dạng Markdown…**. Hộp thoại cho biết cuộc trò chuyện có bao nhiêu tin nhắn. **Sao chép vào bộ nhớ tạm** sao chép cuộc trò chuyện dưới dạng Markdown, còn **Lưu tệp .md** lưu nó thành `<chat title>.md` qua tính năng tải xuống của trình duyệt (dsh desktop: vào thư mục Tải về hoặc qua hộp thoại lưu, tùy theo cài đặt hệ thống của bạn). Tệp có tiêu đề cuộc trò chuyện, tên dự án và ngày, sau đó là một phần `## Bạn` hoặc `## Trợ lý` cho mỗi tin nhắn. Các khối mã được giữ nguyên; khối mã mà một tin nhắn để mở sẽ được đóng lại. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Ảnh chụp màn hình: Xuất cuộc trò chuyện dạng Markdown"></a> |
|
|
54
56
|
| **Sao chép đường dẫn dự án** | <a id="feature-copyprojectpath"></a>Nhấp chuột phải vào một dự án trên thanh bên → **Sao chép đường dẫn** để sao chép đường dẫn đầy đủ của thư mục dự án. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Ảnh chụp màn hình: Sao chép đường dẫn dự án"></a> |
|
|
55
57
|
| **Tìm dự án trong cuộc trò chuyện mới** | <a id="feature-projectpicker"></a>Cuộc trò chuyện mới → nút dự án phía trên khung soạn thảo. Các dự án hiện theo thứ tự A–Z, với ô **Tìm dự án** ở trên cùng. Nhập một phần tên (không phân biệt chữ hoa/thường và dấu) rồi nhấn `Enter` để chọn kết quả đầu tiên. Khi không có gì khớp, dòng **Không có dự án phù hợp** hiện ra. Thứ tự dự án đã lưu của dsh trên thanh bên không thay đổi. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Ảnh chụp màn hình: Tìm dự án trong cuộc trò chuyện mới"></a> |
|
|
58
|
+
| **Không gian làm việc mặc định cho Phiên mới** | <a id="feature-defaultworkspace"></a>Cài đặt → Composer Plus → **Không gian làm việc mặc định cho Phiên mới** → **Mở Phiên mới trong**: chọn một dự án, hoặc **Thư mục chung (default-workspace)** (mặc định: thư mục riêng của dsh `Documents/deepseek-harness/default-workspace`, được tạo ở lần dùng đầu tiên). Sau đó, **Phiên mới** ở đầu thanh bên (và phím tắt của nó) luôn mở cuộc trò chuyện mới ở đó, kể cả khi cuộc trò chuyện của một dự án khác đang mở. Nút `+` cạnh một dự án vẫn mở dự án đó, và nút dự án phía trên khung soạn thảo của cuộc trò chuyện mới vẫn đổi được dự án. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Ảnh chụp màn hình: Không gian làm việc mặc định cho Phiên mới"></a> |
|
|
59
|
+
| **Tìm trong cuộc trò chuyện** | <a id="feature-findinchat"></a>Nhấn `Cmd+F` trên Mac (`Ctrl+F` trên Windows và Linux) trong một cuộc trò chuyện: một ô tìm kiếm mở ra phía trên. Nhập một từ: mọi kết quả khớp trong các tin nhắn và câu trả lời trên màn hình đều được tô sáng, kết quả hiện tại có màu đậm hơn, và ô hiển thị n / tổng. `Enter` hoặc `↓` chuyển đến kết quả tiếp theo, `Shift+Enter` hoặc `↑` về kết quả trước (các nút mũi tên cũng vậy); cuộc trò chuyện cuộn kết quả vào giữa. Chữ hoa/thường, dấu và chữ ı không chấm của tiếng Thổ Nhĩ Kỳ không ảnh hưởng. `Esc` đóng ô và đưa con trỏ về chỗ cũ. Việc tìm kiếm vẫn theo cuộc trò chuyện trong khi câu trả lời đang được truyền về. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Ảnh chụp màn hình: Tìm trong cuộc trò chuyện"></a> |
|
|
60
|
+
| **Branch riêng cho từng cuộc trò chuyện** | <a id="feature-worktreechats"></a>Cuộc trò chuyện mới → nút ⑂ main cạnh nút dự án → **Branch mới**, rồi nhập tin nhắn đầu tiên và gửi. AI đặt tên branch (`feat/…`, `fix/…`) theo tin nhắn đó, Composer Plus tạo một git worktree cho branch trong `<project>/.worktrees/`, sao chép các tệp bị bỏ qua mà `.worktreeinclude` liệt kê (ví dụ `.env` và `node_modules/`) và mở ở đó một cuộc trò chuyện mới với tin nhắn của bạn. Phần đầu của cuộc trò chuyện đang mở hiển thị ⑂ branch · N thay đổi · ↑ ↓ (hoặc **chưa push**); nhấp vào để mở **Thay đổi**. Cùng menu đó liệt kê các worktree đang mở: chọn một worktree để bắt đầu cuộc trò chuyện trong đó. Để xem thư mục branch bên trong dự án của chúng ở thanh bên, hãy chọn **Tùy chọn hiển thị** → **Cây không gian làm việc** của dsh. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Ảnh chụp màn hình: Branch riêng cho từng cuộc trò chuyện"></a> |
|
|
56
61
|
| **Dự đoán tin nhắn tiếp theo** | <a id="feature-nextprediction"></a>Mặc định bật: bạn có thể tắt trong **Cài đặt → Composer Plus**. Khi tác tử hoàn tất một lượt (không phải lượt đã dừng hoặc thất bại), khung soạn thảo trống hiện dự đoán tin nhắn tiếp theo của bạn bằng chữ màu xám, kèm gợi ý **Tab để chấp nhận**. `Tab` đưa văn bản vào khung soạn thảo nhưng không gửi. `Esc` ẩn dự đoán trong lượt đó. Khi bạn bắt đầu gõ, dự đoán cũng ẩn đi, và một lượt mới sẽ thay thế nó. Menu **Mô hình** bên dưới công tắc liệt kê các mô hình của chính dsh (cùng danh sách với menu mô hình của dsh). **Mặc định của dsh** được chọn theo mặc định và đi theo mô hình mặc định của dsh. Mỗi lượt đã xong tốn một lần gọi mô hình ngắn. Trong Tether, dự đoán hiện phía trên khung soạn thảo trống: chạm vào để đưa nó vào ô nhập. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Ảnh chụp màn hình: Dự đoán tin nhắn tiếp theo"></a> |
|
|
57
62
|
| **Hoàn thành khi gõ** | <a id="feature-typingcompletion"></a>Mặc định tắt: bạn có thể bật trong **Cài đặt → Composer Plus**. Khi bạn gõ, chữ màu xám ngay sau con trỏ cho thấy tin nhắn của bạn có thể tiếp tục thế nào. `Tab` thêm phần này vào tin nhắn nhưng không gửi. `Esc` ẩn phần này. Tính năng chỉ gợi ý những từ tiếp theo của chính bạn: không bao giờ là câu trả lời cho bạn, và không bịa ra nội dung lỗi hay tên. Khi tin nhắn có vẻ đã đủ hoặc mô hình không chắc chắn, sẽ không có gì hiện ra. Nếu bạn gõ đúng các chữ tiếp theo của phần chữ xám, phần này vẫn giữ nguyên, không có lần gọi mô hình mới. Tính năng có menu **Mô hình** riêng bên dưới công tắc của nó. Mục đầu tiên, **Giống dự đoán tin nhắn tiếp theo**, dùng mô hình của **Dự đoán tin nhắn tiếp theo** (mặc định); hãy chọn mô hình khác để mỗi tính năng dùng một mô hình riêng, ví dụ một mô hình nhanh hơn cho phần hoàn thành. Tính năng gọi mô hình một lần mỗi khi bạn dừng gõ, nên tốn nhiều token hơn nhiều so với dự đoán: hãy chọn một mô hình nhanh, chi phí thấp. Tính năng không chạy với lệnh gạch chéo, tin nhắn có nhãn tệp, hoặc khi con trỏ không ở cuối. Trong Tether, phần còn lại hiện phía trên ô nhập khi bạn gõ: chạm vào để thêm. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Ảnh chụp màn hình: Hoàn thành khi gõ"></a> |
|
|
58
63
|
| **Cải thiện prompt** | <a id="feature-promptimprove"></a>Gõ một yêu cầu sơ bộ, rồi nhấp vào đũa thần (**Cải thiện prompt**) cạnh menu mô hình. Một lần gọi mô hình viết lại yêu cầu thành một prompt rõ ràng hơn: mục tiêu trước, các bước đánh số ngắn khi có nhiều phần, và bước kiểm tra cần chạy. Tính năng đọc cuộc trò chuyện này (bỏ qua các tin nhắn đã bị hoàn tác), README, AGENTS.md và tệp manifest của dự án, các tệp đã thay đổi và các tệp có tên khớp với từ ngữ của bạn, và giữ nguyên ngôn ngữ của bạn. Tính năng không bao giờ bịa ra tên tệp. Văn bản mới thay thế bản nháp của bạn nhưng không được gửi: hãy đọc, sửa, rồi nhấn `Enter`. `Cmd/Ctrl+Z` đưa văn bản của bạn trở lại trong một bước, nút (**Hoàn tác cải thiện**) cũng vậy. Nếu bạn gõ trong lúc tính năng đang chạy, văn bản mới của bạn được giữ lại. `Esc` hoặc nhấp lần nữa để hủy. Tính năng có menu **Mô hình** riêng trong Cài đặt (mặc định: **Giống mô hình của cuộc trò chuyện**). Không dùng cho lệnh gạch chéo hoặc tin nhắn có nhãn tệp. Trong Tether, đũa thần nằm cạnh ô nhập. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Ảnh chụp màn hình: Cải thiện prompt"></a> |
|
|
59
|
-
| **
|
|
64
|
+
| **Kiểm tra mục tiêu** | <a id="feature-goalcheck"></a>Bắt đầu một mục tiêu bằng `/goal`. Khi tác tử đánh dấu mục tiêu là hoàn tất trong một vòng tự động, mục tiêu chỉ đóng sau hai bước kiểm tra. Đầu tiên, lệnh kiểm thử của dự án chạy trong thư mục của cuộc trò chuyện, theo chế độ sandbox của cuộc trò chuyện. Lệnh này là lệnh của riêng bạn hoặc lệnh tìm thấy trong `package.json`, `Makefile`, `Cargo.toml`, `go.mod` hoặc pytest. Khi bước mới nhất của chính tác tử là một lần chạy đạt của bài kiểm thử đó, lệnh không chạy lại. Sau đó, một lần gọi mô hình độc lập, không có công cụ, đọc mục tiêu, cuộc trò chuyện này, `git status` và kết quả kiểm thử. Nếu một bước kiểm tra không đạt, mục tiêu vẫn đang hoạt động và tác tử đọc lý do, rồi vòng tiếp theo tiếp tục. Một dòng bên dưới thanh mục tiêu (**Kiểm tra mục tiêu**) hiện bài kiểm thử và kết quả gần nhất. **Sửa** đặt lệnh kiểm thử của riêng bạn và giới hạn thời gian hoặc token; khi vượt giới hạn, mục tiêu bị chặn. **Chạy ngay** chạy bước kiểm tra mà không đóng mục tiêu. Tính năng có menu **Mô hình** riêng trong Cài đặt (mặc định: **Giống mô hình của cuộc trò chuyện**). Khi bạn tự hoàn tất mục tiêu, không có gì được kiểm tra. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Ảnh chụp màn hình: Kiểm tra mục tiêu"></a> |
|
|
65
|
+
| **Cho phép trong cuộc trò chuyện này** | <a id="feature-allowforchat"></a>Khi Đánh giá tự động hỏi bạn, thẻ phê duyệt có thêm nút **Cho phép trong cuộc trò chuyện này**: từ đó trở đi, cùng công cụ đó trong cùng cuộc trò chuyện được cho phép, với mọi đối số, cho đến khi hết giới hạn thời gian (mặc định 1 giờ; chọn trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**). Sau đó, agent sẽ hỏi lại. Một nhãn nhỏ ở phần đầu liệt kê các quyền đã cấp kèm thời điểm kết thúc và cho phép thu hồi. Quyền vẫn còn sau khi khởi động lại. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ảnh chụp màn hình: Cho phép trong cuộc trò chuyện này"></a> |
|
|
60
66
|
| **Trạng thái dự án** | <a id="feature-projectstatus"></a>Dòng dự án trên thanh bên hiện cùng dấu đang chạy / đang chờ / xong như các cuộc trò chuyện của nó. Vì vậy, dự án đã thu gọn vẫn cho bạn biết có cuộc trò chuyện bên trong đang làm việc hoặc cần bạn. Cuộc trò chuyện đang chờ bạn được hiện trước, sau đó là cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh, kể cả khi một cuộc trò chuyện khác vẫn đang chạy), rồi đến dấu đang chạy. Di chuột lên để xem chi tiết. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Trạng thái dự án"></a> |
|
|
67
|
+
| **Branch Git trên dòng cuộc trò chuyện** | <a id="feature-sessionbranch"></a>Mỗi dòng cuộc trò chuyện ở thanh bên hiển thị một nhãn nhỏ màu xám với branch git mà thư mục dự án của cuộc trò chuyện đang ở trong lượt cuối của cuộc trò chuyện đó (ví dụ `main` hoặc `feature/login`; HEAD tách rời hiển thị ID commit ngắn trong ngoặc đơn). Hai cuộc trò chuyện của cùng một dự án trên các branch khác nhau không còn trông giống nhau, và bạn thấy ngay khi sắp tiếp tục một cuộc trò chuyện trên sai branch. Di chuột lên nhãn để xem tên đầy đủ. Phần Host đọc branch (`git branch --show-current`, chỉ đọc) khi một lượt bắt đầu và khi kết thúc; cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài tính năng này, hoặc thư mục không phải repository git, sẽ không có nhãn. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ảnh chụp màn hình: Branch Git trên dòng cuộc trò chuyện"></a> |
|
|
68
|
+
| **Đánh dấu tất cả là đã đọc** | <a id="feature-markprojectread"></a>Trên thanh bên, nhấp nút **…** của một dự án → **Đánh dấu tất cả là đã đọc**. Mọi cuộc trò chuyện trong dự án đó mất chấm xanh chưa đọc cùng lúc; các dự án khác vẫn giữ chấm của mình. Mục này hiện màu xám (**Không có cuộc trò chuyện chưa đọc**) khi dự án không có cuộc trò chuyện chưa đọc nào. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Ảnh chụp màn hình: Đánh dấu tất cả là đã đọc"></a> |
|
|
61
69
|
| **Ưu tiên dự án đang hoạt động** | <a id="feature-activeprojectsfirst"></a>Khi một cuộc trò chuyện bắt đầu chạy hoặc cần bạn, dự án của nó di chuyển lên đầu thanh bên với hiệu ứng dòng của chính dsh (giống như khi bạn kéo dự án lên đó). Dự án đã xong giữ nguyên vị trí; bạn vẫn kéo chúng đến bất kỳ đâu như thường. Các lần di chuyển được lưu vào thứ tự dự án của dsh, nên khi tắt tính năng này, thứ tự hiện tại được giữ nguyên. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Ưu tiên dự án đang hoạt động"></a> |
|
|
62
70
|
| **Bộ lọc dự án gần đây** | <a id="feature-recentprojects"></a>Thanh bên → tùy chọn hiển thị (biểu tượng thanh trượt) → **Hoạt động trong 2 giờ qua**. Khi tùy chọn này được chọn, thanh bên chỉ hiện các dự án có cuộc trò chuyện hoạt động trong 2 giờ qua: cuộc trò chuyện được cập nhật trong khoảng thời gian này, cuộc trò chuyện đang chạy hoặc đang chờ, cuộc trò chuyện đang mở, hoặc cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh “xong” của dsh), kể cả sau 2 giờ. Các dự án không có cuộc trò chuyện như vậy bị ẩn, kể cả dự án mới và trống. Chọn lại tùy chọn để hiện tất cả dự án. Lựa chọn được lưu trên thiết bị này. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Ảnh chụp màn hình: Bộ lọc dự án gần đây"></a> |
|
|
63
71
|
| **Thu gọn tất cả dự án** | <a id="feature-collapseprojects"></a>Khi có dự án đang mở trên thanh bên, một nút xuất hiện cạnh tùy chọn hiển thị (biểu tượng thanh trượt). Nhấp vào nút để đóng mọi dự án đang mở cùng lúc, ví dụ 3 dự án đang mở trong số 5. Nút lại ẩn đi khi không còn dự án nào mở. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Ảnh chụp màn hình: Thu gọn tất cả dự án"></a> |
|
|
64
72
|
| **Sắp xếp theo trạng thái** | <a id="feature-statusorder"></a>Thanh bên → tùy chọn hiển thị → **Sắp xếp theo** → **Theo trạng thái** (cùng với **Trong một danh sách**). Các cuộc trò chuyện đã xong đứng đầu (chấm “xong” của dsh; lượt kết thúc do lỗi cũng có chấm này), sau đó là cuộc trò chuyện đang chạy hoặc đang chờ, rồi đến cuộc trò chuyện có tự động hóa đang hoạt động (Tác vụ tự động), cuối cùng là phần còn lại theo thứ tự của dsh. Khi bạn mở một cuộc trò chuyện đã xong, nó chuyển xuống dưới. Chỉ chế độ xem thay đổi: chọn **Thủ công** hoặc **Cập nhật gần nhất** để quay lại. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Ảnh chụp màn hình: Sắp xếp theo trạng thái"></a> |
|
|
65
73
|
| **Thông báo nền** | <a id="feature-notifications"></a>Khi dsh chạy nền, bạn nhận thông báo khi một lượt kết thúc (dòng đầu tiên của câu trả lời), hoặc khi một cuộc trò chuyện thật sự chờ bạn: một phê duyệt (tên công cụ), một câu trả lời (câu hỏi) hoặc một lần xem xét kế hoạch. Yêu cầu phải vẫn còn mở sau 1,5 giây, nên các phê duyệt được trả lời tự động (quyền của Đánh giá tự động, plugin khác) không gây thông báo. Thông báo bị thu hồi ngay khi yêu cầu của nó được trả lời. Huy hiệu trên Dock/thanh tác vụ đếm số cuộc trò chuyện đang chờ. Nhấp vào thông báo sẽ mở cuộc trò chuyện đó. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Ảnh chụp màn hình: Thông báo nền"></a> |
|
|
66
74
|
| **Ngôn ngữ ứng dụng** | <a id="feature-language"></a>Cài đặt → Composer Plus → **Ngôn ngữ ứng dụng** chuyển toàn bộ giao diện dsh sang Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt hoặc हिन्दी (xem bên dưới). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ảnh chụp màn hình: Ngôn ngữ ứng dụng"></a> |
|
|
67
|
-
| **Kết nối di động (iPhone)** | <a id="feature-mobileconnect"></a>Dùng dsh từ iPhone với ứng dụng [Tether](tether/), trong cùng mạng Wi-Fi hoặc qua [Tailscale](https://tailscale.com). Bật tính năng trong **Cài đặt → Composer Plus** (mặc định tắt, vì tính năng này mở một cổng mạng trên máy Mac này). Sau đó nhấp **Kết nối di động** ở góc dưới bên trái thanh bên: quét mã QR bằng Camera của iPhone (chạm vào **Open in Tether**) hoặc bằng **Scan code** trong Tether, chạm vào **Connect** và nhấp **Approve**. Hãy cài đặt Tether trước: nếu không có Tether, Camera không thể mở mã này. Điện thoại hiện các cuộc trò chuyện của bạn, gửi tin nhắn, trả lời phê duyệt và câu hỏi, và chuyển đổi mô hình và agent. Bạn có thể ghép nối bao nhiêu máy Mac tùy ý: tên máy Mac ở góc trên bên trái ứng dụng dùng để chuyển giữa các máy. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ảnh chụp màn hình: Kết nối di động (iPhone)"></a> |
|
|
75
|
+
| **Kết nối di động (iPhone)** | <a id="feature-mobileconnect"></a>Dùng dsh từ iPhone với ứng dụng [Tether](tether/), trong cùng mạng Wi-Fi hoặc qua [Tailscale](https://tailscale.com). Bật tính năng trong **Cài đặt → Composer Plus** (mặc định tắt, vì tính năng này mở một cổng mạng trên máy Mac này). Sau đó nhấp **Kết nối di động** ở góc dưới bên trái thanh bên: quét mã QR bằng Camera của iPhone (chạm vào **Open in Tether**) hoặc bằng **Scan code** trong Tether, chạm vào **Connect** và nhấp **Approve**. Hãy cài đặt Tether trước: nếu không có Tether, Camera không thể mở mã này. Điện thoại hiện các cuộc trò chuyện của bạn, gửi tin nhắn (kèm ảnh: **+** trong khung soạn thảo → Camera, Photos hoặc Paste image), trả lời phê duyệt và câu hỏi, và chuyển đổi mô hình và agent. Bạn có thể ghép nối bao nhiêu máy Mac tùy ý: tên máy Mac ở góc trên bên trái ứng dụng dùng để chuyển giữa các máy. Bảng **Kết nối di động** liệt kê các iPhone đã ghép nối kèm lần kết nối gần nhất: **Remove** ngắt ngay một máy. “Tailscale only” từ chối mạng cục bộ (dành cho Wi-Fi dùng chung), và nhật ký truy cập cho biết ai đã thử kết nối. Trong Tether, “Settings → Privacy” khóa ứng dụng bằng Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ảnh chụp màn hình: Kết nối di động (iPhone)"></a> |
|
|
68
76
|
| **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần (lấy từ chính lần kiểm tra cập nhật, không gọi mạng thêm); **Đóng** hoặc `Esc` đóng nó. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
|
|
69
77
|
|
|
70
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -73,7 +81,7 @@ Nút, chú thích khi di chuột, thông báo trong ứng dụng và thông báo
|
|
|
73
81
|
|
|
74
82
|
## Cài đặt
|
|
75
83
|
|
|
76
|
-
Bạn có thể bật hoặc tắt riêng từng tính năng: dsh **Cài đặt → Composer Plus**. Mỗi dòng có một ảnh chụp màn hình nhỏ: di chuột lên để xem ảnh lớn hơn, nhấp để mở ở kích thước đầy đủ (`Esc` để đóng). Ô **Tìm tính năng** ở đầu trang lọc trang theo tên hoặc mô tả (mọi ngôn ngữ, không phân biệt chữ hoa/thường và dấu); `Esc` xóa nội dung ô. Mỗi dòng có một công tắc và một mô tả ngắn. Dấu **?** nhỏ sau tên một dòng mở phần README mô tả tính năng đó, trong README theo ngôn ngữ giao diện của dsh. Thay đổi có hiệu lực ngay, không cần khởi động lại, và được ghi nhớ trên thiết bị đó. Mọi tính năng đều bật theo mặc định, trừ **Kết nối di động**, **Tiếp tục sau khi khởi động lại** và **Hoàn thành khi gõ**. Host của dsh giữ công tắc của ba tính năng này cùng **Tìm trong nội dung**, **Hoàn tác lượt
|
|
84
|
+
Bạn có thể bật hoặc tắt riêng từng tính năng: dsh **Cài đặt → Composer Plus**. Mỗi dòng có một ảnh chụp màn hình nhỏ: di chuột lên để xem ảnh lớn hơn, nhấp để mở ở kích thước đầy đủ (`Esc` để đóng). Ô **Tìm tính năng** ở đầu trang lọc trang theo tên hoặc mô tả (mọi ngôn ngữ, không phân biệt chữ hoa/thường và dấu); `Esc` xóa nội dung ô. Mỗi dòng có một công tắc và một mô tả ngắn. Dấu **?** nhỏ sau tên một dòng mở phần README mô tả tính năng đó, trong README theo ngôn ngữ giao diện của dsh. Thay đổi có hiệu lực ngay, không cần khởi động lại, và được ghi nhớ trên thiết bị đó. Mọi tính năng đều bật theo mặc định, trừ **Kết nối di động**, **Tiếp tục sau khi khởi động lại** và **Hoàn thành khi gõ**. Host của dsh giữ công tắc của ba tính năng này cùng **Tìm trong nội dung**, **Hoàn tác lượt**, **Dự đoán tin nhắn tiếp theo** và **Kiểm tra mục tiêu**, nên các công tắc này áp dụng cho mọi cửa sổ và vẫn còn sau khi khởi động lại. Host cũng giữ lựa chọn **Mô hình** của **Dự đoán tin nhắn tiếp theo**, của **Hoàn thành khi gõ** (mặc định là **Giống dự đoán tin nhắn tiếp theo**), của **Cải thiện prompt**, của **Kiểm tra mục tiêu** (cả hai mặc định là **Giống mô hình của cuộc trò chuyện**), và **Giới hạn thời gian** của **Cho phép trong cuộc trò chuyện này** (mặc định là 1 giờ). **Tìm trong nội dung** chỉ thay đổi sau khi khởi động lại dsh (dsh đọc cài đặt này lúc khởi động); trước đó, dòng của tính năng hiện **Khởi động lại dsh để áp dụng thay đổi này.**
|
|
77
85
|
|
|
78
86
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="Cài đặt → Composer Plus: ô tìm tính năng, bộ chọn ngôn ngữ, dòng cập nhật và một công tắc cho mỗi tính năng, kèm ảnh xem trước khi di chuột"></p>
|
|
79
87
|
|
|
@@ -87,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
87
95
|
|
|
88
96
|
Toàn bộ ứng dụng chuyển ngôn ngữ ngay lập tức. Lựa chọn này là cài đặt `locale.preference` đã lưu của chính dsh (cùng cài đặt với Chung → Ngôn ngữ), nên vẫn được giữ sau khi khởi động lại. **Ngôn ngữ hệ thống** xóa lựa chọn đó: ứng dụng desktop theo ngôn ngữ của hệ điều hành, giao diện web theo ngôn ngữ của trình duyệt, và ngôn ngữ chưa được hỗ trợ sẽ chuyển về tiếng Anh. Việc cài plugin không bao giờ ghi đè ngôn ngữ bạn đã chọn.
|
|
89
97
|
|
|
90
|
-
Mỗi gói có 3.
|
|
98
|
+
Mỗi gói có 3.280 chuỗi văn bản: mọi văn bản giao diện của dsh `0.2.0-rc.2` và `0.2.1-rc.2` (cuộc trò chuyện, thanh bên, cài đặt, phê duyệt, tác vụ tự động, xem trước tệp, trình quản lý plugin, chợ plugin), các điều khiển riêng của plugin và plugin phổ biến [dsh-rewind](https://github.com/SiriLee/dsh-rewind). Những phần không được dịch: tin nhắn của bạn, đầu ra của mô hình, mã, tên lệnh gạch chéo (`/plan`, `/compact`), nhãn do nhà cung cấp đặt như mức suy luận `High`, văn bản của plugin khác, và menu gốc/hộp thoại cập nhật của ứng dụng desktop (dsh chỉ cung cấp các phần này bằng tiếng Anh/tiếng Trung). Chuỗi mới do phiên bản dsh mới hơn thêm vào sẽ hiện bằng tiếng Anh cho đến khi các gói được cập nhật. Nếu một plugin khác đã cung cấp một ngôn ngữ, plugin đó giữ ngôn ngữ ấy.
|
|
91
99
|
|
|
92
100
|
## Phím tắt
|
|
93
101
|
|
|
@@ -107,6 +115,12 @@ Mỗi gói có 3.143 chuỗi văn bản: mọi văn bản giao diện của dsh
|
|
|
107
115
|
| `Tab` | khung soạn thảo trống có dự đoán | đưa dự đoán vào khung soạn thảo |
|
|
108
116
|
| `Tab` | phần hoàn thành màu xám sau con trỏ | thêm phần hoàn thành vào tin nhắn |
|
|
109
117
|
| `Esc` | khung soạn thảo trống có dự đoán | ẩn dự đoán |
|
|
118
|
+
| `Cmd/Ctrl+Z` | khung soạn thảo, sau khi dùng **Cải thiện prompt** | đưa văn bản bạn đã gõ trở lại |
|
|
119
|
+
| `Esc` | khung soạn thảo, khi **Cải thiện prompt** đang chạy | hủy cải thiện |
|
|
120
|
+
| `Enter` / `Esc` | tin nhắn trong hàng đợi mà bạn đã nhấp đúp | lưu / hủy chỉnh sửa |
|
|
121
|
+
| `Cmd+F` trên Mac, `Ctrl+F` trên Windows và Linux | cuộc trò chuyện đang mở | mở **Tìm trong cuộc trò chuyện** |
|
|
122
|
+
| `Enter` / `Shift+Enter`, `↓` / `↑` | ô **Tìm trong cuộc trò chuyện** | kết quả khớp tiếp theo / trước đó |
|
|
123
|
+
| `Esc` | ô **Tìm trong cuộc trò chuyện** | đóng ô |
|
|
110
124
|
|
|
111
125
|
Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng nó.
|
|
112
126
|
|
|
@@ -119,19 +133,24 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
119
133
|
- **Tiếp tục:** endpoint cục bộ có xác thực chỉ tiếp tục lượt bị ngắt gần nhất, từ chối yêu cầu cũ hoặc trùng lặp, và giữ nguyên các hook phê duyệt hiện có. Endpoint này không gửi tin nhắn mới của người dùng.
|
|
120
134
|
- **Tiếp tục sau khi khởi động lại:** tắt cho đến khi bạn bật. Phần Host chỉ lưu ID cuộc trò chuyện và thời điểm bắt đầu trong `$DSH_HOME/storages/dsh-composer-plus/resume.json` (chỉ chủ sở hữu có quyền truy cập), và không có gì rời khỏi máy của bạn. Phần này chỉ tiếp tục một cuộc trò chuyện khi nhật ký của chính dsh cho biết dsh (không phải bạn) đã dừng lượt cuối. Phê duyệt và Đánh giá tự động áp dụng cho lượt được tiếp tục như thường lệ.
|
|
121
135
|
|
|
122
|
-
- **Bảng thay đổi:** git chạy ở chế độ chỉ đọc trên máy của bạn, trong thư mục của chính cuộc trò chuyện, qua kênh `/api` có xác thực của dsh. Tính năng không bao giờ commit, stage hay fetch, và chỉ hiện các đường dẫn mà chính git liệt kê.
|
|
123
|
-
- **Ý tưởng tính năng:** không có gì chạy cho đến khi bạn nhấp **Đề xuất tính năng**. Khi đó, phần Host chỉ đọc thư mục của chính cuộc trò chuyện (trình duyệt không bao giờ gửi đường dẫn): tên các mục ở cấp cao nhất, 6 kB đầu của README, AGENTS.md và tệp manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) và `git log --
|
|
136
|
+
- **Bảng thay đổi:** git chạy ở chế độ chỉ đọc trên máy của bạn, trong thư mục của chính cuộc trò chuyện, qua kênh `/api` có xác thực của dsh. Tính năng không bao giờ commit, stage hay fetch, và chỉ hiện các đường dẫn mà chính git liệt kê. Cây liệt kê tối đa 1000 branch cục bộ và từ xa, và hiển thị 300 commit mới nhất của một branch: chỉ theo nhánh cha đầu tiên, nên một commit merge đại diện cho các commit mà nó mang vào. Cây không bao giờ chuyển branch (checkout). **Cuộc trò chuyện này** đọc nhật ký riêng của cuộc trò chuyện để tìm các tệp mà công cụ tệp của nó đã ghi, rồi so sánh chúng với snapshot Hoàn tác lượt của cuộc trò chuyện trong một thư mục tạm bị xóa ngay; chế độ này không ghi gì vào repository của bạn hay vào kho snapshot.
|
|
137
|
+
- **Ý tưởng tính năng:** không có gì chạy cho đến khi bạn nhấp **Đề xuất tính năng**. Khi đó, phần Host chỉ đọc thư mục của chính cuộc trò chuyện (trình duyệt không bao giờ gửi đường dẫn): tên các mục ở cấp cao nhất, 6 kB đầu của README, AGENTS.md và tệp manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …), dàn ý phần còn lại của README (tiêu đề, hàng của bảng, mục danh sách; tối đa 6 kB) và tiêu đề các commit mới nhất (`git log --format=%s`, tối đa 6 kB), tổng cộng tối đa 28 kB. Phần Host bỏ qua `.env*`, các tệp khóa và các thư mục như `node_modules`, và chỉ đọc tệp thông thường nằm trong thư mục: symlink trỏ ra ngoài thư mục, FIFO hoặc tệp thiết bị đều bị bỏ qua. Bản tóm tắt này được gửi đến mô hình mà cuộc trò chuyện đang dùng, qua cài đặt nhà cung cấp của chính dsh, dưới dạng một yêu cầu duy nhất; bản tóm tắt không được thêm vào cuộc trò chuyện nào. Không có gì được ghi vào dự án. Ý tưởng được vuốt sang phải bắt đầu một cuộc trò chuyện mới ở chế độ kế hoạch, nên phê duyệt và xem xét kế hoạch vẫn áp dụng như thường lệ. **Xây dựng ngay** bắt đầu cuộc trò chuyện không có chế độ kế hoạch: mô hình có thể thay đổi tệp ngay, với các phê duyệt thường lệ của cuộc trò chuyện và Đánh giá tự động. Các ý tưởng lưu để làm sau (tiêu đề, tóm tắt, lý do, công sức) được lưu cùng đường dẫn thư mục của dự án trong `storages/dsh-composer-plus/later.json` dưới thư mục home của dsh (tệp chỉ chủ sở hữu truy cập được); không có gì đi vào dự án. Lịch sử các ý tưởng đã đề xuất (tiêu đề, tóm tắt, lý do, công sức, ngày, đã bắt đầu hay chưa) được lưu theo cùng cách trong `storages/dsh-composer-plus/idea-history.json`, tối đa 200 cho mỗi dự án (ý tưởng cũ nhất bị xóa trước); các tiêu đề trong đó được gửi tới mô hình cùng lần **Đề xuất tính năng** tiếp theo của dự án đó.
|
|
124
138
|
- **Tìm trong nội dung:** không có mã mới nào tìm trong cuộc trò chuyện của bạn: plugin chỉ bật chỉ mục tin nhắn của chính dsh (SQLite FTS5, `dsh-session-query-sqlite`) và cấp cho chỉ mục một tệp, `$DSH_HOME/cache/composer-plus/session-search.db` (tệp và thư mục chỉ chủ sở hữu truy cập được). Tệp này chứa văn bản tin nhắn của bạn và của trợ lý, nên cần được bảo vệ như nhật ký trò chuyện trong `$DSH_HOME/sessions`. Không có gì rời khỏi máy của bạn. Đây là bản sao mà dsh có thể tạo lại: bạn có thể xóa tệp khi dsh đang đóng. Công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
125
|
-
- **Hoàn tác lượt:** trước mỗi tin nhắn của bạn, Host chụp một snapshot git của thư mục cuộc trò chuyện vào kho riêng của nó, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (thư mục chỉ chủ sở hữu truy cập được). Kho này chứa bản sao các tệp trong thư mục mà git nhìn thấy (không gồm tệp bị bỏ qua), nên cần được bảo vệ như chính dự án. Host đọc các object trong repository của bạn (không sao chép những gì git đã có) và không bao giờ ghi vào index, `HEAD`, branch, tag, stash hay config của repository. Thay đổi duy nhất git tạo ra ở đó là dấu thời gian mới hơn trên các tệp object được dùng lại (việc này làm `git gc` dọn chúng muộn hơn). Hoàn tác kèm tệp chỉ ghi tệp thông thường bên trong thư mục cuộc trò chuyện; nó bỏ qua symlink, pipe và mọi thứ nằm ngoài thư mục. Không có gì rời khỏi máy của bạn. Bạn có thể xóa kho này khi dsh đang đóng (khi đó hoàn tác chỉ áp dụng cho cuộc trò chuyện, cho đến khi có tin nhắn mới). **Xóa cuộc trò chuyện** cũng xóa kho của cuộc trò chuyện đó. Công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
|
|
139
|
+
- **Hoàn tác lượt:** trước mỗi tin nhắn của bạn, Host chụp một snapshot git của thư mục cuộc trò chuyện vào kho riêng của nó, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (thư mục chỉ chủ sở hữu truy cập được). Kho này chứa bản sao các tệp trong thư mục mà git nhìn thấy (không gồm tệp bị bỏ qua), nên cần được bảo vệ như chính dự án. Host đọc các object trong repository của bạn (không sao chép những gì git đã có) và không bao giờ ghi vào index, `HEAD`, branch, tag, stash hay config của repository. Thay đổi duy nhất git tạo ra ở đó là dấu thời gian mới hơn trên các tệp object được dùng lại (việc này làm `git gc` dọn chúng muộn hơn). Hoàn tác kèm tệp chỉ ghi tệp thông thường bên trong thư mục cuộc trò chuyện; nó bỏ qua symlink, pipe và mọi thứ nằm ngoài thư mục. Không có gì rời khỏi máy của bạn. Bạn có thể xóa kho này khi dsh đang đóng (khi đó hoàn tác chỉ áp dụng cho cuộc trò chuyện, cho đến khi có tin nhắn mới). **Xóa cuộc trò chuyện** cũng xóa kho của cuộc trò chuyện đó. Công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Hoàn tác kèm tệp cũng giữ các tệp như trạng thái ngay trước lần hoàn tác (`refs/r/…` trong cùng kho), để dùng cho **Làm lại**; các lần hoàn tác đã được làm lại được liệt kê trong `$DSH_HOME/storages/dsh-composer-plus/redone.json` (chỉ chủ sở hữu truy cập được).
|
|
140
|
+
- **Mở issue trên GitHub** (Ý tưởng tính năng → danh sách **Để sau**): chỉ chạy khi bạn nhấp vào. Phần Host chạy GitHub CLI của chính bạn (`gh issue create`) trong thư mục của cuộc trò chuyện, với tiêu đề và tóm tắt đã lưu của ý tưởng (và lý do nó quan trọng); `gh` dùng thông tin đăng nhập riêng của nó và remote GitHub của thư mục, nên issue được tạo trong repository đó bằng tài khoản của bạn, và GitHub hiển thị issue cho mọi người có thể xem repository đó. dsh xóa các biến có tên giống token khỏi những lệnh mà nó khởi chạy; nếu bạn đã cung cấp token cho `gh` qua `GH_TOKEN` hoặc `GITHUB_TOKEN`, plugin chỉ chuyển các biến này cho `gh`. Liên kết issue được lưu cùng ý tưởng trong `later.json`.
|
|
141
|
+
- **Các cuộc trò chuyện đã thay đổi tệp này** (Thay đổi, menu "…" của một tệp): phần Host đọc nhật ký của các cuộc trò chuyện có thư mục nằm trong cùng repository, theo đúng cách dsh lưu chúng, rồi trả về tiêu đề của từng cuộc trò chuyện, thời gian và dòng đầu tiên của yêu cầu; phần Host không bao giờ mở chính tệp đó.
|
|
142
|
+
- **Branch Git trên dòng cuộc trò chuyện:** phần Host chạy `git branch --show-current` (chỉ đọc) trong thư mục của cuộc trò chuyện khi một lượt bắt đầu và khi kết thúc, và chỉ lưu ID cuộc trò chuyện, tên branch và thời gian trong `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (tệp chỉ chủ sở hữu truy cập được, 2000 cuộc trò chuyện mới nhất). Công tắc nằm trong `branches.json` bên cạnh.
|
|
143
|
+
- **Tìm trong cuộc trò chuyện** chỉ chạy trong trang: tính năng đọc văn bản mà trang hiển thị và không gửi gì cả.
|
|
126
144
|
- **Xuất cuộc trò chuyện dạng Markdown:** phần Host chỉ đọc nhật ký riêng của cuộc trò chuyện (chính các tin nhắn mà dsh hiển thị) và đưa chúng cho trang; phần này không đọc tệp nào của dự án và không gửi gì qua mạng. Markdown chỉ đi vào bộ nhớ tạm của bạn hoặc vào tệp mà bạn lưu.
|
|
127
145
|
- **Xóa cuộc trò chuyện:** chuyển các thư mục nhật ký riêng của cuộc trò chuyện (`$DSH_HOME/sessions/<project>/<chat>`) vào Thùng rác. Tính năng không động đến thư mục dự án.
|
|
128
|
-
- **Cho phép trong cuộc trò chuyện này:** các quyền được lưu trong `$DSH_HOME/storages/dsh-composer-plus/grants.json` (chỉ chủ sở hữu có quyền truy cập). Mỗi quyền áp dụng cho đúng một công cụ trong một cuộc trò chuyện. Nếu công cụ đó có thể ghi, quyền cũng bao gồm mọi thao tác ghi. Thu hồi quyền từ nhãn ở phần đầu.
|
|
146
|
+
- **Cho phép trong cuộc trò chuyện này:** các quyền được lưu cùng thời điểm cấp trong `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (chỉ chủ sở hữu có quyền truy cập). Mỗi quyền áp dụng cho đúng một công cụ trong một cuộc trò chuyện, cho đến khi hết giới hạn thời gian (mặc định 1 giờ). Nếu công cụ đó có thể ghi, quyền cũng bao gồm mọi thao tác ghi. Thu hồi quyền từ nhãn ở phần đầu.
|
|
129
147
|
- Đánh giá tự động vẫn chạy ở mọi lệnh gọi; lỗi đánh giá không bao giờ được tự động cho phép.
|
|
130
|
-
- **Kết nối di động:** tắt cho đến khi bạn bật. Khi bật, phần Host chạy gateway Tether: HTTPS trên cổng 19390, chỉ nhận kết nối từ mạng con Wi-Fi và tailnet của bạn (100.64.0.0/10), và một trang ghép nối tại `127.0.0.1:19391` (chỉ máy Mac này). Điện thoại cần một mã dùng một lần từ mã QR (hiệu lực 5 phút) và bạn phải nhấp **Approve** trên máy Mac. Điện thoại ghim (pin) chứng chỉ của gateway. Máy Mac chỉ giữ hash của token của từng điện thoại (30 ngày, được gia hạn khi còn dùng); **Remove** đóng ngay các kết nối của điện thoại đó. Điện thoại chỉ gọi được một danh sách cho phép gồm các phương thức dsh (cuộc trò chuyện, prompt, tệp đính kèm, lệnh gạch chéo, phê duyệt, câu hỏi, mô hình, agent, mục tiêu), không gọi được cài đặt, thông tin xác thực, trình duyệt tệp hay terminal. Dữ liệu: `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
148
|
+
- **Kết nối di động:** tắt cho đến khi bạn bật. Khi bật, phần Host chạy gateway Tether: HTTPS trên cổng 19390, chỉ nhận kết nối từ mạng con Wi-Fi và tailnet của bạn (100.64.0.0/10), và một trang ghép nối tại `127.0.0.1:19391` (chỉ máy Mac này). Điện thoại cần một mã dùng một lần từ mã QR (hiệu lực 5 phút) và bạn phải nhấp **Approve** trên máy Mac. Điện thoại ghim (pin) chứng chỉ của gateway. Máy Mac chỉ giữ hash của token của từng điện thoại (30 ngày, được gia hạn khi còn dùng); **Remove** đóng ngay các kết nối của điện thoại đó. Điện thoại chỉ gọi được một danh sách cho phép gồm các phương thức dsh (cuộc trò chuyện, prompt, tệp đính kèm, lệnh gạch chéo, phê duyệt, câu hỏi, mô hình, agent, mục tiêu), không gọi được cài đặt, thông tin xác thực, trình duyệt tệp hay terminal. "Tailscale only" từ chối mọi kết nối từ mạng cục bộ, kể cả các kết nối đang mở. Nhật ký truy cập giữ 200 lần thử kết nối mới nhất (thời gian, địa chỉ IP, tên thiết bị, được cho phép hay bị từ chối, và lý do) trong `access.json`; nhật ký không bao giờ chứa token hay mã ghép nối. Dữ liệu: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (tệp chỉ chủ sở hữu truy cập được). Chi tiết: [tether/README.md](tether/README.md).
|
|
131
149
|
- **Cập nhật:** phần Host hỏi `api.github.com` về bản phát hành mới nhất và hỏi `registry.npmjs.org` về đúng phiên bản đó; không có thông tin nào về bạn hay cuộc trò chuyện của bạn được gửi đi. Việc cài đặt dùng trình quản lý plugin của dsh (`pnpm add dsh-composer-plus@<version>`; khi dsh 0.2.1 từ chối lệnh đó cho một plugin đã cài, dùng `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, và sau đó profile ghi URL đó làm nguồn của plugin), nên các bước kiểm tra registry, script và khả năng tương thích phiên bản của chính dsh đều được áp dụng. Thẻ tiền phát hành (pre-release) và phiên bản cũ hơn không bao giờ được cài.
|
|
132
150
|
- **Dự đoán tin nhắn tiếp theo:** mặc định bật. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi mô hình này. Sau mỗi lượt đã xong, phần Host gửi các tin nhắn của chính bạn trong cuộc trò chuyện và các câu trả lời dạng văn bản của tác tử (không có đầu ra công cụ, ngữ cảnh ẩn hay phần suy luận), tối đa khoảng 6.000 ký tự (phần mới nhất), đến mô hình đã chọn (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác). Nội dung này đi qua cài đặt nhà cung cấp của chính dsh, dưới dạng một yêu cầu duy nhất. Không có gì được lưu vào cuộc trò chuyện: dự đoán không được thêm vào lịch sử trò chuyện. Công tắc và mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/predict.json` (tệp chỉ chủ sở hữu truy cập được).
|
|
133
151
|
- **Hoàn thành khi gõ:** tắt cho đến khi bạn bật. Khi bật, mỗi lần bạn dừng gõ, phần Host gửi văn bản bạn đã gõ đến lúc đó cùng các tin nhắn của chính bạn trong cuộc trò chuyện và các câu trả lời dạng văn bản của tác tử (không có đầu ra công cụ, ngữ cảnh ẩn hay phần suy luận), tối đa khoảng 3.000 ký tự của cuộc trò chuyện, đến mô hình đã chọn trong **Hoàn thành khi gõ** (mặc định là mô hình của **Dự đoán tin nhắn tiếp theo**). Lần dừng gõ mới sẽ hủy yêu cầu trước đó. Không có gì được lưu vào cuộc trò chuyện. Công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/complete.json` (tệp chỉ chủ sở hữu truy cập được).
|
|
134
152
|
- **Cải thiện prompt:** không có gì chạy cho đến khi bạn nhấp vào đũa thần. Khi đó, phần Host gửi bản nháp của bạn, các tin nhắn của chính bạn trong cuộc trò chuyện và các câu trả lời dạng văn bản của tác tử (không có đầu ra công cụ, ngữ cảnh ẩn, phần suy luận hay tin nhắn đã bị hoàn tác; tối đa khoảng 6.000 ký tự, phần mới nhất), cùng bản tóm tắt dự án như **Ý tưởng tính năng** (với cùng quy tắc tệp: không có `.env*` hay tệp khóa, không có symlink trỏ ra ngoài thư mục, không có FIFO), các đường dẫn mà `git status` liệt kê là đã thay đổi và tối đa 30 đường dẫn được theo dõi hoặc chưa được theo dõi (không bị bỏ qua) có tên chứa từ trùng với bản nháp của bạn, đến mô hình đã chọn trong **Cải thiện prompt** (mặc định là mô hình của chính cuộc trò chuyện), dưới dạng một yêu cầu duy nhất. Ngoài bản tóm tắt đó, nội dung tệp không được gửi. Không có gì được ghi vào cuộc trò chuyện hay dự án: câu trả lời chỉ thay thế bản nháp của bạn trong khung soạn thảo, và bạn quyết định có gửi hay không. Mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/improve.json` (tệp chỉ chủ sở hữu truy cập được).
|
|
153
|
+
- **Kiểm tra mục tiêu:** chỉ chạy khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động (hoặc khi bạn nhấp **Chạy ngay**). Phần Host chạy lệnh kiểm thử trong thư mục của cuộc trò chuyện theo chế độ sandbox của cuộc trò chuyện (giống công cụ `bash` của chính dsh: cùng chính sách truy cập tệp; khi sandbox đó không khởi động được, bài kiểm thử không chạy và bước kiểm tra thất bại). Để tìm lệnh, phần Host chỉ đọc `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` và `pytest.ini`, dưới dạng tệp thông thường bên trong thư mục (không có symlink trỏ ra ngoài thư mục, không có FIFO). Sau đó phần Host gửi mục tiêu, cuộc trò chuyện kể từ khi mục tiêu bắt đầu (tin nhắn của bạn, câu trả lời của tác tử, các lệnh gọi công cụ cắt còn 1.000 ký tự và 2.000 ký tự cuối của mỗi kết quả công cụ; không có phần suy luận, không có bước đã bị hoàn tác; tối đa khoảng 60.000 ký tự, phần mới nhất), `git status --short` và phần cuối đầu ra kiểm thử đến mô hình đã chọn trong **Kiểm tra mục tiêu** (mặc định là mô hình của chính cuộc trò chuyện), dưới dạng một yêu cầu duy nhất không có công cụ. Đầu ra công cụ có thể chứa những gì tác tử đã đọc, nên yêu cầu này có thể chứa một phần tệp của bạn, giống như chính cuộc trò chuyện. Không có gì được ghi vào cuộc trò chuyện hay dự án. Lệnh kiểm thử của bạn, các giới hạn, kết quả gần nhất (kèm phần cuối đầu ra) và mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (tệp chỉ chủ sở hữu truy cập được, 500 cuộc trò chuyện mới nhất).
|
|
135
154
|
|
|
136
155
|
## Khắc phục sự cố
|
|
137
156
|
|
|
@@ -144,8 +163,13 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
144
163
|
- **Tin nhắn của tôi không có nút ↶:** Hoàn tác lượt đang tắt, cuộc trò chuyện là cuộc trò chuyện subagent, hoặc dsh-rewind-plugin đã được cài (hãy dùng nút ↶ của plugin đó). Sau khi cập nhật, hãy khởi động lại dsh.
|
|
145
164
|
- **Cuộc trò chuyện và tệp bị mờ:** dự án không phải repository git, không có snapshot từ trước tin nhắn đó (tin nhắn cũ hơn plugin, hoặc một trong 50 snapshot mới nhất đã thay thế snapshot đó), hoặc không có tệp nào thay đổi.
|
|
146
165
|
- **Thao tác xóa báo rằng một dsh khác đang mở cuộc trò chuyện này:** một dsh thứ hai dùng cùng thư mục home của dsh đang giữ khóa của cuộc trò chuyện. Hãy đóng cửa sổ đó hoặc dsh đó, rồi xóa lại. Trong lúc đó, cuộc trò chuyện vẫn ở trạng thái đã lưu trữ.
|
|
166
|
+
- **iPhone không kết nối được sau khi tôi bật "Tailscale only":** Tailscale phải được bật trên cả máy Mac và iPhone. Bảng Kết nối di động sẽ cảnh báo khi Tailscale đang tắt trên máy Mac. Nhật ký truy cập hiện từng lần thử bị từ chối kèm lý do.
|
|
147
167
|
- **Một cuộc trò chuyện không tiếp tục sau khi khởi động lại:** Tiếp tục sau khi khởi động lại đang tắt khi dsh thoát, bạn đã tự dừng lượt đó, lượt đã kết thúc (xong hoặc thất bại), cuộc trò chuyện đã được lưu trữ, hoặc có hơn 20 cuộc trò chuyện đang chạy (20 cuộc trò chuyện mới nhất sẽ tiếp tục).
|
|
148
|
-
- **
|
|
168
|
+
- **Mở issue trên GitHub báo "gh could not open the issue":** thông báo này là dòng đầu tiên của chính `gh`. Chạy `gh auth status` trong terminal và đăng nhập bằng `gh auth login`; thư mục của cuộc trò chuyện phải có một remote GitHub (`git remote -v`). "not installed or not on the PATH of dsh" nghĩa là dsh không tìm thấy `gh`: hãy cài nó, hoặc khởi động dsh từ một terminal mà ở đó `gh` hoạt động.
|
|
169
|
+
- **Dòng cuộc trò chuyện không có nhãn branch:** cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
|
|
170
|
+
- **Kiểm tra mục tiêu báo bài kiểm thử thoát với mã 127 hoặc "not found":** dsh khởi động từ Finder hoặc Dock có thể có PATH ngắn hơn terminal của bạn, nên không tìm thấy `npm`, `pnpm` hoặc `cargo`. Hãy khởi động dsh từ terminal, hoặc đặt lệnh kiểm thử của riêng bạn với đường dẫn đầy đủ trong **Kiểm tra mục tiêu** → **Sửa**. **Chạy ngay** hiện kết quả ngay lập tức.
|
|
171
|
+
- **Mục tiêu không đóng và tác tử tiếp tục làm việc:** **Kiểm tra mục tiêu** đã tìm thấy một bài kiểm thử thất bại hoặc phần việc còn thiếu; dòng bên dưới mục tiêu cho biết lý do (di chuột lên kết quả để xem chi tiết). Hãy sửa nguyên nhân hoặc lệnh kiểm thử, hoặc tự hoàn tất mục tiêu bằng `/goal` hoặc thanh mục tiêu (việc này không được kiểm tra).
|
|
172
|
+
- **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.14.0`), xem ghi chú cài đặt ở trên.
|
|
149
173
|
|
|
150
174
|
## Giới hạn
|
|
151
175
|
|
|
@@ -161,17 +185,28 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
161
185
|
- **Xóa cuộc trò chuyện** cần tính năng lưu trữ của dsh (dsh 0.2.0 trở lên). Một cuộc trò chuyện (hoặc một cuộc trò chuyện subagent của nó) không dừng trong vòng 15 giây, hoặc đang bị một dsh khác giữ, sẽ ở trạng thái đã lưu trữ và không có gì bị di chuyển. Trên hệ thống khác macOS, thư mục thùng rác phải nằm cùng ổ đĩa với lịch sử trò chuyện. Một cuộc trò chuyện đang mở mà bạn xóa vẫn ở trong bộ nhớ của dsh, ở trạng thái đã lưu trữ và bị ẩn, cho đến khi dsh khởi động lại. Hãy tự dọn Thùng rác; dsh không làm việc này.
|
|
162
186
|
- Hàng đợi của dsh không có thao tác `move`, nên phần Host của plugin di chuyển chính tin nhắn đang chờ trong hàng đợi của dsh (một thay đổi, vẫn là tin nhắn đó). Tin nhắn có hình ảnh hoặc tệp cũng di chuyển được. Chỉ tin nhắn của chính bạn mới di chuyển được: một vòng mục tiêu hoặc một câu trả lời cho câu hỏi trong hàng đợi vẫn ở nguyên chỗ. Nếu một tin nhắn bắt đầu được gửi trong lúc bạn kéo, không có gì được di chuyển và một thông báo cho biết điều đó.
|
|
163
187
|
- dsh 0.2.1 tải bản cập nhật ngay lập tức khi phiên bản mới không thay đổi cài đặt nào của dsh; trong các trường hợp khác và trên dsh 0.2.0, hãy khởi động lại dsh để tải bản cập nhật. Plugin không bao giờ tự khởi động lại dsh thay bạn. Profile web/CLI không có trình quản lý plugin của dsh chỉ báo có phiên bản mới.
|
|
188
|
+
- **Cho phép trong cuộc trò chuyện này** tính giới hạn thời gian từ lúc cấp quyền. Giới hạn thời gian mới áp dụng ngay cho các quyền đang có hiệu lực, nên một giới hạn ngắn hơn có thể kết thúc chúng ngay. Quyền từ phiên bản 1.12 trở về trước không có thời gian: sau khi cập nhật, agent sẽ hỏi lại một lần cho các công cụ đó.
|
|
164
189
|
- **Giữ con trỏ trong khung soạn thảo** chỉ trả lại tiêu điểm sau một lệnh `/` hoặc một skill. Trong lúc dsh xử lý lệnh, khung soạn thảo ở chế độ chỉ đọc trong vài mili giây, nên các phím nhấn trong khoảng đó bị mất. Nếu menu `/` của dsh vẫn đang mở, `Enter` chọn dòng đang được tô sáng và không gửi.
|
|
165
|
-
- **Kết nối di động** chỉ hoạt động trên macOS (dùng `en0`, `openssl`, `swift` và `dns-sd`). Tính năng dùng cố định cổng 19390 và 19391, nên trên mỗi máy Mac, mỗi lúc chỉ một dsh có thể chạy tính năng này (mỗi máy Mac là một mục trong danh sách Mac của điện thoại). Điện thoại chỉ nhận thông báo khi Tether đang mở hoặc vừa chuyển sang chạy nền (không có dịch vụ push). Ứng dụng iOS chưa có trên App Store: hãy build ứng dụng từ `tether/ios` bằng Xcode. Chấm xanh trong Tether theo Mac: cuộc trò chuyện bạn mở trong dsh cũng mất chấm trên điện thoại. Cuộc trò chuyện bạn mở trong Tether chỉ mất chấm trên điện thoại. Chấm riêng của dsh trên Mac vẫn còn cho đến khi bạn mở cuộc trò chuyện đó trên Mac.
|
|
166
|
-
- Liên kết phiên hoạt động bên trong cuộc trò chuyện; nhấp vào liên kết không mở cuộc trò chuyện.
|
|
190
|
+
- **Kết nối di động** chỉ hoạt động trên macOS (dùng `en0`, `openssl`, `swift` và `dns-sd`). Tính năng dùng cố định cổng 19390 và 19391, nên trên mỗi máy Mac, mỗi lúc chỉ một dsh có thể chạy tính năng này (mỗi máy Mac là một mục trong danh sách Mac của điện thoại). Điện thoại chỉ nhận thông báo khi Tether đang mở hoặc vừa chuyển sang chạy nền (không có dịch vụ push). Ứng dụng iOS chưa có trên App Store: hãy build ứng dụng từ `tether/ios` bằng Xcode. "Tailscale only" vẫn cần máy Mac có địa chỉ Wi-Fi hoặc Ethernet (gateway chỉ khởi động khi có địa chỉ đó). Nhật ký truy cập là riêng cho từng máy Mac và chỉ giữ 200 lần thử mới nhất; một lần thử lặp lại trong vòng một phút sẽ tăng số đếm của cùng một dòng thêm một. Khóa ứng dụng của Tether không ẩn bản xem trước thông báo trên Màn hình khóa của iPhone: hãy tắt chúng trong Cài đặt của iOS. Chấm xanh trong Tether theo Mac: cuộc trò chuyện bạn mở trong dsh cũng mất chấm trên điện thoại. Cuộc trò chuyện bạn mở trong Tether chỉ mất chấm trên điện thoại. Chấm riêng của dsh trên Mac vẫn còn cho đến khi bạn mở cuộc trò chuyện đó trên Mac.
|
|
191
|
+
- Liên kết phiên hoạt động bên trong cuộc trò chuyện; nhấp vào liên kết không mở cuộc trò chuyện. Liên kết tạo bằng **Sao chép liên kết tin nhắn** chỉ mở tin nhắn của nó trên dsh 0.2.1 trở lên, và chỉ từ một tin nhắn trong cuộc trò chuyện (dsh 0.2.0 không có quy tắc văn bản người dùng, nên ở đó liên kết vẫn được sao chép nhưng hiện dưới dạng văn bản thường). Tin nhắn mà một lần hoàn tác đã đưa ra, hoặc mà việc nén đã xóa khỏi lịch sử dsh tải, không thể hiển thị: khi đó liên kết sẽ báo như vậy. Các nút 🔗 gắn vào các dòng tin nhắn của dsh; nếu một bản cập nhật dsh thay đổi markup đó, các nút không hiện.
|
|
192
|
+
- **Đánh dấu tất cả là đã đọc** thay đổi các chấm chưa đọc của chính dsh qua một phần của dsh không phải API công khai (danh sách `completionUnread` trong trạng thái phiên của dsh). Nếu một bản cập nhật dsh đổi tên phần này, mục không hiện. Mục được đặt trong menu "…" của dự án trong dsh, và menu này không có vị trí dành cho plugin; nếu dsh thay đổi menu đó, mục cũng không hiện.
|
|
193
|
+
- **Sửa tin nhắn trong hàng đợi tại chỗ** mở trình sửa hàng đợi của chính dsh, nên có các giới hạn của nó: không sửa được tin nhắn có hình ảnh hoặc tệp, và tin nhắn đã bắt đầu được gửi trong lúc đó sẽ không bị thay đổi (dsh hiện lỗi của chính nó).
|
|
194
|
+
- **Làm lại** không bao giờ thay đổi cuộc trò chuyện đã hoàn tác: tính năng bắt đầu một cuộc trò chuyện mới từ ngay trước lúc hoàn tác (tính năng tách nhánh của chính dsh, cùng ngữ cảnh mô hình), nên cuộc trò chuyện mới có id và tiêu đề mới. Chỉ lần hoàn tác mới nhất của một cuộc trò chuyện mới làm lại được, một lần, và chỉ khi chưa có gì sau nó (một tin nhắn mới sẽ bỏ lựa chọn này). Tệp bạn đã thay đổi sau lần hoàn tác được giữ lại, trừ khi bạn đánh dấu ô ghi đè. Làm lại cần snapshot mà lần hoàn tác đã giữ (cùng giới hạn 50 mục); lần hoàn tác thực hiện trước phiên bản này, hoặc bằng **Chỉ cuộc trò chuyện**, chỉ đưa tin nhắn trở lại.
|
|
195
|
+
- **Cuộc trò chuyện này** chỉ tính các tệp mà công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`) đã ghi. Tệp do một lệnh (`bash`) thay đổi không có trong chế độ xem này; chúng hiện trong **Chưa commit**. Khi không có snapshot Hoàn tác lượt của cuộc trò chuyện (Hoàn tác lượt đang tắt, đã cài dsh-rewind-plugin, hoặc cuộc trò chuyện cũ hơn plugin), chế độ xem so sánh với commit gần nhất và báo như vậy. Hoàn tác lượt giữ 50 snapshot mới nhất của một cuộc trò chuyện: trong cuộc trò chuyện dài hơn, chế độ xem so sánh với snapshot cũ nhất còn giữ, cho biết từ tin nhắn nào và không tính các thay đổi trước đó. **Ẩn thay đổi khoảng trắng** là `git diff -w`: một dòng chỉ thay đổi khoảng trắng bên trong cũng bị ẩn.
|
|
196
|
+
- **Mở issue trên GitHub** cần GitHub CLI (`gh`) trong PATH của dsh và một remote GitHub trong thư mục của cuộc trò chuyện. Tính năng chạy tối đa 60 giây; nếu `gh` mất nhiều thời gian hơn, issue có thể đã có trên GitHub mà không có liên kết trong danh sách (trước khi nhấp lại, hãy xem trên GitHub: danh sách chỉ đọc liên kết từ một lần chạy đã xong, nên một lần nhấp mới có thể mở issue thứ hai). Thư mục có nhiều hơn một remote GitHub dùng mặc định của chính `gh` (`gh repo set-default`).
|
|
197
|
+
- **Các cuộc trò chuyện đã thay đổi tệp này** chỉ biết các công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`), giống **Cuộc trò chuyện này**: thay đổi do một lệnh (`bash`) tạo ra không được liệt kê. Tính năng đọc 300 cuộc trò chuyện mới nhất của repository (theo thời điểm tạo) và báo khi có nhiều hơn; tính năng hiển thị tối đa 100 dòng. Tệp đã đổi tên được liệt kê theo tên mà công cụ đã ghi. Cuộc trò chuyện có thư mục nằm ngoài repository (kể cả qua một đường dẫn khác tới cùng các tệp) không được tính. Lần mở đầu tiên sau khi khởi động dsh sẽ đọc mọi nhật ký trò chuyện của repository (khoảng 4 giây cho 275 cuộc trò chuyện); các lần mở sau chỉ đọc những cuộc trò chuyện đã thay đổi từ đó.
|
|
198
|
+
- **Branch Git trên dòng cuộc trò chuyện** hiển thị branch của thư mục cuộc trò chuyện khi lượt cuối của nó bắt đầu hoặc kết thúc, không phải branch hiện tại: việc chuyển branch bên ngoài một lượt sẽ hiện sau lượt tiếp theo. Các cuộc trò chuyện từ trước phiên bản này không có nhãn cho đến lượt tiếp theo của chúng. Nhãn nằm trong markup dòng cuộc trò chuyện của dsh (dsh không có vị trí dành cho nó ở đó); nếu một bản cập nhật dsh thay đổi markup đó, nhãn không hiện.
|
|
199
|
+
- **Tìm trong cuộc trò chuyện** chỉ tìm trong những gì trang hiển thị: các tin nhắn và câu trả lời đã được tải (cuộn lên hoặc nhấp **Tải cũ hơn** để xem các tin cũ hơn), không tìm trong các bước công cụ đang đóng và không tìm trong văn bản bị thu gọn bên trong đầu ra của công cụ. Tính năng đếm tối đa 2.000 kết quả khớp (sau đó là "2000+"). Tính năng dùng API tô sáng của trình duyệt (Chromium 105 trở lên; ứng dụng máy tính có API này): trong trình duyệt cũ hơn, số đếm và việc di chuyển vẫn hoạt động nhưng không có màu. `Cmd+F` trên Mac (`Ctrl+F` trên Windows và Linux) chỉ mở tính năng khi có một cuộc trò chuyện trên màn hình; ở nơi khác, chức năng tìm của chính trình duyệt vẫn hoạt động như trước. Trên Mac, `Ctrl+F` vẫn giữ chức năng của macOS trong ô văn bản (con trỏ tiến lên một ký tự).
|
|
167
200
|
- Nhấp vào thông báo đã gửi trước khi khởi động lại chỉ đưa dsh ra phía trước.
|
|
168
201
|
- Dự án đang hoạt động được di chuyển bằng thứ tự dự án đã lưu của dsh, nên thứ tự mới vẫn được giữ sau khi khởi động lại. Không thể di chuyển cuộc trò chuyện nằm ngoài mọi dự án ("Chưa nhóm"); dsh luôn liệt kê chúng ở cuối.
|
|
169
202
|
- dsh không có điểm mở rộng trong menu tùy chọn hiển thị của thanh bên, nên tùy chọn dự án gần đây được thêm vào chính menu của dsh. Nếu một bản cập nhật dsh thay đổi menu đó, tùy chọn không hiện và mọi dự án vẫn hiển thị. Bộ lọc hoạt động trên các dòng dự án, nên **Trong một danh sách** không bị lọc. Hãy dùng bộ lọc với **Không gian làm việc**: trong **Cây không gian làm việc**, một thư mục cha bị ẩn cũng ẩn các dự án đang hoạt động bên trong. **Theo trạng thái** có giới hạn tương tự: dsh không có vị trí dành cho kiểu sắp xếp, nên mục này và thứ tự dòng gắn vào markup menu và danh sách của dsh.
|
|
170
203
|
- dsh cũng không có vị trí dành cho menu dòng dự án hay phần đầu Không gian làm việc. **Sao chép đường dẫn** tìm dòng dự án qua markup dòng của dsh, còn **Thu gọn tất cả dự án** được đặt vào phần đầu của dsh và đóng từng dự án đang mở bằng cùng cú nhấp như trên dòng dự án. Nếu một bản cập nhật dsh thay đổi markup đó, nhấp chuột phải sẽ hiện menu của trình duyệt và nút không hiện.
|
|
171
204
|
- dsh cũng không có điểm mở rộng trong menu dự án của cuộc trò chuyện mới, nên ô **Tìm dự án** và thứ tự A–Z gắn vào markup menu của dsh. Nếu một bản cập nhật dsh thay đổi markup đó, menu hiện đúng như dsh vẽ: theo thứ tự đã lưu và không có ô tìm kiếm. Thứ tự A–Z chỉ là cách hiển thị: nó không thay đổi thứ tự dự án đã lưu của dsh.
|
|
205
|
+
- dsh cũng không có điểm mở rộng để chọn nơi **Phiên mới** mở. **Không gian làm việc mặc định cho Phiên mới** bọc một phương thức của dsh không phải API công khai (`startSession` của dịch vụ không gian làm việc của dsh). Nếu một bản cập nhật dsh đổi tên nó, **Phiên mới** sẽ mở ở nơi dsh chọn (dự án đang mở hoặc gần nhất). Mọi lệnh gọi không chỉ định dự án đều dùng mặc định: nút trên thanh bên, phím tắt của nút, logo và cả **Mới** trên trang **Tác vụ tự động**. dsh vẫn mở cuộc trò chuyện cuối cùng khi khởi động. Thư mục chung được tạo và thêm vào dự án của bạn ở lần dùng đầu tiên; trên Windows hoặc Linux có thư mục Documents đã di chuyển, thư mục này có thể khác thư mục của dsh.
|
|
172
206
|
- dsh cũng không có điểm mở rộng cho gợi ý trong khung soạn thảo, nên văn bản của **Dự đoán tin nhắn tiếp theo** nằm đè lên văn bản giữ chỗ của chính dsh (`[data-composer-placeholder]`). Nếu một bản cập nhật dsh thay đổi markup đó, dự đoán sẽ không hiện. Khi tính năng đang bật, mỗi lượt đã xong tốn một lần gọi mô hình ngắn.
|
|
173
207
|
- **Hoàn thành khi gõ** hiện văn bản qua gợi ý khung soạn thảo của chính dsh (kiểu `--dsh-composer-hint` mà dsh dùng cho gợi ý đối số của lệnh gạch chéo). Tính năng không chạy với lệnh gạch chéo, tin nhắn có nhãn tệp hoặc nhãn ký hiệu, hoặc khi con trỏ không ở cuối tin nhắn. Nếu một bản cập nhật dsh thay đổi kiểu đó, phần hoàn thành sẽ không hiện. Mỗi lần bạn dừng gõ tốn một lần gọi mô hình.
|
|
174
208
|
- **Cải thiện prompt** chỉ thấy bản tóm tắt ngắn về dự án, các đường dẫn đã thay đổi và các đường dẫn có tên khớp với từ ngữ của bạn: không thấy chính mã nguồn. Vì vậy tính năng có thể bỏ sót đúng tệp cần dùng, và chỉ nêu những đường dẫn được cung cấp. Hãy đọc văn bản mới trước khi gửi. Tính năng không chạy với lệnh gạch chéo hoặc tin nhắn có nhãn tệp hoặc nhãn ký hiệu (văn bản mới là văn bản thuần, nên sẽ mất nhãn), và một tin nhắn có tối đa 8.000 ký tự. Hình ảnh vẫn được đính kèm: chỉ văn bản thay đổi. Mỗi lần nhấp tốn một lần gọi mô hình; một mô hình mạnh có thể mất một phút (`Esc` để hủy).
|
|
209
|
+
- **Kiểm tra mục tiêu** chỉ kiểm tra lần hoàn tất mà tác tử thực hiện trong một vòng mục tiêu tự động: lần hoàn tất mà bạn yêu cầu trong cuộc trò chuyện, `/goal` và thanh mục tiêu không được kiểm tra. Tác tử có thể tự thay đổi các bài kiểm thử hoặc các tệp của lệnh kiểm thử; bộ xác minh đọc cuộc trò chuyện và có thể thấy điều đó, nhưng có thể sai theo cả hai hướng (một kết quả "chưa xong" sai tốn thêm một vòng; một kết quả "đã xong" sai đóng mục tiêu). Bộ xác minh thấy cuộc trò chuyện và `git status`, không thấy chính mã nguồn. Một lần chạy kiểm thử chỉ được dùng lại khi bước mới nhất có thể thay đổi tệp của tác tử là lần chạy `bash` đạt của chính tác tử với đúng cùng một lệnh trong cùng thư mục; lệnh có pipe (`| tail`) hoặc `&&` không được dùng lại. Ngân sách được đo khi một lượt kết thúc, nên một lượt có thể vượt quá ngân sách. Chỉ tính các lần gọi mô hình của chính cuộc trò chuyện (không tính của các subagent). `update_goal` chờ trong khi bước kiểm tra chạy (bài kiểm thử tối đa 15 phút, bộ xác minh tối đa 3 phút). Cuộc trò chuyện tách nhánh nhận một id cuộc trò chuyện mới, nên bắt đầu mà không có lệnh kiểm thử và các giới hạn riêng của cuộc trò chuyện gốc. Mỗi lần hoàn tất đi đến bộ xác minh tốn một lần gọi mô hình.
|
|
175
210
|
- Hỗ trợ tích hợp sẵn đã được đề xuất với dự án gốc: `move` cho hàng đợi ở [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), trạng thái Tiếp tục ở [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
176
211
|
|
|
177
212
|
## Câu hỏi thường gặp
|
|
@@ -198,9 +233,29 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
198
233
|
|
|
199
234
|
**dsh có thể cải thiện prompt trước khi tôi gửi, giống nút Enhance prompt trong Roo Code hoặc Augment không?** Có, với **Cải thiện prompt** (mặc định bật): gõ một yêu cầu sơ bộ rồi nhấp vào đũa thần cạnh menu mô hình. Tính năng viết lại văn bản với cuộc trò chuyện này và dự án làm ngữ cảnh, bằng ngôn ngữ của bạn, và không gửi đi. `Cmd/Ctrl+Z` hoặc **Hoàn tác cải thiện** đưa văn bản của bạn trở lại. Chọn mô hình cho tính năng trong **Cài đặt → Composer Plus → Cải thiện prompt → Mô hình**.
|
|
200
235
|
|
|
236
|
+
**Có thể khiến tác tử thôi tự đánh dấu công việc của mình là đã xong, giống các vòng lặp xác minh trong loop engineering không?** Có, với **Kiểm tra mục tiêu** (mặc định bật): bắt đầu một mục tiêu bằng `/goal`. Khi tác tử nói mục tiêu đã hoàn tất, các bài kiểm thử của dự án chạy và một lần gọi mô hình độc lập đối chiếu mục tiêu với cuộc trò chuyện; nếu một trong hai không đạt, mục tiêu vẫn mở và tác tử đọc lý do. Đặt lệnh kiểm thử của riêng bạn, giới hạn thời gian hoặc giới hạn token bằng **Sửa** trong dòng **Kiểm tra mục tiêu** bên dưới mục tiêu.
|
|
237
|
+
|
|
201
238
|
**Làm sao để sắp xếp lại tin nhắn trong hàng đợi của dsh?** Kéo tay nắm ⠿ trên tin nhắn trong hàng đợi, hoặc đặt tiêu điểm vào tay nắm rồi nhấn `↑` / `↓`.
|
|
202
239
|
|
|
203
|
-
**Làm sao để
|
|
240
|
+
**Làm sao để sửa lỗi gõ trong một tin nhắn trong hàng đợi?** Nhấp đúp vào tin nhắn trong hàng đợi, sửa văn bản rồi nhấn `Enter` (`Esc` để hủy). Tin nhắn giữ nguyên vị trí trong hàng đợi.
|
|
241
|
+
|
|
242
|
+
**Làm sao để xóa cùng lúc mọi chấm chưa đọc của một dự án?** Thanh bên → nút **…** của dự án → **Đánh dấu tất cả là đã đọc**.
|
|
243
|
+
|
|
244
|
+
**Tôi có thể liên kết tới một tin nhắn trong cuộc trò chuyện dài không?** Có: di chuột lên tin nhắn và nhấp **🔗**. Gửi liên kết trong một cuộc trò chuyện: trên dsh 0.2.1 trở lên, nhấp vào liên kết sẽ mở cuộc trò chuyện tại tin nhắn đó.
|
|
245
|
+
|
|
246
|
+
**Tôi lỡ hoàn tác một lượt. Có lấy lại được không?** Có, bằng **Làm lại** phía trên khung soạn thảo, ngay sau khi hoàn tác: tính năng bắt đầu một cuộc trò chuyện mới từ ngay trước lúc hoàn tác với cùng các tin nhắn, và nếu đã hoàn tác bằng **Cuộc trò chuyện và tệp** thì tệp cũng được đưa trở lại.
|
|
247
|
+
|
|
248
|
+
**Cuộc trò chuyện nào đã thay đổi tệp này?** Thanh bên phải → **Thay đổi** → **…** của tệp → **Các cuộc trò chuyện đã thay đổi tệp này**. Nhấp một dòng để mở cuộc trò chuyện đó tại yêu cầu đã tạo ra thay đổi.
|
|
249
|
+
|
|
250
|
+
**Tôi có thể tìm trong một cuộc trò chuyện dài không?** Có: nhấn `Cmd+F` trên Mac (`Ctrl+F` trên Windows và Linux) trong cuộc trò chuyện. **Tìm trong cuộc trò chuyện** tô sáng mọi kết quả khớp và chuyển giữa chúng bằng `Enter` và `Shift+Enter`.
|
|
251
|
+
|
|
252
|
+
**Làm sao để chỉ xem các tệp mà một cuộc trò chuyện đã thay đổi?** Thanh bên phải → **Thay đổi** → **Cuộc trò chuyện này**. Nhấp **␣** để ẩn các thay đổi chỉ có khoảng trắng.
|
|
253
|
+
|
|
254
|
+
**Làm sao để Đánh giá tự động thôi hỏi về cùng một công cụ trong một cuộc trò chuyện?** Nhấp **Cho phép trong cuộc trò chuyện này** trên thẻ phê duyệt. Quyền này chỉ áp dụng cho đúng công cụ đó trong cuộc trò chuyện đó, mặc định trong 1 giờ; thu hồi quyền từ nhãn ở phần đầu. Đổi thời gian trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**.
|
|
255
|
+
|
|
256
|
+
**Tôi bị mất iPhone. Làm sao để chặn nó truy cập máy Mac của tôi?** Nhấp **Kết nối di động** ở góc dưới bên trái thanh bên, rồi nhấp **Remove** bên cạnh iPhone đó. Khóa của iPhone đó ngừng hoạt động ngay; nó chỉ có thể kết nối lại bằng một lần ghép nối mới mà bạn phê duyệt trên máy Mac.
|
|
257
|
+
|
|
258
|
+
**Có thể khóa Tether bằng Face ID không?** Có: trong Tether, bật "Settings → Privacy → Lock with Face ID". Sau đó, Tether yêu cầu Face ID (hoặc mật mã) khi mở và khi bạn quay lại ứng dụng.
|
|
204
259
|
|
|
205
260
|
**Làm sao để thanh bên của dsh chỉ hiện các dự án tôi dùng hôm nay?** Thanh bên → tùy chọn hiển thị (biểu tượng thanh trượt) → **Hoạt động trong 2 giờ qua**. Chọn lại tùy chọn này để hiện tất cả dự án.
|
|
206
261
|
|
|
@@ -214,6 +269,12 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
|
|
|
214
269
|
|
|
215
270
|
**Làm sao để dùng dsh từ iPhone?** Build ứng dụng Tether từ `tether/ios` (Xcode), bật **Cài đặt → Composer Plus → Kết nối di động (iPhone)**, nhấp **Kết nối di động** ở góc dưới bên trái, quét mã QR (bằng Camera của iPhone hoặc **Scan code** trong Tether), chạm vào **Connect** và nhấp **Approve**. Khi ở xa nhà, hãy dùng Tailscale trên cả hai thiết bị.
|
|
216
271
|
|
|
272
|
+
**Làm sao để Phiên mới luôn mở trong cùng một dự án?** Cài đặt → Composer Plus → **Không gian làm việc mặc định cho Phiên mới** → **Mở Phiên mới trong** → chọn dự án. Nút `+` cạnh dự án khác vẫn mở dự án đó.
|
|
273
|
+
|
|
274
|
+
**Làm sao để làm nhiều tính năng của một dự án cùng lúc, mỗi tính năng trên branch riêng?** Dùng **Branch riêng cho từng cuộc trò chuyện**: cuộc trò chuyện mới → nút ⑂ main → **Branch mới**, rồi gửi tin nhắn đầu tiên. Mỗi cuộc trò chuyện có branch và thư mục worktree riêng, kèm `.env` và `node_modules` của bạn khi `.worktreeinclude` liệt kê chúng. Phần đầu của cuộc trò chuyện cho biết bạn đang ở branch nào.
|
|
275
|
+
|
|
276
|
+
**Tôi có thể gửi ảnh từ iPhone không?** Có. Trong một cuộc trò chuyện Tether, chạm vào **+** bên cạnh ô tin nhắn → Camera, Photos (tối đa 4) hoặc Paste image. Ảnh được gửi tới cuộc trò chuyện trên Mac dưới dạng tệp đính kèm của tin nhắn, nên mô hình nhìn thấy chúng.
|
|
277
|
+
|
|
217
278
|
**Plugin có hoạt động với ứng dụng desktop không?** Có: Cài đặt → Plugin → **Thêm plugin** → `dsh-composer-plus`. Đã kiểm thử trên dsh 0.2.0-rc.2 (desktop và web) và 0.2.1-rc.2 (web).
|
|
218
279
|
|
|
219
280
|
## Phát triển
|
|
@@ -250,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
250
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
251
312
|
# Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
|
|
252
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
+
# Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
253
330
|
```
|
|
254
331
|
|
|
255
332
|
```sh
|
|
@@ -260,7 +337,7 @@ npm test
|
|
|
260
337
|
|
|
261
338
|
**Quy tắc cho tính năng mới:** mọi dòng tính năng trong Cài đặt → Composer Plus đều hiện một ảnh chụp màn hình. Thêm id của tính năng vào `SHOT_OF` trong `client.js` và vào `SHOTS` trong `index.js`, rồi đưa kèm `assets/features/<id>.webp` (chụp từ dsh demo dùng một lần, giao diện tiếng Anh, khoảng 60 kB hoặc nhỏ hơn). Thêm tính năng, với cùng hình ảnh, vào `docs/features.json` rồi chạy `npm run build:readme`: lệnh này ghi bảng tính năng của `README.md` và của từng `README.<id>.md` đã dịch, cùng danh sách trong `llms.txt`. `test/shots.test.mjs` thất bại khi một tính năng không có ảnh chụp màn hình, và `test/browser-settings-shots.mjs` kiểm tra trang Cài đặt thật. Danh sách kiểm tra đầy đủ cho mọi thay đổi nằm trong [AGENTS.md](AGENTS.md).
|
|
262
339
|
|
|
263
|
-
Các bài kiểm thử chạy `client.js` thật trên một React/DOM giả, và chạy `index.js` thật (phần Host) trên một repository git tạm thời. Kiểm thử gateway Tether (`test/tether-gateway.test.mjs`) dùng một dsh host giả và một gateway TLS thật. Ứng dụng iPhone nằm trong `tether/ios` (xem [tether/README.md](tether/README.md) và [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` kiểm tra lịch sử nhập trong trình duyệt thật, với một `dsh web` dùng một lần có `DSH_HOME` riêng.
|
|
340
|
+
Các bài kiểm thử chạy `client.js` thật trên một React/DOM giả, và chạy `index.js` thật (phần Host) trên một repository git tạm thời. Kiểm thử gateway Tether (`test/tether-gateway.test.mjs`) dùng một dsh host giả và một gateway TLS thật. Ứng dụng iPhone nằm trong `tether/ios` (xem [tether/README.md](tether/README.md) và [tether/AGENTS.md](tether/AGENTS.md)). [docs/ROUTES.md](docs/ROUTES.md) liệt kê từng route của Host, yêu cầu của route đó và Tether có thể gọi route đó hay không. `node test/browser-history.mjs '<dsh web URL with ?token=…>'` kiểm tra lịch sử nhập trong trình duyệt thật, với một `dsh web` dùng một lần có `DSH_HOME` riêng.
|
|
264
341
|
|
|
265
342
|
Gói ngôn ngữ là các tệp JSON chỉ chứa dữ liệu trong `locales/<id>.json`, được nhúng vào tệp client duy nhất bằng `npm run build:locales` (không dùng dịch vụ dịch thuật và không tải về lúc chạy). `npm test` kiểm tra mọi gói: đủ toàn bộ khóa, placeholder và ngắt dòng giống hệt bản gốc, và hành vi ngôn ngữ hệ thống/ghi đè. Để kiểm tra trên ứng dụng thật trong môi trường cô lập, với Playwright đã cài cục bộ:
|
|
266
343
|
|