dsh-gitbash-shell 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,66 @@
3
3
  > 倒序排列,新版本条目在最上面。条目格式:`## vX.Y.Z — YYYY-MM-DD` + 类型(feat / fix / docs / chore)+ 要点 + 相关链接。
4
4
  > 纪律见 AGENTS.md「变更记录纪律」:发版前先更新本文件并随版本提交;事故复盘、复现与真机验证记录也记在这里。
5
5
 
6
+ ## v0.27.0 — 2026-09-25
7
+
8
+ **类型**:feat(新设置「子代理/队员是否也使用 Git Bash」,默认开启 —— 用户 2026-09-25 追加需求)
9
+
10
+ ### 需求与语义
11
+ 用户原话:「gitbash 插件也是专门给个设置是否让子代理或者子队员使用 gitbash,默认启动。」
12
+
13
+ - **开关 `subagentDialect`(本插件行 Config 的 volatile 布尔,**默认 `true`**;旧宿主 ≤0.1.6 在 settings 命名空间 `gitbash-shell` 声明同名字段,**缺键 = true**)。
14
+ - **开(默认)**:委托代理 —— 子代理(`subagent`/`subagent_fork`)、团队队员(`spawn_teammate` 走 continuable-subagent 的 `spawn`/`fork`)、**嵌套子代理** —— 与主代理享受同一条方言链路。
15
+ - **关**:方言只对主代理生效,委托出去的请求回退官方 shell 语义(提示词不改写、路径参数不翻译、结果/报错不回显为 MSYS、`run_code` 程序字面量不翻译、不下发 `DSH_PATH_DIALECT`)。
16
+
17
+ ### 委托身份的判据(先查清链路,再动代码)
18
+ - 用**会话头**判定:`origin === 'subagent' || delegationDepth > 0` —— 与 dsh 自己的 `packages/deliverables/workspace-changes/src/index.ts:59-60` 同一对字段;由子代理驱动在 `packages/subagent/subagent/src/child-agent.ts:139-155` (`childSessionMeta`) 打上,`spawn`/`fork` 两种 provider 与嵌套深度都走它。
19
+ - 纯函数 `isDelegatedAgent(agent)` + 唯一判定点 `dialectApplies(dialect, agent)`;条件挂在 `assembleContext.agent`(`packages/core/agent/src/dispatch.ts:174` 的 `assembleContextFor` 传 `{ agent, scope }`)与 `exec.agent` / `execution.agent` 上。
20
+ - **未知形状一律视为"非委托"**(保留方言):判定不出来时按主代理处理。
21
+
22
+ ### 覆盖到的五个消费点(全部接同一个 gate,避免"半方言")
23
+ ① `system-prompt/assemble` 的源头改写与 run_code 句;② 指令 context 的 `text(context)` provider;③ `tools/execute` 的入参翻译 + 成功面回显;④ `tools/post-execute` 的失败面 `content`/`error.message`;⑤ `shellEnv.resolve(execution)` 的 `DSH_PATH_DIALECT` 事实。
24
+
25
+ ### 能力边界(如实写明,写进 README/AGENTS)
26
+ dsh **每个进程只有一个 shell 执行器**(`ctx.shell` 是单例服务),所以 **Git Bash 二进制本身仍是全局的**,本开关管的是**方言/翻译层**;关闭后委托代理见到与写出的是 Windows 形式路径,而 Git Bash 同样接受 `C:/...`,行为自洽。
27
+
28
+ ### 测试与证据
29
+ - 冒烟 **86/86 绿**:新增 3 条(① `isDelegatedAgent`/`dialectApplies` 矩阵:origin、depth 1/2、root、未知/抛错/`agent` 缺失,以及卡片写入断言;② OFF 时主代理保留、委托代理被挡 + 五个消费点都接 gate 的源码断言;③ 旧宿主/老配置**缺键 = true** 的回退);`tests/align-official.mjs` 四变体仍全绿(本版不动组合)。
30
+ - **真机两态(隔离 `DSH_HOME` + 新建 profile + 插件副本 `link:` 安装,真实 dsh 0.1.7-rc.2,本机 macOS)**:探针用 `ctx.agents.create()` 造**真**的 root / child(`origin:'subagent', delegationDepth:1`)/ nested(depth 2)三个 agent(实测会话头 `undefined` / `"subagent":1` / `"subagent":2`),再对每个 agent 调**真的** `ctx.systemPrompt.assemble({ agent, scope: agent })`:
31
+
32
+ | 开关 | main(root) | subagent | nested |
33
+ | --- | --- | --- | --- |
34
+ | **默认 ON** | 方言指令 = yes | **yes** | **yes** |
35
+ | **OFF**(行 Config `subagentDialect: false`) | yes | **no** | **no** |
36
+
37
+ ⇒ 两态下委托代理的方言确实不同(指令 context 出现/消失即 gate 的可观测面),主代理两态都保留。
38
+ **平台说明**:macOS 上方言/执行器面本来被 `process.platform === 'win32'` 门控,本次把**插件副本**的两处组装门(`system-prompt/assemble` 与指令 context)强制打开以取得请求级证据(报告中如实标注);**win32 真机仍未覆盖**(执行器是单例,与方言开关无关,不受本版影响)。
39
+ - 设置卡:方言区新增一行(21 语言 `sub.label`/`sub.hint`),写入本行 `subagentDialect`;文案明确"二进制仍全局、此开关管方言/翻译层"。
40
+
41
+ - 相关:用户需求(2026-09-25 追加);实现不变量见 AGENTS.md §4g,验证装置见「验证清单」第 8 条。
42
+
43
+ ## v0.26.1 — 2026-09-25
44
+
45
+ **类型**:fix(v0.26.0 的 workflow 互斥按「意图」而非「生效态」收敛:后端不可用时用户会白丢 workflow 能力)
46
+
47
+ > v0.26.0 把互斥条件写成「对方能力报 `pythonRuntime: true`」——那是**用户意图**。当对方的 preflight 失败(包被移除、解释器不合格、Windows),`!!js` 兜底与组合实际仍跑 Node,而本插件却已经把四个变体的 `workflow-ptc`/`tool-workflow` 关掉了:用户白丢一项能力,且卡片显示"已开启"与实际不符。dsh-ptc-cordis-preset **v0.15.1** 在能力服务上加了**加法字段** `pythonBackend: 'python' | 'node'`(用与 `!!js` 完全相同的合取计算),本版据此收敛。
48
+
49
+ - **① 互斥只在真正生效时发生**:新增纯函数 `pythonBackendActive(capability)` = 「意图 `pythonRuntime` 为真 **且** 生效态为 `'python'`」;`pluginsFor({ …, pythonActive })` 的形参由 `pythonRuntime` 改名 **`pythonActive`**,语义写明「run_code 实际会用的后端」——`workflowOn = kind !== 'ptc' && pythonActive !== true`。
50
+ - **② 旧 peer 回退(兼容硬要求)**:`peerBackend()` 对缺字段 / 类型不符 / getter 抛错一律返回 `undefined`(绝不把"没报"读成 `'node'`),`pythonBackendActive` 此时**用意图顶替** ⇒ 对方 < 0.15.1 的行为与 v0.26.0 **完全一致**,不会因缺字段崩溃或改变既有联动。
51
+ - **③ 日志把"真换了"与"想换但没生效"分开**:生效 → `peer reports the experimental CPython run_code backend: workflow rows go off in every variant`;意图 on 但未生效 → `peer has the CPython switch on but the effective backend is node|unreported (older peer: the intent stands in): workflow rows stay on (reason in the host log)`。
52
+ - **④ 卡片显示真实状态(防御性实现,当前不可达)**:从**同一份 peer 快照**读可选的 `pythonBackend`;意图 on + 生效 `node` ⇒ 状态值显示「Python(实验性) · **后端不可用,当前仍为 Node(原因见宿主启动日志)**」并另起一行红字;新增第 7 个词典键 `python.degraded`(**21 门语言**同齐)。字段缺省(旧 peer)⇒ 卡片与 v0.26.0 **逐字节一致**(不显示降级态)。
53
+ - **可达性拆分(Lead 裁决 A,2026-09-25)**:**「意图 on + 生效 node」这个状态本身是可达的** —— ptc 侧不拒绝把意图落成 true(Lead 明确不授权任何"单方面回写用户 settings 表单值"的行为,即不做"点开关被拒绝")。**不可达的是本插件这行降级显示**:浏览器侧只能读 `configForms.get('ptc-cordis').getSnapshot().value`(该行 **Config / settings 表单**),而 `pythonBackend` 只挂在**能力服务**上(宿主侧,浏览器读不到),ptc v0.15.1 的 Config schema 里没有该字段。因此现状是:ptc 卡显示 on + 红字原因,**本插件卡只显示 on**(hint 已指向宿主日志)。
54
+ - **后续项(本轮不做,避免再开一轮发布)**:由对方用**加法只读字段**把 `pythonBackend`/`pythonIssue` **投影进行 Config 快照**(不动用户意图字段 `pythonRuntime`);那一刻本插件**无需改动**即自动亮起(读的就是同一个键)。已记入最终报告的「已知限制/后续项」。
55
+ - **测试**:冒烟 **83/83 绿**(改写 2 条到 `pythonActive` 语义 + 新增 3 条:①生效态矩阵含旧 peer 回退与闭集校验 ②降级意图只上报不驱动 ③卡片降级态与 21 语言文案);`tests/align-official.mjs` 四个变体仍全绿(本版不动组合的官方行形态)。
56
+ - **真机 A/B/C(隔离 `DSH_HOME` + 新建 profile + `link:` 安装 + 探针能力,dsh 0.1.7-rc.2,本机 macOS,端口 3262-3264,收尾已清理)**:探针分别报三种能力形态,读数(`readDocument()` 的 `disabled`)与日志三例全部符合预期:
57
+
58
+ | 探针能力 | 日志 | 四变体的 `workflow-ptc`/`tool-workflow` |
59
+ | --- | --- | --- |
60
+ | `{pythonRuntime:true, pythonBackend:'python'}` | `peer reports the experimental CPython run_code backend: workflow rows go off in every variant` + 四条 `retired … (peer CPython backend changed; rows are rebuilt)` | **`disabled: true`**(互斥生效) |
61
+ | `{pythonRuntime:true, pythonBackend:'node'}` | `peer has the CPython switch on but the effective backend is node: workflow rows stay on (reason in the host log)`(**无**重建日志,行未变) | **保持启用**(`standard/cordis-gitbash` 不丢 workflow;`code-gitbash` 本就关) |
62
+ | `{pythonRuntime:true}`(旧 peer,缺生效字段) | 与第一行相同(意图顶替) | `disabled: true` —— 与 v0.26.0 行为**逐字节一致** |
63
+
64
+ - 协作边界:v0.15.1 的 `pythonBackend` 是**加法字段**,本插件零形状破坏;`pythonRuntime` 仍是两侧卡片读写的权威**意图**字段。发布后由 contract-rc2 在 task-10 复验两条通道一致性。
65
+
6
66
  ## v0.26.0 — 2026-09-25
7
67
 
8
68
  **类型**:feat(run_code 的实验性 Python 后端开关,与 dsh-ptc-cordis-preset 双向联动)+ fix(issue #10:JSON 转义的 Windows 路径多出前导斜杠)+ chore(dsh 0.1.7-rc.2 增量对齐复核)
@@ -39,6 +99,8 @@
39
99
  - **B(探针报 `pythonRuntime: true`)**:出现上面两行日志,四个变体**全部重建**,读数变为两行 `disabled: true`。
40
100
  - **两态都做真实挂载**:`agentPresets.acquireScope('<variant>')` 四个变体各返回 `MOUNT OK`(挂载审计无 failed 行),证明显式注册的组合在 rc.2 上确实可挂载,而不只是"注册成功"。
41
101
  - **Windows 专属面**:win32 分支(卡片禁用态、宿主拒绝写入、python 后端构造抛错)在 macOS 上**无法真机验证**,按实现 + 单测/模拟记录;本插件的执行器与路径方言层按 `process.platform === 'win32'` 门控,而 python 后端仅 POSIX,两者在各自平台上互不重叠。
102
+ - **独立验证(发布后补记,2026-09-25,task-8,由另一位成员执行)**:用 **npm 已发布的 `dsh-gitbash-shell@0.26.0`** + `dsh-ptc-cordis-preset@0.15.0` 在隔离 `DSH_HOME` 上复验 —— **ptc → gitbash 方向联动通过**:把对方的行 Config `pythonRuntime` 置 `true` 后 boot,本插件打出 `peer reports the experimental CPython run_code backend: workflow rows go off in every variant` 以及四条 `retired … (peer CPython switch changed; rows are rebuilt)`;关态 boot **没有**这些行 ⇒ 能力感知 + 变体重建按设计工作(完整报告:`_rc2-contract/PYTHON-SWITCH-VERIFY.md`)。
103
+ - 仍未覆盖(留给集成阶段/真机):**反方向「在 gitbash 卡上改 → ptc 跟随」与两张卡的 UI 即时同步**(headless 无法操作设置卡,需真实 web 实例人工点选;两侧写的是同一个 `configForms` 字段,机制与 v0.25.0 已验证的 dedupe 镜像同构)以及 **win32 真机**(本机无 Windows;静态核对确认 ptc 侧平台表达式与 python 后端 `ptc-runtime-python/src/index.ts:837-839` 的「win32 构造即抛」一致,本插件侧按 `python.blocked` + 不画按钮实现平台限制)。
42
104
  - 相关:issue #10 https://github.com/KannaKuron/dsh-gitbash-shell/issues/10 ;对方仓库 dsh-ptc-cordis-preset v0.15.0(能力字段与运行行)
43
105
 
44
106
  ## v0.25.1 — 2026-09-24
package/README.md CHANGED
@@ -101,6 +101,22 @@ dsh-ptc-cordis-preset 报告它的 `PTC 创造模式` 已经是 Git Bash 版。
101
101
  0.24.x 的四个变体逐字不变;判定细节、生效时机与两侧同步方式见下方
102
102
  [「与 dsh-ptc-cordis-preset 联动」](#与-dsh-ptc-cordis-preset-联动)。
103
103
 
104
+ ### 子代理/队员是否也用 Git Bash:`subagentDialect`(默认开,v0.27.0)
105
+
106
+ ```yaml
107
+ - id: gitbash-shell
108
+ config:
109
+ subagentDialect: true # 默认;false = 方言只对主代理生效
110
+ ```
111
+
112
+ 默认开启时,子代理、团队队员(含嵌套子代理)与主代理走**同一条**方言链路:提示词里的路径同样是 `/c/...` 形式、
113
+ 路径参数同样被翻译、结果与报错同样回显为 MSYS 形式、`run_code` 程序里的路径字面量同样被翻译,`DSH_PATH_DIALECT` 环境事实也照常下发。
114
+ 关闭后这些**只对主代理生效**:委托出去的请求保持官方 shell 语义(提示词不改写、路径参数原样传递),适合"子代理要跑原生 Windows 工具链"的场景。
115
+
116
+ > 能力边界(如实说明):dsh **每个进程只有一个 shell 执行器**(`ctx.shell` 是单例服务),所以 Git Bash **二进制本身仍是全局的**,
117
+ > 这个开关管的是**方言/翻译层**,不是"换一个 shell"。关闭后委托代理见到与写出的是 Windows 形式路径(`C:/...`),Git Bash 同样接受,行为自洽。
118
+ > 委托身份的判据用会话头的 `origin === 'subagent'` / `delegationDepth > 0`(与 dsh 自身一致),判定不出来时按主代理处理(保留方言)。
119
+
104
120
  配合 `agent-presets` 的 `default`,新会话直接落在 Git Bash 模式,免去每次在
105
121
  模式选择器里翻找(原版 shipped 模式无法替换或隐藏——部署级、只读):
106
122
 
@@ -204,6 +220,13 @@ Config 的布尔字段 `pythonRuntime`(默认 `false`),由它在 profile 组合
204
220
  `language`/`executionInstructions` 决定,组合文本不变)。
205
221
  - **生效时机**:**重启 dsh 之后生效**(后端行的替换在 profile 组合期求值);设置卡上的状态
206
222
  两侧即时同步,只有后端切换需要重启。若开启后没有生效,原因见 dsh 启动日志。
223
+ - **"想开"与"真的开了"是两件事**:后端不可用(包被移除 / 解释器低于 3.10 / Windows)时,开关的
224
+ 意图仍可为"开",但组合**照旧跑 Node** —— 此时 **workflow 侧不再被连带禁用**(v0.26.1:互斥只看
225
+ 实际生效的后端;v0.26.0 只看意图,会让用户白丢 workflow 能力),**原因见 dsh 启动日志**。
226
+ > 关于卡片上的"后端不可用,当前仍为 Node"这行提示:本插件已实现该降级文案(21 语言),但它要等
227
+ > **对方把生效态投影进行 Config 快照**后才会亮起 —— 浏览器只读得到那份快照,而生效态目前只在
228
+ > 宿主侧的能力服务里(见 AGENTS.md §4f)。在此之前:对方卡片显示"已开启 + 原因",本插件卡片
229
+ > 显示"已开启"(hint 指向宿主日志)。
207
230
  - **平台**:该后端**仅支持 POSIX**——它在 Windows 上构造即抛错,所以 Windows 上开关显示为
208
231
  禁用并注明原因,宿主侧也会拒绝写入。
209
232
  - **与 workflow 互斥**:`workflow-ptc` 硬要求 TypeScript 后端(`ctx.ptcRuntime.language ===
package/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-gitbash-shell",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "main": "./src/index.js",
5
5
  "description": "Windows 全模式 Git Bash:用 Git for Windows bash 替换 PowerShell 执行器,并物化 standard/minimal/code/cordis 的 Git Bash 变体 preset。双 era 适配 dsh <= 0.1.1(内置 id 'code')与 >= 0.1.2(改名 'ptc'),启动探测自动选择,preset id 永不变。联动:dsh-ptc-cordis-preset(两者同装时 PTC 创造模式自动物化为 Git Bash 版)+ dsh-better-sidebar(终端 UI 标签与模型 terminal_* 工具自动切到 Git Bash)。",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-gitbash-shell",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "description": "Windows 上让 agent 的每条 shell 命令改经 Git for Windows bash 执行;物化四个内置预设的 Git Bash 变体,统一 MSYS 盘根路径方言,侧栏终端接管可开关。· Run every agent shell command through Git for Windows bash on Windows; materialize Git Bash variants of the built-in presets, unify the MSYS drive-root path dialect, and adopt the sidebar terminal behind a switch.",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -55,6 +55,11 @@ window.__ModuleLoader__.load({
55
55
  both cards read and write this one form field, so either side changes
56
56
  both. Absent on a peer that predates the switch ⇒ no row is drawn. */
57
57
  var PEER_PYTHON_FIELD = "pythonRuntime";
58
+ /** The peer's EFFECTIVE backend on the same snapshot ('python' | 'node'),
59
+ when its version reports one: 'node' while the intent is on means the
60
+ preflight failed (package missing / interpreter too old / Windows), so
61
+ the card shows the degraded state instead of claiming Python. */
62
+ var PEER_PYTHON_BACKEND_FIELD = "pythonBackend";
58
63
 
59
64
  // ── dictionaries ────────────────────────────────────────────────────────
60
65
  // zh/en stay inline; the third languages live in LOCALES below, one entry
@@ -82,6 +87,8 @@ window.__ModuleLoader__.load({
82
87
  "split.hint": "glob 的绝对 pattern(/c/.../*.md)自动拆为 path + 相对 pattern;关闭则原样传递。",
83
88
  "code.label": "run_code 程序内路径",
84
89
  "code.hint": "run_code 程序里写的 /c/... 等路径字面量在执行前按同一张挂载表翻译;注释、插值模板、$VAR 与非路径字符串不动,扫描有任何不确定就整份不改。 并给程序补 TEMP/TMP:空 env 下 Windows 的 os.tmpdir() 会得到 undefined\\temp,程序会静默写错地方。",
90
+ "sub.label": "子代理/队员使用 Git Bash",
91
+ "sub.hint": "默认开启:子代理与团队队员(含嵌套子代理)的提示词方言、路径参数翻译、结果回显与 DSH_PATH_DIALECT 环境事实与主代理一致。关闭后这些只对主代理生效,子代理按官方 shell 语义运行(提示词不改写、路径参数不翻译);注意 dsh 每个进程只有一个 shell 执行器,所以 Git Bash 二进制本身仍是全局的,此开关管的是方言/翻译层。",
85
92
  "eol.label": "Git 行尾(与 Linux 一致)",
86
93
  "eol.hint": "模型跑的 git 命令按 Linux 行为:core.autocrlf=input、core.eol=lf。你自己终端的 git 与仓库里的 .gitattributes 都不受影响。",
87
94
  "bash.label": "Git Bash 路径",
@@ -98,6 +105,7 @@ window.__ModuleLoader__.load({
98
105
  "python.on": "Python(实验性)",
99
106
  "python.off": "Node / TypeScript(默认)",
100
107
  "python.hint": "默认关闭时 run_code 用官方 Node/TypeScript 后端,与官方 ptc 组合逐字节一致;开启后改用 dsh 实验性 CPython 后端(@deepseek-ai/dsh-experimental-ptc-runtime-python),run_code 的语言、生成的 SDK 提示词与工具呈现随之切到 Python。要求 POSIX 平台与 CPython ≥ 3.10(Windows 不可用);与 workflow 工具互斥——官方 Python 组合同样禁用 workflow,因此开启期间本插件四个变体的 workflow 侧强制关闭(你的工作流设置值保留,关掉后恢复)。改动需重启 dsh 后生效;此开关就是 dsh-ptc-cordis-preset 设置卡上的同一个开关——两侧共享同一份状态,任一侧改动两侧同步。仅在已安装 dsh-ptc-cordis-preset 时显示。若置为开启后未生效,原因见宿主启动日志。",
108
+ "python.degraded": "后端不可用,当前仍为 Node(原因见宿主启动日志)",
101
109
  "python.blocked": "本机是 Windows:实验性 Python 后端仅支持 POSIX,此开关不可用。",
102
110
  };
103
111
 
@@ -121,6 +129,8 @@ window.__ModuleLoader__.load({
121
129
  "split.hint": "An absolute glob pattern (/c/.../*.md) splits into path + relative pattern; off passes it through verbatim.",
122
130
  "code.label": "run_code program paths",
123
131
  "code.hint": "Path literals inside a run_code program are translated through the same mount table before it runs; comments, interpolated templates, $VARs and non-path strings stay untouched, and any uncertainty leaves the whole program as written. It also seeds TEMP/TMP for the program: with an empty env Windows' os.tmpdir() returns undefined\\temp and writes land in a bogus folder.",
132
+ "sub.label": "Subagents/teammates use Git Bash",
133
+ "sub.hint": "On (default): subagents and team members — nested ones included — get the same prompt dialect, path-argument translation, result echo and DSH_PATH_DIALECT fact as the main agent. Off: those apply to the main agent only, and delegated agents run with the official shell semantics (no prompt rewrite, no path translation). Note that dsh has exactly one shell executor per process, so the Git Bash binary stays global; this switch governs the dialect/translation layers.",
124
134
  "eol.label": "Git line endings (Linux match)",
125
135
  "eol.hint": "Git commands the model runs behave like Linux: core.autocrlf=input, core.eol=lf. Your own terminal's git and a repository's .gitattributes are unaffected.",
126
136
  "bash.label": "Git Bash path",
@@ -137,6 +147,7 @@ window.__ModuleLoader__.load({
137
147
  "python.on": "Python (experimental)",
138
148
  "python.off": "Node / TypeScript (default)",
139
149
  "python.hint": "While off (default) run_code uses the official Node/TypeScript backend, byte-identical to the shipped ptc composition; turning it on switches to dsh's experimental CPython backend (@deepseek-ai/dsh-experimental-ptc-runtime-python), which also switches run_code's language, generated SDK prompt and tool presentation to Python. Requires a POSIX platform and CPython ≥ 3.10 (unavailable on Windows) and is mutually exclusive with the workflow tool — the official Python composition disables workflow too, so the workflow side of all four variants is forced off while this is on (your workflow setting is kept and restored when you turn it back off). Takes effect after restarting dsh; this is the very same switch on dsh-ptc-cordis-preset's card — both sides share one state, so either side updates both. Shown only while dsh-ptc-cordis-preset is installed. If turning it on does not take effect, the dsh startup log states why.",
150
+ "python.degraded": "backend unavailable, still Node (reason in the dsh startup log)",
140
151
  "python.blocked": "This host is Windows: the experimental Python backend supports POSIX only, so this switch is unavailable.",
141
152
  };
142
153
 
@@ -170,6 +181,8 @@ window.__ModuleLoader__.load({
170
181
  "split.hint": "نمط glob المطلق يُقسم إلى path + نمط نسبي؛ الإيقاف يمرره كما هو.",
171
182
  "code.label": "مسارات برامج run_code",
172
183
  "code.hint": "تُترجم السلاسل النصية للمسارات المكتوبة داخل برنامج run_code عبر جدول التحميل نفسه قبل التشغيل؛ وتبقى التعليقات والقوالب ذات الإدراج و$VAR والسلاسل غير المسارية كما هي، وأي التباس يُبقي البرنامج كاملًا دون تغيير. وتُهيَّأ أيضًا TEMP/TMP للبرنامج: مع بيئة فارغة يعيد os.tmpdir() على ويندوز القيمة undefined\\temp فيُكتب في مكان خاطئ.",
184
+ "sub.label": "استخدام الوكلاء الفرعيين لـ Git Bash",
185
+ "sub.hint": "مُفعَّل (افتراضيًا): يحصل الوكلاء الفرعيون وأعضاء الفريق — بما في ذلك المتداخلون — على لهجة المطالبة وترجمة مسارات الوسائط وصدى النتائج وحقيقة DSH_PATH_DIALECT نفسها التي يحصل عليها الوكيل الرئيسي. عند الإيقاف تُطبَّق هذه على الوكيل الرئيسي فقط ويعمل الوكلاء المفوَّضون بدلالات الصدفة الرسمية (دون إعادة كتابة المطالبة أو ترجمة المسارات). لاحظ أن dsh يملك مُنفِّذ صدفة واحدًا لكل عملية، لذا يبقى ثنائي Git Bash عامًّا؛ هذا المفتاح يحكم طبقتي اللهجة والترجمة.",
173
186
  "eol.label": "نهايات أسطر Git (مطابقة لينكس)",
174
187
  "eol.hint": "أوامر git التي يشغّلها النموذج تتبع سلوك لينكس: core.autocrlf=input و core.eol=lf؛ لا يتأثر طرفيتك ولا ملف .gitattributes للمستودع.",
175
188
  "bash.label": "مسار Git Bash",
@@ -186,6 +199,7 @@ window.__ModuleLoader__.load({
186
199
  "python.on": "Python (تجريبي)",
187
200
  "python.off": "Node / TypeScript (افتراضي)",
188
201
  "python.hint": "عند الإيقاف (افتراضيًا) يستخدم run_code الخلفية الرسمية Node/TypeScript، مطابقة تمامًا لتركيبة ptc الرسمية؛ وعند التشغيل يتحول إلى خلفية CPython التجريبية في dsh (@deepseek-ai/dsh-experimental-ptc-runtime-python)، فتتحول لغة run_code ومطالبة SDK المولَّدة وعرض الأداة إلى Python. يتطلب نظام POSIX و CPython ≥ 3.10 (غير متاح على Windows)، وهو متعارض مع أداة workflow — فالتركيبة الرسمية لـ Python تعطّل workflow أيضًا، لذا يبقى جانب workflow مُعطَّلًا في المتغيّرات الأربعة أثناء التشغيل (قيمتك محفوظة وتعود عند الإيقاف). يسري التغيير بعد إعادة تشغيل dsh؛ هذا هو المفتاح نفسه على بطاقة dsh-ptc-cordis-preset — الجانبان يتشاركان حالة واحدة. يظهر فقط عند تثبيت dsh-ptc-cordis-preset. إذا لم يسري التشغيل، فسبب ذلك مذكور في سجل تشغيل dsh.",
202
+ "python.degraded": "الخلفية غير متاحة، لا يزال Node (السبب في سجل بدء التشغيل)",
189
203
  "python.blocked": "هذا المضيف يعمل بـ Windows: الخلفية التجريبية Python تدعم POSIX فقط، لذا لا يتوفر هذا المفتاح.",
190
204
  },
191
205
  /* locale: de */
@@ -209,6 +223,8 @@ window.__ModuleLoader__.load({
209
223
  "split.hint": "Ein absolutes Glob-Muster zerfällt in Pfad + relatives Muster; aus übergibt es unverändert.",
210
224
  "code.label": "Pfade in run_code-Programmen",
211
225
  "code.hint": "Pfadliterale in einem run_code-Programm werden vor dem Start über dieselbe Mount-Tabelle übersetzt; Kommentare, interpolierte Templates, $VARs und Nicht-Pfad-Strings bleiben unangetastet, und bei Unklarheit bleibt das ganze Programm unverändert. Zusätzlich werden TEMP/TMP für das Programm gesetzt: bei leerer Umgebung liefert os.tmpdir() unter Windows undefined\\temp und schreibt an einen falschen Ort.",
226
+ "sub.label": "Subagenten/Teammitglieder nutzen Git Bash",
227
+ "sub.hint": "An (Standard): Subagenten und Teammitglieder — auch verschachtelte — erhalten denselben Prompt-Dialekt, dieselbe Pfadargument-Übersetzung, dieselbe Ergebnisanzeige und dieselbe DSH_PATH_DIALECT-Tatsache wie der Hauptagent. Aus: Das gilt nur für den Hauptagenten, delegierte Agenten laufen mit den offiziellen Shell-Semantiken (keine Prompt-Umschreibung, keine Pfadübersetzung). Beachte: dsh hat genau einen Shell-Executor pro Prozess, das Git-Bash-Binary bleibt also global; dieser Schalter steuert die Dialekt-/Übersetzungsschichten.",
212
228
  "eol.label": "Git-Zeilenenden (Linux-gleich)",
213
229
  "eol.hint": "Vom Modell ausgeführte git-Befehle verhalten sich wie unter Linux: core.autocrlf=input, core.eol=lf. Dein eigenes Terminal und die .gitattributes eines Repos bleiben unberührt.",
214
230
  "bash.label": "Git-Bash-Pfad",
@@ -225,6 +241,7 @@ window.__ModuleLoader__.load({
225
241
  "python.on": "Python (experimentell)",
226
242
  "python.off": "Node / TypeScript (Standard)",
227
243
  "python.hint": "Aus (Standard): run_code nutzt das offizielle Node/TypeScript-Backend, byte-identisch zur ausgelieferten ptc-Komposition; an: dsh wechselt auf das experimentelle CPython-Backend (@deepseek-ai/dsh-experimental-ptc-runtime-python), womit Sprache, generierter SDK-Prompt und Darstellung von run_code auf Python umstellen. Erfordert POSIX und CPython ≥ 3.10 (unter Windows nicht verfügbar) und ist mit dem workflow-Tool unvereinbar — die offizielle Python-Komposition deaktiviert workflow ebenfalls, deshalb bleibt die workflow-Seite aller vier Varianten so lange aus (dein Workflow-Wert bleibt erhalten und kehrt nach dem Ausschalten zurück). Wirkt nach einem Neustart von dsh; dies ist derselbe Schalter auf der Karte von dsh-ptc-cordis-preset — beide Seiten teilen einen Zustand. Nur sichtbar, solange dsh-ptc-cordis-preset installiert ist. Bleibt das Einschalten ohne Wirkung, nennt das dsh-Startprotokoll den Grund.",
244
+ "python.degraded": "Backend nicht verfügbar, weiterhin Node (Grund im dsh-Startprotokoll)",
228
245
  "python.blocked": "Dieser Host ist Windows: Das experimentelle Python-Backend unterstützt nur POSIX, der Schalter ist nicht verfügbar.",
229
246
  },
230
247
  /* locale: fr */
@@ -248,6 +265,8 @@ window.__ModuleLoader__.load({
248
265
  "split.hint": "Un motif glob absolu se scinde en chemin + motif relatif ; désactivé le passe tel quel.",
249
266
  "code.label": "chemins dans les programmes run_code",
250
267
  "code.hint": "Les littéraux de chemin écrits dans un programme run_code sont traduits via la même table de montage avant exécution; commentaires, gabarits interpolés, $VAR et chaînes non-chemin restent intacts, et la moindre incertitude laisse le programme tel quel. TEMP/TMP sont aussi fournis au programme : avec un env vide, os.tmpdir() sous Windows renvoie undefined\\temp et écrit au mauvais endroit.",
268
+ "sub.label": "Les sous-agents utilisent Git Bash",
269
+ "sub.hint": "Activé (par défaut) : les sous-agents et membres d'équipe — y compris imbriqués — reçoivent le même dialecte de prompt, la même traduction des chemins d'arguments, le même écho de résultat et le même fait DSH_PATH_DIALECT que l'agent principal. Désactivé : ces éléments ne s'appliquent qu'à l'agent principal et les agents délégués suivent les sémantiques de shell officielles (pas de réécriture du prompt, pas de traduction des chemins). À noter : dsh n'a qu'un seul exécuteur de shell par processus, le binaire Git Bash reste donc global ; cet interrupteur régit les couches de dialecte et de traduction.",
251
270
  "eol.label": "fins de ligne Git (comme Linux)",
252
271
  "eol.hint": "Les commandes git lancées par le modèle suivent le comportement Linux : core.autocrlf=input, core.eol=lf. Votre terminal et les .gitattributes du dépôt ne sont pas touchés.",
253
272
  "bash.label": "Chemin Git Bash",
@@ -264,6 +283,7 @@ window.__ModuleLoader__.load({
264
283
  "python.on": "Python (expérimental)",
265
284
  "python.off": "Node / TypeScript (par défaut)",
266
285
  "python.hint": "Désactivé (par défaut), run_code utilise le backend officiel Node/TypeScript, identique octet pour octet à la composition ptc livrée ; activé, dsh bascule sur le backend CPython expérimental (@deepseek-ai/dsh-experimental-ptc-runtime-python) : la langue, l'invite SDK générée et la présentation de run_code passent en Python. Exige POSIX et CPython ≥ 3.10 (indisponible sous Windows) et est incompatible avec l'outil workflow — la composition Python officielle désactive aussi workflow, donc le côté workflow des quatre variantes reste désactivé tant que l'option est active (ta valeur est conservée et revient à la désactivation). Prend effet après un redémarrage de dsh ; c'est le même interrupteur que sur la carte de dsh-ptc-cordis-preset — les deux côtés partagent un seul état. Affiché uniquement si dsh-ptc-cordis-preset est installé. Si l'activation reste sans effet, le journal de démarrage de dsh en indique la raison.",
286
+ "python.degraded": "backend indisponible, toujours Node (raison dans le journal de démarrage de dsh)",
267
287
  "python.blocked": "Cet hôte est sous Windows : le backend Python expérimental n'est disponible que sur POSIX, l'interrupteur est indisponible.",
268
288
  },
269
289
  /* locale: hi */
@@ -287,6 +307,8 @@ window.__ModuleLoader__.load({
287
307
  "split.hint": "एब्सोल्यूट glob पैटर्न path + रिलेटिव पैटर्न में विभाजित होता है; बंद इसे वैसे ही पास करता है।",
288
308
  "code.label": "run_code प्रोग्राम पथ",
289
309
  "code.hint": "run_code प्रोग्राम में लिखे पथ लिटरल चलने से पहले उसी माउंट तालिका से अनूदित होते हैं; टिप्पणियाँ, इंटरपोलेटेड टेम्पलेट, $VAR और गैर-पथ स्ट्रिंग अछूते रहते हैं, और किसी भी अनिश्चितता पर पूरा प्रोग्राम अपरिवर्तित रहता है। साथ ही प्रोग्राम के लिए TEMP/TMP भर दिए जाते हैं: खाली env में Windows पर os.tmpdir() undefined\\temp देता है और गलत जगह लिखता है।",
310
+ "sub.label": "सबएजेंट/टीम सदस्य Git Bash इस्तेमाल करें",
311
+ "sub.hint": "चालू (डिफ़ॉल्ट): सबएजेंट और टीम सदस्य — नेस्टेड सहित — मुख्य एजेंट जैसा ही प्रॉम्प्ट डायलेक्ट, पाथ आर्ग्युमेंट अनुवाद, परिणाम इको और DSH_PATH_DIALECT तथ्य पाते हैं। बंद: ये केवल मुख्य एजेंट पर लागू होते हैं और प्रतिनिधित एजेंट आधिकारिक शेल अर्थ में चलते हैं (प्रॉम्प्ट नहीं बदलता, पाथ अनुवाद नहीं होता)। ध्यान दें: dsh में प्रति प्रोसेस एक ही शेल एक्ज़ीक्यूटर होता है, इसलिए Git Bash बाइनरी वैश्विक रहती है; यह स्विच डायलेक्ट/अनुवाद परतों को नियंत्रित करता है।",
290
312
  "eol.label": "Git पंक्ति-अंत (Linux जैसा)",
291
313
  "eol.hint": "मॉडल द्वारा चलाए git कमांड Linux व्यवहार अपनाते हैं: core.autocrlf=input, core.eol=lf। आपका टर्मिनल और रेपो का .gitattributes अछूते रहते हैं।",
292
314
  "bash.label": "Git Bash पथ",
@@ -303,6 +325,7 @@ window.__ModuleLoader__.load({
303
325
  "python.on": "Python (प्रयोगात्मक)",
304
326
  "python.off": "Node / TypeScript (डिफ़ॉल्ट)",
305
327
  "python.hint": "बंद (डिफ़ॉल्ट) रहने पर run_code आधिकारिक Node/TypeScript बैकएंड इस्तेमाल करता है, जो भेजे गए ptc संयोजन से पूरी तरह मेल खाता है; चालू करने पर dsh का प्रयोगात्मक CPython बैकएंड (@deepseek-ai/dsh-experimental-ptc-runtime-python) चलता है और run_code की भाषा, बना SDK प्रॉम्प्ट तथा प्रस्तुति Python में बदल जाती है। इसके लिए POSIX और CPython ≥ 3.10 चाहिए (Windows पर उपलब्ध नहीं), और यह workflow टूल से परस्पर अनन्य है — आधिकारिक Python संयोजन भी workflow बंद करता है, इसलिए चालू रहने तक चारों वेरिएंट का workflow पक्ष बंद रहता है (आपकी workflow सेटिंग सुरक्षित रहती है और बंद करने पर लौट आती है)। बदलाव dsh को फिर से शुरू करने के बाद लागू होता है; यह dsh-ptc-cordis-preset के कार्ड पर मौजूद वही स्विच है — दोनों ओर एक ही स्थिति साझा होती है। यह केवल तभी दिखता है जब dsh-ptc-cordis-preset इंस्टॉल हो। चालू करने पर असर न हो तो कारण dsh के स्टार्टअप लॉग में मिलेगा।",
328
+ "python.degraded": "बैकएंड उपलब्ध नहीं, अब भी Node (कारण dsh स्टार्टअप लॉग में)",
306
329
  "python.blocked": "यह होस्ट Windows है: प्रयोगात्मक Python बैकएंड केवल POSIX पर चलता है, इसलिए यह स्विच उपलब्ध नहीं है।",
307
330
  },
308
331
  /* locale: id */
@@ -326,6 +349,8 @@ window.__ModuleLoader__.load({
326
349
  "split.hint": "Pattern glob absolut dipecah menjadi path + pattern relatif; nonaktif meneruskannya apa adanya.",
327
350
  "code.label": "jalur dalam program run_code",
328
351
  "code.hint": "Literal jalur yang ditulis di program run_code diterjemahkan lewat tabel mount yang sama sebelum dijalankan; komentar, template berinterpolasi, $VAR, dan string non-jalur dibiarkan, dan bila ada keraguan seluruh program tidak diubah. TEMP/TMP juga diisi untuk program: dengan env kosong, os.tmpdir() di Windows mengembalikan undefined\\temp dan menulis ke lokasi salah.",
352
+ "sub.label": "Subagen/teman tim memakai Git Bash",
353
+ "sub.hint": "Aktif (bawaan): subagen dan anggota tim — termasuk yang bersarang — mendapat dialek prompt, terjemahan argumen path, gema hasil, dan fakta DSH_PATH_DIALECT yang sama seperti agen utama. Nonaktif: semuanya hanya berlaku untuk agen utama dan agen yang didelegasikan berjalan dengan semantik shell resmi (prompt tidak ditulis ulang, path tidak diterjemahkan). Catatan: dsh hanya punya satu eksekutor shell per proses, jadi biner Git Bash tetap global; sakelar ini mengatur lapisan dialek/terjemahan.",
329
354
  "eol.label": "akhir baris Git (sama seperti Linux)",
330
355
  "eol.hint": "Perintah git yang dijalankan model mengikuti perilaku Linux: core.autocrlf=input, core.eol=lf. Terminal Anda dan .gitattributes repo tidak terpengaruh.",
331
356
  "bash.label": "Path Git Bash",
@@ -342,6 +367,7 @@ window.__ModuleLoader__.load({
342
367
  "python.on": "Python (eksperimental)",
343
368
  "python.off": "Node / TypeScript (bawaan)",
344
369
  "python.hint": "Saat nonaktif (bawaan), run_code memakai backend resmi Node/TypeScript, identik byte demi byte dengan komposisi ptc resmi; saat aktif, dsh memakai backend CPython eksperimental (@deepseek-ai/dsh-experimental-ptc-runtime-python) sehingga bahasa run_code, prompt SDK yang dihasilkan, dan penyajiannya beralih ke Python. Memerlukan POSIX dan CPython ≥ 3.10 (tidak tersedia di Windows) serta saling eksklusif dengan alat workflow — komposisi Python resmi juga menonaktifkan workflow, jadi sisi workflow keempat varian tetap mati selama ini aktif (nilai workflow-mu dipertahankan dan kembali saat dimatikan). Berlaku setelah dsh dimulai ulang; ini sakelar yang sama di kartu dsh-ptc-cordis-preset — kedua sisi berbagi satu status. Hanya tampil saat dsh-ptc-cordis-preset terpasang. Jika diaktifkan tetapi tidak berpengaruh, alasannya ada di log mulai dsh.",
370
+ "python.degraded": "backend tidak tersedia, masih Node (alasan di log mulai dsh)",
345
371
  "python.blocked": "Host ini Windows: backend Python eksperimental hanya mendukung POSIX, sakelar ini tidak tersedia.",
346
372
  },
347
373
  /* locale: it */
@@ -365,6 +391,8 @@ window.__ModuleLoader__.load({
365
391
  "split.hint": "Un pattern glob assoluto si divide in percorso + pattern relativo; off lo passa invariato.",
366
392
  "code.label": "percorsi nei programmi run_code",
367
393
  "code.hint": "I letterali di percorso scritti in un programma run_code vengono tradotti con la stessa tabella di mount prima dell'esecuzione; commenti, template interpolati, $VAR e stringhe non di percorso restano intatti e qualsiasi incertezza lascia il programma invariato. Inoltre TEMP/TMP vengono forniti al programma: con env vuoto, os.tmpdir() su Windows restituisce undefined\\temp e scrive nel posto sbagliato.",
394
+ "sub.label": "Subagenti/compagni usano Git Bash",
395
+ "sub.hint": "Attivo (predefinito): subagenti e membri del team — anche annidati — ricevono lo stesso dialetto del prompt, la stessa traduzione dei percorsi negli argomenti, lo stesso eco dei risultati e lo stesso fatto DSH_PATH_DIALECT dell'agente principale. Disattivo: valgono solo per l'agente principale e gli agenti delegati usano le semantiche di shell ufficiali (nessuna riscrittura del prompt, nessuna traduzione dei percorsi). Nota: dsh ha un solo esecutore di shell per processo, quindi il binario Git Bash resta globale; questo interruttore governa gli strati di dialetto e traduzione.",
368
396
  "eol.label": "fine riga Git (come Linux)",
369
397
  "eol.hint": "I comandi git eseguiti dal modello seguono il comportamento Linux: core.autocrlf=input, core.eol=lf. Il tuo terminale e i .gitattributes del repo non vengono toccati.",
370
398
  "bash.label": "Percorso Git Bash",
@@ -381,6 +409,7 @@ window.__ModuleLoader__.load({
381
409
  "python.on": "Python (sperimentale)",
382
410
  "python.off": "Node / TypeScript (predefinito)",
383
411
  "python.hint": "Disattivato (predefinito) run_code usa il backend ufficiale Node/TypeScript, identico byte per byte alla composizione ptc distribuita; attivandolo dsh passa al backend CPython sperimentale (@deepseek-ai/dsh-experimental-ptc-runtime-python): lingua, prompt SDK generato e presentazione di run_code passano a Python. Richiede POSIX e CPython ≥ 3.10 (non disponibile su Windows) ed è incompatibile con lo strumento workflow — anche la composizione Python ufficiale disattiva workflow, quindi il lato workflow di tutte e quattro le varianti resta spento finché è attivo (il tuo valore viene conservato e torna alla disattivazione). Ha effetto dopo il riavvio di dsh; è lo stesso interruttore sulla scheda di dsh-ptc-cordis-preset — entrambi i lati condividono un unico stato. Visibile solo quando dsh-ptc-cordis-preset è installato. Se l'attivazione non ha effetto, il motivo è nel log di avvio di dsh.",
412
+ "python.degraded": "backend non disponibile, resta Node (motivo nel log di avvio di dsh)",
384
413
  "python.blocked": "Questo host è Windows: il backend Python sperimentale supporta solo POSIX, l'interruttore non è disponibile.",
385
414
  },
386
415
  /* locale: ja */
@@ -404,6 +433,8 @@ window.__ModuleLoader__.load({
404
433
  "split.hint": "絶対 glob パターンを path + 相対パターンに分割;オフならそのまま渡します。",
405
434
  "code.label": "run_code プログラム内のパス",
406
435
  "code.hint": "run_code プログラム内に書いた /c/... などのパスリテラルは実行前に同じマウント表で変換されます。コメント・補間テンプレート・$VAR・パス以外の文字列は変更せず、解析に不確かさがあればプログラム全体をそのまま実行します。 さらにプログラムに TEMP/TMP を渡します: 空の env では Windows の os.tmpdir() が undefined\\temp を返し、誤った場所に書き込みます。",
436
+ "sub.label": "サブエージェント/チームメンバーも Git Bash を使う",
437
+ "sub.hint": "オン(既定):サブエージェントとチームメンバー(ネスト含む)は、メインエージェントと同じプロンプト方言・パス引数の翻訳・結果エコー・DSH_PATH_DIALECT の事実を受け取ります。オフ:これらはメインエージェントのみに適用され、委譲されたエージェントは公式の shell セマンティクスで動作します(プロンプト改写なし、パス翻訳なし)。なお dsh はプロセスごとに shell 実行器を 1 つだけ持つため、Git Bash バイナリ自体は常に全体共通です。このスイッチが制御するのは方言/翻訳の層です。",
407
438
  "eol.label": "Git の行末(Linux と同じ)",
408
439
  "eol.hint": "モデルが実行する git コマンドは Linux と同じ挙動になります: core.autocrlf=input、core.eol=lf。あなたのターミナルやリポジトリの .gitattributes は影響を受けません。",
409
440
  "bash.label": "Git Bash パス",
@@ -420,6 +451,7 @@ window.__ModuleLoader__.load({
420
451
  "python.on": "Python(実験的)",
421
452
  "python.off": "Node / TypeScript(既定)",
422
453
  "python.hint": "オフ(既定)では run_code は公式の Node/TypeScript バックエンドを使い、公式 ptc 構成とバイト単位で一致します。オンにすると dsh の実験的 CPython バックエンド(@deepseek-ai/dsh-experimental-ptc-runtime-python)に切り替わり、run_code の言語・生成される SDK プロンプト・提示が Python に変わります。POSIX と CPython ≥ 3.10 が必要(Windows では利用不可)で、workflow ツールとは排他です —— 公式 Python 構成も workflow を無効化するため、オン期間中は 4 変体すべてで workflow 側が強制的にオフになります(ワークフロー設定値は保持され、オフに戻すと復帰)。変更は dsh の再起動後に有効です。これは dsh-ptc-cordis-preset のカードにある同じスイッチで、両側が同一状態を共有します。dsh-ptc-cordis-preset がインストールされているときだけ表示されます。 オンにしても効かない場合の理由は dsh の起動ログにあります。",
454
+ "python.degraded": "バックエンド利用不可・現在も Node(理由は dsh の起動ログ)",
423
455
  "python.blocked": "このホストは Windows です。実験的 Python バックエンドは POSIX 専用のため、このスイッチは利用できません。",
424
456
  },
425
457
  /* locale: ko */
@@ -443,6 +475,8 @@ window.__ModuleLoader__.load({
443
475
  "split.hint": "절대 glob 패턴을 path + 상대 패턴으로 분할; 끄면 그대로 전달.",
444
476
  "code.label": "run_code 프로그램 경로",
445
477
  "code.hint": "run_code 프로그램에 쓴 /c/... 경로 리터럴은 실행 전에 같은 마운트 표로 변환됩니다. 주석, 보간 템플릿, $VAR, 경로가 아닌 문자열은 그대로 두고, 스캔이 불확실하면 프로그램 전체를 그대로 둡니다. 또한 프로그램에 TEMP/TMP를 채워 줍니다: 빈 env에서 Windows의 os.tmpdir()는 undefined\\temp를 반환해 엉뚱한 곳에 씁니다.",
478
+ "sub.label": "서브에이전트/팀원도 Git Bash 사용",
479
+ "sub.hint": "켬(기본): 서브에이전트와 팀원(중첩 포함)은 메인 에이전트와 동일한 프롬프트 방언, 경로 인자 번역, 결과 에코, DSH_PATH_DIALECT 사실을 받습니다. 끔: 이것들은 메인 에이전트에만 적용되고 위임된 에이전트는 공식 shell 의미로 동작합니다(프롬프트 재작성 없음, 경로 번역 없음). 참고로 dsh는 프로세스당 shell 실행기가 하나뿐이라 Git Bash 바이너리 자체는 항상 전역입니다. 이 스위치는 방언/번역 계층을 제어합니다.",
446
480
  "eol.label": "Git 줄바꿈(Linux와 동일)",
447
481
  "eol.hint": "모델이 실행하는 git 명령은 Linux 동작을 따릅니다: core.autocrlf=input, core.eol=lf. 사용자의 터미널과 저장소의 .gitattributes는 영향을 받지 않습니다.",
448
482
  "bash.label": "Git Bash 경로",
@@ -459,6 +493,7 @@ window.__ModuleLoader__.load({
459
493
  "python.on": "Python(실험적)",
460
494
  "python.off": "Node / TypeScript(기본)",
461
495
  "python.hint": "끄면(기본) run_code는 공식 Node/TypeScript 백엔드를 사용해 공식 ptc 구성과 바이트 단위로 일치합니다. 켜면 dsh의 실험적 CPython 백엔드(@deepseek-ai/dsh-experimental-ptc-runtime-python)로 바뀌어 run_code의 언어, 생성되는 SDK 프롬프트, 도구 표시가 Python으로 전환됩니다. POSIX와 CPython ≥ 3.10이 필요하며(Windows에서는 사용 불가) workflow 도구와 상호 배타적입니다 — 공식 Python 구성도 workflow를 끄므로 켜져 있는 동안 네 변형 모두 workflow 쪽이 강제로 꺼집니다(워크플로 설정값은 유지되고 끄면 복구됩니다). 변경은 dsh 재시작 후 적용됩니다. 이 스위치는 dsh-ptc-cordis-preset 카드에 있는 바로 그 스위치이며 양쪽이 같은 상태를 공유합니다. dsh-ptc-cordis-preset이 설치되어 있을 때만 표시됩니다. 켠 뒤에도 적용되지 않으면 그 이유는 dsh 시작 로그에 있습니다.",
496
+ "python.degraded": "백엔드 사용 불가, 여전히 Node(이유는 dsh 시작 로그)",
462
497
  "python.blocked": "이 호스트는 Windows입니다. 실험적 Python 백엔드는 POSIX만 지원하므로 이 스위치를 쓸 수 없습니다.",
463
498
  },
464
499
  /* locale: nl */
@@ -482,6 +517,8 @@ window.__ModuleLoader__.load({
482
517
  "split.hint": "Een absoluut glob-patroon splitst in pad + relatief patroon; uit geeft het ongewijzigd door.",
483
518
  "code.label": "paden in run_code-programma's",
484
519
  "code.hint": "Pad-literalen in een run_code-programma worden vóór uitvoering via dezelfde mounttabel vertaald; opmerkingen, geïnterpoleerde templates, $VAR's en niet-pad-strings blijven ongemoeid, en bij twijfel blijft het hele programma ongewijzigd. Ook worden TEMP/TMP voor het programma gezet: met een lege env geeft os.tmpdir() op Windows undefined\\temp en schrijft het op de verkeerde plek.",
520
+ "sub.label": "Subagenten/teammaten gebruiken Git Bash",
521
+ "sub.hint": "Aan (standaard): subagenten en teamleden — ook geneste — krijgen hetzelfde promptdialect, dezelfde padargument-vertaling, dezelfde resultaat-echo en hetzelfde DSH_PATH_DIALECT-feit als de hoofdagent. Uit: die gelden alleen voor de hoofdagent en gedelegeerde agenten draaien met de officiële shell-semantiek (geen promptherschrijving, geen padvertaling). Let op: dsh heeft één shell-uitvoerder per proces, dus het Git Bash-binary blijft globaal; deze schakelaar beheert de dialect-/vertaallagen.",
485
522
  "eol.label": "Git regeleinden (zoals Linux)",
486
523
  "eol.hint": "Git-opdrachten die het model uitvoert volgen Linux-gedrag: core.autocrlf=input, core.eol=lf. Je eigen terminal en de .gitattributes van een repo blijven onaangetast.",
487
524
  "bash.label": "Git Bash-pad",
@@ -498,6 +535,7 @@ window.__ModuleLoader__.load({
498
535
  "python.on": "Python (experimenteel)",
499
536
  "python.off": "Node / TypeScript (standaard)",
500
537
  "python.hint": "Uit (standaard) gebruikt run_code de officiële Node/TypeScript-backend, byte voor byte gelijk aan de meegeleverde ptc-compositie; aan schakelt dsh over op de experimentele CPython-backend (@deepseek-ai/dsh-experimental-ptc-runtime-python), waardoor taal, gegenereerde SDK-prompt en weergave van run_code naar Python gaan. Vereist POSIX en CPython ≥ 3.10 (niet beschikbaar op Windows) en is onverenigbaar met de workflow-tool — de officiële Python-compositie schakelt workflow ook uit, dus de workflow-kant van alle vier varianten blijft uit zolang dit aan staat (je workflow-waarde blijft bewaard en keert terug als je het uitzet). Werkt na een herstart van dsh; dit is dezelfde schakelaar op de kaart van dsh-ptc-cordis-preset — beide kanten delen één status. Alleen zichtbaar zolang dsh-ptc-cordis-preset is geïnstalleerd. Werkt het aanzetten niet, dan staat de reden in het opstartlogboek van dsh.",
538
+ "python.degraded": "backend niet beschikbaar, nog steeds Node (reden in het dsh-opstartlogboek)",
501
539
  "python.blocked": "Deze host is Windows: de experimentele Python-backend ondersteunt alleen POSIX, deze schakelaar is niet beschikbaar.",
502
540
  },
503
541
  /* locale: pl */
@@ -521,6 +559,8 @@ window.__ModuleLoader__.load({
521
559
  "split.hint": "Absolutny wzorzec glob dzieli się na ścieżkę + wzorzec względny; wył. przekazuje bez zmian.",
522
560
  "code.label": "ścieżki w programach run_code",
523
561
  "code.hint": "Literały ścieżek w programie run_code są tłumaczone przez tę samą tabelę montowania przed uruchomieniem; komentarze, szablony z interpolacją, $VAR i ciągi niebędące ścieżkami pozostają nietknięte, a każda niepewność pozostawia program bez zmian. Dodatkowo ustawiane są TEMP/TMP dla programu: przy pustym env Windows zwraca z os.tmpdir() undefined\\temp i zapisuje w złym miejscu.",
562
+ "sub.label": "Subagenci/członkowie zespołu używają Git Bash",
563
+ "sub.hint": "Wł. (domyślnie): subagenci i członkowie zespołu — także zagnieżdżeni — otrzymują ten sam dialekt podpowiedzi, tłumaczenie argumentów ścieżek, echo wyników i fakt DSH_PATH_DIALECT co agent główny. Wył.: dotyczy to tylko agenta głównego, a agenci delegowani działają według oficjalnej semantyki powłoki (bez przepisywania podpowiedzi i tłumaczenia ścieżek). Uwaga: dsh ma jeden executor powłoki na proces, więc binarka Git Bash pozostaje globalna; ten przełącznik steruje warstwami dialektu i tłumaczenia.",
524
564
  "eol.label": "końce linii Git (jak w Linuksie)",
525
565
  "eol.hint": "Polecenia git uruchamiane przez model działają jak w Linuksie: core.autocrlf=input, core.eol=lf. Twój terminal i .gitattributes repozytorium pozostają nietknięte.",
526
566
  "bash.label": "Ścieżka Git Bash",
@@ -537,6 +577,7 @@ window.__ModuleLoader__.load({
537
577
  "python.on": "Python (eksperymentalny)",
538
578
  "python.off": "Node / TypeScript (domyślnie)",
539
579
  "python.hint": "Wyłączony (domyślnie) run_code używa oficjalnego backendu Node/TypeScript, identycznego co do bajtu z dostarczaną kompozycją ptc; włączenie przełącza dsh na eksperymentalny backend CPython (@deepseek-ai/dsh-experimental-ptc-runtime-python), więc język, generowany prompt SDK i prezentacja run_code przechodzą na Python. Wymaga POSIX i CPython ≥ 3.10 (niedostępny w Windows) i jest wykluczający z narzędziem workflow — oficjalna kompozycja Python również wyłącza workflow, więc strona workflow wszystkich czterech wariantów pozostaje wyłączona, dopóki to jest włączone (twoje ustawienie workflow jest zachowane i wraca po wyłączeniu). Zmiana działa po restarcie dsh; to ten sam przełącznik na karcie dsh-ptc-cordis-preset — obie strony dzielą jeden stan. Widoczny tylko, gdy dsh-ptc-cordis-preset jest zainstalowany. Jeśli włączenie nie przyniesie skutku, powód znajdziesz w logu startowym dsh.",
580
+ "python.degraded": "backend niedostępny, nadal Node (powód w logu startowym dsh)",
540
581
  "python.blocked": "Ten host to Windows: eksperymentalny backend Python obsługuje tylko POSIX, przełącznik jest niedostępny.",
541
582
  },
542
583
  /* locale: pt */
@@ -560,6 +601,8 @@ window.__ModuleLoader__.load({
560
601
  "split.hint": "Um padrão glob absoluto divide em caminho + padrão relativo; desligado passa-o inalterado.",
561
602
  "code.label": "caminhos em programas run_code",
562
603
  "code.hint": "Literais de caminho escritos num programa run_code são traduzidos pela mesma tabela de montagem antes da execução; comentários, modelos interpolados, $VAR e strings que não são caminhos ficam intactos, e qualquer incerteza deixa o programa como está. Também são definidos TEMP/TMP para o programa: com env vazio, os.tmpdir() no Windows devolve undefined\\temp e grava no lugar errado.",
604
+ "sub.label": "Subagentes/membros da equipa usam Git Bash",
605
+ "sub.hint": "Ligado (padrão): subagentes e membros da equipa — incluindo aninhados — recebem o mesmo dialeto de prompt, tradução de caminhos nos argumentos, eco de resultados e o mesmo facto DSH_PATH_DIALECT que o agente principal. Desligado: isso aplica-se apenas ao agente principal e os agentes delegados correm com a semântica oficial da shell (sem reescrita do prompt nem tradução de caminhos). Nota: o dsh tem um único executor de shell por processo, pelo que o binário Git Bash continua global; este interruptor governa as camadas de dialeto e tradução.",
563
606
  "eol.label": "fins de linha do Git (como no Linux)",
564
607
  "eol.hint": "Os comandos git executados pelo modelo seguem o comportamento do Linux: core.autocrlf=input, core.eol=lf. O seu terminal e os .gitattributes do repositório não são afetados.",
565
608
  "bash.label": "Caminho do Git Bash",
@@ -576,6 +619,7 @@ window.__ModuleLoader__.load({
576
619
  "python.on": "Python (experimental)",
577
620
  "python.off": "Node / TypeScript (padrão)",
578
621
  "python.hint": "Desligado (padrão), o run_code usa o backend oficial Node/TypeScript, idêntico byte a byte à composição ptc distribuída; ligado, o dsh passa para o backend CPython experimental (@deepseek-ai/dsh-experimental-ptc-runtime-python), e a linguagem, o prompt SDK gerado e a apresentação do run_code passam para Python. Exige POSIX e CPython ≥ 3.10 (indisponível no Windows) e é incompatível com a ferramenta workflow — a composição Python oficial também desativa workflow, pelo que o lado workflow das quatro variantes fica desligado enquanto isto estiver ligado (o teu valor é mantido e regressa ao desligar). Produz efeito após reiniciar o dsh; é o mesmo interruptor no cartão do dsh-ptc-cordis-preset — os dois lados partilham um único estado. Só aparece quando o dsh-ptc-cordis-preset está instalado. Se ligar não tiver efeito, o motivo está no registo de arranque do dsh.",
622
+ "python.degraded": "backend indisponível, continua Node (motivo no registo de arranque do dsh)",
579
623
  "python.blocked": "Este anfitrião é Windows: o backend Python experimental só suporta POSIX, pelo que este interruptor não está disponível.",
580
624
  },
581
625
  /* locale: ru */
@@ -599,6 +643,8 @@ window.__ModuleLoader__.load({
599
643
  "split.hint": "Абсолютный glob-шаблон разбивается на path + относительный шаблон; выкл передаёт как есть.",
600
644
  "code.label": "пути в программах run_code",
601
645
  "code.hint": "Строковые литералы путей в программе run_code переводятся по той же таблице монтирования до запуска; комментарии, шаблоны с интерполяцией, $VAR и строки-не-пути не трогаются, а при любой неопределённости программа остаётся без изменений. Также программе задаются TEMP/TMP: при пустом env в Windows os.tmpdir() возвращает undefined\\temp и запись идёт не туда.",
646
+ "sub.label": "Субагенты и участники команды используют Git Bash",
647
+ "sub.hint": "Вкл. (по умолчанию): субагенты и участники команды — включая вложенных — получают тот же диалект подсказки, перевод путей в аргументах, эхо результатов и факт DSH_PATH_DIALECT, что и главный агент. Выкл.: это применяется только к главному агенту, а делегированные агенты работают с официальной семантикой оболочки (без перезаписи подсказки и перевода путей). Учтите: в dsh один исполнитель оболочки на процесс, поэтому сам бинарник Git Bash остаётся общим; этот переключатель управляет слоями диалекта и перевода.",
602
648
  "eol.label": "переводы строк Git (как в Linux)",
603
649
  "eol.hint": "Команды git, запускаемые моделью, ведут себя как в Linux: core.autocrlf=input, core.eol=lf. Ваш терминал и .gitattributes репозитория не затрагиваются.",
604
650
  "bash.label": "Путь Git Bash",
@@ -615,6 +661,7 @@ window.__ModuleLoader__.load({
615
661
  "python.on": "Python (экспериментальный)",
616
662
  "python.off": "Node / TypeScript (по умолчанию)",
617
663
  "python.hint": "Выключено (по умолчанию) — run_code использует официальный бэкенд Node/TypeScript, побайтово совпадающий с поставляемой композицией ptc; при включении dsh переходит на экспериментальный бэкенд CPython (@deepseek-ai/dsh-experimental-ptc-runtime-python), и язык, сгенерированная подсказка SDK и представление run_code переключаются на Python. Требуются POSIX и CPython ≥ 3.10 (в Windows недоступно), и это несовместимо с инструментом workflow — официальная композиция Python тоже отключает workflow, поэтому сторона workflow всех четырёх вариантов остаётся выключенной, пока это включено (ваша настройка workflow сохраняется и возвращается после выключения). Изменение действует после перезапуска dsh; это тот же переключатель на карточке dsh-ptc-cordis-preset — обе стороны делят одно состояние. Показывается только когда установлен dsh-ptc-cordis-preset. Если включение не подействовало, причина указана в журнале запуска dsh.",
664
+ "python.degraded": "бэкенд недоступен, по-прежнему Node (причина в журнале запуска dsh)",
618
665
  "python.blocked": "Этот хост — Windows: экспериментальный бэкенд Python поддерживает только POSIX, переключатель недоступен.",
619
666
  },
620
667
  /* locale: sv */
@@ -638,6 +685,8 @@ window.__ModuleLoader__.load({
638
685
  "split.hint": "Ett absolut glob-mönster delas i sökväg + relativt mönster; av skickar det oförändrat.",
639
686
  "code.label": "sökvägar i run_code-program",
640
687
  "code.hint": "Sökvägslitteraler i ett run_code-program översätts via samma monteringstabell före körning; kommentarer, interpolerade mallar, $VAR och strängar som inte är sökvägar lämnas orörda, och vid minsta osäkerhet lämnas hela programmet oförändrat. Dessutom sätts TEMP/TMP för programmet: med tom env ger os.tmpdir() i Windows undefined\\temp och skriver på fel ställe.",
688
+ "sub.label": "Subagenter/teammedlemmar använder Git Bash",
689
+ "sub.hint": "På (standard): subagenter och teammedlemmar — även nästlade — får samma promptdialekt, samma sökvägsöversättning i argument, samma resultat-eko och samma DSH_PATH_DIALECT-faktum som huvudagenten. Av: detta gäller bara huvudagenten och delegerade agenter kör med officiell shell-semantik (ingen promptomskrivning, ingen sökvägsöversättning). Obs: dsh har en enda shell-exekutor per process, så Git Bash-binären är fortfarande global; den här växeln styr dialekt-/översättningslagren.",
641
690
  "eol.label": "Git radslut (som Linux)",
642
691
  "eol.hint": "Git-kommandon som modellen kör följer Linux-beteende: core.autocrlf=input, core.eol=lf. Din egen terminal och repots .gitattributes påverkas inte.",
643
692
  "bash.label": "Git Bash-sökväg",
@@ -654,6 +703,7 @@ window.__ModuleLoader__.load({
654
703
  "python.on": "Python (experimentell)",
655
704
  "python.off": "Node / TypeScript (standard)",
656
705
  "python.hint": "Av (standard) använder run_code den officiella Node/TypeScript-backenden, byte för byte identisk med den medföljande ptc-kompositionen; på växlar dsh till den experimentella CPython-backenden (@deepseek-ai/dsh-experimental-ptc-runtime-python), vilket även byter run_codes språk, genererade SDK-prompt och presentation till Python. Kräver POSIX och CPython ≥ 3.10 (ej tillgängligt i Windows) och utesluter workflow-verktyget — den officiella Python-kompositionen stänger också av workflow, så workflow-sidan i alla fyra varianter hålls avstängd medan detta är på (ditt workflow-värde behålls och återställs när du stänger av). Gäller efter omstart av dsh; detta är samma växel på dsh-ptc-cordis-presets kort — båda sidor delar ett tillstånd. Visas bara när dsh-ptc-cordis-preset är installerat. Om påslaget inte får effekt står orsaken i dsh:s startlogg.",
706
+ "python.degraded": "backend otillgänglig, fortfarande Node (orsak i dsh-startloggen)",
657
707
  "python.blocked": "Den här värden är Windows: den experimentella Python-backenden stöder bara POSIX, så växeln är otillgänglig.",
658
708
  },
659
709
  /* locale: th */
@@ -677,6 +727,8 @@ window.__ModuleLoader__.load({
677
727
  "split.hint": "pattern glob สัมบูรณ์แยกเป็น path + pattern สัมพัทธ์; ปิดส่งต่อตามเดิม",
678
728
  "code.label": "พาธในโปรแกรม run_code",
679
729
  "code.hint": "สตริงพาธที่เขียนในโปรแกรม run_code จะถูกแปลผ่านตาราง mount เดียวกันก่อนรัน ความคิดเห็น เทมเพลตที่มีการแทรก $VAR และสตริงที่ไม่ใช่พาธจะไม่ถูกแตะ และหากไม่แน่ใจทั้งโปรแกรมจะไม่ถูกแก้ไข และเติม TEMP/TMP ให้โปรแกรมด้วย: เมื่อ env ว่าง os.tmpdir() บน Windows จะคืน undefined\\temp แล้วเขียนผิดที่",
730
+ "sub.label": "ซับเอเจนต์/สมาชิกทีมใช้ Git Bash",
731
+ "sub.hint": "เปิด (ค่าเริ่มต้น): ซับเอเจนต์และสมาชิกทีม — รวมถึงแบบซ้อน — ได้รับไดอาเลกต์พรอมป์ต์ การแปลพาธในอาร์กิวเมนต์ การสะท้อนผลลัพธ์ และข้อเท็จจริง DSH_PATH_DIALECT เหมือนเอเจนต์หลัก ปิด: สิ่งเหล่านี้มีผลกับเอเจนต์หลักเท่านั้น และเอเจนต์ที่ถูกมอบหมายทำงานด้วยความหมาย shell อย่างเป็นทางการ (ไม่เขียนพรอมป์ต์ใหม่ ไม่แปลพาธ) หมายเหตุ dsh มีตัวรัน shell เดียวต่อโปรเซส ไบนารี Git Bash จึงยังเป็นส่วนกลาง สวิตช์นี้ควบคุมชั้นไดอาเลกต์/การแปล",
680
732
  "eol.label": "อักขระขึ้นบรรทัด Git (เหมือน Linux)",
681
733
  "eol.hint": "คำสั่ง git ที่โมเดลรันจะใช้พฤติกรรมแบบ Linux: core.autocrlf=input, core.eol=lf เทอร์มินัลของคุณและ .gitattributes ของ repo ไม่ได้รับผลกระทบ",
682
734
  "bash.label": "เส้นทาง Git Bash",
@@ -693,6 +745,7 @@ window.__ModuleLoader__.load({
693
745
  "python.on": "Python (ทดลอง)",
694
746
  "python.off": "Node / TypeScript (ค่าเริ่มต้น)",
695
747
  "python.hint": "เมื่อปิด (ค่าเริ่มต้น) run_code จะใช้แบ็กเอนด์ Node/TypeScript อย่างเป็นทางการ ซึ่งเหมือนกับคอมโพซิชัน ptc ที่จัดส่งทุกไบต์; เมื่อเปิด dsh จะเปลี่ยนไปใช้แบ็กเอนด์ CPython ทดลอง (@deepseek-ai/dsh-experimental-ptc-runtime-python) ภาษา พรอมป์ต์ SDK ที่สร้างขึ้น และการนำเสนอของ run_code จะเปลี่ยนเป็น Python ต้องใช้ POSIX และ CPython ≥ 3.10 (ใช้ไม่ได้บน Windows) และใช้ร่วมกับเครื่องมือ workflow ไม่ได้ — คอมโพซิชัน Python อย่างเป็นทางการก็ปิด workflow เช่นกัน ฝั่ง workflow ของทั้งสี่รูปแบบจึงถูกปิดขณะเปิดอยู่ (ค่าที่คุณตั้งไว้จะถูกเก็บและกลับมาเมื่อปิด) การเปลี่ยนแปลงมีผลหลังรีสตาร์ต dsh; นี่คือสวิตช์เดียวกันบนการ์ดของ dsh-ptc-cordis-preset — ทั้งสองฝั่งใช้สถานะเดียวกัน แสดงเฉพาะเมื่อติดตั้ง dsh-ptc-cordis-preset แล้วเท่านั้น หากเปิดแล้วไม่เกิดผล เหตุผลอยู่ในบันทึกการเริ่มต้นของ dsh",
748
+ "python.degraded": "แบ็กเอนด์ใช้ไม่ได้ ยังเป็น Node (เหตุผลในบันทึกเริ่มต้นของ dsh)",
696
749
  "python.blocked": "โฮสต์นี้เป็น Windows: แบ็กเอนด์ Python ทดลองรองรับเฉพาะ POSIX สวิตช์นี้จึงใช้ไม่ได้",
697
750
  },
698
751
  /* locale: tr */
@@ -716,6 +769,8 @@ window.__ModuleLoader__.load({
716
769
  "split.hint": "Mutlak glob örüntüsü path + göreli örüntüye ayrılır; kapalı olduğu gibi geçirir.",
717
770
  "code.label": "run_code program yolları",
718
771
  "code.hint": "Bir run_code programında yazılan yol dizeleri çalıştırılmadan önce aynı bağlama tablosuyla çevrilir; yorumlar, enterpolasyonlu şablonlar, $VAR ve yol olmayan dizeler olduğu gibi kalır, herhangi bir belirsizlikte programın tamamı değişmeden bırakılır. Ayrıca programa TEMP/TMP verilir: boş env ile Windows'ta os.tmpdir() undefined\\temp döner ve yanlış yere yazar.",
772
+ "sub.label": "Alt ajanlar/ekip üyeleri Git Bash kullansın",
773
+ "sub.hint": "Açık (varsayılan): alt ajanlar ve ekip üyeleri — iç içe olanlar dahil — ana ajanla aynı istem lehçesini, yol argümanı çevirisini, sonuç yankısını ve DSH_PATH_DIALECT gerçeğini alır. Kapalı: bunlar yalnızca ana ajan için geçerlidir ve devredilen ajanlar resmî shell semantiğiyle çalışır (istem yeniden yazılmaz, yollar çevrilmez). Not: dsh'de süreç başına tek bir shell yürütücüsü vardır, bu yüzden Git Bash ikilisi genele aittir; bu anahtar lehçe/çeviri katmanlarını yönetir.",
719
774
  "eol.label": "Git satır sonları (Linux gibi)",
720
775
  "eol.hint": "Modelin çalıştırdığı git komutları Linux davranışını izler: core.autocrlf=input, core.eol=lf. Kendi terminaliniz ve deponun .gitattributes dosyası etkilenmez.",
721
776
  "bash.label": "Git Bash yolu",
@@ -732,6 +787,7 @@ window.__ModuleLoader__.load({
732
787
  "python.on": "Python (deneysel)",
733
788
  "python.off": "Node / TypeScript (varsayılan)",
734
789
  "python.hint": "Kapalıyken (varsayılan) run_code resmî Node/TypeScript arka ucunu kullanır ve gönderilen ptc bileşimiyle bayt bayt aynıdır; açıldığında dsh deneysel CPython arka ucuna (@deepseek-ai/dsh-experimental-ptc-runtime-python) geçer; run_code dil, üretilen SDK istemi ve sunum Python'a döner. POSIX ve CPython ≥ 3.10 gerektirir (Windows'ta kullanılamaz) ve workflow aracıyla birbirini dışlar — resmî Python bileşimi de workflow'u kapatır, bu yüzden bu açıkken dört varyantın workflow tarafı kapalı kalır (workflow ayarın korunur ve kapatınca geri gelir). Değişiklik dsh yeniden başlatıldıktan sonra geçerli olur; bu, dsh-ptc-cordis-preset kartındaki aynı anahtardır — iki taraf tek durumu paylaşır. Yalnızca dsh-ptc-cordis-preset kurulu olduğunda görünür. Açmak etkili olmazsa nedeni dsh başlangıç günlüğünde yazar.",
790
+ "python.degraded": "arka uç kullanılamıyor, hâlâ Node (neden dsh başlangıç günlüğünde)",
735
791
  "python.blocked": "Bu ana makine Windows: deneysel Python arka ucu yalnızca POSIX destekler, bu anahtar kullanılamaz.",
736
792
  },
737
793
  /* locale: vi */
@@ -755,6 +811,8 @@ window.__ModuleLoader__.load({
755
811
  "split.hint": "Pattern glob tuyệt đối tách thành path + pattern tương đối; tắt truyền nguyên văn.",
756
812
  "code.label": "đường dẫn trong chương trình run_code",
757
813
  "code.hint": "Chuỗi đường dẫn viết trong chương trình run_code được dịch qua cùng bảng mount trước khi chạy; chú thích, template nội suy, $VAR và chuỗi không phải đường dẫn được giữ nguyên, và mọi điểm không chắc chắn sẽ khiến cả chương trình không bị sửa. Đồng thời nạp TEMP/TMP cho chương trình: với env rỗng, os.tmpdir() trên Windows trả về undefined\\temp và ghi sai chỗ.",
814
+ "sub.label": "Subagent/thành viên nhóm dùng Git Bash",
815
+ "sub.hint": "Bật (mặc định): subagent và thành viên nhóm — kể cả lồng nhau — nhận cùng phương ngữ prompt, cách dịch đường dẫn trong tham số, tiếng vọng kết quả và sự thật DSH_PATH_DIALECT như agent chính. Tắt: những thứ này chỉ áp dụng cho agent chính, còn agent được ủy quyền chạy theo ngữ nghĩa shell chính thức (không viết lại prompt, không dịch đường dẫn). Lưu ý dsh chỉ có một bộ thực thi shell mỗi tiến trình, nên tệp nhị phân Git Bash vẫn là toàn cục; công tắc này điều khiển tầng phương ngữ/dịch.",
758
816
  "eol.label": "kết thúc dòng Git (giống Linux)",
759
817
  "eol.hint": "Các lệnh git do mô hình chạy theo hành vi Linux: core.autocrlf=input, core.eol=lf. Terminal của bạn và .gitattributes của repo không bị ảnh hưởng.",
760
818
  "bash.label": "Đường dẫn Git Bash",
@@ -771,6 +829,7 @@ window.__ModuleLoader__.load({
771
829
  "python.on": "Python (thử nghiệm)",
772
830
  "python.off": "Node / TypeScript (mặc định)",
773
831
  "python.hint": "Khi tắt (mặc định), run_code dùng backend Node/TypeScript chính thức, giống từng byte với tổ hợp ptc được phát hành; khi bật, dsh chuyển sang backend CPython thử nghiệm (@deepseek-ai/dsh-experimental-ptc-runtime-python), kéo theo ngôn ngữ, prompt SDK được sinh và cách trình bày của run_code chuyển sang Python. Yêu cầu POSIX và CPython ≥ 3.10 (không dùng được trên Windows) và loại trừ lẫn nhau với công cụ workflow — tổ hợp Python chính thức cũng tắt workflow, nên phía workflow của cả bốn biến thể bị tắt trong lúc bật (giá trị workflow của bạn được giữ và trở lại khi tắt). Thay đổi có hiệu lực sau khi khởi động lại dsh; đây chính là công tắc trên thẻ của dsh-ptc-cordis-preset — hai bên dùng chung một trạng thái. Chỉ hiện khi đã cài dsh-ptc-cordis-preset. Nếu bật mà không có hiệu lực, lý do nằm trong nhật ký khởi động dsh.",
832
+ "python.degraded": "backend không khả dụng, vẫn là Node (lý do trong nhật ký khởi động dsh)",
774
833
  "python.blocked": "Máy chủ này là Windows: backend Python thử nghiệm chỉ hỗ trợ POSIX, nên công tắc này không dùng được.",
775
834
  },
776
835
  /* locale: zh-hk */
@@ -794,6 +853,8 @@ window.__ModuleLoader__.load({
794
853
  "split.hint": "glob 嘅絕對 pattern 自動拆做 path + 相對 pattern;關閉就原樣傳遞。",
795
854
  "code.label": "run_code 程式內路徑",
796
855
  "code.hint": "run_code 程式內寫的 /c/... 路徑字面量會在執行前按同一張掛載表翻譯;註解、插值模板、$VAR 與非路徑字串不動,掃描有任何不確定就整份不改。 並為程式補上 TEMP/TMP:空 env 下 Windows 的 os.tmpdir() 會得到 undefined\\temp,程式會靜默寫錯位置。",
856
+ "sub.label": "子代理/隊員用 Git Bash",
857
+ "sub.hint": "預設開啟:子代理同團隊隊員(連嵌套)嘅提示詞方言、路徑參數翻譯、結果回顯同 DSH_PATH_DIALECT 環境事實都同主代理一致。閂咗就淨係主代理有,子代理跟官方 shell 語義行(提示詞唔改寫、路徑參數唔翻譯);留意 dsh 每個進程只有一個 shell 執行器,所以 Git Bash 本身仍然係全局嘅,呢個開關管嘅係方言/翻譯層。",
797
858
  "eol.label": "Git 行尾(與 Linux 一致)",
798
859
  "eol.hint": "模型執行的 git 指令採 Linux 行為:core.autocrlf=input、core.eol=lf。你自己終端的 git 與倉庫的 .gitattributes 都不受影響。",
799
860
  "bash.label": "Git Bash 路徑",
@@ -810,6 +871,7 @@ window.__ModuleLoader__.load({
810
871
  "python.on": "Python(實驗性)",
811
872
  "python.off": "Node / TypeScript(預設)",
812
873
  "python.hint": "閂咗(預設)嗰陣 run_code 用官方 Node/TypeScript 後端,同官方 ptc 組合逐位元組一致;開咗就轉用 dsh 實驗性 CPython 後端(@deepseek-ai/dsh-experimental-ptc-runtime-python),run_code 嘅語言、生成嘅 SDK 提示詞同工具呈現都會轉去 Python。需要 POSIX 平台同 CPython ≥ 3.10(Windows 用唔到),而且同 workflow 工具互斥——官方 Python 組合同樣停用 workflow,所以開住嗰陣本插件四個變體嘅 workflow 側會強制關閉(你嘅工作流設定值會保留,閂咗之後恢復)。改動要重啟 dsh 先生效;呢個開關就係 dsh-ptc-cordis-preset 設定卡上面同一個開關——兩邊共享同一份狀態。只喺已安裝 dsh-ptc-cordis-preset 時顯示。開咗之後唔生效,原因喺 dsh 啟動日誌度。",
874
+ "python.degraded": "後端用唔到,暫時仍然係 Node(原因喺 dsh 啟動日誌)",
813
875
  "python.blocked": "呢部主機係 Windows:實驗性 Python 後端淨係支援 POSIX,所以呢個開關用唔到。",
814
876
  },
815
877
  /* locale: zh-mo */
@@ -833,6 +895,8 @@ window.__ModuleLoader__.load({
833
895
  "split.hint": "glob 嘅絕對 pattern 自動拆做 path + 相對 pattern;關閉就原樣傳遞。",
834
896
  "code.label": "run_code 程式內路徑",
835
897
  "code.hint": "run_code 程式內寫的 /c/... 路徑字面量會在執行前按同一張掛載表翻譯;註解、插值模板、$VAR 與非路徑字串不動,掃描有任何不確定就整份不改。 並為程式補上 TEMP/TMP:空 env 下 Windows 的 os.tmpdir() 會得到 undefined\\temp,程式會靜默寫錯位置。",
898
+ "sub.label": "子代理/隊員用 Git Bash",
899
+ "sub.hint": "預設開啟:子代理同團隊隊員(連嵌套)嘅提示詞方言、路徑參數翻譯、結果回顯同 DSH_PATH_DIALECT 環境事實都同主代理一致。閂咗就淨係主代理有,子代理跟官方 shell 語義行(提示詞唔改寫、路徑參數唔翻譯);留意 dsh 每個進程只有一個 shell 執行器,所以 Git Bash 本身仍然係全局嘅,呢個開關管嘅係方言/翻譯層。",
836
900
  "eol.label": "Git 行尾(與 Linux 一致)",
837
901
  "eol.hint": "模型執行的 git 指令採 Linux 行為:core.autocrlf=input、core.eol=lf。你自己終端的 git 與倉庫的 .gitattributes 都不受影響。",
838
902
  "bash.label": "Git Bash 路徑",
@@ -849,6 +913,7 @@ window.__ModuleLoader__.load({
849
913
  "python.on": "Python(實驗性)",
850
914
  "python.off": "Node / TypeScript(預設)",
851
915
  "python.hint": "閂咗(預設)嗰陣 run_code 用官方 Node/TypeScript 後端,同官方 ptc 組合逐位元組一致;開咗就轉用 dsh 實驗性 CPython 後端(@deepseek-ai/dsh-experimental-ptc-runtime-python),run_code 嘅語言、生成嘅 SDK 提示詞同工具呈現都會轉去 Python。需要 POSIX 平台同 CPython ≥ 3.10(Windows 用唔到),而且同 workflow 工具互斥——官方 Python 組合同樣停用 workflow,所以開住嗰陣本插件四個變體嘅 workflow 側會強制關閉(你嘅工作流設定值會保留,閂咗之後恢復)。改動要重啟 dsh 先生效;呢個開關就係 dsh-ptc-cordis-preset 設定卡上面同一個開關——兩邊共享同一份狀態。只喺已安裝 dsh-ptc-cordis-preset 時顯示。開咗之後唔生效,原因喺 dsh 啟動日誌度。",
916
+ "python.degraded": "後端用唔到,暫時仍然係 Node(原因喺 dsh 啟動日誌)",
852
917
  "python.blocked": "呢部主機係 Windows:實驗性 Python 後端淨係支援 POSIX,所以呢個開關用唔到。",
853
918
  },
854
919
  /* locale: zh-tw */
@@ -872,6 +937,8 @@ window.__ModuleLoader__.load({
872
937
  "split.hint": "glob 的絕對 pattern 自動拆為 path + 相對 pattern;關閉則原樣傳遞。",
873
938
  "code.label": "run_code 程式內路徑",
874
939
  "code.hint": "run_code 程式內寫的 /c/... 路徑字面量會在執行前按同一張掛載表翻譯;註解、插值模板、$VAR 與非路徑字串不動,掃描有任何不確定就整份不改。 並為程式補上 TEMP/TMP:空 env 下 Windows 的 os.tmpdir() 會得到 undefined\\temp,程式會靜默寫錯位置。",
940
+ "sub.label": "子代理/隊員使用 Git Bash",
941
+ "sub.hint": "預設開啟:子代理與團隊隊員(含巢狀)的提示詞方言、路徑參數翻譯、結果回顯與 DSH_PATH_DIALECT 環境事實都與主代理一致。關閉後僅對主代理生效,子代理依官方 shell 語意執行(提示詞不改寫、路徑參數不翻譯);請注意 dsh 每個行程只有一個 shell 執行器,因此 Git Bash 本身仍是全域的,這個開關管的是方言/翻譯層。",
875
942
  "eol.label": "Git 行尾(與 Linux 一致)",
876
943
  "eol.hint": "模型執行的 git 指令採 Linux 行為:core.autocrlf=input、core.eol=lf。你自己終端的 git 與倉庫的 .gitattributes 都不受影響。",
877
944
  "bash.label": "Git Bash 路徑",
@@ -888,6 +955,7 @@ window.__ModuleLoader__.load({
888
955
  "python.on": "Python(實驗性)",
889
956
  "python.off": "Node / TypeScript(預設)",
890
957
  "python.hint": "關閉(預設)時 run_code 使用官方 Node/TypeScript 後端,與官方 ptc 組合逐位元組一致;開啟後改用 dsh 實驗性 CPython 後端(@deepseek-ai/dsh-experimental-ptc-runtime-python),run_code 的語言、產生的 SDK 提示詞與工具呈現都會切換到 Python。需要 POSIX 平台與 CPython ≥ 3.10(Windows 無法使用),且與 workflow 工具互斥——官方 Python 組合同樣會停用 workflow,因此開啟期間本外掛四個變體的 workflow 側強制關閉(你的工作流設定值會保留,關閉後恢復)。變更需重新啟動 dsh 後生效;這個開關就是 dsh-ptc-cordis-preset 設定卡上的同一個開關——兩側共用同一份狀態。僅在已安裝 dsh-ptc-cordis-preset 時顯示。若設為開啟後未生效,原因見 dsh 啟動日誌。",
958
+ "python.degraded": "後端無法使用,目前仍為 Node(原因見 dsh 啟動日誌)",
891
959
  "python.blocked": "此主機是 Windows:實驗性 Python 後端僅支援 POSIX,因此這個開關無法使用。",
892
960
  },
893
961
  };
@@ -1176,6 +1244,9 @@ window.__ModuleLoader__.load({
1176
1244
  var errs = snap.value.errorDialect !== false;
1177
1245
  var splits = snap.value.globSplit !== false;
1178
1246
  var codes = snap.value.codePaths !== false;
1247
+ // v0.27.0: delegated agents (subagents / team members / nested
1248
+ // children) participate in the dialect unless this is switched off.
1249
+ var subagents = snap.value.subagentDialect !== false;
1179
1250
  var eolOn = snap.value.gitAutocrlf !== false;
1180
1251
  var dedupe = snap.value.suppressPeerCordis === true;
1181
1252
 
@@ -1227,6 +1298,15 @@ window.__ModuleLoader__.load({
1227
1298
  E("button", { type: "button", className: "gb-segBtn" + (!codes ? " gb-segActive" : ""), onClick: function () { if (codes) writeField("codePaths", false); } }, t("switch.off")),
1228
1299
  ),
1229
1300
  E("p", { className: "gb-hint" }, t("code.hint")),
1301
+ E("div", { className: "gb-row" },
1302
+ E("span", { className: "gb-rowLabel" }, t("sub.label") + ":"),
1303
+ E("span", { className: "gb-rowValue" }, subagents ? t("state.on") : t("state.off")),
1304
+ ),
1305
+ E("div", { className: "gb-seg" },
1306
+ E("button", { type: "button", className: "gb-segBtn" + (subagents ? " gb-segActive" : ""), onClick: function () { if (!subagents) writeField("subagentDialect", true); } }, t("switch.on")),
1307
+ E("button", { type: "button", className: "gb-segBtn" + (!subagents ? " gb-segActive" : ""), onClick: function () { if (subagents) writeField("subagentDialect", false); } }, t("switch.off")),
1308
+ ),
1309
+ E("p", { className: "gb-hint" }, t("sub.hint")),
1230
1310
  E("div", { className: "gb-row" },
1231
1311
  E("span", { className: "gb-rowLabel" }, t("eol.label") + ":"),
1232
1312
  E("span", { className: "gb-rowValue" }, eolOn ? t("state.on") : t("state.off")),
@@ -1300,6 +1380,13 @@ window.__ModuleLoader__.load({
1300
1380
  && typeof peerSnap.value === "object"
1301
1381
  && Object.prototype.hasOwnProperty.call(peerSnap.value, PEER_PYTHON_FIELD);
1302
1382
  var pythonOn = pythonOffered && peerSnap.value[PEER_PYTHON_FIELD] === true;
1383
+ var peerPythonBackend = "";
1384
+ if (pythonOffered && typeof peerSnap.value[PEER_PYTHON_BACKEND_FIELD] === "string") {
1385
+ peerPythonBackend = peerSnap.value[PEER_PYTHON_BACKEND_FIELD];
1386
+ }
1387
+ /* Intent on + effective node = the user asked for Python and the host
1388
+ is still running Node behind the official rows. */
1389
+ var pythonDegraded = pythonOn && peerPythonBackend === "node";
1303
1390
  function writePython(next) {
1304
1391
  setError("");
1305
1392
  if (peer === null || typeof peer.set !== "function") return;
@@ -1322,7 +1409,9 @@ window.__ModuleLoader__.load({
1322
1409
  E("div", { className: "gb-stack" },
1323
1410
  E("div", { className: "gb-row" },
1324
1411
  E("span", { className: "gb-rowLabel" }, t("python.label") + ":"),
1325
- E("span", { className: "gb-rowValue" }, pythonOn ? t("python.on") : t("python.off")),
1412
+ E("span", { className: "gb-rowValue" }, pythonOn
1413
+ ? (pythonDegraded ? t("python.on") + " · " + t("python.degraded") : t("python.on"))
1414
+ : t("python.off")),
1326
1415
  ),
1327
1416
  winHost ? null : E("div", { className: "gb-seg" },
1328
1417
  E("button", { type: "button", className: "gb-segBtn" + (pythonOn ? " gb-segActive" : ""), onClick: function () { if (!pythonOn) writePython(true); } }, t("switch.on")),
@@ -1330,6 +1419,7 @@ window.__ModuleLoader__.load({
1330
1419
  ),
1331
1420
  E("p", { className: "gb-hint" }, t("python.hint")),
1332
1421
  winHost ? E("p", { className: "gb-error" }, t("python.blocked")) : null,
1422
+ pythonDegraded ? E("p", { className: "gb-error" }, t("python.degraded")) : null,
1333
1423
  ),
1334
1424
  ) : null;
1335
1425
 
@@ -13,10 +13,11 @@
13
13
  * always off (the host executor is this plugin's shell.js — on non-Windows
14
14
  * hosts that is the native stack anyway, which is exactly what the old
15
15
  * materialized variants encoded). A second, conditional delta exists while
16
- * dsh-ptc-cordis-preset reports its experimental-CPython switch on: the two
17
- * workflow rows follow the official Python composition and go off (see
18
- * `pythonRuntime` below). With that switch off — the default — the rows are
19
- * the official ones unchanged.
16
+ * dsh-ptc-cordis-preset reports its experimental-CPython backend ACTIVE: the
17
+ * two workflow rows follow the official Python composition and go off (see
18
+ * `pythonActive` below). While that backend is off — the default, and also
19
+ * whenever the peer's preflight failed — the rows are the official ones
20
+ * unchanged.
20
21
  */
21
22
 
22
23
  /** Default Git Bash binary — must match src/shell.js and the patch config. */
@@ -48,22 +49,25 @@ When ready, call exit_plan_mode with the complete plan markdown, starting with a
48
49
  * @param {boolean} input.gitBash - bash rows always on, pwsh rows always off.
49
50
  * @param {string|undefined} input.skillsDir - Creation authoring skills
50
51
  * directory (cordis variant only; resolved beside the agent-preset package).
51
- * @param {boolean} [input.pythonRuntime] - the peer's experimental-CPython
52
- * switch. `workflow-ptc` hard-requires `ctx.ptcRuntime.language ===
53
- * 'typescript'` (packages/workflow/workflow-ptc/src/index.ts:117) while the
54
- * CPython backend reports 'python', and a throwing preset row rejects the
55
- * WHOLE mount (agent-preset-registry mount.ts). The official Python
56
- * composition disables both workflow rows for exactly this reason
57
- * (snapshots/session/ptc-python-turn/cordis.yml), so with the switch on
58
- * every variant mirrors that: the two rows go off, the user's own workflow
59
- * setting is untouched and returns when the switch goes back off.
52
+ * @param {boolean} [input.pythonActive] - whether the experimental CPython
53
+ * backend is the one run_code will ACTUALLY use (the peer's effective
54
+ * backend, not the bare user intent: when its preflight fails the
55
+ * composition still runs Node and the workflow rows must stay live).
56
+ * `workflow-ptc` hard-requires `ctx.ptcRuntime.language === 'typescript'`
57
+ * (packages/workflow/workflow-ptc/src/index.ts:117) while the CPython
58
+ * backend reports 'python', and a throwing preset row rejects the WHOLE
59
+ * mount (agent-preset-registry mount.ts). The official Python composition
60
+ * disables both workflow rows for exactly this reason
61
+ * (snapshots/session/ptc-python-turn/cordis.yml), so while CPython is
62
+ * active every variant mirrors that: the two rows go off, the user's own
63
+ * workflow setting is untouched and returns once it is not.
60
64
  * @returns {object[]} the declarative plugins list.
61
65
  */
62
- export function pluginsFor({ kind, gitBash, skillsDir, pythonRuntime = false }) {
66
+ export function pluginsFor({ kind, gitBash, skillsDir, pythonActive = false }) {
63
67
  const win = typeof process !== 'undefined' && process.platform === 'win32'
64
68
  const bashDisabled = gitBash ? false : win
65
69
  const pwshDisabled = gitBash ? true : !win
66
- const workflowOn = kind !== 'ptc' && pythonRuntime !== true
70
+ const workflowOn = kind !== 'ptc' && pythonActive !== true
67
71
  const rows = [
68
72
  {
69
73
  id: 'persona',
package/src/index.js CHANGED
@@ -104,15 +104,23 @@ export const PEER_COVERED_PRESET_ID = 'cordis-gitbash'
104
104
 
105
105
  /**
106
106
  * Service dsh-ptc-cordis-preset publishes:
107
- * `{ id, gitBashActive, pythonRuntime }`. `pythonRuntime` (boolean, default
108
- * false when absent, read from a getter too) is the peer's experimental
109
- * CPython switch for run_code.
107
+ * `{ id, gitBashActive, pythonRuntime, pythonBackend? }`. `pythonRuntime` is
108
+ * the user's INTENT for the experimental CPython run_code backend (the field
109
+ * the settings card writes); `pythonBackend` ('python' | 'node', v0.15.1+,
110
+ * additive) is the backend that is ACTUALLY active after the peer's own
111
+ * preflight — package resolvable, interpreter qualified, POSIX host.
110
112
  */
111
113
  export const PEER_CAPABILITY = 'ptcCordisPreset'
112
114
 
113
- /** The peer's CPython-switch field, on its capability and on its row Config. */
115
+ /**
116
+ * The peer's CPython intent field — on its capability AND on its row Config
117
+ * (the field both settings cards read and write).
118
+ */
114
119
  export const PEER_PYTHON_FIELD = 'pythonRuntime'
115
120
 
121
+ /** The peer's EFFECTIVE backend field on the capability ('python' | 'node'). */
122
+ export const PEER_PYTHON_BACKEND_FIELD = 'pythonBackend'
123
+
116
124
  /**
117
125
  * Read one boolean fact off the peer's capability object. A getter is honoured
118
126
  * so a live peer can report its current switch rather than a boot-time copy;
@@ -133,6 +141,90 @@ export function peerFact(capability, field) {
133
141
  }
134
142
  }
135
143
 
144
+ /**
145
+ * The peer's EFFECTIVE run_code backend, as the closed two-value vocabulary it
146
+ * publishes. `undefined` means "the peer does not report one" — an older peer,
147
+ * a getter that threw, or a value outside the vocabulary — and every caller
148
+ * must then fall back to the INTENT, which is the pre-v0.15.1 behavior.
149
+ * @param {object|undefined} capability - the peer's published capability.
150
+ * @returns {'python'|'node'|undefined} the reported backend.
151
+ */
152
+ export function peerBackend(capability) {
153
+ if (capability === null || capability === undefined) return undefined
154
+ try {
155
+ const raw = capability[PEER_PYTHON_BACKEND_FIELD]
156
+ const value = typeof raw === 'function' ? raw.call(capability) : raw
157
+ return value === 'python' || value === 'node' ? value : undefined
158
+ } catch {
159
+ return undefined
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Is the experimental CPython backend ACTUALLY the one run_code will use? The
165
+ * composition's workflow mutex keys on this, never on the bare intent: when the
166
+ * peer's preflight fails (package removed, interpreter too old, win32) the
167
+ * composition still runs Node, so forcing the workflow rows off would cost the
168
+ * user a capability for nothing.
169
+ *
170
+ * An older peer without the effective field reports no backend, and the intent
171
+ * stands in for it — exactly the pre-v0.15.1 behavior, so the linkage never
172
+ * changes shape because a field is missing.
173
+ * @param {object|undefined} capability - the peer's published capability.
174
+ * @returns {boolean} true only while the CPython backend is the active one.
175
+ */
176
+ export function pythonBackendActive(capability) {
177
+ const intent = peerFact(capability, PEER_PYTHON_FIELD)
178
+ const reported = peerBackend(capability)
179
+ if (reported === undefined) return intent
180
+ return intent && reported === 'python'
181
+ }
182
+
183
+ /**
184
+ * Is this agent a DELEGATED one — a subagent, a team member, or a nested child
185
+ * of either? The canonical in-tree signal is the session header pair dsh's own
186
+ * workspace-changes plugin uses
187
+ * (`packages/deliverables/workspace-changes/src/index.ts:59-60`), stamped when
188
+ * the subagent driver creates a child
189
+ * (`packages/subagent/subagent/src/child-agent.ts:139-155`):
190
+ * `origin === 'subagent'` or a non-zero `delegationDepth`.
191
+ *
192
+ * Unknown shapes read as NOT delegated: applying the dialect is the helpful
193
+ * direction, and a diagnostic assembly without an agent must keep it.
194
+ * @param {object|undefined} agent - the assembling/executing agent, when known.
195
+ * @returns {boolean} true only when the agent is provably delegated.
196
+ */
197
+ export function isDelegatedAgent(agent) {
198
+ try {
199
+ const header = agent && agent.session ? agent.session.header : undefined
200
+ if (header === null || typeof header !== 'object') return false
201
+ if (header.origin === 'subagent') return true
202
+ return typeof header.delegationDepth === 'number' && header.delegationDepth > 0
203
+ } catch {
204
+ return false
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Does the Git Bash dialect apply to THIS agent (v0.27.0)? The row switch
210
+ * `subagentDialect` (default ON) decides whether delegated agents — subagents,
211
+ * team members, nested children — participate in the dialect at all; the main
212
+ * agent always does. A closed function so every consumer (prompt assembly,
213
+ * dispatch translation, result echo, failure text, the shell-env fact) answers
214
+ * the same way.
215
+ *
216
+ * Note the honest bound: dsh has exactly ONE shell provider per process, so
217
+ * the executor binary stays Git Bash for every agent; this gate governs the
218
+ * dialect/translation layers that this plugin owns.
219
+ * @param {object} dialect - the live dialect switches.
220
+ * @param {object|undefined} agent - the agent that owns this assembly/execution.
221
+ * @returns {boolean} true when the dialect applies to this agent.
222
+ */
223
+ export function dialectApplies(dialect, agent) {
224
+ if (!dialect || dialect.subagentDialect !== false) return true
225
+ return !isDelegatedAgent(agent)
226
+ }
227
+
136
228
  /**
137
229
  * The roster this plugin serves: the configured list, minus the variant a peer
138
230
  * already covers. Two independent facts must BOTH hold before anything is
@@ -776,6 +868,15 @@ export const Config = Schema === null ? undefined : Schema.object({
776
868
  globSplit: live(Schema.boolean().default(true)),
777
869
  errorDialect: live(Schema.boolean().default(true)),
778
870
  codePaths: live(Schema.boolean().default(true)),
871
+ /**
872
+ * Whether DELEGATED agents (subagents, team members, nested children) also
873
+ * use the Git Bash dialect (v0.27.0). Default ON — the historical behavior;
874
+ * OFF keeps the dialect to the main agent, so a delegated request carries the
875
+ * official shell semantics (no prompt rewrite, no path-argument translation,
876
+ * no echo rewrite, no DSH_PATH_DIALECT fact). The executor itself is one
877
+ * per-process provider, so Git Bash stays the binary either way.
878
+ */
879
+ subagentDialect: live(Schema.boolean().default(true)),
779
880
  gitAutocrlf: live(Schema.boolean().default(true)),
780
881
  bashPath: live(Schema.string().default('')),
781
882
  adoptSidebar: live(Schema.boolean().default(true)),
@@ -822,6 +923,8 @@ function makeLiveReader(ctx, config) {
822
923
  errorDialect: valueOf(config.errorDialect) === true,
823
924
  codePaths: valueOf(config.codePaths) === true,
824
925
  gitAutocrlf: valueOf(config.gitAutocrlf) === true,
926
+ // Default ON: delegated agents keep the dialect unless the user opts out.
927
+ subagentDialect: valueOf(config.subagentDialect) !== false,
825
928
  bashPath: typeof bash === 'string' ? bash : '',
826
929
  adoptSidebar: valueOf(config.adoptSidebar) !== false,
827
930
  }
@@ -896,7 +999,7 @@ export function readPosixPaths(ctxLike) {
896
999
  * first. All default ON (schema defaults); never throws.
897
1000
  */
898
1001
  export function readDialectSettings(ctxLike) {
899
- const fallback = { posixPaths: false, virtualMounts: false, globSplit: false, errorDialect: false, codePaths: false, gitAutocrlf: false, bashPath: '' }
1002
+ const fallback = { posixPaths: false, virtualMounts: false, globSplit: false, errorDialect: false, codePaths: false, gitAutocrlf: false, bashPath: '', subagentDialect: true }
900
1003
  try {
901
1004
  const settings = ctxLike && typeof ctxLike.get === 'function' ? ctxLike.get('settings') : undefined
902
1005
  const value = settings && typeof settings.get === 'function' ? settings.get(SETTINGS_NAMESPACE) : undefined
@@ -907,6 +1010,8 @@ export function readDialectSettings(ctxLike) {
907
1010
  globSplit: v.globSplit === true,
908
1011
  errorDialect: v.errorDialect === true,
909
1012
  codePaths: v.codePaths === true,
1013
+ // An old host without the key keeps the default (delegated agents covered).
1014
+ subagentDialect: v.subagentDialect !== false,
910
1015
  gitAutocrlf: v.gitAutocrlf === true,
911
1016
  bashPath: typeof v.bashPath === 'string' ? v.bashPath : '',
912
1017
  }
@@ -2057,12 +2162,12 @@ function cleanupLegacyTrees(presetIds) {
2057
2162
  * failures stay visible through the roster's broken diagnostic instead of
2058
2163
  * failing the boot.
2059
2164
  */
2060
- async function registerVariant(ctx, presetId, { gitBashActive, skillsDir, pythonRuntime }) {
2165
+ async function registerVariant(ctx, presetId, { gitBashActive, skillsDir, pythonActive }) {
2061
2166
  const meta = PRESET_META[presetId]
2062
2167
  if (!meta) return undefined
2063
2168
  const plugins = meta.kind === 'minimal'
2064
2169
  ? minimalPluginsFor()
2065
- : pluginsFor({ kind: meta.kind, gitBash: gitBashActive, skillsDir, pythonRuntime })
2170
+ : pluginsFor({ kind: meta.kind, gitBash: gitBashActive, skillsDir, pythonActive })
2066
2171
  return ctx.agentPresets.register({
2067
2172
  id: presetId,
2068
2173
  name: meta.name,
@@ -2077,10 +2182,11 @@ async function registerVariant(ctx, presetId, { gitBashActive, skillsDir, python
2077
2182
  * SHOULD SERVE for the plugin's lifetime, and re-reconcile whenever that set
2078
2183
  * changes. Three inputs drive it — the live `suppressPeerCordis` switch, the
2079
2184
  * peer capability appearing (or leaving) via `ctx.inject`, which fires
2080
- * independent of row activation order, and the peer's experimental-CPython
2081
- * fact (`pythonRuntime`), which changes the ROWS of every variant — and the
2082
- * peer's own coverage only counts while it reports a Git Bash-materialized
2083
- * preset.
2185
+ * independent of row activation order, and the peer's EFFECTIVE CPython
2186
+ * backend (`pythonBackend`, falling back to the `pythonRuntime` intent on a
2187
+ * peer that does not report one), which changes the ROWS of every variant —
2188
+ * and the peer's own coverage only counts while it reports a Git Bash-
2189
+ * materialized preset.
2084
2190
  *
2085
2191
  * The roster picks entries up immediately; sessions already pinned to a
2086
2192
  * variant keep their revision until recomposed, so suppressing a variant never
@@ -2107,17 +2213,19 @@ async function runDeclarativeEra(ctx, presetIds, readSuppress) {
2107
2213
  const reconcile = () => {
2108
2214
  serial = serial.then(async () => {
2109
2215
  const want = desired()
2110
- // The peer's CPython switch rewrites the workflow rows of EVERY variant
2111
- // (the official Python composition disables them, and workflow-ptc
2112
- // refuses a non-TypeScript backend), so a flip re-registers the live
2113
- // variants instead of leaving stale rows mounted. Same cadence as the
2114
- // backend swap itself: the peer's patch is evaluated at boot.
2216
+ // The peer's EFFECTIVE CPython backend rewrites the workflow rows of
2217
+ // EVERY variant (the official Python composition disables them, and
2218
+ // workflow-ptc refuses a non-TypeScript backend), so a flip re-registers
2219
+ // the live variants instead of leaving stale rows mounted. Same cadence
2220
+ // as the backend swap itself: the peer's patch is evaluated at boot. A
2221
+ // bare INTENT without the effective backend changes nothing here — the
2222
+ // composition still runs Node, so the workflow rows must stay live.
2115
2223
  if (live.size > 0 && registeredPython !== peerPython) {
2116
2224
  for (const [presetId, off] of [...live]) {
2117
2225
  live.delete(presetId)
2118
2226
  try {
2119
2227
  await off()
2120
- console.log(TAG + " preset '" + presetId + "' retired (peer CPython switch changed; rows are rebuilt)")
2228
+ console.log(TAG + " preset '" + presetId + "' retired (peer CPython backend changed; rows are rebuilt)")
2121
2229
  } catch (error) {
2122
2230
  console.log(TAG + " preset '" + presetId + "' retirement failed: " + (error && error.message ? error.message : error))
2123
2231
  }
@@ -2136,7 +2244,7 @@ async function runDeclarativeEra(ctx, presetIds, readSuppress) {
2136
2244
  for (const presetId of want) {
2137
2245
  if (live.has(presetId)) continue
2138
2246
  try {
2139
- const unregister = await registerVariant(ctx, presetId, { gitBashActive, skillsDir, pythonRuntime: peerPython })
2247
+ const unregister = await registerVariant(ctx, presetId, { gitBashActive, skillsDir, pythonActive: peerPython })
2140
2248
  if (unregister) {
2141
2249
  live.set(presetId, unregister)
2142
2250
  console.log(TAG + " preset '" + presetId + "' registered declaratively")
@@ -2163,11 +2271,21 @@ async function runDeclarativeEra(ctx, presetIds, readSuppress) {
2163
2271
  try {
2164
2272
  const coverage = peerCtx[PEER_CAPABILITY] ?? peerCtx.get(PEER_CAPABILITY)
2165
2273
  const nextGitBash = peerFact(coverage, 'gitBashActive')
2166
- const nextPython = peerFact(coverage, PEER_PYTHON_FIELD)
2274
+ // INTENT (what the user asked for) vs EFFECTIVE (what run_code will
2275
+ // actually use). Only the effective fact may cost the user a variant's
2276
+ // workflow rows; the intent alone is reported, never acted on.
2277
+ const intentPython = peerFact(coverage, PEER_PYTHON_FIELD)
2278
+ const reportedBackend = peerBackend(coverage)
2279
+ const nextPython = pythonBackendActive(coverage)
2167
2280
  if (nextGitBash !== peerGitBash || nextPython !== peerPython) {
2168
2281
  peerGitBash = nextGitBash
2169
2282
  peerPython = nextPython
2170
2283
  if (nextPython) console.log(TAG + ' peer reports the experimental CPython run_code backend: workflow rows go off in every variant')
2284
+ else if (intentPython) {
2285
+ console.log(TAG + ' peer has the CPython switch on but the effective backend is '
2286
+ + (reportedBackend === undefined ? 'unreported (older peer: the intent stands in)' : reportedBackend)
2287
+ + ': workflow rows stay on (reason in the host log)')
2288
+ }
2171
2289
  void reconcile()
2172
2290
  }
2173
2291
  } catch (error) {
@@ -2276,6 +2394,7 @@ export async function apply(ctx, config = {}) {
2276
2394
  globSplit: Schema.boolean().default(true),
2277
2395
  errorDialect: Schema.boolean().default(true),
2278
2396
  codePaths: Schema.boolean().default(true),
2397
+ subagentDialect: Schema.boolean().default(true),
2279
2398
  gitAutocrlf: Schema.boolean().default(true),
2280
2399
  bashPath: Schema.string().default(''),
2281
2400
  adoptSidebar: Schema.boolean().default(true),
@@ -2331,8 +2450,17 @@ export async function apply(ctx, config = {}) {
2331
2450
  // git line endings and anything else non-DSH_* ride the executor's
2332
2451
  // own env layer (src/shell.js), not this registry.
2333
2452
  variables: { [PATH_DIALECT_KEY]: { description: PATH_DIALECT_DESCRIPTION } },
2334
- resolve() {
2335
- return liveSettings.posix() ? { [PATH_DIALECT_KEY]: PATH_DIALECT_VALUE } : {}
2453
+ resolve(execution) {
2454
+ try {
2455
+ const dialect = liveSettings.dialect()
2456
+ if (dialect.posixPaths !== true) return {}
2457
+ // The environment fact is per execution, so a delegated agent
2458
+ // the user excluded sees no DSH_PATH_DIALECT at all.
2459
+ if (!dialectApplies(dialect, execution && execution.agent)) return {}
2460
+ return { [PATH_DIALECT_KEY]: PATH_DIALECT_VALUE }
2461
+ } catch {
2462
+ return {}
2463
+ }
2336
2464
  },
2337
2465
  })
2338
2466
  envCtx.effect(() => unregister, 'dsh-gitbash-shell: shellEnv path-dialect fact')
@@ -2358,9 +2486,16 @@ export async function apply(ctx, config = {}) {
2358
2486
  // could corrupt pattern/default fields).
2359
2487
  if (process.platform === 'win32') {
2360
2488
  try {
2361
- ctx.on('system-prompt/assemble', (assembly, _assembleContext, next) => {
2489
+ ctx.on('system-prompt/assemble', (assembly, assembleContext, next) => {
2362
2490
  try {
2363
- if (liveSettings.posix() && assembly && typeof assembly === 'object') {
2491
+ /* v0.27.0: the main agent always participates; a DELEGATED agent
2492
+ (subagent / team member / nested child) only while the
2493
+ `subagentDialect` switch is on. Turning it off leaves the official
2494
+ prompt text untouched for those agents — no source replacement and
2495
+ no run_code hint — so they meet the shell they were composed for. */
2496
+ const dialect = liveSettings.dialect()
2497
+ const applies = dialectApplies(dialect, assembleContext && assembleContext.agent)
2498
+ if (applies && dialect.posixPaths === true && assembly && typeof assembly === 'object') {
2364
2499
  for (const section of Array.isArray(assembly.sections) ? assembly.sections : []) {
2365
2500
  if (section && typeof section.text === 'string') section.text = windowsToMsys(section.text)
2366
2501
  }
@@ -2431,7 +2566,10 @@ export async function apply(ctx, config = {}) {
2431
2566
  // `bash.workdir` went through raw, and an in-workspace `/c/...` write
2432
2567
  // fell outside the sandbox. One missed call site, five symptoms.
2433
2568
  const dialect = liveSettings.dialect()
2434
- if (dialect.posixPaths) {
2569
+ // v0.27.0: a delegated agent the user excluded keeps the official
2570
+ // semantics for BOTH faces of its calls — arguments go through
2571
+ // untouched and the result metadata is not echoed back in MSYS form.
2572
+ if (dialect.posixPaths && dialectApplies(dialect, exec && exec.agent)) {
2435
2573
  echo = true
2436
2574
  const env = dialect.virtualMounts ? buildTranslateEnv(dialect.bashPath) : null
2437
2575
  echoEnv = env
@@ -2482,6 +2620,10 @@ export async function apply(ctx, config = {}) {
2482
2620
  let contentPatch
2483
2621
  try {
2484
2622
  const dialect = liveSettings.dialect()
2623
+ // Same agent gate as the dispatch wrapper: one call, one dialect.
2624
+ // RETURN the downstream promise: a waterfall listener that swallows
2625
+ // it would hand the caller `undefined` instead of the decision.
2626
+ if (!dialectApplies(dialect, exec && exec.agent)) return next()
2485
2627
  if (dialect.posixPaths && dialect.errorDialect && exec && result && typeof result === 'object'
2486
2628
  && result.isError === true && Array.isArray(result.content)) {
2487
2629
  const env = dialect.virtualMounts ? buildTranslateEnv(dialect.bashPath) : null
@@ -2528,10 +2670,14 @@ export async function apply(ctx, config = {}) {
2528
2670
  pctx.effect(() => pctx.systemPrompt.context({
2529
2671
  name: 'gitbash-shell:posix-paths',
2530
2672
  order: 126,
2531
- text: () => {
2673
+ text: (assembleContext) => {
2532
2674
  try {
2533
2675
  const dialect = liveSettings.dialect()
2534
2676
  if (dialect.posixPaths !== true) return ''
2677
+ // A delegated agent whose dialect the user turned off meets the
2678
+ // official shell semantics: no directive, the same way no
2679
+ // translation happens for its calls.
2680
+ if (!dialectApplies(dialect, assembleContext && assembleContext.agent)) return ''
2535
2681
  return dialect.virtualMounts === false ? POSIX_DIRECTIVE_TEXT_STRICT : POSIX_DIRECTIVE_TEXT
2536
2682
  } catch {
2537
2683
  return ''
@@ -2657,4 +2803,4 @@ export async function apply(ctx, config = {}) {
2657
2803
  }
2658
2804
 
2659
2805
  // Test surface: pure helpers, no Cordis context required.
2660
- export const _internal = { PRESET_IDS, PEER_COVERED_PRESET_ID, PEER_CAPABILITY, PEER_PYTHON_FIELD, peerFact, effectivePresetIds, detectPeerCoverage, readSuppressPeerCordis, translateDispatch, translateMsysPath, translatePathArguments, rewriteCodePaths, scanCodeLiterals, programPrelude, translateGlobArguments, buildTranslateEnv, rewriteErrorContent, rewriteErrorMessage, rewriteFailureMessage, msysEcho, driveToMsys, pathEcho, ERROR_CONTENT_TOOLS, readPosixPaths, readAdoptSidebar, readDialectSettings, windowsToMsys, rewriteResultPaths, adoptSidebarShell, MARKER_FILE, classify, materialize, cleanupOnDispose, firstUserRoot, hashTree, skillsHashes, syncDecision, installRegisterShim, baseForRoster, detectBase, pickComposition, personaEraForText, detectPersonaEra, injectPresentRow, hostHasToolPresent, detectPresentSupport, injectPluginManagerRow, hostHasPluginManagerTools, rowFormOf, rowFormsOf, alignEngineRow, alignRalphRow, ROW_SOURCE }
2806
+ export const _internal = { PRESET_IDS, PEER_COVERED_PRESET_ID, PEER_CAPABILITY, isDelegatedAgent, dialectApplies, PEER_PYTHON_FIELD, PEER_PYTHON_BACKEND_FIELD, peerFact, peerBackend, pythonBackendActive, effectivePresetIds, detectPeerCoverage, readSuppressPeerCordis, translateDispatch, translateMsysPath, translatePathArguments, rewriteCodePaths, scanCodeLiterals, programPrelude, translateGlobArguments, buildTranslateEnv, rewriteErrorContent, rewriteErrorMessage, rewriteFailureMessage, msysEcho, driveToMsys, pathEcho, ERROR_CONTENT_TOOLS, readPosixPaths, readAdoptSidebar, readDialectSettings, windowsToMsys, rewriteResultPaths, adoptSidebarShell, MARKER_FILE, classify, materialize, cleanupOnDispose, firstUserRoot, hashTree, skillsHashes, syncDecision, installRegisterShim, baseForRoster, detectBase, pickComposition, personaEraForText, detectPersonaEra, injectPresentRow, hostHasToolPresent, detectPresentSupport, injectPluginManagerRow, hostHasPluginManagerTools, rowFormOf, rowFormsOf, alignEngineRow, alignRalphRow, ROW_SOURCE }