@ran-sh/dsh-crew 0.3.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.
Files changed (85) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +8 -0
  3. package/.mcp.json +8 -0
  4. package/LICENSE +21 -0
  5. package/README.de.md +359 -0
  6. package/README.es.md +359 -0
  7. package/README.fr.md +359 -0
  8. package/README.hi.md +359 -0
  9. package/README.id.md +359 -0
  10. package/README.ja.md +359 -0
  11. package/README.ko.md +359 -0
  12. package/README.md +360 -0
  13. package/README.pt.md +359 -0
  14. package/README.ru.md +359 -0
  15. package/README.th.md +359 -0
  16. package/README.tr.md +359 -0
  17. package/README.vi.md +359 -0
  18. package/README.zh-TW.md +359 -0
  19. package/README.zh.md +305 -0
  20. package/agents/ds-flash.md +26 -0
  21. package/agents/ds-pro.md +32 -0
  22. package/agents/ds-reviewer.md +23 -0
  23. package/agents/ds-worker.md +22 -0
  24. package/codex/agents/ds-flash.toml +30 -0
  25. package/codex/agents/ds-pro.toml +31 -0
  26. package/codex/agents/ds-reviewer.toml +28 -0
  27. package/codex/agents/ds-worker.toml +28 -0
  28. package/codex/prompts/dsh-config.md +3 -0
  29. package/codex/prompts/dsh-status.md +1 -0
  30. package/commands/config.md +11 -0
  31. package/commands/off.md +5 -0
  32. package/commands/on.md +5 -0
  33. package/commands/status.md +5 -0
  34. package/cordis.patch.yml +4 -0
  35. package/docs/images/dsh-crew-host.png +0 -0
  36. package/docs/images/dsh-crew-jobs.png +0 -0
  37. package/docs/images/dsh-crew-logo.png +0 -0
  38. package/docs/images/dsh-crew-overview.png +0 -0
  39. package/lib/client.js +2765 -0
  40. package/package.json +125 -0
  41. package/scripts/build-client.mjs +28 -0
  42. package/scripts/live-crew-smoke.mjs +39 -0
  43. package/scripts/live-policy-matrix.mjs +177 -0
  44. package/scripts/policy-probe.mjs +101 -0
  45. package/scripts/setup.mjs +294 -0
  46. package/scripts/smoke-real.mjs +110 -0
  47. package/scripts/smoke.mjs +78 -0
  48. package/scripts/verify-installer-fix.mjs +26 -0
  49. package/src/adaptive-routing.mjs +260 -0
  50. package/src/client/activation-summary.tsx +64 -0
  51. package/src/client/entry.tsx +236 -0
  52. package/src/client/index.tsx +1120 -0
  53. package/src/config-readiness.mjs +59 -0
  54. package/src/delivery.mjs +205 -0
  55. package/src/dsh-cli-runtime.mjs +251 -0
  56. package/src/failure-classification.mjs +172 -0
  57. package/src/hub/entry.mjs +98 -0
  58. package/src/hub/index.mjs +757 -0
  59. package/src/hub-client.mjs +132 -0
  60. package/src/hub-compatibility.mjs +49 -0
  61. package/src/i18n.mjs +19 -0
  62. package/src/install/cli.mjs +28 -0
  63. package/src/install/install-legacy.mjs +460 -0
  64. package/src/install/install.mjs +451 -0
  65. package/src/jobs.mjs +275 -0
  66. package/src/mcp-runtime.mjs +257 -0
  67. package/src/model-catalog.mjs +173 -0
  68. package/src/model-routing.mjs +391 -0
  69. package/src/multimodal.mjs +0 -0
  70. package/src/policy-legacy.mjs +830 -0
  71. package/src/policy.mjs +197 -0
  72. package/src/readiness-matrix.mjs +169 -0
  73. package/src/runtime-controls.mjs +90 -0
  74. package/src/runtime-identity.mjs +108 -0
  75. package/src/server.mjs +477 -0
  76. package/src/status-shard.mjs +52 -0
  77. package/src/structured-error-code.mjs +39 -0
  78. package/src/vision-route.mjs +138 -0
  79. package/src/workflow-runtime.mjs +567 -0
  80. package/src/workflow.mjs +160 -0
  81. package/src/workspace-audit.mjs +231 -0
  82. package/src/workspace-isolation.mjs +306 -0
  83. package/statusline/statusline.sh +14 -0
  84. package/statusline/worker-segment.sh +35 -0
  85. package/worker.cordis.yml +77 -0
package/README.vi.md ADDED
@@ -0,0 +1,359 @@
1
+ <p align="center">
2
+ <img src="./docs/images/dsh-crew-logo.png" alt="DSH Crew" width="120" />
3
+ </p>
4
+
5
+ <h1 align="center">DSH Crew</h1>
6
+
7
+ <p align="center">
8
+ <strong>Một plugin của <a href="https://github.com/deepseek-ai/deepseek-harness">DeepSeek Harness</a>: điều phối công việc tới các DSH agent từ Claude Code / Codex mà không phải từ bỏ UI subagent gốc của host.</strong><br />
9
+ <sub>UI Tiến trình Gốc &bull; Chính sách Tier &amp; Nâng cấp &bull; Phiên DSH Trong Host &bull; Vision &amp; Tạo ảnh &bull; Cài đặt Một Cú Nhấp</sub>
10
+ </p>
11
+
12
+ <p align="center">
13
+ <sub>GitHub: <code>Ran-sh/dsh-crew</code> &middot; Phiên bản plugin hiện tại: <code>0.1.0-rc.1</code> &middot; Đã kiểm thử với DSH <code>0.1.0-rc.6</code></sub>
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="./README.md">English</a> &middot; <a href="./README.zh.md">简体中文</a> &middot; <a href="./README.zh-TW.md">繁體中文</a> &middot; <a href="./README.ja.md">日本語</a> &middot; <a href="./README.ko.md">한국어</a> &middot; <a href="./README.fr.md">Français</a> &middot; <a href="./README.es.md">Español</a> &middot; <a href="./README.de.md">Deutsch</a> &middot; <a href="./README.pt.md">Português</a> &middot; <a href="./README.ru.md">Русский</a> &middot; <a href="./README.hi.md">हिन्दी</a> &middot; <a href="./README.tr.md">Türkçe</a> &middot; <a href="./README.th.md">ไทย</a> &middot; <a href="./README.vi.md"><b>Tiếng Việt</b></a> &middot; <a href="./README.id.md">Bahasa Indonesia</a>
18
+ </p>
19
+
20
+ <p align="center">
21
+ <a href="https://github.com/Ran-sh/dsh-crew/blob/main/LICENSE"><img src="https://img.shields.io/github/license/Ran-sh/dsh-crew?color=64748b" alt="License" /></a>
22
+ </p>
23
+
24
+ <br />
25
+
26
+ <p align="center">
27
+ <img src="./docs/images/dsh-crew-overview.png" alt="DSH Crew — settings page" width="100%" />
28
+ </p>
29
+ <p align="center"><sub>Trang cài đặt DSH Crew — tích hợp host, chính sách điều phối, thực thi và cầu nối đa phương thức</sub></p>
30
+
31
+ ## Vì sao dùng DSH Crew
32
+
33
+ DSH Crew là một plugin cho [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH) — một agent harness mã nguồn mở. Nó giúp các DSH agent có thể được điều phối từ Claude Code và Codex: orchestrator giữ model của riêng mình, công việc chạy trên một DSH agent thật với công cụ, sandbox, presets và lịch sử phiên của harness đó, và host vẫn hiển thị nó như một subagent gốc với tiến trình trực tiếp.
34
+
35
+ Thứ chạy công việc là một DSH agent, không phải một lời gọi model thuần túy. Tier (`flash` / `pro`) chọn mức năng lực mà agent đó nhận được từ roster model đã cấu hình của harness — hiện là DeepSeek V4 Flash và V4 Pro — nên việc đổi model trong DSH không cần thay đổi gì ở đây.
36
+
37
+ <table>
38
+ <tr>
39
+ <td width="50%">
40
+
41
+ ### 🧵 UI Tiến trình Gốc
42
+
43
+ Workers xuất hiện như các subagent thông thường trong Claude Code / Codex — số lần điều phối, bước đang chạy, lời gọi tool và lượng token sử dụng đều hiển thị trong panel tác vụ của chính host, cộng thêm một segment statusline của claude-hud: `⚙dsh 1▶pro 2m14s 21.7k/606 ✓3`.
44
+
45
+ </td>
46
+ <td width="50%">
47
+
48
+ ### 🎚️ Chính sách Tier và Nâng cấp
49
+
50
+ `flash` cho công việc máy móc, `pro` cho suy luận, `effort` từ `off` đến `max`. `tier_policy` có thể kẹp mọi lần điều phối vào một tier duy nhất ở tầng công cụ, và `escalate_on_failure` thử lại một lần chạy flash thất bại trên pro — dựa trên bằng chứng, không phải đoán trước độ khó.
51
+
52
+ </td>
53
+ </tr>
54
+ <tr>
55
+ <td width="50%">
56
+
57
+ ### 🏛️ Phiên DSH Trong Host
58
+
59
+ Với bundle được cài trong một DSH profile, mỗi worker là một phiên DSH first-class: hiển thị trong Web UI, được nhóm theo thư mục làm việc, gắn preset Agent mà bạn chọn theo từng tier. Khi DSH không chạy, việc điều phối rơi về một DSH runtime standalone, nên CI và môi trường headless vẫn hoạt động.
60
+
61
+ </td>
62
+ <td width="50%">
63
+
64
+ ### 👁️ Vision và Tạo ảnh
65
+
66
+ Các model của DSH chỉ xử lý văn bản. `describe_image` và `generate_image` mượn mắt và cọ vẽ của những CLI bạn đã có — Claude, Codex, Grok, Antigravity — hoặc của bất kỳ API tương thích OpenAI nào bạn cấu hình. Ảnh được dán vẫn hiển thị trong hội thoại và đến được model dưới dạng văn bản.
67
+
68
+ </td>
69
+ </tr>
70
+ <tr>
71
+ <td width="50%">
72
+
73
+ ### 🔌 Provider Tùy chỉnh
74
+
75
+ Mang endpoint của riêng bạn (Base URL + API key + models) hoặc một template lệnh cục bộ. Mỗi provider có một bài kiểm tra kết nối kiểm tra khả năng truy cập và xác thực, sau đó thực hiện một lời gọi vision thật để bạn phát hiện ngay bây giờ, không phải giữa chừng tác vụ.
76
+
77
+ </td>
78
+ <td width="50%">
79
+
80
+ ### 📦 Cài đặt Một Cú Nhấp
81
+
82
+ Trang cài đặt cài và cập nhật plugin Claude Code cùng các role file Codex cho bạn — đăng ký marketplace, allowlist quyền MCP tool, nối dây HUD, đường dẫn tuyệt đối được render cho máy này — và khôi phục chúng dễ dàng như vậy. Mọi tệp cài đặt đều được sao lưu trước.
83
+
84
+ </td>
85
+ </tr>
86
+ </table>
87
+
88
+ ## Cách hoạt động
89
+
90
+ ```
91
+ Claude Code / Codex (orchestrator, keeps its own model)
92
+ └─ ds-flash / ds-pro ← native subagent shell (progress shows in the host's task UI)
93
+ └─ MCP: dsh_run_worker(tier, effort, cwd)
94
+ ├─ hub reachable → session inside DSH (visible in the Web UI, grouped by cwd)
95
+ └─ otherwise → dsh-jsonrpc-agent runtime (worker.cordis.yml)
96
+ └─ DeepSeek V4 Flash / Pro (DSH SDK, event stream → progress and token stats)
97
+ ```
98
+
99
+ ## Một lần chạy, hai góc nhìn
100
+
101
+ Việc dispatch có thể trải rộng. Bên dưới, mười tám worker dịch song song tài liệu README này: host đếm chúng như subagent của chính nó, còn harness chạy chúng như những phiên thực sự.
102
+
103
+ <p align="center">
104
+ <img src="./docs/images/dsh-crew-host.png" alt="Claude Code" width="100%" />
105
+ </p>
106
+ <p align="center"><sub>Trong Claude Code, worker của dsh-crew hiện ra như subagent gốc; đoạn statusline theo dõi tier đang chạy, thời gian trôi qua và token.</sub></p>
107
+
108
+ <p align="center">
109
+ <img src="./docs/images/dsh-crew-jobs.png" alt="DSH Crew" width="100%" />
110
+ </p>
111
+ <p align="center"><sub>Bảng DSH Crew nhìn cùng lần chạy đó từ phía harness: host nào đã gửi mỗi job, tier và effort của nó, tiến độ trực tiếp và lượng token.</sub></p>
112
+
113
+ ## Cài đặt
114
+
115
+ Cài từ GitHub vào một profile DSH:
116
+
117
+ ```bash
118
+ node scripts/setup.mjs install # Safe install: see the canonical Install section of README.md (dedicated Crew home/profile; official web profile is never modified).
119
+ Repository source: github:Ran-sh/dsh-crew
120
+ npx -y @deepseek-ai/dsh web
121
+ ```
122
+
123
+ Hoặc, để phát triển cục bộ ngay từ mã nguồn:
124
+
125
+ ```bash
126
+ node scripts/setup.mjs install # Safe install: see the canonical Install section of README.md (dedicated Crew home/profile; official web profile is never modified).
127
+ Repository source: github:Ran-sh/dsh-crew
128
+ npx -y @deepseek-ai/dsh web
129
+ ```
130
+
131
+ Giao thức `link:` tạo symlink phụ thuộc của profile tới kho này, nên mỗi lần build lại đều thấy ngay.
132
+
133
+ ### Cấu hình thông tin xác thực DeepSeek (chỉ standalone)
134
+
135
+ Trong hub mode — cài đặt ở trên — worker chạy bên trong instance DSH và sử dụng thông tin xác thực DeepSeek đã được cấu hình. Không cần setup thêm gì.
136
+
137
+ Chỉ fallback standalone cần key riêng: khi dispatch từ Claude Code / Codex mà không có instance DSH đang chạy, nó sẽ khởi động worker runtime như một process riêng. Lấy API key tại [platform.deepseek.com](https://platform.deepseek.com) và ghi vào `~/.config/dsh-crew/.env`:
138
+
139
+ ```
140
+ DEEPSEEK_API_KEY=sk-...
141
+ ```
142
+
143
+ ### Kiểm tra
144
+
145
+ ```bash
146
+ node scripts/smoke.mjs
147
+ ```
148
+
149
+ Smoke test dispatch một job rẻ qua path nào khả dụng — hub khi instance DSH đang chạy, standalone nếu không — và in ra path nào được sử dụng. Trong khoảng mười giây bạn sẽ thấy `smoke test passed — configuration OK`. Nếu lỗi, lý do sẽ được in ra và giới hạn trong path được kiểm tra.
150
+
151
+ Sau đó mở Cài đặt → DSH Crew và cài tích hợp Claude Code / Codex chỉ với một cú nhấp.
152
+
153
+ ## Bối cảnh và thuật ngữ
154
+
155
+ - **DSH** (DeepSeek Harness): agent harness mã nguồn mở của DeepSeek, một code agent dưới dạng Web UI, tương tự Claude Code nhưng điều khiển các model DeepSeek.
156
+ - **MCP** (Model Context Protocol): giao thức tích hợp công cụ AI của Anthropic, cho phép LLM gọi công cụ và nguồn dữ liệu bên ngoài một cách an toàn.
157
+ - **Cordis bundle**: định dạng plugin của DSH; dự án này có thể chạy standalone như một MCP service hoặc cài vào DSH Web dưới dạng hub mode.
158
+ - **tier**: bậc năng lực — slot nào trong roster model đã cấu hình của DSH mà một worker nhận được. `flash` nhanh và rẻ (tác vụ đơn giản), `pro` suy luận sâu hơn (bài toán phức tạp). Hiện chúng ánh xạ tới DeepSeek V4 Flash và V4 Pro; đổi model trong DSH thì không có gì thay đổi ở đây.
159
+ - **worker**: DSH agent thực hiện công việc — một phiên đầy đủ với công cụ, sandbox và preset riêng, không phải một lời gọi model thuần túy.
160
+ - **effort**: cường độ suy luận, `off` = không suy luận, `high` = đầu tư suy luận cao, `max` = đầu tư suy luận tối đa.
161
+
162
+ ## Claude Code
163
+
164
+ ### Cài đặt
165
+
166
+ Cài đặt một cú nhấp (chọn một):
167
+
168
+ - **Trang cài đặt DSH** (khi hub mode được cài): Settings → DSH Crew → "Install to Claude Code"
169
+ - **Dòng lệnh**: `node src/install/cli.mjs all`
170
+
171
+ Cả hai làm cùng một việc: đăng ký marketplace cục bộ (thư mục cha `dsh-plugins/` làm marketplace root) + `claude plugin install` + allowlist quyền MCP tool + cấu hình segment trạng thái worker cho claude-hud (tự sao lưu settings.json trước khi thay đổi, idempotent). **Khởi động lại phiên sau khi cài đặt để thay đổi có hiệu lực.**
172
+
173
+ ### Sử dụng
174
+
175
+ - Trực tiếp trong hội thoại, nói "dispatch X to ds-flash" hoặc "dispatch X to ds-pro", và subagent sẽ thực hiện tác vụ
176
+ - Số lần điều phối và tiến trình thời gian thực hiển thị trong task UI của Claude Code
177
+ - **Segment statusline HUD**: `⚙dsh 1▶pro 2m14s 21.7k/606 ✓3` (tier hiện tại / thời gian trôi qua / lượng token / số hoàn thành)
178
+ - Khi phát triển cục bộ, `statusline/statusline.sh` hoặc `statusline/worker-segment.sh` có thể được tích hợp độc lập
179
+ - **Tác vụ chạy lâu**: CC có giới hạn timeout trên các lời gọi MCP (`MCP_TOOL_TIMEOUT` có thể điều chỉnh), tác vụ dài có thể để orchestrator dùng `dsh_spawn_worker` + polling `dsh_worker_result(wait_seconds)`
180
+ - **Phát triển và gỡ lỗi cục bộ**: `claude --plugin-dir /path/to/dsh-crew` để tải tạm thời
181
+
182
+
183
+ ### Lệnh phiên
184
+
185
+ Chỉ ghi đè giá trị mặc định toàn cục cho phiên hiện tại, và được thực thi ở tầng công cụ chứ không dựa vào prompt:
186
+
187
+ | Lệnh | Tác dụng |
188
+ |---|---|
189
+ | `/dsh-crew:config` | Xem hoặc đặt mặc định của phiên: `tier=flash\|pro`, `effort=off\|high\|max`, `mode=auto\|hub\|standalone`, `timeout=<giây>`, `policy=auto\|flash-only\|pro-only`, `escalate=true\|false`, `reset` |
190
+ | `/dsh-crew:on` · `/dsh-crew:off` | Bật hoặc tắt dispatch cho phiên này (tắt là công tắc cứng: công cụ sẽ từ chối) |
191
+ | `/dsh-crew:status` | Trạng thái trực tiếp của job worker: tier, tiến độ, token, công cụ hiện tại |
192
+
193
+ ## Codex
194
+
195
+ ### Cài đặt
196
+
197
+ Khuyến nghị dùng installer (tự render đường dẫn cho máy này, chép các lệnh `/dsh-config`, `/dsh-status`):
198
+
199
+ ```bash
200
+ node src/install/cli.mjs codex
201
+ ```
202
+
203
+ Hoặc chép tay (cần sửa đường dẫn thủ công sau khi chép):
204
+
205
+ ```bash
206
+ cp codex/agents/*.toml ~/.codex/agents/ # global or project-level .codex/agents/
207
+ ```
208
+
209
+ Các role file được cấu hình sẵn với:
210
+
211
+ - Cấu hình mount MCP server
212
+ - `default_tools_approval_mode = "approve"` (**bắt buộc**, nếu không các lời gọi tool sẽ bị tự động hủy trong chế độ exec)
213
+ - `tool_timeout_sec = 3600`
214
+
215
+ **Lưu ý**: Khi chép tay, các đường dẫn tuyệt đối trong trường `args` phải được cập nhật cho khớp vị trí cài đặt thực tế; installer xử lý việc này tự động.
216
+
217
+ ### Sử dụng
218
+
219
+ - Trong TUI tương tác, chọn "spawn ds-pro to ..." để điều phối tác vụ; các panel Active/Done hiển thị tiến trình
220
+ - Chế độ `codex exec` cũng có thể gọi trực tiếp `dsh_run_worker`
221
+
222
+
223
+ ### Lệnh phiên
224
+
225
+ Phía Codex cài đúng hai prompt tương ứng:
226
+
227
+ | Lệnh | Tác dụng |
228
+ |---|---|
229
+ | `/dsh-config` | Xem hoặc đặt mặc định của phiên: `tier=flash\|pro`, `effort=off\|high\|max`, `mode=auto\|hub\|standalone`, `timeout=<giây>`, `policy=auto\|flash-only\|pro-only`, `escalate=true\|false`, `reset` |
230
+ | `/dsh-status` | Trạng thái trực tiếp của job worker: tier, tiến độ, token, công cụ hiện tại |
231
+
232
+ ## Công cụ MCP
233
+
234
+ | Công cụ | Mô tả |
235
+ |---|---|
236
+ | `dsh_run_worker` | Điều phối tác vụ đồng bộ (`tier`: flash/pro, `effort`: off/high/max, `cwd`), chờ kết quả |
237
+ | `dsh_spawn_worker` | Điều phối tác vụ bất đồng bộ, trả về job id (cho fan-out song song) |
238
+ | `dsh_worker_status` | Truy vấn tiến trình thời gian thực của mọi job (turn/bước/công cụ hiện tại/token) |
239
+ | `dsh_worker_result` | Lấy kết quả, có thể chỉ định `wait_seconds` để chờ |
240
+ | `dsh_worker_cancel` | Hủy job được chỉ định, chấm dứt process runtime của nó |
241
+
242
+ Tiến trình đồng thời được phản chiếu vào `~/.config/dsh-crew/status.d/` (một tệp shard cho mỗi writer, có thể được đọc bởi statusline / giám sát bên ngoài).
243
+
244
+ ## Đa phương thức: vision và tạo ảnh
245
+
246
+ **DeepSeek là model chỉ xử lý văn bản** và không hỗ trợ nhập ảnh hay tạo ảnh. Plugin này lấy các khả năng đó từ bên ngoài thông qua các MCP tool:
247
+
248
+ | Công cụ | Mô tả |
249
+ |---|---|
250
+ | `describe_image` | Trả lời câu hỏi bằng cách xem ảnh (ảnh chụp màn hình, thiết kế, biểu đồ, v.v.), kết quả được cache theo provider + model + ảnh + câu hỏi |
251
+ | `generate_image` | Tạo ảnh từ mô tả văn bản, lưu vào đường dẫn tuyệt đối được chỉ định; đầu ra là bitmap phẳng (cần OpenPencil để chỉnh sửa layer) |
252
+
253
+ **Dán ảnh trong phiên**: Trong DSH, chuyển model sang `DeepSeek (vision) ◉` để dán ảnh trực tiếp. Ảnh ở lại trong phiên và hiển thị bình thường; plugin nối văn bản được nhận dạng vào sau ảnh và gỡ ảnh trước khi gửi — bạn thấy ảnh, model đọc văn bản.
254
+
255
+ ### Cấu hình
256
+
257
+ Trong **trang cài đặt DSH → DSH Crew → Multimodal** (hoặc sửa trực tiếp `~/.config/dsh-crew/config.json`):
258
+
259
+ **Vision provider** (xem ảnh):
260
+
261
+ - `claude-code` (mặc định, dùng haiku, chi phí thấp)
262
+ - `codex` (dùng GPT, có thể chỉ định model cụ thể)
263
+ - `grok` (dùng Grok)
264
+ - `agy` (Antigravity)
265
+ - `custom` (API tương thích OpenAI hoặc lệnh cục bộ)
266
+ - `off` (tắt)
267
+
268
+ **Image generation provider** (tạo ảnh):
269
+
270
+ - `codex` (`$imagegen`, gpt-image-2)
271
+ - `agy` (Nano Banana)
272
+ - `grok` (Imagine)
273
+ - `custom` (API tương thích OpenAI hoặc lệnh cục bộ)
274
+ - `off` (tắt)
275
+
276
+ ### Provider tùy chỉnh
277
+
278
+ Hai cách tích hợp:
279
+
280
+ **API**: Bất kỳ endpoint tương thích OpenAI nào
281
+ - Điền Base URL, API Key, danh sách model
282
+ - Vision dùng `/chat/completions` với ảnh base64 inline
283
+ - Tạo ảnh dùng `/images/generations`
284
+ - **Phải chỉ định "image generation model" để có khả năng tạo ảnh**, nếu không provider chỉ xuất hiện trong lựa chọn vision
285
+
286
+ **CLI**: Template lệnh cục bộ, placeholder được thay bằng tham chiếu an toàn
287
+ - Vision: `{image} {question} {model}` → stdout là câu trả lời
288
+ - Tạo ảnh: `{prompt} {output} {size}` → lệnh phải ghi tệp vào `{output}`
289
+ - Điền ít nhất một lệnh; lệnh nào được điền sẽ quyết định khả năng
290
+
291
+ **Kiểm tra kết nối**: Mỗi provider tùy chỉnh có một nút kiểm tra
292
+ - API: Kiểm tra khả năng truy cập endpoint, xác thực, gửi yêu cầu vision thật để xác minh
293
+ - CLI: Kiểm tra tệp thực thi, chạy lệnh thật để xác minh
294
+ - Tạo ảnh: Chỉ xác thực cấu hình, không xuất ảnh thật
295
+
296
+ **CLI thuê bao được mượn** (claude / codex / grok / agy) yêu cầu bạn đăng nhập cục bộ; plugin sẽ không bỏ qua quyền của chúng thay bạn.
297
+
298
+ ## Hub mode
299
+
300
+ Gói này cũng là một DSH bundle hợp lệ (`dsh.bundle` + `cordis.patch.yml`). Sau khi cài vào DSH Web profile bằng `dsh plugin add dsh-crew`:
301
+
302
+ - **Các phiên worker trở thành công dân hạng nhất**: chạy như các phiên first-class trong DSH host (`agents.create` + waterfall model/effort theo từng phiên + preset mặc định), xuất hiện trong danh sách phiên của Web UI, có thể mở bất cứ lúc nào để xem toàn bộ quá trình thực thi
303
+ - **Sắp xếp theo thư mục làm việc**: quản lý các phiên worker theo cwd trong Web UI
304
+ - **Loopback API**:
305
+ - `POST/GET /_dsh/dsh-crew/jobs`: tạo tác vụ, liệt kê, long-poll kết quả, hủy
306
+ - `GET /_dsh/dsh-crew/ping`: kiểm tra sức khỏe (MCP shim dùng nó để phát hiện hub có đang chạy không)
307
+ - `POST /_dsh/dsh-crew/install`: cài đặt tích hợp Claude Code / Codex một cú nhấp (backend của `src/install/`)
308
+ - **Tự động phát hiện**: MCP shim của CC/Codex tự động phát hiện hub (biến env `DSH_CREW_HUB`, mặc định `http://127.0.0.1:3080`)
309
+ - DSH Web đang chạy → job vào hub mode (`mode: "hub"`)
310
+ - Không chạy → rơi về standalone runtime
311
+
312
+ ## Lựa chọn giải pháp và giới hạn
313
+
314
+ ### Người dùng thuê bao → phương án shell subagent (khuyến nghị)
315
+
316
+ - **Hiện trạng**: shell subagent của Claude Code dùng haiku làm trung gian; mỗi lần điều phối tốn thêm hàng trăm đến hàng nghìn token
317
+ - **Đánh đổi**: Dùng một lượng nhỏ token Anthropic để đổi lấy task UI gốc, hiển thị tiến trình thời gian thực, không cần cấu hình thêm
318
+ - **Khuyến nghị**: Nếu bạn đã đăng ký Claude Pro hoặc dùng Claude Code, hãy dùng phương án này — tiện lợi và minh bạch
319
+
320
+ ### Môi trường trả theo lượt dùng / CI → phương án router trực tiếp
321
+
322
+ - **Hiện trạng**: frontmatter của Claude Code subagent không hỗ trợ kết nối trực tiếp model bên thứ ba; thử nghiệm router của repo này trong scratchpad cần credential API-key cho Claude Code, nhưng OAuth thuê bao bị Anthropic chặn ở upstream với lỗi 403
323
+ - **Khuyến nghị**:
324
+ - Nếu dùng credential API-key (không phải OAuth) và muốn tiết kiệm token Anthropic, có thể chạy router cục bộ để kết nối trực tiếp DeepSeek
325
+ - Môi trường CI thường cũng dùng API key; phương án này tiết kiệm hơn (toàn bộ token là DeepSeek)
326
+ - Cần tự kiểm thử tích hợp router (không được hỗ trợ chính thức)
327
+
328
+ ### Đang chạy DSH Web → hub mode tự bật
329
+
330
+ - **Hiện trạng**: Nếu `dsh plugin add dsh-crew` được cài vào DSH Web profile, các job chạy như phiên first-class trong host, xuất hiện trong danh sách phiên của Web UI
331
+ - **Khuyến nghị**: Trong các vòng lặp phát triển cục bộ, khuyến nghị bật hub mode; tiến trình worker có thể được quan sát đầy đủ trong Web UI; với cộng tác liên máy hoặc môi trường không có Web UI, dùng phương án shell của Claude Code / Codex
332
+
333
+ ### Các mục đã biết
334
+
335
+ - Codex role về lý thuyết có thể thử `model_provider` trỏ thẳng tới DeepSeek (chưa xác minh); cầu nối này không phụ thuộc vào điều đó
336
+ - Đầu ra tạo ảnh là bitmap phẳng; chỉnh sửa layer cần OpenPencil
337
+ - **Runtime dependencies**: Chỉ có `@modelcontextprotocol/sdk` và `zod`; `@deepseek-ai/*` là peerDependencies (do DSH host cung cấp)
338
+ - **Codex phải cấu hình**: `default_tools_approval_mode = "approve"`, nếu không các lời gọi tool sẽ bị tự động hủy
339
+
340
+ ## Phát triển
341
+
342
+ ```bash
343
+ pnpm install
344
+ node_modules/.bin/tsdown src/client/index.tsx --format cjs --platform browser \
345
+ --target es2022 --tsconfig tsconfig.client.json --out-dir .client-build --clean
346
+ node scripts/build-client.mjs # wraps the bundle for the DSH module loader
347
+ node scripts/smoke.mjs # dispatches one real flash task end to end
348
+ ```
349
+
350
+ Runtime dependencies chỉ có `@modelcontextprotocol/sdk` và `zod`; mọi gói `@deepseek-ai/*` là peer dependency do DSH host cung cấp, giúp plugin nằm trong module realm duy nhất của host.
351
+
352
+ ## Hệ sinh thái
353
+
354
+ - [DSH Noema](https://github.com/ZSeven-W/dsh-noema) — bộ nhớ dài hạn cho DSH
355
+ - [DSH OpenPencil](https://github.com/ZSeven-W/dsh-openpencil) — kiểm tra và chỉnh sửa tài liệu thiết kế `.op` ngay trong hội thoại
356
+
357
+ ## Giấy phép
358
+
359
+ MIT