dsh-bash-terminal-ts 0.7.1 → 0.8.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.
Files changed (81) hide show
  1. package/README.en.md +99 -1
  2. package/README.md +195 -2
  3. package/cordis.patch.yml +66 -0
  4. package/dist/client.core.js +8018 -157
  5. package/dist/client.js +8018 -157
  6. package/dsh.plugin.json +22 -22
  7. package/lib/browser-i18n.d.ts +4 -0
  8. package/lib/browser-i18n.js +23 -0
  9. package/lib/client.js +8018 -157
  10. package/lib/dsh-types.d.ts +10 -0
  11. package/lib/dsh.d.ts +2 -0
  12. package/lib/index.d.ts +43 -0
  13. package/lib/index.js +196 -10
  14. package/lib/locales.d.ts +4 -0
  15. package/lib/locales.js +422 -0
  16. package/lib/settings-surface.d.ts +20 -0
  17. package/lib/settings-surface.js +49 -0
  18. package/lib/shell-id.d.ts +2 -0
  19. package/lib/shell-id.js +9 -0
  20. package/lib/shells.d.ts +114 -0
  21. package/lib/shells.js +187 -0
  22. package/lib/terminal.d.ts +30 -1
  23. package/lib/terminal.js +18 -5
  24. package/lib/webterminals/catalog.d.ts +36 -0
  25. package/lib/webterminals/catalog.js +93 -0
  26. package/lib/webterminals/host.d.ts +67 -0
  27. package/lib/webterminals/host.js +278 -0
  28. package/lib/webterminals/mount.d.ts +46 -0
  29. package/lib/webterminals/mount.js +171 -0
  30. package/lib/webterminals/protocol.d.ts +94 -0
  31. package/lib/webterminals/protocol.js +9 -0
  32. package/lib/webterminals/pty.d.ts +42 -0
  33. package/lib/webterminals/pty.js +64 -0
  34. package/lib/webterminals/registry.d.ts +139 -0
  35. package/lib/webterminals/registry.js +353 -0
  36. package/lib/webterminals/ws.d.ts +54 -0
  37. package/lib/webterminals/ws.js +140 -0
  38. package/locale/de.json +4 -0
  39. package/locale/en.json +4 -0
  40. package/locale/es.json +4 -0
  41. package/locale/fr.json +4 -0
  42. package/locale/it.json +4 -0
  43. package/locale/ja.json +4 -0
  44. package/locale/ko.json +4 -0
  45. package/locale/ru.json +4 -0
  46. package/locale/zh.json +4 -0
  47. package/package.json +131 -125
  48. package/scripts/build-browser-tests.mjs +36 -0
  49. package/scripts/build-client.mjs +10 -0
  50. package/scripts/check-artifacts.mjs +93 -0
  51. package/scripts/link-shells.mjs +75 -0
  52. package/src/browser-i18n.ts +27 -0
  53. package/src/client.tsx +622 -192
  54. package/src/dsh-types.ts +6 -0
  55. package/src/dsh.ts +2 -0
  56. package/src/index.ts +226 -10
  57. package/src/locales.ts +434 -0
  58. package/src/settings-surface.ts +59 -0
  59. package/src/shell-id.ts +11 -0
  60. package/src/shells.ts +250 -0
  61. package/src/terminal.ts +34 -5
  62. package/src/webterminals/browser/api.ts +212 -0
  63. package/src/webterminals/browser/bridge.ts +188 -0
  64. package/src/webterminals/browser/css.d.ts +16 -0
  65. package/src/webterminals/browser/face.ts +151 -0
  66. package/src/webterminals/browser/shell-picker.tsx +98 -0
  67. package/src/webterminals/browser/store.ts +40 -0
  68. package/src/webterminals/browser/tab.tsx +136 -0
  69. package/src/webterminals/browser/testkit.ts +21 -0
  70. package/src/webterminals/browser/url.ts +70 -0
  71. package/src/webterminals/browser/view.ts +381 -0
  72. package/src/webterminals/browser/xterm.ts +269 -0
  73. package/src/webterminals/catalog.ts +114 -0
  74. package/src/webterminals/host.ts +361 -0
  75. package/src/webterminals/mount.ts +227 -0
  76. package/src/webterminals/protocol.ts +78 -0
  77. package/src/webterminals/pty.ts +90 -0
  78. package/src/webterminals/registry.ts +447 -0
  79. package/src/webterminals/ws.ts +166 -0
  80. package/tsconfig.client.json +9 -1
  81. package/tsconfig.json +1 -1
package/lib/locales.js ADDED
@@ -0,0 +1,422 @@
1
+ // The client dictionary for the settings surface, all nine host languages.
2
+ //
3
+ // `zh` is the key source: every other language is typed `Record<keyof typeof zh,
4
+ // string>`, so a missing or misspelled key is a compile error rather than a
5
+ // runtime fallback. That choice is the whole reason the file is structured this
6
+ // way - the previous inline dictionaries were seven loose `Record<string, string>`
7
+ // maps, which let two languages go missing and let a renamed key ship silently.
8
+ //
9
+ // The other half of the discipline lives in `locale/<lang>.json`: the host reads
10
+ // plugin *metadata* from those files (and `en.json` is the anchor its package-meta
11
+ // scan requires). A key defined here but rendered nowhere is dead text - a
12
+ // missing-look bug, not a spare string.
13
+ /** The key set, defined by `zh` below. */
14
+ const zh = {
15
+ "shell.title": "默认终端",
16
+ "shell.description": "shell 工具执行命令时使用的终端",
17
+ "shell.powershell": "PowerShell",
18
+ "shell.gitbash": "Git Bash",
19
+ "shell.msys2": "MSYS2",
20
+ "shell.wsl": "WSL",
21
+ "shell.unavailable": "设置面不可用:宿主配置桥未响应(检查宿主是否为 compat 版)",
22
+ "dock.title": "底部终端",
23
+ "dock.hint": "开关只影响底部工作台里的终端,不改变官方右栏终端,也不给模型新增能力。",
24
+ "dock.state.available": "可用",
25
+ "dock.state.notInstalled": "未探测到",
26
+ "dock.state.noDistro": "无已安装发行版",
27
+ "dock.state.launcherOnly": "只找到启动器,无法内嵌",
28
+ "dock.powershell.locked": "PowerShell 是保底后端,无法关闭。",
29
+ "dock.defaultChoice": "默认 shell(只能从已激活且可用的项中选择)",
30
+ "dock.wslDistro": "WSL 发行版(留空表示 WSL 默认发行版)",
31
+ "dock.fallback.notice": "原来选择的 {from} 当前不可用,本次已改用 {to}。",
32
+ "dock.floor.notice": "所有 shell 都已关闭或不可用,本次已用 {to} 兜底。",
33
+ "dock.unavailable.noPty": "本机没有可用的 PTY 后端:node-pty 未构建且宿主未提供终端能力缝(可执行 pnpm approve-builds)。",
34
+ "dock.unavailable.noSocket": "宿主未开放 WebSocket 升级通道,底部终端无法接收输出。",
35
+ "dock.unavailable.notInstalled": "宿主尚未挂载终端路由,暂时无法提供底部终端。",
36
+ "dock.hostProvided": "当前由宿主终端提供,本插件已让位。",
37
+ "dock.applying": "保存中…",
38
+ "dock.failed": "写入失败:{message}",
39
+ "dock.terminals": "当前有 {count} 个终端在运行",
40
+ "dock.refresh": "重新探测",
41
+ "dock.enabled.title": "启用底部终端",
42
+ "dock.enabled.description": "总开关。关闭后隐藏下方各 shell 子开关,且不再分配终端",
43
+ "dock.enabled.off": "已关闭。打开后才会按可用性列出各 shell 子开关",
44
+ "dock.shim.title": "接管官方终端行",
45
+ "dock.shim.description": "仅在宿主没有终端控制器时打开。同名服务重复注册会让对方启动失败,所以默认关闭。",
46
+ "dock.shim.published": "已接管:官方那行「终端」现在由本插件供电",
47
+ "dock.shim.hostProvides": "宿主已提供 webTerminals,未接管(官方那行本来就可用)",
48
+ "dock.state.floor": "保底",
49
+ "tab.title": "终端(多 shell)",
50
+ "tab.description": "在本插件的 PTY 后端上打开 Git Bash / MSYS2 / WSL / PowerShell,与官方终端并存",
51
+ "tab.new": "新建",
52
+ "tab.noShell": "无可用 shell(请在设置里激活)",
53
+ "tab.phase.allocating": "正在分配",
54
+ "tab.phase.connecting": "正在连接",
55
+ "tab.phase.running": "运行中",
56
+ "tab.phase.exited": "已退出",
57
+ "tab.phase.failed": "失败",
58
+ };
59
+ const en = {
60
+ "shell.title": "Default terminal",
61
+ "shell.description": "Terminal used by the shell tool",
62
+ "shell.powershell": "PowerShell",
63
+ "shell.gitbash": "Git Bash",
64
+ "shell.msys2": "MSYS2",
65
+ "shell.wsl": "WSL",
66
+ "shell.unavailable": "Settings unavailable: the host config bridge did not respond (is the host a compat build?)",
67
+ "dock.title": "Bottom terminal",
68
+ "dock.hint": "These switches only affect the terminal in the bottom dock. The official right-hand terminal and the model's tools are untouched.",
69
+ "dock.state.available": "Available",
70
+ "dock.state.notInstalled": "Not found",
71
+ "dock.state.noDistro": "No distro installed",
72
+ "dock.state.launcherOnly": "Only a launcher was found; it cannot be embedded",
73
+ "dock.powershell.locked": "PowerShell is the fallback backend and cannot be turned off.",
74
+ "dock.defaultChoice": "Default shell (only activated and available choices are listed)",
75
+ "dock.wslDistro": "WSL distribution (empty uses the WSL default)",
76
+ "dock.fallback.notice": "{from} is not available right now, so this terminal started with {to}.",
77
+ "dock.floor.notice": "Every shell is off or unavailable, so this terminal fell back to {to}.",
78
+ "dock.unavailable.noPty": "No PTY backend on this machine: node-pty did not build and the host exposes no terminal seam (run pnpm approve-builds).",
79
+ "dock.unavailable.noSocket": "The host does not expose a WebSocket upgrade route, so the bottom terminal cannot receive output.",
80
+ "dock.unavailable.notInstalled": "The host has not mounted the terminal routes yet, so no bottom terminal is offered.",
81
+ "dock.hostProvided": "The host terminal is in charge; this plugin stood down.",
82
+ "dock.applying": "Saving…",
83
+ "dock.failed": "Write failed: {message}",
84
+ "dock.terminals": "{count} terminal(s) running",
85
+ "dock.refresh": "Re-detect",
86
+ "dock.enabled.title": "Enable bottom terminal",
87
+ "dock.enabled.description": "Master switch. Off hides the per-shell switches below and refuses allocations",
88
+ "dock.enabled.off": "Turned off. The per-shell switches appear once this is on",
89
+ "dock.shim.title": "Take over the official terminal row",
90
+ "dock.shim.description": "Turn on only where the host has no terminal controller. Publishing the same service name twice fails the other provider, so this is off by default.",
91
+ "dock.shim.published": "Taken over: the official “Terminal” row is now powered by this plugin",
92
+ "dock.shim.hostProvides": "The host already publishes webTerminals; nothing was taken over (the official row already works)",
93
+ "dock.state.floor": "floor",
94
+ "tab.title": "Terminal (multi-shell)",
95
+ "tab.description": "Opens Git Bash / MSYS2 / WSL / PowerShell over this plugin's PTY backend, alongside the official terminal",
96
+ "tab.new": "New",
97
+ "tab.noShell": "No shell available (enable one in settings)",
98
+ "tab.phase.allocating": "allocating",
99
+ "tab.phase.connecting": "connecting",
100
+ "tab.phase.running": "running",
101
+ "tab.phase.exited": "exited",
102
+ "tab.phase.failed": "failed",
103
+ };
104
+ const ja = {
105
+ "shell.title": "既定ターミナル",
106
+ "shell.description": "shell ツールがコマンド実行に使うターミナル",
107
+ "shell.powershell": "PowerShell",
108
+ "shell.gitbash": "Git Bash",
109
+ "shell.msys2": "MSYS2",
110
+ "shell.wsl": "WSL",
111
+ "shell.unavailable": "設定面を利用できません:ホストの設定ブリッジが応答しません(compat ビルドですか?)",
112
+ "dock.title": "下部ターミナル",
113
+ "dock.hint": "このスイッチは下部ドックのターミナルのみに影響します。公式の右側ターミナルやモデルのツールは変更されません。",
114
+ "dock.state.available": "利用可",
115
+ "dock.state.notInstalled": "見つかりません",
116
+ "dock.state.noDistro": "インストール済みディストリビューションなし",
117
+ "dock.state.launcherOnly": "ランチャーのみ検出、埋め込み不可",
118
+ "dock.powershell.locked": "PowerShell は最後の代替のため無効化できません。",
119
+ "dock.defaultChoice": "既定の shell(有効かつ利用可能な項目のみ表示)",
120
+ "dock.wslDistro": "WSL ディストリビューション(空なら WSL の既定)",
121
+ "dock.fallback.notice": "{from} は現在利用できないため、{to} で起動しました。",
122
+ "dock.floor.notice": "すべての shell が無効または利用不可のため、{to} に代替しました。",
123
+ "dock.unavailable.noPty": "このマシンに利用可能な PTY バックエンドがありません:node-pty がビルドされておらず、ホストにも terminal seam がありません(pnpm approve-builds を実行)。",
124
+ "dock.unavailable.noSocket": "ホストが WebSocket アップグレード経路を公開していないため、下部ターミナルは出力を受け取れません。",
125
+ "dock.unavailable.notInstalled": "ホストがターミナル経路をまだ読み込んでいないため、下部ターミナルは提供されません。",
126
+ "dock.hostProvided": "ホストのターミナルが担当しているため、本プラグインは譲りました。",
127
+ "dock.applying": "保存中…",
128
+ "dock.failed": "書き込み失敗:{message}",
129
+ "dock.terminals": "{count} 個のターミナルが実行中",
130
+ "dock.refresh": "再検出",
131
+ "dock.enabled.title": "下部ターミナルを有効化",
132
+ "dock.enabled.description": "親スイッチ。オフにすると下の各 shell の子スイッチは隠れ、割り当ても行われません",
133
+ "dock.enabled.off": "オフ中です。オンにすると利用可能な shell の子スイッチが一覧表示されます",
134
+ "dock.shim.title": "公式ターミナル行を引き継ぐ",
135
+ "dock.shim.description": "ホストにターミナルコントローラが無い環境でのみ有効にしてください。同名サービスの二重登録は相手側の起動を失敗させるため、既定は無効です。",
136
+ "dock.shim.published": "引き継ぎました:公式の「ターミナル」行は本プラグインが供給しています",
137
+ "dock.shim.hostProvides": "ホストがすでに webTerminals を提供しているため引き継ぎませんでした(公式行はそのまま使えます)",
138
+ "dock.state.floor": "代替",
139
+ "tab.title": "ターミナル(複数 shell)",
140
+ "tab.description": "本プラグインの PTY バックエンドで Git Bash / MSYS2 / WSL / PowerShell を開きます。公式ターミナルと併存します",
141
+ "tab.new": "新規",
142
+ "tab.noShell": "利用可能な shell がありません(設定で有効化)",
143
+ "tab.phase.allocating": "割り当て中",
144
+ "tab.phase.connecting": "接続中",
145
+ "tab.phase.running": "実行中",
146
+ "tab.phase.exited": "終了",
147
+ "tab.phase.failed": "失敗",
148
+ };
149
+ const ko = {
150
+ "shell.title": "기본 터미널",
151
+ "shell.description": "shell 도구가 명령을 실행할 때 사용하는 터미널",
152
+ "shell.powershell": "PowerShell",
153
+ "shell.gitbash": "Git Bash",
154
+ "shell.msys2": "MSYS2",
155
+ "shell.wsl": "WSL",
156
+ "shell.unavailable": "설정면을 사용할 수 없습니다: 호스트 설정 브리지가 응답하지 않습니다 (compat 빌드인가요?)",
157
+ "dock.title": "하단 터미널",
158
+ "dock.hint": "이 스위치는 하단 독의 터미널에만 영향을 줍니다. 공식 오른쪽 터미널과 모델 도구는 변경되지 않습니다.",
159
+ "dock.state.available": "사용 가능",
160
+ "dock.state.notInstalled": "탐지되지 않음",
161
+ "dock.state.noDistro": "설치된 배포판 없음",
162
+ "dock.state.launcherOnly": "런처만 발견되어 내장할 수 없음",
163
+ "dock.powershell.locked": "PowerShell은 최종 대체 항목이므로 끌 수 없습니다.",
164
+ "dock.defaultChoice": "기본 shell (활성화되고 사용 가능한 항목만 표시)",
165
+ "dock.wslDistro": "WSL 배포판 (비우면 WSL 기본값)",
166
+ "dock.fallback.notice": "{from}을(를) 지금 사용할 수 없어 {to}(으)로 시작했습니다.",
167
+ "dock.floor.notice": "모든 shell이 꺼졌거나 사용 불가하여 {to}(으)로 대체했습니다.",
168
+ "dock.unavailable.noPty": "이 컴퓨터에 사용 가능한 PTY 백엔드가 없습니다: node-pty가 빌드되지 않았고 호스트에 terminal seam도 없습니다 (pnpm approve-builds 실행).",
169
+ "dock.unavailable.noSocket": "호스트가 WebSocket 업그레이드 경로를 공개하지 않아 하단 터미널이 출력을 받을 수 없습니다.",
170
+ "dock.unavailable.notInstalled": "호스트가 터미널 경로를 아직 올려놓지 않아 하단 터미널을 제공하지 않습니다.",
171
+ "dock.hostProvided": "호스트 터미널이 담당하므로 이 플러그인은 양보했습니다.",
172
+ "dock.applying": "저장 중…",
173
+ "dock.failed": "쓰기 실패: {message}",
174
+ "dock.terminals": "{count}개 터미널 실행 중",
175
+ "dock.refresh": "다시 감지",
176
+ "dock.enabled.title": "하단 터미널 활성화",
177
+ "dock.enabled.description": "상위 스위치. 끄면 아래 shell별 하위 스위치가 숨겨지고 할당이 거부됩니다",
178
+ "dock.enabled.off": "꺼져 있습니다. 켜면 사용 가능한 shell의 하위 스위치가 표시됩니다",
179
+ "dock.shim.title": "공식 터미널 행 인수",
180
+ "dock.shim.description": "호스트에 터미널 컨트롤러가 없는 환경에서만 켜세요. 같은 이름의 서비스를 두 번 등록하면 상대 등록이 실패하므로 기본값은 꺼짐입니다.",
181
+ "dock.shim.published": "인수 완료: 공식 “터미널” 행을 이 플러그인이 제공합니다",
182
+ "dock.shim.hostProvides": "호스트가 이미 webTerminals를 제공하므로 인수하지 않았습니다 (공식 행은 그대로 사용 가능)",
183
+ "dock.state.floor": "대체",
184
+ "tab.title": "터미널(다중 shell)",
185
+ "tab.description": "이 플러그인의 PTY 백엔드로 Git Bash / MSYS2 / WSL / PowerShell 을 엽니다. 공식 터미널과 함께 존재합니다",
186
+ "tab.new": "새로 만들기",
187
+ "tab.noShell": "사용 가능한 shell 없음(설정에서 활성화)",
188
+ "tab.phase.allocating": "할당 중",
189
+ "tab.phase.connecting": "연결 중",
190
+ "tab.phase.running": "실행 중",
191
+ "tab.phase.exited": "종료됨",
192
+ "tab.phase.failed": "실패",
193
+ };
194
+ const fr = {
195
+ "shell.title": "Terminal par défaut",
196
+ "shell.description": "Terminal utilisé par l'outil shell",
197
+ "shell.powershell": "PowerShell",
198
+ "shell.gitbash": "Git Bash",
199
+ "shell.msys2": "MSYS2",
200
+ "shell.wsl": "WSL",
201
+ "shell.unavailable": "Paramètres indisponibles: le pont de configuration de l'hôte n'a pas répondu",
202
+ "dock.title": "Terminal inférieur",
203
+ "dock.hint": "Ces interrupteurs ne concernent que le terminal du dock bas. Le terminal officiel de droite et les outils du modèle restent inchangés.",
204
+ "dock.state.available": "Disponible",
205
+ "dock.state.notInstalled": "Non détecté",
206
+ "dock.state.noDistro": "Aucune distribution installée",
207
+ "dock.state.launcherOnly": "Seuls des lanceurs ont été trouvés; intégration impossible",
208
+ "dock.powershell.locked": "PowerShell sert de repli final et ne peut pas être désactivé.",
209
+ "dock.defaultChoice": "Shell par défaut (seuls les choix activés et disponibles sont listés)",
210
+ "dock.wslDistro": "Distribution WSL (vide = distribution WSL par défaut)",
211
+ "dock.fallback.notice": "{from} n'est pas disponible actuellement, ce terminal a donc démarré avec {to}.",
212
+ "dock.floor.notice": "Tous les shells sont désactivés ou indisponibles, repli sur {to}.",
213
+ "dock.unavailable.noPty": "Aucun backend PTY disponible : node-pty n'est pas construit et l'hôte n'expose pas de seam terminal (exécutez pnpm approve-builds).",
214
+ "dock.unavailable.noSocket": "L'hôte n'expose pas de route d'amélioration WebSocket; le terminal inférieur ne peut pas recevoir de sortie.",
215
+ "dock.unavailable.notInstalled": "L'hôte n'a pas encore monté les routes du terminal; aucun terminal inférieur n'est proposé.",
216
+ "dock.hostProvided": "Le terminal de l'hôte prend la main; ce plugin s'est effacé.",
217
+ "dock.applying": "Enregistrement…",
218
+ "dock.failed": "Écriture échouée : {message}",
219
+ "dock.terminals": "{count} terminal(aux) en cours",
220
+ "dock.refresh": "Redétecter",
221
+ "dock.enabled.title": "Activer le terminal inférieur",
222
+ "dock.enabled.description": "Interrupteur principal. Désactivé, il masque les sous-interrupteurs shell et refuse les allocations",
223
+ "dock.enabled.off": "Désactivé. Les sous-interrupteurs des shells disponibles apparaissent une fois activé",
224
+ "dock.shim.title": "Reprendre la ligne de terminal officielle",
225
+ "dock.shim.description": "À activer seulement si l’hôte n’a pas de contrôleur de terminal. Publier deux fois le même nom de service fait échouer l’autre fournisseur ; désactivé par défaut.",
226
+ "dock.shim.published": "Reprise : la ligne « Terminal » officielle est désormais alimentée par ce plugin",
227
+ "dock.shim.hostProvides": "L’hôte publie déjà webTerminals ; aucune reprise (la ligne officielle fonctionne déjà)",
228
+ "dock.state.floor": "repli",
229
+ "tab.title": "Terminal (multi-shell)",
230
+ "tab.description": "Ouvre Git Bash / MSYS2 / WSL / PowerShell sur le backend PTY de ce plugin, à côté du terminal officiel",
231
+ "tab.new": "Nouveau",
232
+ "tab.noShell": "Aucun shell disponible (activez-en un dans les paramètres)",
233
+ "tab.phase.allocating": "allocation",
234
+ "tab.phase.connecting": "connexion",
235
+ "tab.phase.running": "en cours",
236
+ "tab.phase.exited": "terminé",
237
+ "tab.phase.failed": "échec",
238
+ };
239
+ const de = {
240
+ "shell.title": "Standardterminal",
241
+ "shell.description": "Terminal für den Shell-Befehl",
242
+ "shell.powershell": "PowerShell",
243
+ "shell.gitbash": "Git Bash",
244
+ "shell.msys2": "MSYS2",
245
+ "shell.wsl": "WSL",
246
+ "shell.unavailable": "Einstellungen nicht verfügbar: Die Konfigurationsbrücke des Hosts hat nicht geantwortet",
247
+ "dock.title": "Unteres Terminal",
248
+ "dock.hint": "Diese Schalter betreffen nur das Terminal im unteren Dock. Das offizielle rechte Terminal und die Modellwerkzeuge bleiben unberührt.",
249
+ "dock.state.available": "Verfügbar",
250
+ "dock.state.notInstalled": "Nicht gefunden",
251
+ "dock.state.noDistro": "Keine Distribution installiert",
252
+ "dock.state.launcherOnly": "Nur Launcher gefunden; Einbettung nicht möglich",
253
+ "dock.powershell.locked": "PowerShell ist die letzte Rückfallmöglichkeit und kann nicht deaktiviert werden.",
254
+ "dock.defaultChoice": "Standard-Shell (nur aktivierte und verfügbare Auswahl wird angezeigt)",
255
+ "dock.wslDistro": "WSL-Distribution (leer = WSL-Standard)",
256
+ "dock.fallback.notice": "{from} ist derzeit nicht verfügbar, dieses Terminal wurde mit {to} gestartet.",
257
+ "dock.floor.notice": "Alle Shells sind deaktiviert oder unavailable, Rückfall auf {to}.",
258
+ "dock.unavailable.noPty": "Kein PTY-Backend verfügbar: node-pty ist nicht gebaut und der Host bietet keine Terminal-Naht (pnpm approve-builds ausführen).",
259
+ "dock.unavailable.noSocket": "Der Host stellt keinen WebSocket-Upgrade-Pfad bereit, das untere Terminal erhält keine Ausgabe.",
260
+ "dock.unavailable.notInstalled": "Der Host hat die Terminal-Routen noch nicht eingebunden; kein unteres Terminal verfügbar.",
261
+ "dock.hostProvided": "Das Host-Terminal übernimmt; dieses Plugin hat sich zurückgezogen.",
262
+ "dock.applying": "Speichern…",
263
+ "dock.failed": "Schreibvorgang fehlgeschlagen: {message}",
264
+ "dock.terminals": "{count} Terminal(s) laufen",
265
+ "dock.refresh": "Erneut prüfen",
266
+ "dock.enabled.title": "Unteres Terminal aktivieren",
267
+ "dock.enabled.description": "Hauptschalter. Aus blendet die Shell-Unterschalter aus und verhindert Zuteilungen",
268
+ "dock.enabled.off": "Aus. Die Unterschalter der verfügbaren Shells erscheinen beim Einschalten",
269
+ "dock.shim.title": "Offizielle Terminalzeile übernehmen",
270
+ "dock.shim.description": "Nur aktivieren, wenn der Host keinen Terminal-Controller hat. Doppelte Registrierung desselben Dienstes lässt den anderen Anbieter scheitern; daher standardmäßig aus.",
271
+ "dock.shim.published": "Übernommen: die offizielle Zeile „Terminal“ wird von diesem Plugin versorgt",
272
+ "dock.shim.hostProvides": "Der Host stellt bereits webTerminals bereit; keine Übernahme (die offizielle Zeile funktioniert bereits)",
273
+ "dock.state.floor": "Rückfall",
274
+ "tab.title": "Terminal (mehrere Shells)",
275
+ "tab.description": "Öffnet Git Bash / MSYS2 / WSL / PowerShell über das PTY-Backend dieses Plugins, neben dem offiziellen Terminal",
276
+ "tab.new": "Neu",
277
+ "tab.noShell": "Kein Shell verfügbar (bitte in den Einstellungen aktivieren)",
278
+ "tab.phase.allocating": "Zuteilung",
279
+ "tab.phase.connecting": "Verbindung",
280
+ "tab.phase.running": "läuft",
281
+ "tab.phase.exited": "beendet",
282
+ "tab.phase.failed": "fehlgeschlagen",
283
+ };
284
+ const it = {
285
+ "shell.title": "Terminale predefinito",
286
+ "shell.description": "Terminale usato dal comando shell",
287
+ "shell.powershell": "PowerShell",
288
+ "shell.gitbash": "Git Bash",
289
+ "shell.msys2": "MSYS2",
290
+ "shell.wsl": "WSL",
291
+ "shell.unavailable": "Impostazioni non disponibili: il bridge di configurazione dell'host non ha risposto",
292
+ "dock.title": "Terminale inferiore",
293
+ "dock.hint": "Questi interruttori riguardano solo il terminale nella barra inferiore. Il terminale ufficiale a destra e gli strumenti del modello non cambiano.",
294
+ "dock.state.available": "Disponibile",
295
+ "dock.state.notInstalled": "Non trovato",
296
+ "dock.state.noDistro": "Nessuna distribuzione installata",
297
+ "dock.state.launcherOnly": "Trovato solo un launcher; incorporamento non possibile",
298
+ "dock.powershell.locked": "PowerShell è il ripiego finale e non può essere disattivato.",
299
+ "dock.defaultChoice": "Shell predefinita (solo le scelte attive e disponibili sono elencate)",
300
+ "dock.wslDistro": "Distribuzione WSL (vuoto usa il predefinito WSL)",
301
+ "dock.fallback.notice": "{from} non è disponibile al momento, questo terminale è avviato con {to}.",
302
+ "dock.floor.notice": "Tutte le shell sono spente o non disponibili, ripiego su {to}.",
303
+ "dock.unavailable.noPty": "Nessun backend PTY disponibile: node-pty non è compilato e l'host non espone una terminal seam (eseguire pnpm approve-builds).",
304
+ "dock.unavailable.noSocket": "L'host non espone un percorso di upgrade WebSocket, il terminale inferiore non riceve output.",
305
+ "dock.unavailable.notInstalled": "L'host non ha ancora montato i percorsi del terminale; nessun terminale inferiore disponibile.",
306
+ "dock.hostProvided": "Il terminale dell'host è attivo; questo plugin si è fatto da parte.",
307
+ "dock.applying": "Salvataggio…",
308
+ "dock.failed": "Scrittura fallita: {message}",
309
+ "dock.terminals": "{count} terminale/i in esecuzione",
310
+ "dock.refresh": "Rileva di nuovo",
311
+ "dock.enabled.title": "Abilita terminale inferiore",
312
+ "dock.enabled.description": "Interruttore principale: se spento nasconde gli interruttori delle shell e rifiuta le allocazioni",
313
+ "dock.enabled.off": "Spento. Gli interruttori delle shell disponibili compaiono accendendolo",
314
+ "dock.shim.title": "Riprendi la riga del terminale ufficiale",
315
+ "dock.shim.description": "Attivare solo se l’host non ha un controller del terminale. Pubblicare due volte lo stesso servizio fa fallire l’altro fornitore; disattivato per impostazione predefinita.",
316
+ "dock.shim.published": "Ripresa: la riga “Terminale” ufficiale è ora alimentata da questo plugin",
317
+ "dock.shim.hostProvides": "L’host pubblica già webTerminals; nessun recupero (la riga ufficiale funziona già)",
318
+ "dock.state.floor": "ripiego",
319
+ "tab.title": "Terminale (più shell)",
320
+ "tab.description": "Apre Git Bash / MSYS2 / WSL / PowerShell sul backend PTY di questo plugin, accanto al terminale ufficiale",
321
+ "tab.new": "Nuovo",
322
+ "tab.noShell": "Nessuna shell disponibile (attivarne una nelle impostazioni)",
323
+ "tab.phase.allocating": "allocazione",
324
+ "tab.phase.connecting": "connessione",
325
+ "tab.phase.running": "in esecuzione",
326
+ "tab.phase.exited": "uscito",
327
+ "tab.phase.failed": "fallito",
328
+ };
329
+ const ru = {
330
+ "shell.title": "Терминал по умолчанию",
331
+ "shell.description": "Терминал для команд оболочки",
332
+ "shell.powershell": "PowerShell",
333
+ "shell.gitbash": "Git Bash",
334
+ "shell.msys2": "MSYS2",
335
+ "shell.wsl": "WSL",
336
+ "shell.unavailable": "Настройки недоступны: мост конфигурации хоста не ответил",
337
+ "dock.title": "Нижний терминал",
338
+ "dock.hint": "Эти переключатели влияют только на терминал в нижней панели. Официальный правый терминал и инструменты модели не меняются.",
339
+ "dock.state.available": "Доступен",
340
+ "dock.state.notInstalled": "Не найден",
341
+ "dock.state.noDistro": "Нет установленных дистрибутивов",
342
+ "dock.state.launcherOnly": "Найден только лаунчер, встраивание невозможно",
343
+ "dock.powershell.locked": "PowerShell — резервный вариант, его нельзя отключить.",
344
+ "dock.defaultChoice": "Оболочка по умолчанию (показаны только активные и доступные)",
345
+ "dock.wslDistro": "Дистрибутив WSL (пусто — default из WSL)",
346
+ "dock.fallback.notice": "{from} сейчас недоступен, поэтому терминал запущен с {to}.",
347
+ "dock.floor.notice": "Все оболочки отключены или недоступны, использован резерв {to}.",
348
+ "dock.unavailable.noPty": "Нет доступного PTY-бэкенда: node-pty не собран и хост не предоставляет terminal seam (выполните pnpm approve-builds).",
349
+ "dock.unavailable.noSocket": "Хост не предоставляет маршрут обновления WebSocket, нижний терминал не получит вывод.",
350
+ "dock.unavailable.notInstalled": "Хост ещё не подключил маршруты терминала, нижний терминал недоступен.",
351
+ "dock.hostProvided": "Терминал хоста действует; этот плагин уступил.",
352
+ "dock.applying": "Сохранение…",
353
+ "dock.failed": "Ошибка записи: {message}",
354
+ "dock.terminals": "Выполняется {count} терминал(ов)",
355
+ "dock.refresh": "Проверить снова",
356
+ "dock.enabled.title": "Включить нижний терминал",
357
+ "dock.enabled.description": "Главный переключатель: выключенный скрывает дочерние переключатели оболочек и запрещает выделения",
358
+ "dock.enabled.off": "Выключено. Дочерние переключатели доступных оболочек появятся при включении",
359
+ "dock.shim.title": "Перенять строку официального терминала",
360
+ "dock.shim.description": "Включайте только если у хоста нет контроллера терминала. Двойная регистрация одного и того же сервиса приводит к сбою у другого; по умолчанию выключено.",
361
+ "dock.shim.published": "Перенято: строка «Терминал» теперь обслуживается этим плагином",
362
+ "dock.shim.hostProvides": "Хост уже публикует webTerminals, перенимать нечего (официальная строка работает)",
363
+ "dock.state.floor": "резерв",
364
+ "tab.title": "Терминал (несколько оболочек)",
365
+ "tab.description": "Открывает Git Bash / MSYS2 / WSL / PowerShell поверх PTY-бэкенда этого плагина, рядом с официальным терминалом",
366
+ "tab.new": "Создать",
367
+ "tab.noShell": "Нет доступной оболочки (включите в настройках)",
368
+ "tab.phase.allocating": "выделение",
369
+ "tab.phase.connecting": "подключение",
370
+ "tab.phase.running": "работает",
371
+ "tab.phase.exited": "завершено",
372
+ "tab.phase.failed": "ошибка",
373
+ };
374
+ const es = {
375
+ "shell.title": "Terminal predeterminada",
376
+ "shell.description": "Terminal usada por el comando shell",
377
+ "shell.powershell": "PowerShell",
378
+ "shell.gitbash": "Git Bash",
379
+ "shell.msys2": "MSYS2",
380
+ "shell.wsl": "WSL",
381
+ "shell.unavailable": "Configuración no disponible: el puente de configuración del host no respondió",
382
+ "dock.title": "Terminal inferior",
383
+ "dock.hint": "Estos interruptores solo afectan al terminal del panel inferior. El terminal oficial derecho y las herramientas del modelo no cambian.",
384
+ "dock.state.available": "Disponible",
385
+ "dock.state.notInstalled": "No detectado",
386
+ "dock.state.noDistro": "Sin distribución instalada",
387
+ "dock.state.launcherOnly": "Solo se encontró un lanzador; no se puede incrustar",
388
+ "dock.powershell.locked": "PowerShell es el respaldo final y no puede desactivarse.",
389
+ "dock.defaultChoice": "Shell predeterminada (solo se listan las activas y disponibles)",
390
+ "dock.wslDistro": "Distribución WSL (vacío usa la predeterminada de WSL)",
391
+ "dock.fallback.notice": "{from} no está disponible ahora, así que este terminal se inició con {to}.",
392
+ "dock.floor.notice": "Todas las shells están apagadas o no disponibles; se usó {to} como respaldo.",
393
+ "dock.unavailable.noPty": "No hay backend PTY disponible: node-pty no se compiló y el host no expone terminal seam (ejecuta pnpm approve-builds).",
394
+ "dock.unavailable.noSocket": "El host no expone una ruta de actualización WebSocket; el terminal inferior no recibe salida.",
395
+ "dock.unavailable.notInstalled": "El host aún no ha montado las rutas del terminal; no se ofrece terminal inferior.",
396
+ "dock.hostProvided": "El terminal del host está a cargo; este plugin se hizo a un lado.",
397
+ "dock.applying": "Guardando…",
398
+ "dock.failed": "Fallo de escritura: {message}",
399
+ "dock.terminals": "{count} terminal(es) en ejecución",
400
+ "dock.refresh": "Volver a detectar",
401
+ "dock.enabled.title": "Activar terminal inferior",
402
+ "dock.enabled.description": "Interruptor principal: apagado oculta los sub-interruptores de shells y rechaza asignaciones",
403
+ "dock.enabled.off": "Apagado. Los sub-interruptores de las shells disponibles aparecen al encenderlo",
404
+ "dock.shim.title": "Relevar la fila de terminal oficial",
405
+ "dock.shim.description": "Actívelo solo si el host no tiene controlador de terminal. Publicar dos veces el mismo servicio hace fallar al otro proveedor; desactivado por defecto.",
406
+ "dock.shim.published": "Relevada: la fila «Terminal» oficial ahora la alimenta este plugin",
407
+ "dock.shim.hostProvides": "El host ya publica webTerminals; no se relevó nada (la fila oficial ya funciona)",
408
+ "dock.state.floor": "respaldo",
409
+ "tab.title": "Terminal (multi-shell)",
410
+ "tab.description": "Abre Git Bash / MSYS2 / WSL / PowerShell sobre el backend PTY de este plugin, junto al terminal oficial",
411
+ "tab.new": "Nuevo",
412
+ "tab.noShell": "Ninguna shell disponible (activa una en ajustes)",
413
+ "tab.phase.allocating": "asignando",
414
+ "tab.phase.connecting": "conectando",
415
+ "tab.phase.running": "en ejecución",
416
+ "tab.phase.exited": "terminado",
417
+ "tab.phase.failed": "falló",
418
+ };
419
+ /** The registered dictionary, one row per host language. */
420
+ export const dictionaries = { zh, en, ja, ko, fr, de, it, ru, es };
421
+ /** The Chinese fallback used when the host exposes no `locale.bind` (0.1.0/0.1.1). */
422
+ export const fallbackDict = { ...zh };
@@ -0,0 +1,20 @@
1
+ /** The surface this host offers the plugin's settings. */
2
+ export type SettingsSurface = "unknown" | "page" | "none";
3
+ /** The settings-service capabilities the classification reads. */
4
+ export interface SettingsSurfaceProbe {
5
+ register?: unknown;
6
+ installSection?: unknown;
7
+ }
8
+ /**
9
+ * Classify a settings service by what it exposes.
10
+ *
11
+ * Exported separately from `reportSettingsSurface` so every branch is testable without a
12
+ * host: the order matters. `installSection` outranks `register` because its presence is
13
+ * the 0.1.2 generation, which does have a page; only a line with `register` and no
14
+ * `installSection` is the first generation.
15
+ */
16
+ export declare function classifySettingsService(svc: SettingsSurfaceProbe | undefined): SettingsSurface;
17
+ /** Record the answer for the route handler and return it. */
18
+ export declare function reportSettingsSurface(svc: SettingsSurfaceProbe | undefined): SettingsSurface;
19
+ /** The last answer the host gave, or `unknown` before the settings service arrived. */
20
+ export declare function settingsSurface(): SettingsSurface;
@@ -0,0 +1,49 @@
1
+ // Which settings surface this host line actually renders.
2
+ //
3
+ // Why the plugin needs to know: the settings live on the bundle detail page and on the
4
+ // family tab, but 0.1.0-rc.x / 0.1.1-rc.x declare the whole `settings.*` slot map while
5
+ // shipping **no page that renders it** - a card registered there is a card nobody can
6
+ // open, and the only surface that paints is a shell-level overlay the plugin brings
7
+ // itself. Showing that overlay on newer lines instead would put a third settings surface
8
+ // over a working page, so it has to be conditional, and "which line am I on" must be
9
+ // answered by capability rather than by a version string.
10
+ //
11
+ // The three generations are mutually exclusive on the settings SERVICE, which the plugin
12
+ // already receives through `ctx.inject(["settings"])`:
13
+ //
14
+ // 0.1.0 / 0.1.1 `register` yes, `installSection` no -> no settings page at all
15
+ // 0.1.2 / 0.1.5 `installSection` yes -> settings page exists
16
+ // 0.1.7+ / 0.2.0 neither (both removed with rc.1, #40) -> settings page exists
17
+ //
18
+ // Probing the service rather than importing `@deepseek-ai/dsh-settings` is deliberate:
19
+ // the host packages live in the application's own tree, not in the profile's
20
+ // `node_modules`, so a dynamic import from a plugin either fails (-> a permanent
21
+ // "unknown", i.e. no fallback on exactly the lines that need one) or resolves a *fetched
22
+ // copy* that is not the module the running host loaded. Both answers would be wrong.
23
+ let settled = "unknown";
24
+ /**
25
+ * Classify a settings service by what it exposes.
26
+ *
27
+ * Exported separately from `reportSettingsSurface` so every branch is testable without a
28
+ * host: the order matters. `installSection` outranks `register` because its presence is
29
+ * the 0.1.2 generation, which does have a page; only a line with `register` and no
30
+ * `installSection` is the first generation.
31
+ */
32
+ export function classifySettingsService(svc) {
33
+ if (svc === undefined)
34
+ return "unknown";
35
+ if (typeof svc.installSection === "function")
36
+ return "page";
37
+ if (typeof svc.register === "function")
38
+ return "none";
39
+ return "page";
40
+ }
41
+ /** Record the answer for the route handler and return it. */
42
+ export function reportSettingsSurface(svc) {
43
+ settled = classifySettingsService(svc);
44
+ return settled;
45
+ }
46
+ /** The last answer the host gave, or `unknown` before the settings service arrived. */
47
+ export function settingsSurface() {
48
+ return settled;
49
+ }
@@ -0,0 +1,2 @@
1
+ /** The four backends, in catalog order. */
2
+ export type ShellId = "powershell" | "gitbash" | "msys2" | "wsl";
@@ -0,0 +1,9 @@
1
+ // The shell identifier, in its own module on purpose.
2
+ //
3
+ // `shells.ts` needs `NodeJS.Platform` and the resolved-path types, so it belongs
4
+ // to the host compile graph only. The browser half still has to name the same
5
+ // four ids (in the socket frames and the catalog rows it renders), so the id type
6
+ // lives here - a module with no Node references at all, which is what lets it sit
7
+ // in both tsconfig graphs without dragging `@types/node` into the client purity
8
+ // gate.
9
+ export {};
@@ -0,0 +1,114 @@
1
+ import type { ResolvedPaths } from "./dsh-types.js";
2
+ import type { ShellId } from "./shell-id.js";
3
+ /** Re-exported so existing importers keep working (see shell-id.ts for why). */
4
+ export type { ShellId };
5
+ /** Catalog order = fallback order: powershell is BOTH first choice and floor. */
6
+ export declare const SHELL_PRIORITY: readonly ShellId[];
7
+ /** Why one backend is not launchable (drives the settings-row badge). */
8
+ export type ShellUnavailable = "installed" | "not-installed" | "no-distro" | "launcher-only";
9
+ /** One catalog row: what the UI shows and what the host would spawn. */
10
+ export interface ShellEntry {
11
+ readonly id: ShellId;
12
+ /** Display label (a catalog constant, never inferred from the file name). */
13
+ readonly label: string;
14
+ /** Resolved executable, absent when the backend is not usable. */
15
+ readonly path?: string;
16
+ readonly available: boolean;
17
+ readonly reason: ShellUnavailable;
18
+ /** The activation switch state (powershell is always true: the floor). */
19
+ readonly activated: boolean;
20
+ /** False only for powershell, which the user cannot turn off. */
21
+ readonly togglable: boolean;
22
+ /** Interactive argv, present only when `available`. */
23
+ readonly argv?: readonly string[];
24
+ }
25
+ /** The activation switches as persisted in the plugin config. */
26
+ export interface ShellSwitches {
27
+ gitbash: boolean;
28
+ msys2: boolean;
29
+ wsl: boolean;
30
+ }
31
+ /** Everything the catalog builder needs from the outside world. */
32
+ export interface CatalogFacts {
33
+ /** Resolved executables (config override or candidate-list winner). */
34
+ paths: ResolvedPaths;
35
+ /** Whether one path is a launchable file. */
36
+ fsProbe(path: string): boolean;
37
+ /** `wsl -l -q` output. `undefined` means the probe could not answer (a timeout
38
+ * is not evidence of absence); `[]` means it answered "no distro installed". */
39
+ readonly distros: readonly string[] | undefined;
40
+ switches: ShellSwitches;
41
+ /** WSL distro override from config ('' = the WSL default). */
42
+ wslDistro: string;
43
+ }
44
+ /**
45
+ * `<SystemRoot>\System32\bash.exe` (and the sysnative mirror) is the deprecated
46
+ * WSL forwarder, not a shell. `candidateGitBashPaths` already skips it; this
47
+ * guard protects the second way a path reaches the catalog - a user-supplied
48
+ * `gitBashPath` / `msys2Path` config value.
49
+ */
50
+ export declare function isWslLegacyBash(path: string): boolean;
51
+ /**
52
+ * Console-allocating launchers: `git-bash.exe`, `msys2.exe`, `msys2_shell.cmd`.
53
+ * They open their own window and return zero bytes on a piped stdio (measured
54
+ * against MSYS2 with bash 5.3.15), so they can never host an embedded terminal.
55
+ */
56
+ export declare function isConsoleLauncher(path: string): boolean;
57
+ /**
58
+ * Interactive argv for the BROWSER terminal.
59
+ *
60
+ * Differences from the tool's `terminalArgv`: PowerShell keeps its profile (the
61
+ * user's aliases and prompt are the point of a UI terminal), and the three bash
62
+ * families are unchanged because those rules are about the shell itself:
63
+ * Git Bash needs `-i`, MSYS2 needs `-l` and NEVER `-lc` (this argv carries no
64
+ * command, and `bash -lc` with no operand exits 2), WSL needs `-- bash -i` on the
65
+ * default distro (bare `-e` fails under ConPTY with RPC 0x8007072c).
66
+ */
67
+ export declare function uiArgv(shell: ShellId, paths: ResolvedPaths, wslDistro?: string): string[];
68
+ /**
69
+ * Environment for the BROWSER terminal: the host process environment plus a real
70
+ * terminal type. `buildEnv` is deliberately NOT reused - it layers
71
+ * `TERM=dumb`/`NO_COLOR=1`/`PAGER=cat` over an agent-scoped map, which is right
72
+ * for a one-shot tool call and wrong for an interactive screen.
73
+ *
74
+ * The one rule carried over is MSYS2's `MSYSTEM`: without it MSYS2 starts in the
75
+ * bare MSYS environment and `/etc/profile` never puts `/mingw64/bin` on PATH, so
76
+ * gcc/make are missing in the very shell the user chose to get them from. An
77
+ * explicit value in the base environment wins, exactly as in `buildEnv`.
78
+ */
79
+ export declare function uiEnv(shell: ShellId, baseEnv: NodeJS.ProcessEnv): Record<string, string | undefined>;
80
+ /**
81
+ * The catalog the settings page and the spawn path both read.
82
+ *
83
+ * `powershell` is never `activated: false` even if a switch said so: it is the
84
+ * floor of the fallback chain (R2/R6), and a floor that can be removed is not a
85
+ * floor. The caller sees that through `togglable: false`.
86
+ */
87
+ export declare function buildCatalog(facts: CatalogFacts): ShellEntry[];
88
+ /** The result of resolving which shell a terminal should start with. */
89
+ export interface ResolvedDefault {
90
+ readonly id: ShellId | "cmd";
91
+ readonly path: string;
92
+ readonly argv: readonly string[];
93
+ /** True when the stored value was replaced (the UI shows why). */
94
+ readonly fellBack: boolean;
95
+ /** True when nothing is activated and the floor was used. */
96
+ readonly floor: boolean;
97
+ /** The stored value that was not honoured, when there was one. */
98
+ readonly from?: string;
99
+ }
100
+ /**
101
+ * Decide the shell for one allocation (R4/R5/R6).
102
+ *
103
+ * Three distinct outcomes, because the UI has to say different things about them:
104
+ * - `""` means the user never chose: take the first candidate, no notice;
105
+ * - a non-empty value outside the candidates means the choice went stale (a
106
+ * switch was turned off, or a shell was uninstalled): fall back AND report
107
+ * `fellBack` with the original value;
108
+ * - no candidate at all: the floor is PowerShell's own chain (pwsh 7 -> Windows
109
+ * PowerShell), and `cmd.exe` is the last resort when even that is gone.
110
+ *
111
+ * The stored config is never rewritten here - a fallback that persists would
112
+ * silently eat the user's choice.
113
+ */
114
+ export declare function resolveDefaultShell(catalog: readonly ShellEntry[], configured: string, paths: ResolvedPaths): ResolvedDefault;