freecodego 0.1.6-alpha.2.4 → 0.1.7-alpha.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/freecodego/bundle-latest/README.md
5
- README.md: a55282f22dea6b39738bf359c0aa3942ae935bc9
6
- README.zh.md: 6892acf2dc9a8ef0ccdc5f88b482d335f113320a
5
+ README.md: 0b00540c87ee0781c697d407579b7c2617190d21
6
+ README.zh.md: 9be8ba5e80b702e0f0b442933b0e35a9643e073d
package/README.md CHANGED
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
9
9
 
10
10
  ## Summary
11
11
 
12
- Installable single-package FreeCodeGo composition for DeepSeek Harness `freecodego@0.1.6-alpha.2`, targeting Harness baseline `0.1.6-alpha.2`. The npm artifact contains the compiled Host plugin, browser client, session-event prerequisite, native worker entrypoints, and the bundled Harness Agent Teams composition. A release publishes on npm's `next` dist-tag, and its plugin version intentionally matches the Harness version it targets exactly; for a reproducible install, name the version (`freecodego@0.1.6-alpha.2`) instead of the channel. Official Codex and Claude runtime binaries remain optional platform downloads — the package does not embed every platform's native binary.
12
+ Installable single-package FreeCodeGo composition for DeepSeek Harness `freecodego@0.1.7-alpha.2.1`, targeting Harness baseline `0.1.7-alpha.2`. The npm artifact contains the compiled Host plugin, browser client, session-event prerequisite, native worker entrypoints, and the bundled Harness Agent Teams composition. A release publishes on npm's `next` dist-tag, and its plugin version intentionally matches the Harness version it targets exactly; for a reproducible install, name the version (`freecodego@0.1.7-alpha.2`) instead of the channel. Official Codex and Claude runtime binaries remain optional platform downloads — the package does not embed every platform's native binary.
13
13
 
14
14
  ## Table of Contents
15
15
 
@@ -18,6 +18,7 @@ Installable single-package FreeCodeGo composition for DeepSeek Harness `freecode
18
18
  - [Code Review](#code-review)
19
19
  - [Project Memory](#project-memory)
20
20
  - [Agent Teams](#agent-teams)
21
+ - [Image and Video Generation](#image-and-video-generation)
21
22
  - [Model Experience](#model-experience)
22
23
  - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
23
24
  - [Dev Note](#dev-note)
@@ -31,10 +32,10 @@ Install the release for the Harness baseline you run; each release carries one t
31
32
 
32
33
  ```sh
33
34
  dsh plugin --profile web add --save-exact \
34
- https://github.com/XiangSu-ce/dsh-plugin-freecodego/releases/download/freecodego-v0.1.6-alpha.2/freecodego-0.1.6-alpha.2.tgz
35
+ https://github.com/XiangSu-ce/dsh-plugin-freecodego/releases/download/freecodego-v0.1.7-alpha.2.1/freecodego-0.1.7-alpha.2.tgz
35
36
  ```
36
37
 
37
- `freecodego-0.1.6-alpha.2.tgz` is the bundle for Harness `0.1.6-alpha.2`: substitute the version you run, which the settings page shows beside the installed plugin version. The asset name is the naming contract in `packages/freecodego/AGENTS.md`.
38
+ `freecodego-0.1.7-alpha.2.tgz` is the bundle for Harness `0.1.7-alpha.2`: substitute the version you run, which the settings page shows beside the installed plugin version. The asset name is the naming contract in `packages/freecodego/AGENTS.md`.
38
39
 
39
40
  The `dsh` command is provided by the Harness CLI, not this bundle. In a normal terminal install it first with `npm install --global @deepseek-ai/dsh` (and ensure `pnpm` is available). Desktop launches the same command through its private shims and passes the active `DSH_HOME`, so Web and Desktop use one Profile data directory when they select the same Harness home.
40
41
 
@@ -57,9 +58,9 @@ Every free row below comes from the provider's own directory, read when you open
57
58
 
58
59
  | Provider | Free models | Directory |
59
60
  |---|---|---|
60
- | **OpenCode** | `big-pickle`, `deepseek-v4-flash-free`, `jev-1.13-free`, `ling-3.0-flash-fin-free`, `mimo-v2.5-free`, `mimo-v2.6-flash-free`, `muse-spark-1.2`, `muse-spark-1.2-contributor-free`, `muse-spark-1.3`, `muse-spark-1.3-contributor-free`, `nemotron-3-ultra-free`, `nemotron-3.5-lightning-free` | 12 of 76 rows; public, no sign-in |
61
- | **Kilo** | `cohere/north-mini-code:free`, `dots-studio/dots-3-note-preview:free`, `inclusionai/ling-3.0-flash-fin:free`, `inclusionai/ling-3.0-flash-sante:free`, `inclusionai/ling-3.0-flash-vl:free`, `kilo-auto/free`, `liquid/lfm-2.5-2.6b:free`, `nex-agi/nex-n2.5-mini:free`, `nex-agi/nex-n2.5-pro:free`, `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free`, `nvidia/nemotron-3-super-120b-a12b:free`, `nvidia/nemotron-3-ultra-550b-a55b:free`, `nvidia/nemotron-3.5-content-safety:free`, `nvidia/nemotron-3.5-lightning:free`, `openrouter/free`, `poolside/laguna-s-2.1:free`, `poolside/laguna-xs-2.1:free`, `qwen/qwen3.8-27b:free`, `stepfun/step-3.7-flash:free`, `thinkingmachines/inkling-small:free`, `z-ai/glm-5.2:free` | 21 of 385 rows; public, 200 requests/hour per egress IP |
62
- | **Logfare** | chat `deepseek-v3.2`, `deepseek-v4-pro-0813`, `gemma-4-26b`, `gemma-4-31b-it`, `glm-5`, `glm-5.3`, `glm-5.3-flash`, `grok-4.6`, `kimi-k2.5`, `kimi-k2.6`, `kimi-k2.7-code`, `logfare/auto`, `moondream3.1`, `qwen-3.8-27b`, `step-3.7-flash`; images `flux-1-schnell`, `flux-2-dev`, `flux-2-klein-4b`, `flux-2-klein-9b`, `sdxl-lightning`; audio `melotts`, `whisper-large-v3-turbo`; other routes `aura-2-en`, `lucid-origin`, `nova-3`, `phoenix-1.0` | 26 rows; 18 need a training-data opt-in, the other 8 do not |
61
+ | **OpenCode** | `big-pickle`, `deepseek-v4-flash-free`, `jev-1.13-free`, `ling-3.0-flash-fin-free`, `mimo-v2.5-free`, `mimo-v2.6-flash-free`, `muse-spark-1.2`, `muse-spark-1.2-contributor-free`, `muse-spark-1.3`, `muse-spark-1.3-contributor-free`, `nemotron-3-ultra-free`, `nemotron-3.5-lightning-free`, `space-bunny-free` | 13 of 80 rows; public, no sign-in |
62
+ | **Kilo** | `cohere/north-mini-code:free`, `dots-studio/dots-3-note-preview:free`, `inclusionai/ling-3.0-flash-fin:free`, `inclusionai/ling-3.0-flash-sante:free`, `inclusionai/ling-3.0-flash-vl:free`, `kilo-auto/free`, `liquid/lfm-2.5-2.6b:free`, `nex-agi/nex-n2.5-mini:free`, `nex-agi/nex-n2.5-pro:free`, `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free`, `nvidia/nemotron-3-super-120b-a12b:free`, `nvidia/nemotron-3-ultra-550b-a55b:free`, `nvidia/nemotron-3.5-content-safety:free`, `nvidia/nemotron-3.5-lightning:free`, `openrouter/free`, `poolside/laguna-s-2.1:free`, `poolside/laguna-xs-2.1:free`, `qwen/qwen3.8-27b:free`, `stepfun/step-3.7-flash:free`, `thinkingmachines/inkling-small:free`, `z-ai/glm-5.2:free` | 21 of 394 rows; public, 200 requests/hour per egress IP |
63
+ | **Logfare** | chat `claude-opus-4.6`, `deepseek-v3.2`, `deepseek-v4-pro-0813`, `gemma-4-26b`, `glm-5`, `glm-5.3`, `glm-5.3-flash`, `grok-4.6`, `kimi-k2.5`, `kimi-k2.6`, `kimi-k2.7-code`, `kimi-k3`, `logfare/auto`, `moondream3.1`, `qwen-3.8-27b`, `step-3.7-flash`; images `flux-1-schnell`, `flux-2-dev`, `flux-2-klein-4b`, `flux-2-klein-9b`, `sdxl-lightning`; audio `melotts`, `whisper-large-v3-turbo`; other routes `aura-2-en`, `lucid-origin`, `nova-3`, `phoenix-1.0` | 27 rows; 20 need a training-data opt-in, the other 7 do not |
63
64
  | **Qoder** | `Qwen 3.8 Flash` (route `qmodel_38flash`) | the free flash route, plus daily check-in campaigns |
64
65
  | **NVIDIA** | `google/gemma-4-31b-it`, `moonshotai/kimi-k3`, `z-ai/glm-5.3`, `z-ai/glm-5.3-flash` — the roster also names `deepseek-ai/deepseek-v4-flash-0731` and `deepseek-ai/deepseek-v4-pro-0813`, which are gone from NVIDIA's live catalogue of 82 rows | an API key is required to call them; cross-checked 2026-09-23 |
65
66
  | **SenseNova** | `deepseek-v4-flash`, `deepseek-v4-pro`, `glm-5.2`, `kimi-k3`, `sensenova-6.8-flash-lite` — 1M context and 128K output each | roster ships in the bundle; an API key is required |
@@ -74,7 +75,7 @@ These lists follow their directories: a route upstream retires leaves the table
74
75
 
75
76
  TRAE, Cline, WorkBuddy International, Agnes publish no stable roster, so their rows are counted when they arrive rather than listed here.
76
77
 
77
- 18 Logfare rows sit behind a training-data opt-in, which the picker labels rather than hides.
78
+ 20 Logfare rows sit behind a training-data opt-in, which the picker labels rather than hides.
78
79
 
79
80
  <!-- generated:free-models:end -->
80
81
 
@@ -95,6 +96,15 @@ Durable per-project memory ships with the bundle: recall is reviewed-only, injec
95
96
 
96
97
  The bundle enables Harness Agent Teams with same-engine child sessions. A DeepSeek parent creates DeepSeek teammates, a Codex parent creates Codex teammates, and a Claude parent creates Claude teammates; the child route is inherited from the parent session rather than selected from the process default. Team roster, mailbox, task-board, and teammate Session records remain owned by Harness. The Web Chat renders the live delegated-Agent progress tree inside the parent conversation, including each task label, current tool, status, and tool-use count.
97
98
 
99
+ <a id="image-and-video-generation"></a>
100
+ ## Image and Video Generation
101
+
102
+ The bundle registers image and video generation tools for DeepSeek, Codex, and Claude, and they read the model each category is configured to use at execution time rather than a pinned one. `mediaGenerationEnabled` (on by default) is the switch: with it off, `freecodego_generate_image`, `freecodego_generate_video`, and the legacy `agnes_generate_image` / `agnes_generate_video` names are **unregistered** — they leave the model's tool list instead of failing at call time — while `freecodego_generate_audio` and `freecodego_transcribe_audio` stay, since one writes a file into the active workspace and the other reads one out of it.
103
+
104
+ The route is chosen from the **provider**, never from a keyword in a model id. Image generation speaks the OpenAI Images contract (`/images/generations`, and `/images/edits` when source images are attached), Seedream's `image: [...]` fusion body, Gemini's `:generateContent`, Imagen's `:predict`, and DashScope's `multimodal-generation`. Video generation speaks nine: Kling's `text2video` / `image2video` / `multi-image2video`, Ark's `/contents/generations/tasks`, DashScope's asynchronous `video-synthesis`, MiniMax Hailuo's `/v2/video_generation`, Vidu's four `ent/v2` routes, Gemini's Veo `:predictLongRunning`, xAI's `/videos/generations` (with edits and extensions when a source video is given), OpenAI's `/videos`, and the gateway's portable shape for everything unrecognized.
105
+
106
+ The model roster is **live, not pinned**: candidates are collected per request from the Harness model directory, the managed catalog, Logfare, and Agnes, and a route's category is inferred from its id and can be overridden by hand in the settings page's model categories. Every call carries a per-route circuit breaker, and only a route's own problem falls through to the next one — a wrong credential or a refused prompt fails outright rather than paying for another attempt. The package README in `harness-plugin` carries the full table, including which providers accept a last frame and which durations each route can render.
107
+
98
108
  -----
99
109
 
100
110
  <a id="model-experience"></a>
package/README.zh.md CHANGED
@@ -9,7 +9,7 @@ kind: "package-bundle"
9
9
 
10
10
  ## 概述
11
11
 
12
- 面向 DeepSeek Harness `freecodego@0.1.6-alpha.2` 的可安装单包 FreeCodeGo 组合,目标 Harness 基线为 `0.1.6-alpha.2`。npm 产物包含编译后的 Host 插件、浏览器端 client、会话事件前置包、原生 worker 入口,以及随包交付的 Harness Agent Teams 组合。发布产物使用 npm 的 `next` dist-tag,且其插件版本刻意与所面向的 Harness 版本完全一致;需要可复现安装时请指定版本(`freecodego@0.1.6-alpha.2`),而不是渠道名。官方 Codex 与 Claude 运行时二进制仍按平台可选下载——本包不内嵌每个平台的原生二进制。
12
+ 面向 DeepSeek Harness `freecodego@0.1.7-alpha.2.1` 的可安装单包 FreeCodeGo 组合,目标 Harness 基线为 `0.1.7-alpha.2`。npm 产物包含编译后的 Host 插件、浏览器端 client、会话事件前置包、原生 worker 入口,以及随包交付的 Harness Agent Teams 组合。发布产物使用 npm 的 `next` dist-tag,且其插件版本刻意与所面向的 Harness 版本完全一致;需要可复现安装时请指定版本(`freecodego@0.1.7-alpha.2`),而不是渠道名。官方 Codex 与 Claude 运行时二进制仍按平台可选下载——本包不内嵌每个平台的原生二进制。
13
13
 
14
14
  ## 目录
15
15
 
@@ -18,6 +18,7 @@ kind: "package-bundle"
18
18
  - [代码审查](#code-review)
19
19
  - [项目记忆](#project-memory)
20
20
  - [Agent Teams](#agent-teams)
21
+ - [生图与视频生成](#image-and-video-generation)
21
22
  - [模型体验](#model-experience)
22
23
  - [已知限制与延期工作](#known-limitations-and-deferred-work)
23
24
  - [开发备注](#dev-note)
@@ -31,10 +32,10 @@ kind: "package-bundle"
31
32
 
32
33
  ```sh
33
34
  dsh plugin --profile web add --save-exact \
34
- https://github.com/XiangSu-ce/dsh-plugin-freecodego/releases/download/freecodego-v0.1.6-alpha.2/freecodego-0.1.6-alpha.2.tgz
35
+ https://github.com/XiangSu-ce/dsh-plugin-freecodego/releases/download/freecodego-v0.1.7-alpha.2.1/freecodego-0.1.7-alpha.2.tgz
35
36
  ```
36
37
 
37
- `freecodego-0.1.6-alpha.2.tgz` 就是面向 Harness `0.1.6-alpha.2` 的 bundle:请替换为你实际运行的版本,设置页会把它显示在已装插件版本旁边。资产名即 `packages/freecodego/AGENTS.md` 里的命名约定。
38
+ `freecodego-0.1.7-alpha.2.tgz` 就是面向 Harness `0.1.7-alpha.2` 的 bundle:请替换为你实际运行的版本,设置页会把它显示在已装插件版本旁边。资产名即 `packages/freecodego/AGENTS.md` 里的命名约定。
38
39
 
39
40
  `dsh` 命令由 Harness CLI 提供,不来自本 bundle。普通终端里请先用 `npm install --global @deepseek-ai/dsh` 安装它(并确保 `pnpm` 可用)。桌面端通过自己的私有 shim 运行同一条命令并传入当前 `DSH_HOME`,因此 Web 与桌面端选择同一个 Harness home 时共用同一份 Profile 数据目录。
40
41
 
@@ -57,9 +58,9 @@ gh workflow run release-freecodego.yml --ref freecodego-v<version>
57
58
 
58
59
  | 提供商 | 免费模型 | 目录 |
59
60
  |---|---|---|
60
- | **OpenCode** | `big-pickle`、`deepseek-v4-flash-free`、`jev-1.13-free`、`ling-3.0-flash-fin-free`、`mimo-v2.5-free`、`mimo-v2.6-flash-free`、`muse-spark-1.2`、`muse-spark-1.2-contributor-free`、`muse-spark-1.3`、`muse-spark-1.3-contributor-free`、`nemotron-3-ultra-free`、`nemotron-3.5-lightning-free` | 76 行中的 12 行;公开,无需登录 |
61
- | **Kilo** | `cohere/north-mini-code:free`、`dots-studio/dots-3-note-preview:free`、`inclusionai/ling-3.0-flash-fin:free`、`inclusionai/ling-3.0-flash-sante:free`、`inclusionai/ling-3.0-flash-vl:free`、`kilo-auto/free`、`liquid/lfm-2.5-2.6b:free`、`nex-agi/nex-n2.5-mini:free`、`nex-agi/nex-n2.5-pro:free`、`nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free`、`nvidia/nemotron-3-super-120b-a12b:free`、`nvidia/nemotron-3-ultra-550b-a55b:free`、`nvidia/nemotron-3.5-content-safety:free`、`nvidia/nemotron-3.5-lightning:free`、`openrouter/free`、`poolside/laguna-s-2.1:free`、`poolside/laguna-xs-2.1:free`、`qwen/qwen3.8-27b:free`、`stepfun/step-3.7-flash:free`、`thinkingmachines/inkling-small:free`、`z-ai/glm-5.2:free` | 385 行中的 21 行;公开,每个出口 IP 每小时 200 次 |
62
- | **Logfare** | 对话 `deepseek-v3.2`、`deepseek-v4-pro-0813`、`gemma-4-26b`、`gemma-4-31b-it`、`glm-5`、`glm-5.3`、`glm-5.3-flash`、`grok-4.6`、`kimi-k2.5`、`kimi-k2.6`、`kimi-k2.7-code`、`logfare/auto`、`moondream3.1`、`qwen-3.8-27b`、`step-3.7-flash`;图片 `flux-1-schnell`、`flux-2-dev`、`flux-2-klein-4b`、`flux-2-klein-9b`、`sdxl-lightning`;音频 `melotts`、`whisper-large-v3-turbo`;其他路由 `aura-2-en`、`lucid-origin`、`nova-3`、`phoenix-1.0` | 26 行;18 行需要训练数据授权,其余 8 行不需要 |
61
+ | **OpenCode** | `big-pickle`、`deepseek-v4-flash-free`、`jev-1.13-free`、`ling-3.0-flash-fin-free`、`mimo-v2.5-free`、`mimo-v2.6-flash-free`、`muse-spark-1.2`、`muse-spark-1.2-contributor-free`、`muse-spark-1.3`、`muse-spark-1.3-contributor-free`、`nemotron-3-ultra-free`、`nemotron-3.5-lightning-free`、`space-bunny-free` | 80 行中的 13 行;公开,无需登录 |
62
+ | **Kilo** | `cohere/north-mini-code:free`、`dots-studio/dots-3-note-preview:free`、`inclusionai/ling-3.0-flash-fin:free`、`inclusionai/ling-3.0-flash-sante:free`、`inclusionai/ling-3.0-flash-vl:free`、`kilo-auto/free`、`liquid/lfm-2.5-2.6b:free`、`nex-agi/nex-n2.5-mini:free`、`nex-agi/nex-n2.5-pro:free`、`nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free`、`nvidia/nemotron-3-super-120b-a12b:free`、`nvidia/nemotron-3-ultra-550b-a55b:free`、`nvidia/nemotron-3.5-content-safety:free`、`nvidia/nemotron-3.5-lightning:free`、`openrouter/free`、`poolside/laguna-s-2.1:free`、`poolside/laguna-xs-2.1:free`、`qwen/qwen3.8-27b:free`、`stepfun/step-3.7-flash:free`、`thinkingmachines/inkling-small:free`、`z-ai/glm-5.2:free` | 394 行中的 21 行;公开,每个出口 IP 每小时 200 次 |
63
+ | **Logfare** | 对话 `claude-opus-4.6`、`deepseek-v3.2`、`deepseek-v4-pro-0813`、`gemma-4-26b`、`glm-5`、`glm-5.3`、`glm-5.3-flash`、`grok-4.6`、`kimi-k2.5`、`kimi-k2.6`、`kimi-k2.7-code`、`kimi-k3`、`logfare/auto`、`moondream3.1`、`qwen-3.8-27b`、`step-3.7-flash`;图片 `flux-1-schnell`、`flux-2-dev`、`flux-2-klein-4b`、`flux-2-klein-9b`、`sdxl-lightning`;音频 `melotts`、`whisper-large-v3-turbo`;其他路由 `aura-2-en`、`lucid-origin`、`nova-3`、`phoenix-1.0` | 27 行;20 行需要训练数据授权,其余 7 行不需要 |
63
64
  | **Qoder** | `Qwen 3.8 Flash`(路由 `qmodel_38flash`) | 免费 flash 路由,另有每日签到活动 |
64
65
  | **NVIDIA** | `google/gemma-4-31b-it`、`moonshotai/kimi-k3`、`z-ai/glm-5.3`、`z-ai/glm-5.3-flash` —— 名单里另有 `deepseek-ai/deepseek-v4-flash-0731` 与 `deepseek-ai/deepseek-v4-pro-0813`,这两个名字已不在 NVIDIA 实时目录(82 行)中 | 调用需要 API key;核对于 2026-09-23 |
65
66
  | **SenseNova** | `deepseek-v4-flash`、`deepseek-v4-pro`、`glm-5.2`、`kimi-k3`、`sensenova-6.8-flash-lite` —— 均为 1M 上下文 / 128K 输出 | 名单随 bundle 内置;需要 API key |
@@ -74,7 +75,7 @@ gh workflow run release-freecodego.yml --ref freecodego-v<version>
74
75
 
75
76
  TRAE、Cline、WorkBuddy 国际版、Agnes 不公布固定名单,因此它们的行在到达时计数,而不在此列名。
76
77
 
77
- Logfare 有 18 行位于训练数据授权之后,选择器会标注而不是隐藏它们。
78
+ Logfare 有 20 行位于训练数据授权之后,选择器会标注而不是隐藏它们。
78
79
 
79
80
  <!-- generated:free-models:end -->
80
81
 
@@ -95,6 +96,15 @@ Logfare 有 18 行位于训练数据授权之后,选择器会标注而不是
95
96
 
96
97
  bundle 以同引擎子会话启用 Harness Agent Teams。DeepSeek 父会话创建 DeepSeek 队友,Codex 父会话创建 Codex 队友,Claude 父会话创建 Claude 队友;子会话路由继承自父会话,而不是从进程默认值中选取。团队名册、邮箱、任务看板与队友 Session 记录仍由 Harness 持有。Web Chat 在父对话内渲染实时的委派 Agent 进度树,包括每个任务标签、当前工具、状态与工具使用次数。
97
98
 
99
+ <a id="image-and-video-generation"></a>
100
+ ## 生图与视频生成
101
+
102
+ bundle 为 DeepSeek、Codex 与 Claude 注册生图与生视频工具,执行时读取这一类目配置的模型,而不是钉死某个模型。`mediaGenerationEnabled`(默认开启)就是那个开关:关掉后 `freecodego_generate_image`、`freecodego_generate_video` 与旧名字 `agnes_generate_image` / `agnes_generate_video` 会被**注销**——它们从模型的工具表里整体离开,而不是等到调用时才报错——而 `freecodego_generate_audio` 与 `freecodego_transcribe_audio` 保留,因为一个往活动工作区写文件、一个从活动工作区读文件。
103
+
104
+ 路线由 **provider** 决定,绝不由模型 id 里的关键词决定。生图讲 OpenAI Images 契约(`/images/generations`,带源图时走 `/images/edits`)、Seedream 的 `image: [...]` 融合体、Gemini 的 `:generateContent`、Imagen 的 `:predict`,以及 DashScope 的 `multimodal-generation`。生视频讲九条:Kling 的 `text2video` / `image2video` / `multi-image2video`、Ark 的 `/contents/generations/tasks`、DashScope 的异步 `video-synthesis`、MiniMax Hailuo 的 `/v2/video_generation`、Vidu 的四条 `ent/v2` 路由、Gemini 的 Veo `:predictLongRunning`、xAI 的 `/videos/generations`(给源视频时含编辑与续写)、OpenAI 的 `/videos`,以及网关对一切未识别 provider 的通用形状。
105
+
106
+ 模型名单是**活的,不是钉死的**:候选每次请求实时从 Harness 模型目录、托管目录、Logfare 与 Agnes 汇总,路线分类按 id 推断,也可在设置页的模型分类里手动覆盖。每次调用都带逐路线熔断,只有路线自己的问题才会落到下一条——密钥错或 prompt 被拒直接失败,而不是再付一次尝试的钱。完整表格(包括哪些 provider 接受尾帧、每条路线能渲染多长)见 `harness-plugin` 的包内 README。
107
+
98
108
  -----
99
109
 
100
110
  <a id="model-experience"></a>
package/cordis.patch.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Standard DeepSeek Harness 0.1.6-alpha.2 FreeCodeGo composition.
1
+ # Standard DeepSeek Harness 0.1.7-alpha.2 FreeCodeGo composition.
2
2
  # Neither official route is disabled. `llm-deepseek` is the only row that
3
3
  # registers provider `deepseek-official`, and the base composition names that
4
4
  # provider twice (`agent-default-model.provider`, `web.searchProvider`) — so
@@ -96,11 +96,15 @@
96
96
  # fails on an install that lacks it, so these rows are `disabled` and carry
97
97
  # the recipe for whoever wants them.
98
98
  # 2. **They fail closed at different grains, so the grain decides.** Mounted
99
- # in a *preset*, one unresolvable enabled row makes the whole preset
100
- # unselectable — `packages/preset/agent-presets/src/discovery.ts`,
101
- # `unresolvableRows`, skips a row only while `Boolean(row.disabled)` — which
102
- # is the "Failed to load" failure the bundled presets already record once.
103
- # Mounted here, an enabled row that cannot load fails *that entry alone*:
99
+ # in a *preset*, one unusable enabled row makes the whole preset
100
+ # unselectable: 0.1.6 reached that verdict in
101
+ # `packages/preset/agent-presets/src/discovery.ts` (`unresolvableRows`,
102
+ # which skipped a row only while `Boolean(row.disabled)`), and 0.1.7
103
+ # reaches the same one in `packages/preset/agent-preset-registry/src/mount.ts`
104
+ # (`auditRows`, which reports import failures, activation failures, and
105
+ # rows still waiting for a service). Either way it is the "Failed to
106
+ # load" failure the bundled presets already record once. Mounted here, an
107
+ # enabled row that cannot load fails *that entry alone*:
104
108
  # `Entry._init` catches the import error, logs it and returns, and the rest
105
109
  # of the tree keeps running. The host plane is therefore the plane that can
106
110
  # hold an optional capability at all.
@@ -186,6 +190,38 @@
186
190
  name: '@deepseek-ai/dsh-tool-session-query'
187
191
  disabled: true
188
192
 
193
+ # ── the Harness plugin's own row ───────────────────────────────────────
194
+ #
195
+ # The plugin is a Loader entry, not a programmatic mount from the `freecodego`
196
+ # row below. Being an entry is what makes it configurable, and that is the
197
+ # whole difference: the settings service addresses a plugin by its profile
198
+ # entry id, reads the live document from `entry.fiber.config`, and validates a
199
+ # write against that entry's own `Config`.
200
+ #
201
+ # `SettingsForms.describe`/`write` resolve an entry through
202
+ # `configEditor.entries()` and drop any entry whose fiber has no runtime
203
+ # `Config` (`packages/settings/settings/src/index.ts`). Mounted with
204
+ # `ctx.plugin()` inside the `freecodego` row's `apply`, this plugin inherited
205
+ # the *bundle's* entry: `ctx.fiber.entry.options.id` was `freecodego`, that
206
+ # entry has no schema, and every write was refused with `No configurable
207
+ # plugin entry "freecodego"` while every read answered the empty document.
208
+ # Nothing in this plugin could be turned on from the FreeCodeGo settings tab,
209
+ # and nothing stayed on across a restart.
210
+ #
211
+ # Three readers depend on this id, and they are the ones to check before
212
+ # renaming the row: `harness-ui` reads and writes it (its
213
+ # `tests/settings-entry.spec.ts` pins the client constant to this line),
214
+ # `plugin-conflicts.ts` reads the switch out of this row's `config` before the
215
+ # Loader starts, and the settings service appends its own override row here.
216
+ #
217
+ # Position is last in this layer on purpose, which is exactly where the
218
+ # programmatic mount used to happen: the rows above are mounted *before* it,
219
+ # and the team runtime, the browser/desktop providers, and the session-history
220
+ # tools each document that position as a requirement of their own.
221
+ - id: freecodego-harness-plugin
222
+ name: 'freecodego/harness-plugin'
223
+ config: {}
224
+
189
225
  - id: freecodego
190
226
  name: 'freecodego'
191
227
  config: {}
@@ -14875,7 +14875,7 @@ var TeamRoster = class {
14875
14875
  id: root.id,
14876
14876
  name: "lead",
14877
14877
  role: "lead",
14878
- status: root.status,
14878
+ status: availability(root),
14879
14879
  ...root.options.model === void 0 ? {} : { model: root.options.model },
14880
14880
  diagnostics: []
14881
14881
  }];
@@ -14886,7 +14886,7 @@ var TeamRoster = class {
14886
14886
  id: member.id,
14887
14887
  name: member.name,
14888
14888
  role: "teammate",
14889
- status: member.phase === "failed" ? "failed" : member.phase === "provisioning" ? "provisioning" : live?.status ?? "inactive",
14889
+ status: member.phase === "failed" ? "failed" : member.phase === "provisioning" ? "provisioning" : availability(live),
14890
14890
  description: member.description,
14891
14891
  provider: member.provider,
14892
14892
  context: member.context,
@@ -14943,7 +14943,7 @@ var TeamRoster = class {
14943
14943
  if (target.id === membership.root.id) throw new TeamError("the Team Lead cannot interrupt itself", "TEAM_INVALID_TARGET");
14944
14944
  const live = this.ctx.agents.get(target.id);
14945
14945
  if (live === void 0) return { previousStatus: "inactive" };
14946
- const previousStatus = live.status;
14946
+ const previousStatus = availability(live);
14947
14947
  this.ctx.subagents.interrupt(target.id, {
14948
14948
  kind: "ancestor",
14949
14949
  agent: caller
@@ -15125,7 +15125,7 @@ var TeamRoster = class {
15125
15125
  id: member.id,
15126
15126
  name: member.name,
15127
15127
  role: "teammate",
15128
- status: live?.status ?? "inactive",
15128
+ status: availability(live),
15129
15129
  description: member.description,
15130
15130
  provider: member.provider,
15131
15131
  context: member.context,
@@ -15157,6 +15157,9 @@ var TeamRoster = class {
15157
15157
  return foldSubagentDescriptor(agent.session.snapshotEvents(agent.session.inheritedEventCount)) !== void 0;
15158
15158
  }
15159
15159
  };
15160
+ function availability(agent) {
15161
+ return agent?.status === "running" ? "running" : "inactive";
15162
+ }
15160
15163
  var TeamMailbox = class {
15161
15164
  ctx;
15162
15165
  journal;
@@ -15497,13 +15500,11 @@ var contentBlockSchema = external_exports.lazy(() => external_exports.union([
15497
15500
  name: external_exports.string(),
15498
15501
  arguments: external_exports.string()
15499
15502
  }).strict(),
15500
- external_exports.object({
15501
- type: external_exports.literal("tool-result"),
15502
- toolCallId: external_exports.string().min(1),
15503
- content: external_exports.array(contentBlockSchema),
15504
- isError: external_exports.boolean().optional()
15505
- }).strict(),
15506
- external_exports.object({ type: external_exports.string().min(1) }).loose().refine((block) => !coreContentBlockTypes.has(block.type), { message: "known content block types must match their declared fields" })
15503
+ external_exports.custom((value) => {
15504
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
15505
+ const type = value.type;
15506
+ return typeof type === "string" && type.length > 0 && !coreContentBlockTypes.has(type);
15507
+ })
15507
15508
  ]));
15508
15509
  var teamMemberSnapshotSchema = external_exports.object({
15509
15510
  id: sessionIdSchema,
@@ -15688,7 +15689,7 @@ function applyCurrentTeamEvent(state, event) {
15688
15689
  }
15689
15690
  var teamProjectionDefinition = {
15690
15691
  key: "agentTeam",
15691
- stateVersion: 3,
15692
+ stateVersion: 4,
15692
15693
  stateSchema: teamProjectionEntrySchema,
15693
15694
  init: (header) => emptyTeamState(header.id),
15694
15695
  apply: (state, event) => {
@@ -16002,14 +16003,10 @@ var TeamService = (() => {
16002
16003
  let _classSuper = TypertRemoteService;
16003
16004
  let _instanceExtraInitializers = [];
16004
16005
  let _remoteView_decorators;
16005
- let _remoteCreateTask_decorators;
16006
- let _remoteUpdateTask_decorators;
16007
16006
  return class TeamService extends _classSuper {
16008
16007
  static {
16009
16008
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
16010
16009
  _remoteView_decorators = [Remote("view")];
16011
- _remoteCreateTask_decorators = [Remote("createTask")];
16012
- _remoteUpdateTask_decorators = [Remote("updateTask")];
16013
16010
  __esDecorate(this, null, _remoteView_decorators, {
16014
16011
  kind: "method",
16015
16012
  name: "remoteView",
@@ -16021,28 +16018,6 @@ var TeamService = (() => {
16021
16018
  },
16022
16019
  metadata: _metadata
16023
16020
  }, null, _instanceExtraInitializers);
16024
- __esDecorate(this, null, _remoteCreateTask_decorators, {
16025
- kind: "method",
16026
- name: "remoteCreateTask",
16027
- static: false,
16028
- private: false,
16029
- access: {
16030
- has: (obj) => "remoteCreateTask" in obj,
16031
- get: (obj) => obj.remoteCreateTask
16032
- },
16033
- metadata: _metadata
16034
- }, null, _instanceExtraInitializers);
16035
- __esDecorate(this, null, _remoteUpdateTask_decorators, {
16036
- kind: "method",
16037
- name: "remoteUpdateTask",
16038
- static: false,
16039
- private: false,
16040
- access: {
16041
- has: (obj) => "remoteUpdateTask" in obj,
16042
- get: (obj) => obj.remoteUpdateTask
16043
- },
16044
- metadata: _metadata
16045
- }, null, _instanceExtraInitializers);
16046
16021
  if (_metadata) Object.defineProperty(this, Symbol.metadata, {
16047
16022
  enumerable: true,
16048
16023
  configurable: true,
@@ -16219,42 +16194,6 @@ var TeamService = (() => {
16219
16194
  tasks: this.listTasks(agent)
16220
16195
  };
16221
16196
  }
16222
- /**
16223
- * Create one shared task through the generated Remote API.
16224
- * @param agent - exact live Team member creating the task.
16225
- * @param request - task text, blockers, and advisory write scopes.
16226
- * @returns the revision-one task or a typed Team rejection.
16227
- */
16228
- remoteCreateTask(agent, request) {
16229
- return this.taskMutationResult(this.createTask(agent, request));
16230
- }
16231
- /**
16232
- * Apply one task mutation and preserve Team rejections as business results.
16233
- * @param agent - exact live Team member authorizing the mutation.
16234
- * @param request - task identity, expected revision, action, and action fields.
16235
- * @returns the committed task or a typed Team rejection.
16236
- */
16237
- remoteUpdateTask(agent, request) {
16238
- return this.taskMutationResult(this.updateTask(agent, request));
16239
- }
16240
- /** Preserve Team task rejections while allowing unexpected failures to reject the Remote call. */
16241
- async taskMutationResult(operation) {
16242
- try {
16243
- return {
16244
- ok: true,
16245
- value: await operation
16246
- };
16247
- } catch (error51) {
16248
- if (!(error51 instanceof TeamError)) throw error51;
16249
- return {
16250
- ok: false,
16251
- error: {
16252
- code: error51.code === "TEAM_TASK_STALE_REVISION" ? "team-task-conflict" : "team-rejected",
16253
- message: error51.message
16254
- }
16255
- };
16256
- }
16257
- }
16258
16197
  /** Queue one contained recovery pass after publication has unwound. */
16259
16198
  scheduleRecovery(agent) {
16260
16199
  queueMicrotask(() => {
@@ -16,8 +16,9 @@
16
16
  - id: persona
17
17
  name: '@deepseek-ai/dsh-persona'
18
18
  config:
19
- text: |
20
- You are an Augment-style coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
19
+ suffix: Your working directory is {{cwd}}.
20
+ prefix: |-
21
+ You are an Augment-style coding agent powered by the {{model}} model.
21
22
 
22
23
  # Output
23
24
 
@@ -15,8 +15,9 @@
15
15
  - id: persona
16
16
  name: '@deepseek-ai/dsh-persona'
17
17
  config:
18
- text: |
19
- You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
18
+ suffix: Your working directory is {{cwd}}.
19
+ prefix: |-
20
+ You are a coding agent powered by the {{model}} model.
20
21
 
21
22
  # Voice
22
23
 
@@ -1,5 +1,5 @@
1
1
  // packages/experimental/auto-review/lib/index.js
2
- import { BlockAssembler, createUserMessage } from "@deepseek-ai/dsh-llm";
2
+ import { BlockAssembler } from "@deepseek-ai/dsh-llm";
3
3
  import { deepFreeze } from "@deepseek-ai/dsh-util-values";
4
4
  import { AUTO_PRESET } from "@deepseek-ai/dsh-permission-presets";
5
5
  import { RUN_CODE_NAME } from "@deepseek-ai/dsh-tools";
@@ -71,7 +71,7 @@ function isProjectInstruction(source) {
71
71
  return source.kind === "agent-instructions";
72
72
  }
73
73
  function isCheckpoint(source) {
74
- return source.kind === "plugin" && source.plugin === "compact";
74
+ return source.kind === "compact-checkpoint";
75
75
  }
76
76
  function isDirectParentInstruction(source, parentSession) {
77
77
  return parentSession !== void 0 && source.kind === "agent-message" && source.senderSessionId === parentSession;
@@ -96,7 +96,7 @@ function textRole(source, seq, initialPromptSeq, parentSession) {
96
96
  return "fact";
97
97
  }
98
98
  function filteredUserEntries(seq, source, content, initialPromptSeq, parentSession) {
99
- return content.filter((block) => block.type !== "tool-result").map((block) => ({
99
+ return content.map((block) => ({
100
100
  kind: "user-message",
101
101
  role: block.type === "text" ? textRole(source, seq, initialPromptSeq, parentSession) : "fact",
102
102
  source,
@@ -214,7 +214,7 @@ function snapshotAutoReview(agent, exec) {
214
214
  if (event.type === "user/message") {
215
215
  if (event.data.source.kind === "tool") continue;
216
216
  if (isProjectInstruction(event.data.source)) {
217
- const content = event.data.content.filter((block) => block.type !== "tool-result");
217
+ const content = event.data.content;
218
218
  if (content.length > 0) projectInstructions.push({
219
219
  kind: "user-message",
220
220
  role: "constraint",
@@ -353,16 +353,13 @@ async function classifyRisk(ctx, agent, exec, signal) {
353
353
  provider: snapshot.provider,
354
354
  model: snapshot.model,
355
355
  system: REVIEW_POLICY,
356
- messages: [createUserMessage({
356
+ messages: [{
357
+ role: "user",
357
358
  content: [{
358
359
  type: "text",
359
360
  text: reviewUserText(snapshot)
360
- }],
361
- source: {
362
- kind: "plugin",
363
- plugin: "dsh-experimental-auto-review"
364
- }
365
- })],
361
+ }]
362
+ }],
366
363
  temperature: 0,
367
364
  signal
368
365
  });