dsh-cliworker-now 0.0.0-stage → 0.7.7
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/LICENSE +21 -0
- package/README.en.md +364 -0
- package/README.md +368 -2
- package/cordis.patch.yml +3 -0
- package/lib/account-models.mjs +262 -0
- package/lib/client.js +22139 -0
- package/lib/client.js.map +1 -0
- package/lib/grok-catalog.mjs +145 -0
- package/lib/hermes-native-entry.py +96 -0
- package/lib/hermes-nous-refresh.py +331 -0
- package/lib/index.js +14544 -0
- package/lib/index.js.map +1 -0
- package/lib/native-launch.mjs +234 -0
- package/lib/native-spawn.mjs +32 -0
- package/lib/own-account-lease.mjs +105 -0
- package/lib/pi-installation.mjs +87 -0
- package/lib/pi-login.mjs +80 -0
- package/lib/pi-native-catalog.mjs +417 -0
- package/lib/pi-omp-bridge.mjs +602 -0
- package/lib/pi-omp-environment.mjs +15 -0
- package/lib/pi-omp-refresh.mjs +324 -0
- package/lib/private-launch.mjs +23 -0
- package/lib/terminal-bridge.mjs +18 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +1430 -0
- package/lib/typert.remote-client.d.ts +72 -0
- package/lib/typert.remote-client.d.ts.map +1 -0
- package/lib/typert.remote-client.js +1256 -0
- package/lib/types/client/account-query-queue.d.ts +16 -0
- package/lib/types/client/account-query-queue.js +61 -0
- package/lib/types/client/account-query-queue.js.map +1 -0
- package/lib/types/client/account-terminal-css.d.ts +1 -0
- package/lib/types/client/account-terminal-css.js +3 -0
- package/lib/types/client/account-terminal-css.js.map +1 -0
- package/lib/types/client/account-terminal.d.ts +17 -0
- package/lib/types/client/account-terminal.js +525 -0
- package/lib/types/client/account-terminal.js.map +1 -0
- package/lib/types/client/assets/antigravity.png +0 -0
- package/lib/types/client/assets/claude-code.png +0 -0
- package/lib/types/client/assets/cliworker-now-logo.png +0 -0
- package/lib/types/client/assets/codex.png +0 -0
- package/lib/types/client/assets/grok.png +0 -0
- package/lib/types/client/assets/hermes.png +0 -0
- package/lib/types/client/assets/kimi-dark.png +0 -0
- package/lib/types/client/assets/kimi-light.png +0 -0
- package/lib/types/client/assets/mimo-code.png +0 -0
- package/lib/types/client/assets/omp.png +0 -0
- package/lib/types/client/assets/opencode.png +0 -0
- package/lib/types/client/assets/pi.png +0 -0
- package/lib/types/client/assets/zcode.png +0 -0
- package/lib/types/client/composer-keymap.d.ts +18 -0
- package/lib/types/client/composer-keymap.js +49 -0
- package/lib/types/client/composer-keymap.js.map +1 -0
- package/lib/types/client/conversation-timeline.d.ts +6 -0
- package/lib/types/client/conversation-timeline.js +65 -0
- package/lib/types/client/conversation-timeline.js.map +1 -0
- package/lib/types/client/copy-text.d.ts +5 -0
- package/lib/types/client/copy-text.js +45 -0
- package/lib/types/client/copy-text.js.map +1 -0
- package/lib/types/client/icons.d.ts +21 -0
- package/lib/types/client/icons.js +68 -0
- package/lib/types/client/icons.js.map +1 -0
- package/lib/types/client/index.d.ts +3 -0
- package/lib/types/client/index.js +124 -0
- package/lib/types/client/index.js.map +1 -0
- package/lib/types/client/management-styles.d.ts +1 -0
- package/lib/types/client/management-styles.js +17 -0
- package/lib/types/client/management-styles.js.map +1 -0
- package/lib/types/client/name-copy.d.ts +5 -0
- package/lib/types/client/name-copy.js +107 -0
- package/lib/types/client/name-copy.js.map +1 -0
- package/lib/types/client/native-job-overlay.d.ts +11 -0
- package/lib/types/client/native-job-overlay.js +129 -0
- package/lib/types/client/native-job-overlay.js.map +1 -0
- package/lib/types/client/operation-error.d.ts +2 -0
- package/lib/types/client/operation-error.js +12 -0
- package/lib/types/client/operation-error.js.map +1 -0
- package/lib/types/client/panel.d.ts +8 -0
- package/lib/types/client/panel.js +310 -0
- package/lib/types/client/panel.js.map +1 -0
- package/lib/types/client/rename-copy-styles.d.ts +1 -0
- package/lib/types/client/rename-copy-styles.js +21 -0
- package/lib/types/client/rename-copy-styles.js.map +1 -0
- package/lib/types/client/rename-worker.d.ts +9 -0
- package/lib/types/client/rename-worker.js +53 -0
- package/lib/types/client/rename-worker.js.map +1 -0
- package/lib/types/client/role-presets.d.ts +6 -0
- package/lib/types/client/role-presets.js +111 -0
- package/lib/types/client/role-presets.js.map +1 -0
- package/lib/types/client/settings-dialog.d.ts +13 -0
- package/lib/types/client/settings-dialog.js +442 -0
- package/lib/types/client/settings-dialog.js.map +1 -0
- package/lib/types/client/stat-popover.d.ts +10 -0
- package/lib/types/client/stat-popover.js +32 -0
- package/lib/types/client/stat-popover.js.map +1 -0
- package/lib/types/client/styles.d.ts +9 -0
- package/lib/types/client/styles.js +221 -0
- package/lib/types/client/styles.js.map +1 -0
- package/lib/types/client/telemetry.d.ts +11 -0
- package/lib/types/client/telemetry.js +24 -0
- package/lib/types/client/telemetry.js.map +1 -0
- package/lib/types/client/worker-card.d.ts +10 -0
- package/lib/types/client/worker-card.js +75 -0
- package/lib/types/client/worker-card.js.map +1 -0
- package/lib/types/client/worker-model-menu.d.ts +9 -0
- package/lib/types/client/worker-model-menu.js +136 -0
- package/lib/types/client/worker-model-menu.js.map +1 -0
- package/lib/types/client/workers.d.ts +21 -0
- package/lib/types/client/workers.js +59 -0
- package/lib/types/client/workers.js.map +1 -0
- package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
- package/lib/types/client/zcode-login-link-provider.js +105 -0
- package/lib/types/client/zcode-login-link-provider.js.map +1 -0
- package/lib/types/client/zcode-login-link.d.ts +16 -0
- package/lib/types/client/zcode-login-link.js +194 -0
- package/lib/types/client/zcode-login-link.js.map +1 -0
- package/lib/types/host/account-identity.d.ts +16 -0
- package/lib/types/host/account-identity.js +126 -0
- package/lib/types/host/account-identity.js.map +1 -0
- package/lib/types/host/account-login.d.ts +10 -0
- package/lib/types/host/account-login.js +126 -0
- package/lib/types/host/account-login.js.map +1 -0
- package/lib/types/host/account-models.d.mts +21 -0
- package/lib/types/host/account-models.mjs +262 -0
- package/lib/types/host/accounts.d.ts +42 -0
- package/lib/types/host/accounts.js +945 -0
- package/lib/types/host/accounts.js.map +1 -0
- package/lib/types/host/adapters.d.ts +24 -0
- package/lib/types/host/adapters.js +380 -0
- package/lib/types/host/adapters.js.map +1 -0
- package/lib/types/host/agy-context.d.ts +8 -0
- package/lib/types/host/agy-context.js +122 -0
- package/lib/types/host/agy-context.js.map +1 -0
- package/lib/types/host/agy-models.d.ts +5 -0
- package/lib/types/host/agy-models.js +37 -0
- package/lib/types/host/agy-models.js.map +1 -0
- package/lib/types/host/agy-windows-account.d.ts +14 -0
- package/lib/types/host/agy-windows-account.js +104 -0
- package/lib/types/host/agy-windows-account.js.map +1 -0
- package/lib/types/host/authorized-catalog.d.ts +14 -0
- package/lib/types/host/authorized-catalog.js +35 -0
- package/lib/types/host/authorized-catalog.js.map +1 -0
- package/lib/types/host/bridge-protocol.d.ts +15 -0
- package/lib/types/host/bridge-protocol.js +80 -0
- package/lib/types/host/bridge-protocol.js.map +1 -0
- package/lib/types/host/claude-native-oauth.d.ts +17 -0
- package/lib/types/host/claude-native-oauth.js +272 -0
- package/lib/types/host/claude-native-oauth.js.map +1 -0
- package/lib/types/host/claude-own-route.d.ts +33 -0
- package/lib/types/host/claude-own-route.js +250 -0
- package/lib/types/host/claude-own-route.js.map +1 -0
- package/lib/types/host/cli-account-binding.d.ts +33 -0
- package/lib/types/host/cli-account-binding.js +540 -0
- package/lib/types/host/cli-account-binding.js.map +1 -0
- package/lib/types/host/cli-protocol.d.ts +27 -0
- package/lib/types/host/cli-protocol.js +212 -0
- package/lib/types/host/cli-protocol.js.map +1 -0
- package/lib/types/host/codex-account.d.ts +8 -0
- package/lib/types/host/codex-account.js +143 -0
- package/lib/types/host/codex-account.js.map +1 -0
- package/lib/types/host/codex-models.d.ts +6 -0
- package/lib/types/host/codex-models.js +169 -0
- package/lib/types/host/codex-models.js.map +1 -0
- package/lib/types/host/extended-adapters.d.ts +44 -0
- package/lib/types/host/extended-adapters.js +207 -0
- package/lib/types/host/extended-adapters.js.map +1 -0
- package/lib/types/host/first-party-account-context.d.ts +26 -0
- package/lib/types/host/first-party-account-context.js +55 -0
- package/lib/types/host/first-party-account-context.js.map +1 -0
- package/lib/types/host/first-party-models.d.ts +29 -0
- package/lib/types/host/first-party-models.js +459 -0
- package/lib/types/host/first-party-models.js.map +1 -0
- package/lib/types/host/grok-adapter.d.ts +44 -0
- package/lib/types/host/grok-adapter.js +293 -0
- package/lib/types/host/grok-adapter.js.map +1 -0
- package/lib/types/host/grok-models.d.ts +47 -0
- package/lib/types/host/grok-models.js +320 -0
- package/lib/types/host/grok-models.js.map +1 -0
- package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
- package/lib/types/host/harness-opencode-accounts.js +80 -0
- package/lib/types/host/harness-opencode-accounts.js.map +1 -0
- package/lib/types/host/hermes-account-context.d.ts +8 -0
- package/lib/types/host/hermes-account-context.js +99 -0
- package/lib/types/host/hermes-account-context.js.map +1 -0
- package/lib/types/host/hermes-accounts.d.ts +19 -0
- package/lib/types/host/hermes-accounts.js +356 -0
- package/lib/types/host/hermes-accounts.js.map +1 -0
- package/lib/types/host/hermes-adapter.d.ts +93 -0
- package/lib/types/host/hermes-adapter.js +455 -0
- package/lib/types/host/hermes-adapter.js.map +1 -0
- package/lib/types/host/hermes-env.d.ts +4 -0
- package/lib/types/host/hermes-env.js +22 -0
- package/lib/types/host/hermes-env.js.map +1 -0
- package/lib/types/host/hermes-installation.d.ts +10 -0
- package/lib/types/host/hermes-installation.js +181 -0
- package/lib/types/host/hermes-installation.js.map +1 -0
- package/lib/types/host/hermes-models.d.ts +26 -0
- package/lib/types/host/hermes-models.js +328 -0
- package/lib/types/host/hermes-models.js.map +1 -0
- package/lib/types/host/hermes-native-entry.py +96 -0
- package/lib/types/host/hermes-nous-refresh.py +331 -0
- package/lib/types/host/hermes-nous.d.ts +53 -0
- package/lib/types/host/hermes-nous.js +343 -0
- package/lib/types/host/hermes-nous.js.map +1 -0
- package/lib/types/host/hermes-renewal.d.ts +27 -0
- package/lib/types/host/hermes-renewal.js +292 -0
- package/lib/types/host/hermes-renewal.js.map +1 -0
- package/lib/types/host/hermes-suppression.d.ts +7 -0
- package/lib/types/host/hermes-suppression.js +69 -0
- package/lib/types/host/hermes-suppression.js.map +1 -0
- package/lib/types/host/hermes-windows-installation.d.ts +5 -0
- package/lib/types/host/hermes-windows-installation.js +91 -0
- package/lib/types/host/hermes-windows-installation.js.map +1 -0
- package/lib/types/host/index.d.ts +140 -0
- package/lib/types/host/index.js +947 -0
- package/lib/types/host/index.js.map +1 -0
- package/lib/types/host/kimi-accounts.d.ts +17 -0
- package/lib/types/host/kimi-accounts.js +220 -0
- package/lib/types/host/kimi-accounts.js.map +1 -0
- package/lib/types/host/kimi-oauth-models.d.ts +14 -0
- package/lib/types/host/kimi-oauth-models.js +246 -0
- package/lib/types/host/kimi-oauth-models.js.map +1 -0
- package/lib/types/host/managed-agent.d.ts +4 -0
- package/lib/types/host/managed-agent.js +127 -0
- package/lib/types/host/managed-agent.js.map +1 -0
- package/lib/types/host/mimo-configuration.d.ts +22 -0
- package/lib/types/host/mimo-configuration.js +258 -0
- package/lib/types/host/mimo-configuration.js.map +1 -0
- package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
- package/lib/types/host/mimo-metadata-cache.js +121 -0
- package/lib/types/host/mimo-metadata-cache.js.map +1 -0
- package/lib/types/host/native-capability-cache.d.ts +11 -0
- package/lib/types/host/native-capability-cache.js +94 -0
- package/lib/types/host/native-capability-cache.js.map +1 -0
- package/lib/types/host/native-launch.d.mts +2 -0
- package/lib/types/host/native-launch.mjs +234 -0
- package/lib/types/host/native-process.d.ts +5 -0
- package/lib/types/host/native-process.js +41 -0
- package/lib/types/host/native-process.js.map +1 -0
- package/lib/types/host/native-spawn.mjs +32 -0
- package/lib/types/host/opencode-adapter.d.ts +94 -0
- package/lib/types/host/opencode-adapter.js +507 -0
- package/lib/types/host/opencode-adapter.js.map +1 -0
- package/lib/types/host/opencode-native.d.ts +27 -0
- package/lib/types/host/opencode-native.js +403 -0
- package/lib/types/host/opencode-native.js.map +1 -0
- package/lib/types/host/own-account-lease.d.mts +5 -0
- package/lib/types/host/own-account-lease.mjs +105 -0
- package/lib/types/host/pi-installation.d.mts +7 -0
- package/lib/types/host/pi-installation.mjs +87 -0
- package/lib/types/host/pi-omp-accounts.d.ts +28 -0
- package/lib/types/host/pi-omp-accounts.js +175 -0
- package/lib/types/host/pi-omp-accounts.js.map +1 -0
- package/lib/types/host/pi-omp-adapter.d.ts +32 -0
- package/lib/types/host/pi-omp-adapter.js +190 -0
- package/lib/types/host/pi-omp-adapter.js.map +1 -0
- package/lib/types/host/pi-omp-environment.d.mts +1 -0
- package/lib/types/host/pi-omp-environment.mjs +15 -0
- package/lib/types/host/pi-omp-identity.d.ts +2 -0
- package/lib/types/host/pi-omp-identity.js +142 -0
- package/lib/types/host/pi-omp-identity.js.map +1 -0
- package/lib/types/host/pi-omp-logout.d.ts +3 -0
- package/lib/types/host/pi-omp-logout.js +152 -0
- package/lib/types/host/pi-omp-logout.js.map +1 -0
- package/lib/types/host/pi-omp-native.d.ts +71 -0
- package/lib/types/host/pi-omp-native.js +753 -0
- package/lib/types/host/pi-omp-native.js.map +1 -0
- package/lib/types/host/pi-omp-refresh.d.mts +7 -0
- package/lib/types/host/pi-omp-refresh.mjs +324 -0
- package/lib/types/host/private-launch.mjs +23 -0
- package/lib/types/host/process.d.ts +43 -0
- package/lib/types/host/process.js +134 -0
- package/lib/types/host/process.js.map +1 -0
- package/lib/types/host/protocol.d.ts +23 -0
- package/lib/types/host/protocol.js +112 -0
- package/lib/types/host/protocol.js.map +1 -0
- package/lib/types/host/roles.d.ts +34 -0
- package/lib/types/host/roles.js +80 -0
- package/lib/types/host/roles.js.map +1 -0
- package/lib/types/host/routing.d.ts +31 -0
- package/lib/types/host/routing.js +248 -0
- package/lib/types/host/routing.js.map +1 -0
- package/lib/types/host/runtime.d.ts +60 -0
- package/lib/types/host/runtime.js +598 -0
- package/lib/types/host/runtime.js.map +1 -0
- package/lib/types/host/storage.d.ts +48 -0
- package/lib/types/host/storage.js +449 -0
- package/lib/types/host/storage.js.map +1 -0
- package/lib/types/host/telemetry.d.ts +17 -0
- package/lib/types/host/telemetry.js +158 -0
- package/lib/types/host/telemetry.js.map +1 -0
- package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
- package/lib/types/host/windows-account-launch.mjs +47 -0
- package/lib/types/host/windows-account-owner.ps1 +137 -0
- package/lib/types/host/windows-account-stdio.mjs +19 -0
- package/lib/types/host/windows-account-terminal.d.ts +17 -0
- package/lib/types/host/windows-account-terminal.js +208 -0
- package/lib/types/host/windows-account-terminal.js.map +1 -0
- package/lib/types/host/windows-agy-account.ps1 +81 -0
- package/lib/types/host/windows-cli-installation.d.ts +31 -0
- package/lib/types/host/windows-cli-installation.js +157 -0
- package/lib/types/host/windows-cli-installation.js.map +1 -0
- package/lib/types/host/windows-hidden-launch.mjs +49 -0
- package/lib/types/host/windows-hidden-process.d.ts +12 -0
- package/lib/types/host/windows-hidden-process.js +116 -0
- package/lib/types/host/windows-hidden-process.js.map +1 -0
- package/lib/types/host/zcode-account-models.d.ts +16 -0
- package/lib/types/host/zcode-account-models.js +114 -0
- package/lib/types/host/zcode-account-models.js.map +1 -0
- package/lib/types/host/zcode-adapter.d.ts +93 -0
- package/lib/types/host/zcode-adapter.js +808 -0
- package/lib/types/host/zcode-adapter.js.map +1 -0
- package/lib/types/host/zcode-grok-accounts.d.ts +30 -0
- package/lib/types/host/zcode-grok-accounts.js +408 -0
- package/lib/types/host/zcode-grok-accounts.js.map +1 -0
- package/lib/types/shared/accounts.d.ts +47 -0
- package/lib/types/shared/accounts.js +2 -0
- package/lib/types/shared/accounts.js.map +1 -0
- package/lib/types/shared/builtin-presets.d.ts +2 -0
- package/lib/types/shared/builtin-presets.js +231 -0
- package/lib/types/shared/builtin-presets.js.map +1 -0
- package/lib/types/shared/cli-settings.d.ts +5 -0
- package/lib/types/shared/cli-settings.js +2 -0
- package/lib/types/shared/cli-settings.js.map +1 -0
- package/lib/types/shared/model-presentation.d.ts +10 -0
- package/lib/types/shared/model-presentation.js +95 -0
- package/lib/types/shared/model-presentation.js.map +1 -0
- package/lib/types/shared/models.d.ts +7 -0
- package/lib/types/shared/models.js +35 -0
- package/lib/types/shared/models.js.map +1 -0
- package/lib/types/shared/telemetry.d.ts +18 -0
- package/lib/types/shared/telemetry.js +16 -0
- package/lib/types/shared/telemetry.js.map +1 -0
- package/lib/types/shared/types.d.ts +127 -0
- package/lib/types/shared/types.js +147 -0
- package/lib/types/shared/types.js.map +1 -0
- package/lib/windows-account-bootstrap.ps1 +44 -0
- package/lib/windows-account-launch.mjs +47 -0
- package/lib/windows-account-owner.ps1 +137 -0
- package/lib/windows-account-stdio.mjs +19 -0
- package/lib/windows-agy-account.ps1 +81 -0
- package/lib/windows-hidden-launch.mjs +49 -0
- package/lib/zcode-resume.mjs +423 -0
- package/package.json +109 -4
package/README.md
CHANGED
|
@@ -1,3 +1,369 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# CLI Worker Now
|
|
4
|
+
|
|
5
|
+
**简体中文** | [English](README.en.md)
|
|
6
|
+
|
|
7
|
+
**在 DeepSeek Harness 里,给不同 CLI 一个共同的协作空间。**
|
|
8
|
+
|
|
9
|
+
选择 CLI、模型和角色,派出有名字的智能体;在侧栏查看过程、接收结果,并继续同一个任务。
|
|
10
|
+
|
|
11
|
+
[](https://github.com/SuperWheel/cliworker-now/releases/latest)
|
|
12
|
+
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
13
|
+
[](#4-环境与-cli-支持)
|
|
14
|
+
[](LICENSE)
|
|
15
|
+
|
|
16
|
+
[下载安装包](https://github.com/SuperWheel/cliworker-now/releases/latest) · [安装方法](#5-安装与更新) · [开始使用](#6-使用方法) · [反馈问题](https://github.com/SuperWheel/cliworker-now/issues)
|
|
17
|
+
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
**阅读导航**
|
|
21
|
+
|
|
22
|
+
[1. 项目定位](#1-项目定位) · [2. 特点与优势](#2-特点与优势) · [3. 界面效果](#3-功能与界面效果) · [4. 支持范围](#4-环境与-cli-支持) · [5. 安装更新](#5-安装与更新) · [6. 使用方法](#6-使用方法) · [7. 常见问题](#7-权限数据与常见问题) · [8. 开发验证](#8-开发与验证) · [9. 文档与反馈](#9-文档反馈与许可)
|
|
23
|
+
|
|
24
|
+
## 1. 项目定位
|
|
25
|
+
|
|
26
|
+
CLI Worker Now 是 **DeepSeek Harness 的独立多 CLI 智能体插件**。它把分散在终端中的外部 AI CLI,接入 Harness 的主对话和右侧栏:主对话负责派遣与接收结果,侧栏负责展示各个智能体的任务、对话和状态。
|
|
27
|
+
|
|
28
|
+
适合已经使用多个 AI CLI,希望集中管理任务、反复调用同一位助手的人。你仍然使用各 CLI 自己的账号、模型与原生会话,插件负责把这些工作组织起来。
|
|
29
|
+
|
|
30
|
+
- **开发协作**:指定 Codex 审查代码,再按同一个智能体名称继续追问。
|
|
31
|
+
- **小说创作与审校**:为逻辑、文风、商业审稿和正文修订配置不同角色。
|
|
32
|
+
- **长任务跟进**:保留独立对话和执行记录,任务结束后继续,不必重新描述全部背景。
|
|
33
|
+
|
|
34
|
+
> 插件依赖 DeepSeek Harness 和相应 CLI;不附带模型服务、订阅或 API 额度。CLI 的模型请求由各自服务商处理。
|
|
35
|
+
|
|
36
|
+
## 2. 特点与优势
|
|
37
|
+
|
|
38
|
+
| 特点 | 如何实现 | 带来的价值 |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| **一个入口,多种 CLI** | 在主对话点名 CLI,在同一侧栏按 CLI 分组查看任务 | 减少在多个终端之间查找任务和结果的切换 |
|
|
41
|
+
| **保留原生能力** | 不同 CLI 使用各自的参数、登录与会话协议,模型目录按实际能力读取 | 可以继续使用熟悉的 CLI 生态;模型和强度不会被硬套成一套规则 |
|
|
42
|
+
| **智能体有名字、有角色** | 唯一名称、角色预设、自定义提示词,以及按名称续聊 | 同一位审校员或开发助手可以反复调用,职责更清楚 |
|
|
43
|
+
| **过程与结果放在一起** | 独立对话、公开工具事件、任务状态,以及 CLI 实际提供的用量 | 能看到任务走到哪一步,出错后有记录可查 |
|
|
44
|
+
| **明确选择,可控调度** | 首次选型、每个 CLI 独立开关、停止操作;同会话互斥、同目录写任务串行 | 任务按明确的选择执行;失败时不会悄悄换用另一个 CLI |
|
|
45
|
+
| **融入 Harness 工作流** | 复用宿主的侧栏、问题卡片、主题与控件,完成结果回到主对话 | 派遣、查看、继续和收尾都在熟悉的界面中完成 |
|
|
46
|
+
|
|
47
|
+
这些优势侧重于**任务组织、上下文延续和操作体验**。插件不承诺提升模型本身的准确率,也不把不同 CLI 的权限能力视为完全相同。
|
|
48
|
+
|
|
49
|
+
## 3. 功能与界面效果
|
|
50
|
+
|
|
51
|
+
以下效果图均直接拍摄于 **DeepSeek Harness Desktop 0.2.0-rc.2 + CLI Worker Now v0.6.5**。为公开展示新建了独立演示会话,使用 Antigravity 的 `gemini-3.8-flash / low` 真实执行一条欢迎语任务。
|
|
52
|
+
|
|
53
|
+
当前版本使用用户选定的[天蓝平切 Logo](doc/assets/project-icon/official-v4/README.md):入口使用原彩色图,标题随浅色/深色主题显示相同轮廓的黑/白版。下面的历史截图仍为 v0.6.5。
|
|
54
|
+
|
|
55
|
+
### 3.1 任务总览与独立对话
|
|
56
|
+
|
|
57
|
+
按 CLI 分组查看智能体,筛选进行中、已完成和异常任务。进入某个智能体后,可以查看独立对话、公开执行记录和用量,在本轮结束后继续交流。
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
点击右侧任务卡片,进入这位智能体的独立对话。主对话和子对话各自保留记录。
|
|
62
|
+
|
|
63
|
+

|
|
64
|
+
|
|
65
|
+
### 3.2 角色预设与自定义提示词
|
|
66
|
+
|
|
67
|
+
设置页以“名称 + 概述”的卡片管理角色。内置七种小说创作角色,也可新增适用于开发、研究或其他任务的角色。每个智能体保留创建时的角色副本;修改预设在重新选型时生效,不改变已确认设定或已有对话。
|
|
68
|
+
|
|
69
|
+

|
|
70
|
+
|
|
71
|
+
### 3.3 CLI 连接、账号与模型偏好
|
|
72
|
+
|
|
73
|
+
每个 CLI 可以单独开启或关闭,分别管理账号、项目默认模型与思考强度。支持的 CLI 可直接打开原生账号终端;登录状态与账号来源按各 CLI 的实际能力显示。
|
|
74
|
+
|
|
75
|
+
macOS 与 Windows 共用同一账号终端,支持选择文字复制及 Cmd+V/Ctrl+V 粘贴;右键在有选区时复制、无选区时粘贴,输入位置使用闪烁块状光标。登录时直接打开原生授权网页;Windows ZCode 的完整登录网址也可在终端点击或选择复制到浏览器。
|
|
76
|
+
|
|
77
|
+

|
|
78
|
+
|
|
79
|
+
### 3.4 亮暗主题与交互
|
|
80
|
+
|
|
81
|
+
跟随 Harness 的亮暗主题,保留卡片展开收起、按钮悬停、原生菜单和固定高度设置弹窗;系统启用“减少动态效果”时相应停用动画。
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
## 4. 环境与 CLI 支持
|
|
85
|
+
|
|
86
|
+
### 4.1 环境要求
|
|
87
|
+
|
|
88
|
+
| 项目 | 要求 |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| 操作系统 | **macOS / Windows**;外部 CLI 需安装对应系统的原生版本 |
|
|
91
|
+
| 宿主 | **DeepSeek Harness 0.2.0-rc.2** |
|
|
92
|
+
| Node.js | **≥ 22.19.0** |
|
|
93
|
+
| 外部 CLI | 按需安装,并准备该 CLI 自己的登录或 API 配置;OMP 的 npm 版本需 Bun ≥ 1.3.14 |
|
|
94
|
+
| 安装命令 | 在 Desktop 菜单“管理 dsh 命令…”中启用 `dsh`,macOS 与 Windows 使用相同命令 |
|
|
95
|
+
| 源码开发 | pnpm **11.25.0**,以仓库锁文件为准 |
|
|
96
|
+
|
|
97
|
+
### 4.2 支持范围与验证边界
|
|
98
|
+
|
|
99
|
+
插件使用各 CLI 原生的保护和权限模式,不再附加操作系统进程沙箱。Windows x64 已通过运行层和 11 个 CLI 的账号来源测试,并实测 Codex/Pi/OMP 启动及 Pi SDK 元数据;下表区分接入版本与实际模型调用记录。模型列表只展示当前 CLI 自身账号可用的选项。
|
|
100
|
+
|
|
101
|
+
| CLI | 已核验版本 | 当前验证范围 |
|
|
102
|
+
| --- | --- | --- |
|
|
103
|
+
| Antigravity | 1.2.16 | 首轮、续聊与停止已有真实验收 |
|
|
104
|
+
| Codex | 0.160.0 | 真实首轮与同会话续聊通过 |
|
|
105
|
+
| Claude Code | 2.1.176 | 真实首轮与续聊通过;测试环境的 `sonnet` 映射到 GLM |
|
|
106
|
+
| Kimi Code | 2.1.1 | 原生令牌状态及登录管理入口已修复;此前 0.42.0 真实请求被订阅权限 403 阻止,本轮未重新生成 |
|
|
107
|
+
| 官方 MiMo Code | 0.1.15 | 真实首轮与续聊通过 |
|
|
108
|
+
| ZCode | 0.16.9 | 原生登录、headless 与会话协议已接入;详见专项记录 |
|
|
109
|
+
| Grok Build | 1.0.0 | 自身登录、官方 Build 访问许可和模型目录分别核对;目录可读不等于有调用权限,真实生成未验收 |
|
|
110
|
+
| OMP | 16.4.4 | 原生登录菜单及自身日志写权限已修复;RPC 接入,历史智谱 Coding CN GLM-5.3-Flash 已实测 |
|
|
111
|
+
| Pi | 1.0.2 / 1.0.4 / 1.1.0 | 原生安装身份及 SDK/RPC 按版本核验;1.0.2 的智谱 Coding CN GLM-5.3-Flash 曾实测,1.0.4 仅只读/离线核验;1.1.0 在 Windows 通过无凭据 SDK/RPC、原生登录菜单显示及终止清理验证,尚未完成真实登录与模型调用 |
|
|
112
|
+
| Hermes Agent | 当前安装 checkout 6c80c32734 | 独立自身账号目录、原生登录菜单及 Nous 自身账号目录已验收;只读确认 10 个免费模型,真实生成与续聊未验收 |
|
|
113
|
+
| OpenCode | 1.18.21 | 原生目录与 JSONL 接入;智谱模型已实测,免费 MiMo 请求曾返回 403 |
|
|
114
|
+
|
|
115
|
+
MiMo 指 [XiaomiMiMo/MiMo-Code](https://github.com/XiaomiMiMo/MiMo-Code)。Hermes Agent 替代的是旧的外部 Harness CLI 入口,**DeepSeek Harness 宿主仍是插件的运行基础**。
|
|
116
|
+
|
|
117
|
+
MiMo 短时间重复加载模型能力时复用有界内存缓存,减少 Windows 上反复启动 CLI 的等待。首次加载仍需查询原生 CLI;账号、配置、项目或程序变化使缓存失效,每次派遣仍核对当前账号授权。
|
|
118
|
+
|
|
119
|
+
设置页的账号状态请求最多两个并发,包含当前选中的 CLI。首次打开优先当前项,切换时只调整待排顺序;模型目录另行查询,因此这不是全部子进程的数量上限。关闭或禁用会取消对应读取,底层进程清理仍由 Host 管理。
|
|
120
|
+
|
|
121
|
+
Kimi 已核验的 managed OAuth 模型能力和 Claude 的命令参数能力也可短时复用;每次目录查询仍核对当前凭据、有效期和远端权限,不缓存远端额度。Windows 后台查询及嵌入式账号终端的启动器隐藏额外控制台窗口。
|
|
122
|
+
|
|
123
|
+
成功且进程退出已确认的扩展 CLI 模型查询会自动删除本次临时目录和原生解压缓存;失败或清理未确认时保留现场,不删除原始账号文件。
|
|
124
|
+
|
|
125
|
+
专项记录:[ZCode](doc/zcode-probe.md) · [Grok](doc/grok-probe.md) · [Pi / OMP](doc/pi-omp-probe.md) · [Hermes](doc/hermes-probe.md) · [OpenCode](doc/opencode-probe.md)
|
|
126
|
+
|
|
127
|
+
## 5. 安装与更新
|
|
128
|
+
|
|
129
|
+
### 5.1 一行安装
|
|
130
|
+
|
|
131
|
+
```sh
|
|
132
|
+
dsh plugin --profile desktop add dsh-cliworker-now@0.7.7
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
<details>
|
|
136
|
+
<summary>Web、源码安装与更新</summary>
|
|
137
|
+
|
|
138
|
+
使用 Web profile 时:
|
|
139
|
+
|
|
140
|
+
```sh
|
|
141
|
+
dsh plugin --profile web add dsh-cliworker-now@0.7.7
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
安装或更新前先结束活动任务并完整退出 Harness,完成后重新打开。npm 包已预构建,无需手动解压或编译。也可以在插件页“添加插件”中输入 `dsh-cliworker-now@0.7.7`。
|
|
145
|
+
|
|
146
|
+
GitHub Release 备用安装:
|
|
147
|
+
|
|
148
|
+
```sh
|
|
149
|
+
dsh plugin --profile desktop add https://github.com/SuperWheel/cliworker-now/releases/download/v0.7.7/dsh-cliworker-now-0.7.7.tgz
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
从源码开发:
|
|
153
|
+
|
|
154
|
+
```sh
|
|
155
|
+
git clone https://github.com/SuperWheel/cliworker-now.git
|
|
156
|
+
cd cliworker-now
|
|
157
|
+
pnpm install --frozen-lockfile
|
|
158
|
+
pnpm --config.verifyDepsBeforeRun=false build
|
|
159
|
+
dsh plugin --profile desktop add .
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
源码安装会链接本地目录,因此该目录需要保留。卸载使用:
|
|
163
|
+
|
|
164
|
+
```sh
|
|
165
|
+
dsh plugin --profile desktop remove dsh-cliworker-now
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
卸载保留本机账号、历史会话和偏好。每个 Release 提供 `SHA256SUMS.txt` 校验文件。
|
|
169
|
+
|
|
170
|
+
</details>
|
|
171
|
+
|
|
172
|
+
## 6. 使用方法
|
|
173
|
+
|
|
174
|
+
### 6.1 首次派遣
|
|
175
|
+
|
|
176
|
+
在已选工作目录的 Harness 主对话里,明确说出要使用的 CLI,例如:
|
|
177
|
+
|
|
178
|
+
> 用 Codex 检查这个项目的登录错误处理,把这个智能体命名为“代码审查员”。
|
|
179
|
+
|
|
180
|
+
也可以使用简称或别名(本地 v0.6.7 起):
|
|
181
|
+
|
|
182
|
+
> 调用 agy cli 帮我审查这个项目。
|
|
183
|
+
>
|
|
184
|
+
> 调用 glm cli 帮我检查这段代码。
|
|
185
|
+
|
|
186
|
+
`agy` 对应 **Antigravity**,`glm / zhipu / 智谱` 对应 **ZCode**,`harmes` 对应 **Hermes Agent**。插件会为当前明确调用提供路由提示,并在派遣工具里统一解析名称;支持 `Antigravity(agy)CLI` 这样的同名别名,重复指定同一 CLI 仍视为一个目标。较长名称的轻微拼写误差只有唯一候选时才接受。未知名称或多个目标返回简短错误和候选,不自动派遣,普通模型讨论、否定调用和引用示例不会触发路由提示。是否调用工具仍由 Harness 主模型决定;如果模型忽略请求,可明确说“使用 CLI Worker 插件调用 agy CLI”。
|
|
187
|
+
|
|
188
|
+
首次使用相应项目和 CLI 时,通过 Harness 原生问题卡片选择:
|
|
189
|
+
|
|
190
|
+
1. **模型**:来自该 CLI 的实际目录。
|
|
191
|
+
2. **思考强度**:仅提供当前模型支持的选项。
|
|
192
|
+
3. **智能体预设**:选择已有角色、不使用预设,或在“其他”里写临时提示词。
|
|
193
|
+
|
|
194
|
+
模型、强度和角色全部确认后,才保存设定并启动任务。只会出现两类询问:
|
|
195
|
+
|
|
196
|
+
- **选择模型、思考强度和角色**:项目中首次使用该 CLI,或选择重新设置时出现。先选模型,再选择它支持的强度和角色。
|
|
197
|
+
- **是否沿用以前的设定**:同项目、同 CLI 的新主对话首次调用时出现;沿用即使用整套设定,重新选择则回到选型。
|
|
198
|
+
|
|
199
|
+
同一主对话之后的调用直接使用已确认设定,重启后也不会重复询问。取消或未完整回答不保存半套设定、不启动任务。旧版只保存模型和强度的偏好,升级后首次需补全整套选择。
|
|
200
|
+
|
|
201
|
+
明确调用 CLI 时,当前请求会携带对应 CLI 的派遣指引:直接调用 `cliworker_start` 打开选型,模型、强度和角色由插件收集,选型完成后才启动任务。每次工具调用必须显式传入 `cli`(Antigravity 也一样);漏传会返回参数错误,不会采用上次调用或默认 CLI。主模型无需预先提问角色或确认启动;通用提问工具保持不变。
|
|
202
|
+
|
|
203
|
+
全部 11 个 CLI 只使用自身原生登录,或在该 CLI 自己的配置/私有 `.env` 中单独设置的 API Key。模型与强度只展示“本 CLI 支持”与“当前自身账号可用范围”的交集;公共目录、旧缓存、固定别名和匿名免费模型不能单独成为可选依据。无法确认时显示空列表及简短原因。账号范围使用只读模型查询,不通过生成请求试探权限。
|
|
204
|
+
|
|
205
|
+
设置、模型菜单和任务卡片只显示模型名称,删除服务商、组织路径前缀及括号附注;同一原生模型去重,不同原生模型同名时仍保留独立选项,保存和执行使用完整路由 ID。新选择优先有明确证据且可用的免费额度,缺省零成本和价格未知不当免费。有效的既有选择保持不变,首次使用仍须由你选型,免费路由失败也不会自动转为付费请求。
|
|
206
|
+
|
|
207
|
+
OMP(Oh My Pi)与 Pi Coding Agent 是两个独立 CLI;安装、账号、模型和会话各自管理,即使使用相同模型也不能互换。插件核验实际执行程序身份;Pi 优先使用已核验的原生安装,不暗中切换到另一旧版。
|
|
208
|
+
|
|
209
|
+
Windows 也能发现当前用户注册的官方 Codex 应用包内 CLI 和官方 npm 固定入口,以及 Hermes 的官方安装目录;只有安装痕迹而没有可执行文件时会提示完成安装。Windows 支持已核验的 Pi 官方固定启动器,以及 OpenCode npm 包声明的原生程序入口。插件静态解析并校验安装身份;无法确认或已损坏的入口会提示检查安装。Pi 其他版本需先核验 SDK/RPC 和原生菜单后接入。
|
|
210
|
+
|
|
211
|
+
OMP、Pi、Hermes 和 OpenCode 的账号行按自身认证显示服务商及方式。有账号登录时简写为“OpenAI账号登录”等,完整安全身份及其他 API 认证保留在悬浮详情;仅 API 时显示“zai.cn API 登录”等。有效认证不会统一降成“已配置”。只有配置声明、缺失或失效凭据保留对应灰/红状态,模型权限仍单独核对。
|
|
212
|
+
|
|
213
|
+
OMP、Pi 和 Hermes 的“退出”使用统一按钮并打开各自原生退出菜单。多个自身账号目录先选择来源;操作针对所选真实来源,其他来源保留。Pi/OMP 原生退出不能删除的 `.env` 或模型配置内 API,需在原配置中管理。Hermes 原生写入的停用来源会同步约束登录、模型和调用,不从保留的配置值恢复账号。
|
|
214
|
+
|
|
215
|
+
ZCode 登录前可选择“中国智谱 BigModel”或“海外 Z.AI”,Mac 和 Windows 使用同一入口;只启动所选来源的官方授权。完整 CLI 的 `login [zai|bigmodel]` 能力与部分 Desktop 内置旧 CLI 不同,仅有 Z.AI 的旧版本选择 BigModel 时会提示升级,不会改开海外页面。插件优先使用 `~/.local/share/cliworker-now/runtimes/zcode/cli/zcode.cjs` 中已部署的完整 CLI,显式配置的执行路径优先级更高;Windows 安装需对应平台的原生依赖。升级 CLI 不会自动迁移 ZCode Desktop 账号,登录继续写入插件独立的 ZCode 账号目录。
|
|
216
|
+
|
|
217
|
+
Windows 的原生授权网址会完整打开一次,也可在终端中点击或选择复制;网页打开不代表授权已完成,需按官方网页提示完成登录。
|
|
218
|
+
|
|
219
|
+
账号发现和执行绑定同一来源;保存选型、新任务、排队出队和续聊都会重新核对账号、模型与强度。换号或退出会阻止旧任务启动,历史任务换号后需新建任务;升级前未记录账号绑定的历史任务也需新建,原对话保留。插件不读取其他 CLI 的凭据,也不继承 Harness API 凭据;旧 `zaiCredentialRef` 配置兼容读取但不生效。旧派生认证快照会按当前自身来源重建,原生账号、历史会话和偏好保留;失效偏好需重新选择。
|
|
220
|
+
|
|
221
|
+
Antigravity 使用自身原生登录和实时 `agy models` 目录,只展示原生返回的模型及强度变体。Windows 使用原生 Credential Manager 中当前交互式用户的账号,仅返回安全身份摘要。账号读取先完成,模型查询的等待或失败不会把已登录账号改为未登录。重复的在途账号读取会合并,后续刷新与执行授权仍读取当前账号。
|
|
222
|
+
|
|
223
|
+
Claude 会显示当前来源:自身配置的本地代理可达时使用代理,代理关闭时使用原生官方账号。代理认证或模型查询失败会明确报错,不自动换号。官方登录/退出只作用于官方账号,保留代理设置;任务启动前固定来源,不在运行中切换。官方 OAuth 模型需同时通过原生身份、模型能力和剩余额度核验;缺少证据时不放行。
|
|
224
|
+
|
|
225
|
+
当前账号范围边界:Kimi 原生 managed OAuth 使用自身模型别名、认证目录和可确认的套餐额度;额度为空、未知或耗尽时提示检查账号。其他未核验的 Kimi OAuth 模式及 OpenCode OAuth 暂不开放派遣。Claude 自身设置中的 API Key/Bearer Token、Kimi 自身 API 配置、MiMo 原生网页登录写入的自身 API 认证,以及可核对的本地配置,按账号列表筛选;保留网页登录附带的官方服务地址。Codex 支持已核验的官方文件账号路径,keyring 或自定义路由缺少范围证据时不放行。MiMo 目前只接受可核验的本地配置,文件/环境插值和远程组织配置需先移除。OpenCode 原生 OAuth 写回缺少账号版本保护,暂只开放自身 API 配置。
|
|
226
|
+
|
|
227
|
+
Codex 能读取模型但当前额度耗尽时,设置明确提示等待额度恢复;认证失效或访问被拒绝单独提示检查登录。两者都保留现有账号和项目偏好,不把原生模型能力当成当前可调用权限。
|
|
228
|
+
|
|
229
|
+
Kimi 已有有效或可续期的自身原生登录时显示“已登录”及可确认的简短账号 ID;原生未保存邮箱或昵称时不编造,点击“管理登录”打开原生终端;切换账号由用户输入 `/logout` 后再输入 `/login`。账号终端使用独立空目录,不加载用户项目 MCP;原生若显示 Trust 提示,由用户自行确认。只有提供商配置而没有对应令牌时显示未登录,不会自动退出原账号。
|
|
230
|
+
|
|
231
|
+
Hermes 首次明确打开登录设置后使用插件内独立原生账号目录,自动导入关闭,状态、模型、任务统一绑定该目录;之后退出不会回退到全局旧账号。原全局账号和历史保留,Host 不把其他 CLI 导入凭据作为自身登录证据,不注入 Harness 认证;原生进程按自身权限运行。现有官方安装的已选依赖环境可直接复用,账号操作不触发重新安装。
|
|
232
|
+
|
|
233
|
+
Hermes 的 Nous 登录按当前原生授权识别,模型来自该账号认证的官方目录及访问权限;无付费权限时仅开放明确免费的可用模型。Mac 与 Windows 共用自动续期:短期访问令牌临近过期或已过期时,使用同一账号的原生刷新凭据续期,健康令牌不额外启动进程。临时网络问题可刷新重试,只有刷新凭据缺失或明确失效才要求重新登录。续期不调用模型、不切换账号,也不清除额度或冷却限制;不会用旧快照恢复已退出的账号。
|
|
234
|
+
|
|
235
|
+
Grok 先核对自身官方 Build 访问门禁,再读取认证模型目录并匹配原生模型及强度能力;登录成功或目录 HTTP 200 均不能单独证明调用权限。是否有付费订阅也不能代替服务端门禁结果;未知或拒绝时保持空列表和简短原因,不通过生成请求试探。
|
|
236
|
+
|
|
237
|
+
```mermaid
|
|
238
|
+
flowchart LR
|
|
239
|
+
A[项目首次使用该 CLI] --> B[模型 · 强度 · 角色]
|
|
240
|
+
N[同项目新主对话调用该 CLI] --> Q{是否沿用以前设定}
|
|
241
|
+
Q -->|否| B
|
|
242
|
+
Q -->|是| C[有名字的独立智能体]
|
|
243
|
+
B --> C
|
|
244
|
+
C --> D[侧栏查看过程与结果]
|
|
245
|
+
D --> E[结果返回主对话]
|
|
246
|
+
D --> F[本轮结束后按名称续聊]
|
|
247
|
+
F --> C
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 6.2 查看、停止与继续
|
|
251
|
+
|
|
252
|
+
- 点击任务卡片进入独立对话;返回总览不会清空未发送的草稿。
|
|
253
|
+
- 总览的搜索和状态筛选固定在上方,任务列表独立滚动,首卡顶部完整显示;不显示匹配说明或清除筛选文字。异常右侧的垃圾桶按钮可查看已删除对话,再次点击或选择任一状态筛选均可返回;查看已删除时四筛选呈灰色,垃圾桶为深红底白图标。
|
|
254
|
+
- 右键任务卡片可修改聊天标题、智能体名称或删除;聚焦卡片打开按钮后也可按 `Shift+F10` 或菜单键操作。卡片不显示省略号按钮,右侧箭头在整行居中;已删除的空闲任务及其历史可以恢复。
|
|
255
|
+
- 默认名称采用 `agy-1`、`codex-1` 等短名称,旧默认名兼容寻址;名称按钮加宽但文字起点保持,名称与模型到分隔线的文字距离相等,点击后文字显示「已复制」,移开鼠标约一秒后恢复。
|
|
256
|
+
- 思考强度统一显示为 `Low`、`High` 等,保存和执行仍使用 CLI 原生值。
|
|
257
|
+
- 缺少账号记录的旧任务保留历史;标题下与原生新会话按钮等高的提示条提供「新建对话」,可按原模型、强度和角色使用当前自身账号新开。未建立原生会话的任务不在输入区重复说明,仍不能续聊。
|
|
258
|
+
- 运行中可以停止任务;插件等待受管理的进程退出后再报告停止。
|
|
259
|
+
- 子对话使用与 Harness 主聊天一致的返回最新圆形按钮和历史功能条淡入淡出;最新消息功能条保持可见,历史条在悬停或键盘聚焦时出现。
|
|
260
|
+
- 子对话输入框按 Enter 发送、Shift+Enter 换行,支持 Ctrl/Cmd+Enter,中文输入法确认不会误发送。
|
|
261
|
+
- 本轮结束后,在子对话输入下一步,或在主对话中说:**“让代码审查员继续检查测试覆盖。”**
|
|
262
|
+
- 按名称续聊限定在当前主会话内,复用同一个 CLI 会话;重命名不会清空历史或改变角色。
|
|
263
|
+
- 关闭侧栏不会停止后台任务,完成结果仍会回到主对话。
|
|
264
|
+
|
|
265
|
+
### 6.3 管理角色与 CLI
|
|
266
|
+
|
|
267
|
+
| 设置入口 | 可以做什么 | 生效范围 |
|
|
268
|
+
| --- | --- | --- |
|
|
269
|
+
| 智能体设置 | 新增、编辑、删除“名称 / 概述 / 角色提示词”预设 | 当前 Harness profile 共用;已有智能体保留原角色副本 |
|
|
270
|
+
| CLI 连接 | 独立开关、刷新状态、登录设置或切换账号、打开原生账号终端 | 对应 CLI;关闭前需先结束其任务与账号终端 |
|
|
271
|
+
| 项目默认设置 | 保存默认模型与思考强度 | 当前项目 + 当前 CLI 的新主对话;已确认对话保持原设定 |
|
|
272
|
+
| 子对话模型菜单 | 在本轮结束后修改当前智能体的模型或强度 | 下一轮续聊,保留同一个 CLI 会话 |
|
|
273
|
+
|
|
274
|
+
内置角色:**商业审稿人、逻辑审校员、文风审校员、正文修订师、剧情节点设计师、剧情结构规划师、小说主笔**。更多说明见 [默认角色预设](doc/role-presets.md)。
|
|
275
|
+
|
|
276
|
+
CLI 连接的状态点含义:
|
|
277
|
+
|
|
278
|
+
| 状态点 | 含义 |
|
|
279
|
+
| --- | --- |
|
|
280
|
+
| 灰色 | 未安装、未登录、仅有普通配置或尚未检查;检查中显示加载状态 |
|
|
281
|
+
| 红色 | 已知登录失效、配置损坏、读取失败、无效的显式执行路径或已配置后的模型目录失败 |
|
|
282
|
+
| 绿色 | 已登录:来自原生状态、可续用登录会话或当前账号的精确凭据绑定 |
|
|
283
|
+
|
|
284
|
+
未配置 CLI 的空模型目录保持灰色。账号查询结束后再加载模型;刷新账号或结束账号操作会使旧模型清单失效并重新查询。模型刷新中或失败后不能继续选择旧列表,已有项目默认设置保留,恢复后需重新核对。导航与账号摘要使用相同状态规则。账号区仅保留一行状态与必要身份,错误显示简短原因。
|
|
285
|
+
|
|
286
|
+
## 7. 权限、数据与常见问题
|
|
287
|
+
|
|
288
|
+
### 7.1 执行与数据边界
|
|
289
|
+
|
|
290
|
+
- **按明确选择执行**:CLI 缺失或失败时不会自动换用另一个 CLI;不接管在插件外启动的 CLI。
|
|
291
|
+
- **调度有边界**:默认两个并发;同一 CLI 会话单轮互斥,同一目录的写任务串行。仅支持主对话 → 直接子智能体两层结构,不支持运行中插话或递归派遣。
|
|
292
|
+
- **权限按原生能力处理**:Harness 规划模式或只读权限下拒绝启动。允许执行后,支持的 CLI 可按只读任务模式派遣;Kimi 和 Hermes 非交互模式不支持只读派遣。插件不附加 OS 沙箱,各 CLI 的原生权限与工具限制见专项文档。
|
|
293
|
+
- **记录保存在本机**:默认位于 `$DSH_HOME/cliworker-now`(通常为 `~/.dsh/cliworker-now`),POSIX 系统中目录权限 `0700`、文件 `0600`。外部 CLI 仍会按自己的服务与配置发送模型请求,不能据此认为任务完全离线。
|
|
294
|
+
- **用量有来源**:只展示 CLI 提供或可核查的统计,缺失显示 `—`;上下文占用与累计 Token 不是同一指标。Antigravity 的估算来源会在详情中说明。
|
|
295
|
+
- **账号有边界**:原生已登录会话正确显示绿色;自身 API 配置单独标记,模型权限按当前账号筛选。插件不在页面展示 API 密钥;部分 CLI 与原生终端共用账号,退出操作可能同时影响该 CLI 的其他终端。
|
|
296
|
+
|
|
297
|
+
### 7.2 常见问题
|
|
298
|
+
|
|
299
|
+
<details>
|
|
300
|
+
<summary><strong>已经在终端安装了 CLI,为什么 Desktop 找不到?</strong></summary>
|
|
301
|
+
|
|
302
|
+
Desktop 不会读取你的 `.zshrc`。插件会识别部分常见安装位置;仍找不到时,在插件配置中设置对应 CLI 的可执行文件绝对路径。可用配置项见 [详细配置与版本说明](doc/version-notes.md)。
|
|
303
|
+
|
|
304
|
+
</details>
|
|
305
|
+
|
|
306
|
+
<details>
|
|
307
|
+
<summary><strong>模型菜单报错或更新后出现 HTTP 404,怎么办?</strong></summary>
|
|
308
|
+
|
|
309
|
+
先结束运行中的任务,然后完整退出并重新打开 Harness。只刷新插件列表,可能留下旧 Host 与新 Client,导致接口不一致。重新启动后仍失败,再检查该 CLI 的安装、账号和原生模型目录。
|
|
310
|
+
|
|
311
|
+
</details>
|
|
312
|
+
|
|
313
|
+
<details>
|
|
314
|
+
<summary><strong>每个 CLI 都需要订阅吗?已登录为什么仍然失败?</strong></summary>
|
|
315
|
+
|
|
316
|
+
订阅、API 计费和模型权限由各 CLI 的服务商决定。能够打开登录页、读取本地账号或列出模型,不代表对应模型请求一定可用;遇到 403 等错误需核对原生账号权限。
|
|
317
|
+
|
|
318
|
+
</details>
|
|
319
|
+
|
|
320
|
+
<details>
|
|
321
|
+
<summary><strong>为什么没有思考强度选项或上下文百分比?</strong></summary>
|
|
322
|
+
|
|
323
|
+
插件只提供 CLI 明确支持的强度。协议 `default` 统一显示为「默认」,仍使用 CLI 的原生默认行为;未提供可核查上下文数据时显示 `—`,不会根据模型名称或累计用量猜测。
|
|
324
|
+
|
|
325
|
+
</details>
|
|
326
|
+
|
|
327
|
+
## 8. 开发与验证
|
|
328
|
+
|
|
329
|
+
项目使用 **TypeScript ESM + React**:Host 管理进程与持久化,Client 通过 Harness 原生 Gateway 访问 Host,共享协议负责两侧的数据约定。
|
|
330
|
+
|
|
331
|
+
```sh
|
|
332
|
+
pnpm install --frozen-lockfile
|
|
333
|
+
pnpm --config.verify-deps-before-run=false typecheck
|
|
334
|
+
pnpm --config.verify-deps-before-run=false test
|
|
335
|
+
pnpm --config.verify-deps-before-run=false build:preview
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
隔离包输出到 `.cache/preview-package`。先在隔离 profile 验收,确认没有活动任务后,再运行正式构建;避免开发构建影响 Desktop 正在使用的版本。
|
|
339
|
+
|
|
340
|
+
在 Mac 构建后,可通过 SSH 在自己的 Windows 原生测试机安装隔离依赖、运行定向回归并回传日志与包哈希;见 [Windows 远程测试指南](doc/windows-remote-testing.md)。入口为 `pnpm --config.verifyDepsBeforeRun=false test:windows:remote --config .test-data/windows-remote/config.json`,默认不调用模型或验收 Desktop 界面。
|
|
341
|
+
|
|
342
|
+
真实 CLI 验收是额外步骤,会使用对应账号与模型额度,不由以上自动测试代替:
|
|
343
|
+
|
|
344
|
+
```sh
|
|
345
|
+
pnpm --config.verify-deps-before-run=false smoke:extended --help
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
v0.6.15 通过类型检查、1112 项本机回归及真实 Windows 运行层检查;Windows CI 的源码与日志可从 [验证工作流](https://github.com/SuperWheel/cliworker-now/actions/workflows/windows.yml) 查看。各 CLI 的真实验收范围请看第 4 节和 [实际验证记录](doc/tasks.md)。
|
|
349
|
+
|
|
350
|
+
开发变更使用 **OpenSpec** 管理方案、增量规格与任务;按变更逐步补齐规格,保留现有设计和验收历史。依赖已固定在项目中,安装后可运行:
|
|
351
|
+
|
|
352
|
+
```sh
|
|
353
|
+
pnpm spec:list
|
|
354
|
+
pnpm spec:check
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Codex 中选择 `openspec-propose` 技能准备方案,再用 `openspec-apply-change` 实施;完成验证后用 `openspec-archive-change` 归档。具体命令、文档分工及其他 CLI 的接入见 [OpenSpec 开发指南](doc/openspec.md)。OpenSpec 是本仓库的开发工具,插件使用者无需安装。
|
|
358
|
+
|
|
359
|
+
## 9. 文档、反馈与许可
|
|
360
|
+
|
|
361
|
+
- [设计与协议](doc/design.md):架构、调度、权限与持久化设计。
|
|
362
|
+
- [OpenSpec 开发指南](doc/openspec.md):需求到实施、验证与归档的工作流。
|
|
363
|
+
- [任务与实际验证](doc/tasks.md):已实施内容和验收记录。
|
|
364
|
+
- [历史版本与详细配置](doc/version-notes.md):逐版本变更、适配器配置及限制。
|
|
365
|
+
- [角色预设](doc/role-presets.md):默认智能体的职责与边界。
|
|
366
|
+
- [效果图来源与隐私处理](doc/assets/readme/README.md):原生截图来源与隐私说明。
|
|
367
|
+
- [提交 Issue](https://github.com/SuperWheel/cliworker-now/issues):请附 Harness / 插件 / CLI 版本、复现步骤与已脱敏日志;不要上传账号令牌或私人项目内容。
|
|
368
|
+
|
|
369
|
+
项目采用 [MIT License](LICENSE),是独立社区插件。DeepSeek Harness 及各 CLI 的名称、图标和商标归各自权利人所有,不表示官方关联或背书。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// Read-only account metadata. Never refresh OAuth, submit prompts, or return
|
|
2
|
+
// credentials, account IDs, headers, endpoint URLs, or raw exception messages.
|
|
3
|
+
const unknown = () => ({ state: 'unknown', source: 'unknown', models: [] })
|
|
4
|
+
const denied = (denialReason) => ({
|
|
5
|
+
state: 'denied',
|
|
6
|
+
source: 'unknown',
|
|
7
|
+
models: [],
|
|
8
|
+
...(denialReason ? { denialReason } : {}),
|
|
9
|
+
})
|
|
10
|
+
const validId = (id) => typeof id === 'string' && !!id && id.length <= 1024 && !/[\s\x00-\x1f]/.test(id)
|
|
11
|
+
const object = (value) => value && typeof value === 'object' && !Array.isArray(value)
|
|
12
|
+
const unavailable = (model) =>
|
|
13
|
+
model.supported_in_api === false ||
|
|
14
|
+
model.allowed === false ||
|
|
15
|
+
model.available === false ||
|
|
16
|
+
model.entitled === false ||
|
|
17
|
+
model.enabled === false ||
|
|
18
|
+
model.disabled === true ||
|
|
19
|
+
model.upgrade_required === true ||
|
|
20
|
+
model.visibility === 'hidden' ||
|
|
21
|
+
model.visibility === 'none'
|
|
22
|
+
const numericRate = (value) =>
|
|
23
|
+
typeof value === 'number'
|
|
24
|
+
? value
|
|
25
|
+
: typeof value === 'string' &&
|
|
26
|
+
value.trim() &&
|
|
27
|
+
/^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(value.trim())
|
|
28
|
+
? Number(value)
|
|
29
|
+
: NaN
|
|
30
|
+
const costFor = (model, oauth) => {
|
|
31
|
+
if (oauth) return 'unknown'
|
|
32
|
+
const rates = model.pricing
|
|
33
|
+
if (object(rates)) {
|
|
34
|
+
const input = numericRate(Object.hasOwn(rates, 'input') ? rates.input : rates.prompt),
|
|
35
|
+
output = numericRate(Object.hasOwn(rates, 'output') ? rates.output : rates.completion)
|
|
36
|
+
if (Number.isFinite(input) && Number.isFinite(output) && input >= 0 && output >= 0) {
|
|
37
|
+
const additional = Object.entries(rates)
|
|
38
|
+
.filter(([key]) => !['input', 'output', 'prompt', 'completion', 'free'].includes(key))
|
|
39
|
+
.map(([, value]) => numericRate(value))
|
|
40
|
+
if (input > 0 || output > 0 || additional.some((value) => value > 0)) return 'paid'
|
|
41
|
+
if (additional.some((value) => !Number.isFinite(value) || value < 0)) return 'unknown'
|
|
42
|
+
return 'free'
|
|
43
|
+
}
|
|
44
|
+
// Explicit invalid rates cannot be overridden by a contradictory free flag.
|
|
45
|
+
if ('input' in rates || 'prompt' in rates || 'output' in rates || 'completion' in rates) return 'unknown'
|
|
46
|
+
}
|
|
47
|
+
return model.free === true || model.is_free === true || model.pricing?.free === true ? 'free' : 'unknown'
|
|
48
|
+
}
|
|
49
|
+
function entries(payload) {
|
|
50
|
+
if (Array.isArray(payload)) return payload
|
|
51
|
+
if (!object(payload)) return undefined
|
|
52
|
+
return Array.isArray(payload.models)
|
|
53
|
+
? payload.models
|
|
54
|
+
: Array.isArray(payload.data)
|
|
55
|
+
? payload.data
|
|
56
|
+
: undefined
|
|
57
|
+
}
|
|
58
|
+
function normalize(payload, oauth, token) {
|
|
59
|
+
const list = entries(payload)
|
|
60
|
+
if (!list) return undefined
|
|
61
|
+
const result = new Map()
|
|
62
|
+
for (const model of list) {
|
|
63
|
+
if (!object(model) || unavailable(model)) continue
|
|
64
|
+
const id = model.slug ?? model.id
|
|
65
|
+
if (
|
|
66
|
+
!validId(id) ||
|
|
67
|
+
id === token ||
|
|
68
|
+
(token.length >= 12 && id.includes(token)) ||
|
|
69
|
+
(oauth && model.supported_in_api !== true)
|
|
70
|
+
)
|
|
71
|
+
continue
|
|
72
|
+
const name = model.display_name ?? model.name
|
|
73
|
+
result.set(id, {
|
|
74
|
+
id,
|
|
75
|
+
...(typeof name === 'string' &&
|
|
76
|
+
name.trim() &&
|
|
77
|
+
name.length <= 4096 &&
|
|
78
|
+
name !== token &&
|
|
79
|
+
!(token.length >= 12 && name.includes(token))
|
|
80
|
+
? { name }
|
|
81
|
+
: {}),
|
|
82
|
+
cost: costFor(model, oauth),
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
return [...result.values()]
|
|
86
|
+
}
|
|
87
|
+
function metadataBase(input, codex) {
|
|
88
|
+
const url = new URL(codex ? 'https://chatgpt.com/backend-api' : input.baseUrl)
|
|
89
|
+
if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
90
|
+
throw new Error('Unsafe metadata endpoint')
|
|
91
|
+
const base = url.toString().replace(/\/+$/, '')
|
|
92
|
+
return input.apiType === 'anthropic-messages' && !/\/v1$/.test(url.pathname.replace(/\/+$/, ''))
|
|
93
|
+
? `${base}/v1`
|
|
94
|
+
: base
|
|
95
|
+
}
|
|
96
|
+
async function readResponse(response) {
|
|
97
|
+
if (!response.body) return undefined
|
|
98
|
+
const reader = response.body.getReader()
|
|
99
|
+
let length = 0
|
|
100
|
+
const chunks = []
|
|
101
|
+
try {
|
|
102
|
+
while (true) {
|
|
103
|
+
const { done, value } = await reader.read()
|
|
104
|
+
if (done) break
|
|
105
|
+
length += value.length
|
|
106
|
+
if (length > 2 * 1024 * 1024) {
|
|
107
|
+
await reader.cancel()
|
|
108
|
+
return undefined
|
|
109
|
+
}
|
|
110
|
+
chunks.push(value)
|
|
111
|
+
}
|
|
112
|
+
const bytes = new Uint8Array(length)
|
|
113
|
+
let offset = 0
|
|
114
|
+
for (const chunk of chunks) {
|
|
115
|
+
bytes.set(chunk, offset)
|
|
116
|
+
offset += chunk.length
|
|
117
|
+
}
|
|
118
|
+
return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes))
|
|
119
|
+
} finally {
|
|
120
|
+
reader.releaseLock()
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Exact current-account model scope, or a narrowly declared API fallback. */
|
|
124
|
+
export async function probeAccountModels(input, options = {}) {
|
|
125
|
+
const credential = input.credential
|
|
126
|
+
if (!credential || !['api', 'oauth'].includes(credential.type)) return unknown()
|
|
127
|
+
const oauth = credential.type === 'oauth'
|
|
128
|
+
const token = oauth ? credential.access : credential.key
|
|
129
|
+
if (typeof token !== 'string' || !token.trim() || token.trimStart().startsWith('!')) return unknown()
|
|
130
|
+
// Near-expiry credentials cannot reliably finish the query. Do not renew them.
|
|
131
|
+
if (oauth && (typeof credential.expires !== 'number' || credential.expires <= Date.now() + 30000))
|
|
132
|
+
return denied('authentication')
|
|
133
|
+
const codex = oauth && ['openai', 'openai-codex'].includes(input.provider)
|
|
134
|
+
// xAI/other subscription catalogs do not expose a verified per-account scope
|
|
135
|
+
// contract here. Do not turn an OAuth login into their whole public catalog.
|
|
136
|
+
if (oauth && !codex) return unknown()
|
|
137
|
+
const parent = options.signal
|
|
138
|
+
if (parent?.aborted) return unknown()
|
|
139
|
+
const controller = new AbortController()
|
|
140
|
+
const signal = parent ? AbortSignal.any([parent, controller.signal]) : controller.signal
|
|
141
|
+
const timer = setTimeout(() => controller.abort(), Math.max(50, Math.min(options.timeoutMs ?? 8000, 10000)))
|
|
142
|
+
try {
|
|
143
|
+
if (codex && input.baseUrl && input.baseUrl.replace(/\/+$/, '') !== 'https://chatgpt.com/backend-api')
|
|
144
|
+
return unknown()
|
|
145
|
+
const base = metadataBase(input, codex)
|
|
146
|
+
const headers = { accept: 'application/json', Authorization: `Bearer ${token}` }
|
|
147
|
+
if (input.apiType === 'anthropic-messages' && !oauth) {
|
|
148
|
+
// ZCode's native Anthropic factory sends both headers. Other callers keep
|
|
149
|
+
// the ordinary x-api-key contract unless they explicitly mirror that route.
|
|
150
|
+
if (!['api-key-and-bearer', 'bearer'].includes(input.anthropicAuth)) delete headers.Authorization
|
|
151
|
+
if (input.anthropicAuth !== 'bearer') headers['x-api-key'] = token
|
|
152
|
+
headers['anthropic-version'] = '2023-06-01'
|
|
153
|
+
}
|
|
154
|
+
if (codex) {
|
|
155
|
+
let accountId = credential.accountId
|
|
156
|
+
if (!accountId) {
|
|
157
|
+
try {
|
|
158
|
+
accountId = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'))?.[
|
|
159
|
+
'https://api.openai.com/auth'
|
|
160
|
+
]?.chatgpt_account_id
|
|
161
|
+
} catch {}
|
|
162
|
+
}
|
|
163
|
+
if (typeof accountId === 'string' && accountId) headers['chatgpt-account-id'] = accountId
|
|
164
|
+
headers['OpenAI-Beta'] = 'responses=experimental'
|
|
165
|
+
headers.originator = 'pi'
|
|
166
|
+
headers.version = '0.144.1'
|
|
167
|
+
}
|
|
168
|
+
const fetcher = options.fetch ?? globalThis.fetch
|
|
169
|
+
const request = async (path) => {
|
|
170
|
+
const target = `${base}${path}${codex && path !== '/wham/usage' ? '?client_version=0.144.1' : ''}`
|
|
171
|
+
const response = await fetcher(target, { method: 'GET', headers, signal, redirect: 'error' })
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
await response.body?.cancel()
|
|
174
|
+
return { status: response.status, payload: undefined }
|
|
175
|
+
}
|
|
176
|
+
return { status: response.status, payload: await readResponse(response) }
|
|
177
|
+
}
|
|
178
|
+
let modelResponse
|
|
179
|
+
for (const path of codex
|
|
180
|
+
? ['/codex/models', '/models']
|
|
181
|
+
: [
|
|
182
|
+
input.provider === 'openrouter' || new URL(base).hostname === 'openrouter.ai'
|
|
183
|
+
? '/models/user'
|
|
184
|
+
: '/models',
|
|
185
|
+
]) {
|
|
186
|
+
modelResponse = await request(path)
|
|
187
|
+
if (modelResponse.status === 401 || modelResponse.status === 403) return denied('authentication')
|
|
188
|
+
if (modelResponse.status >= 200 && modelResponse.status < 300) break
|
|
189
|
+
if (![404, 405].includes(modelResponse.status)) return unknown()
|
|
190
|
+
}
|
|
191
|
+
if (modelResponse?.status >= 200 && modelResponse.status < 300) {
|
|
192
|
+
const envelope = modelResponse.payload
|
|
193
|
+
if (envelope?.allowed === false || envelope?.authenticated === false) return denied()
|
|
194
|
+
if (envelope?.success === false || envelope?.error) {
|
|
195
|
+
const code = envelope?.error?.code
|
|
196
|
+
return ['invalid_api_key', 'authentication_failed', 'unauthorized', 'forbidden', 401, 403].includes(
|
|
197
|
+
code,
|
|
198
|
+
)
|
|
199
|
+
? denied('authentication')
|
|
200
|
+
: unknown()
|
|
201
|
+
}
|
|
202
|
+
const models = normalize(envelope, oauth, token)
|
|
203
|
+
if (models === undefined) return unknown()
|
|
204
|
+
if (codex) {
|
|
205
|
+
const usage = await request('/wham/usage')
|
|
206
|
+
const rate = usage.payload?.rate_limit
|
|
207
|
+
if (usage.status === 401 || usage.status === 403) return denied('authentication')
|
|
208
|
+
// Only the authenticated usage response establishes exhausted quota.
|
|
209
|
+
// Keep an unclassified denial distinct from expiry/401/403 and network failure.
|
|
210
|
+
if (usage.status === 200 && rate?.limit_reached === true) return denied('quota')
|
|
211
|
+
if (rate?.allowed === false || rate?.limit_reached === true) return denied()
|
|
212
|
+
// A catalog/menu is not evidence that the account has an executable quota.
|
|
213
|
+
if (usage.status !== 200 || rate?.allowed !== true || rate?.limit_reached !== false) return unknown()
|
|
214
|
+
const plan =
|
|
215
|
+
typeof usage.payload?.plan_type === 'string'
|
|
216
|
+
? usage.payload.plan_type
|
|
217
|
+
.trim()
|
|
218
|
+
.toLowerCase()
|
|
219
|
+
.replace(/^chatgpt_/, '')
|
|
220
|
+
: ''
|
|
221
|
+
const cost =
|
|
222
|
+
plan === 'free'
|
|
223
|
+
? 'free'
|
|
224
|
+
: ['plus', 'pro', 'team', 'business', 'enterprise', 'edu', 'pro_lite', 'prolite'].includes(plan)
|
|
225
|
+
? 'paid'
|
|
226
|
+
: 'unknown'
|
|
227
|
+
for (const model of models) model.cost = cost
|
|
228
|
+
}
|
|
229
|
+
if (
|
|
230
|
+
!oauth &&
|
|
231
|
+
([
|
|
232
|
+
'zai-coding-cn',
|
|
233
|
+
'cliworker-zai-cn',
|
|
234
|
+
'zhipu-coding-plan',
|
|
235
|
+
'zhipuai-coding-plan',
|
|
236
|
+
'kimi-coding',
|
|
237
|
+
].includes(input.provider) ||
|
|
238
|
+
/open\.bigmodel\.cn\/api\/coding\//.test(base))
|
|
239
|
+
) {
|
|
240
|
+
for (const model of models) if (model.cost === 'free') model.cost = 'unknown'
|
|
241
|
+
}
|
|
242
|
+
return { state: 'supported', source: 'account-models', models }
|
|
243
|
+
}
|
|
244
|
+
if (!oauth && [404, 405].includes(modelResponse?.status)) {
|
|
245
|
+
// Declaring a custom model is not an account entitlement proof.
|
|
246
|
+
const verified = [...new Set(input.verifiedModelIds ?? [])].filter(
|
|
247
|
+
(id) => validId(id) && id !== token && !(token.length >= 12 && id.includes(token)),
|
|
248
|
+
)
|
|
249
|
+
if (verified.length)
|
|
250
|
+
return {
|
|
251
|
+
state: 'supported',
|
|
252
|
+
source: 'verified-route',
|
|
253
|
+
models: verified.map((id) => ({ id, cost: 'unknown' })),
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return unknown()
|
|
257
|
+
} catch {
|
|
258
|
+
return unknown()
|
|
259
|
+
} finally {
|
|
260
|
+
clearTimeout(timer)
|
|
261
|
+
}
|
|
262
|
+
}
|