dsh-gitbash-shell 0.36.0 → 0.38.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,30 @@
3
3
  > 倒序排列,新版本条目在最上面。条目格式:`## vX.Y.Z — YYYY-MM-DD` + 类型(feat / fix / docs / chore)+ 要点 + 相关链接。
4
4
  > 纪律见 AGENTS.md「变更记录纪律」:发版前先更新本文件并随版本提交;事故复盘、复现与真机验证记录也记在这里。
5
5
 
6
+ ## v0.38.0 — 2026-10-13
7
+
8
+ **类型**:feat(设置卡折叠分区;用户反馈「开关堆一列不知道主题」)。
9
+
10
+ - **七分区全部改为可折叠卡片**:v0.36.0 只加了标题文字,视觉上仍是一列开关。现在每个分区是官方 `DisclosureRow`(seed `ui-primitives` 组件,client bundle 的 require 白名单内)**折叠卡**——默认全部收起,页面只剩七行分区标题(模式 / 行内工具 / 路径方言 / 执行器 / 终端 / 终端工具 / 插件联动),点哪行展开哪区,找设置 = 先认主题再点开(用户原话:「内部可以折叠,这样我找的时候就只需要去展开我大概知道的某个设置主题,然后去找更细节的按钮」)。
11
+ - **视觉卡片化**:每分区带边框 + 圆角(`.gb-fold`),分区边界一眼可辨;不再依赖上一分区底部的分隔线。
12
+ - **新增 `sec.mode` 分区标题 × 21 语言**(模式区此前借用变体开关的长文案做标题)。
13
+ - **退化路径**:极简宿主没有 `DisclosureRow` 导出时,分区退化为静态标题+内容(v0.36.0 形态),卡片永不白屏。
14
+ - 功能面零变化:所有开关的字段名、写入通道、默认值原样。
15
+ - **冒烟**:117 项全绿;七分区断言改锁 fold 形态(官方 DisclosureRow 接线、默认收起、退化路径)。
16
+
17
+ ## v0.37.0 — 2026-10-13
18
+
19
+ **类型**:feat(用户拍板的命名与开关重构;真机反馈驱动)。
20
+
21
+ - **`gitbash_pwsh` 更名 `pwsh7`(破坏性:工具名变更)**:旧名读起来像「bash/pwsh 二选一的混合工具」,让人误解(用户真机反馈)。新名 `pwsh7` 语义直白(PowerShell 7),且**绝不占用宿主被污染的 `pwsh` 名**(那个名字的全局工具在本机执行 Git Bash,是假 pwsh,恒定拒绝)。真机已装旧版的会话在新版下自然看到 `pwsh7`。
22
+ - **`pwshTool` 开关默认翻转为 `false`(破坏性:默认值变更)**:默认**不提供**专门的 PowerShell 工具——平时全部走 bash 工具,需要 Windows 原生操作的用户在设置卡自己打开。开关只在 gitbash-shell 一侧行上(ptc 创造模式零参与,装了本插件即自动适配,2026-10-13 拍板)。
23
+ - **pwsh7 的提供方式改为 per-agent scope 注册**(原为全局注册):agent 独立 scope 内注册、随 agent 销毁回收;与 dsh-ops 共存时照旧让位(它的宿主 pwsh 故事优先)。
24
+ - **路由提示词按开关分支**:`pwsh7` 关(默认)时 bash 工具的描述**不再提及任何 PowerShell 工具**(给模型指一条到不了的路只会教它调用被拒的名字);开时才出现「pwsh7 仅用于 Windows 原生能力」的路由句。新增 `GITBASH_ROUTE_ADDENDUM_NO_PWSH` 常量,assemble 处按 `pwshTool()` 现场选择。
25
+ - **调用层守卫保持恒定 deny `pwsh`**:`pwsh7` 是纯加法名字,不会误杀;deny 理由句更新为指路 `pwsh7` 与设置卡开关。
26
+ - **词典**:pwsh.label/pwsh.hint × 21 语言重写(名字 pwsh7、默认关、**必须已安装 PowerShell 7** 的提醒与下载地址);工具 description 与错误消息同步更名。
27
+ - **冒烟**:117 项全绿;路由句测试加「OFF 变体不得出现 pwsh7 字样」与「 misleading 名绝迹」断言。
28
+ - **待真机复验**:bash 工具补位仍未在标准模式出现(v0.35.3 观察)——`activateOfficialBash` 链路失败必有日志行("not resolvable"/"import failed"/"activation failed"),等宿主日志定位;与本版无耦合。
29
+
6
30
  ## v0.36.0 — 2026-10-13
7
31
 
8
32
  **类型**:feat(设置卡分组重排;用户反馈「一排按钮不知道分类」)。
package/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-gitbash-shell",
3
- "version": "0.36.0",
3
+ "version": "0.38.0",
4
4
  "main": "./src/index.js",
5
5
  "description": "Windows 全模式 Git Bash:用 Git for Windows bash 替换 PowerShell 执行器;官方四个模式经行内工具补位直接获得 Git Bash(v0.35.0,默认),四个 *·Git Bash 变体 preset 可开关;附带 gitbash_pwsh(系统 PowerShell 7)与 gb_* FastCtx 文件工具,检测到 dsh-ops 自动让位。联动:dsh-ptc-cordis-preset(PTC 创造模式带 Git Bash 行且可去重)+ dsh-better-sidebar(终端标签自动切 Git Bash)。",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-gitbash-shell",
3
- "version": "0.36.0",
3
+ "version": "0.38.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
@@ -76,6 +76,7 @@ window.__ModuleLoader__.load({
76
76
  "switch.off": "停用",
77
77
  "error": "写入失败",
78
78
  "hint": "启用后:所有工具(bash 命令与 workdir、read/write/edit/read_image/glob/grep 与 present 的路径参数)统一使用 MSYS 盘根 POSIX 路径(/c/Users/...);bash 的原生习惯——~ 家目录、/tmp 临时目录、/dev/null、/usr 等——在所有工具中同样有效(与 Git Bash 挂载表一致),路径参数由宿主自动翻译,模型无感。停用后恢复 dsh 原生行为(文件工具用 Windows 路径)。bash 始终是 Git Bash,不受此开关影响。",
79
+ "sec.mode": "模式",
79
80
  "sec.inline": "行内工具",
80
81
  "sec.executor": "执行器",
81
82
  "sec.peer": "插件联动",
@@ -137,8 +138,8 @@ window.__ModuleLoader__.load({
137
138
  "tools.updating": "更新中…",
138
139
  "variant.label": "四个「·Git Bash」变体模式",
139
140
  "variant.hint": "默认关闭:官方四个模式经行内工具补位直接获得 Git Bash,模式列表保持官方原样。开启后注册四个变体(standard/minimal/ptc/cordis · Git Bash)并停用官方模式的工具补位——两者互斥。钉在变体 id 上的旧会话在关闭升级后需重新选择模式;变更对新会话生效。",
140
- "pwsh.label": "PowerShell 7 工具(gitbash_pwsh)",
141
- "pwsh.hint": "默认开启:宿主 pwsh 工具在本机实际执行 Git Bash(名字是假的),会被自动遮蔽;本开关另发一个真正的 gitbash_pwsh,用系统安装的 PowerShell 7 执行 Windows 原生操作(注册表/服务/WMI),仅完全权限会话可用;机器没装 pwsh 7 时不发布。bash 能做的事一律优先 bash。",
141
+ "pwsh.label": "PowerShell 7 工具(pwsh7)",
142
+ "pwsh.hint": "默认关闭:开启后本插件在会话里提供真正的 pwsh7 工具,用系统安装的 PowerShell 7 执行 Windows 原生操作(注册表/服务/WMI),仅完全权限会话可用。前提:机器上已安装 PowerShell 7(https://aka.ms/powershell),没装则工具不会出现。宿主自带的 pwsh 工具在本机实际执行 Git Bash(名字是假的),无论开关一律拒绝——命令一律走 bash 工具。",
142
143
  "fctx.label": "FastCtx 文件工具(gb_*)",
143
144
  "fctx.hint": "默认开启:发布 gb_inspect_local_file / gb_grep / gb_glob / gb_replace(Rust 实现:批量读取带 token 预算、编码探测)。它们是官方 read/grep/glob/edit 的补充——官方工具接文件沙箱,仍是默认推荐;检测到 dsh-ops(ops_* 工具)时本组自动让位。",
144
145
  };
@@ -153,6 +154,7 @@ window.__ModuleLoader__.load({
153
154
  "switch.off": "Disable",
154
155
  "error": "write failed",
155
156
  "hint": "Enabled: every tool (bash commands and workdir, read/write/edit/read_image/glob/grep and present path arguments) uses MSYS drive-root POSIX paths (/c/Users/...); bash-native habits — the ~ home shorthand, /tmp, /dev/null, /usr — resolve in every tool exactly as bash itself resolves them, and the host translates the path fields automatically. Disabled restores dsh-native behavior (Windows paths for file tools). Bash is always Git Bash while the plugin is installed; this switch only governs the cross-tool path dialect.",
157
+ "sec.mode": "Mode",
156
158
  "sec.inline": "Inline tools",
157
159
  "sec.executor": "Executor",
158
160
  "sec.peer": "Plugin integrations",
@@ -214,8 +216,8 @@ window.__ModuleLoader__.load({
214
216
  "tools.updating": "Updating…",
215
217
  "variant.label": "The four \"· Git Bash\" variant presets",
216
218
  "variant.hint": "Off by default: the four OFFICIAL presets get Git Bash through the inline tool patch and the roster stays official. On: register the four variants (standard/minimal/ptc/cordis · Git Bash) and stop patching the official presets — the two are exclusive. A session pinned to a variant id must re-select a preset after upgrading with the switch off. Applies to new sessions.",
217
- "pwsh.label": "PowerShell 7 tool (gitbash_pwsh)",
218
- "pwsh.hint": "On by default: the host pwsh tool actually runs Git Bash on this machine (a lying name) and is denied automatically; this switch instead publishes a REAL gitbash_pwsh over the system-installed PowerShell 7 for Windows-native work (registry/services/WMI), danger-full-access sessions only. Never published without pwsh 7 on the machine. Prefer bash for everything bash can do.",
219
+ "pwsh.label": "PowerShell 7 tool (pwsh7)",
220
+ "pwsh.hint": "Off by default: when on, this plugin provides a REAL pwsh7 tool over the system-installed PowerShell 7 for Windows-native work (registry/services/WMI), danger-full-access sessions only. Requires PowerShell 7 installed (https://aka.ms/powershell) — without it the tool never appears. The host's own pwsh tool actually runs Git Bash on this machine (a lying name) and is denied regardless of this switch — route commands through the bash tool.",
219
221
  "fctx.label": "FastCtx file tools (gb_*)",
220
222
  "fctx.hint": "On by default: publishes gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: batched reads with a token budget, encoding detection). ADDITIONS to the official read/grep/glob/edit — the official tools keep the file sandbox and stay the default. Stands down automatically when dsh-ops is installed.",
221
223
  };
@@ -240,6 +242,7 @@ window.__ModuleLoader__.load({
240
242
  "switch.off": "تعطيل",
241
243
  "error": "فشل الكتابة",
242
244
  "hint": "عند التفعيل: تستخدم كل الأدوات (أوامر bash و workdir، ومعاملات المسار في read/write/edit/read_image/glob/grep و present) مسارات POSIX من جذر قرص MSYS (/c/Users/...)؛ وعادات bash الأصلية — ~ للمجلد الرئيسي و /tmp و /dev/null و /usr — تعمل في كل أداة تمامًا كما تحلّها bash نفسها، ويتولّى المضيف ترجمة حقول المسار تلقائيًا. عند التعطيل يعود السلوك الأصلي لـ dsh (مسارات Windows لأدوات الملفات). يبقى bash دائمًا Git Bash ما دامت الإضافة مثبَّتة؛ هذا المفتاح لا يحكم سوى لهجة المسارات بين الأدوات.",
245
+ "sec.mode": "الوضع",
243
246
  "sec.inline": "الأدوات المضمنة",
244
247
  "sec.executor": "المنفّذ",
245
248
  "sec.peer": "تكامل الإضافات",
@@ -301,8 +304,8 @@ window.__ModuleLoader__.load({
301
304
  "tools.updating": "جارٍ الترقية…",
302
305
  "variant.label": "الأنماط الأربعة «· Git Bash»",
303
306
  "variant.hint": "معطَّل افتراضيًا: تحصل الأنماط الرسمية الأربعة على Git Bash عبر ترقيع الأدوات داخل العملية وتبقى القائمة رسمية. عند التفعيل تُسجَّل الأنماط الأربعة المتغيّرة وتتوقف ترقيع الأنماط الرسمية — الاثنان حصريان متباددان. الجلسة المثبَّتة على معرّف متغيّر تحتاج إعادة اختيار بعد الترقية مع بقاء المفتاح معطَّلًا.",
304
- "pwsh.label": "أداة PowerShell 7 (gitbash_pwsh)",
305
- "pwsh.hint": "مُفعَّلة افتراضيًا: أداة pwsh الرسمية تشغّل Git Bash فعليًا على هذا الجهاز (اسم كاذب) فتُحجب تلقائيًا؛ يصدر هذا المفتاح أداة gitbash_pwsh حقيقية عبر PowerShell 7 المثبَّت على النظام لأعمال Windows الأصلية (السجل/الخدمات/WMI)، وللجلسات كاملة الصلاحيات فقط. لا تُنشر دون pwsh 7. فضّل bash لكل ما يستطيع فعله.",
307
+ "pwsh.label": "أداة PowerShell 7 (pwsh7)",
308
+ "pwsh.hint": "مُعطَّلة افتراضيًا: عند التفعيل توفر هذه الإضافة أداة pwsh7 حقيقية عبر PowerShell 7 المثبَّت على النظام لأعمال Windows الأصلية (السجل/الخدمات/WMI)، وللجلسات كاملة الصلاحيات فقط. تتطلب تثبيت PowerShell 7 (https://aka.ms/powershell) — بدونها لن تظهر الأداة. أداة pwsh الرسمية تشغّل Git Bash فعليًا على هذا الجهاز (اسم كاذب) وتُرفض بغض النظر عن هذا المفتاح — مرّر الأوامر عبر أداة bash.",
306
309
  "fctx.label": "أدوات ملفات FastCtx (gb_*)",
307
310
  "fctx.hint": "مُفعَّلة افتراضيًا: تنشر gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: قراءات دفعية بميزانية رموز وكشف ترميز). إضافة إلى read/grep/glob/edit الرسمية التي تحتفظ بصندوق الرمل وتبقى الافتراض؛ تتوقف تلقائيًا عند تثبيت dsh-ops.",
308
311
  },
@@ -317,6 +320,7 @@ window.__ModuleLoader__.load({
317
320
  "switch.off": "Deaktivieren",
318
321
  "error": "Schreiben fehlgeschlagen",
319
322
  "hint": "Aktiviert: Alle Tools (bash-Befehle und workdir sowie Pfadargumente von read/write/edit/read_image/glob/grep und present) verwenden POSIX-Pfade ab der MSYS-Laufwerkswurzel (/c/Users/...); bash-eigene Gewohnheiten — ~ für das Home-Verzeichnis, /tmp, /dev/null, /usr — funktionieren in jedem Tool genau so, wie bash sie selbst auflöst, und der Host übersetzt die Pfadfelder automatisch. Deaktiviert stellt das dsh-native Verhalten wieder her (Windows-Pfade für Dateitools). Bash ist bei installiertem Plugin immer Git Bash; dieser Schalter steuert nur den Pfaddialekt zwischen den Tools.",
323
+ "sec.mode": "Modus",
320
324
  "sec.inline": "Inline-Werkzeuge",
321
325
  "sec.executor": "Executor",
322
326
  "sec.peer": "Plugin-Integrationen",
@@ -378,8 +382,8 @@ window.__ModuleLoader__.load({
378
382
  "tools.updating": "Wird aktualisiert…",
379
383
  "variant.label": "Die vier „· Git Bash“-Varianten",
380
384
  "variant.hint": "Standardmäßig aus: Die vier OFFIZIELLEN Presets bekommen Git Bash durch den Inline-Tool-Patch, die Liste bleibt offiziell. Ein: Registriert die vier Varianten und stoppt das Patchen der offiziellen Presets — beides schließt sich aus. Eine am Varianten-Id festhängende Sitzung muss nach dem Upgrade neu wählen. Gilt für neue Sitzungen.",
381
- "pwsh.label": "PowerShell-7-Werkzeug (gitbash_pwsh)",
382
- "pwsh.hint": "Standardmäßig ein: Das pwsh-Werkzeug des Hosts läuft hier tatsächlich als Git Bash (ein täuschender Name) und wird automatisch abgelehnt; dieser Schalter veröffentlicht stattdessen ein ECHTES gitbash_pwsh über das installierte PowerShell 7 für Windows-natives Arbeiten (Registry/Dienste/WMI), nur mit voller Berechtigung. Ohne pwsh 7 wird nichts veröffentlicht. Bevorzuge bash für alles, was bash kann.",
385
+ "pwsh.label": "PowerShell-7-Werkzeug (pwsh7)",
386
+ "pwsh.hint": "Standardmäßig aus: Beim Einschalten stellt dieses Plugin ein ECHTES pwsh7-Werkzeug über das installierte PowerShell 7 bereit (Windows-natives Arbeiten: Registry/Dienste/WMI), nur mit voller Berechtigung. Erfordert installiertes PowerShell 7 (https://aka.ms/powershell) — ohne es erscheint das Werkzeug nie. Das pwsh-Werkzeug des Hosts läuft hier tatsächlich als Git Bash (täuschender Name) und wird unabhängig von diesem Schalter abgelehnt — Befehle laufen über das bash-Werkzeug.",
383
387
  "fctx.label": "FastCtx-Dateiwerkzeuge (gb_*)",
384
388
  "fctx.hint": "Standardmäßig ein: Veröffentlicht gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: stapelweise Lesevorgänge mit Token-Budget, Kodierungserkennung). ERGÄNZUNGEN zu read/grep/glob/edit — die offiziellen Werkzeuge behalten die Datei-Sandbox und bleiben Standard. Weicht automatisch zurück, wenn dsh-ops installiert ist.",
385
389
  },
@@ -394,6 +398,7 @@ window.__ModuleLoader__.load({
394
398
  "switch.off": "Désactiver",
395
399
  "error": "échec de l'écriture",
396
400
  "hint": "Activé : tous les outils (commandes bash et workdir, arguments de chemin de read/write/edit/read_image/glob/grep et de present) utilisent des chemins POSIX à racine de lecteur MSYS (/c/Users/...) ; les habitudes natives de bash — ~ pour le dossier personnel, /tmp, /dev/null, /usr — fonctionnent dans chaque outil exactement comme bash les résout lui-même, et l'hôte traduit les champs de chemin automatiquement. Désactivé rétablit le comportement natif de dsh (chemins Windows pour les outils de fichiers). Bash reste toujours Git Bash tant que le plugin est installé ; ce commutateur ne régit que le dialecte de chemins entre outils.",
401
+ "sec.mode": "Mode",
397
402
  "sec.inline": "Outils en ligne",
398
403
  "sec.executor": "Exécuteur",
399
404
  "sec.peer": "Intégrations de plugins",
@@ -455,8 +460,8 @@ window.__ModuleLoader__.load({
455
460
  "tools.updating": "Mise à jour…",
456
461
  "variant.label": "Les quatre variantes « · Git Bash »",
457
462
  "variant.hint": "Désactivé par défaut : les quatre presets OFFICIELS obtiennent Git Bash via le correctif d’outils en ligne et la liste reste officielle. Activé : enregistre les quatre variantes et cesse de corriger les presets officiels — les deux s’excluent. Une session attachée à un id de variante doit être rechoisie après mise à niveau. S’applique aux nouvelles sessions.",
458
- "pwsh.label": "Outil PowerShell 7 (gitbash_pwsh)",
459
- "pwsh.hint": "Activé par défaut : l’outil pwsh de l’hôte exécute en réalité Git Bash ici (un nom mensonger) et est refusé automatiquement ; ce commutateur publie un VRAI gitbash_pwsh via le PowerShell 7 installé pour les opérations natives Windows (registre/services/WMI), sessions en accès complet uniquement. Jamais publié sans pwsh 7. Préférez bash pour tout ce que bash sait faire.",
463
+ "pwsh.label": "Outil PowerShell 7 (pwsh7)",
464
+ "pwsh.hint": "Désactivé par défaut : activé, ce plugin fournit un VRAI outil pwsh7 via le PowerShell 7 installé sur le système pour le travail Windows natif (registre/services/WMI), sessions en accès complet uniquement. Nécessite PowerShell 7 installé (https://aka.ms/powershell) — sans lui l'outil n'apparaît jamais. L'outil pwsh de l'hôte exécute en réalité Git Bash sur cette machine (nom trompeur) et est refusé quel que soit ce commutateur — passez par l'outil bash.",
460
465
  "fctx.label": "Outils de fichiers FastCtx (gb_*)",
461
466
  "fctx.hint": "Activé par défaut : publie gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust : lectures par lots avec budget de tokens, détection d’encodage). COMPLÉMENTS aux outils officiels read/grep/glob/edit — ceux-ci conservent le bac à sable fichiers et restent la valeur par défaut. Se retire automatiquement si dsh-ops est installé.",
462
467
  },
@@ -471,6 +476,7 @@ window.__ModuleLoader__.load({
471
476
  "switch.off": "अक्षम करें",
472
477
  "error": "लिखना विफल रहा",
473
478
  "hint": "सक्षम होने पर: सभी टूल (bash कमांड और workdir, तथा read/write/edit/read_image/glob/grep और present के पथ तर्क) MSYS ड्राइव-रूट POSIX पथ (/c/Users/...) का उपयोग करते हैं; bash की मूल आदतें — होम के लिए ~, /tmp, /dev/null, /usr — हर टूल में ठीक वैसे काम करती हैं जैसे bash स्वयं उन्हें हल करता है, और होस्ट पथ फ़ील्ड स्वतः अनुवादित करता है। अक्षम करने पर dsh का मूल व्यवहार बहाल होता है (फ़ाइल टूल के लिए Windows पथ)। जब तक प्लगइन इंस्टॉल है bash हमेशा Git Bash रहता है; यह स्विच केवल टूल के बीच पथ शैली नियंत्रित करता है।",
479
+ "sec.mode": "मोड",
474
480
  "sec.inline": "इनलाइन टूल्स",
475
481
  "sec.executor": "एक्ज़ीक्यूटर",
476
482
  "sec.peer": "प्लगइन एकीकरण",
@@ -532,8 +538,8 @@ window.__ModuleLoader__.load({
532
538
  "tools.updating": "अपडेट हो रहा है…",
533
539
  "variant.label": "चार «· Git Bash» वेरिएंट प्रीसेट",
534
540
  "variant.hint": "डिफ़ॉल्ट रूप से बंद: चार आधिकारिक प्रीसेट को इनलाइन टूल पैच से Git Bash मिलता है और सूची आधिकारिक रहती है। चालू: चार वेरिएंट पंजीकृत होते हैं और आधिकारिक प्रीसेट पैचिंग रुक जाती है — दोनों परस्पर अनन्य हैं। वेरिएंट id पर बंधे सत्र को अपग्रेड के बाद दोबारा चुनना पड़ेगा। नए सत्रों पर लागू।",
535
- "pwsh.label": "PowerShell 7 उपकरण (gitbash_pwsh)",
536
- "pwsh.hint": "डिफ़ॉल्ट रूप से चालू: होस्ट का pwsh उपकरण इस मशीन पर वास्तव में Git Bash चलाता है (झूठा नाम) और स्वतः अवरुद्ध होता है; यह स्विच सिस्टम-इंस्टॉल्ड PowerShell 7 पर असली gitbash_pwsh प्रकाशित करता है — Windows-नेटिव कार्य (रजिस्ट्री/सेवाएँ/WMI) के लिए, केवल पूर्ण-अधिकार सत्रों में। pwsh 7 बिना कभी प्रकाशित नहीं। जो bash कर सकता है उसके लिए bash ही चुनें।",
541
+ "pwsh.label": "PowerShell 7 टूल (pwsh7)",
542
+ "pwsh.hint": "डिफ़ॉल्ट रूप से बंद: चालू करने पर यह प्लगइन सिस्टम-इंस्टॉल्ड PowerShell 7 पर एक असली pwsh7 टूल देता है (Windows-नेटिव काम: रजिस्ट्री/सेवाएँ/WMI), केवल पूर्ण-अनुमति सत्रों के लिए। PowerShell 7 इंस्टॉल होना ज़रूरी है (https://aka.ms/powershell) — बिना इसके टूल कभी नहीं दिखेगा। होस्ट का pwsh टूल इस मशीन पर असल में Git Bash चलाता है (झूठा नाम) और इस स्विच से इतर हमेशा अस्वीकृत रहता है — कमांड bash टूल से चलाएँ।",
537
543
  "fctx.label": "FastCtx फ़ाइल उपकरण (gb_*)",
538
544
  "fctx.hint": "डिफ़ॉल्ट रूप से चालू: gb_inspect_local_file / gb_grep / gb_glob / gb_replace प्रकाशित करता है (Rust: टोकन बजट के साथ बैच रीड, एनकोडिंग पहचान)। आधिकारिक read/grep/glob/edit के अतिरिक्त — आधिकारिक उपकरण फ़ाइल सैंडबॉक्स रखते हैं और डिफ़ॉल्ट बने रहते हैं। dsh-ops इंस्टॉल होने पर स्वतः पीछे हट जाता है।",
539
545
  },
@@ -548,6 +554,7 @@ window.__ModuleLoader__.load({
548
554
  "switch.off": "Nonaktifkan",
549
555
  "error": "gagal menulis",
550
556
  "hint": "Saat aktif: semua alat (perintah bash dan workdir, serta argumen path read/write/edit/read_image/glob/grep dan present) memakai path POSIX berakar drive MSYS (/c/Users/...); kebiasaan asli bash — ~ untuk direktori home, /tmp, /dev/null, /usr — bekerja di setiap alat persis seperti bash sendiri menyelesaikannya, dan host menerjemahkan bidang path secara otomatis. Saat nonaktif, perilaku asli dsh dipulihkan (path Windows untuk alat berkas). Bash selalu Git Bash selama plugin terpasang; sakelar ini hanya mengatur dialek path antaralat.",
557
+ "sec.mode": "Mode",
551
558
  "sec.inline": "Alat inline",
552
559
  "sec.executor": "Eksekutor",
553
560
  "sec.peer": "Integrasi plugin",
@@ -609,8 +616,8 @@ window.__ModuleLoader__.load({
609
616
  "tools.updating": "Memperbarui…",
610
617
  "variant.label": "Empat preset varian «· Git Bash»",
611
618
  "variant.hint": "Nonaktif secara bawaan: empat preset RESMI mendapat Git Bash melalui patch alat inline dan daftar tetap resmi. Aktif: mendaftarkan empat varian dan berhenti mem-patch preset resmi — keduanya saling eksklusif. Sesi yang terikat pada id varian harus memilih ulang setelah peningkatan. Berlaku untuk sesi baru.",
612
- "pwsh.label": "Alat PowerShell 7 (gitbash_pwsh)",
613
- "pwsh.hint": "Aktif secara bawaan: alat pwsh host sebenarnya menjalankan Git Bash di mesin ini (nama palsu) dan otomatis ditolak; sakelar ini menerbitkan gitbash_pwsh ASLI melalui PowerShell 7 terinstal sistem untuk pekerjaan native Windows (registri/layanan/WMI), hanya sesi akses penuh. Tidak pernah diterbitkan tanpa pwsh 7. Utamakan bash untuk semua yang bisa dilakukan bash.",
619
+ "pwsh.label": "Alat PowerShell 7 (pwsh7)",
620
+ "pwsh.hint": "Nonaktif secara default: saat aktif, plugin ini menyediakan alat pwsh7 ASLI melalui PowerShell 7 yang terinstal di sistem untuk kerja native Windows (registry/layanan/WMI), hanya untuk sesi akses penuh. Butuh PowerShell 7 terinstal (https://aka.ms/powershell) — tanpanya alat tak akan muncul. Alat pwsh bawaan host sebenarnya menjalankan Git Bash di mesin ini (nama palsu) dan ditolak apa pun status sakelar ini — jalankan perintah lewat alat bash.",
614
621
  "fctx.label": "Alat berkas FastCtx (gb_*)",
615
622
  "fctx.hint": "Aktif secara bawaan: menerbitkan gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: pembacaan batch dengan anggaran token, deteksi enkode). TAMBAHAN untuk read/grep/glob/edit resmi — alat resmi tetap memiliki sandbox berkas dan menjadi bawaan. Mundur otomatis saat dsh-ops terinstal.",
616
623
  },
@@ -625,6 +632,7 @@ window.__ModuleLoader__.load({
625
632
  "switch.off": "Disattiva",
626
633
  "error": "scrittura non riuscita",
627
634
  "hint": "Attivato: tutti gli strumenti (comandi bash e workdir, argomenti di percorso di read/write/edit/read_image/glob/grep e di present) usano percorsi POSIX con radice di unità MSYS (/c/Users/...); le abitudini native di bash — ~ per la home, /tmp, /dev/null, /usr — funzionano in ogni strumento esattamente come le risolve bash stesso, e l'host traduce automaticamente i campi di percorso. Disattivato ripristina il comportamento nativo di dsh (percorsi Windows per gli strumenti per i file). Bash resta sempre Git Bash finché il plugin è installato; questo interruttore governa solo il dialetto dei percorsi tra gli strumenti.",
635
+ "sec.mode": "Modalità",
628
636
  "sec.inline": "Strumenti inline",
629
637
  "sec.executor": "Esecutore",
630
638
  "sec.peer": "Integrazioni plugin",
@@ -686,8 +694,8 @@ window.__ModuleLoader__.load({
686
694
  "tools.updating": "Aggiornamento…",
687
695
  "variant.label": "Le quattro varianti «· Git Bash»",
688
696
  "variant.hint": "Disattivo per impostazione predefinita: i quattro preset UFFICIALI ottengono Git Bash tramite la patch inline degli strumenti e l’elenco resta ufficiale. Attivo: registra le quattro varianti e smette di correggere i preset ufficiali — i due si escludono. Una sessione legata a un id di variante va riscelta dopo l’aggiornamento. Vale per le nuove sessioni.",
689
- "pwsh.label": "Strumento PowerShell 7 (gitbash_pwsh)",
690
- "pwsh.hint": "Attivo per impostazione predefinita: lo strumento pwsh dell’host esegue davvero Git Bash su questa macchina (un nome ingannevole) e viene negato automaticamente; questo interruttore pubblica un VERO gitbash_pwsh tramite PowerShell 7 installato per il lavoro nativo Windows (registro/servizi/WMI), solo sessioni ad accesso completo. Mai pubblicato senza pwsh 7. Preferisci bash per tutto ciò che bash sa fare.",
697
+ "pwsh.label": "Strumento PowerShell 7 (pwsh7)",
698
+ "pwsh.hint": "Disattivo per impostazione predefinita: quando attivo, questo plugin fornisce un VERO strumento pwsh7 tramite il PowerShell 7 installato sul sistema per lavoro Windows nativo (registro/servizi/WMI), solo sessioni con accesso completo. Richiede PowerShell 7 installato (https://aka.ms/powershell) — senza di esso lo strumento non appare mai. Lo strumento pwsh dell'host esegue in realtà Git Bash su questa macchina (nome ingannevole) e viene rifiutato a prescindere da questo interruttore — instrada i comandi tramite lo strumento bash.",
691
699
  "fctx.label": "Strumenti file FastCtx (gb_*)",
692
700
  "fctx.hint": "Attivo per impostazione predefinita: pubblica gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: letture in batch con budget di token, rilevamento della codifica). AGGIUNTE ai read/grep/glob/edit ufficiali — quelli ufficiali mantengono la sandbox dei file e restano la scelta predefinita. Si ritira automaticamente con dsh-ops installato.",
693
701
  },
@@ -702,6 +710,7 @@ window.__ModuleLoader__.load({
702
710
  "switch.off": "無効にする",
703
711
  "error": "書き込みに失敗しました",
704
712
  "hint": "有効にすると、すべてのツール(bash コマンドと workdir、read/write/edit/read_image/glob/grep と present のパス引数)が MSYS ドライブルートの POSIX パス(/c/Users/...)を使います。bash のネイティブな習慣——ホームの ~、/tmp、/dev/null、/usr——も、bash 自身が解決するのとまったく同じようにすべてのツールで動作し、パスフィールドはホストが自動的に変換します。無効にすると dsh 本来の動作(ファイルツールは Windows パス)に戻ります。bash はプラグインがインストールされている限り常に Git Bash で、このスイッチの影響を受けません。",
713
+ "sec.mode": "モード",
705
714
  "sec.inline": "インラインツール",
706
715
  "sec.executor": "実行エンジン",
707
716
  "sec.peer": "プラグイン連携",
@@ -763,8 +772,8 @@ window.__ModuleLoader__.load({
763
772
  "tools.updating": "更新中…",
764
773
  "variant.label": "4 つの「· Git Bash」バリアント",
765
774
  "variant.hint": "既定はオフ:公式 4 プリセットはインラインツールパッチで Git Bash を得られ、一覧は公式のまま。オンにすると 4 バリアントを登録し、公式プリセットへのパッチを停止(両者は排他)。バリアント id に固定されたセッションはアップグレード後に再選択が必要。新規セッションに適用。",
766
- "pwsh.label": "PowerShell 7 ツール(gitbash_pwsh)",
767
- "pwsh.hint": "既定はオン:ホストの pwsh ツールはこのマシンでは実際に Git Bash を実行する(偽の名前)ため自動で拒否されます。このスイッチは代わりに、システムの PowerShell 7 で Windows ネイティブ作業(レジストリ/サービス/WMI)を行う本物の gitbash_pwsh を公開します(完全権限セッションのみ)。pwsh 7 が無ければ公開しません。bash でできることは bash を優先。",
775
+ "pwsh.label": "PowerShell 7 ツール(pwsh7)",
776
+ "pwsh.hint": "既定はオフ:オンにすると、システムにインストールされた PowerShell 7 で本物の pwsh7 ツールを提供します(レジストリ/サービス/WMI など Windows ネイティブ作業用)。完全権限セッションのみ。PowerShell 7 のインストールが必要です(https://aka.ms/powershell)— 未インストールではツールは出現しません。ホスト純正の pwsh ツールはこのマシンでは実際には Git Bash を実行する(偽の名前)ため、このスイッチとは無関係に常に拒否されます — コマンドは bash ツールへ。",
768
777
  "fctx.label": "FastCtx ファイルツール(gb_*)",
769
778
  "fctx.hint": "既定はオン:gb_inspect_local_file / gb_grep / gb_glob / gb_replace を公開(Rust:トークン予算付き一括読み取り、エンコーディング検出)。公式 read/grep/glob/edit への追加であり、公式ツールはファイルサンドボックスを保ち既定の推奨のまま。dsh-ops が入ると自動で退きます。",
770
779
  },
@@ -779,6 +788,7 @@ window.__ModuleLoader__.load({
779
788
  "switch.off": "사용 안 함",
780
789
  "error": "쓰기 실패",
781
790
  "hint": "켜면 모든 도구(bash 명령과 workdir, read/write/edit/read_image/glob/grep 및 present의 경로 인수)가 MSYS 드라이브 루트 POSIX 경로(/c/Users/...)를 사용합니다. bash 고유 습관——홈의 ~, /tmp, /dev/null, /usr——도 bash 자신이 해석하는 그대로 모든 도구에서 작동하며 호스트가 경로 필드를 자동 변환합니다. 끄면 dsh 기본 동작(파일 도구에 Windows 경로 사용)으로 돌아갑니다. 플러그인이 설치되어 있는 동안 bash는 항상 Git Bash이며 이 스위치의 영향을 받지 않습니다.",
791
+ "sec.mode": "모드",
782
792
  "sec.inline": "인라인 도구",
783
793
  "sec.executor": "실행기",
784
794
  "sec.peer": "플러그인 연동",
@@ -840,8 +850,8 @@ window.__ModuleLoader__.load({
840
850
  "tools.updating": "업데이트 중…",
841
851
  "variant.label": "네 개의 «· Git Bash» 변형 프리셋",
842
852
  "variant.hint": "기본 꺼짐: 공식 4개 프리셋이 인라인 도구 패치로 Git Bash를 얻으며 목록은 공식 그대로입니다. 켜면 4개 변형을 등록하고 공식 프리셋 패칭을 중단합니다(상호 배타). 변형 id 에 고정된 세션은 업그레이드 후 다시 선택해야 합니다. 새 세션에 적용.",
843
- "pwsh.label": "PowerShell 7 도구(gitbash_pwsh)",
844
- "pwsh.hint": "기본 켜짐: 호스트의 pwsh 도구는 이 머신에서 실제로 Git Bash를 실행합니다(거짓 이름), 자동으로 거부됩니다. 이 스위치는 시스템에 설치된 PowerShell 7으로 Windows 네이티브 작업(레지스트리/서비스/WMI)을 수행하는 진짜 gitbash_pwsh를 대신 공개합니다(전체 권한 세션 전용). pwsh 7이 없으면 공개하지 않습니다. bash 가 할 수 있는 일은 bash 우선.",
853
+ "pwsh.label": "PowerShell 7 도구(pwsh7)",
854
+ "pwsh.hint": "기본적으로 꺼짐: 켜면 이 플러그인이 시스템에 설치된 PowerShell 7으로 실제 pwsh7 도구를 제공합니다(레지스트리/서비스/WMI 등 Windows 네이티브 작업), 전체 권한 세션 전용. PowerShell 7 설치가 필요합니다(https://aka.ms/powershell) — 없으면 도구가 나타나지 않습니다. 호스트의 pwsh 도구는 이 머신에서 실제로 Git Bash를 실행하는(거짓 이름) 도구로, 이 스위치와 무관하게 항상 거부됩니다 — 명령은 bash 도구로 실행하세요.",
845
855
  "fctx.label": "FastCtx 파일 도구(gb_*)",
846
856
  "fctx.hint": "기본 켜짐: gb_inspect_local_file / gb_grep / gb_glob / gb_replace 를 공개합니다(Rust: 토큰 예산 기반 일괄 읽기, 인코딩 감지). 공식 read/grep/glob/edit 의 추가이며 공식 도구는 파일 샌드박스를 유지하고 기본 권장입니다. dsh-ops 가 설치되면 자동으로 물러납니다.",
847
857
  },
@@ -856,6 +866,7 @@ window.__ModuleLoader__.load({
856
866
  "switch.off": "Uitschakelen",
857
867
  "error": "schrijven mislukt",
858
868
  "hint": "Ingeschakeld: alle tools (bash-opdrachten en workdir, padargumenten van read/write/edit/read_image/glob/grep en present) gebruiken POSIX-paden vanaf de MSYS-schijfwortel (/c/Users/...); bash-eigen gewoonten — ~ voor de home-map, /tmp, /dev/null, /usr — werken in elke tool precies zoals bash ze zelf oplost, en de host vertaalt de padvelden automatisch. Uitgeschakeld herstelt het oorspronkelijke dsh-gedrag (Windows-paden voor bestandstools). Bash is altijd Git Bash zolang de plugin is geïnstalleerd; deze schakelaar bepaalt alleen het paddialect tussen de tools.",
869
+ "sec.mode": "Modus",
859
870
  "sec.inline": "Inline tools",
860
871
  "sec.executor": "Executor",
861
872
  "sec.peer": "Plug-in-integraties",
@@ -917,8 +928,8 @@ window.__ModuleLoader__.load({
917
928
  "tools.updating": "Bijwerken…",
918
929
  "variant.label": "De vier «· Git Bash»-varianten",
919
930
  "variant.hint": "Standaard uit: de vier OFFICIËLE presets krijgen Git Bash via de inline-toolpatch en de lijst blijft officieel. Aan: registreert de vier varianten en stopt het patchen van de officiële presets — sluit elkaar uit. Een sessie die aan een variant-id vastzit moet na een upgrade opnieuw kiezen. Geldt voor nieuwe sessies.",
920
- "pwsh.label": "PowerShell 7-hulpmiddel (gitbash_pwsh)",
921
- "pwsh.hint": "Standaard aan: het pwsh-hulpmiddel van de host draait hier echt Git Bash (een leugenaam) en wordt automatisch geweigerd; deze schakelaar publiceert in plaats daarvan een ECHT gitbash_pwsh via de geïnstalleerde PowerShell 7 voor Windows-natief werk (register/services/WMI), alleen met volledige rechten. Nooit gepubliceerd zonder pwsh 7. Geef bash de voorkeur voor alles wat bash kan.",
931
+ "pwsh.label": "PowerShell 7-hulpmiddel (pwsh7)",
932
+ "pwsh.hint": "Standaard uit: ingeschakeld biedt deze plugin een ECHT pwsh7-hulpmiddel via de op het systeem geïnstalleerde PowerShell 7 voor Windows-natief werk (register/services/WMI), alleen sessies met volledige rechten. Vereist geïnstalleerde PowerShell 7 (https://aka.ms/powershell) — zonder verschijnt het hulpmiddel nooit. Het pwsh-hulpmiddel van de host draait hier feitelijk Git Bash (een misleidende naam) en wordt ongeacht deze schakelaar geweigerd — voer opdrachten uit via het bash-hulpmiddel.",
922
933
  "fctx.label": "FastCtx-bestandshulpmiddelen (gb_*)",
923
934
  "fctx.hint": "Standaard aan: publiceert gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: gelezen in batches met tokenbudget, coderingsdetectie). AANVULLINGEN op read/grep/glob/edit — de officiële hulpmiddelen houden de bestandssandbox en blijven de standaard. Trekt zich automatisch terug wanneer dsh-ops is geïnstalleerd.",
924
935
  },
@@ -933,6 +944,7 @@ window.__ModuleLoader__.load({
933
944
  "switch.off": "Wyłącz",
934
945
  "error": "zapis nie powiódł się",
935
946
  "hint": "Po włączeniu: wszystkie narzędzia (polecenia bash i workdir, argumenty ścieżek w read/write/edit/read_image/glob/grep i w present) używają ścieżek POSIX od korzenia dysku MSYS (/c/Users/...); natywne nawyki basha — ~ dla katalogu domowego, /tmp, /dev/null, /usr — działają w każdym narzędziu dokładnie tak, jak rozwiązuje je sam bash, a host automatycznie tłumaczy pola ścieżek. Wyłączenie przywraca natywne zachowanie dsh (ścieżki Windows dla narzędzi plikowych). Bash jest zawsze Git Bash, dopóki wtyczka jest zainstalowana; ten przełącznik reguluje wyłącznie dialekt ścieżek między narzędziami.",
947
+ "sec.mode": "Tryb",
936
948
  "sec.inline": "Narzędzia wbudowane",
937
949
  "sec.executor": "Egzekutor",
938
950
  "sec.peer": "Integracje wtyczek",
@@ -994,8 +1006,8 @@ window.__ModuleLoader__.load({
994
1006
  "tools.updating": "Aktualizowanie…",
995
1007
  "variant.label": "Cztery warianty «· Git Bash»",
996
1008
  "variant.hint": "Domyślnie wyłączone: cztery OFICJALNE presety dostają Git Bash przez inline-owy patch narzędzi, a lista pozostaje oficjalna. Włączenie rejestruje cztery warianty i zatrzymuje patchowanie oficjalnych presetów — opcje wykluczają się. Sesja przypięta do id wariantu musi zostać wybrana ponownie po aktualizacji. Dotyczy nowych sesji.",
997
- "pwsh.label": "Narzędzie PowerShell 7 (gitbash_pwsh)",
998
- "pwsh.hint": "Domyślnie włączone: narzędzie pwsh hosta uruchamia tutaj naprawdę Git Bash (okłamująca nazwa) i jest automatycznie odrzucane; ten przełącznik publikuje w zamian PRAWDZIWE gitbash_pwsh przez zainstalowany PowerShell 7 do natywnej pracy Windows (rejestr/usługi/WMI), tylko sesje z pełnymi uprawnieniami. Nigdy bez pwsh 7 na maszynie. Preferuj bash do wszystkiego, co bash potrafi.",
1009
+ "pwsh.label": "Narzędzie PowerShell 7 (pwsh7)",
1010
+ "pwsh.hint": "Domyślnie wyłączone: po włączeniu ta wtyczka udostępnia PRAWDZIWE narzędzie pwsh7 przez zainstalowany w systemie PowerShell 7 do natywnej pracy w Windows (rejestr/usługi/WMI), tylko sesje z pełnymi uprawnieniami. Wymaga zainstalowanego PowerShell 7 (https://aka.ms/powershell) — bez niego narzędzie nigdy się nie pojawi. Narzędzie pwsh hosta faktycznie uruchamia Git Bash na tej maszynie (myląca nazwa) i jest odrzucane niezależnie od tego przełącznika — polecenia wykonuj przez narzędzie bash.",
999
1011
  "fctx.label": "Narzędzia plików FastCtx (gb_*)",
1000
1012
  "fctx.hint": "Domyślnie włączone: publikuje gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: odczyty wsadowe z budżetem tokenów, wykrywanie kodowania). DODATKI do oficjalnych read/grep/glob/edit — oficjalne narzędzia zachowują sandbox plików i pozostają domyślne. Wycofuje się automatycznie, gdy zainstalowano dsh-ops.",
1001
1013
  },
@@ -1010,6 +1022,7 @@ window.__ModuleLoader__.load({
1010
1022
  "switch.off": "Desativar",
1011
1023
  "error": "falha ao gravar",
1012
1024
  "hint": "Ativada: todas as ferramentas (comandos bash e workdir, argumentos de caminho de read/write/edit/read_image/glob/grep e de present) usam caminhos POSIX a partir da raiz da unidade MSYS (/c/Users/...); os hábitos nativos do bash — ~ para a pasta pessoal, /tmp, /dev/null, /usr — funcionam em cada ferramenta exatamente como o próprio bash os resolve, e o host traduz os campos de caminho automaticamente. Desativada restaura o comportamento nativo do dsh (caminhos Windows para as ferramentas de arquivo). O bash é sempre Git Bash enquanto o plugin estiver instalado; este interruptor rege apenas o dialeto de caminhos entre ferramentas.",
1025
+ "sec.mode": "Modo",
1013
1026
  "sec.inline": "Ferramentas inline",
1014
1027
  "sec.executor": "Executor",
1015
1028
  "sec.peer": "Integrações de plugins",
@@ -1071,8 +1084,8 @@ window.__ModuleLoader__.load({
1071
1084
  "tools.updating": "A atualizar…",
1072
1085
  "variant.label": "As quatro variantes «· Git Bash»",
1073
1086
  "variant.hint": "Desativado por padrão: os quatro presets OFICIAIS recebem Git Bash pelo patch de ferramentas em linha e a lista permanece oficial. Ativado: registra as quatro variantes e deixa de corrigir os presets oficiais — mutuamente exclusivos. Uma sessão presa a um id de variante precisa ser reescolhida após a atualização. Vale para novas sessões.",
1074
- "pwsh.label": "Ferramenta PowerShell 7 (gitbash_pwsh)",
1075
- "pwsh.hint": "Ativado por padrão: a ferramenta pwsh do host realmente executa Git Bash nesta máquina (um nome mentiroso) e é negada automaticamente; este interruptor publica um gitbash_pwsh VERDADEIRO via PowerShell 7 instalado no sistema para trabalho nativo do Windows (registro/serviços/WMI), apenas em sessões de acesso total. Nunca publicado sem pwsh 7. Prefira bash para tudo o que o bash faz.",
1087
+ "pwsh.label": "Ferramenta PowerShell 7 (pwsh7)",
1088
+ "pwsh.hint": "Desativado por padrão: ao ativar, este plugin fornece uma ferramenta pwsh7 REAL via o PowerShell 7 instalado no sistema para trabalho nativo do Windows (registro/serviços/WMI), apenas sessões com acesso total. Requer o PowerShell 7 instalado (https://aka.ms/powershell) — sem ele a ferramenta nunca aparece. A ferramenta pwsh do host na verdade executa o Git Bash nesta máquina (nome enganoso) e é negada independentemente deste interruptor — encaminhe comandos pela ferramenta bash.",
1076
1089
  "fctx.label": "Ferramentas de arquivos FastCtx (gb_*)",
1077
1090
  "fctx.hint": "Ativado por padrão: publica gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: leituras em lote com orçamento de tokens, detecção de codificação). ADIÇÕES aos read/grep/glob/edit oficiais — os oficiais mantêm o sandbox de arquivos e continuam o padrão. Recua automaticamente quando o dsh-ops está instalado.",
1078
1091
  },
@@ -1087,6 +1100,7 @@ window.__ModuleLoader__.load({
1087
1100
  "switch.off": "Выключить",
1088
1101
  "error": "не удалось записать",
1089
1102
  "hint": "Включено: все инструменты (команды bash и workdir, аргументы путей read/write/edit/read_image/glob/grep и present) используют POSIX-пути от корня диска MSYS (/c/Users/...); собственные привычки bash — ~ для домашнего каталога, /tmp, /dev/null, /usr — работают в каждом инструменте ровно так, как их разрешает сам bash, а хост автоматически преобразует поля путей. Выключение возвращает исходное поведение dsh (пути Windows для файловых инструментов). Пока плагин установлен, bash всегда остаётся Git Bash; этот переключатель управляет только диалектом путей между инструментами.",
1103
+ "sec.mode": "Режим",
1090
1104
  "sec.inline": "Встроенные инструменты",
1091
1105
  "sec.executor": "Исполнитель",
1092
1106
  "sec.peer": "Интеграции плагинов",
@@ -1148,8 +1162,8 @@ window.__ModuleLoader__.load({
1148
1162
  "tools.updating": "Обновление…",
1149
1163
  "variant.label": "Четыре варианта «· Git Bash»",
1150
1164
  "variant.hint": "По умолчанию выключено: четыре ОФИЦИАЛЬНЫХ пресета получают Git Bash через встроенный патч инструментов, список остаётся официальным. Включено — регистрирует четыре варианта и прекращает патчить официальные пресеты (взаимоисключающе). Сессия, привязанная к id варианта, после обновления должна выбрать пресет заново. Действует для новых сессий.",
1151
- "pwsh.label": "Инструмент PowerShell 7 (gitbash_pwsh)",
1152
- "pwsh.hint": "По умолчанию включено: инструмент pwsh хоста здесь на самом деле запускает Git Bash (лживое имя) и автоматически отклоняется; этот переключатель вместо него публикует НАСТОЯЩИЙ gitbash_pwsh через установленный PowerShell 7 для нативной работы Windows (реестр/службы/WMI), только в сессиях с полным доступом. Без pwsh 7 не публикуется. Для всего, что умеет bash, предпочитайте bash.",
1165
+ "pwsh.label": "Инструмент PowerShell 7 (pwsh7)",
1166
+ "pwsh.hint": "По умолчанию выключено: при включении плагин предоставляет НАСТОЯЩИЙ инструмент pwsh7 через установленный в системе PowerShell 7 для нативной работы Windows (реестр/службы/WMI), только сессии с полным доступом. Требуется установленный PowerShell 7 (https://aka.ms/powershell) — без него инструмент не появится. Штатный pwsh-инструмент хоста на этой машине фактически запускает Git Bash (лживое имя) и отклоняется независимо от этого переключателя — команды выполняйте через инструмент bash.",
1153
1167
  "fctx.label": "Файловые инструменты FastCtx (gb_*)",
1154
1168
  "fctx.hint": "По умолчанию включено: публикует gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: пакетные чтения с бюджетом токенов, определение кодировки). ДОПОЛНЕНИЯ к официальным read/grep/glob/edit — официальные сохраняют файловую песочницу и остаются выбором по умолчанию. Автоматически отступает при установленном dsh-ops.",
1155
1169
  },
@@ -1164,6 +1178,7 @@ window.__ModuleLoader__.load({
1164
1178
  "switch.off": "Inaktivera",
1165
1179
  "error": "skrivning misslyckades",
1166
1180
  "hint": "Aktiverad: alla verktyg (bash-kommandon och workdir, sökvägsargument för read/write/edit/read_image/glob/grep och present) använder POSIX-sökvägar från MSYS-enhetsroten (/c/Users/...); bash egna vanor — ~ för hemkatalogen, /tmp, /dev/null, /usr — fungerar i varje verktyg exakt som bash själv löser dem, och värden översätter sökvägsfälten automatiskt. Inaktiverad återställer dsh:s ursprungliga beteende (Windows-sökvägar för filverktygen). Bash är alltid Git Bash så länge insticksprogrammet är installerat; den här växeln styr bara sökvägsdialekten mellan verktygen.",
1181
+ "sec.mode": "Läge",
1167
1182
  "sec.inline": "Inline-verktyg",
1168
1183
  "sec.executor": "Exekutor",
1169
1184
  "sec.peer": "Plugin-integrationer",
@@ -1225,8 +1240,8 @@ window.__ModuleLoader__.load({
1225
1240
  "tools.updating": "Uppdaterar…",
1226
1241
  "variant.label": "De fyra «· Git Bash»-varianterna",
1227
1242
  "variant.hint": "Av som standard: de fyra OFFICIELLA presetten får Git Bash via inline-verktygspatchen och listan förblir officiell. På: registrerar de fyra varianterna och slutar patcha de officiella presetten — ömsesidigt uteslutande. En session fastnåld på ett variant-id måste väljas om efter uppgradering. Gäller nya sessioner.",
1228
- "pwsh.label": "PowerShell 7-verktyg (gitbash_pwsh)",
1229
- "pwsh.hint": "På som standard: hostens pwsh-verktyg kör här i verkligheten Git Bash (ett lögnaktigt namn) och nekas automatiskt; denna switch publicerar i stället ett ÄKTA gitbash_pwsh via det installerade PowerShell 7 för Windows-inhemskt arbete (register/tjänster/WMI), endast sessioner med full behörighet. Publiceras aldrig utan pwsh 7. Föredra bash för allt bash kan.",
1243
+ "pwsh.label": "PowerShell 7-verktyg (pwsh7)",
1244
+ "pwsh.hint": "Av som standard: när den är på tillhandahåller denna plugin ett ÄKTA pwsh7-verktyg via systemets installerade PowerShell 7 för Windows-inbyggt arbete (register/tjänster/WMI), endast sessioner med full behörighet. Kräver installerad PowerShell 7 (https://aka.ms/powershell) — utan den visas verktyget aldrig. Hostens pwsh-verktyg kör i själva verket Git Bash på denna maskin (ett vilseledande namn) och nekas oavsett denna växel — kör kommandon via bash-verktyget.",
1230
1245
  "fctx.label": "FastCtx-filverktyg (gb_*)",
1231
1246
  "fctx.hint": "På som standard: publicerar gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: batchläsningar med tokenbudget, kodningsdetektering). TILLÄGG till de officiella read/grep/glob/edit — de officiella behåller filsandlådan och förblir standard. Drar sig automatiskt tillbaka när dsh-ops är installerat.",
1232
1247
  },
@@ -1241,6 +1256,7 @@ window.__ModuleLoader__.load({
1241
1256
  "switch.off": "ปิดใช้งาน",
1242
1257
  "error": "เขียนไม่สำเร็จ",
1243
1258
  "hint": "เมื่อเปิดใช้งาน: เครื่องมือทั้งหมด (คำสั่ง bash และ workdir รวมถึงอาร์กิวเมนต์พาธของ read/write/edit/read_image/glob/grep และ present) ใช้พาธ POSIX จากรากไดรฟ์ของ MSYS (/c/Users/...); พฤติกรรมดั้งเดิมของ bash — ~ สำหรับโฮม, /tmp, /dev/null, /usr — ทำงานในทุกเครื่องมือเหมือนที่ bash แก้เองพอดี และโฮสต์แปลฟิลด์พาธให้อัตโนมัติ เมื่อปิดใช้งานจะกลับสู่พฤติกรรมดั้งเดิมของ dsh (เครื่องมือจัดการไฟล์ใช้พาธ Windows) bash เป็น Git Bash เสมอเมื่อติดตั้งปลั๊กอินนี้ สวิตช์นี้ควบคุมเฉพาะรูปแบบพาธระหว่างเครื่องมือเท่านั้น",
1259
+ "sec.mode": "โหมด",
1244
1260
  "sec.inline": "เครื่องมือแบบ inline",
1245
1261
  "sec.executor": "ตัวรัน",
1246
1262
  "sec.peer": "การเชื่อมต่อปลั๊กอิน",
@@ -1302,8 +1318,8 @@ window.__ModuleLoader__.load({
1302
1318
  "tools.updating": "กำลังอัปเกรด…",
1303
1319
  "variant.label": "พรีเซ็ตย่อย «· Git Bash» ทั้งสี่",
1304
1320
  "variant.hint": "ปิดตามค่าเริ่มต้น: พรีเซ็ตทางการทั้งสี่ได้ Git Bash ผ่านแพตช์เครื่องมือในตัว และรายการยังเป็นทางการ เปิด: ลงทะเบียนสี่ตัวย่อยและหยุดแพตช์พรีเซ็ตทางการ — ทั้งสองไม่ใช้ร่วมกันได้ เซสชันที่ตรึงกับ id ย่อยต้องเลือกใหม่หลังอัปเกรด ใช้กับเซสชันใหม่",
1305
- "pwsh.label": "เครื่องมือ PowerShell 7 (gitbash_pwsh)",
1306
- "pwsh.hint": "เปิดตามค่าเริ่มต้น: เครื่องมือ pwsh ของโฮสต์บนเครื่องนี้รัน Git Bash จริง ๆ (ชื่อหลอก) และถูกปฏิเสธอัตโนมัติ; สวิตช์นี้เผยแพร่ gitbash_pwsh ตัวจริงผ่าน PowerShell 7 ที่ติดตั้งในระบบสำหรับงานเนทีฟของ Windows (รีจิสทรี/เซอร์วิส/WMI) เฉพาะเซสชันสิทธิ์เต็ม ไม่เผยแพร่หากไม่มี pwsh 7 ให้ใช้ bash เป็นอันดับแรกกับทุกอย่างที่ bash ทำได้",
1321
+ "pwsh.label": "เครื่องมือ PowerShell 7 (pwsh7)",
1322
+ "pwsh.hint": "ปิดอยู่โดยค่าเริ่มต้น: เมื่อเปิด ปลั๊กอินนี้จะให้เครื่องมือ pwsh7 จริงผ่าน PowerShell 7 ที่ติดตั้งในระบบสำหรับงาน Windows แบบเนทีฟ (registry/services/WMI) เฉพาะเซสชันสิทธิ์เต็มเท่านั้น ต้องติดตั้ง PowerShell 7 (https://aka.ms/powershell) — หากไม่มี เครื่องมือจะไม่ปรากฏ เครื่องมือ pwsh ของโฮสต์ที่จริงรัน Git Bash บนเครื่องนี้ (ชื่อหลอก) และจะถูกปฏิเสธไม่ว่าสวิตช์นี้ — ส่งคำสั่งผ่านเครื่องมือ bash",
1307
1323
  "fctx.label": "เครื่องมือไฟล์ FastCtx (gb_*)",
1308
1324
  "fctx.hint": "เปิดตามค่าเริ่มต้น: เผยแพร่ gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: อ่านเป็นชุดพร้อมงบ token, ตรวจจับ encoding) เป็นส่วนเสริมของ read/grep/glob/edit ทางการ — เครื่องมือทางการยังมี sandbox ไฟล์และเป็นค่าเริ่มต้น ถอยอัตโนมัติเมื่อติดตั้ง dsh-ops",
1309
1325
  },
@@ -1318,6 +1334,7 @@ window.__ModuleLoader__.load({
1318
1334
  "switch.off": "Devre dışı bırak",
1319
1335
  "error": "yazma başarısız",
1320
1336
  "hint": "Etkinleştirildiğinde: tüm araçlar (bash komutları ve workdir ile read/write/edit/read_image/glob/grep ve present yol bağımsız değişkenleri) MSYS sürücü kökünden POSIX yolları (/c/Users/...) kullanır; bash'e özgü alışkanlıklar — ev için ~, /tmp, /dev/null, /usr — her araçta tam bash'in kendisinin çözdüğü gibi çalışır ve ana süreç yol alanlarını otomatik olarak çevirir. Devre dışı bırakıldığında dsh yerel davranışına döner (dosya araçları için Windows yolları). Eklenti kurulu olduğu sürece bash her zaman Git Bash olarak kalır; bu anahtar yalnızca araçlar arası yol lehçesini yönetir.",
1337
+ "sec.mode": "Mod",
1321
1338
  "sec.inline": "Satır içi araçlar",
1322
1339
  "sec.executor": "Yürütücü",
1323
1340
  "sec.peer": "Eklenti entegrasyonları",
@@ -1379,8 +1396,8 @@ window.__ModuleLoader__.load({
1379
1396
  "tools.updating": "Güncelleniyor…",
1380
1397
  "variant.label": "Dört «· Git Bash» varyantı",
1381
1398
  "variant.hint": "Varsayılan olarak kapalı: dört RESMİ preset, satır içi araç yamasıyla Git Bash alır; liste resmi kalır. Açık: dört varyantı kaydeder ve resmi presetleri yamalamayı bırakır — ikisi birbirini dışlar. Bir varyant kimliğine bağlı oturum yükseltmeden sonra yeniden seçilmelidir. Yeni oturumlar için geçerlidir.",
1382
- "pwsh.label": "PowerShell 7 aracı (gitbash_pwsh)",
1383
- "pwsh.hint": "Varsayılan açık: ana makinenin pwsh aracı bu makinede aslında Git Bash çalıştırır (yalancı bir ad) ve otomatik olarak reddedilir; bu anahtar bunun yerine Windows-yerel işler (kayıt defteri/hizmetler/WMI) için sistemde kurulu PowerShell 7 üzerinden GERÇEK gitbash_pwsh yayımlar, yalnızca tam yetkili oturumlarda. pwsh 7 yoksa asla yayımlanmaz. bash’in yapabildiği her şey için bash’i tercih edin.",
1399
+ "pwsh.label": "PowerShell 7 aracı (pwsh7)",
1400
+ "pwsh.hint": "Varsayılan olarak kapalı: açıkken bu eklenti, sistemde kurulu PowerShell 7 üzerinden GERÇEK bir pwsh7 aracı sağlar (Windows-yerel işler: kayıt defteri/hizmetler/WMI), yalnızca tam yetkili oturumlar. PowerShell 7 kurulu olmalıdır (https://aka.ms/powershell) — yoksa araç asla görünmez. Ana makinenin pwsh aracı bu makinede aslında Git Bash çalıştırır (yanıltıcı ad) ve bu anahtar ne olursa olsun reddedilir — komutları bash aracıyla çalıştırın.",
1384
1401
  "fctx.label": "FastCtx dosya araçları (gb_*)",
1385
1402
  "fctx.hint": "Varsayılan açık: gb_inspect_local_file / gb_grep / gb_glob / gb_replace yayımlar (Rust: token bütçeli toplu okumalar, kodlama algılama). Resmî read/grep/glob/edit’e EKLER — resmî araçlar dosya kum havuzunu korur ve varsayılan kalır. dsh-ops kurulu olduğunda otomatik olarak geri çekilir.",
1386
1403
  },
@@ -1395,6 +1412,7 @@ window.__ModuleLoader__.load({
1395
1412
  "switch.off": "Tắt",
1396
1413
  "error": "ghi thất bại",
1397
1414
  "hint": "Khi bật: mọi công cụ (lệnh bash và workdir, tham số đường dẫn của read/write/edit/read_image/glob/grep và present) dùng đường dẫn POSIX từ gốc ổ đĩa MSYS (/c/Users/...); thói quen gốc của bash — ~ cho thư mục home, /tmp, /dev/null, /usr — hoạt động trong mọi công cụ đúng như chính bash giải quyết chúng, và máy chủ tự động chuyển đổi trường đường dẫn. Khi tắt, hành vi gốc của dsh được khôi phục (công cụ tệp dùng đường dẫn Windows). bash luôn là Git Bash khi plugin được cài đặt; công tắc này chỉ điều khiển phương ngữ đường dẫn giữa các công cụ.",
1415
+ "sec.mode": "Chế độ",
1398
1416
  "sec.inline": "Công cụ nội tuyến",
1399
1417
  "sec.executor": "Trình thực thi",
1400
1418
  "sec.peer": "Tích hợp plugin",
@@ -1456,8 +1474,8 @@ window.__ModuleLoader__.load({
1456
1474
  "tools.updating": "Đang nâng cấp…",
1457
1475
  "variant.label": "Bốn biến thể «· Git Bash»",
1458
1476
  "variant.hint": "Mặc định tắt: bốn preset CHÍNH THỨC nhận Git Bash qua bản vá công cụ nội tuyến và danh sách vẫn chính thức. Bật: đăng ký bốn biến thể và ngừng vá các preset chính thức — hai bên loại trừ nhau. Phiên đang ghim vào id biến thể cần chọn lại sau nâng cấp. Áp dụng cho phiên mới.",
1459
- "pwsh.label": "Công cụ PowerShell 7 (gitbash_pwsh)",
1460
- "pwsh.hint": "Mặc định bật: công cụ pwsh của host trên máy này thực chất chạy Git Bash (tên nói dối) và bị từ chối tự động; công tắc này thay vào đó phát hành gitbash_pwsh THẬT qua PowerShell 7 cài trong hệ thống cho công việc gốc Windows (registry/dịch vụ/WMI), chỉ phiên đầy đủ quyền. Không bao giờ phát hành khi thiếu pwsh 7. Ưu tiên bash cho mọi thứ bash làm được.",
1477
+ "pwsh.label": "Công cụ PowerShell 7 (pwsh7)",
1478
+ "pwsh.hint": "Mặc định tắt: khi bật, plugin này cung cấp công cụ pwsh7 THỰC qua PowerShell 7 đã cài trong hệ thống cho công việc Windows gốc (registry/services/WMI), chỉ dành cho phiên đầy đủ quyền. Cần PowerShell 7 đã cài (https://aka.ms/powershell) — không có thì công cụ không bao giờ xuất hiện. Công cụ pwsh của host trên máy này thực chất chạy Git Bash (tên gây hiểu lầm) và luôn bị từ chối bất kể công tắc này — chạy lệnh qua công cụ bash.",
1461
1479
  "fctx.label": "Công cụ tệp FastCtx (gb_*)",
1462
1480
  "fctx.hint": "Mặc định bật: phát hành gb_inspect_local_file / gb_grep / gb_glob / gb_replace (Rust: đọc theo lô có ngân sách token, phát hiện mã hóa). BỔ SUNG cho read/grep/glob/edit chính thức — công cụ chính thức giữ sandbox tệp và vẫn là mặc định. Tự rút khi dsh-ops được cài.",
1463
1481
  },
@@ -1472,6 +1490,7 @@ window.__ModuleLoader__.load({
1472
1490
  "switch.off": "停用",
1473
1491
  "error": "寫入失敗",
1474
1492
  "hint": "啟用後:所有工具(bash 指令同 workdir、read/write/edit/read_image/glob/grep 同 present 嘅路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——喺所有工具一樣有效(同 Git Bash 掛載表一致),路徑參數由宿主自動翻譯,模型無感。停用後回復 dsh 原生行為(檔案工具用 Windows 路徑)。bash 永遠係 Git Bash,唔受呢個開關影響。",
1493
+ "sec.mode": "模式",
1475
1494
  "sec.inline": "行內工具",
1476
1495
  "sec.executor": "執行器",
1477
1496
  "sec.peer": "外掛聯動",
@@ -1533,8 +1552,8 @@ window.__ModuleLoader__.load({
1533
1552
  "tools.updating": "升級緊…",
1534
1553
  "variant.label": "四個「·Git Bash」變體模式",
1535
1554
  "variant.hint": "預設關閉:官方四個模式經行內工具補位直接獲得 Git Bash,模式列表保持官方原樣。開啟後註冊四個變體並停用官方模式的工具補位——兩者互斥。釘在變體 id 的舊會話在關閉升級後需重新選擇模式;變更對新會話生效。",
1536
- "pwsh.label": "PowerShell 7 工具(gitbash_pwsh)",
1537
- "pwsh.hint": "預設開啟:宿主 pwsh 工具在本機實際執行 Git Bash(名字是假的),會被自動遮蔽;本開關另發一個真正的 gitbash_pwsh,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限會話可用;機器沒裝 pwsh 7 時不發布。bash 能做的事一律優先 bash。",
1555
+ "pwsh.label": "PowerShell 7 工具(pwsh7)",
1556
+ "pwsh.hint": "預設關閉:開啟後本外掛在會話裡提供真正的 pwsh7 工具,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限會話可用。前提:機器上已安裝 PowerShell 7(https://aka.ms/powershell),沒裝則工具不會出現。宿主自帶的 pwsh 工具在本機實際執行 Git Bash(名字是假的),無論開關一律拒絕——命令一律走 bash 工具。",
1538
1557
  "fctx.label": "FastCtx 檔案工具(gb_*)",
1539
1558
  "fctx.hint": "預設開啟:發布 gb_inspect_local_file / gb_grep / gb_glob / gb_replace(Rust 實現:批量讀取帶 token 預算、編碼探測)。它們是官方 read/grep/glob/edit 的補充——官方工具接檔案沙箱,仍是預設推薦;偵測到 dsh-ops 時本組自動讓位。",
1540
1559
  },
@@ -1549,6 +1568,7 @@ window.__ModuleLoader__.load({
1549
1568
  "switch.off": "停用",
1550
1569
  "error": "寫入失敗",
1551
1570
  "hint": "啟用後:所有工具(bash 指令同 workdir、read/write/edit/read_image/glob/grep 同 present 嘅路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——喺所有工具一樣有效(同 Git Bash 掛載表一致),路徑參數由宿主自動翻譯,模型無感。停用後回復 dsh 原生行為(檔案工具用 Windows 路徑)。bash 永遠係 Git Bash,唔受呢個開關影響。",
1571
+ "sec.mode": "模式",
1552
1572
  "sec.inline": "行內工具",
1553
1573
  "sec.executor": "執行器",
1554
1574
  "sec.peer": "外掛聯動",
@@ -1610,8 +1630,8 @@ window.__ModuleLoader__.load({
1610
1630
  "tools.updating": "升級緊…",
1611
1631
  "variant.label": "四個「·Git Bash」變體模式",
1612
1632
  "variant.hint": "預設關閉:官方四個模式經行內工具補位直接獲得 Git Bash,模式列表保持官方原樣。開啟後註冊四個變體並停用官方模式的工具補位——兩者互斥。釘在變體 id 的舊會話在關閉升級後需重新選擇模式;變更對新會話生效。",
1613
- "pwsh.label": "PowerShell 7 工具(gitbash_pwsh)",
1614
- "pwsh.hint": "預設開啟:宿主 pwsh 工具在本機實際執行 Git Bash(名字是假的),會被自動遮蔽;本開關另發一個真正的 gitbash_pwsh,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限會話可用;機器沒裝 pwsh 7 時不發布。bash 能做的事一律優先 bash。",
1633
+ "pwsh.label": "PowerShell 7 工具(pwsh7)",
1634
+ "pwsh.hint": "預設關閉:開啟後本外掛在會話裡提供真正的 pwsh7 工具,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限會話可用。前提:機器上已安裝 PowerShell 7(https://aka.ms/powershell),沒裝則工具不會出現。宿主自帶的 pwsh 工具在本機實際執行 Git Bash(名字是假的),無論開關一律拒絕——命令一律走 bash 工具。",
1615
1635
  "fctx.label": "FastCtx 檔案工具(gb_*)",
1616
1636
  "fctx.hint": "預設開啟:發布 gb_inspect_local_file / gb_grep / gb_glob / gb_replace(Rust 實現:批量讀取帶 token 預算、編碼探測)。它們是官方 read/grep/glob/edit 的補充——官方工具接檔案沙箱,仍是預設推薦;偵測到 dsh-ops 時本組自動讓位。",
1617
1637
  },
@@ -1626,6 +1646,7 @@ window.__ModuleLoader__.load({
1626
1646
  "switch.off": "停用",
1627
1647
  "error": "寫入失敗",
1628
1648
  "hint": "啟用後:所有工具(bash 指令與 workdir,以及 read/write/edit/read_image/glob/grep 與 present 的路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——在所有工具同樣有效(與 Git Bash 掛載表一致),路徑參數由宿主自動轉譯,模型無感。停用後恢復 dsh 原生行為(檔案工具使用 Windows 路徑)。bash 一律是 Git Bash,不受此開關影響。",
1649
+ "sec.mode": "模式",
1629
1650
  "sec.inline": "行內工具",
1630
1651
  "sec.executor": "執行器",
1631
1652
  "sec.peer": "外掛聯動",
@@ -1687,8 +1708,8 @@ window.__ModuleLoader__.load({
1687
1708
  "tools.updating": "更新中…",
1688
1709
  "variant.label": "四個「·Git Bash」變體模式",
1689
1710
  "variant.hint": "預設關閉:官方四個模式經行內工具補位直接獲得 Git Bash,模式列表保持官方原樣。開啟後註冊四個變體並停用官方模式的工具補位——兩者互斥。釘在變體 id 的舊會話在關閉升級後需重新選擇模式;變更對新會話生效。",
1690
- "pwsh.label": "PowerShell 7 工具(gitbash_pwsh)",
1691
- "pwsh.hint": "預設開啟:宿主 pwsh 工具在本機實際執行 Git Bash(名字是假的),會被自動遮蔽;本開關另發一個真正的 gitbash_pwsh,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限會話可用;機器沒裝 pwsh 7 時不發布。bash 能做的事一律優先 bash。",
1711
+ "pwsh.label": "PowerShell 7 工具(pwsh7)",
1712
+ "pwsh.hint": "預設關閉:開啟後本外掛在工作階段裡提供真正的 pwsh7 工具,用系統安裝的 PowerShell 7 執行 Windows 原生操作(登錄檔/服務/WMI),僅完全權限工作階段可用。前提:機器上已安裝 PowerShell 7(https://aka.ms/powershell),沒裝則工具不會出現。宿主自帶的 pwsh 工具在本機實際執行 Git Bash(名字是假的),無論開關一律拒絕——命令一律走 bash 工具。",
1692
1713
  "fctx.label": "FastCtx 檔案工具(gb_*)",
1693
1714
  "fctx.hint": "預設開啟:發布 gb_inspect_local_file / gb_grep / gb_glob / gb_replace(Rust 實現:批量讀取帶 token 預算、編碼探測)。它們是官方 read/grep/glob/edit 的補充——官方工具接檔案沙箱,仍是預設推薦;偵測到 dsh-ops 時本組自動讓位。",
1694
1715
  },
@@ -1782,6 +1803,10 @@ window.__ModuleLoader__.load({
1782
1803
  ".gb-error{margin:0;font-size:12px;color:var(--dsw-alias-status-danger, #e5484d)}",
1783
1804
  ".gb-card{-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,blur(12px) saturate(1.15));backdrop-filter:var(--dsh-any-blur-card-panels,blur(12px) saturate(1.15))}",
1784
1805
  ".gb-section+.gb-section{border-top:1px solid var(--dsw-alias-border-l2)}",
1806
+ /* v0.38.0 foldable sections: each theme is its own bordered card —
1807
+ seven header rows at a glance, switches only visible on expand. */
1808
+ ".gb-fold{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;padding:4px 12px 12px;background:var(--dsw-alias-bg-layer-1,transparent)}",
1809
+ ".gb-fold .gb-stack{padding-top:10px}",
1785
1810
  /* Missing-Git-Bash popup (v0.28.0): a root-level modal, because the
1786
1811
  user may never be on the settings page when their shell dies. */
1787
1812
  ".gb-modalBackdrop{position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45)}",
@@ -2009,6 +2034,23 @@ window.__ModuleLoader__.load({
2009
2034
  } catch (e) { /* keep empty draft */ }
2010
2035
  }, []);
2011
2036
 
2037
+ /* v0.38.0: the card's sections are FOLDERS. All seven stay collapsed
2038
+ by default — the user scans seven labelled header rows, expands the
2039
+ one theme they recognise, and finds the switch inside it (user
2040
+ request verbatim: "内部可以折叠,这样我找的时候就只需要去展开我大概
2041
+ 知道的某个设置主题"). State must sit before the early return. */
2042
+ var foldsState = useState({});
2043
+ var folds = foldsState[0];
2044
+ var setFolds = foldsState[1];
2045
+ function toggleFold(key) {
2046
+ setFolds(function (prev) {
2047
+ var next = {};
2048
+ for (var k in prev) next[k] = prev[k];
2049
+ next[key] = !prev[key];
2050
+ return next;
2051
+ });
2052
+ }
2053
+
2012
2054
  var scope = props.scope;
2013
2055
 
2014
2056
  var snap = { status: "unavailable" };
@@ -2058,6 +2100,33 @@ window.__ModuleLoader__.load({
2058
2100
 
2059
2101
  var Chevron = icon("IconChevronDownOutline14");
2060
2102
 
2103
+ /* v0.38.0: one FOLDABLE section. The header row is the OFFICIAL
2104
+ `DisclosureRow` from the seed ui-primitives package (required at
2105
+ the top of this file, same seam as every icon). All sections stay
2106
+ collapsed by default — the user scans seven labelled header rows
2107
+ and expands the one theme they recognise. A stripped-down host
2108
+ without the export degrades to the static title+stack card. */
2109
+ var DisclosureRowComponent = icon("DisclosureRow");
2110
+ function fold(key, titleKey) {
2111
+ var body = [];
2112
+ for (var i = 1; i < arguments.length; i++) body.push(arguments[i]);
2113
+ if (!DisclosureRowComponent || typeof DisclosureRowComponent !== "function") {
2114
+ return E("div", { className: "gb-section" },
2115
+ E("div", { className: "gb-sectionTitle" }, t(titleKey)),
2116
+ E("div", { className: "gb-stack" }, body),
2117
+ );
2118
+ }
2119
+ return E(DisclosureRowComponent, {
2120
+ className: "gb-fold",
2121
+ icon: null,
2122
+ title: t(titleKey),
2123
+ open: folds[key] === true,
2124
+ expandable: true,
2125
+ expandOnRowClick: true,
2126
+ onToggle: function () { toggleFold(key); },
2127
+ }, E("div", { className: "gb-stack" }, body));
2128
+ }
2129
+
2061
2130
  // dsh 0.1.6-alpha.2: the Plugins page renders this card through the
2062
2131
  // `plugins.bundle.config` slot with view="page" — the page draws the
2063
2132
  // title itself; the collapsible shell only shows on the popup seat.
@@ -2074,9 +2143,7 @@ window.__ModuleLoader__.load({
2074
2143
  var eolOn = snap.value.gitAutocrlf !== false;
2075
2144
  var dedupe = snap.value.suppressPeerCordis === true;
2076
2145
 
2077
- var dialectSection = E("div", { className: "gb-section" },
2078
- E("div", { className: "gb-sectionTitle" }, t("sec.dialect")),
2079
- E("div", { className: "gb-stack" },
2146
+ var dialectSection = fold("sec.dialect",
2080
2147
  E("div", { className: "gb-row" },
2081
2148
  E("span", { className: "gb-rowLabel" }, t("state.label") + ":"),
2082
2149
  E("span", { className: "gb-rowValue" }, enabled ? t("state.on") : t("state.off")),
@@ -2131,7 +2198,6 @@ window.__ModuleLoader__.load({
2131
2198
  E("button", { type: "button", className: "gb-segBtn" + (!subagents ? " gb-segActive" : ""), onClick: function () { if (subagents) writeField("subagentDialect", false); } }, t("switch.off")),
2132
2199
  ),
2133
2200
  E("p", { className: "gb-hint" }, t("sub.hint")),
2134
- ),
2135
2201
  );
2136
2202
 
2137
2203
  /* ── executor section (v0.36.0 regroup) ───────────────────────────
@@ -2139,9 +2205,7 @@ window.__ModuleLoader__.load({
2139
2205
  the executor injects. Split out of the dialect section — users
2140
2206
  hunting "why is my diff all red" or pasting a bash path should
2141
2207
  not scroll through six translation switches to find it. */
2142
- var executorSection = E("div", { className: "gb-section" },
2143
- E("div", { className: "gb-sectionTitle" }, t("sec.executor")),
2144
- E("div", { className: "gb-stack" },
2208
+ var executorSection = fold("sec.executor",
2145
2209
  E("div", { className: "gb-row" },
2146
2210
  E("span", { className: "gb-rowLabel" }, t("eol.label") + ":"),
2147
2211
  E("span", { className: "gb-rowValue" }, eolOn ? t("state.on") : t("state.off")),
@@ -2166,12 +2230,9 @@ window.__ModuleLoader__.load({
2166
2230
  }, bashSaved ? t("bash.saved") : t("bash.save")),
2167
2231
  ),
2168
2232
  E("p", { className: "gb-hint" }, t("bash.hint")),
2169
- ),
2170
2233
  );
2171
2234
 
2172
- var terminalSection = E("div", { className: "gb-section" },
2173
- E("div", { className: "gb-sectionTitle" }, t("sec.terminal")),
2174
- E("div", { className: "gb-stack" },
2235
+ var terminalSection = fold("sec.terminal",
2175
2236
  E("div", { className: "gb-row" },
2176
2237
  E("span", { className: "gb-rowLabel" }, t("term.label") + ":"),
2177
2238
  E("span", { className: "gb-rowValue" }, winshell ? t("state.on") : t("state.off")),
@@ -2190,7 +2251,6 @@ window.__ModuleLoader__.load({
2190
2251
  E("button", { type: "button", className: "gb-segBtn" + (!adopt ? " gb-segActive" : ""), onClick: function () { if (adopt) writeField("adoptSidebar", false); } }, t("switch.off")),
2191
2252
  ),
2192
2253
  E("p", { className: "gb-hint" }, t("adopt.hint")),
2193
- ),
2194
2254
  );
2195
2255
 
2196
2256
  /* Peer-gated section: rendered only while dsh-ptc-cordis-preset serves
@@ -2201,9 +2261,7 @@ window.__ModuleLoader__.load({
2201
2261
  var pwshOn = snap.value.pwshTool !== false;
2202
2262
  var fctxOn = snap.value.fastctxTools !== false;
2203
2263
 
2204
- var modeSection = E("div", { className: "gb-section" },
2205
- E("div", { className: "gb-sectionTitle" }, t("variant.label")),
2206
- E("div", { className: "gb-stack" },
2264
+ var modeSection = fold("sec.mode",
2207
2265
  E("div", { className: "gb-row" },
2208
2266
  E("span", { className: "gb-rowLabel" }, t("variant.label") + ":"),
2209
2267
  E("span", { className: "gb-rowValue" }, variantOn ? t("state.on") : t("state.off")),
@@ -2213,12 +2271,9 @@ window.__ModuleLoader__.load({
2213
2271
  E("button", { type: "button", className: "gb-segBtn" + (!variantOn ? " gb-segActive" : ""), onClick: function () { if (variantOn) writeField("variantPresets", false); } }, t("switch.off")),
2214
2272
  ),
2215
2273
  E("p", { className: "gb-hint" }, t("variant.hint")),
2216
- ),
2217
2274
  );
2218
2275
 
2219
- var inlineSection = E("div", { className: "gb-section" },
2220
- E("div", { className: "gb-sectionTitle" }, t("sec.inline")),
2221
- E("div", { className: "gb-stack" },
2276
+ var inlineSection = fold("sec.inline",
2222
2277
  E("div", { className: "gb-row" },
2223
2278
  E("span", { className: "gb-rowLabel" }, t("pwsh.label") + ":"),
2224
2279
  E("span", { className: "gb-rowValue" }, pwshOn ? t("state.on") : t("state.off")),
@@ -2237,7 +2292,6 @@ window.__ModuleLoader__.load({
2237
2292
  E("button", { type: "button", className: "gb-segBtn" + (!fctxOn ? " gb-segActive" : ""), onClick: function () { if (fctxOn) writeField("fastctxTools", false); } }, t("switch.off")),
2238
2293
  ),
2239
2294
  E("p", { className: "gb-hint" }, t("fctx.hint")),
2240
- ),
2241
2295
  );
2242
2296
 
2243
2297
  var peerSnap = { status: "unavailable" };
@@ -2293,9 +2347,7 @@ window.__ModuleLoader__.load({
2293
2347
 
2294
2348
  /* The merged integrations section: dedupe row + python row under one
2295
2349
  heading (v0.36.0). Exists only while the peer serves its row. */
2296
- var peerSection = peerSnap.status === "ready" ? E("div", { className: "gb-section" },
2297
- E("div", { className: "gb-sectionTitle" }, t("sec.peer")),
2298
- E("div", { className: "gb-stack" },
2350
+ var peerSection = peerSnap.status === "ready" ? fold("sec.peer",
2299
2351
  E("div", { className: "gb-row" },
2300
2352
  E("span", { className: "gb-rowLabel" }, t("dedupe.label") + ":"),
2301
2353
  E("span", { className: "gb-rowValue" }, dedupe ? t("state.on") : t("state.off")),
@@ -2318,7 +2370,6 @@ window.__ModuleLoader__.load({
2318
2370
  pythonOffered ? E("p", { className: "gb-hint" }, t("python.hint")) : null,
2319
2371
  pythonOffered && winHost ? E("p", { className: "gb-error" }, t("python.blocked")) : null,
2320
2372
  pythonDegraded ? E("p", { className: "gb-error" }, t("python.degraded")) : null,
2321
- ),
2322
2373
  ) : null;
2323
2374
 
2324
2375
  /* ── terminal toolchain (v0.30.0) ────────────────────────────────
@@ -2437,9 +2488,7 @@ window.__ModuleLoader__.load({
2437
2488
  return function () { clearTimeout(timer); };
2438
2489
  }, [toolJob]);
2439
2490
 
2440
- var toolsSection = E("div", { className: "gb-section" },
2441
- E("div", { className: "gb-sectionTitle" }, t("sec.tools")),
2442
- E("div", { className: "gb-stack" },
2491
+ var toolsSection = fold("sec.tools",
2443
2492
  toolsData === null && toolErr === "" ? E("p", { className: "gb-hint" }, t("tools.loading")) : null,
2444
2493
  toolErr !== "" ? E("p", { className: "gb-error" }, toolErr) : null,
2445
2494
  toolsData !== null && !wingetOk ? E("p", { className: "gb-error" }, t("tools.nowinget")) : null,
@@ -2511,7 +2560,6 @@ window.__ModuleLoader__.load({
2511
2560
  ),
2512
2561
  ) : null,
2513
2562
  E("p", { className: "gb-hint" }, t("tools.hint")),
2514
- ),
2515
2563
  );
2516
2564
 
2517
2565
  var bodyContent = E("div", { className: "gb-body" },
@@ -43,7 +43,7 @@ export const GB_PREFIX = 'gb_'
43
43
  export const gbName = (raw) => GB_PREFIX + raw
44
44
 
45
45
  // The HOST registry rejects any tool without an `output` contract (issue #18,
46
- // root cause 2) — the frozen schema + text renderer the gitbash_pwsh
46
+ // root cause 2) — the frozen schema + text renderer the pwsh7
47
47
  // definition ships, reused so both families speak one tool-result contract.
48
48
  import { TOOL_OUTPUT_SCHEMA, renderTextContent } from './inline-tools.js'
49
49
 
package/src/index.js CHANGED
@@ -56,7 +56,7 @@ import { fileURLToPath } from 'node:url'
56
56
 
57
57
  import { PRESET_META, minimalPluginsFor, pluginsFor } from './compositions.js'
58
58
  import { loadSchemastery } from './schemastery.js'
59
- import { GITBASH_MSYS_ADDENDUM, GITBASH_ROUTE_ADDENDUM, mountInlineTools, resolveHostPwsh7 } from './inline-tools.js'
59
+ import { GITBASH_MSYS_ADDENDUM, GITBASH_ROUTE_ADDENDUM, GITBASH_ROUTE_ADDENDUM_NO_PWSH, mountInlineTools, resolveHostPwsh7 } from './inline-tools.js'
60
60
  import { mountFastctx } from './fastctx-bridge.js'
61
61
 
62
62
  /**
@@ -503,12 +503,12 @@ export const Config = Schema === null ? undefined : Schema.object({
503
503
  */
504
504
  variantPresets: live(Schema.boolean().default(false)),
505
505
  /**
506
- * Publish `gitbash_pwsh` — a REAL PowerShell 7 tool over ctx.subprocess —
506
+ * Publish `pwsh7` — a REAL PowerShell 7 tool over ctx.subprocess —
507
507
  * while the host `pwsh` tool is denied (its executor is Git Bash on this
508
508
  * host). Default ON; requires pwsh 7 on the machine (never a bundled
509
509
  * payload) and danger-full-access per session.
510
510
  */
511
- pwshTool: live(Schema.boolean().default(true)),
511
+ pwshTool: live(Schema.boolean().default(false)),
512
512
  /**
513
513
  * Publish the FastCtx file tools (`gb_*`) through the local MCP bridge.
514
514
  * Default ON; Windows-only payload, stands down entirely when dsh-ops is
@@ -2091,11 +2091,16 @@ export async function apply(ctx, config = {}) {
2091
2091
  // every agent (routing is dialect-independent), while the MSYS
2092
2092
  // sentence only describes the world the dialect switch creates.
2093
2093
  // Idempotent by marker: assemble may run more than once per agent.
2094
+ // The routing sentence follows the pwsh switch (v0.37.0): while the
2095
+ // pwsh7 tool is off (the default) the sentence must NOT name it —
2096
+ // a route to a tool the agent cannot see only teaches the model to
2097
+ // call a denied name.
2094
2098
  if (assembly && typeof assembly === 'object' && Array.isArray(assembly.tools)) {
2099
+ const routeSentence = liveSettings.pwshTool() === true ? GITBASH_ROUTE_ADDENDUM : GITBASH_ROUTE_ADDENDUM_NO_PWSH
2095
2100
  for (const tool of assembly.tools) {
2096
2101
  if (tool && tool.name === 'bash' && typeof tool.description === 'string'
2097
2102
  && !tool.description.includes('Prefer this bash tool')) {
2098
- tool.description += '\n' + GITBASH_ROUTE_ADDENDUM
2103
+ tool.description += '\n' + routeSentence
2099
2104
  + (applies && dialect.posixPaths === true ? '\n' + GITBASH_MSYS_ADDENDUM : '')
2100
2105
  }
2101
2106
  }
@@ -2626,7 +2631,7 @@ export async function apply(ctx, config = {}) {
2626
2631
  return subprocess.spawn(spec)
2627
2632
  },
2628
2633
  pwshPath: resolveHostPwsh7({ exists: existsSync }),
2629
- pwshEnabled: () => liveSettings.pwshTool(),
2634
+ pwshEnabled: () => liveSettings.pwshTool() === true,
2630
2635
  msysToWin: (p) => translateMsysPath(p, buildTranslateEnv(readConfiguredBashPath())),
2631
2636
  echo: (text) => (liveSettings.dialect().posixPaths === true ? windowsToMsys(text) : text),
2632
2637
  log: (m) => console.log(TAG + ' ' + m),
@@ -27,7 +27,7 @@
27
27
  * executor is ctx.shell, which on this host IS Git Bash — a pwsh tool
28
28
  * that runs bash is a lie to the model);
29
29
  * 2. `ops_*` tools present (dsh-ops installed) -> our FastCtx bridge and
30
- * gitbash_pwsh stand down; the official bash activation still runs, the
30
+ * pwsh7 stands down; the official bash activation still runs, the
31
31
  * two command surfaces are complements, not duplicates;
32
32
  * 3. `bash` already present (variant presets on, or a future official
33
33
  * change) -> touch nothing, so the variantPresets switch and this path
@@ -93,14 +93,24 @@ export function inlineNeeds(names) {
93
93
 
94
94
  /**
95
95
  * The routing addendum appended to the `bash` tool's description through the
96
- * system-prompt assemble waterfall. ALWAYS applied — it states shell routing,
97
- * which holds regardless of the path dialect a delegate sees.
96
+ * system-prompt assemble waterfall. TWO variants (v0.37.0, user decision):
97
+ * the pwsh tool is OFF by default, and a routing sentence that names a tool
98
+ * the agent cannot see only teaches the model to call a denied name. The ON
99
+ * variant names `pwsh` (the real PowerShell 7 tool that shadows the fake
100
+ * global one); the OFF variant states bash-only routing. Both hold regardless
101
+ * of the path dialect a delegate sees.
98
102
  */
99
103
  export const GITBASH_ROUTE_ADDENDUM = [
100
- 'Prefer this bash tool for ALL commands; use a PowerShell tool ONLY when a Windows-native capability (cmdlets, registry, services, WMI) is truly required.',
104
+ 'Prefer this bash tool for ALL commands; use the pwsh7 tool ONLY when a Windows-native capability (cmdlets, registry, services, WMI) is truly required.',
101
105
  'Fix failed bash commands in bash — never switch shells mid-task, never embed `pwsh -Command` inside a bash command (variable expansion and output encoding break there).',
102
106
  ].join('\n')
103
107
 
108
+ /** The bash-only routing variant, used while the pwsh switch is off (the default). */
109
+ export const GITBASH_ROUTE_ADDENDUM_NO_PWSH = [
110
+ 'Prefer this bash tool for ALL commands — it is this host\'s shell.',
111
+ 'Fix failed commands in bash; there is no PowerShell tool on this host.',
112
+ ].join('\n')
113
+
104
114
  /**
105
115
  * The dialect addendum (MSYS facts) — appended ONLY while this plugin's path
106
116
  * dialect is on for the assembling agent, because it describes the /c/ world
@@ -158,7 +168,7 @@ export function resolveHostPwsh7({ env = process.env, exists, platform = process
158
168
  return ''
159
169
  }
160
170
 
161
- /** Arguments `gitbash_pwsh` accepts — strict: anything else is rejected. */
171
+ /** Arguments `pwsh7` accepts — strict: anything else is rejected. */
162
172
  export const PWSH_ARGUMENTS = Object.freeze(['command', 'script_path', 'workdir', 'timeoutMs'])
163
173
 
164
174
  const PWSH_DEFAULT_TIMEOUT_MS = 120_000
@@ -185,7 +195,7 @@ export function pwshArgv(pwsh, args, { msysToWin } = {}) {
185
195
  }
186
196
 
187
197
  /**
188
- * Validate one gitbash_pwsh call's arguments. Strict like ops_bash: an
198
+ * Validate one pwsh7 call's arguments. Strict like ops_bash: an
189
199
  * undeclared key is a hard error (the host bash/pwsh tools accept
190
200
  * `run_in_background`; this tool does not, and a silent ignore would leave a
191
201
  * server occupying the call until timeout). Pure.
@@ -282,10 +292,8 @@ export async function activateOfficialBash(agent, toolBashHref, createScopeFn, l
282
292
  */
283
293
  export function mountInlineTools(ctx, deps) {
284
294
  const { tools, agents, createScope, allowed, spawn, pwshPath, echo, log } = deps
285
- /** agent -> { timer, scope, denyPwsh }; named `tracked` because `agents` above is the host service */
295
+ /** agent -> { timer, scope, denyPwsh, pwshScope }; named `tracked` because `agents` above is the host service */
286
296
  const tracked = new Map()
287
- let pwshPublished = false
288
- let pwshDisposer = undefined
289
297
  let toolBashHrefPromise
290
298
 
291
299
  const faceNames = (agent) => {
@@ -297,27 +305,28 @@ export function mountInlineTools(ctx, deps) {
297
305
  }
298
306
  }
299
307
 
300
- const unpublishPwsh = () => {
301
- if (pwshDisposer) {
302
- try { pwshDisposer() } catch { /* already gone */ }
303
- pwshDisposer = undefined
304
- }
305
- pwshPublished = false
306
- }
307
-
308
- const publishPwsh = () => {
309
- if (pwshPublished) return
308
+ /**
309
+ * Provide the additive `pwsh7` tool inside one agent-owned scope (v0.37.0).
310
+ * The name never collides with the host's fake global `pwsh`, so this is a
311
+ * pure ADDITION — it shadows nothing and requires no deny juggling. The
312
+ * scope keeps the registration revertible at agent disposal.
313
+ */
314
+ const providePwsh = (agent, state) => {
315
+ if (state.pwshScope) return
310
316
  if (typeof spawn !== 'function' || !pwshPath) return
311
- if (deps.pwshEnabled && deps.pwshEnabled() !== true) return
312
- const registry = tools(ctx)
313
- if (!registry || typeof registry.register !== 'function') return
317
+ if (!createScope) return
314
318
  try {
315
- const disposer = registry.register(gitbashPwshDefinition({ pwsh: pwshPath, spawn, allowed, msysToWin: deps.msysToWin, echo }))
316
- pwshDisposer = typeof disposer === 'function' ? disposer : undefined
317
- pwshPublished = true
318
- log(`pwsh replacement published (pwsh 7 at ${pwshPath}; the host pwsh tool is denied on this host — its executor is Git Bash)`)
319
+ const scope = createScope(agent.ctx)
320
+ const registry = scope.ctx?.tools
321
+ if (!registry || typeof registry.register !== 'function') {
322
+ void scope.dispose().catch(() => {})
323
+ return
324
+ }
325
+ registry.register(gitbashPwshDefinition({ pwsh: pwshPath, spawn, allowed, msysToWin: deps.msysToWin, echo }))
326
+ state.pwshScope = scope
327
+ log(`pwsh7 tool provided for this agent (real PowerShell 7 at ${pwshPath})`)
319
328
  } catch (error) {
320
- log(`pwsh replacement registration failed: ${error?.message ?? error}`)
329
+ log(`pwsh7 tool registration failed for this agent: ${error?.message ?? error}`)
321
330
  }
322
331
  }
323
332
 
@@ -340,21 +349,37 @@ export function mountInlineTools(ctx, deps) {
340
349
  let state = tracked.get(agent)
341
350
  if (state?.timer) { clearTimeout(state.timer); state.timer = undefined }
342
351
  if (!state) {
343
- state = { timer: undefined, scope: undefined, denyPwsh: undefined }
352
+ state = { timer: undefined, scope: undefined, denyPwsh: undefined, pwshScope: undefined }
344
353
  tracked.set(agent, state)
345
354
  }
346
- if (needs.denyPwsh && !state.denyPwsh) {
347
- // Deny the fake pwsh first: restrict is per-agent and idempotent, and
348
- // the lying tool must never be callable, not even for the milliseconds
349
- // before the bash tool lands. The call MUST go through the AGENT's
350
- // scoped context (`agent.ctx.tools`, the dsh-ops-proven shape): on the
351
- // ROOT context the host throws "requires a scoped context" and the
352
- // deny silently never exists (issue #18, root cause 3).
353
- try {
354
- const deny = agent.ctx?.tools?.restrict?.({ deny: ['pwsh'] })
355
- if (typeof deny === 'function') state.denyPwsh = deny
356
- } catch (error) {
357
- log(`fake-pwsh deny failed: ${error?.message ?? error}`)
355
+ // The pwsh face has three facts (v0.37.0, user decision — the pwsh7 tool
356
+ // is OFF by default, and its switch lives ONLY on this plugin's row):
357
+ // dsh-ops present -> hands off entirely (their host-pwsh story stands;
358
+ // our pwsh7 and our deny would both be duplicates).
359
+ // the fake global `pwsh` (executor = ctx.shell = Git Bash) is DENIED
360
+ // per agent in EVERY case — the lying name is never
361
+ // callable, and `pwsh7` cannot be caught by it.
362
+ // switch ON -> the REAL PowerShell 7 tool is ADDED as `pwsh7` in
363
+ // an agent-owned scope (pure addition, no shadowing).
364
+ // The row switch is re-read per reconcile, so a flip lands at the next
365
+ // agent (or on the next event after a hot toggle).
366
+ if (needs.denyPwsh) {
367
+ if (needs.opsPresent) {
368
+ // hands off
369
+ } else {
370
+ if (!state.denyPwsh) {
371
+ // The deny MUST go through the AGENT's scoped context
372
+ // (`agent.ctx.tools`, the dsh-ops-proven shape): on the ROOT context
373
+ // the host throws "requires a scoped context" and the deny silently
374
+ // never exists (issue #18, root cause 3).
375
+ try {
376
+ const deny = agent.ctx?.tools?.restrict?.({ deny: ['pwsh'] })
377
+ if (typeof deny === 'function') state.denyPwsh = deny
378
+ } catch (error) {
379
+ log(`fake-pwsh deny failed: ${error?.message ?? error}`)
380
+ }
381
+ }
382
+ if (deps.pwshEnabled && deps.pwshEnabled() === true) providePwsh(agent, state)
358
383
  }
359
384
  }
360
385
  if (needs.needsBash && !state.scope) {
@@ -371,13 +396,6 @@ export function mountInlineTools(ctx, deps) {
371
396
  }
372
397
  }).catch(() => { /* logged inside activateOfficialBash */ })
373
398
  }
374
- // The pwsh replacement follows the ops_ presence: dsh-ops already ships a
375
- // PowerShell story through the HOST pwsh tool — which our own deny would
376
- // otherwise silence — so ours fills that gap instead of duplicating tools.
377
- // The row switch is re-read per reconcile too, so a flip lands at the
378
- // next agent (or on the next event after a hot toggle).
379
- if (needs.opsPresent || (deps.pwshEnabled && deps.pwshEnabled() !== true)) unpublishPwsh()
380
- else publishPwsh()
381
399
  }
382
400
 
383
401
  const teardown = (agent) => {
@@ -386,6 +404,7 @@ export function mountInlineTools(ctx, deps) {
386
404
  tracked.delete(agent)
387
405
  if (state.timer) clearTimeout(state.timer)
388
406
  if (state.denyPwsh) { try { state.denyPwsh() } catch { /* already lifted */ } }
407
+ if (state.pwshScope) { void state.pwshScope.dispose().catch(() => {}) }
389
408
  if (state.scope) { void state.scope.dispose().catch(() => {}) }
390
409
  }
391
410
 
@@ -400,14 +419,15 @@ export function mountInlineTools(ctx, deps) {
400
419
  for (const agent of agents?.(ctx)?.list?.() ?? []) {
401
420
  try { reconcile(agent) } catch { /* one broken agent never blocks the rest */ }
402
421
  }
403
- // CALL-LAYER GUARD (v0.35.2, second independent layer): even when the
404
- // per-agent visibility restriction loses a race, a `pwsh` call that
405
- // reaches its executor runs Git Bash (ctx.shell IS Git Bash on this
406
- // host). Deny at dispatch and name the replacements.
422
+ // CALL-LAYER GUARD (v0.35.2, second independent layer; v0.37.0 wording):
423
+ // a `pwsh` call ALWAYS reaches the fake global tool (executor = ctx.shell
424
+ // = Git Bash on this host) — our real tool is `pwsh7`, a different name —
425
+ // so the fake name is denied at dispatch unconditionally, with the
426
+ // replacement named.
407
427
  ctx.on('tools/pre-execute', (exec, next) => {
408
428
  try {
409
429
  if (exec?.name === 'pwsh') {
410
- return { kind: 'deny', reason: 'the host pwsh tool would run Git Bash on this host (its executor was replaced). Use the bash tool for commands, or gitbash_pwsh for Windows-native work (registry, services, WMI).' }
430
+ return { kind: 'deny', reason: 'the host pwsh tool would run Git Bash on this host (its executor was replaced). Use the bash tool for commands. If you need Windows-native work (registry, services, WMI), the real PowerShell 7 tool is pwsh7 — enable it on the dsh-gitbash-shell settings card if it is not present.' }
411
431
  }
412
432
  } catch { /* never block the waterfall */ }
413
433
  return next()
@@ -420,7 +440,6 @@ export function mountInlineTools(ctx, deps) {
420
440
  ctx.effect(() => () => {
421
441
  for (const agent of [...tracked.keys()]) teardown(agent)
422
442
  tracked.clear()
423
- unpublishPwsh()
424
443
  }, 'dsh-gitbash-shell: inline tool patching')
425
444
  }
426
445
 
@@ -441,7 +460,13 @@ export function mountInlineTools(ctx, deps) {
441
460
  */
442
461
  export function gitbashPwshDefinition({ pwsh, spawn, allowed, msysToWin, echo }) {
443
462
  return {
444
- name: 'gitbash_pwsh',
463
+ // v0.37.0 (user decision): the tool is named `pwsh7` — NOT `pwsh` (that
464
+ // name belongs to the host's fake global tool, whose executor is
465
+ // ctx.shell = Git Bash on this host and stays denied) and NOT
466
+ // `gitbash_pwsh` (which read like a bash/pwsh hybrid). `pwsh7` is purely
467
+ // additive: it never shadows anything, and it exists only on hosts where
468
+ // a real PowerShell 7 is installed.
469
+ name: 'pwsh7',
445
470
  description: gitbashPwshDescription(),
446
471
  parameters: {
447
472
  type: 'object',
@@ -462,7 +487,7 @@ export function gitbashPwshDefinition({ pwsh, spawn, allowed, msysToWin, echo })
462
487
  const invalid = validatePwshArgs(args)
463
488
  if (invalid) throw new Error(invalid)
464
489
  if (!allowed(exec?.agent?.session)) {
465
- throw new Error('gitbash_pwsh requires danger-full-access for this session; this channel has no file sandbox.')
490
+ throw new Error('pwsh7 requires danger-full-access for this session; this channel has no file sandbox.')
466
491
  }
467
492
  const built = pwshArgv(pwsh, args, { msysToWin })
468
493
  if (built.error) throw new Error(built.error)