dsh-plugin-guide 0.3.3 → 0.3.5
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.es.md +5 -1
- package/README.hi.md +5 -1
- package/README.md +5 -1
- package/README.pt.md +5 -1
- package/README.zh.md +5 -1
- package/dist/dsh-plugin-dev.js +3 -3
- package/guide/plugin-dev-guide.md +2 -2
- package/guide/quick-reference.es.md +2 -2
- package/guide/quick-reference.hi.md +1 -1
- package/guide/quick-reference.md +2 -2
- package/guide/quick-reference.pt.md +2 -2
- package/guide/quick-reference.zh-CN.md +2 -2
- package/package.json +5 -4
- package/references/official-docs/AGENTS.md +2 -2
- package/references/official-docs/SNAPSHOT.md +3 -3
- package/references/official-docs/THIRD_PARTY_NOTICES.md +4 -6
- package/references/official-docs/docs/agent-lifecycle.i18n.yaml +2 -2
- package/references/official-docs/docs/agent-lifecycle.md +5 -3
- package/references/official-docs/docs/agent-lifecycle.zh.md +5 -3
- package/references/official-docs/docs/architecture.i18n.yaml +2 -2
- package/references/official-docs/docs/architecture.md +7 -3
- package/references/official-docs/docs/architecture.zh.md +7 -3
- package/references/official-docs/docs/capability-seams.i18n.yaml +2 -2
- package/references/official-docs/docs/capability-seams.md +5 -0
- package/references/official-docs/docs/capability-seams.zh.md +5 -0
- package/references/official-docs/docs/config-catalog.i18n.yaml +2 -2
- package/references/official-docs/docs/config-catalog.md +15 -21
- package/references/official-docs/docs/config-catalog.zh.md +15 -21
- package/references/official-docs/docs/cookbook/extension-cookbook.i18n.yaml +2 -2
- package/references/official-docs/docs/cookbook/extension-cookbook.md +12 -10
- package/references/official-docs/docs/cookbook/extension-cookbook.zh.md +12 -10
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.i18n.yaml +2 -2
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.md +16 -12
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.zh.md +16 -12
- package/references/official-docs/docs/event-producer-consumer.i18n.yaml +2 -2
- package/references/official-docs/docs/event-producer-consumer.md +28 -27
- package/references/official-docs/docs/event-producer-consumer.zh.md +32 -31
- package/references/official-docs/docs/module-graph.i18n.yaml +2 -2
- package/references/official-docs/docs/module-graph.md +36 -14
- package/references/official-docs/docs/module-graph.zh.md +36 -14
- package/references/official-docs/docs/persistence-catalog.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-catalog.md +49 -39
- package/references/official-docs/docs/persistence-catalog.zh.md +39 -29
- package/references/official-docs/docs/subsystems/attachment.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/attachment.md +157 -4
- package/references/official-docs/docs/subsystems/attachment.zh.md +157 -4
- package/references/official-docs/docs/subsystems/commands.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/commands.md +24 -15
- package/references/official-docs/docs/subsystems/commands.zh.md +24 -15
- package/references/official-docs/docs/subsystems/conversation.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/conversation.md +4 -4
- package/references/official-docs/docs/subsystems/conversation.zh.md +4 -4
- package/references/official-docs/docs/subsystems/core.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/core.md +62 -1
- package/references/official-docs/docs/subsystems/core.zh.md +62 -1
- package/references/official-docs/docs/subsystems/llm-streaming.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/llm-streaming.md +23 -2
- package/references/official-docs/docs/subsystems/llm-streaming.zh.md +23 -2
- package/references/official-docs/docs/subsystems/persistence.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/persistence.md +10 -10
- package/references/official-docs/docs/subsystems/persistence.zh.md +10 -10
- package/references/official-docs/docs/subsystems/session-projection.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/session-projection.md +19 -0
- package/references/official-docs/docs/subsystems/session-projection.zh.md +19 -0
- package/references/official-docs/docs/subsystems/session-reference.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/session-reference.md +25 -1
- package/references/official-docs/docs/subsystems/session-reference.zh.md +25 -1
- package/references/official-docs/docs/subsystems/session-telemetry.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/session-telemetry.md +6 -5
- package/references/official-docs/docs/subsystems/session-telemetry.zh.md +6 -5
- package/references/official-docs/docs/subsystems/session.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/session.md +52 -40
- package/references/official-docs/docs/subsystems/session.zh.md +52 -40
- package/references/official-docs/docs/subsystems/web-client.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/web-client.md +1 -1
- package/references/official-docs/docs/subsystems/web-client.zh.md +1 -1
- package/references/official-docs/docs/subsystems/workspace.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/workspace.md +8 -8
- package/references/official-docs/docs/subsystems/workspace.zh.md +8 -8
- package/references/official-docs/docs/testing.i18n.yaml +2 -2
- package/references/official-docs/docs/testing.md +2 -2
- package/references/official-docs/docs/testing.zh.md +2 -2
- package/references/official-docs/docs/user/guide/network-proxy.i18n.yaml +6 -0
- package/references/official-docs/docs/user/guide/network-proxy.md +85 -0
- package/references/official-docs/docs/user/guide/network-proxy.zh.md +85 -0
- package/references/official-docs/docs/user/guide/providers.i18n.yaml +2 -2
- package/references/official-docs/docs/user/guide/providers.md +70 -17
- package/references/official-docs/docs/user/guide/providers.zh.md +70 -17
- package/references/official-docs/docs/web-styling.i18n.yaml +2 -2
- package/references/official-docs/docs/web-styling.md +1 -0
- package/references/official-docs/docs/web-styling.zh.md +1 -0
- package/references/official-docs/website-docs.ts +8 -0
- package/templates/js/README.es.md +1 -1
- package/templates/js/README.hi.md +1 -1
- package/templates/js/README.md +1 -1
- package/templates/js/README.pt.md +1 -1
- package/templates/js/README.zh.md +1 -1
- package/templates/ts/README.es.md +1 -1
- package/templates/ts/README.hi.md +1 -1
- package/templates/ts/README.md +1 -1
- package/templates/ts/README.pt.md +1 -1
- package/templates/ts/README.zh.md +1 -1
package/README.es.md
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
| Surface | Status |
|
|
27
27
|
|---|---|
|
|
28
|
-
| Harness | DeepSeek Harness `
|
|
28
|
+
| Harness | DeepSeek Harness `dsh-v0.1.3-alpha.1` (adaptado el 2026-09-04): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia. Verificado el 2026-09-06 contra el checkout master dsh-v0.1.3-alpha.1 (cadena completa de gates + smoke de instalación de perfil). |
|
|
29
29
|
| Node | `^22.19.0 || >=24.0.0` (runtime de DeepSeek Harness) |
|
|
30
30
|
| Platforms | Todas (bundle ESM plano; sin código nativo, sin red) |
|
|
31
31
|
| Model | Cualquiera (sin interacción con el modelo) |
|
|
@@ -246,3 +246,7 @@ Mantenido por la comunidad, **no** es un producto oficial de DeepSeek. DeepSeek
|
|
|
246
246
|
## License
|
|
247
247
|
|
|
248
248
|
[Apache License 2.0](LICENSE) © 2026 dsh-plugin-guide contributors — nuestro propio texto (`SKILL.md`, `guide/`, `references/`, `scripts/`, este README) es Apache-2.0; el contenido de terceros empaquetado se documenta en [NOTICE.md](NOTICE.md).
|
|
249
|
+
|
|
250
|
+
### Instalar desde el mercado de DSH Desktop
|
|
251
|
+
|
|
252
|
+
Todos los plugins de PerryLink pueden explorarse en el mercado integrado de DSH Desktop: **Market → Sources → add source → pegar** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ seleccionarlo**. La instalación sigue pasando por la verificación de identidad npm del mercado y tu confirmación.
|
package/README.hi.md
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
| Surface | Status |
|
|
27
27
|
|---|---|
|
|
28
|
-
| Harness | DeepSeek Harness `
|
|
28
|
+
| Harness | DeepSeek Harness `dsh-v0.1.3-alpha.1` (2026-09-04 को अनुकूलित): सत्र लिफ़ाफ़ा अपना ignorable फ़ील्ड केवल संग्रहीत-लॉग पठन संगतता के लिए रखता है - Session.append अभी भी इसे स्टैम्प नहीं कर सकता, इसलिए गेट व्यवहार अपरिवर्तित है। 2026-09-06 को dsh-v0.1.3-alpha.1 master checkout के विरुद्ध सत्यापित (पूर्ण gate chain + profile install smoke)। |
|
|
29
29
|
| Node | `^22.19.0 || >=24.0.0` (DeepSeek Harness रनटाइम) |
|
|
30
30
|
| Platforms | सभी (सादा ESM बंडल; कोई नेटिव कोड नहीं, कोई नेटवर्क नहीं) |
|
|
31
31
|
| Model | कोई भी (कोई मॉडल अंतःक्रिया नहीं) |
|
|
@@ -246,3 +246,7 @@ pwsh -File scripts/verify-kit.ps1 # महत्वपूर्ण पथ +
|
|
|
246
246
|
## License
|
|
247
247
|
|
|
248
248
|
[Apache License 2.0](LICENSE) © 2026 dsh-plugin-guide contributors — हमारा अपना पाठ (`SKILL.md`, `guide/`, `references/`, `scripts/`, यह README) Apache-2.0 है; पैक की गई तृतीय-पक्ष सामग्री [NOTICE.md](NOTICE.md) में दस्तावेज़ित है।
|
|
249
|
+
|
|
250
|
+
### DSH Desktop मार्केट से इंस्टॉल करें
|
|
251
|
+
|
|
252
|
+
सभी PerryLink प्लगइन DSH Desktop के बिल्ट-इन मार्केट में देखे जा सकते हैं: **Market → Sources → add source → पेस्ट करें** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ चुनें**। इंस्टॉलेशन मार्केट के npm-identity सत्यापन और आपकी पुष्टि से ही होता है।
|
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
| Surface | Status |
|
|
30
30
|
|---|---|
|
|
31
|
-
| Harness | DeepSeek Harness `
|
|
31
|
+
| Harness | DeepSeek Harness `dsh-v0.1.3-alpha.1` (adapted 2026-09-04): the session envelope keeps its ignorable field for stored-log read compatibility only - Session.append still cannot stamp it, so audit-gate behavior is unchanged. Verified 2026-09-06 against the dsh-v0.1.3-alpha.1 master checkout (full gate chain + profile install smoke). |
|
|
32
32
|
| Node | `^22.19.0 || >=24.0.0` (DeepSeek Harness runtime) |
|
|
33
33
|
| Platforms | All (plain ESM bundle; no native code, no network) |
|
|
34
34
|
| Model | Any (no model interaction) |
|
|
@@ -246,6 +246,10 @@ This project is one of the [33 DeepSeek Harness plugins](https://github.com/Perr
|
|
|
246
246
|
|
|
247
247
|
Community-maintained, **not** an official DeepSeek product. DeepSeek Harness is in developer preview and ships breaking changes; when in doubt, the official docs in `references/official-docs/` are the source of truth.
|
|
248
248
|
|
|
249
|
+
### Install from the DSH Desktop Market
|
|
250
|
+
|
|
251
|
+
All PerryLink plugins are browsable in the built-in DSH Desktop Market: **Market → Sources → add source → paste** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ select it**. Installation still goes through the Market's npm-identity verification and your confirmation.
|
|
252
|
+
|
|
249
253
|
## License
|
|
250
254
|
|
|
251
255
|
[Apache License 2.0](LICENSE) © 2026 dsh-plugin-guide contributors — our own text (`SKILL.md`, `guide/`, `references/`, `scripts/`, this README) is Apache-2.0; bundled third-party content is documented in [NOTICE.md](NOTICE.md).
|
package/README.pt.md
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
| Surface | Status |
|
|
27
27
|
|---|---|
|
|
28
|
-
| Harness | DeepSeek Harness `
|
|
28
|
+
| Harness | DeepSeek Harness `dsh-v0.1.3-alpha.1` (adaptado em 2026-09-04): o envelope de sessão mantém seu campo ignorable apenas para compatibilidade de leitura de logs armazenados - o Session.append ainda não consegue estampá-lo, então o comportamento da porta não muda. Verificado em 2026-09-06 contra o checkout master dsh-v0.1.3-alpha.1 (cadeia completa de gates + smoke de instalação de perfil). |
|
|
29
29
|
| Node | `^22.19.0 || >=24.0.0` (runtime do DeepSeek Harness) |
|
|
30
30
|
| Platforms | Todas (bundle ESM puro; sem código nativo, sem rede) |
|
|
31
31
|
| Model | Qualquer (sem interação com o modelo) |
|
|
@@ -246,3 +246,7 @@ Mantido pela comunidade, **não** é um produto oficial da DeepSeek. O DeepSeek
|
|
|
246
246
|
## License
|
|
247
247
|
|
|
248
248
|
[Apache License 2.0](LICENSE) © 2026 dsh-plugin-guide contributors — nosso próprio texto (`SKILL.md`, `guide/`, `references/`, `scripts/`, este README) é Apache-2.0; o conteúdo de terceiros empacotado é documentado em [NOTICE.md](NOTICE.md).
|
|
249
|
+
|
|
250
|
+
### Instalar a partir do mercado do DSH Desktop
|
|
251
|
+
|
|
252
|
+
Todos os plugins PerryLink podem ser explorados no mercado integrado do DSH Desktop: **Market → Sources → add source → colar** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ selecionar**. A instalação continua passando pela verificação de identidade npm do mercado e pela sua confirmação.
|
package/README.zh.md
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
| Surface | Status |
|
|
29
29
|
|---|---|
|
|
30
|
-
| Harness | DeepSeek Harness `
|
|
30
|
+
| Harness | DeepSeek Harness `dsh-v0.1.3-alpha.1`(2026-09-04 已适配):会话信封保留 ignorable 字段但仅用于存量日志读取兼容——Session.append 仍无法盖章,门控行为不变。已于 2026-09-06 对照 dsh-v0.1.3-alpha.1 master checkout 核验(完整门禁链 + profile 安装冒烟)。 |
|
|
31
31
|
| Node | `^22.19.0 || >=24.0.0`(DeepSeek Harness 运行时) |
|
|
32
32
|
| Platforms | 全部(纯 ESM bundle;无原生代码、无网络) |
|
|
33
33
|
| Model | 任意(无模型交互) |
|
|
@@ -248,3 +248,7 @@ pwsh -File scripts/verify-kit.ps1 # 关键路径 + 链接扫描(加 -Checkou
|
|
|
248
248
|
## License
|
|
249
249
|
|
|
250
250
|
[Apache License 2.0](LICENSE) © 2026 dsh-plugin-guide contributors —— 自有文本(`SKILL.md`、`guide/`、`references/`、`scripts/`、本 README)按 Apache-2.0;打包的第三方内容见 [NOTICE.md](NOTICE.md)。
|
|
251
|
+
|
|
252
|
+
### 从 DSH Desktop 市场安装
|
|
253
|
+
|
|
254
|
+
所有 PerryLink 插件均可在 DSH Desktop 内置市场中浏览:**市场 → 来源 → 添加来源 → 粘贴** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ 选中**。安装仍需通过市场的 npm 身份校验与你的确认。
|
package/dist/dsh-plugin-dev.js
CHANGED
|
@@ -1466,7 +1466,7 @@ function suggestionsFor(step, result) {
|
|
|
1466
1466
|
const base = [`tail of "${step}":\n${tailOf(result)}`];
|
|
1467
1467
|
if (result.timedOut) base.push(`command timed out; raise --timeout or --smoke-timeout`);
|
|
1468
1468
|
if (step === "install") {
|
|
1469
|
-
base.push("ensure the dsh CLI is @deepseek-ai/dsh@0.1.2-
|
|
1469
|
+
base.push("ensure the dsh CLI is @deepseek-ai/dsh@0.1.2-rc.1 (older builds such as the rc.6 line do not satisfy the compat pin)");
|
|
1470
1470
|
base.push("confirm the profile allowlist matches the repo compat workflow (native builds allowlisted)");
|
|
1471
1471
|
}
|
|
1472
1472
|
if (step === "headless") base.push("a hang usually means an injected service stayed pending; the smoke timeout surfaces exactly that");
|
|
@@ -1587,8 +1587,8 @@ async function main(argv, cwd = process.cwd()) {
|
|
|
1587
1587
|
dshBin: resolveDsh(flagString(flags, "dsh")),
|
|
1588
1588
|
pnpmBin: resolvePnpm(flagString(flags, "pnpm")),
|
|
1589
1589
|
profile: flagString(flags, "profile", "compat") ?? "compat",
|
|
1590
|
-
base: flagString(flags, "base", "@deepseek-ai/dsh-base@0.1.2-
|
|
1591
|
-
headless: flagString(flags, "headless", "@deepseek-ai/dsh-headless@0.1.2-
|
|
1590
|
+
base: flagString(flags, "base", "@deepseek-ai/dsh-base@0.1.2-rc.1") ?? "@deepseek-ai/dsh-base@0.1.2-rc.1",
|
|
1591
|
+
headless: flagString(flags, "headless", "@deepseek-ai/dsh-headless@0.1.2-rc.1") ?? "@deepseek-ai/dsh-headless@0.1.2-rc.1",
|
|
1592
1592
|
timeoutMs: timeoutMs(flags, "timeout", "DSH_PLUGIN_DEV_TIMEOUT", DEFAULT_TIMEOUT_MS),
|
|
1593
1593
|
smokeTimeoutMs: timeoutMs(flags, "smoke-timeout", "DSH_PLUGIN_DEV_SMOKE_TIMEOUT", DEFAULT_SMOKE_TIMEOUT_MS)
|
|
1594
1594
|
});
|
|
@@ -185,7 +185,7 @@ export function apply(ctx: Context, config: Config) { /* config 已校验+补默
|
|
|
185
185
|
2. **waterfall 监听器必须调 `next()`**。
|
|
186
186
|
3. **模型可见 ⟺ 已记录**(Model-visible ⟺ logged):任何进入模型请求的内容必须能从会话日志重建;新增模型可见输入必须新增会话事件。运行时不变式会断言这一点。
|
|
187
187
|
4. **跨边界 opaque id 用 branded**:`Branded<B>`(`dsh-brand`,纯类型、零运行时依赖),从不裸 `string`;构造走 per-type factory(`SessionId` / `CallId` / `JobId` / `GoalId` 等),防止不同 id 在类型层互换。
|
|
188
|
-
5. **会话事件版本规则**:`SessionEventMap` 成员默认 required-on-read,无信封豁免——`0.1.2-alpha.1` 已移除 `ignorable` 信封、读路径 fail-closed,不认识该事件类型的 build 一律拒绝日志;只有结构格式变更才 bump `SESSION_FORMAT_VERSION`。`0.1.2-
|
|
188
|
+
5. **会话事件版本规则**:`SessionEventMap` 成员默认 required-on-read,无信封豁免——`0.1.2-alpha.1` 已移除 `ignorable` 信封、读路径 fail-closed,不认识该事件类型的 build 一律拒绝日志;只有结构格式变更才 bump `SESSION_FORMAT_VERSION`。`0.1.2-rc.1` 恢复信封 `ignorable?: true` 字段但仅用于存量日志读取兼容——其 `Session.append` 第三参为仅 surface 事件的 `SurfaceIntent`,仍无法盖章标记,故自适应门在该线上继续停写(行为不变)。插件新增会话事件时按此契约设计:下游插件事件目前无注册面,写自定义事件的插件用自适应门在无信封宿主上停写(新增模型可见输入见红线 3)。
|
|
189
189
|
|
|
190
190
|
---
|
|
191
191
|
|
|
@@ -357,7 +357,7 @@ bundle 挂一个普通 provider 插件:`inject = ['cmdlineArgs']`,用 `@deep
|
|
|
357
357
|
**身份与依赖(最致命)**
|
|
358
358
|
- **cordis 双副本 / 双 Cordis 分裂**:插件构建时若从 `.pnpm` 副本解析 cordis,与 harness 的 vendored 副本是"两个模块",`declare module` 增强合并不了 → 报 `Property 'tools' does not exist on type 'Context'`。构建期把 cordis 解析到 harness 的 `vendor/cordis`;npm 安装路径下 peer 必须与宿主同一身份——**scoped `@deepseek-ai/cordis` 与 unscoped `cordis` 混用同样分裂**(dsh-tools 的类型只增强 scoped 版本)。独立包把 cordis 设为 peerDependency(+ dev),版本对齐宿主。
|
|
359
359
|
- **官方 `@deepseek-ai/*` 包曾未发布公共 npm**(rc 早期):社区 bundle 的 `dependencies` 留空,靠 profile 的 pnpm 闭包 flat fallback(`$DSH_HOME/profiles/node_modules`)注入;声明了反而解析失败。rc.6 起公开包可用(from-scratch 教程锁 `0.1.0-rc.6`、cordis `4.0.1`),两条时间线的资料都要知道,按当时宿主版本取舍。
|
|
360
|
-
- **npm `latest` 标签是过期版本**:`@deepseek-ai/dsh-tools` 的 `latest` 停在陈旧 0.0.1-rc.1——脚手架(create-dsh-plugin)显式钉 `next` 标签版本;裸跑 `npm i @deepseek-ai/dsh-tools` 会踩旧版。2026-08-14 复核:dsh-tools 与 `@deepseek-ai/dsh-session-persistence-jsonl` 的 `latest` 均为 0.0.1-rc.1、`next` 为 0.1.0-rc.6;`@deepseek-ai/dsh` latest=next=0.1.0-rc.6、`@deepseek-ai/cordis` latest=4.0.1(另有 `next`=4.0.1-rc.4);create-dsh-plugin 已发布 latest=0.1.1(2026-08-13T15:15Z);dsh-core、dsh-sdk 仍未发布(404)。**无作用域 `dsh` 包是无关项目 node-dsh**("A shell written in JavaScript")——官方 CLI 包是 `@deepseek-ai/dsh`,别装错。
|
|
360
|
+
- **npm `latest` 标签是过期版本**:`@deepseek-ai/dsh-tools` 的 `latest` 停在陈旧 0.0.1-rc.1——脚手架(create-dsh-plugin)显式钉 `next` 标签版本;裸跑 `npm i @deepseek-ai/dsh-tools` 会踩旧版。2026-08-14 复核:dsh-tools 与 `@deepseek-ai/dsh-session-persistence-jsonl` 的 `latest` 均为 0.0.1-rc.1、`next` 为 0.1.0-rc.6;`@deepseek-ai/dsh` latest=next=0.1.0-rc.6、`@deepseek-ai/cordis` latest=4.0.1(另有 `next`=4.0.1-rc.4);create-dsh-plugin 已发布 latest=0.1.1(2026-08-13T15:15Z);dsh-core、dsh-sdk 仍未发布(404)。**无作用域 `dsh` 包是无关项目 node-dsh**("A shell written in JavaScript")——官方 CLI 包是 `@deepseek-ai/dsh`,别装错。2026-09-04 复核:`@deepseek-ai/dsh` latest=next=0.1.2-rc.1(`alpha`=0.1.2-alpha.5)、`@deepseek-ai/cordis` latest=4.0.2(`next`=4.0.1-rc.4)、dsh-tools 与 dsh-session-persistence-jsonl 的 `next` 抬到 0.1.2-rc.1(`latest` 仍 0.0.1-rc.1)、create-dsh-plugin latest=0.2.1;dsh-core、dsh-sdk 仍 404。
|
|
361
361
|
|
|
362
362
|
**tsconfig 三件套 + 构建陷阱**
|
|
363
363
|
- 独立 TS 插件包实测可用形态:`module: esnext` + `moduleResolution: bundler` + `allowImportingTsExtensions: true`(否则 TS5097)+ `rewriteRelativeImportExtensions: true`(否则产物残留 `./x.ts` 导入 → 运行时 ESM 崩溃)+ `lib: ["ES2024"]` + `outDir: lib` + `declarationDir: lib/types`。用 `Buffer`/`node:` 时显式 `"types": ["node"]`(不写 `types` 字段会隐式包含全部 @types,脆弱)。
|
|
@@ -138,7 +138,7 @@ Protocolo de chunks: `block-start` → `text-delta*` → `block-end` (bloque com
|
|
|
138
138
|
5. Paquetes de plugin independientes: cordis es peerDependency con la misma identidad del host (mezclar scoped `@deepseek-ai/cordis` y unscoped divide identidades); ESM; manifiesto `dsh.bundle`; instalaciones git necesitan `prepare` + `allowBuilds`; publica `lib/` o un tarball.
|
|
139
139
|
6. Documentación bilingüe en pares; descripciones/prompts son comportamiento; cambios no triviales llevan Agent Note; ejecuta el conjunto mínimo de checks antes de empujar (dsh-pre-push-checks).
|
|
140
140
|
7. Los ids opacos entre límites son branded (`Branded<B>` de `dsh-brand`), nunca `string` pelado.
|
|
141
|
-
8. Los miembros de `SessionEventMap` son required-on-read: el sobre `ignorable` desaparece en 0.1.2-alpha.1 (la lectura falla cerrada — un build que no conoce un tipo de evento rechaza el log), y los appends de eventos propios de plugins cruzan una puerta adaptativa que deja de escribir en hosts sin sobre; 0.1.2-
|
|
141
|
+
8. Los miembros de `SessionEventMap` son required-on-read: el sobre `ignorable` desaparece en 0.1.2-alpha.1 (la lectura falla cerrada — un build que no conoce un tipo de evento rechaza el log), y los appends de eventos propios de plugins cruzan una puerta adaptativa que deja de escribir en hosts sin sobre; 0.1.2-rc.1 conserva el campo ignorable?: true solo para compatibilidad de lectura de logs almacenados (su Session.append sigue sin poder estampar el marcador), por lo que la puerta continúa sin escribir (sin cambio de comportamiento). Solo los cambios de formato estructural bumpan `SESSION_FORMAT_VERSION`. El switch sobre `SessionEvent` cae por un `default` documentado — sin `assertNever` (unión merge-extensible).
|
|
142
142
|
|
|
143
143
|
## Lista rápida de trampas comunitarias (detalles: guía §7.3 / community-repo-deep-dive.md)
|
|
144
144
|
|
|
@@ -147,7 +147,7 @@ Protocolo de chunks: `block-start` → `text-delta*` → `block-end` (bloque com
|
|
|
147
147
|
- Junctions de Windows con PowerShell `New-Item -ItemType Junction`; la letra de unidad de vitest en mayúscula `C:/`.
|
|
148
148
|
- `DSH_PERMISSION_MODE=danger-full-access` es de alto riesgo (sin backend de sandbox en Windows, aprobaciones desactivadas); `DSH_*` en `~/.dsh/.env` rompe el arranque.
|
|
149
149
|
- Los archivos de sesión son zstd multiframe: usa `scanZstdFrames`/`createZstdFrameDecoder` (`@deepseek-ai/dsh-session-persistence-jsonl/src/zstd.ts`).
|
|
150
|
-
- npm: `dsh` sin alcance es el proyecto ajeno node-dsh (un shell) — instala `@deepseek-ai/dsh
|
|
150
|
+
- npm: `dsh` sin alcance es el proyecto ajeno node-dsh (un shell) — instala `@deepseek-ai/dsh` (latest=0.1.2-rc.1); `@deepseek-ai/dsh-tools` y `@deepseek-ai/dsh-session-persistence-jsonl` tienen `latest` obsoleto (0.0.1-rc.1), fija `next` (0.1.2-rc.1); `create-dsh-plugin` latest=0.2.1; dsh-core/dsh-sdk siguen sin publicarse (verificado 2026-09-04).
|
|
151
151
|
- Haz `resolve()` en ambos lados antes de comparar rutas (trampa de barras invertidas de Windows).
|
|
152
152
|
|
|
153
153
|
## Enlaces de documentación
|
|
@@ -147,7 +147,7 @@ Consumer (`dsh-tool-my-cap`): `inject = ['tools','myCap']`, `ctx.tools.register(
|
|
|
147
147
|
- Windows junctions PowerShell `New-Item -ItemType Junction` से; vitest ड्राइव अक्षर बड़ा `C:/`।
|
|
148
148
|
- `DSH_PERMISSION_MODE=danger-full-access` उच्च जोखिम है (Windows पर सैंडबॉक्स बैकएंड नहीं, अनुमोदन बंद); `~/.dsh/.env` में `DSH_*` स्टार्टअप तोड़ता है।
|
|
149
149
|
- सत्र फ़ाइलें मल्टी-फ़्रेम zstd हैं: `scanZstdFrames`/`createZstdFrameDecoder` उपयोग करें (`@deepseek-ai/dsh-session-persistence-jsonl/src/zstd.ts`)।
|
|
150
|
-
- npm: बिना स्कोप वाला `dsh` असंबंधित node-dsh प्रोजेक्ट (एक shell) है — `@deepseek-ai/dsh` इंस्टॉल
|
|
150
|
+
- npm: बिना स्कोप वाला `dsh` असंबंधित node-dsh प्रोजेक्ट (एक shell) है — `@deepseek-ai/dsh` इंस्टॉल करें (latest=0.1.2-rc.1); `@deepseek-ai/dsh-tools` और `@deepseek-ai/dsh-session-persistence-jsonl` का `latest` पुराना है (0.0.1-rc.1), `next` (0.1.2-rc.1) पिन करें; `create-dsh-plugin` latest=0.2.1; dsh-core/dsh-sdk अभी भी अप्रकाशित (2026-09-04 को सत्यापित)।
|
|
151
151
|
- पथ तुलना से पहले दोनों ओर `resolve()` करें (Windows बैकस्लैश जाल)।
|
|
152
152
|
|
|
153
153
|
## दस्तावेज़ लिंक
|
package/guide/quick-reference.md
CHANGED
|
@@ -138,7 +138,7 @@ Chunk protocol: `block-start` → `text-delta*` → `block-end` (complete block)
|
|
|
138
138
|
5. Standalone plugin packages: cordis is a peerDependency matching the host identity (mixing scoped `@deepseek-ai/cordis` and unscoped splits identities); ESM; `dsh.bundle` manifest; git installs need `prepare` + `allowBuilds`; ship `lib/` or a tarball.
|
|
139
139
|
6. Bilingual docs in pairs; tool descriptions/prompts are behavior; non-trivial changes need an Agent Note; run the minimal check set before pushing (dsh-pre-push-checks).
|
|
140
140
|
7. Opaque cross-boundary ids are branded (`Branded<B>` from `dsh-brand`), never bare `string`.
|
|
141
|
-
8. `SessionEventMap` members are required-on-read: the `ignorable` envelope is gone on 0.1.2-alpha.1 (reads fail closed — a build that does not know an event type refuses the log), and plugin appends of custom events ride an adaptive gate that stops writing on envelope-less hosts; only structural format changes bump `SESSION_FORMAT_VERSION`. 0.1.2-
|
|
141
|
+
8. `SessionEventMap` members are required-on-read: the `ignorable` envelope is gone on 0.1.2-alpha.1 (reads fail closed — a build that does not know an event type refuses the log), and plugin appends of custom events ride an adaptive gate that stops writing on envelope-less hosts; only structural format changes bump `SESSION_FORMAT_VERSION`. 0.1.2-rc.1 retains the `ignorable?: true` field for stored-log read compatibility only — its `Session.append` third argument is a `SurfaceIntent` for surface events and still cannot stamp the marker, so the gate keeps skipping custom-event appends there (no behavior change). Switch over `SessionEvent` falls through a documented `default` — no `assertNever` (merge-extensible union).
|
|
142
142
|
|
|
143
143
|
## Community pitfalls quick list (details: guide §7.3 / community-repo-deep-dive.md)
|
|
144
144
|
|
|
@@ -147,7 +147,7 @@ Chunk protocol: `block-start` → `text-delta*` → `block-end` (complete block)
|
|
|
147
147
|
- Windows junctions via PowerShell `New-Item -ItemType Junction`; vitest drive letter must be uppercase `C:/`.
|
|
148
148
|
- `DSH_PERMISSION_MODE=danger-full-access` is high-risk (no sandbox backend on Windows, approvals disabled); `DSH_*` vars in `~/.dsh/.env` break startup.
|
|
149
149
|
- Session files are multi-frame zstd: use `scanZstdFrames`/`createZstdFrameDecoder` (`@deepseek-ai/dsh-session-persistence-jsonl/src/zstd.ts`).
|
|
150
|
-
- npm: unscoped `dsh` is the unrelated node-dsh shell — install `@deepseek-ai/dsh
|
|
150
|
+
- npm: unscoped `dsh` is the unrelated node-dsh shell — install `@deepseek-ai/dsh` (latest=0.1.2-rc.1); `@deepseek-ai/dsh-tools` and `@deepseek-ai/dsh-session-persistence-jsonl` have stale `latest` (0.0.1-rc.1), pin `next` (0.1.2-rc.1); `create-dsh-plugin` latest=0.2.1; dsh-core/dsh-sdk still unpublished (verified 2026-09-04).
|
|
151
151
|
- `resolve()` both sides before path comparisons (Windows backslash trap).
|
|
152
152
|
|
|
153
153
|
## Documentation links
|
|
@@ -138,7 +138,7 @@ Protocolo de chunks: `block-start` → `text-delta*` → `block-end` (bloco comp
|
|
|
138
138
|
5. Pacotes de plugin independentes: cordis é peerDependency com a mesma identidade do host (misturar scoped `@deepseek-ai/cordis` e unscoped divide identidades); ESM; manifesto `dsh.bundle`; instalações git precisam de `prepare` + `allowBuilds`; publique `lib/` ou um tarball.
|
|
139
139
|
6. Documentação bilíngue em pares; descrições/prompts são comportamento; mudanças não triviais levam Agent Note; rode o conjunto mínimo de verificações antes de empurrar (dsh-pre-push-checks).
|
|
140
140
|
7. IDs opacos entre limites são branded (`Branded<B>` de `dsh-brand`), nunca `string` crua.
|
|
141
|
-
8. Membros de `SessionEventMap` são required-on-read: o envelope `ignorable` desaparece no 0.1.2-alpha.1 (a leitura falha fechada — um build que não conhece um tipo de evento recusa o log), e appends de eventos próprios de plugins cruzam uma porta adaptativa que para de gravar em hosts sem envelope; 0.1.2-
|
|
141
|
+
8. Membros de `SessionEventMap` são required-on-read: o envelope `ignorable` desaparece no 0.1.2-alpha.1 (a leitura falha fechada — um build que não conhece um tipo de evento recusa o log), e appends de eventos próprios de plugins cruzam uma porta adaptativa que para de gravar em hosts sem envelope; 0.1.2-rc.1 mantém o campo ignorable?: true apenas para compatibilidade de leitura de logs armazenados (seu Session.append ainda não consegue estampar o marcador), então a porta continua sem gravar (sem mudança de comportamento). Apenas mudanças de formato estrutural bumpam `SESSION_FORMAT_VERSION`. O switch sobre `SessionEvent` cai num `default` documentado — sem `assertNever` (união merge-extensible).
|
|
142
142
|
|
|
143
143
|
## Lista rápida de armadilhas da comunidade (detalhes: guia §7.3 / community-repo-deep-dive.md)
|
|
144
144
|
|
|
@@ -147,7 +147,7 @@ Protocolo de chunks: `block-start` → `text-delta*` → `block-end` (bloco comp
|
|
|
147
147
|
- Junctions do Windows via PowerShell `New-Item -ItemType Junction`; letra de unidade do vitest em maiúscula `C:/`.
|
|
148
148
|
- `DSH_PERMISSION_MODE=danger-full-access` é de alto risco (sem backend de sandbox no Windows, aprovações desativadas); `DSH_*` em `~/.dsh/.env` quebra a inicialização.
|
|
149
149
|
- Arquivos de sessão são zstd multiframe: use `scanZstdFrames`/`createZstdFrameDecoder` (`@deepseek-ai/dsh-session-persistence-jsonl/src/zstd.ts`).
|
|
150
|
-
- npm: o `dsh` sem escopo é o projeto alheio node-dsh (um shell) — instale `@deepseek-ai/dsh
|
|
150
|
+
- npm: o `dsh` sem escopo é o projeto alheio node-dsh (um shell) — instale `@deepseek-ai/dsh` (latest=0.1.2-rc.1); `@deepseek-ai/dsh-tools` e `@deepseek-ai/dsh-session-persistence-jsonl` têm `latest` obsoleto (0.0.1-rc.1), fixe `next` (0.1.2-rc.1); `create-dsh-plugin` latest=0.2.1; dsh-core/dsh-sdk seguem não publicados (verificado em 2026-09-04).
|
|
151
151
|
- Aplique `resolve()` nos dois lados antes de comparar caminhos (armadilha da barra invertida do Windows).
|
|
152
152
|
|
|
153
153
|
## Links de documentação
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# DeepSeek Harness 0.1.2-
|
|
1
|
+
# DeepSeek Harness 0.1.2-rc.1 恢复信封 ignorable?: true 字段但仅用于存量日志读取兼容(其 Session.append 仍无法盖章),门控行为不变。 插件开发速查表
|
|
2
2
|
|
|
3
3
|
> 一页式速查。细节回到 [plugin-dev-guide.md](plugin-dev-guide.md) 与 [references](../references/)。
|
|
4
4
|
|
|
@@ -146,7 +146,7 @@ Chunk 协议:`block-start` → `text-delta*` → `block-end`(完整块)→
|
|
|
146
146
|
- Windows junction 用 PowerShell `New-Item -ItemType Junction`;vitest 盘符大写 `C:/`。
|
|
147
147
|
- `DSH_PERMISSION_MODE=danger-full-access` 高风险(Windows 无沙箱后端、禁用审批);`DSH_*` 放 `~/.dsh/.env` 会报错。
|
|
148
148
|
- 会话文件多帧 zstd:用 `scanZstdFrames`/`createZstdFrameDecoder`(`@deepseek-ai/dsh-session-persistence-jsonl/src/zstd.ts`)。
|
|
149
|
-
- npm:无作用域 `dsh` 是无关项目 node-dsh(shell)——官方包是 `@deepseek-ai/dsh
|
|
149
|
+
- npm:无作用域 `dsh` 是无关项目 node-dsh(shell)——官方包是 `@deepseek-ai/dsh`(latest=0.1.2-rc.1);`@deepseek-ai/dsh-tools` 与 `@deepseek-ai/dsh-session-persistence-jsonl` 的 `latest` 是过期版本(0.0.1-rc.1),要钉 `next`(0.1.2-rc.1);`create-dsh-plugin` latest=0.2.1;dsh-core/dsh-sdk 仍未发布(2026-09-04 复核)。
|
|
150
150
|
- 路径比较前两侧都 `resolve()`(Windows 反斜杠陷阱)。
|
|
151
151
|
|
|
152
152
|
## 文档链接
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-guide",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "The dsh-plugin-guide knowledge base plus the dsh-plugin-dev CLI toolchain: official docs, Cordis primer, community deep-dives, and battle-tested pitfalls registered as an on-demand agent skill, with a scaffolder, static checker, and pack verifier for building DSH plugins.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -62,12 +62,13 @@
|
|
|
62
62
|
"tsdown": "^0.22.14",
|
|
63
63
|
"typescript": "^5.9.3"
|
|
64
64
|
},
|
|
65
|
-
"devDependencies": {
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@deepseek-ai/dsh-attachment": "0.1.2-rc.1",
|
|
66
67
|
"@types/node": "^22.20.1",
|
|
67
68
|
"vitest": "^3.2.7"
|
|
68
69
|
},
|
|
69
70
|
"peerDependencies": {
|
|
70
|
-
"@deepseek-ai/dsh": ">=0.1.
|
|
71
|
+
"@deepseek-ai/dsh": ">=0.1.2-rc.1 <0.2.0"
|
|
71
72
|
},
|
|
72
73
|
"peerDependenciesMeta": {
|
|
73
74
|
"@deepseek-ai/dsh": {
|
|
@@ -105,7 +106,7 @@
|
|
|
105
106
|
],
|
|
106
107
|
"compatibility": {
|
|
107
108
|
"dshVersions": [
|
|
108
|
-
"0.1.2-
|
|
109
|
+
"0.1.2-rc.1"
|
|
109
110
|
]
|
|
110
111
|
},
|
|
111
112
|
"capability": {
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
DeepSeek Harness is an all-plugin Cordis agent harness. Read [docs/architecture.md](docs/architecture.md) before changing `packages/`; follow [docs/AGENTS.md](docs/AGENTS.md) for documentation.
|
|
4
4
|
|
|
5
|
-
## Pre-
|
|
5
|
+
## Pre-stable APIs and released Session data
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Public APIs are pre-stable; update every consumer. Released Session JSONL follows [adjacent migration](.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.md): body reads may add a version-named successor but never move, overwrite, or delete committed generations; predecessors imply neither fallback nor downgrade support. SQLite domains use monotonic `SCHEMA_VERSION`.
|
|
8
8
|
|
|
9
9
|
**Application launch.** Only `dsh` profiles launch supported Node apps; package bins, demos, and public SDK argv escapes are forbidden ([rule](docs/architecture.md#application-launch)).
|
|
10
10
|
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
|---|---|
|
|
8
8
|
| Source checkout | `D:\deepseek-harness` |
|
|
9
9
|
| Source ref | `origin/master` |
|
|
10
|
-
| Source commit | `
|
|
11
|
-
| Synced at (UTC) | 2026-09-
|
|
10
|
+
| Source commit | `d347e703908d0406b7a7ef80e3a0e594d86b2215` |
|
|
11
|
+
| Synced at (UTC) | 2026-09-04T13:53:48Z |
|
|
12
12
|
| Scope | tracked files at the ref: `docs/`, root `AGENTS.md`, `BENCHMARK.md`, `CLAUDE.md` (symlink target text), `CONTRIBUTING.md`/`.zh.md`/`.i18n.yaml`, `README.zh.md`/`.i18n.yaml` (the upstream English `README.md` is not in this dir; its snapshot lives in `downloads/github/harness/README.md`), `THIRD_PARTY_NOTICES.md`, `LICENSE`, `packages/AGENTS.md`, `packages/README.md`, `vendor/README.md`, `website/docs.ts` |
|
|
13
|
-
| File counts | docs/:
|
|
13
|
+
| File counts | docs/: 241 md files (118 .zh.md pairs) |
|
|
14
14
|
| Pruned this run | 15 out-of-scope/upstream-deleted entries |
|
|
15
15
|
|
|
16
16
|
Drift check: `pwsh -File scripts/verify-kit.ps1 -Checkout <checkout>` (tracked files only).
|
|
@@ -70,6 +70,7 @@ External packages that a workspace package resolves at runtime. The tier covers
|
|
|
70
70
|
| [`e2b`](https://github.com/e2b-dev/e2b) | MIT |
|
|
71
71
|
| [`eventsource-parser`](https://github.com/rexxars/eventsource-parser) | MIT |
|
|
72
72
|
| [`fflate`](https://github.com/101arrowz/fflate) | MIT |
|
|
73
|
+
| [`fs-ext`](https://github.com/baudehlo/node-fs-ext) | MIT |
|
|
73
74
|
| [`immer`](https://github.com/immerjs/immer) | MIT |
|
|
74
75
|
| [`ipaddr.js`](https://github.com/whitequark/ipaddr.js) | MIT |
|
|
75
76
|
| [`js-yaml`](https://github.com/nodeca/js-yaml) | MIT |
|
|
@@ -112,6 +113,7 @@ External packages that a workspace package resolves at runtime. The tier covers
|
|
|
112
113
|
|
|
113
114
|
pnpm applies local patches to the following packages at install time, so shipped artifacts carry modified copies; each patch file is the complete record of the modification:
|
|
114
115
|
|
|
116
|
+
- `@yao-pkg/pkg@6.21.0` — [`patches/@yao-pkg__pkg@6.21.0.patch`](patches/@yao-pkg__pkg@6.21.0.patch)
|
|
115
117
|
- `node-pty@1.2.0-beta.15` — [`patches/node-pty@1.2.0-beta.15.patch`](patches/node-pty@1.2.0-beta.15.patch)
|
|
116
118
|
|
|
117
119
|
## Official Claude Code platform payloads
|
|
@@ -147,6 +149,7 @@ External packages **directly declared** only by repository tooling, test infrast
|
|
|
147
149
|
| [`@testing-library/react`](https://github.com/testing-library/react-testing-library) | MIT |
|
|
148
150
|
| [`@types/babel__code-frame`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
149
151
|
| [`@types/compression`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
152
|
+
| [`@types/fs-ext`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
150
153
|
| [`@types/js-yaml`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
151
154
|
| [`@types/jsdom`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
152
155
|
| [`@types/negotiator`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
@@ -161,6 +164,7 @@ External packages **directly declared** only by repository tooling, test infrast
|
|
|
161
164
|
| [`@types/ws`](https://github.com/DefinitelyTyped/DefinitelyTyped) | MIT |
|
|
162
165
|
| [`@vitejs/plugin-react`](https://github.com/vitejs/vite-plugin-react) | MIT |
|
|
163
166
|
| [`@vitest/coverage-v8`](https://github.com/vitest-dev/vitest) | MIT |
|
|
167
|
+
| [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) | MIT |
|
|
164
168
|
| [`@yarnpkg/cli-dist`](https://github.com/yarnpkg/berry) | BSD-2-Clause |
|
|
165
169
|
| [`cytoscape`](https://github.com/cytoscape/cytoscape.js) | MIT |
|
|
166
170
|
| [`cytoscape-cose-bilkent`](https://github.com/cytoscape/cytoscape.js-cose-bilkent) | MIT |
|
|
@@ -204,12 +208,6 @@ Direct dependencies of the `pyproject.toml` manifests, plus `uv` as the developm
|
|
|
204
208
|
| [`pytest`](https://github.com/pytest-dev/pytest) | MIT | test-only |
|
|
205
209
|
| [`uv`](https://github.com/astral-sh/uv) | MIT / Apache-2.0 | development workflow tool |
|
|
206
210
|
|
|
207
|
-
## Fetched at build time
|
|
208
|
-
|
|
209
|
-
| Package | License | Role |
|
|
210
|
-
| --- | --- | --- |
|
|
211
|
-
| [`@yao-pkg/pkg`](https://github.com/yao-pkg/pkg) | MIT | invoked by `scripts/build-exe-for-python-sdk.ts` to assemble the single-file SDK runtime executable |
|
|
212
|
-
|
|
213
211
|
## First-party native packages
|
|
214
212
|
|
|
215
213
|
`@deepseek-ai/node-addon-landlock-run` (and its platform packages) is built and released from this repository under BSD 3-Clause. It is listed here for completeness; it is first-party, not third-party.
|
|
@@ -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 docs/agent-lifecycle.md
|
|
5
|
-
agent-lifecycle.md:
|
|
6
|
-
agent-lifecycle.zh.md:
|
|
5
|
+
agent-lifecycle.md: afe660051e5d3ce4ae40f5d4fd32e6ff47c99dba
|
|
6
|
+
agent-lifecycle.zh.md: ad81fbefe7afae5de4c497aa6522b1a5fcf54fe7
|
|
@@ -35,14 +35,16 @@ sequenceDiagram
|
|
|
35
35
|
Driver->>Prompt: <code>system-prompt/assemble</code> waterfall
|
|
36
36
|
Driver->>LLM: <code>agent/request</code> waterfall, then <code>llm/stream</code> waterfall
|
|
37
37
|
LLM-->>Driver: StreamChunk*
|
|
38
|
-
Driver
|
|
39
|
-
Session-->>SDK: <code>session/event</code> <code>assistant/chunk</code>*
|
|
38
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> chunk*
|
|
40
39
|
alt final adapter or terminal in-band request failure
|
|
40
|
+
Driver->>Session: <code>assistant/attempt</code>
|
|
41
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
41
42
|
Driver->>Session: <code>step/end</code>
|
|
42
43
|
Driver->>Hooks: <code>agent/request-error</code> waterfall
|
|
43
44
|
Hooks-->>Driver: return retry action or preserve the original error
|
|
44
45
|
else model request succeeded
|
|
45
46
|
Driver->>Session: <code>assistant/message</code>
|
|
47
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
46
48
|
Driver->>Tools: classify pending call by executionMode
|
|
47
49
|
loop barriers and bounded rolling pool, reclassify before start
|
|
48
50
|
opt call starts
|
|
@@ -71,7 +73,7 @@ sequenceDiagram
|
|
|
71
73
|
Driver-->>SDK: <code>agent/status</code> idle
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
The `assistant/message` event records every successful provider call, including content-less and `max-tokens` finishes. Empty content stays out of derived history,
|
|
76
|
+
The `assistant/message` event records every successful provider call, including content-less and `max-tokens` finishes, and embeds the exact compact timed stream. Empty content stays out of derived history. A failed, retried, cancelled, or stream-error attempt that reaches settlement without a surface message records its stream as `assistant/attempt`. Live `agent/assistant-stream` chunk frames are transient; replay reads either durable settlement, and a hard process loss before settlement leaves no durable attempt stream.
|
|
75
77
|
|
|
76
78
|
`dsh-compaction-basic` uses `agent/pre-step` for pressure before request derivation and `agent/request-error` only for canonical context overflow. Once either trigger qualifies, optional tool-result pruning runs before summary selection. Recovery works between the closed failed step and failed turn close, and opens a fresh retry turn only when pruning or summarization advances the surface replacement generation; otherwise the original request error remains authoritative.
|
|
77
79
|
|
|
@@ -37,14 +37,16 @@ sequenceDiagram
|
|
|
37
37
|
Driver->>Prompt: <code>system-prompt/assemble</code> waterfall
|
|
38
38
|
Driver->>LLM: <code>agent/request</code> waterfall, then <code>llm/stream</code> waterfall
|
|
39
39
|
LLM-->>Driver: StreamChunk*
|
|
40
|
-
Driver
|
|
41
|
-
Session-->>SDK: <code>session/event</code> <code>assistant/chunk</code>*
|
|
40
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> chunk*
|
|
42
41
|
alt final adapter or terminal in-band request failure
|
|
42
|
+
Driver->>Session: <code>assistant/attempt</code>
|
|
43
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
43
44
|
Driver->>Session: <code>step/end</code>
|
|
44
45
|
Driver->>Hooks: <code>agent/request-error</code> waterfall
|
|
45
46
|
Hooks-->>Driver: return retry action or preserve the original error
|
|
46
47
|
else model request succeeded
|
|
47
48
|
Driver->>Session: <code>assistant/message</code>
|
|
49
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
48
50
|
Driver->>Tools: classify pending call by executionMode
|
|
49
51
|
loop barriers and bounded rolling pool, reclassify before start
|
|
50
52
|
opt call starts
|
|
@@ -73,7 +75,7 @@ sequenceDiagram
|
|
|
73
75
|
Driver-->>SDK: <code>agent/status</code> idle
|
|
74
76
|
```
|
|
75
77
|
|
|
76
|
-
`assistant/message` 事件会记录每次成功的提供方调用,包括返回空内容或以 `max-tokens`
|
|
78
|
+
`assistant/message` 事件会记录每次成功的提供方调用,包括返回空内容或以 `max-tokens` 结束的调用,并嵌入精确的紧凑带时间 stream。空内容不会进入派生历史。失败、重试、取消或 stream error attempt 到达 settlement 时,如果没有 surface message,就会把 stream 记录为 `assistant/attempt`。实时 `agent/assistant-stream` chunk frame 是瞬态数据;回放读取任一种持久 settlement,如果进程在 settlement 前硬中断,则不会留下持久 attempt stream。
|
|
77
79
|
|
|
78
80
|
`dsh-compaction-basic` 在派生请求之前通过 `agent/pre-step` 处理压力,而 `agent/request-error` 仅用于规范的上下文溢出。任一触发条件满足后,系统都会先执行可选的工具结果剪枝,再选择摘要。恢复发生在失败步骤结束之后、失败轮次结束之前;只有当剪枝或摘要生成推进了 surface replacement generation 时,系统才会开启一个全新的重试轮次,否则仍以原始请求错误为准。
|
|
79
81
|
|
|
@@ -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 docs/architecture.md
|
|
5
|
-
architecture.md:
|
|
6
|
-
architecture.zh.md:
|
|
5
|
+
architecture.md: 959ea9edf8f337b1ebe20df8b998f11fe35beb2e
|
|
6
|
+
architecture.zh.md: 9666f3589ce3710f84306d685ec1c5e7a49d1b78
|
|
@@ -84,7 +84,9 @@ turn/start
|
|
|
84
84
|
step/start
|
|
85
85
|
append entered messages as user/message
|
|
86
86
|
derive model history from the log
|
|
87
|
-
agent/request -> llm/stream -> assistant
|
|
87
|
+
agent/request -> llm/stream -> agent/assistant-stream start
|
|
88
|
+
agent/assistant-stream chunk*
|
|
89
|
+
assistant/message | assistant/attempt -> agent/assistant-stream end
|
|
88
90
|
tool/call* -> tools/pre-execute -> tools/execute -> tools/post-execute -> tool/result*
|
|
89
91
|
step/end
|
|
90
92
|
tools owe another request, or next-step input arrived -> claim -> next step
|
|
@@ -92,7 +94,7 @@ turn/start
|
|
|
92
94
|
turn/end
|
|
93
95
|
```
|
|
94
96
|
|
|
95
|
-
`turn/*`, `step/*`, `user/message`, `assistant
|
|
97
|
+
`turn/*`, `step/*`, `user/message`, `assistant/message`, `assistant/attempt`, and `tool/*` are durable session events; the rest are live extension points across three domains. `agent/assistant-stream` publishes process-local start, transient chunk, and end frames. The loop commits the complete compact stream as one message or log-only attempt before a committed end frame, and the Web Session-follow adapter is the live event's only remote consumer. `agent/pre-step`, `agent/request`, `llm/stream`, and the three `tools/*` events are waterfalls, whose listeners must call `next()` to delegate; `agent/turn-stopping` is serial and has no `next()`.
|
|
96
98
|
|
|
97
99
|
Input reaches the driver through one inbox. Some messages wake it immediately; injected context waits in the inbox until another message does.
|
|
98
100
|
|
|
@@ -102,7 +104,9 @@ Details: the [sequence diagram](agent-lifecycle.md), the [tool pipeline](tool-ex
|
|
|
102
104
|
|
|
103
105
|
## Session log
|
|
104
106
|
|
|
105
|
-
The session log is the source of the context the model sees. `deriveMessages()` projects model history from it
|
|
107
|
+
The session log is the source of the context the model sees. `deriveMessages()` projects model history from it. Each `assistant/message` embeds the exact compact timed stream that produced its assembled content; `assistant/attempt` retains settled failed, retried, cancelled, and stream-error attempts without adding model history. Fork, resume, transcripts, telemetry, and persistence all derive from these durable settlements, while live UI incrementality comes from `agent/assistant-stream`; a hard process loss before settlement leaves no durable attempt stream ([decision](../.agents/notes/implemented/architecture/2026-09-01-v2-embedded-assistant-streams.md)).
|
|
108
|
+
|
|
109
|
+
Session consumers know only the current logical format. Header-only `stat` and `list` rescan each Session directory, select its numerically highest canonical generation, and translate a supported historical header without loading events or publishing a successor. A stored-session `open` selects that same generation, refuses a future version, or composes the static adjacent migration chain in memory, validates the final result, and exclusively publishes only that version-named successor beside the unchanged source before returning a handle; semantic interrupted-turn repair remains a handle consumer responsibility. JSONL v0 uses `session.jsonl[.zstd]`, v1 and later use lowercase `session.vN.jsonl[.zstd]`, and committed generation paths are never renamed, replaced, or deleted. The JSONL provider owns physical framing, compression, generation selection, and exclusive publication, while each adjacent migration package owns exactly one `vN -> vN+1` step ([decision](../.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.md)).
|
|
106
110
|
|
|
107
111
|
**Model-visible means logged.** Anything that reaches a model request must be reconstructable from the log, and a runtime invariant asserts it. This is why a new model-visible input requires a new session event: extend `SessionEventMap` and render from the log.
|
|
108
112
|
|
|
@@ -88,7 +88,9 @@ turn/start
|
|
|
88
88
|
step/start
|
|
89
89
|
append entered messages as user/message
|
|
90
90
|
derive model history from the log
|
|
91
|
-
agent/request -> llm/stream -> assistant
|
|
91
|
+
agent/request -> llm/stream -> agent/assistant-stream start
|
|
92
|
+
agent/assistant-stream chunk*
|
|
93
|
+
assistant/message | assistant/attempt -> agent/assistant-stream end
|
|
92
94
|
tool/call* -> tools/pre-execute -> tools/execute -> tools/post-execute -> tool/result*
|
|
93
95
|
step/end
|
|
94
96
|
tools owe another request, or next-step input arrived -> claim -> next step
|
|
@@ -96,7 +98,7 @@ turn/start
|
|
|
96
98
|
turn/end
|
|
97
99
|
```
|
|
98
100
|
|
|
99
|
-
`turn/*`、`step/*`、`user/message`、`assistant
|
|
101
|
+
`turn/*`、`step/*`、`user/message`、`assistant/message`、`assistant/attempt` 和 `tool/*` 是持久会话事件;其余是分属三个事件域的实时扩展点。`agent/assistant-stream` 发布进程本地 start、瞬态 chunk 与 end frame。loop 会在 committed end frame 前把完整紧凑 stream 提交为一个 message 或仅日志 attempt;Web Session-follow adapter 是该 live event 唯一的远程消费方。`agent/pre-step`、`agent/request`、`llm/stream` 和三个 `tools/*` 事件是 waterfall(瀑布式事件),其监听器必须调用 `next()` 才能委托下去;`agent/turn-stopping` 是 serial 事件,没有 `next()`。
|
|
100
102
|
|
|
101
103
|
输入通过同一个 inbox 到达驱动器。有些消息会立即唤醒它;注入的上下文会留在 inbox 中,直到另一条消息将其唤醒。
|
|
102
104
|
|
|
@@ -106,7 +108,9 @@ turn/end
|
|
|
106
108
|
|
|
107
109
|
## 会话日志
|
|
108
110
|
|
|
109
|
-
会话日志是模型所见上下文的来源。`deriveMessages()`
|
|
111
|
+
会话日志是模型所见上下文的来源。`deriveMessages()` 从中投影出模型历史。每个 `assistant/message` 都嵌入产生其组装内容的精确紧凑带时间 stream;`assistant/attempt` 保留已到达 settlement 的失败、重试、取消与 stream error attempt,且不添加模型历史。fork、恢复、transcript(文本记录)、遥测与持久化都从这些持久 settlement 派生,实时 UI 增量则来自 `agent/assistant-stream`;如果进程在 settlement 前硬中断,则不会留下持久 attempt stream(见[决策](../.agents/notes/implemented/architecture/2026-09-01-v2-embedded-assistant-streams.zh.md))。
|
|
112
|
+
|
|
113
|
+
Session 消费方只了解当前逻辑格式。仅 header 的 `stat` 与 `list` 会重新扫描每个 Session 目录,选择数值最高的规范 generation,并在不加载事件或发布后继的情况下转换受支持的历史 header。已存储 Session 的 `open` 选择同一 generation,拒绝未来版本,或在内存中组合静态相邻迁移链、校验最终结果,并在返回句柄前以不覆盖方式只发布该版本命名的后继文件且保持源文件不变;语义层的中断轮次修复仍由句柄消费方负责。JSONL v0 使用 `session.jsonl[.zstd]`,v1 及后续版本使用小写 `session.vN.jsonl[.zstd]`;已提交 generation 路径绝不重命名、替换或删除。JSONL provider 负责物理 framing、压缩、generation 选择与排他发布,每个相邻迁移包只负责一个 `vN -> vN+1` 步骤([决策](../.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.zh.md))。
|
|
110
114
|
|
|
111
115
|
**模型可见即已记录。** 抵达模型请求的一切都必须能从日志重建,并由一项运行时不变量断言这一点。因此,新增一项模型可见输入就需要新增一个会话事件:扩展 `SessionEventMap` 并从日志渲染。
|
|
112
116
|
|
|
@@ -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 docs/capability-seams.md
|
|
5
|
-
capability-seams.md:
|
|
6
|
-
capability-seams.zh.md:
|
|
5
|
+
capability-seams.md: ecc88e397f41c4d279effa2df9d1b29108756ea5
|
|
6
|
+
capability-seams.zh.md: 105752ac01007d24788bcfbcb2eb22c07cfdd0f5
|
|
@@ -14,6 +14,8 @@ flowchart LR
|
|
|
14
14
|
pkg_tool_fs["tool-fs"]
|
|
15
15
|
pkg_llm_pi_ai["llm-pi-ai"]
|
|
16
16
|
pkg_llm_deepseek["llm-deepseek"]
|
|
17
|
+
pkg_client_file_upload["client-file-upload"]
|
|
18
|
+
svc_fileUploads["ctx.fileUploads<br/>Agent-scoped staged file uploads"]
|
|
17
19
|
pkg_llm["llm"]
|
|
18
20
|
svc_llm["ctx.llm<br/>LLM adapter registry"]
|
|
19
21
|
pkg_llm_replay["llm-replay"]
|
|
@@ -235,6 +237,7 @@ flowchart LR
|
|
|
235
237
|
pkg_authorization --> svc_authorization
|
|
236
238
|
pkg_bash_local --> svc_shell
|
|
237
239
|
pkg_bash_sandbox --> svc_shell
|
|
240
|
+
pkg_client_file_upload --> svc_fileUploads
|
|
238
241
|
pkg_client_modules --> svc_clientModules
|
|
239
242
|
pkg_code_runtime --> svc_codeRuntime
|
|
240
243
|
pkg_code_runtime_worker_thread --> svc_codeRuntime
|
|
@@ -364,6 +367,7 @@ flowchart LR
|
|
|
364
367
|
svc_e2b --> pkg_fs_e2b
|
|
365
368
|
svc_e2b --> pkg_subprocess_e2b
|
|
366
369
|
svc_fileReferences --> pkg_api_session_controller
|
|
370
|
+
svc_fileUploads --> pkg_api_session_controller
|
|
367
371
|
svc_fs --> pkg_tool_fs
|
|
368
372
|
svc_invariants --> pkg_agent
|
|
369
373
|
svc_invariants --> pkg_agent_loop
|
|
@@ -466,6 +470,7 @@ flowchart LR
|
|
|
466
470
|
| ctx key | Role | Owner | Implementations | Direct consumers | Companion plugins | Note |
|
|
467
471
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
468
472
|
| `ctx.attachments` | `seam` | [`attachment`](../packages/attachment/attachment) | [`attachment-local`](../packages/attachment/attachment-local) | [`api-session-controller`](../packages/api/session-controller), [`tool-fs`](../packages/fs/tool-fs), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-deepseek`](../packages/llm/llm-deepseek) | - | The host commits accepted images before session events; provider adapters resolve authorized durable references into provider-native content. |
|
|
473
|
+
| `ctx.fileUploads` | `core` | [`client-file-upload`](../packages/client/file-upload) | - | [`api-session-controller`](../packages/api/session-controller) | - | Owns streaming intake, durable storage, and staged receipt lifetime; the Session controller binds receipts to accepted submissions. |
|
|
469
474
|
| `ctx.llm` | `seam` | [`llm`](../packages/llm/llm) | [`llm-deepseek`](../packages/llm/llm-deepseek), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-replay`](../packages/test-support/llm-replay) | [`agent-loop`](../packages/core/agent-loop), [`compaction-basic`](../packages/compaction/compaction-basic) | - | Adapters register provider implementations; the loop and compaction call the provider-neutral stream service. |
|
|
470
475
|
| `ctx.deepseekLlmApiExtensions` | `seam` | [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions) | [`session-log-deepseek`](../packages/session/session-log-deepseek), [`plugin-package-inventory-deepseek`](../packages/llm/plugin-package-inventory-deepseek) | [`llm-deepseek`](../packages/llm/llm-deepseek) | - | Plugins prepare independent top-level fields; the official adapter merges them and commits their delivery state after HTTP acceptance. |
|
|
471
476
|
| `ctx.tokenMeter` | `core` | [`token-meter`](../packages/llm/token-meter) | - | [`compaction-basic`](../packages/compaction/compaction-basic) | - | Owns isolated per-session replay folds; pressure consumers share immutable revisioned measurements. |
|
|
@@ -16,6 +16,8 @@ flowchart LR
|
|
|
16
16
|
pkg_tool_fs["tool-fs"]
|
|
17
17
|
pkg_llm_pi_ai["llm-pi-ai"]
|
|
18
18
|
pkg_llm_deepseek["llm-deepseek"]
|
|
19
|
+
pkg_client_file_upload["client-file-upload"]
|
|
20
|
+
svc_fileUploads["ctx.fileUploads<br/>Agent-scoped staged file uploads"]
|
|
19
21
|
pkg_llm["llm"]
|
|
20
22
|
svc_llm["ctx.llm<br/>LLM adapter registry"]
|
|
21
23
|
pkg_llm_replay["llm-replay"]
|
|
@@ -237,6 +239,7 @@ flowchart LR
|
|
|
237
239
|
pkg_authorization --> svc_authorization
|
|
238
240
|
pkg_bash_local --> svc_shell
|
|
239
241
|
pkg_bash_sandbox --> svc_shell
|
|
242
|
+
pkg_client_file_upload --> svc_fileUploads
|
|
240
243
|
pkg_client_modules --> svc_clientModules
|
|
241
244
|
pkg_code_runtime --> svc_codeRuntime
|
|
242
245
|
pkg_code_runtime_worker_thread --> svc_codeRuntime
|
|
@@ -366,6 +369,7 @@ flowchart LR
|
|
|
366
369
|
svc_e2b --> pkg_fs_e2b
|
|
367
370
|
svc_e2b --> pkg_subprocess_e2b
|
|
368
371
|
svc_fileReferences --> pkg_api_session_controller
|
|
372
|
+
svc_fileUploads --> pkg_api_session_controller
|
|
369
373
|
svc_fs --> pkg_tool_fs
|
|
370
374
|
svc_invariants --> pkg_agent
|
|
371
375
|
svc_invariants --> pkg_agent_loop
|
|
@@ -468,6 +472,7 @@ flowchart LR
|
|
|
468
472
|
| ctx 键 | 角色 | 所属包 | 实现 | 直接消费方 | 配套插件 | 说明 |
|
|
469
473
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
470
474
|
| `ctx.attachments` | `seam` | [`attachment`](../packages/attachment/attachment) | [`attachment-local`](../packages/attachment/attachment-local) | [`api-session-controller`](../packages/api/session-controller), [`tool-fs`](../packages/fs/tool-fs), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-deepseek`](../packages/llm/llm-deepseek) | - | 宿主会在会话事件之前提交已接受的图片;提供方适配器将已授权的持久引用解析为提供方原生内容。 |
|
|
475
|
+
| `ctx.fileUploads` | `core` | [`client-file-upload`](../packages/client/file-upload) | - | [`api-session-controller`](../packages/api/session-controller) | - | 负责流式接收、持久存储和暂存回执生命周期;Session Controller 将回执绑定到已接受的提交。 |
|
|
471
476
|
| `ctx.llm` | `seam` | [`llm`](../packages/llm/llm) | [`llm-deepseek`](../packages/llm/llm-deepseek), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-replay`](../packages/test-support/llm-replay) | [`agent-loop`](../packages/core/agent-loop), [`compaction-basic`](../packages/compaction/compaction-basic) | - | 适配器注册提供方实现;agent loop(智能体循环)与压缩功能调用提供方无关的流服务。 |
|
|
472
477
|
| `ctx.deepseekLlmApiExtensions` | `seam` | [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions) | [`session-log-deepseek`](../packages/session/session-log-deepseek), [`plugin-package-inventory-deepseek`](../packages/llm/plugin-package-inventory-deepseek) | [`llm-deepseek`](../packages/llm/llm-deepseek) | - | 插件准备彼此独立的顶层字段;官方适配器会合并这些字段,并在 HTTP 接受后提交其交付状态。 |
|
|
473
478
|
| `ctx.tokenMeter` | `core` | [`token-meter`](../packages/llm/token-meter) | - | [`compaction-basic`](../packages/compaction/compaction-basic) | - | 拥有按会话隔离的回放折叠区;压力消费方共享不可变且带修订版本的测量结果。 |
|
|
@@ -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 docs/config-catalog.md
|
|
5
|
-
config-catalog.md:
|
|
6
|
-
config-catalog.zh.md:
|
|
5
|
+
config-catalog.md: af72b832723423745817fd340022e65c0c066d36
|
|
6
|
+
config-catalog.zh.md: 6d961f22b3c29fbc4355e99c8de55823e014b74c
|