dsh-winrm 0.1.1 → 0.3.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/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  仿照 [dsh-ssh](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-ssh) 开发的 DSH 插件:用 Windows 原生的 **WinRM / PowerShell Remoting** 协议远程管理 Windows 服务器,**目标机不需要装 OpenSSH**。
6
6
 
7
+ > **来源**:本项目是 [andyfan1094/dsh-winrm](https://github.com/andyfan1094/dsh-winrm)(Apache-2.0)的分支,把后端的 WinRM 实现从 Python + pywinrm 换成原生 Node.js 客户端([winrm-client](https://github.com/shide1989/winrm-client)),因此**本机不再需要 Python**。GUI、Agent 工具与功能范围沿用上游设计。
8
+
7
9
  ## 功能
8
10
 
9
11
  | 面 | 说明 |
@@ -13,7 +15,7 @@
13
15
  | PowerShell 控制台 | WebSocket 命令会话(每条命令通过原生 Node WinRM 客户端执行,输出实时返回) |
14
16
  | 服务管理 | 列出 / 启动 / 停止 / 重启 / 改启动类型(自动/手动/禁用) |
15
17
  | 进程管理 | 列出(CPU/内存/路径)/ 按 PID 结束 |
16
- | 文件传输 | base64 分块读写,**不依赖 SMB**,任意路径可传;上传自动建目录 |
18
+ | 文件传输 | WinRM 流式传输(上传单 shell 单流 / 下载并行区间,**不依赖 SMB**,任意路径可传);上传自动建目录 |
17
19
  | 集群 | 一条命令并发跑多台主机(按 aliases / environment / tags 过滤) |
18
20
 
19
21
  ## 认证与传输
@@ -22,8 +24,9 @@
22
24
  - 本地账户可写 `Administrator`;域账户可写 `DOMAIN\user` 或 `user@domain`
23
25
  - 本机无需 Python —— WinRM 走纯 Node 依赖(winrm-client),随插件一起安装
24
26
  - 传输:HTTP(5985) 或 HTTPS(5986);HTTPS 可勾选「接受自签名证书」
25
- - 中文输出不乱码:所有命令走 **UTF-8 base64 信封**(`-EncodedCommand` + `Out-String` 包装),绕过 WinRM 传输的代码页问题
27
+ - 中文输出不乱码:所有命令走 **UTF-8 base64 信封**(`Out-String -Stream` 包装 + 三条带标签的信封行),绕过 WinRM 传输的代码页问题
26
28
  - 命令结果的 `stderr` 已自动剥离 PowerShell 的 CLIXML 宿主机记录;真实的进程级 stderr(如 `[Console]::Error`)原样保留
29
+ - **脚本走 WinRS stdin,不走命令行**:WinRS 把命令行交给 `cmd.exe`,上限约 8191 字符,而 `-EncodedCommand` 会把脚本膨胀 2.67 倍 —— 命令行长脚本此前会直接报 `The command line is too long.`。现在命令行是**常量**,脚本按 UTF-8 字节数分块送到 stdin,实测 200 KB 脚本正常
27
30
 
28
31
  ## 目标机准备(一次性)
29
32
 
@@ -39,12 +42,12 @@ powershell -ExecutionPolicy Bypass -File .\scripts\enable-winrm.ps1
39
42
 
40
43
  ## 安装
41
44
 
42
- > 需要 DeepSeek Harness **0.1.7 系列**(`0.1.7-alpha.2` 及以后,含 `0.1.7-rc.1`)。插件的 `peerDependencies` 声明为 `^0.1.7-alpha.2`,DSH 启动时会据此校验:0.1.x 各版本可加载,`0.2.0` 起会被拒绝(确需冒险可用 `dsh plugin allow-version` 逐版本放行)。
45
+ > 需要 DeepSeek Harness **0.1.7-alpha.2 及以后**(含 `0.1.7-rc.1`、`0.2.0-rc.*`、`0.2.x`)。插件的 `peerDependencies` 声明为 `^0.1.7-alpha.2 || ^0.2.0-rc.1`,DSH 启动时会据此校验:0.1.7 与 0.2.x 各版本可加载,`0.3.0` 起会被拒绝(确需冒险可用 `dsh plugin allow-version` 逐版本放行)。
43
46
 
44
47
  从 [Releases](https://github.com/MoRanYue/dsh-winrm/releases) 下载最新的 `dsh-winrm-*.tgz`,加入 profile:
45
48
 
46
49
  ```powershell
47
- dsh plugin --profile web add D:\downloads\dsh-winrm-0.1.0.tgz
50
+ dsh plugin --profile web add D:\downloads\dsh-winrm-0.3.0.tgz
48
51
  ```
49
52
 
50
53
  也可以直接从 npm 安装:
@@ -90,10 +93,11 @@ src/
90
93
  engine.ts WinRmEngine 门面:exec / services / processes / ls / upload / download / console / cluster / test
91
94
  store.ts ~/.dsh/dsh-winrm.json 主机存储(原子写,0600)
92
95
  protocol.ts 宿主↔浏览器 wire 类型
93
- powershell.ts PS 片段构造器(UTF-8 信封 / 服务 / 进程 / 目录 / 分块读写)
96
+ powershell.ts PS 片段构造器 + stdin 信封(outer/child 包装 / 服务 / 进程 / 目录 / 流式收发脚本)
94
97
  routes.ts /api/dsh-winrm 路由族 + 控制台 WebSocket(loopback 围栏)
95
98
  tools.ts 7 个 winrm_* agent 工具
96
- engine/client.ts winrm-client 传输层:进程内认证(NTLM/Basic)、UTF-8 信封、分块传输
99
+ engine/client.ts winrm-client 传输层:进程内认证(NTLM/Basic)、UTF-8 信封、流式上传/下载 + 分块回退
100
+ engine/wsman.ts 手写 WSMan Send/Receive 信封(原始字节走 stdin,不做二次 base64;512000 信封上限)
97
101
  engine/console.ts 流式 PowerShell 控制台会话
98
102
  client/ 浏览器半:侧边栏入口 + 居中面板(5 页签)
99
103
  scripts/
@@ -106,7 +110,10 @@ scripts/
106
110
  ## 已知限制
107
111
 
108
112
  - 控制台是命令会话,不保持 PowerShell 变量和当前目录状态;每条命令独立执行
109
- - WinRM 单次响应受 150KB 信封上限约束,传输按 48KB 分块,大文件较慢(每块一次往返)
113
+ - 上传走**单条 stdin 流**:一个 shell、一个命令,每 256KB 一个 `Send`,可压缩内容自动按块 gzip(实测 1.7MB JSON 线上仅 91KB)。旧的 48KB 分块路径保留为回退,仅在流式通道不可用时启用
114
+ - 下载走**并行区间流**:默认最多 4 个 worker,各自一个 shell 读同一文件的绝对字节区间,远端 gzip 后回传,本地按 offset 落位(实测 2MiB 约 10-12 秒,16MiB 约 21-23 秒,可压缩的 16MiB 约 6 秒;旧的 48KB 分块路径 2MiB 需 129 秒,保留为回退)。服务端单次 `Receive` 最多回 128KB,与信封大小无关,所以下载是往返次数受限而非带宽受限
115
+ - `channel=auto`(默认)先探测目标机 445 端口:`net use` 自身没有短超时,SMB 不可用时要等约 60 秒才失败,此前这段等待发生在每次上传之前。现在 3 秒内判定并直接走 WinRM
116
+ - 下载失败不留残file:已写入的数据会被丢弃、目标文件被删除;若失败发生在任何字节到达之前(路径不存在、目标是目录、主机不可达),已存在的本地文件保持原样不动(目标文件在首次写入时才创建)
110
117
  - 单命令默认 60s 超时,可传 `timeoutMs`
111
118
  - 目标机需已启用 WinRM(见上);HTTP 明文 Basic 不应用于公网
112
119
  - 面板关闭再打开会回到「主机」页签:面板是 `main` 插槽的占用者,切回对话时卸载,页签状态不跨开关保留
package/README.zh.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  仿照 [dsh-ssh](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-ssh) 开发的 DSH 插件:用 Windows 原生的 **WinRM / PowerShell Remoting** 协议远程管理 Windows 服务器,**目标机不需要装 OpenSSH**。
4
4
 
5
+ > **来源**:本项目是 [andyfan1094/dsh-winrm](https://github.com/andyfan1094/dsh-winrm)(Apache-2.0)的分支,把后端的 WinRM 实现从 Python + pywinrm 换成原生 Node.js 客户端([winrm-client](https://github.com/shide1989/winrm-client)),因此**本机不再需要 Python**。GUI、Agent 工具与功能范围沿用上游设计。
6
+
5
7
  ## 功能
6
8
 
7
9
  | 面 | 说明 |
@@ -11,7 +13,7 @@
11
13
  | PowerShell 控制台 | WebSocket 命令会话(每条命令通过原生 Node WinRM 客户端执行,输出实时返回) |
12
14
  | 服务管理 | 列出 / 启动 / 停止 / 重启 / 改启动类型(自动/手动/禁用) |
13
15
  | 进程管理 | 列出(CPU/内存/路径)/ 按 PID 结束 |
14
- | 文件传输 | base64 分块读写,**不依赖 SMB**,任意路径可传;上传自动建目录 |
16
+ | 文件传输 | WinRM 流式传输(上传单 shell 单流 / 下载并行区间,**不依赖 SMB**,任意路径可传);上传自动建目录 |
15
17
  | 集群 | 一条命令并发跑多台主机(按 aliases / environment / tags 过滤) |
16
18
 
17
19
  ## 认证与传输
@@ -20,8 +22,9 @@
20
22
  - 本地账户可写 `Administrator`;域账户可写 `DOMAIN\\user` 或 `user@domain`
21
23
  - 本机无需 Python —— WinRM 走纯 Node 依赖(winrm-client),随插件一起安装
22
24
  - 传输:HTTP(5985) 或 HTTPS(5986);HTTPS 可勾选「接受自签名证书」
23
- - 中文输出不乱码:所有命令走 **UTF-8 base64 信封**(`-EncodedCommand` + `Out-String` 包装),绕过 WinRM 传输的代码页问题
25
+ - 中文输出不乱码:所有命令走 **UTF-8 base64 信封**(`Out-String -Stream` 包装 + 三条带标签的信封行),绕过 WinRM 传输的代码页问题
24
26
  - 命令结果的 `stderr` 已自动剥离 PowerShell 的 CLIXML 宿主机记录;真实的进程级 stderr(如 `[Console]::Error`)原样保留
27
+ - **脚本走 WinRS stdin,不走命令行**:WinRS 把命令行交给 `cmd.exe`,上限约 8191 字符,而 `-EncodedCommand` 会把脚本膨胀 2.67 倍 —— 命令行长脚本此前会直接报 `The command line is too long.`。现在命令行是**常量**,脚本按 UTF-8 字节数分块送到 stdin,实测 200 KB 脚本正常
25
28
 
26
29
  ## 目标机准备(一次性)
27
30
 
@@ -42,12 +45,12 @@ powershell -ExecutionPolicy Bypass -File .\scripts\enable-winrm.ps1
42
45
 
43
46
  ## 安装
44
47
 
45
- > 需要 DeepSeek Harness **0.1.7 系列**(`0.1.7-alpha.2` 及以后,含 `0.1.7-rc.1`)。插件的 `peerDependencies` 声明为 `^0.1.7-alpha.2`,DSH 启动时会据此校验:0.1.x 各版本可加载,`0.2.0` 起会被拒绝(确需冒险可用 `dsh plugin allow-version` 逐版本放行)。
48
+ > 需要 DeepSeek Harness **0.1.7-alpha.2 及以后**(含 `0.1.7-rc.1`、`0.2.0-rc.*`、`0.2.x`)。插件的 `peerDependencies` 声明为 `^0.1.7-alpha.2 || ^0.2.0-rc.1`,DSH 启动时会据此校验:0.1.7 与 0.2.x 各版本可加载,`0.3.0` 起会被拒绝(确需冒险可用 `dsh plugin allow-version` 逐版本放行)。
46
49
 
47
50
  从 [Releases](https://github.com/MoRanYue/dsh-winrm/releases) 下载最新的 `dsh-winrm-*.tgz`,加入 profile:
48
51
 
49
52
  ```powershell
50
- dsh plugin --profile web add D:\downloads\dsh-winrm-0.1.0.tgz
53
+ dsh plugin --profile web add D:\downloads\dsh-winrm-0.3.0.tgz
51
54
  ```
52
55
 
53
56
  也可以直接从 npm 安装:
@@ -93,10 +96,11 @@ src/
93
96
  engine.ts WinRmEngine 门面:exec / services / processes / ls / upload / download / console / cluster / test
94
97
  store.ts ~/.dsh/dsh-winrm.json 主机存储(原子写,0600)
95
98
  protocol.ts 宿主↔浏览器 wire 类型
96
- powershell.ts PS 片段构造器(UTF-8 信封 / 服务 / 进程 / 目录 / 分块读写)
99
+ powershell.ts PS 片段构造器 + stdin 信封(outer/child 包装 / 服务 / 进程 / 目录 / 流式收发脚本)
97
100
  routes.ts /api/dsh-winrm 路由族 + 控制台 WebSocket(loopback 围栏)
98
101
  tools.ts 7 个 winrm_* agent 工具
99
- engine/client.ts winrm-client 传输层:进程内认证(NTLM/Basic)、UTF-8 信封、分块传输
102
+ engine/client.ts winrm-client 传输层:进程内认证(NTLM/Basic)、UTF-8 信封、流式上传/下载 + 分块回退
103
+ engine/wsman.ts 手写 WSMan Send/Receive 信封(原始字节走 stdin,不做二次 base64;512000 信封上限)
100
104
  engine/console.ts 流式 PowerShell 控制台会话
101
105
  client/ 浏览器半:侧边栏入口 + 居中面板(5 页签)
102
106
  scripts/
@@ -109,7 +113,10 @@ scripts/
109
113
  ## 已知限制
110
114
 
111
115
  - 控制台是命令会话,不保持 PowerShell 变量和当前目录状态;每条命令独立执行
112
- - WinRM 单次响应受 150KB 信封上限约束,传输按 48KB 分块,大文件较慢(每块一次往返)
116
+ - 上传走**单条 stdin 流**:一个 shell、一个命令,每 256KB 一个 `Send`,可压缩内容自动按块 gzip(实测 1.7MB JSON 线上仅 91KB)。旧的 48KB 分块路径保留为回退,仅在流式通道不可用时启用
117
+ - 下载走**并行区间流**:默认最多 4 个 worker,各自一个 shell 读同一文件的绝对字节区间,远端 gzip 后回传,本地按 offset 落位(实测 2MiB 约 10-12 秒,16MiB 约 21-23 秒,可压缩的 16MiB 约 6 秒;旧的 48KB 分块路径 2MiB 需 129 秒,保留为回退)。服务端单次 `Receive` 最多回 128KB,与信封大小无关,所以下载是往返次数受限而非带宽受限
118
+ - `channel=auto`(默认)先探测目标机 445 端口:`net use` 自身没有短超时,SMB 不可用时要等约 60 秒才失败,此前这段等待发生在每次上传之前。现在 3 秒内判定并直接走 WinRM
119
+ - 下载失败不留残file:已写入的数据会被丢弃、目标文件被删除;若失败发生在任何字节到达之前(路径不存在、目标是目录、主机不可达),已存在的本地文件保持原样不动(目标文件在首次写入时才创建)
113
120
  - 单命令默认 60s 超时,可传 `timeoutMs`
114
121
  - 目标机需已启用 WinRM(见上);HTTP 明文 Basic 不应用于公网
115
122
  - 面板关闭再打开会回到「主机」页签:面板是 `main` 插槽的占用者,切回对话时卸载,页签状态不跨开关保留
package/lib/client.js CHANGED
@@ -565,93 +565,93 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
565
565
  document.head.appendChild(tag);
566
566
  }
567
567
  var panel_module_css_default = {
568
+ "table": "hAbY3W_table",
569
+ "modalFooter": "hAbY3W_modalFooter",
570
+ "hiddenFile": "hAbY3W_hiddenFile",
571
+ "groupChevron": "hAbY3W_groupChevron",
572
+ "groupToggle": "hAbY3W_groupToggle",
573
+ "tab": "hAbY3W_tab",
574
+ "primaryButton": "hAbY3W_primaryButton",
575
+ "browsePath": "hAbY3W_browsePath",
576
+ "consoleInputRow": "hAbY3W_consoleInputRow",
577
+ "backButton": "hAbY3W_backButton",
578
+ "dirType": "hAbY3W_dirType",
579
+ "termContainer": "hAbY3W_termContainer",
580
+ "browseHeader": "hAbY3W_browseHeader",
581
+ "modalBackdrop": "hAbY3W_modalBackdrop",
582
+ "groupName": "hAbY3W_groupName",
583
+ "tableWrap": "hAbY3W_tableWrap",
568
584
  "progressBar": "hAbY3W_progressBar",
569
- "loading": "hAbY3W_loading",
585
+ "toolbarSpacer": "hAbY3W_toolbarSpacer",
586
+ "inlineTest": "hAbY3W_inlineTest",
587
+ "termWrap": "hAbY3W_termWrap",
588
+ "tunnelLabel": "hAbY3W_tunnelLabel",
589
+ "dirName": "hAbY3W_dirName",
590
+ "dirRow": "hAbY3W_dirRow",
570
591
  "termBody": "hAbY3W_termBody",
571
- "cellDetails": "hAbY3W_cellDetails",
572
- "groupCount": "hAbY3W_groupCount",
573
- "groupSection": "hAbY3W_groupSection",
574
- "tunnelRow": "hAbY3W_tunnelRow",
592
+ "dialogOverlay": "hAbY3W_dialogOverlay",
593
+ "dialog": "hAbY3W_dialog",
575
594
  "utf8Note": "hAbY3W_utf8Note",
576
- "checkRow": "hAbY3W_checkRow",
577
- "fieldHint": "hAbY3W_fieldHint",
578
- "linkButton": "hAbY3W_linkButton",
579
- "groupToggle": "hAbY3W_groupToggle",
595
+ "consoleHeader": "hAbY3W_consoleHeader",
596
+ "mono": "hAbY3W_mono",
597
+ "spinner": "hAbY3W_spinner",
598
+ "tunnelList": "hAbY3W_tunnelList",
599
+ "groupBySelect": "hAbY3W_groupBySelect",
580
600
  "entryIcon": "hAbY3W_entryIcon",
601
+ "ghostButton": "hAbY3W_ghostButton",
602
+ "formCard": "hAbY3W_formCard",
603
+ "fieldLabel": "hAbY3W_fieldLabel",
604
+ "controls": "hAbY3W_controls",
605
+ "linkButton": "hAbY3W_linkButton",
606
+ "formError": "hAbY3W_formError",
581
607
  "modalTitle": "hAbY3W_modalTitle",
608
+ "tunnelRow": "hAbY3W_tunnelRow",
609
+ "modal": "hAbY3W_modal",
610
+ "panelContent": "hAbY3W_panelContent",
582
611
  "empty": "hAbY3W_empty",
583
- "hiddenFile": "hAbY3W_hiddenFile",
584
- "panelTitle": "hAbY3W_panelTitle",
612
+ "loading": "hAbY3W_loading",
613
+ "progressMeta": "hAbY3W_progressMeta",
614
+ "checkRow": "hAbY3W_checkRow",
615
+ "panel": "hAbY3W_panel",
616
+ "groupSection": "hAbY3W_groupSection",
617
+ "banner": "hAbY3W_banner",
618
+ "formRow": "hAbY3W_formRow",
619
+ "progressTrack": "hAbY3W_progressTrack",
620
+ "cellMuted": "hAbY3W_cellMuted",
621
+ "tabBar": "hAbY3W_tabBar",
622
+ "browsePanel": "hAbY3W_browsePanel",
623
+ "cellDetails": "hAbY3W_cellDetails",
624
+ "entry": "hAbY3W_entry",
625
+ "dirSize": "hAbY3W_dirSize",
626
+ "radioRow": "hAbY3W_radioRow",
585
627
  "cellPre": "hAbY3W_cellPre",
586
- "dialogTitle": "hAbY3W_dialogTitle",
587
- "groupBySelect": "hAbY3W_groupBySelect",
588
- "table": "hAbY3W_table",
589
- "clusterFilters": "hAbY3W_clusterFilters",
590
- "browsePath": "hAbY3W_browsePath",
628
+ "search": "hAbY3W_search",
629
+ "fieldHint": "hAbY3W_fieldHint",
630
+ "panelHeader": "hAbY3W_panelHeader",
631
+ "panelTitle": "hAbY3W_panelTitle",
632
+ "radioLabel": "hAbY3W_radioLabel",
633
+ "termPlaceholder": "hAbY3W_termPlaceholder",
591
634
  "browseList": "hAbY3W_browseList",
592
- "radioRow": "hAbY3W_radioRow",
635
+ "clusterFilters": "hAbY3W_clusterFilters",
593
636
  "transferBlock": "hAbY3W_transferBlock",
594
- "tabBar": "hAbY3W_tabBar",
595
- "termPlaceholder": "hAbY3W_termPlaceholder",
596
- "search": "hAbY3W_search",
597
- "progressMeta": "hAbY3W_progressMeta",
598
- "consoleInputRow": "hAbY3W_consoleInputRow",
599
- "mono": "hAbY3W_mono",
600
- "entryLabel": "hAbY3W_entryLabel",
601
- "tableWrap": "hAbY3W_tableWrap",
602
- "hint": "hAbY3W_hint",
603
- "tunnelLabel": "hAbY3W_tunnelLabel",
604
- "fieldLabel": "hAbY3W_fieldLabel",
605
- "progressTrack": "hAbY3W_progressTrack",
606
- "modal": "hAbY3W_modal",
637
+ "consoleWrap": "hAbY3W_consoleWrap",
607
638
  "dshSshSpin": "hAbY3W_dshSshSpin",
608
- "iconButton": "hAbY3W_iconButton",
609
- "backButton": "hAbY3W_backButton",
610
- "ghostButton": "hAbY3W_ghostButton",
611
- "tabBody": "hAbY3W_tabBody",
639
+ "groupCount": "hAbY3W_groupCount",
612
640
  "clusterForm": "hAbY3W_clusterForm",
613
- "dirSize": "hAbY3W_dirSize",
614
- "groupHeader": "hAbY3W_groupHeader",
641
+ "consoleOutput": "hAbY3W_consoleOutput",
615
642
  "fillBody": "hAbY3W_fillBody",
616
- "panel": "hAbY3W_panel",
617
- "spinner": "hAbY3W_spinner",
618
- "cellMuted": "hAbY3W_cellMuted",
619
- "groupChevron": "hAbY3W_groupChevron",
620
- "field": "hAbY3W_field",
621
- "formRow": "hAbY3W_formRow",
622
- "panelContent": "hAbY3W_panelContent",
623
- "commandInput": "hAbY3W_commandInput",
624
- "consoleWrap": "hAbY3W_consoleWrap",
625
- "dialog": "hAbY3W_dialog",
626
- "toolbarSpacer": "hAbY3W_toolbarSpacer",
627
- "tunnelList": "hAbY3W_tunnelList",
628
- "radioLabel": "hAbY3W_radioLabel",
629
- "panelHeader": "hAbY3W_panelHeader",
630
- "browseHeader": "hAbY3W_browseHeader",
631
- "primaryButton": "hAbY3W_primaryButton",
632
- "banner": "hAbY3W_banner",
633
- "browsePanel": "hAbY3W_browsePanel",
634
- "entry": "hAbY3W_entry",
635
- "dirName": "hAbY3W_dirName",
636
- "dirRow": "hAbY3W_dirRow",
637
- "dialogOverlay": "hAbY3W_dialogOverlay",
638
- "termWrap": "hAbY3W_termWrap",
639
- "tab": "hAbY3W_tab",
640
- "input": "hAbY3W_input",
641
- "consoleHeader": "hAbY3W_consoleHeader",
642
- "badge": "hAbY3W_badge",
643
- "formError": "hAbY3W_formError",
644
- "groupName": "hAbY3W_groupName",
645
- "termContainer": "hAbY3W_termContainer",
646
- "controls": "hAbY3W_controls",
643
+ "entryLabel": "hAbY3W_entryLabel",
647
644
  "toolbar": "hAbY3W_toolbar",
648
- "consoleOutput": "hAbY3W_consoleOutput",
649
- "formCard": "hAbY3W_formCard",
645
+ "groupHeader": "hAbY3W_groupHeader",
646
+ "badge": "hAbY3W_badge",
647
+ "commandInput": "hAbY3W_commandInput",
648
+ "dialogTitle": "hAbY3W_dialogTitle",
649
+ "tabBody": "hAbY3W_tabBody",
650
+ "iconButton": "hAbY3W_iconButton",
651
+ "field": "hAbY3W_field",
652
+ "hint": "hAbY3W_hint",
650
653
  "actions": "hAbY3W_actions",
651
- "modalBackdrop": "hAbY3W_modalBackdrop",
652
- "modalFooter": "hAbY3W_modalFooter",
653
- "inlineTest": "hAbY3W_inlineTest",
654
- "dirType": "hAbY3W_dirType"
654
+ "input": "hAbY3W_input"
655
655
  };
656
656
  //#endregion
657
657
  //#region src/client/panel/ConsoleTab.tsx