@harness-mix/cli 0.1.7 → 0.1.9
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/NOTICE +12 -0
- package/README.md +51 -43
- package/docs/harness-management.md +1 -1
- package/docs/native-acp.md +7 -2
- package/docs/task-handoff-design.md +65 -0
- package/licenses/codex-styler-Apache-2.0.txt +193 -0
- package/licenses/heige-codex-skin-studio-MIT.txt +22 -0
- package/output/native-build/desktop-controller.mjs +2 -1
- package/output/native-build/renderer-extension.js +651 -9
- package/package.json +188 -188
- package/scripts/acp-capabilities-probe.cjs +1 -0
- package/scripts/build-native.cjs +1 -1
- package/scripts/codex-adapter-test.cjs +44 -0
- package/scripts/collaboration-recovery-test.cjs +3 -0
- package/scripts/e2e-codex.cjs +3 -1
- package/scripts/e2e-native-acp.cjs +1 -1
- package/scripts/error-kind-test.cjs +107 -0
- package/scripts/handoff-checkpoint-test.cjs +38 -0
- package/scripts/integrations-test.cjs +5 -2
- package/scripts/kiro-cursor-adapters-test.cjs +18 -0
- package/scripts/native-acp-depth-test.cjs +1 -1
- package/scripts/native-protocol-test.cjs +60 -4
- package/scripts/native-ui-smoke.cjs +92 -2
- package/scripts/switch-harness-test.cjs +79 -12
- package/scripts/tool-concurrency-regression-test.cjs +8 -6
- package/src/assets/icons/cline-color.svg +1 -0
- package/src/assets/skins/codex-styler/ASSET_LICENSES.md +36 -0
- package/src/assets/skins/codex-styler/NOTICE +11 -0
- package/src/assets/skins/codex-styler/themes/gilded-grandeur/hero.webp +0 -0
- package/src/assets/skins/codex-styler/themes/merry-big-top/hero.webp +0 -0
- package/src/assets/skins/codex-styler/themes/nocturne-studio/hero.webp +0 -0
- package/src/assets/skins/codex-styler/themes/quiet-garden/hero.webp +0 -0
- package/src/assets/skins/heige/ASSET_PROVENANCE.md +56 -0
- package/src/assets/skins/heige/NOTICE.md +13 -0
- package/src/assets/skins/heige/themes/dalao-dianyan/hero.webp +0 -0
- package/src/assets/skins/heige/themes/dalao-dianyan/theme.json +14 -0
- package/src/assets/skins/heige/themes/deepspace-dawn/hero.webp +0 -0
- package/src/assets/skins/heige/themes/deepspace-dawn/theme.json +14 -0
- package/src/assets/skins/heige/themes/deepspace-star/hero.webp +0 -0
- package/src/assets/skins/heige/themes/deepspace-star/theme.json +14 -0
- package/src/assets/skins/heige/themes/dragonball-nimbus/hero.webp +0 -0
- package/src/assets/skins/heige/themes/dragonball-nimbus/theme.json +16 -0
- package/src/assets/skins/heige/themes/dragonball-super-saiyan/hero.webp +0 -0
- package/src/assets/skins/heige/themes/dragonball-super-saiyan/theme.json +16 -0
- package/src/assets/skins/heige/themes/genshin-dawn/hero.webp +0 -0
- package/src/assets/skins/heige/themes/genshin-dawn/theme.json +14 -0
- package/src/assets/skins/heige/themes/genshin-night/hero.webp +0 -0
- package/src/assets/skins/heige/themes/genshin-night/theme.json +14 -0
- package/src/assets/skins/heige/themes/miku-488137/hero.webp +0 -0
- package/src/assets/skins/heige/themes/miku-488137/logo.webp +0 -0
- package/src/assets/skins/heige/themes/miku-488137/polaroid.webp +0 -0
- package/src/assets/skins/heige/themes/miku-488137/theme.json +16 -0
- package/src/assets/skins/heige/themes/naruto-hokage/hero.webp +0 -0
- package/src/assets/skins/heige/themes/naruto-hokage/theme.json +14 -0
- package/src/assets/skins/heige/themes/naruto-sasuke/hero.webp +0 -0
- package/src/assets/skins/heige/themes/naruto-sasuke/theme.json +14 -0
- package/src/assets/skins/heige/themes/wuthering-echo/hero.webp +0 -0
- package/src/assets/skins/heige/themes/wuthering-echo/theme.json +14 -0
- package/src/assets/skins/heige/themes/wuthering-tide/hero.webp +0 -0
- package/src/assets/skins/heige/themes/wuthering-tide/theme.json +14 -0
- package/src/main/adapters/cline.js +22 -0
- package/src/main/adapters/codex.js +78 -8
- package/src/main/adapters/index.js +2 -1
- package/src/main/adapters/native-acp-command.js +1 -0
- package/src/main/harness-adapter/error-kind.js +82 -0
- package/src/main/harness-adapter/event-normalizer.js +7 -1
- package/src/main/host/core-session.js +1 -1
- package/src/main/host/handoff-access.js +23 -4
- package/src/main/host/handoff-checkpoints.js +9 -2
- package/src/main/host/handoff-tools.js +3 -0
- package/src/main/host/handoff.js +11 -2
- package/src/main/host/runtime.js +272 -163
- package/src/main/host/session-history.js +54 -15
- package/src/main/native/icons.js +3 -2
- package/src/main/native/pets.js +234 -0
- package/src/main/native/protocol.js +197 -56
- package/src/main/protocol-core/projector.js +44 -41
- package/src/native-ui/desktop-control/dist/production-controller.d.ts.map +1 -1
- package/src/native-ui/desktop-control/dist/production-controller.js +1 -0
- package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -1
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/desktop-control/src/production-controller.ts +1 -0
- package/src/native-ui/desktop-control/test/production-controller.test.ts +1 -0
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +4 -2
- package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/shell.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/settings/skin-market.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/settings/skin-market.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/settings/skin-runtime.d.ts +31 -0
- package/src/native-ui/renderer-extension/dist/types/settings/skin-runtime.d.ts.map +1 -0
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/package.json +1 -1
- package/src/native-ui/renderer-extension/src/agent-selection-state.ts +16 -0
- package/src/native-ui/renderer-extension/src/assets.d.ts +5 -0
- package/src/native-ui/renderer-extension/src/renderer-agent-icon.ts +5 -4
- package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +1 -0
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +9 -6
- package/src/native-ui/renderer-extension/src/renderer-harness-handoff.ts +2 -2
- package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +2 -0
- package/src/native-ui/renderer-extension/src/renderer-settings-lifecycle.ts +2 -0
- package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +1 -0
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +2 -0
- package/src/native-ui/renderer-extension/src/settings/icons.ts +6 -0
- package/src/native-ui/renderer-extension/src/settings/localization.ts +4 -2
- package/src/native-ui/renderer-extension/src/settings/pages.ts +5 -2
- package/src/native-ui/renderer-extension/src/settings/shell.ts +3 -2
- package/src/native-ui/renderer-extension/src/settings/skin-market.css +213 -0
- package/src/native-ui/renderer-extension/src/settings/skin-market.ts +174 -0
- package/src/native-ui/renderer-extension/src/settings/skin-runtime.ts +399 -0
- package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +2 -1
- package/src/native-ui/renderer-extension/test/settings/localization.test.ts +11 -1
- package/src/native-ui/renderer-extension/test/settings/shell.test.ts +3 -0
- package/src/native-ui/renderer-extension/test/settings/skin-runtime.test.ts +136 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts +7 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts.map +1 -1
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.js +3 -0
- package/src/native-ui/shared-contracts/dist/thread-harness-switch.js.map +1 -1
- package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/shared-contracts/src/thread-harness-switch.ts +3 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Asset licenses
|
|
2
|
+
|
|
3
|
+
Original artwork shipped in the built-in Codex Styler themes is distributed
|
|
4
|
+
under Creative Commons Attribution 4.0 International (CC BY 4.0).
|
|
5
|
+
|
|
6
|
+
| Asset | Origin | Dimensions | License |
|
|
7
|
+
| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -----------------------------------------------------: | ----------------------------------------- |
|
|
8
|
+
| Codex Styler CS orbit logo, dark and light appearances | Generated specifically for this project, 2026-07-16 | 1254×1254 sources; platform exports generated by Tauri | CC BY 4.0 |
|
|
9
|
+
| Nocturne Studio background | Generated specifically for this project, 2026-07-16 | 1600×1000 | CC BY 4.0 |
|
|
10
|
+
| Quiet Garden background | Generated specifically for this project, 2026-07-16 | 1600×1000 | CC BY 4.0 |
|
|
11
|
+
| Gilded Grandeur background | Generated specifically for this project with the built-in image generation workflow, 2026-07-17 | 1586×992 | CC BY 4.0 |
|
|
12
|
+
| Merry Big Top background | Generated specifically for this project with the built-in image generation workflow, 2026-07-17 | 1586×992 | CC BY 4.0 |
|
|
13
|
+
| Moss chameleon calibrated direction atlas | Generated specifically for this project; non-linear direction calibration, shared cropping, chroma-key removal, and exact-alpha WebP encoding, 2026-07-16 | 181 frames across 4 pages | CC BY 4.0 |
|
|
14
|
+
| Pico parrot calibrated direction atlas | Generated specifically for this project; natural pose frames retained, background and watermark excluded, 2026-07-17 | 189 frames across 4 pages | CC BY 4.0 |
|
|
15
|
+
| Puddle frog calibrated direction atlas | Generated specifically for this project; natural pose frames retained, non-linear direction calibration, background and watermark excluded, 2026-07-17 | 211 frames across 5 pages | CC BY 4.0 |
|
|
16
|
+
| Mochi cat calibrated direction atlas | Generated specifically for this project; adaptive matte, shared ground line, and seamless loop closure, 2026-07-17 | 175 frames across 4 pages | CC BY 4.0 |
|
|
17
|
+
| Token Thief calibrated direction atlas | User-provided generated video; dual-corner watermark exclusion, gray-speck cleanup, shared ground line, and non-linear direction calibration, 2026-07-17 | 101 frames across 3 pages | CC BY 4.0 |
|
|
18
|
+
| Reset God calibrated direction atlas | User-provided generated video; dual-corner watermark exclusion, gray-speck cleanup, shared ground line, and non-linear direction calibration, 2026-07-17 | 100 frames across 3 pages | CC BY 4.0 |
|
|
19
|
+
| README and desktop companion portraits | Representative frames derived from the six calibrated direction atlases; exact cell crop, normalized transparent canvas, and alpha cleanup, 2026-07-17 | 6 images at 480×480 | CC BY 4.0 |
|
|
20
|
+
| Codex Styler manager screenshots | Captured from the English manager UI in matching light and dark appearances, 2026-07-17 | 2 images at 1320×840 | CC BY 4.0 |
|
|
21
|
+
| Composer game object set | Generated specifically for Triple Drop, Capsule Crane, and Mission Map; chroma-key removal and lossless-alpha WebP encoding, 2026-07-20 | 4 transparent images at 160×160 | CC BY 4.0 |
|
|
22
|
+
| Composer Interactions documentation screenshots | Captured from the English manager and a live local Codex configuration session, 2026-07-20 | 1280×720 and 1474×538 WebP files | Documentation evidence; Codex UI excluded |
|
|
23
|
+
| Companion Creator H.264 test fixture | Synthetic half-second color-frame video generated specifically for local media decoding and E2E regression tests, 2026-07-17 | 160×90, 12 fps, 6 frames | CC BY 4.0 |
|
|
24
|
+
|
|
25
|
+
No source code, image, video, sprite, logo, or other asset from
|
|
26
|
+
Fei-Away/Codex-Dream-Skin or xplol/KaMenisACat is redistributed by this
|
|
27
|
+
repository. Those projects are implementation and style references only.
|
|
28
|
+
|
|
29
|
+
Documentation screenshots of themes applied to Codex Desktop are included to
|
|
30
|
+
demonstrate compatibility. Original Codex interface elements, product names,
|
|
31
|
+
and trademarks visible in those screenshots remain the property of their
|
|
32
|
+
respective owners and are not relicensed by this project. Codex Styler theme
|
|
33
|
+
artwork and companion artwork remain covered by the project asset license.
|
|
34
|
+
|
|
35
|
+
Asset dimensions, frame order, and replacement guidance are recorded in
|
|
36
|
+
[docs/assets-and-replacement.md](docs/assets-and-replacement.md).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Codex Styler
|
|
2
|
+
Copyright 2026 Codex Styler contributors
|
|
3
|
+
|
|
4
|
+
Codex Styler is an independent, unofficial project. It is not affiliated
|
|
5
|
+
with, endorsed by, or sponsored by OpenAI.
|
|
6
|
+
|
|
7
|
+
OpenAI and Codex are trademarks of OpenAI, L.L.C. Their names are used only
|
|
8
|
+
to describe compatibility with the OpenAI Codex Desktop application.
|
|
9
|
+
|
|
10
|
+
Third-party dependency notices and the release inventory policy are recorded
|
|
11
|
+
in THIRD_PARTY_NOTICES.md.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# 视觉素材来源与再分发状态
|
|
2
|
+
|
|
3
|
+
本表记录当前仓库能够证明的事实与项目所有者作出的发布决定。Git 历史能证明文件何时进入仓库,不能单独证明原始作者、生成工具、授权链或再分发许可。
|
|
4
|
+
|
|
5
|
+
`node scripts/check-asset-provenance.mjs --check` 校验清单完整性。公开发布前必须运行 `node scripts/check-asset-provenance.mjs --release`;它接受「已验证可公开再分发」或「项目所有者确认公开发布」两种状态。后者表示项目所有者在知悉来源记录边界后明确接受公开发布风险,不等同于第三方法律意见或商业授权证明。
|
|
6
|
+
|
|
7
|
+
2026-07-17,项目所有者确认当时清单中的视觉素材可以随 `v5.2.1` 公开发布。2026-07-18,项目所有者提供两张当前 Mac 的 Codex 真机截图,并明确要求更新到 GitHub 项目介绍区;同日提供两张悟空主题生成图,明确要求制作成内置预设并公开发布。2026-08-11,项目所有者提供一张当前 Mac 的 WorkBuddy 真机截图(Miku 488137 主题),并明确要求补充到 GitHub 项目介绍区开头。2026-08-23,项目所有者提供一张 HeiGe 皮肤启动器 5.5.15 真机截图,并明确要求放入 GitHub 介绍页面作为更新声明。后续新增素材仍须逐项登记,未经验证或所有者确认的状态继续阻断 Release。
|
|
8
|
+
|
|
9
|
+
| 仓库路径 | 用途 | 已知创建或来源证据 | 已知许可 | 再分发状态 | 替换行动 |
|
|
10
|
+
| --- | --- | --- | --- | --- | --- |
|
|
11
|
+
| `assets/miku-character.png` | Miku 主题角色图层 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
12
|
+
| `assets/launcher/miku-launcher-icon.png` | macOS 启动器图标母版 | 2026-08-19 按项目所有者要求,以 `assets/miku-character.png` 为参考经图像生成工具编辑衍生 | 未知,继承角色源图未验证的授权状态 | 项目所有者确认公开发布 | 公开分发前补齐角色及源图授权,或替换为原创素材 |
|
|
13
|
+
| `assets/launcher/AppIcon.icns` | macOS 启动器 Bundle 图标 | 2026-08-19 由 `assets/launcher/miku-launcher-icon.png` 的标准尺寸 iconset 确定性衍生 | 未知,继承图标母版与角色源图未验证的授权状态 | 项目所有者确认公开发布 | 与图标母版同步替换或补齐权利记录 |
|
|
14
|
+
| `assets/launcher/LauncherLogo.png` | macOS 启动器窗口内置 Logo | 2026-08-21 按项目所有者要求,以 `assets/miku-character.png` 中的核心人物为参考,经图像生成工具重构为正方形上半身构图 | 未知,继承角色源图未验证的授权状态 | 项目所有者确认公开发布 | 公开分发前补齐角色及源图授权,或替换为原创素材 |
|
|
15
|
+
| `assets/miku-full-canvas.png` | Miku 主题完整画布 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
16
|
+
| `assets/miku-hero.png` | Miku 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
17
|
+
| `assets/miku-polaroid.png` | Miku 主题拍立得装饰 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
18
|
+
| `assets/miku-portrait-reference.png` | Miku 主题肖像参考 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐可核验来源或替换 |
|
|
19
|
+
| `assets/miku-reference.png` | Miku 主题构图参考 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐可核验来源或替换 |
|
|
20
|
+
| `assets/miku-sidebar-wash.png` | Miku 主题侧栏纹理 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
21
|
+
| `assets/previews/genshin-impact-codex-ui-1.webp` | Genshin 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
22
|
+
| `assets/previews/genshin-impact-codex-ui-2.webp` | Genshin 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
23
|
+
| `assets/previews/love-and-deepspace-codex-ui-1.webp` | Love and Deepspace 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
24
|
+
| `assets/previews/love-and-deepspace-codex-ui-2.webp` | Love and Deepspace 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
25
|
+
| `assets/previews/miku-studio.webp` | Miku Studio 预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
26
|
+
| `assets/previews/naruto-codex-ui-1.webp` | Naruto 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
27
|
+
| `assets/previews/naruto-codex-ui-2.webp` | Naruto 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
28
|
+
| `assets/previews/wuthering-waves-codex-ui-1.webp` | Wuthering Waves 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
29
|
+
| `assets/previews/wuthering-waves-codex-ui-2.webp` | Wuthering Waves 预设预览 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补齐来源记录或替换预览 |
|
|
30
|
+
| `custom-pet/miku-future/spritesheet.webp` | Miku 宠物精灵图 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的精灵图 |
|
|
31
|
+
| `docs/images/appearance-theme-contrast.jpg` | 外观主题配色设置说明截图 | 仓库标注为运行截图,但原始采集与画面权利记录缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充自有截图与来源记录 |
|
|
32
|
+
| `docs/images/dalao-live.jpg` | 大佬点烟主题运行截图 | 仓库标注为运行截图,但原始采集与画面权利记录缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充自有截图与来源记录 |
|
|
33
|
+
| `docs/images/genshin-dawn-live.jpg` | Genshin Dawn 运行截图 | 仓库标注为运行截图,但原始采集与画面权利记录缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充自有截图与来源记录 |
|
|
34
|
+
| `docs/images/genshin-night-live.jpg` | Genshin Night 运行截图 | 仓库标注为运行截图,但原始采集与画面权利记录缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充自有截图与来源记录 |
|
|
35
|
+
| `docs/images/macos-launcher-5.5.15-live.webp` | HeiGe 皮肤启动器 5.5.15 真机截图 | 项目所有者于 2026-08-23 提供当前 Mac 启动器 PNG,并明确要求发布到 GitHub 介绍页面作为更新声明;仓库保存压缩 WebP | 截图内第三方角色、标识及应用图标的权利不随截图转移 | 项目所有者确认公开发布 | 保留原始截图与本条提供记录 |
|
|
36
|
+
| `docs/images/theme-center-live.webp` | HeiGe 主题中心运行截图 | 项目所有者于 2026-07-18 提供当前 Mac 真机 PNG,并明确要求发布到 GitHub;仓库保存压缩 WebP | 截图内第三方角色、标识及界面元素的权利不随截图转移 | 项目所有者确认公开发布 | 保留原始截图与本条提供记录 |
|
|
37
|
+
| `docs/images/theme-switcher-live.webp` | Miku 主题及顶部切换入口运行截图 | 项目所有者于 2026-07-18 提供当前 Mac 真机 PNG,并明确要求发布到 GitHub;仓库保存压缩 WebP | 截图内第三方角色、标识及界面元素的权利不随截图转移 | 项目所有者确认公开发布 | 保留原始截图与本条提供记录 |
|
|
38
|
+
| `docs/images/wechat-group-qr.png` | 微信交流群二维码 | 项目所有者于 2026-07-18 提供当前个人微信二维码 PNG,并明确要求替换 GitHub 项目介绍图片 | 个人头像、昵称及二维码由项目所有者提供 | 项目所有者确认公开发布 | 保留本条提供记录;二维码失效时及时替换 |
|
|
39
|
+
| `docs/images/workbuddy-miku-live.webp` | WorkBuddy 换肤运行截图(Miku 488137 主题) | 项目所有者于 2026-08-11 提供当前 Mac WorkBuddy 真机 PNG,并明确要求补充到 GitHub 项目介绍区开头;仓库保存压缩 WebP | 截图内第三方角色、标识及界面元素的权利不随截图转移 | 项目所有者确认公开发布 | 保留原始截图与本条提供记录 |
|
|
40
|
+
| `docs/images/wuthering-live.jpg` | Wuthering Waves 主题运行截图 | 仓库标注为运行截图,但原始采集与画面权利记录缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充自有截图与来源记录 |
|
|
41
|
+
| `themes/dalao-dianyan/hero.webp` | Dalao Dianyan 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充人物及图像权利记录 |
|
|
42
|
+
| `themes/deepspace-dawn/hero.webp` | Deepspace Dawn 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
43
|
+
| `themes/deepspace-star/hero.webp` | Deepspace Star 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
44
|
+
| `themes/dragonball-nimbus/hero.webp` | 龙珠筋斗云主题主视觉 | 项目所有者于 2026-07-18 提供生成 PNG,并明确要求制作预设后公开发布;仓库保存压缩 WebP | 画面含第三方角色形象,项目未取得可独立核验的第三方授权文件 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的原创角色素材 |
|
|
45
|
+
| `themes/dragonball-super-saiyan/hero.webp` | 龙珠超级赛亚人主题主视觉 | 项目所有者于 2026-07-18 提供生成 PNG,并明确要求制作预设后公开发布;仓库保存压缩 WebP | 画面含第三方角色形象,项目未取得可独立核验的第三方授权文件 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的原创角色素材 |
|
|
46
|
+
| `themes/genshin-dawn/hero.webp` | Genshin Dawn 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
47
|
+
| `themes/genshin-night/hero.webp` | Genshin Night 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
48
|
+
| `themes/miku-488137/hero.webp` | Miku 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
49
|
+
| `themes/miku-488137/logo.webp` | Miku 主题 Logo | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续补充标识来源或替换 |
|
|
50
|
+
| `themes/miku-488137/polaroid.webp` | Miku 主题拍立得装饰 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
51
|
+
| `themes/naruto-hokage/hero.webp` | Naruto Hokage 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
52
|
+
| `themes/naruto-sasuke/hero.webp` | Naruto Sasuke 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
53
|
+
| `themes/wuthering-echo/hero.webp` | Wuthering Echo 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
54
|
+
| `themes/wuthering-tide/hero.webp` | Wuthering Tide 主题主视觉 | 来源证据缺失,授权未验证 | 未知 | 项目所有者确认公开发布 | 后续可替换为权利记录更完整的素材 |
|
|
55
|
+
|
|
56
|
+
MIT 许可证只适用于软件代码,不自动改变第三方可能拥有的素材权利。项目所有者确认发布表示接受当前发布决定及其风险。新增、替换或删除图片后,必须运行 `node scripts/check-asset-provenance.mjs --check`,并在同一变更中同步本表。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 软件许可、视觉素材与商标
|
|
2
|
+
|
|
3
|
+
本仓库是非官方项目,与 OpenAI、Crypton Future Media、miHoYo/HoYoverse、Kuro Games、Shueisha、Papergames 及其合作方不存在隶属、认可或背书关系。
|
|
4
|
+
|
|
5
|
+
MIT License 只覆盖本仓库的软件代码,不自动覆盖图片、角色设计、人物肖像、商标、截图或其他第三方内容。免责声明、「仅供学习」「非商业用途」「粉丝作品」「来自网络」或「AI 生成」等表述,不会产生授权,也不会替代原作者、肖像权人或商标权人的许可。
|
|
6
|
+
|
|
7
|
+
当前视觉素材的逐项证据与处置状态见 `ASSET_PROVENANCE.md`。部分素材缺少完整来源记录,公开打包、Release 和再分发仍有发布风险。项目所有者已在知悉该边界后确认随 `v5.2.1` 公开发布;该确认不构成对第三方权利的法律判断。使用者在复制、修改或再次分发这些素材前,应自行评估并取得所需权利。
|
|
8
|
+
|
|
9
|
+
Hatsune Miku(初音未来)、Genshin Impact(原神)、Wuthering Waves(鸣潮)、Naruto(火影忍者)、Love and Deepspace(恋与深空)及相关名称、角色设计和标识归各自权利人所有。提及这些名称只用于描述现有预设,不表示获得许可。
|
|
10
|
+
|
|
11
|
+
## English summary
|
|
12
|
+
|
|
13
|
+
The MIT License covers software code only. It does not grant permission to copy or redistribute bundled artwork, screenshots, likenesses, character designs, or trademarks. The project owner has explicitly accepted the documented provenance risk for the v5.2.1 public release. See `ASSET_PROVENANCE.md` before further redistribution.
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "dalao-dianyan",
|
|
4
|
+
"name": "大佬 · 点烟",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 8 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#e09a52",
|
|
10
|
+
"secondary": "#9aa3b0",
|
|
11
|
+
"surface": "#111111",
|
|
12
|
+
"text": "#f2e8da"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "deepspace-dawn",
|
|
4
|
+
"name": "恋与深空 · 晨曦",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "light",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 8 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#8f7fe8",
|
|
10
|
+
"secondary": "#f097c8",
|
|
11
|
+
"surface": "#f6f2fb",
|
|
12
|
+
"text": "#4a4668"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "deepspace-star",
|
|
4
|
+
"name": "恋与深空 · 星辰",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 8 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#9d8bff",
|
|
10
|
+
"secondary": "#f097c8",
|
|
11
|
+
"surface": "#201a40",
|
|
12
|
+
"text": "#e8e2ff"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "dragonball-nimbus",
|
|
4
|
+
"name": "龙珠 · 筋斗云",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "light",
|
|
7
|
+
"previewFocus": { "x": 72, "y": 24 },
|
|
8
|
+
"thumbnailFocus": { "x": 66, "y": 31 },
|
|
9
|
+
"thumbnailZoom": 350,
|
|
10
|
+
"colors": {
|
|
11
|
+
"accent": "#4FC3F7",
|
|
12
|
+
"secondary": "#F6C445",
|
|
13
|
+
"surface": "#F3F7FF",
|
|
14
|
+
"text": "#14213D"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "dragonball-super-saiyan",
|
|
4
|
+
"name": "龙珠 · 超级赛亚人",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "light",
|
|
7
|
+
"previewFocus": { "x": 67, "y": 3 },
|
|
8
|
+
"thumbnailFocus": { "x": 67, "y": 15 },
|
|
9
|
+
"thumbnailZoom": 400,
|
|
10
|
+
"colors": {
|
|
11
|
+
"accent": "#F5C451",
|
|
12
|
+
"secondary": "#52C7F2",
|
|
13
|
+
"surface": "#FFF8E8",
|
|
14
|
+
"text": "#282033"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "genshin-dawn",
|
|
4
|
+
"name": "原神 · 晨曦",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "light",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 24 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#5b7fd6",
|
|
10
|
+
"secondary": "#e0aa3e",
|
|
11
|
+
"surface": "#f2f1fb",
|
|
12
|
+
"text": "#2c3a6b"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "genshin-night",
|
|
4
|
+
"name": "原神 · 星夜",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 17 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#e0b458",
|
|
10
|
+
"secondary": "#7a86d8",
|
|
11
|
+
"surface": "#171a2e",
|
|
12
|
+
"text": "#f0e6c8"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "miku-488137",
|
|
4
|
+
"name": "Miku 488137",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "light",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 33 },
|
|
8
|
+
"logo": "logo.webp",
|
|
9
|
+
"polaroid": "polaroid.webp",
|
|
10
|
+
"colors": {
|
|
11
|
+
"accent": "#19c9e5",
|
|
12
|
+
"secondary": "#ed6ec1",
|
|
13
|
+
"surface": "#f5f6fc",
|
|
14
|
+
"text": "#122c60"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "naruto-hokage",
|
|
4
|
+
"name": "火影 · 鸣人",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 27 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#f2801e",
|
|
10
|
+
"secondary": "#ffd166",
|
|
11
|
+
"surface": "#17110b",
|
|
12
|
+
"text": "#ffe3c2"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "naruto-sasuke",
|
|
4
|
+
"name": "火影 · 佐助",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 24 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#d8443c",
|
|
10
|
+
"secondary": "#7fb3ff",
|
|
11
|
+
"surface": "#171019",
|
|
12
|
+
"text": "#ffd9d2"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "wuthering-echo",
|
|
4
|
+
"name": "鸣潮 · 共鸣",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 27 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#56e0d8",
|
|
10
|
+
"secondary": "#a98fe8",
|
|
11
|
+
"surface": "#16121f",
|
|
12
|
+
"text": "#e4def2"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "wuthering-tide",
|
|
4
|
+
"name": "鸣潮 · 声骸",
|
|
5
|
+
"hero": "hero.webp",
|
|
6
|
+
"appearance": "dark",
|
|
7
|
+
"previewFocus": { "x": 50, "y": 30 },
|
|
8
|
+
"colors": {
|
|
9
|
+
"accent": "#3fd6d0",
|
|
10
|
+
"secondary": "#9aa8b0",
|
|
11
|
+
"surface": "#0d1418",
|
|
12
|
+
"text": "#d8eef0"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const { nativeAcp } = require('./native-acp');
|
|
2
|
+
|
|
3
|
+
// Cline CLI 官方 ACP 入口:`cline --acp`(apps/cli/src/acp/acpAgent.ts)。
|
|
4
|
+
// 已核对的协议事实(决定下面的诚实能力声明):
|
|
5
|
+
// - initialize 声明 loadSession: true、promptCapabilities.image: true;
|
|
6
|
+
// session/new 与 session/load 都返回 modes(plan/act)、models 与
|
|
7
|
+
// configOptions(provider/model/mode/autoApprove),并支持 session/set_model、
|
|
8
|
+
// session/set_mode、session/set_config_option → models / permissionModes /
|
|
9
|
+
// resume / attachments 为真。
|
|
10
|
+
// - 事件投影只有 agent_message_chunk / agent_thought_chunk / tool_call /
|
|
11
|
+
// tool_call_update(rawOutput),没有 plan 条目、diff 内容块或 usage_update
|
|
12
|
+
// → plan / nativeDiff / usage / contextUsage 不声明。
|
|
13
|
+
// - 审批走标准 session/request_permission(allow_once/allow_always/reject_once),
|
|
14
|
+
// 没有独立提问请求 → questions 不声明(提问会作为审批选项出现)。
|
|
15
|
+
// - configOptions 不含 effortLevel/thought_level → thinkingLevels 不声明。
|
|
16
|
+
// - 无 session/fork 与 compact → fork / compaction 不声明。
|
|
17
|
+
module.exports = nativeAcp({
|
|
18
|
+
id: 'cline', name: 'Cline', aliases: ['cline-cli'], args: ['--acp'],
|
|
19
|
+
capabilities: { questions: false, thinkingLevels: false, plan: false, nativeDiff: false },
|
|
20
|
+
});
|
|
21
|
+
// Cline Skills:项目 `.cline/skills/` 与全局 `~/.cline/skills/`(docs/customization/skills)。
|
|
22
|
+
module.exports.manifest.integrations.skills = { global: ['.cline/skills'], project: ['.cline/skills'] };
|
|
@@ -2,6 +2,7 @@ const { execFile } = require('node:child_process');
|
|
|
2
2
|
const { CodexAppServer } = require('./codex-app-server');
|
|
3
3
|
const { cliSpawn } = require('../host/jsonl');
|
|
4
4
|
const { recordNative } = require('../harness-adapter/fixture-recorder');
|
|
5
|
+
const { codexErrorInfoKey } = require('../harness-adapter/error-kind');
|
|
5
6
|
|
|
6
7
|
const manifest = {
|
|
7
8
|
id: 'codex',
|
|
@@ -203,10 +204,13 @@ function projectNotification(message, session, emit) {
|
|
|
203
204
|
case 'configWarning':
|
|
204
205
|
emit({ kind: 'notice', level: 'warning', text: params.message, nativeRef });
|
|
205
206
|
break;
|
|
206
|
-
case 'error':
|
|
207
|
-
|
|
207
|
+
case 'error': {
|
|
208
|
+
// Codex 原生 CodexErrorInfo 随错误透传:分类与桌面原生错误 UX 都以它为准
|
|
209
|
+
const codexErrorInfo = codexErrorInfoKey(params.error?.codexErrorInfo);
|
|
210
|
+
if (!params.willRetry) emit({ kind: 'error', message: params.error?.message ?? 'Codex 回合失败', ...(codexErrorInfo ? { codexErrorInfo } : {}), nativeRef });
|
|
208
211
|
else emit({ kind: 'status', text: `Codex 正在重试:${params.error?.message ?? '请求失败'}`, nativeRef });
|
|
209
212
|
break;
|
|
213
|
+
}
|
|
210
214
|
case 'turn/completed': {
|
|
211
215
|
const turn = params.turn ?? {};
|
|
212
216
|
if (turn.usage || params.usage) {
|
|
@@ -226,7 +230,7 @@ function projectNotification(message, session, emit) {
|
|
|
226
230
|
break;
|
|
227
231
|
}
|
|
228
232
|
const failed = turn.status === 'failed';
|
|
229
|
-
if (failed) emit({ kind: 'error', message: turn.error?.message ?? 'Codex 回合失败', nativeRef: { ...nativeRef, checkpointId: turn.id } });
|
|
233
|
+
if (failed) emit({ kind: 'error', message: turn.error?.message ?? 'Codex 回合失败', ...(codexErrorInfoKey(turn.error?.codexErrorInfo) ? { codexErrorInfo: codexErrorInfoKey(turn.error?.codexErrorInfo) } : {}), nativeRef: { ...nativeRef, checkpointId: turn.id } });
|
|
230
234
|
else emit({
|
|
231
235
|
kind: 'completed', finalAnswer: turn.status === 'completed',
|
|
232
236
|
stopReason: turn.status === 'interrupted' ? 'cancelled' : 'completed',
|
|
@@ -334,11 +338,59 @@ function attachSession(host, nativeSessionId, { emit, diagnostic, model, effort,
|
|
|
334
338
|
return session;
|
|
335
339
|
}
|
|
336
340
|
|
|
341
|
+
// 官方 app-server 的两种权限序列化(实测 26.9.x):
|
|
342
|
+
// thread/start 与 thread/resume 的 sandbox 只接受 kebab-case 纯字符串;
|
|
343
|
+
// turn/start 的 sandboxPolicy 接受 camelCase type 的对象;approvalsReviewer 枚举有限定。
|
|
344
|
+
const SANDBOX_TO_KEBAB = { dangerFullAccess: 'danger-full-access', readOnly: 'read-only', workspaceWrite: 'workspace-write', 'danger-full-access': 'danger-full-access', 'read-only': 'read-only', 'workspace-write': 'workspace-write' };
|
|
345
|
+
const SANDBOX_TO_CAMEL = { dangerFullAccess: 'dangerFullAccess', readOnly: 'readOnly', workspaceWrite: 'workspaceWrite', externalSandbox: 'externalSandbox', 'danger-full-access': 'dangerFullAccess', 'read-only': 'readOnly', 'workspace-write': 'workspaceWrite' };
|
|
346
|
+
const REVIEWER_TO_WIRE = { user: 'user', auto_review: 'auto_review', guardian_subagent: 'guardian_subagent', guardian: 'guardian_subagent' };
|
|
347
|
+
|
|
348
|
+
function sandboxToKebabString(sandbox) {
|
|
349
|
+
if (sandbox == null) return null;
|
|
350
|
+
const raw = typeof sandbox === 'string' ? sandbox : sandbox.type;
|
|
351
|
+
return SANDBOX_TO_KEBAB[raw] ?? null;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function sandboxPolicyToCamelObject(sandbox) {
|
|
355
|
+
if (!sandbox || typeof sandbox !== 'object') return null;
|
|
356
|
+
const type = SANDBOX_TO_CAMEL[sandbox.type];
|
|
357
|
+
return type ? { ...sandbox, type } : null;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function reviewerToWire(reviewer) {
|
|
361
|
+
return typeof reviewer === 'string' ? REVIEWER_TO_WIRE[reviewer] ?? null : null;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const APP_SERVER_BUSY = /^Agent is already processing(?:\.|$)/i;
|
|
365
|
+
|
|
366
|
+
async function startTurnAfterNativeSettlement(host, params) {
|
|
367
|
+
// A queue-start can arrive immediately after turn/completed, while app-server is still
|
|
368
|
+
// clearing its active-turn slot. Keep the same logical Core turn and retry only this
|
|
369
|
+
// narrow transient; other errors must remain visible and must never be duplicated.
|
|
370
|
+
for (let attempt = 0, delay = 25; ; attempt++, delay *= 2) {
|
|
371
|
+
try {
|
|
372
|
+
return await host.request('turn/start', params);
|
|
373
|
+
} catch (error) {
|
|
374
|
+
if (!APP_SERVER_BUSY.test(String(error?.message ?? error)) || attempt >= 5) throw error;
|
|
375
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
337
380
|
function threadOptions(thread) {
|
|
381
|
+
// turnPermissions 来自 Desktop 权限菜单(thread/settings/update 或 thread/start 参数),
|
|
382
|
+
// 转发给原生 app-server 让显示选择与实际生效一致;permissions 优先级高于旧 permissionMode 档案
|
|
383
|
+
const perms = thread.options?.turnPermissions ?? {};
|
|
384
|
+
const sandbox = sandboxToKebabString(perms.sandboxPolicy);
|
|
385
|
+
const approvalsReviewer = reviewerToWire(perms.approvalsReviewer);
|
|
338
386
|
return {
|
|
339
387
|
cwd: thread.cwd,
|
|
340
388
|
...(thread.options?.model?.id ? { model: thread.options.model.id } : {}),
|
|
341
|
-
...(
|
|
389
|
+
...(perms.approvalPolicy ? { approvalPolicy: perms.approvalPolicy } : {}),
|
|
390
|
+
...(approvalsReviewer ? { approvalsReviewer } : {}),
|
|
391
|
+
...(sandbox ? { sandbox } : {}),
|
|
392
|
+
...(perms.permissions ? { permissions: perms.permissions } : {}),
|
|
393
|
+
...(thread.options?.permissionMode && thread.options.permissionMode !== 'default' && !perms.permissions ? { permissions: thread.options.permissionMode } : {}),
|
|
342
394
|
};
|
|
343
395
|
}
|
|
344
396
|
|
|
@@ -361,11 +413,22 @@ function create() {
|
|
|
361
413
|
try {
|
|
362
414
|
const servers = require('./managed-mcp').namedServers(managedMcp, collaboration);
|
|
363
415
|
const options = { ...threadOptions(thread), ...(Object.keys(servers).length ? { config: Object.fromEntries(Object.entries(servers).map(([name, value]) => [`mcp_servers.${name}`, value])) } : {}) };
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
416
|
+
let result;
|
|
417
|
+
if (thread.restore) {
|
|
418
|
+
// 旧版 app-server 可能拒绝 resume 上的权限覆盖字段:降级重试不阻塞会话恢复
|
|
419
|
+
try {
|
|
420
|
+
result = await host.request('thread/resume', { threadId: thread.nativeSessionId, ...options });
|
|
421
|
+
} catch (error) {
|
|
422
|
+
const { approvalPolicy, approvalsReviewer, sandbox, ...fallback } = options;
|
|
423
|
+
if (approvalPolicy === undefined && sandbox === undefined && approvalsReviewer === undefined) throw error;
|
|
424
|
+
result = await host.request('thread/resume', { threadId: thread.nativeSessionId, ...fallback });
|
|
425
|
+
}
|
|
426
|
+
} else {
|
|
427
|
+
result = await host.request('thread/start', options);
|
|
428
|
+
}
|
|
367
429
|
const model = { id: result.model, name: result.model, provider: result.modelProvider ?? 'openai' };
|
|
368
430
|
const session = attachSession(host, result.thread.id, { emit, diagnostic, model, effort: result.reasoningEffort, cwd: thread.cwd });
|
|
431
|
+
session.turnPermissions = thread.options?.turnPermissions ?? null;
|
|
369
432
|
session.collaborationEnabled = !!collaboration;
|
|
370
433
|
emit({ kind: 'session', nativeSessionId: result.thread.id, model });
|
|
371
434
|
return session;
|
|
@@ -386,11 +449,18 @@ function create() {
|
|
|
386
449
|
...(prompt ? [{ type: 'text', text: prompt }] : []),
|
|
387
450
|
...(attachments?.images ?? []).map((a) => ({ type: 'image', url: `data:${a.mime};base64,${a.data}` })),
|
|
388
451
|
];
|
|
389
|
-
|
|
452
|
+
// 回合级权限覆盖优先于线程级(Desktop 每个回合都可能推送最新选择)
|
|
453
|
+
const perms = attachments?.turnPermissions ?? session.turnPermissions ?? {};
|
|
454
|
+
const sandboxPolicy = sandboxPolicyToCamelObject(perms.sandboxPolicy);
|
|
455
|
+
const approvalsReviewer = reviewerToWire(perms.approvalsReviewer);
|
|
456
|
+
const result = await startTurnAfterNativeSettlement(session.host, {
|
|
390
457
|
threadId: session.nativeSessionId,
|
|
391
458
|
input,
|
|
392
459
|
...(session.model?.id ? { model: session.model.id } : {}),
|
|
393
460
|
...(session.state.effort ? { effort: session.state.effort } : {}),
|
|
461
|
+
...(perms.approvalPolicy ? { approvalPolicy: perms.approvalPolicy } : {}),
|
|
462
|
+
...(approvalsReviewer ? { approvalsReviewer } : {}),
|
|
463
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
394
464
|
});
|
|
395
465
|
session.state.nativeTurnId = result.turn.id;
|
|
396
466
|
} catch (error) {
|
|
@@ -14,12 +14,13 @@ const zcode = require('./zcode');
|
|
|
14
14
|
const trae = require('./trae');
|
|
15
15
|
const kiro = require('./kiro');
|
|
16
16
|
const cursor = require('./cursor');
|
|
17
|
+
const cline = require('./cline');
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Adapter 注册表(借鉴 codex-host 插件结构:Manifest + 工厂 + Adapter + Session)。
|
|
20
21
|
* 新增 Harness 时:实现同形状模块并加入此列表,Renderer 无需改动协议。
|
|
21
22
|
*/
|
|
22
|
-
const REGISTRY = [antigravity, pi, omp, dsh, claude, codex, opencode, grok, openclaw, hermes, qoder, codebuddy, zcode, trae, kiro, cursor];
|
|
23
|
+
const REGISTRY = [antigravity, pi, omp, dsh, claude, codex, opencode, grok, openclaw, hermes, qoder, codebuddy, zcode, trae, kiro, cursor, cline];
|
|
23
24
|
|
|
24
25
|
function buildAdapters(emit) {
|
|
25
26
|
return REGISTRY.map(({ manifest, create }) => {
|
|
@@ -13,6 +13,7 @@ function nativeCommand(id, argv) {
|
|
|
13
13
|
'kiro-cli': ['kiro-cli', 'HARNESS_MIX_KIRO_EXECUTABLE', 'https://kiro.dev/docs/cli/'],
|
|
14
14
|
qoder: ['qodercli', 'HARNESS_MIX_QODER_EXECUTABLE', 'https://docs.qoder.com/cli/acp'],
|
|
15
15
|
trae: ['traecli', 'HARNESS_MIX_TRAE_EXECUTABLE', 'https://github.com/bytedance/trae-agent'],
|
|
16
|
+
cline: ['cline', 'HARNESS_MIX_CLINE_EXECUTABLE', 'https://docs.cline.bot/usage/cli-overview'],
|
|
16
17
|
zcode: ['zcode-acp-server', 'HARNESS_MIX_ZCODE_ACP_EXECUTABLE', 'https://zcode.z.ai/'],
|
|
17
18
|
};
|
|
18
19
|
if (!specs[id]) throw new Error(`Unknown native CLI: ${id}`);
|