dsh-better-workspace 0.32.1 → 0.33.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 +1 -1
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
- package/src/client.js +255 -98
package/README.md
CHANGED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
<table>
|
|
56
56
|
<tr>
|
|
57
57
|
<td align="center" width="58%"><img src="docs/screenshots/5-context-menu.png" alt="右键菜单"/></td>
|
|
58
|
-
<td valign="top"><b>右键菜单</b><br/>操作都收进右键:工作区行——重命名 / 删除 / 分叉 / 归档 / 自定义外观 / <b>修改工作区默认预设</b>(v0.32.0 起,改写该工作区常驻新会话所用的 agent
|
|
58
|
+
<td valign="top"><b>右键菜单</b><br/>操作都收进右键:工作区行——重命名 / 删除 / 分叉 / 归档 / 自定义外观 / <b>修改工作区默认预设</b>(v0.32.0 起,改写该工作区常驻新会话所用的 agent 预设,走官方同一通道;内置预设显示官方本地化名——标准模式 / PTC 模式 / 极简模式 / 创造模式,v0.33.0 起;工作区暂无待命新会话时,确认后会预备一个带所选预设的新会话作为该工作区默认);工作区分组行——重命名分组(同步更新组内所有工作区名称)/ 自定义外观;会话与会话分组行——重命名 / 分叉 / 归档 / 自定义外观;会话行另有<b>复制 Session ID</b>(v0.30.0 起,对齐 dsh 0.2.1-alpha.5 官方会话菜单第五项——写剪贴板走宿主原语,复制成功与否均有提示)。</td>
|
|
59
59
|
</tr>
|
|
60
60
|
</table>
|
|
61
61
|
|
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-external/dsh-better-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树。Workspace tree for the DSH sidebar workspace list, nested by official disk folders with optional \"/\"-name grouping; the New Session workspace picker shows the same tree.",
|
|
6
6
|
"engines": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-better-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树(同一份视图选项即时同步);添加工作区走官方目录流。Workspace tree for the DSH sidebar: disk-path nesting (official workspace-tree semantics), with optional \"/\"-name grouping (off by default), and the same tree in the New Session workspace picker; add-workspace rides the official directory flow.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
package/src/client.js
CHANGED
|
@@ -90,7 +90,11 @@ window.__ModuleLoader__.load({
|
|
|
90
90
|
'wsPreset.title': '修改工作区默认预设',
|
|
91
91
|
'wsPreset.current': '当前默认预设',
|
|
92
92
|
'wsPreset.currentUnknown': '当前预设未知',
|
|
93
|
-
'
|
|
93
|
+
'presetStandardName': '标准模式',
|
|
94
|
+
'presetPtcName': 'PTC 模式',
|
|
95
|
+
'presetMinimalName': '极简模式',
|
|
96
|
+
'presetCordisName': '创造模式',
|
|
97
|
+
'wsPreset.createHint': '该工作区暂无待命的新会话,确认后将预备一个使用所选预设的新会话作为工作区默认',
|
|
94
98
|
'wsPreset.empty': '没有可用的预设',
|
|
95
99
|
'wsPreset.loadFailed': '预设列表读取失败',
|
|
96
100
|
'wsPreset.done': '已更新工作区默认预设',
|
|
@@ -257,7 +261,11 @@ window.__ModuleLoader__.load({
|
|
|
257
261
|
'wsPreset.title': 'Change workspace default preset',
|
|
258
262
|
'wsPreset.current': 'Current default preset',
|
|
259
263
|
'wsPreset.currentUnknown': 'Current preset unknown',
|
|
260
|
-
'
|
|
264
|
+
'presetStandardName': 'Standard mode',
|
|
265
|
+
'presetPtcName': 'PTC mode',
|
|
266
|
+
'presetMinimalName': 'Minimal mode',
|
|
267
|
+
'presetCordisName': 'Creator mode',
|
|
268
|
+
'wsPreset.createHint': 'No standing draft in this workspace; confirming prepares a new draft with the picked preset as the workspace default',
|
|
261
269
|
'wsPreset.empty': 'No presets available',
|
|
262
270
|
'wsPreset.loadFailed': 'Failed to load the preset list',
|
|
263
271
|
'wsPreset.done': 'Workspace default preset updated',
|
|
@@ -432,7 +440,11 @@ window.__ModuleLoader__.load({
|
|
|
432
440
|
'wsPreset.title': 'تغيير الإعداد المسبق الافتراضي لمساحة العمل',
|
|
433
441
|
'wsPreset.current': 'الإعداد المسبق الافتراضي الحالي',
|
|
434
442
|
'wsPreset.currentUnknown': 'الإعداد المسبق الحالي غير معروف',
|
|
435
|
-
'
|
|
443
|
+
'presetStandardName': 'الوضع القياسي',
|
|
444
|
+
'presetPtcName': 'وضع PTC',
|
|
445
|
+
'presetMinimalName': 'الوضع البسيط',
|
|
446
|
+
'presetCordisName': 'وضع المبدع',
|
|
447
|
+
'wsPreset.createHint': 'لا توجد جلسة جديدة بانتظار في مساحة العمل هذه؛ عند التأكيد سيُجهَّز جلسة جديدة بالإعداد المسبق المختار كافتراضي لمساحة العمل',
|
|
436
448
|
'wsPreset.empty': 'لا توجد إعدادات مسبقة متاحة',
|
|
437
449
|
'wsPreset.loadFailed': 'فشل تحميل قائمة الإعدادات المسبقة',
|
|
438
450
|
'wsPreset.done': 'تم تحديث الإعداد المسبق الافتراضي لمساحة العمل',
|
|
@@ -599,7 +611,11 @@ window.__ModuleLoader__.load({
|
|
|
599
611
|
'wsPreset.title': 'Workspace-Standardpreset ändern',
|
|
600
612
|
'wsPreset.current': 'Aktueller Standardpreset',
|
|
601
613
|
'wsPreset.currentUnknown': 'Aktueller Preset unbekannt',
|
|
602
|
-
'
|
|
614
|
+
'presetStandardName': 'Standardmodus',
|
|
615
|
+
'presetPtcName': 'PTC-Modus',
|
|
616
|
+
'presetMinimalName': 'Minimalmodus',
|
|
617
|
+
'presetCordisName': 'Kreativmodus',
|
|
618
|
+
'wsPreset.createHint': 'Kein wartender Sitzungsentwurf in diesem Workspace; nach dem Bestätigen wird ein neuer Entwurf mit dem gewählten Preset als Workspace-Standard vorbereitet',
|
|
603
619
|
'wsPreset.empty': 'Keine Presets verfügbar',
|
|
604
620
|
'wsPreset.loadFailed': 'Preset-Liste konnte nicht geladen werden',
|
|
605
621
|
'wsPreset.done': 'Workspace-Standardpreset aktualisiert',
|
|
@@ -766,7 +782,11 @@ window.__ModuleLoader__.load({
|
|
|
766
782
|
'wsPreset.title': 'Modifier le préréglage par défaut du workspace',
|
|
767
783
|
'wsPreset.current': 'Préréglage par défaut actuel',
|
|
768
784
|
'wsPreset.currentUnknown': 'Préréglage actuel inconnu',
|
|
769
|
-
'
|
|
785
|
+
'presetStandardName': 'Mode standard',
|
|
786
|
+
'presetPtcName': 'Mode PTC',
|
|
787
|
+
'presetMinimalName': 'Mode minimal',
|
|
788
|
+
'presetCordisName': 'Mode créateur',
|
|
789
|
+
'wsPreset.createHint': 'Aucune nouvelle session en attente dans ce workspace ; la confirmation prépare une nouvelle session avec le préréglage choisi comme valeur par défaut',
|
|
770
790
|
'wsPreset.empty': 'Aucun préréglage disponible',
|
|
771
791
|
'wsPreset.loadFailed': 'Échec du chargement de la liste des préréglages',
|
|
772
792
|
'wsPreset.done': 'Préréglage par défaut du workspace mis à jour',
|
|
@@ -933,7 +953,11 @@ window.__ModuleLoader__.load({
|
|
|
933
953
|
'wsPreset.title': 'वर्कस्पेस डिफ़ॉल्ट प्रीसेट बदलें',
|
|
934
954
|
'wsPreset.current': 'वर्तमान डिफ़ॉल्ट प्रीसेट',
|
|
935
955
|
'wsPreset.currentUnknown': 'वर्तमान प्रीसेट अज्ञात',
|
|
936
|
-
'
|
|
956
|
+
'presetStandardName': 'मानक मोड',
|
|
957
|
+
'presetPtcName': 'PTC मोड',
|
|
958
|
+
'presetMinimalName': 'मिनिमल मोड',
|
|
959
|
+
'presetCordisName': 'क्रिएटर मोड',
|
|
960
|
+
'wsPreset.createHint': 'इस वर्कस्पेस में कोई प्रतीक्षारत नया सेशन नहीं है; पुष्टि करने पर चयनित प्रीसेट के साथ एक नया सेशन वर्कस्पेस डिफ़ॉल्ट के रूप में तैयार किया जाएगा',
|
|
937
961
|
'wsPreset.empty': 'कोई प्रीसेट उपलब्ध नहीं',
|
|
938
962
|
'wsPreset.loadFailed': 'प्रीसेट सूची लोड करने में विफल',
|
|
939
963
|
'wsPreset.done': 'वर्कस्पेस डिफ़ॉल्ट प्रीसेट अपडेट हुआ',
|
|
@@ -1100,7 +1124,11 @@ window.__ModuleLoader__.load({
|
|
|
1100
1124
|
'wsPreset.title': 'Ubah preset bawaan ruang kerja',
|
|
1101
1125
|
'wsPreset.current': 'Preset bawaan saat ini',
|
|
1102
1126
|
'wsPreset.currentUnknown': 'Preset saat ini tidak diketahui',
|
|
1103
|
-
'
|
|
1127
|
+
'presetStandardName': 'Mode standar',
|
|
1128
|
+
'presetPtcName': 'Mode PTC',
|
|
1129
|
+
'presetMinimalName': 'Mode minimal',
|
|
1130
|
+
'presetCordisName': 'Mode kreator',
|
|
1131
|
+
'wsPreset.createHint': 'Tidak ada sesi baru yang menunggu di ruang kerja ini; setelah dikonfirmasi, sesi baru dengan prasetel pilihan akan disiapkan sebagai bawaan ruang kerja',
|
|
1104
1132
|
'wsPreset.empty': 'Tidak ada preset yang tersedia',
|
|
1105
1133
|
'wsPreset.loadFailed': 'Gagal memuat daftar preset',
|
|
1106
1134
|
'wsPreset.done': 'Preset bawaan ruang kerja diperbarui',
|
|
@@ -1267,7 +1295,11 @@ window.__ModuleLoader__.load({
|
|
|
1267
1295
|
'wsPreset.title': 'Modifica il preset predefinito dello workspace',
|
|
1268
1296
|
'wsPreset.current': 'Preset predefinito attuale',
|
|
1269
1297
|
'wsPreset.currentUnknown': 'Preset attuale sconosciuto',
|
|
1270
|
-
'
|
|
1298
|
+
'presetStandardName': 'Modalità standard',
|
|
1299
|
+
'presetPtcName': 'Modalità PTC',
|
|
1300
|
+
'presetMinimalName': 'Modalità minimale',
|
|
1301
|
+
'presetCordisName': 'Modalità creatore',
|
|
1302
|
+
'wsPreset.createHint': 'Nessuna nuova sessione in attesa in questo workspace; confermando verrà preparata una nuova sessione con il preset scelto come predefinito del workspace',
|
|
1271
1303
|
'wsPreset.empty': 'Nessun preset disponibile',
|
|
1272
1304
|
'wsPreset.loadFailed': 'Impossibile caricare la lista dei preset',
|
|
1273
1305
|
'wsPreset.done': 'Preset predefinito dello workspace aggiornato',
|
|
@@ -1434,7 +1466,11 @@ window.__ModuleLoader__.load({
|
|
|
1434
1466
|
'wsPreset.title': 'ワークスペース既定プリセットを変更',
|
|
1435
1467
|
'wsPreset.current': '現在の既定プリセット',
|
|
1436
1468
|
'wsPreset.currentUnknown': '現在のプリセットは不明',
|
|
1437
|
-
'
|
|
1469
|
+
'presetStandardName': '標準モード',
|
|
1470
|
+
'presetPtcName': 'PTC モード',
|
|
1471
|
+
'presetMinimalName': 'ミニマルモード',
|
|
1472
|
+
'presetCordisName': 'クリエイターモード',
|
|
1473
|
+
'wsPreset.createHint': 'このワークスペースには待機中の新規セッションがありません。確定すると、選択したプリセットで新しいセッションをワークスペースの既定として用意します',
|
|
1438
1474
|
'wsPreset.empty': '利用可能なプリセットがありません',
|
|
1439
1475
|
'wsPreset.loadFailed': 'プリセット一覧の読み込みに失敗しました',
|
|
1440
1476
|
'wsPreset.done': 'ワークスペース既定プリセットを更新しました',
|
|
@@ -1601,7 +1637,11 @@ window.__ModuleLoader__.load({
|
|
|
1601
1637
|
'wsPreset.title': '작업 공간 기본 프리셋 변경',
|
|
1602
1638
|
'wsPreset.current': '현재 기본 프리셋',
|
|
1603
1639
|
'wsPreset.currentUnknown': '현재 프리셋을 알 수 없음',
|
|
1604
|
-
'
|
|
1640
|
+
'presetStandardName': '표준 모드',
|
|
1641
|
+
'presetPtcName': 'PTC 모드',
|
|
1642
|
+
'presetMinimalName': '미니멀 모드',
|
|
1643
|
+
'presetCordisName': '크리에이터 모드',
|
|
1644
|
+
'wsPreset.createHint': '이 작업 공간에는 대기 중인 새 세션이 없습니다. 확인하면 선택한 프리셋으로 새 세션을 준비해 작업 공간 기본값으로 사용합니다',
|
|
1605
1645
|
'wsPreset.empty': '사용 가능한 프리셋이 없습니다',
|
|
1606
1646
|
'wsPreset.loadFailed': '프리셋 목록을 불러오지 못했습니다',
|
|
1607
1647
|
'wsPreset.done': '작업 공간 기본 프리셋이 업데이트되었습니다',
|
|
@@ -1768,7 +1808,11 @@ window.__ModuleLoader__.load({
|
|
|
1768
1808
|
'wsPreset.title': 'Standaardpreset van workspace wijzigen',
|
|
1769
1809
|
'wsPreset.current': 'Huidige standaardpreset',
|
|
1770
1810
|
'wsPreset.currentUnknown': 'Huidige preset onbekend',
|
|
1771
|
-
'
|
|
1811
|
+
'presetStandardName': 'Standaardmodus',
|
|
1812
|
+
'presetPtcName': 'PTC-modus',
|
|
1813
|
+
'presetMinimalName': 'Minimale modus',
|
|
1814
|
+
'presetCordisName': 'Creatormodus',
|
|
1815
|
+
'wsPreset.createHint': 'Geen wachtende nieuwe sessie in deze workspace; bij bevestigen wordt een nieuwe sessie met de gekozen preset als workspace-standaard voorbereid',
|
|
1772
1816
|
'wsPreset.empty': 'Geen presets beschikbaar',
|
|
1773
1817
|
'wsPreset.loadFailed': 'Laden van de presetlijst is mislukt',
|
|
1774
1818
|
'wsPreset.done': 'Standaardpreset van workspace bijgewerkt',
|
|
@@ -1935,7 +1979,11 @@ window.__ModuleLoader__.load({
|
|
|
1935
1979
|
'wsPreset.title': 'Zmień domyślny preset obszaru roboczego',
|
|
1936
1980
|
'wsPreset.current': 'Aktualny domyślny preset',
|
|
1937
1981
|
'wsPreset.currentUnknown': 'Aktualny preset nieznany',
|
|
1938
|
-
'
|
|
1982
|
+
'presetStandardName': 'Tryb standardowy',
|
|
1983
|
+
'presetPtcName': 'Tryb PTC',
|
|
1984
|
+
'presetMinimalName': 'Tryb minimalny',
|
|
1985
|
+
'presetCordisName': 'Tryb twórcy',
|
|
1986
|
+
'wsPreset.createHint': 'Brak oczekującej nowej sesji w tym obszarze roboczym; po potwierdzeniu zostanie przygotowana nowa sesja z wybranym ustawieniem jako domyślnym obszaru roboczego',
|
|
1939
1987
|
'wsPreset.empty': 'Brak dostępnych presetów',
|
|
1940
1988
|
'wsPreset.loadFailed': 'Nie udało się wczytać listy presetów',
|
|
1941
1989
|
'wsPreset.done': 'Zaktualizowano domyślny preset obszaru roboczego',
|
|
@@ -2102,7 +2150,11 @@ window.__ModuleLoader__.load({
|
|
|
2102
2150
|
'wsPreset.title': 'Alterar o preset padrão do workspace',
|
|
2103
2151
|
'wsPreset.current': 'Preset padrão atual',
|
|
2104
2152
|
'wsPreset.currentUnknown': 'Preset atual desconhecido',
|
|
2105
|
-
'
|
|
2153
|
+
'presetStandardName': 'Modo padrão',
|
|
2154
|
+
'presetPtcName': 'Modo PTC',
|
|
2155
|
+
'presetMinimalName': 'Modo mínimo',
|
|
2156
|
+
'presetCordisName': 'Modo criador',
|
|
2157
|
+
'wsPreset.createHint': 'Nenhuma nova sessão em espera neste workspace; ao confirmar, uma nova sessão com o predefinido escolhido será preparada como padrão do workspace',
|
|
2106
2158
|
'wsPreset.empty': 'Nenhum preset disponível',
|
|
2107
2159
|
'wsPreset.loadFailed': 'Falha ao carregar a lista de presets',
|
|
2108
2160
|
'wsPreset.done': 'Preset padrão do workspace atualizado',
|
|
@@ -2269,7 +2321,11 @@ window.__ModuleLoader__.load({
|
|
|
2269
2321
|
'wsPreset.title': 'Изменить пресет воркспейса по умолчанию',
|
|
2270
2322
|
'wsPreset.current': 'Текущий пресет по умолчанию',
|
|
2271
2323
|
'wsPreset.currentUnknown': 'Текущий пресет неизвестен',
|
|
2272
|
-
'
|
|
2324
|
+
'presetStandardName': 'Стандартный режим',
|
|
2325
|
+
'presetPtcName': 'Режим PTC',
|
|
2326
|
+
'presetMinimalName': 'Минимальный режим',
|
|
2327
|
+
'presetCordisName': 'Режим создателя',
|
|
2328
|
+
'wsPreset.createHint': 'В этом воркспейсе нет ожидающей новой сессии; после подтверждения будет подготовлена новая сессия с выбранным пресетом в качестве дефолта воркспейса',
|
|
2273
2329
|
'wsPreset.empty': 'Нет доступных пресетов',
|
|
2274
2330
|
'wsPreset.loadFailed': 'Не удалось загрузить список пресетов',
|
|
2275
2331
|
'wsPreset.done': 'Пресет воркспейса по умолчанию обновлён',
|
|
@@ -2436,7 +2492,11 @@ window.__ModuleLoader__.load({
|
|
|
2436
2492
|
'wsPreset.title': 'Ändra standardförinställning för arbetsyta',
|
|
2437
2493
|
'wsPreset.current': 'Aktuell standardförinställning',
|
|
2438
2494
|
'wsPreset.currentUnknown': 'Aktuell förinställning okänd',
|
|
2439
|
-
'
|
|
2495
|
+
'presetStandardName': 'Standardläge',
|
|
2496
|
+
'presetPtcName': 'PTC-läge',
|
|
2497
|
+
'presetMinimalName': 'Minimalt läge',
|
|
2498
|
+
'presetCordisName': 'Skaparläge',
|
|
2499
|
+
'wsPreset.createHint': 'Ingen väntande ny session i denna arbetsyta; vid bekräftelse förbereds en ny session med den valda förinställningen som arbetsytans standard',
|
|
2440
2500
|
'wsPreset.empty': 'Inga förinställningar tillgängliga',
|
|
2441
2501
|
'wsPreset.loadFailed': 'Kunde inte läsa in förinställningslistan',
|
|
2442
2502
|
'wsPreset.done': 'Standardförinställning för arbetsyta uppdaterad',
|
|
@@ -2603,7 +2663,11 @@ window.__ModuleLoader__.load({
|
|
|
2603
2663
|
'wsPreset.title': 'เปลี่ยนพรีเซ็ตเริ่มต้นของพื้นที่ทำงาน',
|
|
2604
2664
|
'wsPreset.current': 'พรีเซ็ตเริ่มต้นปัจจุบัน',
|
|
2605
2665
|
'wsPreset.currentUnknown': 'ไม่ทราบพรีเซ็ตปัจจุบัน',
|
|
2606
|
-
'
|
|
2666
|
+
'presetStandardName': 'โหมดมาตรฐาน',
|
|
2667
|
+
'presetPtcName': 'โหมด PTC',
|
|
2668
|
+
'presetMinimalName': 'โหมดมินิมอล',
|
|
2669
|
+
'presetCordisName': 'โหมดครีเอเตอร์',
|
|
2670
|
+
'wsPreset.createHint': 'ยังไม่มีเซสชันใหม่ที่รออยู่ในพื้นที่ทำงานนี้; เมื่อยืนยันจะเตรียมเซสชันใหม่ที่ใช้พรีเซ็ตที่เลือกเป็นค่าเริ่มต้นของพื้นที่ทำงาน',
|
|
2607
2671
|
'wsPreset.empty': 'ไม่มีพรีเซ็ตที่ใช้ได้',
|
|
2608
2672
|
'wsPreset.loadFailed': 'โหลดรายการพรีเซ็ตไม่สำเร็จ',
|
|
2609
2673
|
'wsPreset.done': 'อัปเดตพรีเซ็ตเริ่มต้นของพื้นที่ทำงานแล้ว',
|
|
@@ -2770,7 +2834,11 @@ window.__ModuleLoader__.load({
|
|
|
2770
2834
|
'wsPreset.title': 'Çalışma alanı varsayılan ön ayarını değiştir',
|
|
2771
2835
|
'wsPreset.current': 'Geçerli varsayılan ön ayar',
|
|
2772
2836
|
'wsPreset.currentUnknown': 'Geçerli ön ayar bilinmiyor',
|
|
2773
|
-
'
|
|
2837
|
+
'presetStandardName': 'Standart mod',
|
|
2838
|
+
'presetPtcName': 'PTC modu',
|
|
2839
|
+
'presetMinimalName': 'Minimal mod',
|
|
2840
|
+
'presetCordisName': 'Oluşturucu modu',
|
|
2841
|
+
'wsPreset.createHint': 'Bu çalışma alanında bekleyen yeni oturum yok; onaylayınca seçilen ön ayarla yeni bir oturum çalışma alanı varsayılanı olarak hazırlanır',
|
|
2774
2842
|
'wsPreset.empty': 'Kullanılabilir ön ayar yok',
|
|
2775
2843
|
'wsPreset.loadFailed': 'Ön ayar listesi yüklenemedi',
|
|
2776
2844
|
'wsPreset.done': 'Çalışma alanı varsayılan ön ayarı güncellendi',
|
|
@@ -2937,7 +3005,11 @@ window.__ModuleLoader__.load({
|
|
|
2937
3005
|
'wsPreset.title': 'Thay đổi preset mặc định của không gian làm việc',
|
|
2938
3006
|
'wsPreset.current': 'Preset mặc định hiện tại',
|
|
2939
3007
|
'wsPreset.currentUnknown': 'Không rõ preset hiện tại',
|
|
2940
|
-
'
|
|
3008
|
+
'presetStandardName': 'Chế độ chuẩn',
|
|
3009
|
+
'presetPtcName': 'Chế độ PTC',
|
|
3010
|
+
'presetMinimalName': 'Chế độ tối giản',
|
|
3011
|
+
'presetCordisName': 'Chế độ người sáng tạo',
|
|
3012
|
+
'wsPreset.createHint': 'Không gian làm việc này chưa có phiên mới đang chờ; xác nhận sẽ chuẩn bị một phiên mới dùng cấu hình đã chọn làm mặc định của không gian làm việc',
|
|
2941
3013
|
'wsPreset.empty': 'Không có preset khả dụng',
|
|
2942
3014
|
'wsPreset.loadFailed': 'Không tải được danh sách preset',
|
|
2943
3015
|
'wsPreset.done': 'Đã cập nhật preset mặc định của không gian làm việc',
|
|
@@ -3104,7 +3176,11 @@ window.__ModuleLoader__.load({
|
|
|
3104
3176
|
'wsPreset.title': '修改工作區預設',
|
|
3105
3177
|
'wsPreset.current': '目前預設',
|
|
3106
3178
|
'wsPreset.currentUnknown': '目前預設未知',
|
|
3107
|
-
'
|
|
3179
|
+
'presetStandardName': '標準模式',
|
|
3180
|
+
'presetPtcName': 'PTC 模式',
|
|
3181
|
+
'presetMinimalName': '極簡模式',
|
|
3182
|
+
'presetCordisName': '創造模式',
|
|
3183
|
+
'wsPreset.createHint': '該工作區暫無待命的新對話,確認後將預備一個使用所選預設的新對話作為工作區預設',
|
|
3108
3184
|
'wsPreset.empty': '沒有可用的預設',
|
|
3109
3185
|
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3110
3186
|
'wsPreset.done': '已更新工作區預設',
|
|
@@ -3271,7 +3347,11 @@ window.__ModuleLoader__.load({
|
|
|
3271
3347
|
'wsPreset.title': '修改工作區預設',
|
|
3272
3348
|
'wsPreset.current': '目前預設',
|
|
3273
3349
|
'wsPreset.currentUnknown': '目前預設未知',
|
|
3274
|
-
'
|
|
3350
|
+
'presetStandardName': '標準模式',
|
|
3351
|
+
'presetPtcName': 'PTC 模式',
|
|
3352
|
+
'presetMinimalName': '極簡模式',
|
|
3353
|
+
'presetCordisName': '創造模式',
|
|
3354
|
+
'wsPreset.createHint': '該工作區暫無待命的新對話,確認後將預備一個使用所選預設的新對話作為工作區預設',
|
|
3275
3355
|
'wsPreset.empty': '沒有可用的預設',
|
|
3276
3356
|
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3277
3357
|
'wsPreset.done': '已更新工作區預設',
|
|
@@ -3438,7 +3518,11 @@ window.__ModuleLoader__.load({
|
|
|
3438
3518
|
'wsPreset.title': '修改工作區預設',
|
|
3439
3519
|
'wsPreset.current': '目前預設',
|
|
3440
3520
|
'wsPreset.currentUnknown': '目前預設未知',
|
|
3441
|
-
'
|
|
3521
|
+
'presetStandardName': '標準模式',
|
|
3522
|
+
'presetPtcName': 'PTC 模式',
|
|
3523
|
+
'presetMinimalName': '極簡模式',
|
|
3524
|
+
'presetCordisName': '創造模式',
|
|
3525
|
+
'wsPreset.createHint': '此工作區暫無待命的新工作階段,確認後將準備一個使用所選預設的新工作階段作為工作區預設',
|
|
3442
3526
|
'wsPreset.empty': '沒有可用的預設',
|
|
3443
3527
|
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3444
3528
|
'wsPreset.done': '已更新工作區預設',
|
|
@@ -5250,8 +5334,25 @@ window.__ModuleLoader__.load({
|
|
|
5250
5334
|
* applyPreset is null exactly when no blank exists (or the face is
|
|
5251
5335
|
* absent); the roster is a feature-probed plugin-side read.
|
|
5252
5336
|
*/
|
|
5253
|
-
|
|
5254
|
-
|
|
5337
|
+
/* BUILT-IN preset id → this plugin's dictionary key. Mirrors the official
|
|
5338
|
+
* display fold (agent-preset-registry display.ts isBuiltInPreset: built-ins
|
|
5339
|
+
* publish NO name) because that registry package is not on the client boot
|
|
5340
|
+
* graph and cannot be required here. Custom presets keep their authored
|
|
5341
|
+
* name; the id itself is the last-resort fallback. Host-follow: delete this
|
|
5342
|
+
* fold and require the official one once it ships on the boot graph. */
|
|
5343
|
+
const BUILT_IN_PRESET_LABEL_KEYS = {
|
|
5344
|
+
standard: 'presetStandardName',
|
|
5345
|
+
ptc: 'presetPtcName',
|
|
5346
|
+
minimal: 'presetMinimalName',
|
|
5347
|
+
cordis: 'presetCordisName',
|
|
5348
|
+
}
|
|
5349
|
+
const presetDisplayLabel = (row, t) => {
|
|
5350
|
+
if (row && row.name === undefined && BUILT_IN_PRESET_LABEL_KEYS[row.id] !== undefined) return t(BUILT_IN_PRESET_LABEL_KEYS[row.id])
|
|
5351
|
+
return (row && row.name) || (row && row.id) || ''
|
|
5352
|
+
}
|
|
5353
|
+
|
|
5354
|
+
function WorkspacePresetDialog({ applyPreset, hasBlank, loadRoster, current, onApplied, onClose, t }) {
|
|
5355
|
+
const editable = typeof applyPreset === 'function' && hasBlank !== false
|
|
5255
5356
|
const menuReady = typeof ui.Menu === 'function'
|
|
5256
5357
|
const [status, setStatus] = React.useState('loading') // loading | ready | error
|
|
5257
5358
|
const [rows, setRows] = React.useState([])
|
|
@@ -5285,12 +5386,12 @@ window.__ModuleLoader__.load({
|
|
|
5285
5386
|
return () => { alive = false }
|
|
5286
5387
|
}, [])
|
|
5287
5388
|
const nameOf = (id) => {
|
|
5288
|
-
for (const row of rows) { if (row.id === id) return row
|
|
5389
|
+
for (const row of rows) { if (row.id === id) return presetDisplayLabel(row, t) }
|
|
5289
5390
|
return id
|
|
5290
5391
|
}
|
|
5291
5392
|
const options = rows.map((row) => ({
|
|
5292
5393
|
value: row.id,
|
|
5293
|
-
label: (row
|
|
5394
|
+
label: presetDisplayLabel(row, t) + (row.isDefault ? ' (' + t('wsPreset.globalDefault') + ')' : ''),
|
|
5294
5395
|
}))
|
|
5295
5396
|
const commit = () => {
|
|
5296
5397
|
if (busy || !picked) { onClose(); return }
|
|
@@ -5307,7 +5408,9 @@ window.__ModuleLoader__.load({
|
|
|
5307
5408
|
setErrorText(reason instanceof Error ? reason.message : String(reason || t('wsPreset.loadFailed')))
|
|
5308
5409
|
})
|
|
5309
5410
|
}
|
|
5310
|
-
|
|
5411
|
+
// No standing draft → the confirm PREPARES one with the picked preset
|
|
5412
|
+
// (see the ws-preset menu branch); the hint line spells that out.
|
|
5413
|
+
const currentLine = !editable ? t('wsPreset.createHint')
|
|
5311
5414
|
: current ? t('wsPreset.current') + ': ' + nameOf(current)
|
|
5312
5415
|
: t('wsPreset.currentUnknown')
|
|
5313
5416
|
return E(ui.Modal, {
|
|
@@ -5316,15 +5419,13 @@ window.__ModuleLoader__.load({
|
|
|
5316
5419
|
closeLabel: t('close'),
|
|
5317
5420
|
title: t('wsPreset.title'),
|
|
5318
5421
|
footer: E('div', { className: 'bw-modal-actions' },
|
|
5319
|
-
|
|
5320
|
-
|
|
5321
|
-
? E(BTN, { variant: 'primary', onClick: commit, disabled: busy || !picked || picked === current }, t('confirm'))
|
|
5322
|
-
: E(BTN, { variant: 'primary', onClick: onClose }, t('close')),
|
|
5422
|
+
E(BTN, { variant: 'outline', onClick: onClose, disabled: busy }, t('cancel')),
|
|
5423
|
+
E(BTN, { variant: 'primary', onClick: commit, disabled: busy || !picked || picked === current }, t('confirm')),
|
|
5323
5424
|
),
|
|
5324
5425
|
},
|
|
5325
5426
|
E('div', { className: 'bw-modal-body' },
|
|
5326
5427
|
status === 'error' ? E('div', { className: 'bw-error-text', role: 'alert' }, errorText) : null,
|
|
5327
|
-
status === 'ready'
|
|
5428
|
+
status === 'ready' ? (
|
|
5328
5429
|
rows.length === 0
|
|
5329
5430
|
? E('div', { className: 'bw-hint' }, t('wsPreset.empty'))
|
|
5330
5431
|
: E('div', { className: 'bw-field' },
|
|
@@ -5341,7 +5442,7 @@ window.__ModuleLoader__.load({
|
|
|
5341
5442
|
)
|
|
5342
5443
|
) : null,
|
|
5343
5444
|
E('div', { className: 'bw-hint' }, currentLine),
|
|
5344
|
-
status === 'ready' &&
|
|
5445
|
+
status === 'ready' && errorText !== ''
|
|
5345
5446
|
? E('div', { className: 'bw-error-text', role: 'alert' }, errorText)
|
|
5346
5447
|
: null,
|
|
5347
5448
|
),
|
|
@@ -6937,9 +7038,14 @@ window.__ModuleLoader__.load({
|
|
|
6937
7038
|
sidebarFlowEntry,
|
|
6938
7039
|
shippedBrowserFace, scheduleSeatReader,
|
|
6939
7040
|
officialT,
|
|
6940
|
-
|
|
7041
|
+
presetFaceOf,
|
|
6941
7042
|
t,
|
|
6942
7043
|
} = props
|
|
7044
|
+
// v0.32.2: resolve the stable getter ONCE per render (see
|
|
7045
|
+
// browserInjected for why this is a function and not a value prop).
|
|
7046
|
+
// Every consumer below keeps reading this local, so a late-arriving
|
|
7047
|
+
// agent-preset service is picked up by the next render's menu build.
|
|
7048
|
+
const presetFace = typeof presetFaceOf === 'function' ? presetFaceOf() : null
|
|
6943
7049
|
|
|
6944
7050
|
if (typeof useWorkspaces !== 'function' || typeof useSessions !== 'function') {
|
|
6945
7051
|
console.error('[dsh-better-workspace] standard snapshot hooks missing; browser renders nothing')
|
|
@@ -8813,9 +8919,13 @@ window.__ModuleLoader__.load({
|
|
|
8813
8919
|
// Freeze the target NOW (the dialog outlives the menu ctx): the
|
|
8814
8920
|
// blank lookup mirrors the official createInWorkspace rule — a
|
|
8815
8921
|
// standing blank IS the workspace default (its preset projection
|
|
8816
|
-
// is what the hero chip shows)
|
|
8817
|
-
//
|
|
8818
|
-
//
|
|
8922
|
+
// is what the hero chip shows). With NO standing blank the edit
|
|
8923
|
+
// still applies: ClientSessions.create prepares one WITH the
|
|
8924
|
+
// picked preset (the same channel as the official new-session
|
|
8925
|
+
// button), which makes it the workspace default. Creating a
|
|
8926
|
+
// session here is deliberate, not a side effect — the host has
|
|
8927
|
+
// no other per-workspace default store (agent-preset-registry
|
|
8928
|
+
// selectedDefault is GLOBAL; the standing blank IS the carrier).
|
|
8819
8929
|
const raw = (storedItems || []).find((item) => item.workspaceId === payload.workspaceId)
|
|
8820
8930
|
const blankIds = raw && Array.isArray(raw.sessionIds) ? raw.sessionIds : []
|
|
8821
8931
|
const blankId = raw && raw.path
|
|
@@ -8829,7 +8939,15 @@ window.__ModuleLoader__.load({
|
|
|
8829
8939
|
const projection = blankSummary ? blankSummary.projectionValues : undefined
|
|
8830
8940
|
setDialog({
|
|
8831
8941
|
kind: 'ws-preset',
|
|
8832
|
-
|
|
8942
|
+
hasBlank: blankId !== undefined,
|
|
8943
|
+
applyPreset: blankId !== undefined
|
|
8944
|
+
? (presetId) => presetFace.select(blankId, presetId)
|
|
8945
|
+
// Reuse declined / no draft to reuse: create WITH the preset.
|
|
8946
|
+
// Shape matches select's { ok } contract; a SessionCreateError
|
|
8947
|
+
// lands in the dialog as an inline refusal line.
|
|
8948
|
+
: (presetId) => Promise.resolve()
|
|
8949
|
+
.then(() => sessions.create({ cwd: raw.path, agentPreset: presetId }))
|
|
8950
|
+
.then(() => ({ ok: true }), (reason) => ({ ok: false, refusal: reason instanceof Error ? reason.message : String(reason || 'session create failed') })),
|
|
8833
8951
|
current: projection && typeof projection.agentPreset === 'string' ? projection.agentPreset : undefined,
|
|
8834
8952
|
})
|
|
8835
8953
|
}
|
|
@@ -9360,71 +9478,99 @@ window.__ModuleLoader__.load({
|
|
|
9360
9478
|
let officialT = null
|
|
9361
9479
|
try { officialT = ctx.locale.bind('workspace') } catch { officialT = null }
|
|
9362
9480
|
|
|
9363
|
-
// v0.32.
|
|
9364
|
-
// channels the official hero preset chip uses.
|
|
9365
|
-
//
|
|
9366
|
-
//
|
|
9367
|
-
//
|
|
9368
|
-
//
|
|
9369
|
-
//
|
|
9370
|
-
//
|
|
9371
|
-
//
|
|
9481
|
+
// v0.32.2: the agent-preset face — {list, select} over the same remote
|
|
9482
|
+
// channels the official hero preset chip uses. Root cause of the hidden
|
|
9483
|
+
// menu row, straight from the dsh 0.2.1 source (cordis 4.0.5): 'remote'
|
|
9484
|
+
// is a fiber service provided by the api-gateway bundle, and
|
|
9485
|
+
// 'remote.agentPresets' is a NAMESPACE service installed by api-remotes
|
|
9486
|
+
// ($mount) on its own child fiber. `ctx.remote` resolves through the
|
|
9487
|
+
// property chain only along the reading fiber's ancestry — v0.32.1
|
|
9488
|
+
// probed it from a fiber outside that subtree, the chain threw, and the
|
|
9489
|
+
// row hid; v0.32.0's strict ctx.get ran before the gateway went ACTIVE
|
|
9490
|
+
// and read undefined. The fix keeps NO hard inject (the settingsScope
|
|
9491
|
+
// lesson: a service the host lacks would pend this bundle forever):
|
|
9492
|
+
// probe synchronously for the common case, then WAIT with a soft
|
|
9493
|
+
// ctx.inject child fiber that fires once the two services go ACTIVE —
|
|
9494
|
+
// or pends harmlessly forever on hosts without them. The face reaches
|
|
9495
|
+
// the sidebar as a stable GETTER prop (see browserInjected) because the
|
|
9496
|
+
// slot renderer caches the inject result per entry and would otherwise
|
|
9497
|
+
// bake in a null until the entry re-registers.
|
|
9372
9498
|
let presetFace = null
|
|
9373
|
-
|
|
9374
|
-
|
|
9375
|
-
|
|
9376
|
-
|
|
9499
|
+
const presetFaceReady = (candidate) => candidate
|
|
9500
|
+
&& typeof candidate.list === 'function' && typeof candidate.select === 'function'
|
|
9501
|
+
const buildPresetFace = (agentPresets) => ({
|
|
9502
|
+
// readRoster mirror: a gateway hiccup
|
|
9503
|
+
// ('gateway/invocation-unavailable') maps to an EMPTY roster,
|
|
9504
|
+
// exactly like the official selector does; every other failure
|
|
9505
|
+
// surfaces with its message.
|
|
9506
|
+
list: async () => {
|
|
9377
9507
|
try {
|
|
9378
|
-
const
|
|
9379
|
-
if (
|
|
9380
|
-
|
|
9381
|
-
|
|
9382
|
-
|
|
9383
|
-
|
|
9384
|
-
|
|
9385
|
-
|
|
9386
|
-
|
|
9387
|
-
|
|
9388
|
-
|
|
9389
|
-
|
|
9390
|
-
|
|
9391
|
-
|
|
9392
|
-
|
|
9393
|
-
|
|
9394
|
-
|
|
9395
|
-
|
|
9396
|
-
|
|
9397
|
-
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
|
|
9401
|
-
return { ok: false, error: result && result.error ? result.error.message : 'preset roster read failed' }
|
|
9402
|
-
} catch (error) {
|
|
9403
|
-
return { ok: false, error: error instanceof Error ? error.message : String(error) }
|
|
9404
|
-
}
|
|
9405
|
-
},
|
|
9406
|
-
// seat-store apply() mirror: a refusal carries the host's reason
|
|
9407
|
-
// (error.details.reason when present); the outer call can throw,
|
|
9408
|
-
// so a throw folds into the same {ok:false} shape.
|
|
9409
|
-
select: async (sessionId, presetId) => {
|
|
9410
|
-
try {
|
|
9411
|
-
const result = await agentPresets.select(sessionId, presetId)
|
|
9412
|
-
if (result && result.ok) return { ok: true }
|
|
9413
|
-
const details = result && result.error ? result.error.details : undefined
|
|
9414
|
-
const reason = details && typeof details.reason === 'string'
|
|
9415
|
-
? details.reason
|
|
9416
|
-
: (result && result.error ? result.error.message : 'preset select failed')
|
|
9417
|
-
return { ok: false, refusal: reason }
|
|
9418
|
-
} catch (error) {
|
|
9419
|
-
return { ok: false, refusal: error instanceof Error ? error.message : String(error) }
|
|
9420
|
-
}
|
|
9421
|
-
},
|
|
9508
|
+
const result = await agentPresets.list()
|
|
9509
|
+
if (result && result.ok) return { ok: true, presets: (result.value && result.value.presets) || [] }
|
|
9510
|
+
const code = result && result.error ? result.error.code : undefined
|
|
9511
|
+
if (code === 'gateway/invocation-unavailable') return { ok: true, presets: [] }
|
|
9512
|
+
return { ok: false, error: result && result.error ? result.error.message : 'preset roster read failed' }
|
|
9513
|
+
} catch (error) {
|
|
9514
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) }
|
|
9515
|
+
}
|
|
9516
|
+
},
|
|
9517
|
+
// seat-store apply() mirror: a refusal carries the host's reason
|
|
9518
|
+
// (error.details.reason when present); the outer call can throw,
|
|
9519
|
+
// so a throw folds into the same {ok:false} shape.
|
|
9520
|
+
select: async (sessionId, presetId) => {
|
|
9521
|
+
try {
|
|
9522
|
+
const result = await agentPresets.select(sessionId, presetId)
|
|
9523
|
+
if (result && result.ok) return { ok: true }
|
|
9524
|
+
const details = result && result.error ? result.error.details : undefined
|
|
9525
|
+
const reason = details && typeof details.reason === 'string'
|
|
9526
|
+
? details.reason
|
|
9527
|
+
: (result && result.error ? result.error.message : 'preset select failed')
|
|
9528
|
+
return { ok: false, refusal: reason }
|
|
9529
|
+
} catch (error) {
|
|
9530
|
+
return { ok: false, refusal: error instanceof Error ? error.message : String(error) }
|
|
9422
9531
|
}
|
|
9532
|
+
},
|
|
9533
|
+
})
|
|
9534
|
+
try {
|
|
9535
|
+
let agentPresets = null
|
|
9536
|
+
try {
|
|
9537
|
+
const remote = ctx.remote
|
|
9538
|
+
agentPresets = remote && remote.agentPresets
|
|
9539
|
+
} catch { /* the property chain needs the service on this fiber's path */ }
|
|
9540
|
+
if (!presetFaceReady(agentPresets)) {
|
|
9541
|
+
try {
|
|
9542
|
+
const remote = ctx.get('remote')
|
|
9543
|
+
agentPresets = remote && remote.agentPresets
|
|
9544
|
+
} catch { /* strict get yields nothing while the provider pends */ }
|
|
9423
9545
|
}
|
|
9546
|
+
if (presetFaceReady(agentPresets)) presetFace = buildPresetFace(agentPresets)
|
|
9424
9547
|
} catch (presetFaceError) {
|
|
9425
9548
|
console.warn('[dsh-better-workspace] agent-preset face unavailable', presetFaceError)
|
|
9426
9549
|
presetFace = null
|
|
9427
9550
|
}
|
|
9551
|
+
if (!presetFace && ctx && typeof ctx.inject === 'function') {
|
|
9552
|
+
// Late arrival: a soft child fiber that fires when the 'remote' +
|
|
9553
|
+
// 'remote.agentPresets' services go ACTIVE (the official
|
|
9554
|
+
// ui-agent-preset declares exactly these two). On hosts that never
|
|
9555
|
+
// mount them the fiber just pends — no effect, no error. The
|
|
9556
|
+
// namespace reads by its strict service name off the child fiber,
|
|
9557
|
+
// where the inject mechanism has cached it.
|
|
9558
|
+
try {
|
|
9559
|
+
ctx.inject(['remote', 'remote.agentPresets'], (fctx) => {
|
|
9560
|
+
try {
|
|
9561
|
+
const agentPresets = fctx && fctx['remote.agentPresets']
|
|
9562
|
+
if (presetFaceReady(agentPresets)) {
|
|
9563
|
+
presetFace = buildPresetFace(agentPresets)
|
|
9564
|
+
console.info('[dsh-better-workspace] agent-preset face ready (late arrival)')
|
|
9565
|
+
}
|
|
9566
|
+
} catch (lateError) {
|
|
9567
|
+
console.warn('[dsh-better-workspace] agent-preset late face failed', lateError)
|
|
9568
|
+
}
|
|
9569
|
+
})
|
|
9570
|
+
} catch (injectError) {
|
|
9571
|
+
console.warn('[dsh-better-workspace] agent-preset soft inject failed', injectError)
|
|
9572
|
+
}
|
|
9573
|
+
}
|
|
9428
9574
|
|
|
9429
9575
|
if (ctx.locale && typeof ctx.locale.register === 'function') {
|
|
9430
9576
|
ctx.effect(() => {
|
|
@@ -9479,10 +9625,15 @@ window.__ModuleLoader__.load({
|
|
|
9479
9625
|
// Official 'workspace' dictionary translate (menu copy follows upstream);
|
|
9480
9626
|
// null when the bind failed — the menu then uses the aligned bw copy.
|
|
9481
9627
|
officialT,
|
|
9482
|
-
// v0.32.
|
|
9483
|
-
//
|
|
9484
|
-
//
|
|
9485
|
-
presetFace
|
|
9628
|
+
// v0.32.2: the agent-preset face rides a stable GETTER, not a value.
|
|
9629
|
+
// The slot renderer caches the inject result per StoredEntry
|
|
9630
|
+
// (ui-renderer scoped-slots rootInjectCache), so a value prop would
|
|
9631
|
+
// bake in whatever presetFace was at first render — null whenever the
|
|
9632
|
+
// remote services arrived after this face was cached, permanently
|
|
9633
|
+
// hiding the workspace-preset menu row. The getter reads the apply
|
|
9634
|
+
// closure live, so every render and every menu build re-asks; hosts
|
|
9635
|
+
// without the service keep returning null, which simply hides the row.
|
|
9636
|
+
presetFaceOf: () => presetFace,
|
|
9486
9637
|
// The shipped sidebar's OWN face (dsh 0.1.7-rc.2): the shortcut request
|
|
9487
9638
|
// channel and the catalog of effective keybindings. Both belong to the
|
|
9488
9639
|
// entry this seat shadows, so they are read off the ledger and consumed
|
|
@@ -9719,6 +9870,12 @@ window.__ModuleLoader__.load({
|
|
|
9719
9870
|
|
|
9720
9871
|
return {
|
|
9721
9872
|
name: 'dsh-better-workspace',
|
|
9873
|
+
// v0.32.2: the list stays at the five era-guaranteed services (the
|
|
9874
|
+
// settingsScope lesson — a hard inject of anything a host may lack
|
|
9875
|
+
// pends this whole bundle forever). 'remote' + 'remote.agentPresets'
|
|
9876
|
+
// are acquired SOFTLY inside apply: a synchronous probe plus a
|
|
9877
|
+
// ctx.inject child fiber that waits for their ACTIVE transition
|
|
9878
|
+
// (see the agent-preset face block above).
|
|
9722
9879
|
inject: ['slots', 'sessions', 'workspaces', 'locale', 'uiWorkspace'],
|
|
9723
9880
|
apply,
|
|
9724
9881
|
}
|