dsh-better-workspace 0.30.2 → 0.32.1
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 +3 -3
- package/README_EN.md +2 -2
- package/dsh.plugin.json +1 -1
- package/package.json +3 -2
- package/src/client.js +461 -28
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<table>
|
|
45
45
|
<tr>
|
|
46
46
|
<td align="center" width="58%"><img src="docs/screenshots/3-appearance-dialog.png" alt="外观自定义弹窗(实时预览)"/></td>
|
|
47
|
-
<td valign="top"><b>外观自定义</b><br/>右键任意一层(工作区分组 / 工作区 / 会话 / 会话分组)→「自定义外观」:颜色(预设色板 + 取色器 + RGB)、发光强度(0..14 拖动条,只作用于文字)、字体粗细、字体阴影开关、**字体描边**(开关 + 0.5–4px
|
|
47
|
+
<td valign="top"><b>外观自定义</b><br/>右键任意一层(工作区分组 / 工作区 / 会话 / 会话分组)→「自定义外观」:颜色(预设色板 + 取色器 + RGB)、发光强度(0..14 拖动条,只作用于文字)、字体粗细、字体阴影开关、**字体描边**(开关 + 0.5–4px 粗细,**新安装默认关闭**——干净主题下描边更像浮凸噪点,配背景图时再打开;描边颜色默认**灰**,可改黑 / 白 / 任意取色,或选「自动」按字体颜色取反差色——浅色字配黑边、深色字配白边,并跟随主题与背景插件的界面明暗。升级安装不受影响:已开启描边的浏览器保持原样)、图标(与 dsh 图标库同族的 69 个,工作区与工作区分组专属),底部带实时预览。清除自定义一键复原。</td>
|
|
48
48
|
</tr>
|
|
49
49
|
<tr>
|
|
50
50
|
<td align="center" width="58%"><img src="docs/screenshots/2-customized-tree.png" alt="外观自定义效果"/></td>
|
|
@@ -55,14 +55,14 @@
|
|
|
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/>操作都收进右键:工作区行——重命名 / 删除 / 分叉 / 归档 /
|
|
58
|
+
<td valign="top"><b>右键菜单</b><br/>操作都收进右键:工作区行——重命名 / 删除 / 分叉 / 归档 / 自定义外观 / <b>修改工作区默认预设</b>(v0.32.0 起,改写该工作区常驻新会话所用的 agent 预设,走官方同一通道;工作区暂无待命新会话时仅提示跟随全局默认,不替你建会话);工作区分组行——重命名分组(同步更新组内所有工作区名称)/ 自定义外观;会话与会话分组行——重命名 / 分叉 / 归档 / 自定义外观;会话行另有<b>复制 Session ID</b>(v0.30.0 起,对齐 dsh 0.2.1-alpha.5 官方会话菜单第五项——写剪贴板走宿主原语,复制成功与否均有提示)。</td>
|
|
59
59
|
</tr>
|
|
60
60
|
</table>
|
|
61
61
|
|
|
62
62
|
<table>
|
|
63
63
|
<tr>
|
|
64
64
|
<td align="center" width="58%"><img src="docs/screenshots/4-settings-card.png" alt="插件设置卡片"/></td>
|
|
65
|
-
<td valign="top"><b>设置卡片</b><br/>设置 → 插件 → 插件配置 里新增「更好的工作区」卡片(官方折叠卡片样式),提供<b>单链分组合并</b>开关(如 测试层1 下只有 AI交易 一个工作区时,合并显示为一行 测试层1/AI交易)与<b>状态呼吸灯</b>开关(被折叠藏起的状态灯沿层级向外冒泡呼吸发光,默认开);另有<b>默认外观</b>区——颜色 / 发光 / 字体粗细 / 字体阴影 / 字体描边开关 / 描边粗细一次配好,没有单独自定义过的行全部继承(
|
|
65
|
+
<td valign="top"><b>设置卡片</b><br/>设置 → 插件 → 插件配置 里新增「更好的工作区」卡片(官方折叠卡片样式),提供<b>单链分组合并</b>开关(如 测试层1 下只有 AI交易 一个工作区时,合并显示为一行 测试层1/AI交易)与<b>状态呼吸灯</b>开关(被折叠藏起的状态灯沿层级向外冒泡呼吸发光,默认开);另有<b>默认外观</b>区——颜色 / 发光 / 字体粗细 / 字体阴影 / 字体描边开关 / 描边粗细一次配好,没有单独自定义过的行全部继承(描边新装默认关,其余同「无自定义」),并随宿主设置存储跨端同步。展开状态与外观自定义经 dsh 客户端 store 持久化在当前浏览器。</td>
|
|
66
66
|
</tr>
|
|
67
67
|
</table>
|
|
68
68
|
|
package/README_EN.md
CHANGED
|
@@ -44,7 +44,7 @@ Session titles nest on `/` too (e.g. `test1/plugin maintenance`). Session groups
|
|
|
44
44
|
<table>
|
|
45
45
|
<tr>
|
|
46
46
|
<td align="center" width="58%"><img src="docs/screenshots/3-appearance-dialog.png" alt="Appearance dialog with live preview"/></td>
|
|
47
|
-
<td valign="top"><b>Appearance customization</b><br/>Right-click any row (workspace folder / workspace / session / session group) → Customize: color (swatches + picker + RGB), glow strength (0–14 slider, text only), font weight, font shadow, a <b>text outline</b> (toggle + 0.5–4px width, <b>
|
|
47
|
+
<td valign="top"><b>Appearance customization</b><br/>Right-click any row (workspace folder / workspace / session / session group) → Customize: color (swatches + picker + RGB), glow strength (0–14 slider, text only), font weight, font shadow, a <b>text outline</b> (toggle + 0.5–4px width, <b>off by default on fresh installs</b> — on a clean theme the rim reads as embossed noise, so turn it on when a background image needs it; its color is gray by default, with black / white / any-color picker and an Auto mode that derives the contrasting pole from the row's font color — light text gets a black rim, dark text a white one — following the theme or a background plugin's light/dark switch. Upgraded installs keep the outline they had), an icon grid (69 icons from the dsh primitives family, workspace & folder rows only), with a live preview at the bottom. Reset returns to default in one click.</td>
|
|
48
48
|
</tr>
|
|
49
49
|
<tr>
|
|
50
50
|
<td align="center" width="58%"><img src="docs/screenshots/2-customized-tree.png" alt="Custom appearance result"/></td>
|
|
@@ -62,7 +62,7 @@ Session titles nest on `/` too (e.g. `test1/plugin maintenance`). Session groups
|
|
|
62
62
|
<table>
|
|
63
63
|
<tr>
|
|
64
64
|
<td align="center" width="58%"><img src="docs/screenshots/4-settings-card.png" alt="Settings card"/></td>
|
|
65
|
-
<td valign="top"><b>Settings card</b><br/>Settings → Plugins → Configuration adds a “Better Workspaces” card (official accordion style) with a <b>single-child-chain merge</b> toggle (e.g. level1 containing only AI trade renders as one row level1/AI trade) and a <b>status breathing light</b> toggle (status dots hidden by collapse bubble outward as breathing glows; on by default); a <b>default appearance</b> section configures color / glow / weight / shadow / outline toggle / outline width once for every row that was never customized (
|
|
65
|
+
<td valign="top"><b>Settings card</b><br/>Settings → Plugins → Configuration adds a “Better Workspaces” card (official accordion style) with a <b>single-child-chain merge</b> toggle (e.g. level1 containing only AI trade renders as one row level1/AI trade) and a <b>status breathing light</b> toggle (status dots hidden by collapse bubble outward as breathing glows; on by default); a <b>default appearance</b> section configures color / glow / weight / shadow / outline toggle / outline width once for every row that was never customized (the outline ships off on fresh installs, the rest matches “no customization”) and syncs across surfaces through the host settings store. Expansion state and styling persist via the dsh client store in the browser.</td>
|
|
66
66
|
</tr>
|
|
67
67
|
</table>
|
|
68
68
|
|
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.32.1",
|
|
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.32.1",
|
|
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": {
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"@deepseek-ai/dsh-client-locale",
|
|
31
31
|
"@deepseek-ai/dsh-client-ui-slots",
|
|
32
32
|
"@deepseek-ai/dsh-client-ui-conversation",
|
|
33
|
-
"@deepseek-ai/dsh-client-modules"
|
|
33
|
+
"@deepseek-ai/dsh-client-modules",
|
|
34
|
+
"@deepseek-ai/dsh-api-remotes"
|
|
34
35
|
],
|
|
35
36
|
"platform": "web"
|
|
36
37
|
}
|
package/src/client.js
CHANGED
|
@@ -86,6 +86,15 @@ window.__ModuleLoader__.load({
|
|
|
86
86
|
'menu.moveToGroup': '移动到分组…',
|
|
87
87
|
'menu.moveOutGroup': '移出分组',
|
|
88
88
|
'menu.sessionId': '复制 Session ID',
|
|
89
|
+
'menu.workspacePreset': '修改工作区默认预设…',
|
|
90
|
+
'wsPreset.title': '修改工作区默认预设',
|
|
91
|
+
'wsPreset.current': '当前默认预设',
|
|
92
|
+
'wsPreset.currentUnknown': '当前预设未知',
|
|
93
|
+
'wsPreset.noBlank': '该工作区暂无待命的新会话,当前跟随全局默认预设',
|
|
94
|
+
'wsPreset.empty': '没有可用的预设',
|
|
95
|
+
'wsPreset.loadFailed': '预设列表读取失败',
|
|
96
|
+
'wsPreset.done': '已更新工作区默认预设',
|
|
97
|
+
'wsPreset.globalDefault': '全局默认',
|
|
89
98
|
'toast.sessionIdCopied': 'Session ID 已复制',
|
|
90
99
|
'toast.sessionIdCopyFailed': '复制失败,请重试',
|
|
91
100
|
'settings.title': '更好的工作区',
|
|
@@ -114,7 +123,7 @@ window.__ModuleLoader__.load({
|
|
|
114
123
|
'settings.autoStyle': '新增项自动配色',
|
|
115
124
|
'settings.autoStyle.hint': '开启后,新创建的会话会自动分到一个内置色,新工作区还会分到一个图标;颜色从固定的 13 个槽位按「洗牌 + 近期去重」抽取,连续新增不会撞色。每个槽位配了两色 —— 浅色主题用深色系、深色主题用亮色系 —— 每个色在**对应主题**背景下的对比度都 ≥4.5,达到 WCAG 正文级 AA;切换主题时同一个槽位会自动换成另一套色,不需要重新设置。只影响开启之后新建的项;你手动设置过外观的行永不被覆盖,关闭开关也不回收已分配的样式。默认关闭。',
|
|
116
125
|
'settings.appearance': '默认外观',
|
|
117
|
-
'settings.appearance.hint': '
|
|
126
|
+
'settings.appearance.hint': '没有单独自定义过的行使用这套外观;字体描边新安装默认关闭——干净主题下描边更像浮凸噪点,配背景图时再打开。字体颜色留空即跟随主题。',
|
|
118
127
|
'settings.appearance.reset': '恢复默认外观',
|
|
119
128
|
'custom.title': '自定义外观',
|
|
120
129
|
'custom.color': '颜色',
|
|
@@ -244,6 +253,15 @@ window.__ModuleLoader__.load({
|
|
|
244
253
|
'menu.moveToGroup': 'Move to group…',
|
|
245
254
|
'menu.moveOutGroup': 'Move out of group',
|
|
246
255
|
'menu.sessionId': 'Copy Session ID',
|
|
256
|
+
'menu.workspacePreset': 'Workspace default preset…',
|
|
257
|
+
'wsPreset.title': 'Change workspace default preset',
|
|
258
|
+
'wsPreset.current': 'Current default preset',
|
|
259
|
+
'wsPreset.currentUnknown': 'Current preset unknown',
|
|
260
|
+
'wsPreset.noBlank': 'No standing draft in this workspace; it follows the global default preset',
|
|
261
|
+
'wsPreset.empty': 'No presets available',
|
|
262
|
+
'wsPreset.loadFailed': 'Failed to load the preset list',
|
|
263
|
+
'wsPreset.done': 'Workspace default preset updated',
|
|
264
|
+
'wsPreset.globalDefault': 'global default',
|
|
247
265
|
'toast.sessionIdCopied': 'Session ID copied',
|
|
248
266
|
'toast.sessionIdCopyFailed': 'Copy failed. Try again.',
|
|
249
267
|
'settings.title': 'Better Workspaces',
|
|
@@ -272,7 +290,7 @@ window.__ModuleLoader__.load({
|
|
|
272
290
|
'settings.autoStyle': 'Auto color & icon for new items',
|
|
273
291
|
'settings.autoStyle.hint': "When on, every newly created session gets a built-in color and every new workspace also gets an icon. Colors come from 13 fixed slots drawn with shuffle + recent-dedup, so consecutive items never look alike. Every slot ships two colors — a darker one for the light theme, a lighter one for the dark theme — and each clears WCAG normal-text AA (contrast ≥4.5) on its own theme's background; switching themes repaints the same slot automatically, with nothing to redo. Only items created after you turn it on are touched; rows you styled by hand are never overwritten, and turning it off does not undo what was already assigned. Off by default.",
|
|
274
292
|
'settings.appearance': 'Default appearance',
|
|
275
|
-
'settings.appearance.hint': 'Rows that were never customized use this appearance; the outline
|
|
293
|
+
'settings.appearance.hint': 'Rows that were never customized use this appearance; the outline ships off on fresh installs — on a clean theme it reads as embossed noise, so turn it on when a background image needs it. Leave the color empty to follow the theme.',
|
|
276
294
|
'settings.appearance.reset': 'Reset to default',
|
|
277
295
|
'custom.title': 'Customize',
|
|
278
296
|
'custom.color': 'Color',
|
|
@@ -410,6 +428,15 @@ window.__ModuleLoader__.load({
|
|
|
410
428
|
'menu.moveToGroup': 'نقل إلى مجموعة…',
|
|
411
429
|
'menu.moveOutGroup': 'إخراج من المجموعة',
|
|
412
430
|
'menu.sessionId': 'نسخ معرّف الجلسة',
|
|
431
|
+
'menu.workspacePreset': 'الإعداد المسبق الافتراضي لمساحة العمل…',
|
|
432
|
+
'wsPreset.title': 'تغيير الإعداد المسبق الافتراضي لمساحة العمل',
|
|
433
|
+
'wsPreset.current': 'الإعداد المسبق الافتراضي الحالي',
|
|
434
|
+
'wsPreset.currentUnknown': 'الإعداد المسبق الحالي غير معروف',
|
|
435
|
+
'wsPreset.noBlank': 'لا توجد جلسة جديدة بانتظار في مساحة العمل هذه؛ تتبع الإعداد الافتراضي العام',
|
|
436
|
+
'wsPreset.empty': 'لا توجد إعدادات مسبقة متاحة',
|
|
437
|
+
'wsPreset.loadFailed': 'فشل تحميل قائمة الإعدادات المسبقة',
|
|
438
|
+
'wsPreset.done': 'تم تحديث الإعداد المسبق الافتراضي لمساحة العمل',
|
|
439
|
+
'wsPreset.globalDefault': 'الافتراضي العام',
|
|
413
440
|
'toast.sessionIdCopied': 'تم نسخ معرّف الجلسة',
|
|
414
441
|
'toast.sessionIdCopyFailed': 'فشل النسخ، حاول مجددًا',
|
|
415
442
|
'settings.title': 'مساحات عمل أفضل',
|
|
@@ -438,7 +465,7 @@ window.__ModuleLoader__.load({
|
|
|
438
465
|
'settings.autoStyle': 'ألوان وأيقونات تلقائية للعناصر الجديدة',
|
|
439
466
|
'settings.autoStyle.hint': 'عند التفعيل يحصل كل جلسة جديدة على لون من لوحة مدمجة، ويحصل كل مساحة عمل جديدة أيضًا على أيقونة. تُسحب الألوان من 13 خانة ثابتة بترتيب عشوائي مع تجنّب التكرار القريب. لكل خانة لونان — أغمق للسمة الفاتحة وأفتح للسمة الداكنة — وكل لون يبلغ تباين ≥4.5 (معيار AA للنص العادي) على خلفية سمته؛ وعند تبديل السمة تُرسم الخانة نفسها تلقائيًا دون أي إعداد. يؤثر فقط على العناصر المنشأة بعد التفعيل، ولا يُستبدل أي سطر نسّقته يدويًا، والإيقاف لا يلغي ما تم تعيينه. معطّل افتراضيًا.',
|
|
440
467
|
'settings.appearance': 'المظهر الافتراضي',
|
|
441
|
-
'settings.appearance.hint': 'تستخدم الأسطر غير المخصصة هذا المظهر؛ حدّ النص
|
|
468
|
+
'settings.appearance.hint': 'تستخدم الأسطر غير المخصصة هذا المظهر؛ حدّ النص مغلق افتراضياً في التثبيتات الجديدة — على السمة النظيفة يبدو كضجيج محفور، فعّله عندما تحتاج إلى صورة خلفية. اترك اللون فارغاً لاتباع السمة.',
|
|
442
469
|
'settings.appearance.reset': 'استعادة المظهر الافتراضي',
|
|
443
470
|
'custom.title': 'تخصيص المظهر',
|
|
444
471
|
'custom.color': 'اللون',
|
|
@@ -568,6 +595,15 @@ window.__ModuleLoader__.load({
|
|
|
568
595
|
'menu.moveToGroup': 'In Gruppe verschieben…',
|
|
569
596
|
'menu.moveOutGroup': 'Aus der Gruppe entfernen',
|
|
570
597
|
'menu.sessionId': 'Session-ID kopieren',
|
|
598
|
+
'menu.workspacePreset': 'Workspace-Standardpreset…',
|
|
599
|
+
'wsPreset.title': 'Workspace-Standardpreset ändern',
|
|
600
|
+
'wsPreset.current': 'Aktueller Standardpreset',
|
|
601
|
+
'wsPreset.currentUnknown': 'Aktueller Preset unbekannt',
|
|
602
|
+
'wsPreset.noBlank': 'Kein wartender Sitzungsentwurf in diesem Workspace; es gilt der globale Standard',
|
|
603
|
+
'wsPreset.empty': 'Keine Presets verfügbar',
|
|
604
|
+
'wsPreset.loadFailed': 'Preset-Liste konnte nicht geladen werden',
|
|
605
|
+
'wsPreset.done': 'Workspace-Standardpreset aktualisiert',
|
|
606
|
+
'wsPreset.globalDefault': 'Globaler Standard',
|
|
571
607
|
'toast.sessionIdCopied': 'Session-ID kopiert',
|
|
572
608
|
'toast.sessionIdCopyFailed': 'Kopieren fehlgeschlagen. Bitte erneut versuchen.',
|
|
573
609
|
'settings.title': 'Bessere Arbeitsbereiche',
|
|
@@ -596,7 +632,7 @@ window.__ModuleLoader__.load({
|
|
|
596
632
|
'settings.autoStyle': 'Automatische Farbe & Symbol für neue Einträge',
|
|
597
633
|
'settings.autoStyle.hint': 'Wenn aktiviert, erhält jede neu erstellte Sitzung eine Farbe aus einer festen Palette und jeder neue Arbeitsbereich zusätzlich ein Symbol. Die 13 festen Plätze werden gemischt mit Vermeidung der letzten Treffer gezogen. Jeder Platz hat zwei Farben — dunkler für das helle Thema, heller für das dunkle — und jede erreicht auf dem Hintergrund ihres eigenen Themas Kontrast ≥4.5 (AA für Fließtext); beim Themewechsel wird derselbe Platz automatisch neu eingefärbt. Nur danach erstellte Einträge werden erfasst; manuell gestaltete Zeilen werden nie überschrieben, und Ausschalten macht Zuweisungen nicht rückgängig. Standardmäßig aus.',
|
|
598
634
|
'settings.appearance': 'Standardaussehen',
|
|
599
|
-
'settings.appearance.hint': 'Zeilen ohne eigene Anpassung nutzen dieses Aussehen; die Textkontur ist standardmäßig
|
|
635
|
+
'settings.appearance.hint': 'Zeilen ohne eigene Anpassung nutzen dieses Aussehen; die Textkontur ist bei neuen Installationen standardmäßig aus – auf einem schlichten Thema wirkt sie wie geprägte Ränder, also einschalten, wenn ein Hintergrundbild sie braucht. Bleibt die Farbe leer, folgt sie dem Thema.',
|
|
600
636
|
'settings.appearance.reset': 'Standard wiederherstellen',
|
|
601
637
|
'custom.title': 'Aussehen anpassen',
|
|
602
638
|
'custom.color': 'Farbe',
|
|
@@ -726,6 +762,15 @@ window.__ModuleLoader__.load({
|
|
|
726
762
|
'menu.moveToGroup': 'Déplacer vers le groupe…',
|
|
727
763
|
'menu.moveOutGroup': 'Retirer du groupe',
|
|
728
764
|
'menu.sessionId': 'Copier l’ID de session',
|
|
765
|
+
'menu.workspacePreset': 'Préréglage par défaut du workspace…',
|
|
766
|
+
'wsPreset.title': 'Modifier le préréglage par défaut du workspace',
|
|
767
|
+
'wsPreset.current': 'Préréglage par défaut actuel',
|
|
768
|
+
'wsPreset.currentUnknown': 'Préréglage actuel inconnu',
|
|
769
|
+
'wsPreset.noBlank': 'Aucune nouvelle session en attente : ce workspace suit le préréglage global par défaut',
|
|
770
|
+
'wsPreset.empty': 'Aucun préréglage disponible',
|
|
771
|
+
'wsPreset.loadFailed': 'Échec du chargement de la liste des préréglages',
|
|
772
|
+
'wsPreset.done': 'Préréglage par défaut du workspace mis à jour',
|
|
773
|
+
'wsPreset.globalDefault': 'global par défaut',
|
|
729
774
|
'toast.sessionIdCopied': 'ID de session copié',
|
|
730
775
|
'toast.sessionIdCopyFailed': 'Échec de la copie. Veuillez réessayer.',
|
|
731
776
|
'settings.title': 'Espaces de travail améliorés',
|
|
@@ -754,7 +799,7 @@ window.__ModuleLoader__.load({
|
|
|
754
799
|
'settings.autoStyle': 'Couleur et icône automatiques pour les nouveaux éléments',
|
|
755
800
|
'settings.autoStyle.hint': 'Activé, chaque nouvelle session reçoit une couleur de la palette intégrée et chaque nouvel espace de travail aussi une icône. Les 13 emplacements fixes sont tirés par mélange avec évitement des derniers tirages. Chaque emplacement a deux couleurs — plus sombre pour le thème clair, plus claire pour le thème sombre — et chacune atteint un contraste ≥4,5 (AA pour le texte courant) sur le fond de son propre thème ; changer de thème recolore le même emplacement automatiquement. Seuls les éléments créés après l’activation sont traités ; les lignes personnalisées à la main ne sont jamais écrasées et désactiver n’annule pas les attributions. Désactivé par défaut.',
|
|
756
801
|
'settings.appearance': 'Apparence par défaut',
|
|
757
|
-
'settings.appearance.hint': 'Les lignes sans personnalisation utilisent cette apparence; le contour du texte est
|
|
802
|
+
'settings.appearance.hint': 'Les lignes sans personnalisation utilisent cette apparence; le contour du texte est désactivé par défaut sur les nouvelles installations — sur un thème épuré il fait plutôt bruit de relief, activez-le quand une image de fond le réclame. Laissez la couleur vide pour suivre le thème.',
|
|
758
803
|
'settings.appearance.reset': 'Rétablir l\'apparence par défaut',
|
|
759
804
|
'custom.title': 'Personnaliser l\'apparence',
|
|
760
805
|
'custom.color': 'Couleur',
|
|
@@ -884,6 +929,15 @@ window.__ModuleLoader__.load({
|
|
|
884
929
|
'menu.moveToGroup': 'समूह में ले जाएँ…',
|
|
885
930
|
'menu.moveOutGroup': 'समूह से बाहर निकालें',
|
|
886
931
|
'menu.sessionId': 'सेशन आईडी कॉपी करें',
|
|
932
|
+
'menu.workspacePreset': 'वर्कस्पेस डिफ़ॉल्ट प्रीसेट…',
|
|
933
|
+
'wsPreset.title': 'वर्कस्पेस डिफ़ॉल्ट प्रीसेट बदलें',
|
|
934
|
+
'wsPreset.current': 'वर्तमान डिफ़ॉल्ट प्रीसेट',
|
|
935
|
+
'wsPreset.currentUnknown': 'वर्तमान प्रीसेट अज्ञात',
|
|
936
|
+
'wsPreset.noBlank': 'इस वर्कस्पेस में कोई प्रतीक्षारत नया सेशन नहीं है; यह वैश्विक डिफ़ॉल्ट का पालन करता है',
|
|
937
|
+
'wsPreset.empty': 'कोई प्रीसेट उपलब्ध नहीं',
|
|
938
|
+
'wsPreset.loadFailed': 'प्रीसेट सूची लोड करने में विफल',
|
|
939
|
+
'wsPreset.done': 'वर्कस्पेस डिफ़ॉल्ट प्रीसेट अपडेट हुआ',
|
|
940
|
+
'wsPreset.globalDefault': 'वैश्विक डिफ़ॉल्ट',
|
|
887
941
|
'toast.sessionIdCopied': 'सेशन आईडी कॉपी हो गई',
|
|
888
942
|
'toast.sessionIdCopyFailed': 'कॉपी विफल रहा, कृपया पुनः प्रयास करें',
|
|
889
943
|
'settings.title': 'बेहतर कार्यस्थान',
|
|
@@ -912,7 +966,7 @@ window.__ModuleLoader__.load({
|
|
|
912
966
|
'settings.autoStyle': 'नए आइटम के लिए स्वचालित रंग और आइकन',
|
|
913
967
|
'settings.autoStyle.hint': 'चालू होने पर हर नए सत्र को अंतर्निहित पैलेट से एक रंग मिलता है और हर नए कार्यस्थान को एक आइकन भी। 13 स्थिर स्लॉट शफ़ल और हाल के दोहराव से बचाकर निकाले जाते हैं। हर स्लॉट में दो रंग हैं — हल्की थीम के लिए गहरा और गहरी थीम के लिए हल्का — और हर रंग अपनी थीम की पृष्ठभूमि पर ≥4.5 कंट्रास्ट (सामान्य पाठ के लिए AA) रखता है; थीम बदलने पर वही स्लॉट अपने आप रंग बदल लेता है। केवल चालू करने के बाद बने आइटम प्रभावित होते हैं; हाथ से सजाई गई पंक्तियाँ कभी नहीं बदली जातीं और बंद करने पर पहले दिए रंग हटते नहीं। डिफ़ॉल्ट रूप से बंद।',
|
|
914
968
|
'settings.appearance': 'डिफ़ॉल्ट रूप',
|
|
915
|
-
'settings.appearance.hint': 'जिन पंक्तियों को अलग से अनुकूलित नहीं किया गया वे यह रूप इस्तेमाल करती हैं; पाठ की रूपरेखा डिफ़ॉल्ट रूप से
|
|
969
|
+
'settings.appearance.hint': 'जिन पंक्तियों को अलग से अनुकूलित नहीं किया गया वे यह रूप इस्तेमाल करती हैं; पाठ की रूपरेखा नए इंस्टॉलेशन में डिफ़ॉल्ट रूप से बंद है — साफ़ थीम पर यह उभरा हुआ शोर जैसी लगती है, पृष्ठभूमि छवि की ज़रूरत होने पर इसे चालू करें। रंग खाली छोड़ने पर वह थीम का अनुसरण करता है।',
|
|
916
970
|
'settings.appearance.reset': 'डिफ़ॉल्ट रूप पर लौटें',
|
|
917
971
|
'custom.title': 'रूप अनुकूलित करें',
|
|
918
972
|
'custom.color': 'रंग',
|
|
@@ -1042,6 +1096,15 @@ window.__ModuleLoader__.load({
|
|
|
1042
1096
|
'menu.moveToGroup': 'Pindahkan ke grup…',
|
|
1043
1097
|
'menu.moveOutGroup': 'Keluarkan dari grup',
|
|
1044
1098
|
'menu.sessionId': 'Salin ID Sesi',
|
|
1099
|
+
'menu.workspacePreset': 'Preset bawaan ruang kerja…',
|
|
1100
|
+
'wsPreset.title': 'Ubah preset bawaan ruang kerja',
|
|
1101
|
+
'wsPreset.current': 'Preset bawaan saat ini',
|
|
1102
|
+
'wsPreset.currentUnknown': 'Preset saat ini tidak diketahui',
|
|
1103
|
+
'wsPreset.noBlank': 'Tidak ada sesi baru yang menunggu di ruang kerja ini; mengikuti bawaan global',
|
|
1104
|
+
'wsPreset.empty': 'Tidak ada preset yang tersedia',
|
|
1105
|
+
'wsPreset.loadFailed': 'Gagal memuat daftar preset',
|
|
1106
|
+
'wsPreset.done': 'Preset bawaan ruang kerja diperbarui',
|
|
1107
|
+
'wsPreset.globalDefault': 'bawaan global',
|
|
1045
1108
|
'toast.sessionIdCopied': 'ID Sesi disalin',
|
|
1046
1109
|
'toast.sessionIdCopyFailed': 'Gagal menyalin, silakan coba lagi',
|
|
1047
1110
|
'settings.title': 'Ruang kerja yang lebih baik',
|
|
@@ -1070,7 +1133,7 @@ window.__ModuleLoader__.load({
|
|
|
1070
1133
|
'settings.autoStyle': 'Warna & ikon otomatis untuk item baru',
|
|
1071
1134
|
'settings.autoStyle.hint': 'Saat aktif, setiap sesi baru mendapat warna dari palet bawaan dan setiap ruang kerja baru juga mendapat ikon. Tiga belas slot tetap diambil dengan cara diacak sambil menghindari pengambilan terakhir. Setiap slot punya dua warna — lebih gelap untuk tema terang dan lebih terang untuk tema gelap — dan setiap warna mencapai kontras ≥4,5 (AA untuk teks biasa) pada latar temanya sendiri; mengganti tema otomatis mewarnai ulang slot yang sama. Hanya item yang dibuat setelah diaktifkan yang diproses; baris yang Anda atur sendiri tidak pernah ditimpa, dan menonaktifkannya tidak membatalkan yang sudah diberikan. Nonaktif secara bawaan.',
|
|
1072
1135
|
'settings.appearance': 'Tampilan bawaan',
|
|
1073
|
-
'settings.appearance.hint': 'Baris yang belum disesuaikan memakai tampilan ini; garis luar teks
|
|
1136
|
+
'settings.appearance.hint': 'Baris yang belum disesuaikan memakai tampilan ini; garis luar teks mati secara bawaan pada pemasangan baru — pada tema bersih terasa seperti derau timbul, nyalakan saat gambar latar membutuhkannya. Biarkan warna kosong agar mengikuti tema.',
|
|
1074
1137
|
'settings.appearance.reset': 'Kembalikan tampilan bawaan',
|
|
1075
1138
|
'custom.title': 'Sesuaikan tampilan',
|
|
1076
1139
|
'custom.color': 'Warna',
|
|
@@ -1200,6 +1263,15 @@ window.__ModuleLoader__.load({
|
|
|
1200
1263
|
'menu.moveToGroup': 'Sposta nel gruppo…',
|
|
1201
1264
|
'menu.moveOutGroup': 'Rimuovi dal gruppo',
|
|
1202
1265
|
'menu.sessionId': 'Copia ID sessione',
|
|
1266
|
+
'menu.workspacePreset': 'Preset predefinito dello workspace…',
|
|
1267
|
+
'wsPreset.title': 'Modifica il preset predefinito dello workspace',
|
|
1268
|
+
'wsPreset.current': 'Preset predefinito attuale',
|
|
1269
|
+
'wsPreset.currentUnknown': 'Preset attuale sconosciuto',
|
|
1270
|
+
'wsPreset.noBlank': 'Nessuna nuova sessione in attesa in questo workspace; vale il predefinito globale',
|
|
1271
|
+
'wsPreset.empty': 'Nessun preset disponibile',
|
|
1272
|
+
'wsPreset.loadFailed': 'Impossibile caricare la lista dei preset',
|
|
1273
|
+
'wsPreset.done': 'Preset predefinito dello workspace aggiornato',
|
|
1274
|
+
'wsPreset.globalDefault': 'predefinito globale',
|
|
1203
1275
|
'toast.sessionIdCopied': 'ID sessione copiato',
|
|
1204
1276
|
'toast.sessionIdCopyFailed': 'Copia non riuscita. Riprova.',
|
|
1205
1277
|
'settings.title': 'Aree di lavoro migliori',
|
|
@@ -1228,7 +1300,7 @@ window.__ModuleLoader__.load({
|
|
|
1228
1300
|
'settings.autoStyle': 'Colore e icona automatici per i nuovi elementi',
|
|
1229
1301
|
'settings.autoStyle.hint': 'Se attivo, ogni nuova sessione riceve un colore dalla palette integrata e ogni nuovo spazio di lavoro anche un’icona. I 13 slot fissi vengono estratti con mescolamento ed evitando gli ultimi estratti. Ogni slot ha due colori — più scuro per il tema chiaro, più chiaro per il tema scuro — e ognuno raggiunge un contrasto ≥4,5 (AA per il testo normale) sullo sfondo del proprio tema; cambiando tema lo stesso slot viene ricolorato automaticamente. Sono interessati solo gli elementi creati dopo l’attivazione; le righe personalizzate a mano non vengono mai sovrascritte e disattivare non annulla quanto assegnato. Disattivo per impostazione predefinita.',
|
|
1230
1302
|
'settings.appearance': 'Aspetto predefinito',
|
|
1231
|
-
'settings.appearance.hint': 'Le righe mai personalizzate usano questo aspetto; il contorno del testo è
|
|
1303
|
+
'settings.appearance.hint': 'Le righe mai personalizzate usano questo aspetto; il contorno del testo è disattivato per impostazione predefinita sulle nuove installazioni — su un tema pulito sembra rumore in rilievo, attivalo quando un\'immagine di sfondo lo richiede. Lascia il colore vuoto per seguire il tema.',
|
|
1232
1304
|
'settings.appearance.reset': 'Ripristina l\'aspetto predefinito',
|
|
1233
1305
|
'custom.title': 'Personalizza aspetto',
|
|
1234
1306
|
'custom.color': 'Colore',
|
|
@@ -1358,6 +1430,15 @@ window.__ModuleLoader__.load({
|
|
|
1358
1430
|
'menu.moveToGroup': 'グループに移動…',
|
|
1359
1431
|
'menu.moveOutGroup': 'グループから出す',
|
|
1360
1432
|
'menu.sessionId': 'セッション ID をコピー',
|
|
1433
|
+
'menu.workspacePreset': 'ワークスペース既定プリセット…',
|
|
1434
|
+
'wsPreset.title': 'ワークスペース既定プリセットを変更',
|
|
1435
|
+
'wsPreset.current': '現在の既定プリセット',
|
|
1436
|
+
'wsPreset.currentUnknown': '現在のプリセットは不明',
|
|
1437
|
+
'wsPreset.noBlank': 'このワークスペースには待機中の新規セッションがなく、グローバル既定に従います',
|
|
1438
|
+
'wsPreset.empty': '利用可能なプリセットがありません',
|
|
1439
|
+
'wsPreset.loadFailed': 'プリセット一覧の読み込みに失敗しました',
|
|
1440
|
+
'wsPreset.done': 'ワークスペース既定プリセットを更新しました',
|
|
1441
|
+
'wsPreset.globalDefault': 'グローバル既定',
|
|
1361
1442
|
'toast.sessionIdCopied': 'セッション ID をコピーしました',
|
|
1362
1443
|
'toast.sessionIdCopyFailed': 'コピーに失敗しました。もう一度お試しください',
|
|
1363
1444
|
'settings.title': 'より良いワークスペース',
|
|
@@ -1386,7 +1467,7 @@ window.__ModuleLoader__.load({
|
|
|
1386
1467
|
'settings.autoStyle': '新規項目の色とアイコンを自動割り当て',
|
|
1387
1468
|
'settings.autoStyle.hint': 'オンにすると、新しく作られたセッションには内蔵パレットから色が、新しいワークスペースにはさらにアイコンが割り当てられます。13 の固定スロットをシャッフルと直近の重複回避で抽選します。各スロットは 2 色(ライトテーマ用の濃い色とダークテーマ用の明るい色)を持ち、どちらも自分のテーマの背景でコントラスト 4.5 以上(本文の AA)を満たします。テーマを切り替えると、同じスロットが自動的に塗り替えられます。オンにした後に作成された項目だけが対象で、手動で設定した行は上書きされず、オフにしても割り当て済みの色は元に戻りません。既定はオフです。',
|
|
1388
1469
|
'settings.appearance': '既定の外観',
|
|
1389
|
-
'settings.appearance.hint': '
|
|
1470
|
+
'settings.appearance.hint': '個別にカスタマイズしていない行に適用される外観です;文字の縁取りは新規インストールでは既定でオフです——クリーンなテーマでは浮き彫りのノイズに見えるため、背景画像が必要なときにオンにしてください。色を空にするとテーマに従います。',
|
|
1390
1471
|
'settings.appearance.reset': '既定の外観に戻す',
|
|
1391
1472
|
'custom.title': '外観をカスタマイズ',
|
|
1392
1473
|
'custom.color': '色',
|
|
@@ -1516,6 +1597,15 @@ window.__ModuleLoader__.load({
|
|
|
1516
1597
|
'menu.moveToGroup': '그룹으로 이동…',
|
|
1517
1598
|
'menu.moveOutGroup': '그룹에서 제거',
|
|
1518
1599
|
'menu.sessionId': '세션 ID 복사',
|
|
1600
|
+
'menu.workspacePreset': '작업 공간 기본 프리셋…',
|
|
1601
|
+
'wsPreset.title': '작업 공간 기본 프리셋 변경',
|
|
1602
|
+
'wsPreset.current': '현재 기본 프리셋',
|
|
1603
|
+
'wsPreset.currentUnknown': '현재 프리셋을 알 수 없음',
|
|
1604
|
+
'wsPreset.noBlank': '이 작업 공간에는 대기 중인 새 세션이 없으며 전역 기본값을 따릅니다',
|
|
1605
|
+
'wsPreset.empty': '사용 가능한 프리셋이 없습니다',
|
|
1606
|
+
'wsPreset.loadFailed': '프리셋 목록을 불러오지 못했습니다',
|
|
1607
|
+
'wsPreset.done': '작업 공간 기본 프리셋이 업데이트되었습니다',
|
|
1608
|
+
'wsPreset.globalDefault': '전역 기본값',
|
|
1519
1609
|
'toast.sessionIdCopied': '세션 ID가 복사되었습니다',
|
|
1520
1610
|
'toast.sessionIdCopyFailed': '복사에 실패했습니다. 다시 시도해 주세요',
|
|
1521
1611
|
'settings.title': '더 나은 워크스페이스',
|
|
@@ -1544,7 +1634,7 @@ window.__ModuleLoader__.load({
|
|
|
1544
1634
|
'settings.autoStyle': '새 항목 자동 색상 및 아이콘',
|
|
1545
1635
|
'settings.autoStyle.hint': '켜면 새로 만든 세션에 내장 팔레트의 색이, 새 워크스페이스에는 아이콘까지 자동으로 지정됩니다. 13개의 고정 슬롯을 섞기와 최근 중복 회피로 뽑습니다. 슬롯마다 두 가지 색(밝은 테마용 진한 색, 어두운 테마용 밝은 색)이 있고, 각각 자기 테마 배경에서 대비 4.5 이상(본문 AA)을 만족합니다. 테마를 바꾸면 같은 슬롯이 자동으로 다시 칠해집니다. 켠 뒤에 만든 항목에만 적용되며, 직접 꾸민 행은 절대 덮어쓰지 않고, 끄더라도 이미 지정된 색은 되돌리지 않습니다. 기본값은 꺼짐입니다.',
|
|
1546
1636
|
'settings.appearance': '기본 모양',
|
|
1547
|
-
'settings.appearance.hint': '따로 지정하지 않은 행에 적용되는 모양입니다; 글자 외곽선은 기본으로
|
|
1637
|
+
'settings.appearance.hint': '따로 지정하지 않은 행에 적용되는 모양입니다; 글자 외곽선은 새 설치에서 기본으로 꺼져 있습니다——깔끔한 테마에서는 엠보싱 잡음처럼 보이므로 배경 이미지가 필요할 때 켜세요. 색을 비우면 테마를 따릅니다.',
|
|
1548
1638
|
'settings.appearance.reset': '기본 모양으로 되돌리기',
|
|
1549
1639
|
'custom.title': '모양 사용자 지정',
|
|
1550
1640
|
'custom.color': '색',
|
|
@@ -1674,6 +1764,15 @@ window.__ModuleLoader__.load({
|
|
|
1674
1764
|
'menu.moveToGroup': 'Naar groep verplaatsen…',
|
|
1675
1765
|
'menu.moveOutGroup': 'Uit groep halen',
|
|
1676
1766
|
'menu.sessionId': 'Sessie-ID kopiëren',
|
|
1767
|
+
'menu.workspacePreset': 'Standaardpreset van workspace…',
|
|
1768
|
+
'wsPreset.title': 'Standaardpreset van workspace wijzigen',
|
|
1769
|
+
'wsPreset.current': 'Huidige standaardpreset',
|
|
1770
|
+
'wsPreset.currentUnknown': 'Huidige preset onbekend',
|
|
1771
|
+
'wsPreset.noBlank': 'Geen wachtende nieuwe sessie in deze workspace; de globale standaard geldt',
|
|
1772
|
+
'wsPreset.empty': 'Geen presets beschikbaar',
|
|
1773
|
+
'wsPreset.loadFailed': 'Laden van de presetlijst is mislukt',
|
|
1774
|
+
'wsPreset.done': 'Standaardpreset van workspace bijgewerkt',
|
|
1775
|
+
'wsPreset.globalDefault': 'globale standaard',
|
|
1677
1776
|
'toast.sessionIdCopied': 'Sessie-ID gekopieerd',
|
|
1678
1777
|
'toast.sessionIdCopyFailed': 'Kopiëren mislukt. Probeer het opnieuw.',
|
|
1679
1778
|
'settings.title': 'Betere werkruimten',
|
|
@@ -1702,7 +1801,7 @@ window.__ModuleLoader__.load({
|
|
|
1702
1801
|
'settings.autoStyle': 'Automatische kleur en pictogram voor nieuwe items',
|
|
1703
1802
|
'settings.autoStyle.hint': 'Als dit aanstaat krijgt elke nieuwe sessie een kleur uit het ingebouwde palet en elke nieuwe werkruimte ook een pictogram. De dertien vaste sleuven worden geschud en de laatst gebruikte worden vermeden. Elke sleuf heeft twee kleuren — donkerder voor het lichte thema, lichter voor het donkere — en elk haalt op de achtergrond van zijn eigen thema contrast ≥4,5 (AA voor normale tekst); bij een themawissel wordt dezelfde sleuf automatisch opnieuw gekleurd. Alleen items die daarna worden gemaakt worden aangepast; rijen die u zelf hebt opgemaakt worden nooit overschreven en uitzetten draait eerdere toewijzingen niet terug. Standaard uit.',
|
|
1704
1803
|
'settings.appearance': 'Standaarduiterlijk',
|
|
1705
|
-
'settings.appearance.hint': 'Regels zonder eigen aanpassing gebruiken dit uiterlijk; de tekstomtrek staat standaard
|
|
1804
|
+
'settings.appearance.hint': 'Regels zonder eigen aanpassing gebruiken dit uiterlijk; de tekstomtrek staat bij nieuwe installaties standaard uit — op een strak thema oogt het als reliërruis, zet het aan zodra een achtergrondafbeelding het nodig heeft. Laat de kleur leeg om het thema te volgen.',
|
|
1706
1805
|
'settings.appearance.reset': 'Standaarduiterlijk herstellen',
|
|
1707
1806
|
'custom.title': 'Uiterlijk aanpassen',
|
|
1708
1807
|
'custom.color': 'Kleur',
|
|
@@ -1832,6 +1931,15 @@ window.__ModuleLoader__.load({
|
|
|
1832
1931
|
'menu.moveToGroup': 'Przenieś do grupy…',
|
|
1833
1932
|
'menu.moveOutGroup': 'Przenieś poza grupę',
|
|
1834
1933
|
'menu.sessionId': 'Kopiuj ID sesji',
|
|
1934
|
+
'menu.workspacePreset': 'Domyślny preset obszaru roboczego…',
|
|
1935
|
+
'wsPreset.title': 'Zmień domyślny preset obszaru roboczego',
|
|
1936
|
+
'wsPreset.current': 'Aktualny domyślny preset',
|
|
1937
|
+
'wsPreset.currentUnknown': 'Aktualny preset nieznany',
|
|
1938
|
+
'wsPreset.noBlank': 'Brak oczekującej nowej sesji w tym obszarze; obowiązuje globalne ustawienie domyślne',
|
|
1939
|
+
'wsPreset.empty': 'Brak dostępnych presetów',
|
|
1940
|
+
'wsPreset.loadFailed': 'Nie udało się wczytać listy presetów',
|
|
1941
|
+
'wsPreset.done': 'Zaktualizowano domyślny preset obszaru roboczego',
|
|
1942
|
+
'wsPreset.globalDefault': 'globalne ustawienie domyślne',
|
|
1835
1943
|
'toast.sessionIdCopied': 'Skopiowano ID sesji',
|
|
1836
1944
|
'toast.sessionIdCopyFailed': 'Kopiowanie nie powiodło się. Spróbuj ponownie.',
|
|
1837
1945
|
'settings.title': 'Lepsze obszary robocze',
|
|
@@ -1860,7 +1968,7 @@ window.__ModuleLoader__.load({
|
|
|
1860
1968
|
'settings.autoStyle': 'Automatyczny kolor i ikona dla nowych elementów',
|
|
1861
1969
|
'settings.autoStyle.hint': 'Po włączeniu każda nowa sesja otrzymuje kolor z wbudowanej palety, a każda nowa przestrzeń robocza także ikonę. Trzynaście stałych slotów losuje się tasowaniem z unikaniem ostatnich trafień. Każdy slot ma dwa kolory — ciemniejszy dla jasnego motywu, jaśniejszy dla ciemnego — i każdy osiąga na tle swojego motywu kontrast ≥4,5 (AA dla zwykłego tekstu); zmiana motywu automatycznie przemalowuje ten sam slot. Dotyczy tylko elementów utworzonych po włączeniu; ręcznie ostylowane wiersze nigdy nie są nadpisywane, a wyłączenie nie cofa przypisań. Domyślnie wyłączone.',
|
|
1862
1970
|
'settings.appearance': 'Domyślny wygląd',
|
|
1863
|
-
'settings.appearance.hint': 'Wiersze bez własnych ustawień używają tego wyglądu; obrys tekstu jest domyślnie
|
|
1971
|
+
'settings.appearance.hint': 'Wiersze bez własnych ustawień używają tego wyglądu; obrys tekstu jest domyślnie wyłączony w nowych instalacjach — na czystym motywie wygląda jak wytłoczony szum, włącz go, gdy potrzebuje go obraz tła. Puste pole koloru oznacza podążanie za motywem.',
|
|
1864
1972
|
'settings.appearance.reset': 'Przywróć domyślny wygląd',
|
|
1865
1973
|
'custom.title': 'Dostosuj wygląd',
|
|
1866
1974
|
'custom.color': 'Kolor',
|
|
@@ -1990,6 +2098,15 @@ window.__ModuleLoader__.load({
|
|
|
1990
2098
|
'menu.moveToGroup': 'Mover para o grupo…',
|
|
1991
2099
|
'menu.moveOutGroup': 'Remover do grupo',
|
|
1992
2100
|
'menu.sessionId': 'Copiar ID da sessão',
|
|
2101
|
+
'menu.workspacePreset': 'Preset padrão do workspace…',
|
|
2102
|
+
'wsPreset.title': 'Alterar o preset padrão do workspace',
|
|
2103
|
+
'wsPreset.current': 'Preset padrão atual',
|
|
2104
|
+
'wsPreset.currentUnknown': 'Preset atual desconhecido',
|
|
2105
|
+
'wsPreset.noBlank': 'Nenhuma nova sessão em espera neste workspace; vale o padrão global',
|
|
2106
|
+
'wsPreset.empty': 'Nenhum preset disponível',
|
|
2107
|
+
'wsPreset.loadFailed': 'Falha ao carregar a lista de presets',
|
|
2108
|
+
'wsPreset.done': 'Preset padrão do workspace atualizado',
|
|
2109
|
+
'wsPreset.globalDefault': 'padrão global',
|
|
1993
2110
|
'toast.sessionIdCopied': 'ID da sessão copiado',
|
|
1994
2111
|
'toast.sessionIdCopyFailed': 'Falha ao copiar. Tente novamente.',
|
|
1995
2112
|
'settings.title': 'Espaços de trabalho melhores',
|
|
@@ -2018,7 +2135,7 @@ window.__ModuleLoader__.load({
|
|
|
2018
2135
|
'settings.autoStyle': 'Cor e ícone automáticos para novos itens',
|
|
2019
2136
|
'settings.autoStyle.hint': 'Quando ligado, cada nova sessão recebe uma cor da paleta embutida e cada novo espaço de trabalho também um ícone. Os 13 slots fixos são sorteados com embaralhamento e evitando as últimas escolhas. Cada slot tem duas cores — mais escura para o tema claro, mais clara para o tema escuro — e cada uma atinge no fundo do seu próprio tema contraste ≥4,5 (AA para texto normal); trocar de tema recolore o mesmo slot automaticamente. Só os itens criados depois de ligar são afetados; linhas que você estilizou à mão nunca são sobrescritas e desligar não desfaz o que já foi atribuído. Desligado por padrão.',
|
|
2020
2137
|
'settings.appearance': 'Aparência padrão',
|
|
2021
|
-
'settings.appearance.hint': 'Linhas sem personalização usam esta aparência; o contorno do texto vem
|
|
2138
|
+
'settings.appearance.hint': 'Linhas sem personalização usam esta aparência; o contorno do texto vem desativado por padrão nas novas instalações — num tema limpo parece ruído em relevo, ative-o quando uma imagem de fundo precisar dele. Deixe a cor vazia para seguir o tema.',
|
|
2022
2139
|
'settings.appearance.reset': 'Restaurar aparência padrão',
|
|
2023
2140
|
'custom.title': 'Personalizar aparência',
|
|
2024
2141
|
'custom.color': 'Cor',
|
|
@@ -2148,6 +2265,15 @@ window.__ModuleLoader__.load({
|
|
|
2148
2265
|
'menu.moveToGroup': 'Переместить в группу…',
|
|
2149
2266
|
'menu.moveOutGroup': 'Убрать из группы',
|
|
2150
2267
|
'menu.sessionId': 'Копировать ID сессии',
|
|
2268
|
+
'menu.workspacePreset': 'Пресет воркспейса по умолчанию…',
|
|
2269
|
+
'wsPreset.title': 'Изменить пресет воркспейса по умолчанию',
|
|
2270
|
+
'wsPreset.current': 'Текущий пресет по умолчанию',
|
|
2271
|
+
'wsPreset.currentUnknown': 'Текущий пресет неизвестен',
|
|
2272
|
+
'wsPreset.noBlank': 'В этом воркспейсе нет ожидающей новой сессии; действует глобальный пресет по умолчанию',
|
|
2273
|
+
'wsPreset.empty': 'Нет доступных пресетов',
|
|
2274
|
+
'wsPreset.loadFailed': 'Не удалось загрузить список пресетов',
|
|
2275
|
+
'wsPreset.done': 'Пресет воркспейса по умолчанию обновлён',
|
|
2276
|
+
'wsPreset.globalDefault': 'глобальный по умолчанию',
|
|
2151
2277
|
'toast.sessionIdCopied': 'ID сессии скопирован',
|
|
2152
2278
|
'toast.sessionIdCopyFailed': 'Не удалось скопировать. Попробуйте снова.',
|
|
2153
2279
|
'settings.title': 'Улучшенные рабочие области',
|
|
@@ -2176,7 +2302,7 @@ window.__ModuleLoader__.load({
|
|
|
2176
2302
|
'settings.autoStyle': 'Автоцвет и значок для новых элементов',
|
|
2177
2303
|
'settings.autoStyle.hint': 'Когда включено, каждый новый сеанс получает цвет из встроенной палитры, а новая рабочая область — ещё и значок. Тринадцать фиксированных слотов вытягиваются перемешиванием с избеганием недавних. У каждого слота два цвета — темнее для светлой темы, светлее для тёмной, — и каждый даёт на фоне своей темы контраст ≥4,5 (AA для обычного текста); при смене темы тот же слот перекрашивается автоматически. Затрагиваются только элементы, созданные после включения; строки, оформленные вручную, никогда не перезаписываются, а выключение не отменяет уже назначенное. По умолчанию выключено.',
|
|
2178
2304
|
'settings.appearance': 'Оформление по умолчанию',
|
|
2179
|
-
'settings.appearance.hint': 'Строки без своей настройки используют это оформление; обводка текста
|
|
2305
|
+
'settings.appearance.hint': 'Строки без своей настройки используют это оформление; обводка текста по умолчанию выключена в новых установках — на чистой теме она выглядит как тиснёный шум, включайте её, когда нужно фоновое изображение. Пустой цвет означает следование теме.',
|
|
2180
2306
|
'settings.appearance.reset': 'Вернуть оформление по умолчанию',
|
|
2181
2307
|
'custom.title': 'Настроить оформление',
|
|
2182
2308
|
'custom.color': 'Цвет',
|
|
@@ -2306,6 +2432,15 @@ window.__ModuleLoader__.load({
|
|
|
2306
2432
|
'menu.moveToGroup': 'Flytta till grupp…',
|
|
2307
2433
|
'menu.moveOutGroup': 'Flytta ut ur gruppen',
|
|
2308
2434
|
'menu.sessionId': 'Kopiera sessions-ID',
|
|
2435
|
+
'menu.workspacePreset': 'Standardförinställning för arbetsyta…',
|
|
2436
|
+
'wsPreset.title': 'Ändra standardförinställning för arbetsyta',
|
|
2437
|
+
'wsPreset.current': 'Aktuell standardförinställning',
|
|
2438
|
+
'wsPreset.currentUnknown': 'Aktuell förinställning okänd',
|
|
2439
|
+
'wsPreset.noBlank': 'Ingen väntande ny session i denna arbetsyta; den globala standarden gäller',
|
|
2440
|
+
'wsPreset.empty': 'Inga förinställningar tillgängliga',
|
|
2441
|
+
'wsPreset.loadFailed': 'Kunde inte läsa in förinställningslistan',
|
|
2442
|
+
'wsPreset.done': 'Standardförinställning för arbetsyta uppdaterad',
|
|
2443
|
+
'wsPreset.globalDefault': 'global standard',
|
|
2309
2444
|
'toast.sessionIdCopied': 'Sessions-ID kopierat',
|
|
2310
2445
|
'toast.sessionIdCopyFailed': 'Kopieringen misslyckades. Försök igen.',
|
|
2311
2446
|
'settings.title': 'Bättre arbetsytor',
|
|
@@ -2334,7 +2469,7 @@ window.__ModuleLoader__.load({
|
|
|
2334
2469
|
'settings.autoStyle': 'Automatisk färg och ikon för nya objekt',
|
|
2335
2470
|
'settings.autoStyle.hint': 'När den är på får varje ny session en färg från den inbyggda paletten och varje ny arbetsyta även en ikon. De tretton fasta platserna dras med blandning och undvikande av de senaste. Varje plats har två färger — mörkare för ljust tema, ljusare för mörkt — och båda når mot sin egen temas bakgrund kontrast ≥4,5 (AA för normal text); vid temabyte färgas samma plats om automatiskt. Endast objekt som skapas efter att du slagit på påverkas; rader du stilt själv skrivs aldrig över och att stänga av ångrar inte det som tilldelats. Av som standard.',
|
|
2336
2471
|
'settings.appearance': 'Standardutseende',
|
|
2337
|
-
'settings.appearance.hint': 'Rader utan egen anpassning använder detta utseende; textkonturen är
|
|
2472
|
+
'settings.appearance.hint': 'Rader utan egen anpassning använder detta utseende; textkonturen är av som standard vid nya installationer — på ett rent tema ser den ut som präglad brus, slå på den när en bakgrundsbild behöver den. Lämna färgen tom för att följa temat.',
|
|
2338
2473
|
'settings.appearance.reset': 'Återställ standardutseende',
|
|
2339
2474
|
'custom.title': 'Anpassa utseende',
|
|
2340
2475
|
'custom.color': 'Färg',
|
|
@@ -2464,6 +2599,15 @@ window.__ModuleLoader__.load({
|
|
|
2464
2599
|
'menu.moveToGroup': 'ย้ายไปยังกลุ่ม…',
|
|
2465
2600
|
'menu.moveOutGroup': 'ย้ายออกจากกลุ่ม',
|
|
2466
2601
|
'menu.sessionId': 'คัดลอก ID เซสชัน',
|
|
2602
|
+
'menu.workspacePreset': 'พรีเซ็ตเริ่มต้นของพื้นที่ทำงาน…',
|
|
2603
|
+
'wsPreset.title': 'เปลี่ยนพรีเซ็ตเริ่มต้นของพื้นที่ทำงาน',
|
|
2604
|
+
'wsPreset.current': 'พรีเซ็ตเริ่มต้นปัจจุบัน',
|
|
2605
|
+
'wsPreset.currentUnknown': 'ไม่ทราบพรีเซ็ตปัจจุบัน',
|
|
2606
|
+
'wsPreset.noBlank': 'ไม่มีเซสชันใหม่ที่รออยู่ในพื้นที่ทำงานนี้; ใช้ค่าเริ่มต้นส่วนกลาง',
|
|
2607
|
+
'wsPreset.empty': 'ไม่มีพรีเซ็ตที่ใช้ได้',
|
|
2608
|
+
'wsPreset.loadFailed': 'โหลดรายการพรีเซ็ตไม่สำเร็จ',
|
|
2609
|
+
'wsPreset.done': 'อัปเดตพรีเซ็ตเริ่มต้นของพื้นที่ทำงานแล้ว',
|
|
2610
|
+
'wsPreset.globalDefault': 'ค่าเริ่มต้นส่วนกลาง',
|
|
2467
2611
|
'toast.sessionIdCopied': 'คัดลอก ID เซสชันแล้ว',
|
|
2468
2612
|
'toast.sessionIdCopyFailed': 'คัดลอกไม่สำเร็จ โปรดลองอีกครั้ง',
|
|
2469
2613
|
'settings.title': 'พื้นที่ทำงานที่ดีขึ้น',
|
|
@@ -2492,7 +2636,7 @@ window.__ModuleLoader__.load({
|
|
|
2492
2636
|
'settings.autoStyle': 'สีและไอคอนอัตโนมัติสำหรับรายการใหม่',
|
|
2493
2637
|
'settings.autoStyle.hint': 'เมื่อเปิด ทุกเซสชันที่สร้างใหม่จะได้สีจากชุดสีในตัว และพื้นที่ทำงานใหม่จะได้ไอคอนด้วย สล็อตคงที่ 13 ช่องจะถูกสุ่มแบบสลับพร้อมหลีกเลี่ยงสีที่เพิ่งใช้ แต่ละช่องมีสองสี — สีเข้มสำหรับธีมสว่างและสีอ่อนสำหรับธีมมืด — และทุกสีมีคอนทราสต์ ≥4.5 (AA สำหรับข้อความทั่วไป) บนพื้นของธีมนั้น เมื่อสลับธีมช่องเดิมจะถูกระบายสีใหม่ให้อัตโนมัติ มีผลเฉพาะรายการที่สร้างหลังเปิดใช้ แถวที่คุณตั้งค่าเองจะไม่ถูกเขียนทับ และการปิดจะไม่เรียกคืนสิ่งที่แจกไปแล้ว ค่าเริ่มต้นคือปิด',
|
|
2494
2638
|
'settings.appearance': 'รูปลักษณ์เริ่มต้น',
|
|
2495
|
-
'settings.appearance.hint': 'แถวที่ยังไม่ได้กำหนดเองจะใช้รูปลักษณ์นี้
|
|
2639
|
+
'settings.appearance.hint': 'แถวที่ยังไม่ได้กำหนดเองจะใช้รูปลักษณ์นี้ เส้นขอบตัวอักษรปิดไว้เป็นค่าเริ่มต้นสำหรับการติดตั้งใหม่ — บนธีมสะอาดมันดูเหมือนจุดนูน จึงเปิดเมื่อภาพพื้นหลังต้องการ เว้นสีว่างไว้เพื่อตามธีม',
|
|
2496
2640
|
'settings.appearance.reset': 'คืนค่ารูปลักษณ์เริ่มต้น',
|
|
2497
2641
|
'custom.title': 'ปรับแต่งรูปลักษณ์',
|
|
2498
2642
|
'custom.color': 'สี',
|
|
@@ -2622,6 +2766,15 @@ window.__ModuleLoader__.load({
|
|
|
2622
2766
|
'menu.moveToGroup': 'Gruba taşı…',
|
|
2623
2767
|
'menu.moveOutGroup': 'Gruptan çıkar',
|
|
2624
2768
|
'menu.sessionId': 'Oturum kimliğini kopyala',
|
|
2769
|
+
'menu.workspacePreset': 'Çalışma alanı varsayılan ön ayarı…',
|
|
2770
|
+
'wsPreset.title': 'Çalışma alanı varsayılan ön ayarını değiştir',
|
|
2771
|
+
'wsPreset.current': 'Geçerli varsayılan ön ayar',
|
|
2772
|
+
'wsPreset.currentUnknown': 'Geçerli ön ayar bilinmiyor',
|
|
2773
|
+
'wsPreset.noBlank': 'Bu çalışma alanında bekleyen yeni oturum yok; genel varsayılan izlenir',
|
|
2774
|
+
'wsPreset.empty': 'Kullanılabilir ön ayar yok',
|
|
2775
|
+
'wsPreset.loadFailed': 'Ön ayar listesi yüklenemedi',
|
|
2776
|
+
'wsPreset.done': 'Çalışma alanı varsayılan ön ayarı güncellendi',
|
|
2777
|
+
'wsPreset.globalDefault': 'genel varsayılan',
|
|
2625
2778
|
'toast.sessionIdCopied': 'Oturum kimliği kopyalandı',
|
|
2626
2779
|
'toast.sessionIdCopyFailed': 'Kopyalama başarısız oldu. Lütfen tekrar deneyin.',
|
|
2627
2780
|
'settings.title': 'Daha iyi çalışma alanları',
|
|
@@ -2650,7 +2803,7 @@ window.__ModuleLoader__.load({
|
|
|
2650
2803
|
'settings.autoStyle': 'Yeni öğeler için otomatik renk ve simge',
|
|
2651
2804
|
'settings.autoStyle.hint': 'Açıkken yeni oluşturulan her oturuma yerleşik paletten bir renk, her yeni çalışma alanına ayrıca bir simge atanır. On üç sabit yuva karıştırma ve son kullanılanları atlama yöntemiyle çekilir. Her yuvanın iki rengi vardır — açık tema için daha koyu, koyu tema için daha açık — ve her biri kendi temasının zemininde ≥4,5 kontrast (normal metin için AA) sağlar; tema değiştiğinde aynı yuva otomatik olarak yeniden renklendirilir. Yalnızca açtıktan sonra oluşturulan öğeler etkilenir; elle biçimlendirdiğiniz satırlar hiçbir zaman üzerine yazılmaz ve kapatmak verilmiş stilleri geri almaz. Varsayılan olarak kapalı.',
|
|
2652
2805
|
'settings.appearance': 'Varsayılan görünüm',
|
|
2653
|
-
'settings.appearance.hint': 'Özel olarak uyarlanmamış satırlar bu görünümü kullanır; metin konturu varsayılan olarak
|
|
2806
|
+
'settings.appearance.hint': 'Özel olarak uyarlanmamış satırlar bu görünümü kullanır; metin konturu yeni kurulumlarda varsayılan olarak kapalıdır — sade bir temada kabartma gürültüsü gibi durur, arka plan görseli gerektirdiğinde açın. Rengi boş bırakırsanız temayı izler.',
|
|
2654
2807
|
'settings.appearance.reset': 'Varsayılan görünüme dön',
|
|
2655
2808
|
'custom.title': 'Görünümü özelleştir',
|
|
2656
2809
|
'custom.color': 'Renk',
|
|
@@ -2780,6 +2933,15 @@ window.__ModuleLoader__.load({
|
|
|
2780
2933
|
'menu.moveToGroup': 'Chuyển vào nhóm…',
|
|
2781
2934
|
'menu.moveOutGroup': 'Đưa ra khỏi nhóm',
|
|
2782
2935
|
'menu.sessionId': 'Sao chép ID phiên',
|
|
2936
|
+
'menu.workspacePreset': 'Preset mặc định của không gian làm việc…',
|
|
2937
|
+
'wsPreset.title': 'Thay đổi preset mặc định của không gian làm việc',
|
|
2938
|
+
'wsPreset.current': 'Preset mặc định hiện tại',
|
|
2939
|
+
'wsPreset.currentUnknown': 'Không rõ preset hiện tại',
|
|
2940
|
+
'wsPreset.noBlank': 'Không gian làm việc này chưa có phiên mới đang chờ; đang theo mặc định toàn cục',
|
|
2941
|
+
'wsPreset.empty': 'Không có preset khả dụng',
|
|
2942
|
+
'wsPreset.loadFailed': 'Không tải được danh sách preset',
|
|
2943
|
+
'wsPreset.done': 'Đã cập nhật preset mặc định của không gian làm việc',
|
|
2944
|
+
'wsPreset.globalDefault': 'mặc định toàn cục',
|
|
2783
2945
|
'toast.sessionIdCopied': 'Đã sao chép ID phiên',
|
|
2784
2946
|
'toast.sessionIdCopyFailed': 'Sao chép thất bại. Hãy thử lại.',
|
|
2785
2947
|
'settings.title': 'Không gian làm việc tốt hơn',
|
|
@@ -2808,7 +2970,7 @@ window.__ModuleLoader__.load({
|
|
|
2808
2970
|
'settings.autoStyle': 'Tự động tô màu và biểu tượng cho mục mới',
|
|
2809
2971
|
'settings.autoStyle.hint': 'Khi bật, mỗi phiên mới nhận một màu từ bảng màu tích hợp và mỗi không gian làm việc mới còn nhận thêm biểu tượng. Mười ba ô cố định được rút theo cách xáo trộn và tránh các màu vừa dùng. Mỗi ô có hai màu — đậm hơn cho giao diện sáng và nhạt hơn cho giao diện tối — và mỗi màu đạt độ tương phản ≥4,5 (AA cho chữ thường) trên nền của giao diện tương ứng; khi đổi giao diện, chính ô đó được tô lại tự động. Chỉ những mục tạo sau khi bật mới bị ảnh hưởng; hàng bạn tự tô màu không bao giờ bị ghi đè, và tắt đi không thu hồi những gì đã gán. Mặc định tắt.',
|
|
2810
2972
|
'settings.appearance': 'Giao diện mặc định',
|
|
2811
|
-
'settings.appearance.hint': 'Những hàng chưa tùy chỉnh riêng dùng giao diện này; viền chữ mặc định
|
|
2973
|
+
'settings.appearance.hint': 'Những hàng chưa tùy chỉnh riêng dùng giao diện này; viền chữ mặc định tắt trên bản cài mới — trên chủ đề sạch nó giống chấm nổi, hãy bật khi ảnh nền cần. Để trống màu để theo chủ đề.',
|
|
2812
2974
|
'settings.appearance.reset': 'Khôi phục giao diện mặc định',
|
|
2813
2975
|
'custom.title': 'Tùy chỉnh giao diện',
|
|
2814
2976
|
'custom.color': 'Màu',
|
|
@@ -2938,6 +3100,15 @@ window.__ModuleLoader__.load({
|
|
|
2938
3100
|
'menu.moveToGroup': '移動到分組…',
|
|
2939
3101
|
'menu.moveOutGroup': '移出分組',
|
|
2940
3102
|
'menu.sessionId': '複製 Session ID',
|
|
3103
|
+
'menu.workspacePreset': '修改工作區預設…',
|
|
3104
|
+
'wsPreset.title': '修改工作區預設',
|
|
3105
|
+
'wsPreset.current': '目前預設',
|
|
3106
|
+
'wsPreset.currentUnknown': '目前預設未知',
|
|
3107
|
+
'wsPreset.noBlank': '此工作區暫無待命的新會話,目前跟隨全域預設',
|
|
3108
|
+
'wsPreset.empty': '沒有可用的預設',
|
|
3109
|
+
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3110
|
+
'wsPreset.done': '已更新工作區預設',
|
|
3111
|
+
'wsPreset.globalDefault': '全域預設',
|
|
2941
3112
|
'toast.sessionIdCopied': 'Session ID 已複製',
|
|
2942
3113
|
'toast.sessionIdCopyFailed': '複製失敗,請重試',
|
|
2943
3114
|
'settings.title': '更好嘅工作區',
|
|
@@ -2966,7 +3137,7 @@ window.__ModuleLoader__.load({
|
|
|
2966
3137
|
'settings.autoStyle': '新增項目自動配色',
|
|
2967
3138
|
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個槽位有兩隻色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩隻喺各自主題嘅背景上對比度都 ≥4.5,達到 WCAG 正文級 AA;換主題會自動為同一個槽位換色,唔使重新設定。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
2968
3139
|
'settings.appearance': '預設外觀',
|
|
2969
|
-
'settings.appearance.hint': '
|
|
3140
|
+
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊新安裝預設關閉——乾淨主題下描邊似浮凸噪點,配背景圖時先開。字體顏色留空就會跟主題。',
|
|
2970
3141
|
'settings.appearance.reset': '還原預設外觀',
|
|
2971
3142
|
'custom.title': '自訂外觀',
|
|
2972
3143
|
'custom.color': '顏色',
|
|
@@ -3096,6 +3267,15 @@ window.__ModuleLoader__.load({
|
|
|
3096
3267
|
'menu.moveToGroup': '移動到分組…',
|
|
3097
3268
|
'menu.moveOutGroup': '移出分組',
|
|
3098
3269
|
'menu.sessionId': '複製 Session ID',
|
|
3270
|
+
'menu.workspacePreset': '修改工作區預設…',
|
|
3271
|
+
'wsPreset.title': '修改工作區預設',
|
|
3272
|
+
'wsPreset.current': '目前預設',
|
|
3273
|
+
'wsPreset.currentUnknown': '目前預設未知',
|
|
3274
|
+
'wsPreset.noBlank': '此工作區暫無待命的新會話,目前跟隨全域預設',
|
|
3275
|
+
'wsPreset.empty': '沒有可用的預設',
|
|
3276
|
+
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3277
|
+
'wsPreset.done': '已更新工作區預設',
|
|
3278
|
+
'wsPreset.globalDefault': '全域預設',
|
|
3099
3279
|
'toast.sessionIdCopied': 'Session ID 已複製',
|
|
3100
3280
|
'toast.sessionIdCopyFailed': '複製失敗,請重試',
|
|
3101
3281
|
'settings.title': '更好嘅工作區',
|
|
@@ -3124,7 +3304,7 @@ window.__ModuleLoader__.load({
|
|
|
3124
3304
|
'settings.autoStyle': '新增項目自動配色',
|
|
3125
3305
|
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個槽位有兩隻色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩隻喺各自主題嘅背景上對比度都 ≥4.5,達到 WCAG 正文級 AA;換主題會自動為同一個槽位換色,唔使重新設定。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
3126
3306
|
'settings.appearance': '預設外觀',
|
|
3127
|
-
'settings.appearance.hint': '
|
|
3307
|
+
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊新安裝預設關閉——乾淨主題下描邊似浮凸噪點,配背景圖時先開。字體顏色留空就會跟主題。',
|
|
3128
3308
|
'settings.appearance.reset': '還原預設外觀',
|
|
3129
3309
|
'custom.title': '自訂外觀',
|
|
3130
3310
|
'custom.color': '顏色',
|
|
@@ -3254,6 +3434,15 @@ window.__ModuleLoader__.load({
|
|
|
3254
3434
|
'menu.moveToGroup': '移動到分組…',
|
|
3255
3435
|
'menu.moveOutGroup': '移出分組',
|
|
3256
3436
|
'menu.sessionId': '複製 Session ID',
|
|
3437
|
+
'menu.workspacePreset': '修改工作區預設…',
|
|
3438
|
+
'wsPreset.title': '修改工作區預設',
|
|
3439
|
+
'wsPreset.current': '目前預設',
|
|
3440
|
+
'wsPreset.currentUnknown': '目前預設未知',
|
|
3441
|
+
'wsPreset.noBlank': '此工作區暫無待命的新會話,目前跟隨全域預設',
|
|
3442
|
+
'wsPreset.empty': '沒有可用的預設',
|
|
3443
|
+
'wsPreset.loadFailed': '預設清單讀取失敗',
|
|
3444
|
+
'wsPreset.done': '已更新工作區預設',
|
|
3445
|
+
'wsPreset.globalDefault': '全域預設',
|
|
3257
3446
|
'toast.sessionIdCopied': 'Session ID 已複製',
|
|
3258
3447
|
'toast.sessionIdCopyFailed': '複製失敗,請重試',
|
|
3259
3448
|
'settings.title': '更好的工作區',
|
|
@@ -3282,7 +3471,7 @@ window.__ModuleLoader__.load({
|
|
|
3282
3471
|
'settings.autoStyle': '新增項目自動配色與圖示',
|
|
3283
3472
|
'settings.autoStyle.hint': '開啟後,新建立的工作階段會自動分到一個內建色,新工作區還會分到一個圖示;顏色從 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增不會撞色。每個槽位各有兩色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩色在各自主題背景下對比度都 ≥4.5,達到 WCAG 正文級 AA;切換主題時同一個槽位會自動換色,不需重新設定。只影響開啟之後新建的項目;你手動設定過外觀的列永遠不會被覆蓋,關閉開關也不會回收已分配的樣式。預設關閉。',
|
|
3284
3473
|
'settings.appearance': '預設外觀',
|
|
3285
|
-
'settings.appearance.hint': '
|
|
3474
|
+
'settings.appearance.hint': '未個別自訂過的列會使用這套外觀;字型外框新安裝預設關閉——乾淨佈景主題下外框像浮凸雜訊,需要背景圖片時再開啟。字型顏色留空即跟隨佈景主題。',
|
|
3286
3475
|
'settings.appearance.reset': '還原預設外觀',
|
|
3287
3476
|
'custom.title': '自訂外觀',
|
|
3288
3477
|
'custom.color': '顏色',
|
|
@@ -4405,7 +4594,15 @@ window.__ModuleLoader__.load({
|
|
|
4405
4594
|
.split('/').map((s) => s.trim()).filter((s) => s !== '').join('/')
|
|
4406
4595
|
|
|
4407
4596
|
const createViewStore = () => storeKit.defineStore({
|
|
4408
|
-
|
|
4597
|
+
// prefs.appearance bakes the shipped default (v0.31.0: stroke OFF) so a
|
|
4598
|
+
// fresh install — which never hydrates — starts outline-free, while a
|
|
4599
|
+
// hydrated snapshot without an appearance record keeps the legacy ON
|
|
4600
|
+
// default through readAppearance (see DEFAULT_APPEARANCE for the full
|
|
4601
|
+
// workspaceSlashOf-style three-population story). The record is a
|
|
4602
|
+
// LITERAL, not a spread of DEFAULT_APPEARANCE: init() is eval-harness
|
|
4603
|
+
// friendly (no cross-section reference), and the smoke suite asserts the
|
|
4604
|
+
// two stay in lockstep field by field.
|
|
4605
|
+
init: () => ({ expanded: {}, sessionsExpanded: {}, sessionGroups: {}, sessionOrder: {}, prefs: { compactChains: true, sessionLimit: 0, appearance: { color: '', glow: 0, weight: 0, shadow: false, stroke: false, strokeWidth: 1, strokeColor: '#808080' } }, styling: {}, groupBy: 'workspace-tree', orderBy: 'manual', archivedFilter: 'default', workspaceGroupMode: 'disk', sessionTitleSlash: true, workspaceTitleSlash: false, ungroupedOpen: true, folders: { ws: {}, sess: {} } }),
|
|
4409
4606
|
// NOTE: hydration REPLACES the state with the persisted whole value —
|
|
4410
4607
|
// init defaults never merge. Every action must tolerate a missing key
|
|
4411
4608
|
// (states persisted by older plugin versions lack sessionGroups), and
|
|
@@ -5043,6 +5240,115 @@ window.__ModuleLoader__.load({
|
|
|
5043
5240
|
)
|
|
5044
5241
|
}
|
|
5045
5242
|
|
|
5243
|
+
/**
|
|
5244
|
+
* "Change workspace default preset" (v0.32.0): a workspace's default
|
|
5245
|
+
* preset IS the agentPreset projection of its standing BLANK session, so
|
|
5246
|
+
* this dialog reads the preset roster (the same remote channel the
|
|
5247
|
+
* official hero chip reads) and swaps that blank's composition. Without a
|
|
5248
|
+
* blank the workspace follows the GLOBAL default — say so instead of
|
|
5249
|
+
* promising an edit; a host refusal surfaces inline with its own reason.
|
|
5250
|
+
* applyPreset is null exactly when no blank exists (or the face is
|
|
5251
|
+
* absent); the roster is a feature-probed plugin-side read.
|
|
5252
|
+
*/
|
|
5253
|
+
function WorkspacePresetDialog({ applyPreset, loadRoster, current, onApplied, onClose, t }) {
|
|
5254
|
+
const hasBlank = typeof applyPreset === 'function'
|
|
5255
|
+
const menuReady = typeof ui.Menu === 'function'
|
|
5256
|
+
const [status, setStatus] = React.useState('loading') // loading | ready | error
|
|
5257
|
+
const [rows, setRows] = React.useState([])
|
|
5258
|
+
const [picked, setPicked] = React.useState('')
|
|
5259
|
+
const [errorText, setErrorText] = React.useState('')
|
|
5260
|
+
const [busy, setBusy] = React.useState(false)
|
|
5261
|
+
React.useEffect(() => {
|
|
5262
|
+
if (typeof loadRoster !== 'function') { setStatus('error'); setErrorText(t('wsPreset.loadFailed')); return undefined }
|
|
5263
|
+
let alive = true
|
|
5264
|
+
Promise.resolve().then(loadRoster).then((roster) => {
|
|
5265
|
+
if (!alive) return
|
|
5266
|
+
if (!roster || !roster.ok) {
|
|
5267
|
+
setStatus('error')
|
|
5268
|
+
setErrorText(roster && roster.error ? String(roster.error) : t('wsPreset.loadFailed'))
|
|
5269
|
+
return
|
|
5270
|
+
}
|
|
5271
|
+
// Selector discipline (official preset picker): broken rows drop.
|
|
5272
|
+
const list = (Array.isArray(roster.presets) ? roster.presets : [])
|
|
5273
|
+
.filter((row) => row && row.id && row.broken !== true)
|
|
5274
|
+
setRows(list)
|
|
5275
|
+
// Pre-pick the workspace's CURRENT preset, like the official chip
|
|
5276
|
+
// shows the live selection; unknown (projection not loaded yet)
|
|
5277
|
+
// leaves confirm disabled until the user picks one.
|
|
5278
|
+
if (current && list.some((row) => row.id === current)) setPicked(current)
|
|
5279
|
+
setStatus('ready')
|
|
5280
|
+
}, (reason) => {
|
|
5281
|
+
if (!alive) return
|
|
5282
|
+
setStatus('error')
|
|
5283
|
+
setErrorText(reason instanceof Error ? reason.message : String(reason || t('wsPreset.loadFailed')))
|
|
5284
|
+
})
|
|
5285
|
+
return () => { alive = false }
|
|
5286
|
+
}, [])
|
|
5287
|
+
const nameOf = (id) => {
|
|
5288
|
+
for (const row of rows) { if (row.id === id) return row.name || row.id }
|
|
5289
|
+
return id
|
|
5290
|
+
}
|
|
5291
|
+
const options = rows.map((row) => ({
|
|
5292
|
+
value: row.id,
|
|
5293
|
+
label: (row.name || row.id) + (row.isDefault ? ' (' + t('wsPreset.globalDefault') + ')' : ''),
|
|
5294
|
+
}))
|
|
5295
|
+
const commit = () => {
|
|
5296
|
+
if (busy || !picked) { onClose(); return }
|
|
5297
|
+
// Picking the CURRENT preset is a no-op: no host round-trip, just close.
|
|
5298
|
+
if (picked === current) { onClose(); return }
|
|
5299
|
+
setBusy(true)
|
|
5300
|
+
setErrorText('')
|
|
5301
|
+
Promise.resolve().then(() => applyPreset(picked)).then((result) => {
|
|
5302
|
+
if (result && result.ok) { onApplied(); onClose(); return }
|
|
5303
|
+
setBusy(false)
|
|
5304
|
+
setErrorText(result && result.refusal ? String(result.refusal) : t('wsPreset.loadFailed'))
|
|
5305
|
+
}, (reason) => {
|
|
5306
|
+
setBusy(false)
|
|
5307
|
+
setErrorText(reason instanceof Error ? reason.message : String(reason || t('wsPreset.loadFailed')))
|
|
5308
|
+
})
|
|
5309
|
+
}
|
|
5310
|
+
const currentLine = !hasBlank ? t('wsPreset.noBlank')
|
|
5311
|
+
: current ? t('wsPreset.current') + ': ' + nameOf(current)
|
|
5312
|
+
: t('wsPreset.currentUnknown')
|
|
5313
|
+
return E(ui.Modal, {
|
|
5314
|
+
open: true,
|
|
5315
|
+
onClose,
|
|
5316
|
+
closeLabel: t('close'),
|
|
5317
|
+
title: t('wsPreset.title'),
|
|
5318
|
+
footer: E('div', { className: 'bw-modal-actions' },
|
|
5319
|
+
hasBlank ? E(BTN, { variant: 'outline', onClick: onClose, disabled: busy }, t('cancel')) : null,
|
|
5320
|
+
hasBlank
|
|
5321
|
+
? E(BTN, { variant: 'primary', onClick: commit, disabled: busy || !picked || picked === current }, t('confirm'))
|
|
5322
|
+
: E(BTN, { variant: 'primary', onClick: onClose }, t('close')),
|
|
5323
|
+
),
|
|
5324
|
+
},
|
|
5325
|
+
E('div', { className: 'bw-modal-body' },
|
|
5326
|
+
status === 'error' ? E('div', { className: 'bw-error-text', role: 'alert' }, errorText) : null,
|
|
5327
|
+
status === 'ready' && hasBlank ? (
|
|
5328
|
+
rows.length === 0
|
|
5329
|
+
? E('div', { className: 'bw-hint' }, t('wsPreset.empty'))
|
|
5330
|
+
: E('div', { className: 'bw-field' },
|
|
5331
|
+
menuReady
|
|
5332
|
+
? E(MenuPicker, { options, value: picked, onPick: setPicked, t })
|
|
5333
|
+
: E('select', {
|
|
5334
|
+
className: 'bw-input',
|
|
5335
|
+
value: picked,
|
|
5336
|
+
onChange: (e) => setPicked(e.target.value),
|
|
5337
|
+
}, rows.map((row) => {
|
|
5338
|
+
const option = options.find((item) => item.value === row.id)
|
|
5339
|
+
return E('option', { key: row.id, value: row.id }, option ? option.label : row.id)
|
|
5340
|
+
})),
|
|
5341
|
+
)
|
|
5342
|
+
) : null,
|
|
5343
|
+
E('div', { className: 'bw-hint' }, currentLine),
|
|
5344
|
+
status === 'ready' && hasBlank && errorText !== ''
|
|
5345
|
+
? E('div', { className: 'bw-error-text', role: 'alert' }, errorText)
|
|
5346
|
+
: null,
|
|
5347
|
+
),
|
|
5348
|
+
StyleNode(),
|
|
5349
|
+
)
|
|
5350
|
+
}
|
|
5351
|
+
|
|
5046
5352
|
/**
|
|
5047
5353
|
* Render crash insurance: dsh boots all-or-nothing (one failed entry
|
|
5048
5354
|
* fails the whole web boot) and React unmounts the root on an uncaught
|
|
@@ -5173,7 +5479,14 @@ window.__ModuleLoader__.load({
|
|
|
5173
5479
|
// The outline color defaults to a plain gray: it reads on light and dark
|
|
5174
5480
|
// backgrounds alike without shouting like pure black/white. "auto" derives
|
|
5175
5481
|
// the contrasting pole from the font color instead.
|
|
5176
|
-
|
|
5482
|
+
// Since v0.31.0 the outline SHIPS OFF: on a clean theme it reads as
|
|
5483
|
+
// embossed noise, and only a background image ever needed it. The legacy
|
|
5484
|
+
// ON default survives for existing installs through readAppearance (the
|
|
5485
|
+
// workspaceSlashOf pattern: hydration runs only when a snapshot exists,
|
|
5486
|
+
// so a missing appearance record means "this browser predates the flip"
|
|
5487
|
+
// and keeps the outline it was built with). Fresh installs never hydrate;
|
|
5488
|
+
// createViewStore's init bakes this default into prefs.appearance.
|
|
5489
|
+
const DEFAULT_APPEARANCE = { color: '', glow: 0, weight: 0, shadow: false, stroke: false, strokeWidth: 1, strokeColor: '#808080' }
|
|
5177
5490
|
const APPEARANCE_FIELDS = ['color', 'glow', 'weight', 'shadow', 'stroke', 'strokeWidth', 'strokeColor']
|
|
5178
5491
|
const clampStrokeWidth = (raw) => {
|
|
5179
5492
|
const n = Number(raw)
|
|
@@ -5182,7 +5495,10 @@ window.__ModuleLoader__.load({
|
|
|
5182
5495
|
}
|
|
5183
5496
|
// Persisted values arrive from older plugin versions and from the other
|
|
5184
5497
|
// surface: every read tolerates missing keys and falls back to the default
|
|
5185
|
-
// (hydration replaces state wholesale — the 0.9.x hard rule).
|
|
5498
|
+
// (hydration replaces state wholesale — the 0.9.x hard rule). For stroke
|
|
5499
|
+
// the fallback is the LEGACY ON, not DEFAULT_APPEARANCE.stroke: a missing
|
|
5500
|
+
// key means a snapshot from before v0.31.0, and those builds shipped the
|
|
5501
|
+
// outline enabled — an upgrade must not silently restyle an existing tree.
|
|
5186
5502
|
const readAppearance = (raw) => {
|
|
5187
5503
|
const src = raw && typeof raw === 'object' ? raw : {}
|
|
5188
5504
|
return {
|
|
@@ -5196,8 +5512,9 @@ window.__ModuleLoader__.load({
|
|
|
5196
5512
|
}
|
|
5197
5513
|
}
|
|
5198
5514
|
// A row's own entry overrides the default appearance FIELD BY FIELD, so a
|
|
5199
|
-
// row customized before this version (no stroke key) still inherits the
|
|
5200
|
-
//
|
|
5515
|
+
// row customized before this version (no stroke key) still inherits the
|
|
5516
|
+
// effective base — the legacy ON on upgraded installs, the shipped OFF on
|
|
5517
|
+
// fresh ones — instead of being reset to a different era's look.
|
|
5201
5518
|
const mergeAppearance = (base, entry) => {
|
|
5202
5519
|
if (!entry || typeof entry !== 'object') return readAppearance(base)
|
|
5203
5520
|
const merged = { ...base }
|
|
@@ -6620,6 +6937,7 @@ window.__ModuleLoader__.load({
|
|
|
6620
6937
|
sidebarFlowEntry,
|
|
6621
6938
|
shippedBrowserFace, scheduleSeatReader,
|
|
6622
6939
|
officialT,
|
|
6940
|
+
presetFace,
|
|
6623
6941
|
t,
|
|
6624
6942
|
} = props
|
|
6625
6943
|
|
|
@@ -8405,6 +8723,11 @@ window.__ModuleLoader__.load({
|
|
|
8405
8723
|
{ type: 'separator', id: 'bw-sep' },
|
|
8406
8724
|
...wsGroupItems,
|
|
8407
8725
|
customizeEntry,
|
|
8726
|
+
// v0.32.0: the workspace default preset. Rides the official
|
|
8727
|
+
// agent-preset roster + blank-composition channels (the hero
|
|
8728
|
+
// chip's remotes); hidden entirely where the host lacks them —
|
|
8729
|
+
// older hosts simply never offer what they cannot do.
|
|
8730
|
+
...(presetFace ? [{ id: 'ws-preset', label: t('menu.workspacePreset'), icon: icon('IconAgentPresetOutlineRegular', 16) }] : []),
|
|
8408
8731
|
]
|
|
8409
8732
|
if (ctx.kind === 'session') {
|
|
8410
8733
|
// Official 0.1.7 mirror (Rows.tsx session menu + the shipped slot
|
|
@@ -8486,6 +8809,30 @@ window.__ModuleLoader__.load({
|
|
|
8486
8809
|
else if (kind === 'sgroup' && id === 'delete-sgroup') setDialog({ kind: 'sgroup-delete', target: payload })
|
|
8487
8810
|
else if (kind === 'workspace' && id === 'rename') setDialog({ kind: 'ws-rename', workspace: payload })
|
|
8488
8811
|
else if (kind === 'workspace' && id === 'delete') setDialog({ kind: 'ws-delete', workspace: payload })
|
|
8812
|
+
else if (kind === 'workspace' && id === 'ws-preset' && presetFace) {
|
|
8813
|
+
// Freeze the target NOW (the dialog outlives the menu ctx): the
|
|
8814
|
+
// blank lookup mirrors the official createInWorkspace rule — a
|
|
8815
|
+
// standing blank IS the workspace default (its preset projection
|
|
8816
|
+
// is what the hero chip shows); none → the workspace follows the
|
|
8817
|
+
// GLOBAL default and the dialog says so instead of promising an
|
|
8818
|
+
// edit. No session is ever created for the edit.
|
|
8819
|
+
const raw = (storedItems || []).find((item) => item.workspaceId === payload.workspaceId)
|
|
8820
|
+
const blankIds = raw && Array.isArray(raw.sessionIds) ? raw.sessionIds : []
|
|
8821
|
+
const blankId = raw && raw.path
|
|
8822
|
+
? (list.ids || []).find((sid) => {
|
|
8823
|
+
const summary = list.byId[sid]
|
|
8824
|
+
return summary && summary.blank === true && summary.cwd === raw.path
|
|
8825
|
+
&& blankIds.indexOf(sid) !== -1 && !archivedSet.has(sid)
|
|
8826
|
+
})
|
|
8827
|
+
: undefined
|
|
8828
|
+
const blankSummary = blankId !== undefined ? list.byId[blankId] : undefined
|
|
8829
|
+
const projection = blankSummary ? blankSummary.projectionValues : undefined
|
|
8830
|
+
setDialog({
|
|
8831
|
+
kind: 'ws-preset',
|
|
8832
|
+
applyPreset: blankId !== undefined ? (presetId) => presetFace.select(blankId, presetId) : null,
|
|
8833
|
+
current: projection && typeof projection.agentPreset === 'string' ? projection.agentPreset : undefined,
|
|
8834
|
+
})
|
|
8835
|
+
}
|
|
8489
8836
|
else if (kind === 'sgroup' && id === 'rename-sgroup') setDialog({ kind: 'sgroup-rename', target: payload })
|
|
8490
8837
|
else if (kind === 'session' && id === 'rename') setDialog({ kind: 'sess-rename', session: payload })
|
|
8491
8838
|
else if (kind === 'session' && id === 'fork') forkSession(payload.id)
|
|
@@ -8707,6 +9054,17 @@ window.__ModuleLoader__.load({
|
|
|
8707
9054
|
),
|
|
8708
9055
|
)
|
|
8709
9056
|
}
|
|
9057
|
+
if (dialog.kind === 'ws-preset') return E(WorkspacePresetDialog, {
|
|
9058
|
+
key: 'ws-preset',
|
|
9059
|
+
applyPreset: dialog.applyPreset,
|
|
9060
|
+
loadRoster: presetFace ? presetFace.list : null,
|
|
9061
|
+
current: dialog.current,
|
|
9062
|
+
// Success closes with the same notice pipeline as copy-session-id
|
|
9063
|
+
// (see copyNoticeText); refusal errors stay inline in the dialog.
|
|
9064
|
+
onApplied: () => setCopyNotice((prev) => ({ seq: (prev ? prev.seq : 0) + 1, ok: true, text: t('wsPreset.done') })),
|
|
9065
|
+
onClose: () => setDialog(null),
|
|
9066
|
+
t,
|
|
9067
|
+
})
|
|
8710
9068
|
return null
|
|
8711
9069
|
})()
|
|
8712
9070
|
|
|
@@ -8783,9 +9141,14 @@ window.__ModuleLoader__.load({
|
|
|
8783
9141
|
|
|
8784
9142
|
// Copy-session-id notice copy: the official 'workspace' dictionary is
|
|
8785
9143
|
// the source of truth, this plugin's aligned fallback covers older hosts.
|
|
9144
|
+
// Copy-session-id notice copy: the official 'workspace' dictionary is
|
|
9145
|
+
// the source of truth, this plugin's aligned fallback covers older
|
|
9146
|
+
// hosts. An explicit `text` override (v0.32.0 workspace-preset done
|
|
9147
|
+
// notice) reuses the same toast pipeline with its own copy.
|
|
8786
9148
|
const copyNoticeText = copyNotice
|
|
8787
|
-
?
|
|
8788
|
-
|
|
9149
|
+
? (typeof copyNotice.text === 'string' ? copyNotice.text
|
|
9150
|
+
: officialText(copyNotice.ok ? 'toast.sessionIdCopied' : 'toast.sessionIdCopyFailed',
|
|
9151
|
+
undefined, t(copyNotice.ok ? 'toast.sessionIdCopied' : 'toast.sessionIdCopyFailed')))
|
|
8789
9152
|
: ''
|
|
8790
9153
|
|
|
8791
9154
|
return E('div', { className: cls('bw-root', sessionCouldLeaveGroup && 'bw-root-drop-out'), ...rootDropEvents },
|
|
@@ -8997,6 +9360,72 @@ window.__ModuleLoader__.load({
|
|
|
8997
9360
|
let officialT = null
|
|
8998
9361
|
try { officialT = ctx.locale.bind('workspace') } catch { officialT = null }
|
|
8999
9362
|
|
|
9363
|
+
// v0.32.0: the agent-preset face — {list, select} over the same remote
|
|
9364
|
+
// channels the official hero preset chip uses. v0.32.1 probe fix: the
|
|
9365
|
+
// official bundles reach it as the PROPERTY CHAIN ctx.remote.agentPresets
|
|
9366
|
+
// (their inject list declares it as the 'remote.agentPresets' fiber
|
|
9367
|
+
// service) — the client side has NO catalogued 'remote' service, so the
|
|
9368
|
+
// explicit ctx.get('remote') v0.32.0 shipped threw, the catch swallowed
|
|
9369
|
+
// it, and the menu row silently hid. Property chain first, explicit get
|
|
9370
|
+
// as the fallback, and a shape dump on failure so any future regression
|
|
9371
|
+
// is diagnosable straight from the console.
|
|
9372
|
+
let presetFace = null
|
|
9373
|
+
try {
|
|
9374
|
+
let remote = null
|
|
9375
|
+
try { remote = ctx.remote } catch { remote = null }
|
|
9376
|
+
if (!remote || !remote.agentPresets) {
|
|
9377
|
+
try {
|
|
9378
|
+
const viaGet = ctx.get('remote')
|
|
9379
|
+
if (viaGet && (!remote || !remote.agentPresets)) remote = viaGet
|
|
9380
|
+
} catch { /* keep the property-chain result */ }
|
|
9381
|
+
}
|
|
9382
|
+
const agentPresets = remote && remote.agentPresets
|
|
9383
|
+
if (!agentPresets) {
|
|
9384
|
+
console.warn('[dsh-better-workspace] agent-preset probe: remote.agentPresets unavailable', {
|
|
9385
|
+
remoteType: typeof remote,
|
|
9386
|
+
remoteKeys: remote ? Object.keys(remote).slice(0, 40) : null,
|
|
9387
|
+
})
|
|
9388
|
+
}
|
|
9389
|
+
if (agentPresets && typeof agentPresets.list === 'function' && typeof agentPresets.select === 'function') {
|
|
9390
|
+
presetFace = {
|
|
9391
|
+
// readRoster mirror: a gateway hiccup
|
|
9392
|
+
// ('gateway/invocation-unavailable') maps to an EMPTY roster,
|
|
9393
|
+
// exactly like the official selector does; every other failure
|
|
9394
|
+
// surfaces with its message.
|
|
9395
|
+
list: async () => {
|
|
9396
|
+
try {
|
|
9397
|
+
const result = await agentPresets.list()
|
|
9398
|
+
if (result && result.ok) return { ok: true, presets: (result.value && result.value.presets) || [] }
|
|
9399
|
+
const code = result && result.error ? result.error.code : undefined
|
|
9400
|
+
if (code === 'gateway/invocation-unavailable') return { ok: true, presets: [] }
|
|
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
|
+
},
|
|
9422
|
+
}
|
|
9423
|
+
}
|
|
9424
|
+
} catch (presetFaceError) {
|
|
9425
|
+
console.warn('[dsh-better-workspace] agent-preset face unavailable', presetFaceError)
|
|
9426
|
+
presetFace = null
|
|
9427
|
+
}
|
|
9428
|
+
|
|
9000
9429
|
if (ctx.locale && typeof ctx.locale.register === 'function') {
|
|
9001
9430
|
ctx.effect(() => {
|
|
9002
9431
|
try {
|
|
@@ -9050,6 +9479,10 @@ window.__ModuleLoader__.load({
|
|
|
9050
9479
|
// Official 'workspace' dictionary translate (menu copy follows upstream);
|
|
9051
9480
|
// null when the bind failed — the menu then uses the aligned bw copy.
|
|
9052
9481
|
officialT,
|
|
9482
|
+
// v0.32.0: {list, select} over the agent-preset remotes — the same
|
|
9483
|
+
// two channels the official hero chip uses; null when the host lacks
|
|
9484
|
+
// the service, which simply hides the workspace-preset menu row.
|
|
9485
|
+
presetFace,
|
|
9053
9486
|
// The shipped sidebar's OWN face (dsh 0.1.7-rc.2): the shortcut request
|
|
9054
9487
|
// channel and the catalog of effective keybindings. Both belong to the
|
|
9055
9488
|
// entry this seat shadows, so they are read off the ledger and consumed
|