@dsh-workbench/core 0.3.6 → 0.3.7
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/client.js +1260 -1928
- package/dist/client/client.body.js +1260 -1928
- package/dist/client/index.js +1260 -1928
- package/dist/host/index.js +1240 -790
- package/dist/types/app/client.d.ts +76 -3388
- package/dist/types/app/layouts/env-gate/boot-gate.d.ts +8 -1
- package/dist/types/app/layouts/rightbar/market-busy.d.ts +28 -0
- package/dist/types/app/layouts/rightbar/market-hint.d.ts +7 -0
- package/dist/types/app/layouts/sidebar/DebugFooterAction.d.ts +2 -1
- package/dist/types/app/layouts/sidebar/RecordFooterAction.d.ts +2 -1
- package/dist/types/app/layouts/sidebar/SessionList.d.ts +3 -1
- package/dist/types/app/layouts/sidebar/session-pick.d.ts +2 -0
- package/dist/types/app/layouts/sidebar/use-attention.d.ts +7 -1
- package/dist/types/modules/panels/model/diy-context.d.ts +9 -0
- package/dist/types/modules/panels/model/diy-record-beat.test.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-close.test.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-hook.test.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-open.d.ts +28 -0
- package/dist/types/modules/panels/model/diy-record-open.test.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-shot.test.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-text.d.ts +16 -1
- package/dist/types/modules/panels/model/diy-record-tools.d.ts +2 -1
- package/dist/types/modules/panels/model/diy-record.d.ts +40 -1
- package/dist/types/modules/panels/model/diy-report.d.ts +1 -1
- package/dist/types/modules/sessions/index.d.ts +1 -1
- package/dist/types/modules/sessions/model/attention-long-task.test.d.ts +1 -0
- package/dist/types/modules/sessions/model/attention.d.ts +23 -1
- package/dist/types/modules/sessions/model/session-node.d.ts +12 -1
- package/dist/types/shared/api/host/long-tasks.d.ts +10 -0
- package/dist/types/shared/api/host/preflight.d.ts +7 -1
- package/dist/types/shared/api/host/workshop-root.d.ts +9 -0
- package/dist/types/shared/api/long-tasks.d.ts +19 -0
- package/dist/types/shared/hooks/panel-state-report.d.ts +1 -1
- package/dist/types/shared/hooks/use-diy-debug.d.ts +1 -1
- package/dist/types/shared/hooks/use-diy-record.d.ts +1 -1
- package/dist/types/shared/hooks/use-shell-long-tasks.d.ts +8 -0
- package/package.json +2 -2
- package/skills/workbench-module-diy/BUILD.md +1 -1
- package/skills/workbench-module-diy/FAMILY.md +1 -1
- package/skills/workbench-module-diy/KIT.md +23 -23
- package/skills/workbench-module-diy/PANEL.md +1 -1
- package/skills/workbench-module-diy/TOOLS.md +3 -1
- package/skills/workbench-module-diy/WRITES.md +20 -3
package/client.js
CHANGED
|
@@ -291,8 +291,6 @@ window.__ModuleLoader__.load({
|
|
|
291
291
|
* 引用标记的固定名字;完整标记是 @<这个名字>:<编码文本>,改它等于作废历史会话里已写下的引用。
|
|
292
292
|
*/
|
|
293
293
|
var CONTEXT_MARKER_NAME = "工作台";
|
|
294
|
-
var MARKER = new RegExp(`@${CONTEXT_MARKER_NAME}:([a-z][a-z0-9-]*:[A-Za-z0-9._~%#/-]+)`, "g");
|
|
295
|
-
var TRAILING_PUNCTUATION = /[.,;:!?]+$/;
|
|
296
294
|
/**
|
|
297
295
|
* 把引用拼回标记体里的那一段文本(不含 @ 与标记名)。
|
|
298
296
|
* @param ref 要拼的引用。
|
|
@@ -302,23 +300,6 @@ window.__ModuleLoader__.load({
|
|
|
302
300
|
return `${ref.kind}:${ref.parts.join("/")}`;
|
|
303
301
|
}
|
|
304
302
|
/**
|
|
305
|
-
* 把 kind:part/part 文本读回引用。
|
|
306
|
-
* @param text 待解析文本。
|
|
307
|
-
* @returns 没冒号、冒号在首尾、种类不是小写字母开头、或冒号后为空时给 undefined;不抛异常。
|
|
308
|
-
*/
|
|
309
|
-
function decodeRef(text) {
|
|
310
|
-
const at = text.indexOf(":");
|
|
311
|
-
if (at <= 0 || at === text.length - 1) return void 0;
|
|
312
|
-
const kind = text.slice(0, at);
|
|
313
|
-
if (!/^[a-z][a-z0-9-]*$/.test(kind)) return void 0;
|
|
314
|
-
const parts = text.slice(at + 1).split("/").filter((part) => part !== "");
|
|
315
|
-
if (parts.length === 0) return void 0;
|
|
316
|
-
return {
|
|
317
|
-
kind,
|
|
318
|
-
parts
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
303
|
* 拼出 @ 后面那半截(标记名加已编码文本),比较与拼接都用它。
|
|
323
304
|
* @param encoded encodeRef 的结果。
|
|
324
305
|
* @returns 形如 工作台:file:src/a.ts。
|
|
@@ -335,32 +316,6 @@ window.__ModuleLoader__.load({
|
|
|
335
316
|
return `@${markerBody(encodeRef(ref))}`;
|
|
336
317
|
}
|
|
337
318
|
/**
|
|
338
|
-
* 从一段文本里按出现顺序捞出所有标记引用,同一个引用只留第一次。
|
|
339
|
-
* @param text 任意文本;null / undefined 当空串。
|
|
340
|
-
* @returns 解析不出来的标记会被丢掉,所以结果只含合法引用,可能为空数组。
|
|
341
|
-
*/
|
|
342
|
-
function parseMarkers(text) {
|
|
343
|
-
const seen = /* @__PURE__ */ new Set();
|
|
344
|
-
const refs = [];
|
|
345
|
-
for (const match of String(text ?? "").matchAll(MARKER)) {
|
|
346
|
-
const ref = decodeRef(match[1].replace(TRAILING_PUNCTUATION, ""));
|
|
347
|
-
if (ref === void 0) continue;
|
|
348
|
-
const key = encodeRef(ref);
|
|
349
|
-
if (seen.has(key)) continue;
|
|
350
|
-
seen.add(key);
|
|
351
|
-
refs.push(ref);
|
|
352
|
-
}
|
|
353
|
-
return refs;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* 由单元 id 拼出它那一族事实的范围名。
|
|
357
|
-
* @param unit 单元 id,不带后缀。
|
|
358
|
-
* @returns <unit>* —— 永远是范围名,不是某一条事实。
|
|
359
|
-
*/
|
|
360
|
-
function unitFactScope(unit) {
|
|
361
|
-
return `${unit}*`;
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
319
|
* 判一个名字是不是范围查法,不是问这条事实存不存在。
|
|
365
320
|
* @param name 事实名或范围名。
|
|
366
321
|
* @returns 单字符 * 不算范围;只有「至少一个字符加 *」才算。
|
|
@@ -668,154 +623,6 @@ window.__ModuleLoader__.load({
|
|
|
668
623
|
if (error === void 0) return null;
|
|
669
624
|
return error.code === "" ? "unknown" : error.code;
|
|
670
625
|
}
|
|
671
|
-
/**
|
|
672
|
-
* 外壳愿意认的协议版本;不在表里的模块当场被拒,不猜语义。
|
|
673
|
-
*/
|
|
674
|
-
var SUPPORTED_API_VERSIONS = [1];
|
|
675
|
-
/**
|
|
676
|
-
* 协议认得的全部键;写了别的键不会被采纳(外壳静默忽略),所以字段名拼错不会有提示。
|
|
677
|
-
*/
|
|
678
|
-
var DECLARATION_KEYS = [
|
|
679
|
-
"apiVersion",
|
|
680
|
-
"unit",
|
|
681
|
-
"card",
|
|
682
|
-
"tools",
|
|
683
|
-
"host",
|
|
684
|
-
"env"
|
|
685
|
-
];
|
|
686
|
-
/**
|
|
687
|
-
* 协议要求必写的键;env 不在其中(没有环境需要就不写)。
|
|
688
|
-
*/
|
|
689
|
-
var DECLARATION_REQUIRED_KEYS = [
|
|
690
|
-
"apiVersion",
|
|
691
|
-
"unit",
|
|
692
|
-
"card",
|
|
693
|
-
"tools",
|
|
694
|
-
"host"
|
|
695
|
-
];
|
|
696
|
-
var CARD_KEYS = ["titleKey", "order"];
|
|
697
|
-
var TOOL_KEYS = [
|
|
698
|
-
"name",
|
|
699
|
-
"writes",
|
|
700
|
-
"key"
|
|
701
|
-
];
|
|
702
|
-
var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
|
|
703
|
-
var HOST_KEYS = ["inject", "optional"];
|
|
704
|
-
function text(value) {
|
|
705
|
-
return typeof value === "string" ? value.trim() : "";
|
|
706
|
-
}
|
|
707
|
-
function isRecord(value) {
|
|
708
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
709
|
-
}
|
|
710
|
-
function outsideKeys(value, allowed) {
|
|
711
|
-
return Object.keys(value).filter((key) => !allowed.includes(key));
|
|
712
|
-
}
|
|
713
|
-
function listOf(keys) {
|
|
714
|
-
return keys.map((key) => JSON.stringify(key)).join(" / ");
|
|
715
|
-
}
|
|
716
|
-
function stringArrayProblems(at, value) {
|
|
717
|
-
if (!Array.isArray(value)) return [`${at} 要是一串字符串,现在是 ${JSON.stringify(value)}`];
|
|
718
|
-
return value.flatMap((item, index) => text(item) === "" ? [`${at}[${index}] 不是非空字符串:${JSON.stringify(item)}`] : []);
|
|
719
|
-
}
|
|
720
|
-
/**
|
|
721
|
-
* 查清单里 dsh.workbench 那一段的形状,回一串给人看的问题(中文,带字段路径)。
|
|
722
|
-
* @param subject 报错时用的主语,一般是包名。
|
|
723
|
-
* @param raw 清单里那段原始值,可能什么都不是。
|
|
724
|
-
* @returns 空数组表示形状过得去;版本不对就当场返回(后面的字段无从判起)。
|
|
725
|
-
*/
|
|
726
|
-
function declarationProblemsOf(subject, raw) {
|
|
727
|
-
if (!isRecord(raw)) return [`${subject}: dsh.workbench 不是一个对象 —— ${JSON.stringify(raw)}`];
|
|
728
|
-
const version = raw.apiVersion;
|
|
729
|
-
if (version === void 0) return [`${subject}: dsh.workbench 没有 apiVersion —— 协议从 v1 起,写 \`"apiVersion": 1\`。缺它 = 外壳不认这个模块(ADR-0038 §2.3)`];
|
|
730
|
-
if (!Number.isInteger(version) || !SUPPORTED_API_VERSIONS.includes(version)) return [`${subject}: dsh.workbench.apiVersion 是 ${JSON.stringify(version)},这里只认 ${SUPPORTED_API_VERSIONS.join(" / ")}(要整数)`];
|
|
731
|
-
const problems = [];
|
|
732
|
-
const unknown = outsideKeys(raw, DECLARATION_KEYS);
|
|
733
|
-
if (unknown.length > 0) problems.push(`${subject}: dsh.workbench 里有协议 v1 不认识的键 ${listOf(unknown)} —— 只有 ${listOf(DECLARATION_KEYS)}。(拼错的键会被外壳**静默忽略**:那句声明等于没写)`);
|
|
734
|
-
for (const key of DECLARATION_REQUIRED_KEYS) if (raw[key] === void 0) problems.push(`${subject}: dsh.workbench 缺 ${key}` + (key === "card" ? "(这个模块没有卡片就写 `\"card\": null`)" : ""));
|
|
735
|
-
const card = raw.card;
|
|
736
|
-
if (card !== void 0 && card !== null) {
|
|
737
|
-
if (!isRecord(card)) problems.push(`${subject}: dsh.workbench.card 要么是对象、要么是 null,现在是 ${JSON.stringify(card)}`);
|
|
738
|
-
else {
|
|
739
|
-
const extra = outsideKeys(card, CARD_KEYS);
|
|
740
|
-
if (extra.length > 0) problems.push(`${subject}: dsh.workbench.card 里有不认的键 ${listOf(extra)} —— card 只有 ${listOf(CARD_KEYS)}(卡片默认显不显示由运行期的面板配置决定,清单里没有这一位)`);
|
|
741
|
-
if (text(card.titleKey) === "") problems.push(`${subject}: dsh.workbench.card.titleKey 要是非空字符串(面板那一格的文案键)`);
|
|
742
|
-
if (typeof card.order !== "number" || !Number.isFinite(card.order)) problems.push(`${subject}: dsh.workbench.card.order 要是数字,现在是 ${JSON.stringify(card.order)}`);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
const tools = raw.tools;
|
|
746
|
-
if (tools !== void 0) {
|
|
747
|
-
if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
|
|
748
|
-
else {
|
|
749
|
-
const seen = /* @__PURE__ */ new Set();
|
|
750
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
751
|
-
tools.forEach((tool, index) => {
|
|
752
|
-
const at = `dsh.workbench.tools[${index}]`;
|
|
753
|
-
if (!isRecord(tool)) {
|
|
754
|
-
problems.push(`${subject}: ${at} 要是对象,现在是 ${JSON.stringify(tool)}`);
|
|
755
|
-
return;
|
|
756
|
-
}
|
|
757
|
-
const extra = outsideKeys(tool, TOOL_KEYS);
|
|
758
|
-
if (extra.length > 0) problems.push(`${subject}: ${at} 里有不认的键 ${listOf(extra)} —— tools 只有 ${listOf(TOOL_KEYS)}`);
|
|
759
|
-
const name = text(tool.name);
|
|
760
|
-
if (name === "") problems.push(`${subject}: ${at}.name 要是非空字符串`);
|
|
761
|
-
else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
|
|
762
|
-
else seen.add(name);
|
|
763
|
-
if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
|
|
764
|
-
if (tool.key !== void 0) {
|
|
765
|
-
const key = text(tool.key);
|
|
766
|
-
if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
|
|
767
|
-
else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
|
|
768
|
-
else seenKeys.add(key);
|
|
769
|
-
}
|
|
770
|
-
});
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
const host = raw.host;
|
|
774
|
-
if (host !== void 0) {
|
|
775
|
-
if (!isRecord(host)) problems.push(`${subject}: dsh.workbench.host 要是对象,现在是 ${JSON.stringify(host)}`);
|
|
776
|
-
else {
|
|
777
|
-
const extra = outsideKeys(host, HOST_KEYS);
|
|
778
|
-
if (extra.length > 0) problems.push(`${subject}: dsh.workbench.host 里有不认的键 ${listOf(extra)} —— host 只有 ${listOf(HOST_KEYS)}`);
|
|
779
|
-
if (host.inject === void 0) problems.push(`${subject}: dsh.workbench.host.inject 没写 —— 它声明这个模块要外壳的哪几个服务,外壳靠它判"能不能挂"。一个都不要也要写 \`"inject": []\``);
|
|
780
|
-
else problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.inject`, host.inject));
|
|
781
|
-
if (host.optional !== void 0) problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.optional`, host.optional));
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
if (raw.env !== void 0 && !isRecord(raw.env)) problems.push(`${subject}: dsh.workbench.env 要是对象(command / plugins / libs)—— 语义由门禁的 env 判据查,这里只查形状`);
|
|
785
|
-
return problems;
|
|
786
|
-
}
|
|
787
|
-
/**
|
|
788
|
-
* 读一份清单:先查形状,过了再把声明规整成 manifest。
|
|
789
|
-
* @param subject 报错时用的主语。
|
|
790
|
-
* @param raw 清单里 dsh.workbench 那段原始值。
|
|
791
|
-
* @returns 有问题时只有 problems;没问题时 declaration 与 manifest 都给,manifest 里的字符串已 trim。
|
|
792
|
-
*/
|
|
793
|
-
function readDeclaration(subject, raw) {
|
|
794
|
-
const problems = declarationProblemsOf(subject, raw);
|
|
795
|
-
if (problems.length > 0) return { problems };
|
|
796
|
-
const declaration = raw;
|
|
797
|
-
const card = declaration.card;
|
|
798
|
-
return {
|
|
799
|
-
declaration,
|
|
800
|
-
problems: [],
|
|
801
|
-
manifest: {
|
|
802
|
-
id: text(declaration.unit),
|
|
803
|
-
card: card === null ? null : {
|
|
804
|
-
titleKey: text(card.titleKey),
|
|
805
|
-
order: card.order
|
|
806
|
-
},
|
|
807
|
-
tools: declaration.tools.map((tool) => ({
|
|
808
|
-
name: text(tool.name),
|
|
809
|
-
writes: tool.writes
|
|
810
|
-
})),
|
|
811
|
-
host: {
|
|
812
|
-
inject: [...declaration.host.inject ?? []],
|
|
813
|
-
...declaration.host.optional === void 0 ? {} : { optional: [...declaration.host.optional] }
|
|
814
|
-
},
|
|
815
|
-
...declaration.env === void 0 ? {} : { env: declaration.env }
|
|
816
|
-
}
|
|
817
|
-
};
|
|
818
|
-
}
|
|
819
626
|
//#endregion
|
|
820
627
|
//#region ../shared/dist/api/unit.js
|
|
821
628
|
/**
|
|
@@ -828,68 +635,22 @@ window.__ModuleLoader__.load({
|
|
|
828
635
|
}
|
|
829
636
|
//#endregion
|
|
830
637
|
//#region ../shared/dist/config/constants.js
|
|
831
|
-
/** 外壳插件的包名:浏览器模块表与宿主按它注册、认领这枚插件。 */
|
|
832
|
-
var PLUGIN_ID = "@dsh-workbench/core";
|
|
833
|
-
/** 与外壳同批发布的兄弟包名:`release.ts` 用它判一版三包是否都已在源上。 */
|
|
834
|
-
var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
|
|
835
638
|
/** 外壳宿主 HTTP API 的根前缀;prefs / actions / provision 等路由都挂在它下面。 */
|
|
836
639
|
var API_PREFIX = "/workbench/api";
|
|
837
|
-
|
|
838
|
-
var PREFS_PREFIX = `${API_PREFIX}/prefs`;
|
|
640
|
+
`${API_PREFIX}`;
|
|
839
641
|
/** 事实(facts)SSE 事件流的端点路径;前端 `EventSource` 按它带 `since` 游标续传。 */
|
|
840
642
|
var EVENTS_PATH = "/workbench/events";
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
/** 机器供给(provision)的路由前缀:只收 POST,装机时用它铺一份运行环境。 */
|
|
844
|
-
var PROVISION_PREFIX = `${API_PREFIX}/provision`;
|
|
643
|
+
`${API_PREFIX}`;
|
|
644
|
+
`${API_PREFIX}`;
|
|
845
645
|
/** 面板运行态上报的路径段:崩溃与卡片收尾分别 POST 到 `panel-state/crash`、`panel-state/cards`。 */
|
|
846
646
|
var PANEL_STATE_PATH = "panel-state";
|
|
847
|
-
|
|
848
|
-
var DIY_DEBUG_PATH = "diy-debug";
|
|
849
|
-
/** 调试动作的子路径(`diy-debug/act`);仓内暂无调用点,动作现走 `DIY_DEBUG_SERVICE`。 */
|
|
850
|
-
var DIY_DEBUG_ACT_PATH = `${DIY_DEBUG_PATH}/act`;
|
|
851
|
-
/** DIY 录制交接的路径段;宿主按它登记 `/workbench/api/diy-record` 前缀。 */
|
|
852
|
-
var DIY_RECORD_PATH = "diy-record";
|
|
853
|
-
/** 录制动作的子路径(`diy-record/act`);仓内暂无调用点,录制现走 `DIY_RECORD_SERVICE`。 */
|
|
854
|
-
var DIY_RECORD_ACT_PATH = `${DIY_RECORD_PATH}/act`;
|
|
855
|
-
/** 面板运行态的路由前缀,挂在外壳 API 下:上报口用它,拒报回 report-refused。 */
|
|
856
|
-
var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
|
|
857
|
-
/** 钉住的 opencli 插件版本:`opencli-runtime` 按它校验、取那一份。 */
|
|
858
|
-
var OPENCLI_PIN = "1.8.8";
|
|
859
|
-
/** 缺陷看板套件的 dsh 服务名(`workbenchCodingIssues`):套件照它登记自己那份服务。 */
|
|
860
|
-
var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
|
|
861
|
-
/** 面板套件的 dsh 服务名(`workbenchPanels`):宿主经它取套件公布的清单与订阅。 */
|
|
862
|
-
var PANELS_SERVICE = "workbenchPanels";
|
|
647
|
+
`${API_PREFIX}${PANEL_STATE_PATH}`;
|
|
863
648
|
/** 单元花名册服务的 dsh 服务名(`workbenchUnits`):模块经它认领自己的单元。 */
|
|
864
649
|
var UNITS_SERVICE = "workbenchUnits";
|
|
865
|
-
/** 面板运行态服务的 dsh 服务名(`workbenchPanelState`):宿主注册,读口按它取。 */
|
|
866
|
-
var PANEL_STATE_SERVICE = "workbenchPanelState";
|
|
867
|
-
/** DIY 调试约定服务的 dsh 服务名(`workbenchDiyDebug`):调试动作走它,不走 HTTP。 */
|
|
868
|
-
var DIY_DEBUG_SERVICE = "workbenchDiyDebug";
|
|
869
|
-
/** DIY 录制交接服务的 dsh 服务名(`workbenchDiyRecord`):`diy-acts.ts` 经它收发录制三拍。 */
|
|
870
|
-
var DIY_RECORD_SERVICE = "workbenchDiyRecord";
|
|
871
|
-
/** 会话投影服务的 dsh 服务名(`sessionProjections`):宿主经 `stateOf(session, 'agentPreset')` 读那一档。 */
|
|
872
|
-
var SESSION_PROJECTIONS_SERVICE = "sessionProjections";
|
|
873
|
-
/** 单次 opencli 调用的默认超时(毫秒);调用点没传 `timeoutMs` 时按它算。 */
|
|
874
|
-
var OPENCLI_TIMEOUT_MS = 12e4;
|
|
875
|
-
/** 启动预热站点那一跳的超时(毫秒);超时按未热对待,不挡面板。 */
|
|
876
|
-
var WARM_TIMEOUT_MS = 2e4;
|
|
877
|
-
/** 装 / 卸模块包的超时(毫秒):pnpm 与取包内容都按它算。 */
|
|
878
|
-
var INSTALL_TIMEOUT_MS = 3e5;
|
|
879
|
-
/** 查 registry 版本那一次请求的超时(毫秒)。 */
|
|
880
|
-
var VERSION_CHECK_TIMEOUT_MS = 1e4;
|
|
881
650
|
/** 版本查询结果的缓存有效期(毫秒):期内不发第二次请求。 */
|
|
882
651
|
var VERSION_CHECK_TTL_MS = 6e5;
|
|
883
|
-
/** 单元探测结果的缓存有效期(毫秒)。 */
|
|
884
|
-
var PROBE_TTL_MS = 3e4;
|
|
885
|
-
/** 工具读出来的值交给面板后的保留时长(毫秒):过期就不再算这一拍。 */
|
|
886
|
-
var HANDOFF_TTL_MS = 15e3;
|
|
887
|
-
/** 跑本地 git 命令的超时(毫秒);短于对外的 `OPENCLI_TIMEOUT_MS`。 */
|
|
888
|
-
var GIT_TIMEOUT_MS = 1e4;
|
|
889
652
|
/** 面板轮询事实的间隔(毫秒):SSE 断了走这条兜底轮询。 */
|
|
890
653
|
var PANEL_POLL_MS = 2e3;
|
|
891
|
-
/** 没起中文名的工作区默认标题:左栏按它分组、显示。 */
|
|
892
|
-
var DEFAULT_WORKSPACE_TITLE = "default-workspace";
|
|
893
654
|
/** 记住当前项目的 localStorage 键。 */
|
|
894
655
|
var STORAGE_KEY_PROJECT = "dsh-workbench.project";
|
|
895
656
|
/** 记住右栏展开与否的 localStorage 键。 */
|
|
@@ -900,8 +661,6 @@ window.__ModuleLoader__.load({
|
|
|
900
661
|
var STORAGE_KEY_RIGHTBAR_WIDTH = "dsh-workbench.rightbar.width";
|
|
901
662
|
/** dsh i18n 的命名空间:词表都注册在它下面,`ctx.locale.register` / `bind` 按它取。 */
|
|
902
663
|
var LOCALE_NS = "workbench";
|
|
903
|
-
/** 外壳支持的语言标识,顺序即回退顺序:首项是基准,其余词表必须与它逐键同构。 */
|
|
904
|
-
var LOCALES = ["zh", "en"];
|
|
905
664
|
//#endregion
|
|
906
665
|
//#region ../shared/dist/api/workbench-client.js
|
|
907
666
|
/**
|
|
@@ -969,14 +728,8 @@ window.__ModuleLoader__.load({
|
|
|
969
728
|
* React 的 `Component` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
970
729
|
*/
|
|
971
730
|
var Component = react.Component;
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
*/
|
|
975
|
-
var createContext = react.createContext;
|
|
976
|
-
/**
|
|
977
|
-
* React 的 `useContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
978
|
-
*/
|
|
979
|
-
var useContext = react.useContext;
|
|
731
|
+
react.createContext;
|
|
732
|
+
react.useContext;
|
|
980
733
|
/**
|
|
981
734
|
* React 的 `useState` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
982
735
|
*/
|
|
@@ -1426,18 +1179,6 @@ window.__ModuleLoader__.load({
|
|
|
1426
1179
|
});
|
|
1427
1180
|
}
|
|
1428
1181
|
//#endregion
|
|
1429
|
-
//#region ../shared/dist/components/Field.js
|
|
1430
|
-
/**
|
|
1431
|
-
* 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
|
|
1432
|
-
* @param props.label - 左侧标签,必给。
|
|
1433
|
-
* @param props.hint - 控件下面那行说明;不给不画。
|
|
1434
|
-
* @param props.children - 控件本体,落在标签与说明之间。
|
|
1435
|
-
* @returns 一个 `<label>`,点标签会聚焦里面的控件。
|
|
1436
|
-
*/
|
|
1437
|
-
function Field({ label, hint, children }) {
|
|
1438
|
-
return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
|
|
1439
|
-
}
|
|
1440
|
-
//#endregion
|
|
1441
1182
|
//#region ../shared/dist/components/FormActions.js
|
|
1442
1183
|
var RANK$1 = {
|
|
1443
1184
|
default: 0,
|
|
@@ -1488,6 +1229,66 @@ window.__ModuleLoader__.load({
|
|
|
1488
1229
|
}));
|
|
1489
1230
|
}
|
|
1490
1231
|
//#endregion
|
|
1232
|
+
//#region ../shared/dist/components/Rows.js
|
|
1233
|
+
/**
|
|
1234
|
+
* 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
|
|
1235
|
+
* @param props.children - 一串 `Row`。
|
|
1236
|
+
* @returns 竖排的 div。
|
|
1237
|
+
*/
|
|
1238
|
+
function Rows({ children }) {
|
|
1239
|
+
return h("div", { className: "wb-rows" }, children);
|
|
1240
|
+
}
|
|
1241
|
+
/**
|
|
1242
|
+
* 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
|
|
1243
|
+
* @param props.label - 左边那格(键)。
|
|
1244
|
+
* @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
|
|
1245
|
+
* @returns 一行两格。
|
|
1246
|
+
*/
|
|
1247
|
+
function Row({ label, value }) {
|
|
1248
|
+
return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
|
|
1249
|
+
}
|
|
1250
|
+
//#endregion
|
|
1251
|
+
//#region ../shared/dist/components/ConfirmBar.js
|
|
1252
|
+
/**
|
|
1253
|
+
* 「先问一句再动手」那一条:标题 + 说明 + 键值 + 失败那句 + 动作区,形状一次收口。
|
|
1254
|
+
* **要不要问**归调用点(ADR-0054 §2 规则三),这一件只回答"问的时候长什么样"。
|
|
1255
|
+
* @param props.title - 那一句问话("发布到 prod?")。
|
|
1256
|
+
* @param props.hint - 标题下面那句说明或正文;不给不占位。
|
|
1257
|
+
* @param props.rows - 键值两格(键值列宽与分隔线归 `Rows` / `Row`);不给或空数组不渲染。值那一格可以放控件。
|
|
1258
|
+
* @param props.actions - 动作清单(归 `FormActions`:一个区一颗 `primary`、永远在右、窄了折行)。
|
|
1259
|
+
* @param props.problem - 失败那句(走 `Note tone="problem"`,读屏是 `alert`);不给不占位。
|
|
1260
|
+
* @param props.busy - 整条在忙(只喂 `aria-busy`;按钮自己的转圈与禁用归 `actions` 里那一颗)。
|
|
1261
|
+
* @param props.label - 读屏的组名;不给时 `title` 是字符串就拿它顶上,两者都没有就不设。
|
|
1262
|
+
* @returns 一个 `role="group"` 的条;`actions` 空数组时最后那一块不渲染。
|
|
1263
|
+
*/
|
|
1264
|
+
function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
|
|
1265
|
+
return h("div", {
|
|
1266
|
+
className: "wb-confirmBar",
|
|
1267
|
+
role: "group",
|
|
1268
|
+
"aria-label": label ?? (typeof title === "string" ? title : void 0),
|
|
1269
|
+
"aria-busy": busy
|
|
1270
|
+
}, h("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h(Rows, null, rows.map((row) => h(Row, {
|
|
1271
|
+
key: row.key,
|
|
1272
|
+
label: row.label,
|
|
1273
|
+
value: row.value
|
|
1274
|
+
}))), problem === void 0 ? null : h(Note, {
|
|
1275
|
+
tone: "problem",
|
|
1276
|
+
role: "alert"
|
|
1277
|
+
}, problem), h(FormActions, { actions }));
|
|
1278
|
+
}
|
|
1279
|
+
//#endregion
|
|
1280
|
+
//#region ../shared/dist/components/Field.js
|
|
1281
|
+
/**
|
|
1282
|
+
* 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
|
|
1283
|
+
* @param props.label - 左侧标签,必给。
|
|
1284
|
+
* @param props.hint - 控件下面那行说明;不给不画。
|
|
1285
|
+
* @param props.children - 控件本体,落在标签与说明之间。
|
|
1286
|
+
* @returns 一个 `<label>`,点标签会聚焦里面的控件。
|
|
1287
|
+
*/
|
|
1288
|
+
function Field({ label, hint, children }) {
|
|
1289
|
+
return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
|
|
1290
|
+
}
|
|
1291
|
+
//#endregion
|
|
1491
1292
|
//#region ../shared/dist/components/FormRows.js
|
|
1492
1293
|
/**
|
|
1493
1294
|
* 表单行的容器:同一份 `FormRows` 共用一个标签列(列宽由最长的标签定),行距也归它。
|
|
@@ -1576,11 +1377,14 @@ window.__ModuleLoader__.load({
|
|
|
1576
1377
|
const values = formValuesOf(fields);
|
|
1577
1378
|
const problems = {};
|
|
1578
1379
|
for (const field of fields) {
|
|
1579
|
-
const found = show ?
|
|
1380
|
+
const found = show ? problemOf(field, values) : void 0;
|
|
1580
1381
|
problems[field.key] = found ? found : void 0;
|
|
1581
1382
|
}
|
|
1582
1383
|
return problems;
|
|
1583
1384
|
}
|
|
1385
|
+
function problemOf(field, values) {
|
|
1386
|
+
return field.validate?.(field.value, values);
|
|
1387
|
+
}
|
|
1584
1388
|
/**
|
|
1585
1389
|
* 按字段顺序取第一处错误 —— 提交被挡住时要带进视口的就是这一格。
|
|
1586
1390
|
* 判的是**真值**(与 `formProblemsOf` 同一口径):假值那种"错误文案"渲染出来本来就是空的,不算错。
|
|
@@ -1661,12 +1465,17 @@ window.__ModuleLoader__.load({
|
|
|
1661
1465
|
hint: field.hint,
|
|
1662
1466
|
problem: args.showProblem ? args.problems[field.key] : void 0,
|
|
1663
1467
|
layout: field.layout
|
|
1664
|
-
}, field.
|
|
1468
|
+
}, controlOf(field, args.problems, args.showProblem, args.busy)));
|
|
1469
|
+
}
|
|
1470
|
+
function controlOf(field, problems, showProblem, busy) {
|
|
1471
|
+
return field.control({
|
|
1665
1472
|
id: `wb-form-${field.key}`,
|
|
1666
1473
|
name: field.key,
|
|
1667
|
-
invalid:
|
|
1668
|
-
disabled:
|
|
1669
|
-
|
|
1474
|
+
invalid: showProblem && Boolean(problems[field.key]),
|
|
1475
|
+
disabled: busy || field.disabled === true,
|
|
1476
|
+
value: field.value,
|
|
1477
|
+
onChange: field.onChange
|
|
1478
|
+
});
|
|
1670
1479
|
}
|
|
1671
1480
|
//#endregion
|
|
1672
1481
|
//#region ../shared/dist/lib/form-problem.js
|
|
@@ -1703,13 +1512,15 @@ window.__ModuleLoader__.load({
|
|
|
1703
1512
|
//#region ../shared/dist/components/Form.js
|
|
1704
1513
|
/**
|
|
1705
1514
|
* 整张表单:`fields` 进,行、错误、操作区、(被挡住的)提交都由它安排 —— 它自己一个值都不存,
|
|
1706
|
-
*
|
|
1515
|
+
* 值仍归调用点(`value` 与 `onChange` 写在字段配置的同一格里,`Form` 只是把两者原样递给那一格的 `control`)。
|
|
1516
|
+
* 写了 `Form<Values>` 就按 `Values` 把每一格的键与值类型钉住(`Values` 里会 `visible: false` 的键写成可选键);
|
|
1517
|
+
* 不写就是默认档,键值都不钉。
|
|
1707
1518
|
* 还没提交过时一格错都不显示;第一次提交之后每次渲染重算,改好了当场消。
|
|
1708
1519
|
* 提交那一拍永远先算一遍:有错就不调 `onSubmit`,并把第一个有错的 `FormRow` 带进视口、聚焦它里面的控件。
|
|
1709
1520
|
* 回车与点提交钮走的是同一条路:真 `<form>` 的隐式提交在**只有一个文本框**时也会 fire,所以 `busy` / `disabled` 时回车同样不提交。
|
|
1710
1521
|
* 调用点只管数据与语义:行怎么排、错误摆哪、什么时候校验、按钮在哪,这里没有口子。
|
|
1711
|
-
* @param props.fields - 每格的键 / 标签 / 值 / 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
|
|
1712
|
-
* @param props.onSubmit - 校验全过的那一拍,回的是从 `fields`
|
|
1522
|
+
* @param props.fields - 每格的键 / 标签 / 值 / 值怎么改(`onChange`)/ 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
|
|
1523
|
+
* @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表(按 `visibleFieldsOf` 过滤过,不可见那格不在里面);被挡住时不会被调。
|
|
1713
1524
|
* @param props.submit - 提交钮文案;`busyLabel` 是提交中换的那句,不给就沿用 `label`。
|
|
1714
1525
|
* @param props.cancel - 取消钮;给了就排在提交钮左边,`busy` 时一起禁用。
|
|
1715
1526
|
* @param props.extra - 其余动作(default / danger),排在最左,`busy` 时一起禁用。
|
|
@@ -1940,25 +1751,6 @@ window.__ModuleLoader__.load({
|
|
|
1940
1751
|
});
|
|
1941
1752
|
}
|
|
1942
1753
|
//#endregion
|
|
1943
|
-
//#region ../shared/dist/components/Rows.js
|
|
1944
|
-
/**
|
|
1945
|
-
* 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
|
|
1946
|
-
* @param props.children - 一串 `Row`。
|
|
1947
|
-
* @returns 竖排的 div。
|
|
1948
|
-
*/
|
|
1949
|
-
function Rows({ children }) {
|
|
1950
|
-
return h("div", { className: "wb-rows" }, children);
|
|
1951
|
-
}
|
|
1952
|
-
/**
|
|
1953
|
-
* 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
|
|
1954
|
-
* @param props.label - 左边那格(键)。
|
|
1955
|
-
* @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
|
|
1956
|
-
* @returns 一行两格。
|
|
1957
|
-
*/
|
|
1958
|
-
function Row({ label, value }) {
|
|
1959
|
-
return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
|
|
1960
|
-
}
|
|
1961
|
-
//#endregion
|
|
1962
1754
|
//#region ../shared/dist/components/SaveBar.js
|
|
1963
1755
|
/**
|
|
1964
1756
|
* 设置面底下那条"取消 / 保存":就是 `FormActions` 的两颗固定动作,顺序与间距不归调用点。
|
|
@@ -2646,897 +2438,897 @@ window.__ModuleLoader__.load({
|
|
|
2646
2438
|
writeText(key, value ? "true" : "false");
|
|
2647
2439
|
}
|
|
2648
2440
|
//#endregion
|
|
2649
|
-
//#region ../shared/dist/i18n/en.js
|
|
2650
|
-
/** 外壳自带的英文词表:键必须与 `zh` 逐一对应,值不许为空串。 */
|
|
2651
|
-
var en = {
|
|
2652
|
-
"brand.name": "Workbench",
|
|
2653
|
-
"toggle.open": "Open sidebar",
|
|
2654
|
-
"toggle.collapse": "Collapse sidebar",
|
|
2655
|
-
"project.label": "Switch project",
|
|
2656
|
-
"workspace.section": "Workspaces",
|
|
2657
|
-
"project.none": "No project",
|
|
2658
|
-
"project.empty": "No projects yet. Use “Add project” below.",
|
|
2659
|
-
"project.add": "Add project…",
|
|
2660
|
-
"project.add.busy": "Creating the workspace…",
|
|
2661
|
-
"project.add.failed": "Creating the workspace failed",
|
|
2662
|
-
"project.search.label": "Search workspaces",
|
|
2663
|
-
"project.search.placeholder": "Search workspaces (folder / name / path)",
|
|
2664
|
-
"project.search.empty": "No workspace matches “{query}”.",
|
|
2665
|
-
"project.group.workspaces": "Workspaces",
|
|
2666
|
-
"project.group.defaultWorkspace": "Default workspace",
|
|
2667
|
-
"project.group.workshop": "Workshop",
|
|
2668
|
-
"project.rename.row": "Rename “{name}”",
|
|
2669
|
-
"project.rename.current": "Give this workspace a display name…",
|
|
2670
|
-
"project.rename.title": "Give “{name}” a display name",
|
|
2671
|
-
"project.rename.description": "Shown after the folder name. It renames the workspace itself.",
|
|
2672
|
-
"project.rename.field": "Display name",
|
|
2673
|
-
"project.rename.placeholder": "e.g. Workbench shell",
|
|
2674
|
-
"project.rename.hint": "Empty = folder name only",
|
|
2675
|
-
"project.rename.save": "Save",
|
|
2676
|
-
"project.rename.saving": "Saving…",
|
|
2677
|
-
"project.rename.cancel": "Cancel",
|
|
2678
|
-
"project.rename.failed": "Rename failed. Try again.",
|
|
2679
|
-
"session.new": "New session",
|
|
2680
|
-
"session.new.label": "Start a session in the current project",
|
|
2681
|
-
"session.empty": "No sessions in this project yet.",
|
|
2682
|
-
"session.noProject": "Add a project first.",
|
|
2683
|
-
"session.list.label": "Sessions",
|
|
2684
|
-
"session.copy": "Copy",
|
|
2685
|
-
"session.pinned": "Pinned",
|
|
2686
|
-
"session.actions": "Actions for {name}",
|
|
2687
|
-
"status.idle": "Idle",
|
|
2688
|
-
"status.running": "Running",
|
|
2689
|
-
"status.waitingApproval": "Waiting for approval",
|
|
2690
|
-
"status.planReview": "Plan awaiting review",
|
|
2691
|
-
"status.waitingAnswer": "Waiting for your answer",
|
|
2692
|
-
"status.compact.approval": "Approval",
|
|
2693
|
-
"status.compact.planReview": "Plan review",
|
|
2694
|
-
"status.compact.answer": "Answer",
|
|
2695
|
-
"status.completed": "Completed",
|
|
2696
|
-
"status.subagentsRunning.one": "{n} subagent running",
|
|
2697
|
-
"status.subagentsRunning.other": "{n} subagents running",
|
|
2698
|
-
"project.attention.warning.one": "1 session waiting for you",
|
|
2699
|
-
"project.attention.warning.other": "{n} sessions waiting for you",
|
|
2700
|
-
"project.attention.running.one": "1 session running",
|
|
2701
|
-
"project.attention.running.other": "{n} sessions running",
|
|
2702
|
-
"project.attention.done.one": "1 session finished, unread",
|
|
2703
|
-
"project.attention.done.other": "{n} sessions finished, unread",
|
|
2704
|
-
"project.attention.state.warning": "Approval",
|
|
2705
|
-
"project.attention.state.running": "Running",
|
|
2706
|
-
"project.attention.state.done": "New",
|
|
2707
|
-
"hover.copied": "Copied",
|
|
2708
|
-
"time.now": "just now",
|
|
2709
|
-
"time.minutes": "{n} min ago",
|
|
2710
|
-
"time.hours": "{n} h ago",
|
|
2711
|
-
"time.days": "{n} d ago",
|
|
2712
|
-
"time.ago": "{t} ago",
|
|
2713
|
-
"time.short.minutes": "{n}min",
|
|
2714
|
-
"time.short.hours": "{n}h",
|
|
2715
|
-
"time.short.days": "{n}d",
|
|
2716
|
-
"time.short.months": "{n}mo",
|
|
2717
|
-
"time.short.years": "{n}y",
|
|
2718
|
-
"panels.title": "Panel modules",
|
|
2719
|
-
"panels.groupBoardless": "No-board modules",
|
|
2720
|
-
"panels.groupPlugins": "opencli plugins",
|
|
2721
|
-
"panels.market.defaultHint": "When on, it is on by default in every workspace; you can also turn it off for a single workspace in Panel setup.",
|
|
2722
|
-
"panels.market.defaultLabel": "On by default everywhere",
|
|
2723
|
-
"panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
|
|
2724
|
-
"panels.followAll": "Restore the default everywhere",
|
|
2725
|
-
"panels.followAllConfirmTitle": "Restore the default everywhere?",
|
|
2726
|
-
"panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
|
|
2727
|
-
"panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
|
|
2728
|
-
"panels.followAllConfirmYes": "Restore",
|
|
2729
|
-
"panels.followAllConfirmNo": "Cancel",
|
|
2730
|
-
"panels.enabled": "enabled in this project",
|
|
2731
|
-
"panels.disabled": "not enabled in this project",
|
|
2732
|
-
"panels.choose": "Choose modules",
|
|
2733
|
-
"panels.buildModule": "Build a module",
|
|
2734
|
-
"panels.failed": "Could not save the change. Try again.",
|
|
2735
|
-
"panels.dragHint": "Drag to reorder",
|
|
2736
|
-
"panels.unknownStep": "No suite provides this view",
|
|
2737
|
-
"panels.labelWithHint": "{label} ({hint})",
|
|
2738
|
-
"panels.hintJoin": "; ",
|
|
2739
|
-
"panels.dep.failed": "⚠ failed to start",
|
|
2740
|
-
"panels.dep.missingPlugin": "⚠ not ready yet",
|
|
2741
|
-
"panels.dep.missingCommands": "⚠ needs an update",
|
|
2742
|
-
"panels.dep.unchecked": "⚠ cannot check",
|
|
2743
|
-
"panels.tab.modules": "Panel setup",
|
|
2744
|
-
"panels.tab.market": "Workbench module market",
|
|
2745
|
-
"panels.browseMarket": "Browse the module market",
|
|
2746
|
-
"panels.noneInstalled": "None of these modules has its plugin installed yet",
|
|
2747
|
-
"panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
|
|
2748
|
-
"panels.market.installed": "installed",
|
|
2749
|
-
"panels.market.notActive": "not active",
|
|
2750
|
-
"panels.market.notUsable": "unusable",
|
|
2751
|
-
"panels.market.broken": "broken",
|
|
2752
|
-
"panels.market.hasNew": "New version",
|
|
2753
|
-
"panels.market.hasProblem": "Module problem",
|
|
2754
|
-
"panels.market.missing": "not installed",
|
|
2755
|
-
"panels.market.unchecked": "unknown",
|
|
2756
|
-
"panels.market.checking": "checking",
|
|
2757
|
-
"panels.market.sectionInstalled": "Installed modules",
|
|
2758
|
-
"panels.market.sectionPending": "Not installed",
|
|
2759
|
-
"panels.market.sectionShared": "Shared dependencies",
|
|
2760
|
-
"panels.market.sharedUsedBy": "Used by module {modules}",
|
|
2761
|
-
"panels.market.listSeparator": ", ",
|
|
2762
|
-
"panels.market.sharedMissing": "not installed",
|
|
2763
|
-
"panels.market.sharedOutdated": "update available",
|
|
2764
|
-
"panels.market.sharedUnsatisfied": "wrong version",
|
|
2765
|
-
"panels.market.sharedOk": "installed",
|
|
2766
|
-
"panels.market.versionArrow": "{from} → {to}",
|
|
2767
|
-
"panels.market.lead": "Installed on this machine, shared by every project.",
|
|
2768
|
-
"panels.market.install": "Install",
|
|
2769
|
-
"panels.market.update": "Update",
|
|
2770
|
-
"panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
|
|
2771
|
-
"panels.market.uninstall": "Uninstall",
|
|
2772
|
-
"panels.market.uninstallLabel": "Uninstall {name}",
|
|
2773
|
-
"panels.market.installing": "Installing…",
|
|
2774
|
-
"panels.market.updating": "Updating…",
|
|
2775
|
-
"panels.market.uninstalling": "Uninstalling…",
|
|
2776
|
-
"panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
|
|
2777
|
-
"panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
|
|
2778
|
-
"panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
|
|
2779
|
-
"panels.market.confirmYes": "Uninstall",
|
|
2780
|
-
"panels.market.confirmNo": "Cancel",
|
|
2781
|
-
"panels.market.failed": "Failed: {reason}",
|
|
2782
|
-
"panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
|
|
2783
|
-
"panels.market.needCommands": "Missing commands: {commands}",
|
|
2784
|
-
"panels.market.localMark": "local",
|
|
2785
|
-
"panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
|
|
2786
|
-
"panels.market.noSource": "This module declares no install method — install it yourself",
|
|
2787
|
-
"panels.market.badSource": "The install method is incomplete — install it yourself",
|
|
2788
|
-
"panels.market.empty": "No modules available",
|
|
2789
|
-
"panels.market.sectionPlugins": "Installed opencli plugins",
|
|
2790
|
-
"panels.market.moduleOutdated": "update available",
|
|
2791
|
-
"panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
|
|
2792
|
-
"panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
|
|
2793
|
-
"panels.market.moduleRestartHint": "restart dsh once to bring it up",
|
|
2794
|
-
"panels.market.pendingRestart": "restart required",
|
|
2795
|
-
"panels.market.workbenchName": "Workbench",
|
|
2796
|
-
"panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
|
|
2797
|
-
"panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
|
|
2798
|
-
"panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
|
|
2799
|
-
"panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
|
|
2800
|
-
"panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
|
|
2801
|
-
"panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules_install_bundle.",
|
|
2802
|
-
"panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
|
|
2803
|
-
"panels.market.foot": "After installing, enable it in the panel page of that project.",
|
|
2804
|
-
"panels.market.recheck": "Check for updates",
|
|
2805
|
-
"panels.market.checkUpdates": "Check for updates",
|
|
2806
|
-
"panels.market.checkedAt": "Last checked: {time}",
|
|
2807
|
-
"panels.market.justNow": "just now",
|
|
2808
|
-
"panels.market.minutesAgo": "{n} min ago",
|
|
2809
|
-
"panels.market.hoursAgo": "{n} h ago",
|
|
2810
|
-
"panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
|
|
2811
|
-
"panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
|
|
2812
|
-
"panels.market.add.guideToggle": "Install guide and examples",
|
|
2813
|
-
"panels.market.add.guideHide": "Hide guide",
|
|
2814
|
-
"panels.market.add.guideIdTitle": "Package name",
|
|
2815
|
-
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
2816
|
-
"panels.market.add.guideIdHint": "The module package name is its npm name (like dsh-workbench-module-xxx or @author/module) — whatever follows dsh plugin add or pnpm add in the README of a community module.",
|
|
2817
|
-
"panels.market.add.guideGitTitle": "Git URL",
|
|
2818
|
-
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
2819
|
-
"panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
|
|
2820
|
-
"panels.market.add.guidePathTitle": "Local module directory",
|
|
2821
|
-
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
2822
|
-
"panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
|
|
2823
|
-
"panels.market.add.guideExampleLabel": "Example:",
|
|
2824
|
-
"panels.market.add.guideFill": "Fill in",
|
|
2825
|
-
"panels.market.add.guideSafety": "Make sure you trust the source. Modules run on this machine with your permissions; an unknown module can damage the workbench or read and leak your data.",
|
|
2826
|
-
"panels.market.add.registryLegend": "Which npm registry to download from",
|
|
2827
|
-
"panels.market.add.registryOfficial": "npm registry",
|
|
2828
|
-
"panels.market.add.registryMirror": "China mirror",
|
|
2829
|
-
"panels.market.add.registryWithHost": "{name} ({host})",
|
|
2830
|
-
"panels.market.add.registryToggle": "Source",
|
|
2831
|
-
"panels.market.add.installVersion": "Version {version}",
|
|
2832
|
-
"panels.market.add.registryDefault": "Default source",
|
|
2833
|
-
"panels.market.add.registryCustom": "Custom address",
|
|
2834
|
-
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
2835
|
-
"panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
|
|
2836
|
-
"panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
|
|
2837
|
-
"panels.market.add.run": "Install",
|
|
2838
|
-
"panels.market.add.edit": "Edit",
|
|
2839
|
-
"panels.market.add.changeRegistry": "Change source",
|
|
2840
|
-
"panels.market.add.installingTitle": "Installing the module…",
|
|
2841
|
-
"panels.market.add.installedTitle": "Installed",
|
|
2842
|
-
"panels.market.add.failedTitle": "Module install failed",
|
|
2843
|
-
"panels.market.add.cancelledTitle": "Cancelled",
|
|
2844
|
-
"panels.market.add.failureNetworkHost": "Cannot reach {host}. Git URLs and .tgz links bypass the registry, so this machine needs direct access or a proxy; if the module is also on npm, use its package name instead.",
|
|
2845
|
-
"panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
|
|
2846
|
-
"panels.market.add.problemInstalled": "This module is already installed",
|
|
2847
|
-
"panels.market.add.problemNotFound": "No such module found",
|
|
2848
|
-
"panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
|
|
2849
|
-
"panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
|
|
2850
|
-
"panels.market.add.problemNotWorkbenchModule": "This package does not match the workbench you are running, so installing it would not work. Pick another version, or ask the module author.",
|
|
2851
|
-
"panels.market.add.problemNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing. Pick another version, or ask the package author.",
|
|
2852
|
-
"panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
|
|
2853
|
-
"panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
|
|
2854
|
-
"panels.market.add.pluginPreview": "This is an opencli plugin: it goes into the opencli plugin area and works as soon as it is installed — no restart.",
|
|
2855
|
-
"panels.market.add.pluginAlias": "Plugin name: {name}",
|
|
2856
|
-
"panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
|
|
2857
|
-
"panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
|
|
2858
|
-
"panels.market.add.failureNetwork": "The network connection failed",
|
|
2859
|
-
"panels.market.add.failureNotFound": "No such module found",
|
|
2860
|
-
"panels.market.add.failureNoMatchingVersion": "No matching version",
|
|
2861
|
-
"panels.market.add.failureDiskFull": "Out of disk space, install stopped",
|
|
2862
|
-
"panels.market.add.failurePermission": "No write permission, cannot install",
|
|
2863
|
-
"panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
|
|
2864
|
-
"panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
|
|
2865
|
-
"panels.market.add.failureTimeout": "The install timed out",
|
|
2866
|
-
"panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
|
|
2867
|
-
"panels.market.add.failureInstalled": "It is already in this profile: this dsh runs with hot reload, which refuses to install over the same package (remove it first) — and removing it failed too",
|
|
2868
|
-
"panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
|
|
2869
|
-
"panels.market.add.approveTitle": "Your approval is needed for install scripts",
|
|
2870
|
-
"panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
|
|
2871
|
-
"panels.market.add.approveRun": "Allow and continue installing",
|
|
2872
|
-
"panels.market.add.restart": "Installed — restart once to pick it up.",
|
|
2873
|
-
"panels.market.add.tookEffect": "Live.",
|
|
2874
|
-
"panels.market.add.details": "Install details",
|
|
2875
|
-
"panels.market.add.open": "Add module",
|
|
2876
|
-
"panels.market.add.title": "Add module",
|
|
2877
|
-
"panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
|
|
2878
|
-
"panels.market.add.specLabel": "Package",
|
|
2879
|
-
"panels.market.add.specHint": "The same thing you would put after `dsh plugin add`: a package name (optional @version), a git URL, a tarball, or an absolute local path.",
|
|
2880
|
-
"panels.market.add.exampleTitle": "Examples",
|
|
2881
|
-
"panels.market.add.exampleFill": "Fill in an example",
|
|
2882
|
-
"panels.market.add.registryLabel": "Source",
|
|
2883
|
-
"panels.market.add.registryProfile": "This profile's registry",
|
|
2884
|
-
"panels.market.add.registryPnpm": "pnpm's own registry",
|
|
2885
|
-
"panels.market.add.check": "Check",
|
|
2886
|
-
"panels.market.add.checking": "Checking…",
|
|
2887
|
-
"panels.market.add.classifying": "Checking…",
|
|
2888
|
-
"panels.market.add.change": "Edit",
|
|
2889
|
-
"panels.market.add.previewTitle": "About to install",
|
|
2890
|
-
"panels.market.add.fieldName": "Package",
|
|
2891
|
-
"panels.market.add.fieldVersion": "Version",
|
|
2892
|
-
"panels.market.add.fieldDescription": "Description",
|
|
2893
|
-
"panels.market.add.fieldSource": "Source",
|
|
2894
|
-
"panels.market.add.install": "Install",
|
|
2895
|
-
"panels.market.add.installing": "Installing…",
|
|
2896
|
-
"panels.market.add.cancel": "Cancel install",
|
|
2897
|
-
"panels.market.add.close": "Close",
|
|
2898
|
-
"panels.market.add.retry": "Retry",
|
|
2899
|
-
"panels.market.add.changeSource": "Change source",
|
|
2900
|
-
"panels.market.add.approveBuilds": "Allow these scripts and retry",
|
|
2901
|
-
"panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
|
|
2902
|
-
"panels.market.add.doneApplied": "Installed and live.",
|
|
2903
|
-
"panels.market.add.doneRestart": "Installed — restart once to pick it up.",
|
|
2904
|
-
"panels.market.add.restartWhy": "Why this needs a restart: {reason}",
|
|
2905
|
-
"panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
|
|
2906
|
-
"panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
|
|
2907
|
-
"panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
|
|
2908
|
-
"panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
|
|
2909
|
-
"panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
|
|
2910
|
-
"panels.market.add.cancelled": "Cancelled.",
|
|
2911
|
-
"panels.market.add.failed": "Didn't work: {reason}",
|
|
2912
|
-
"panels.market.add.removed": "It has been removed.",
|
|
2913
|
-
"panels.market.add.supplyPending": "Its plugins install after you restart.",
|
|
2914
|
-
"panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
|
|
2915
|
-
"panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
|
|
2916
|
-
"panels.market.add.removedRestart": "Removed — restart once to finish.",
|
|
2917
|
-
"panels.market.add.remove": "Remove it",
|
|
2918
|
-
"panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
|
|
2919
|
-
"panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
|
|
2920
|
-
"panels.market.add.problem.notFound": "No such package on that source.",
|
|
2921
|
-
"panels.market.add.problem.notAPackage": "There is no package at that location.",
|
|
2922
|
-
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
|
|
2923
|
-
"panels.market.add.problem.network": "The source is unreachable.",
|
|
2924
|
-
"panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
|
|
2925
|
-
"panels.market.add.reason.invalidSpec": "the spec is not accepted",
|
|
2926
|
-
"panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
|
|
2927
|
-
"panels.market.add.reason.notBundle": "it is not a dsh plugin package",
|
|
2928
|
-
"panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
|
|
2929
|
-
"panels.market.add.reason.bundleInUse": "something is still using it",
|
|
2930
|
-
"panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
|
|
2931
|
-
"panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
|
|
2932
|
-
"panels.market.add.reason.operationError": "pnpm failed (see the install output)",
|
|
2933
|
-
"panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
|
|
2934
|
-
"panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
|
|
2935
|
-
"panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
|
|
2936
|
-
"panels.market.add.reason.diskFull": "the disk is full",
|
|
2937
|
-
"panels.market.add.reason.permission": "no permission to write",
|
|
2938
|
-
"panels.market.add.reason.integrity": "the download failed its integrity check",
|
|
2939
|
-
"panels.market.add.reason.timeout": "no output for too long, so it was stopped",
|
|
2940
|
-
"panels.market.add.reason.network": "the network is unreachable",
|
|
2941
|
-
"panels.market.add.reason.notFound": "no such package on the source",
|
|
2942
|
-
"panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
|
|
2943
|
-
"blocker.fix.install": "Install for me",
|
|
2944
|
-
"blocker.fix.update": "Upgrade for me",
|
|
2945
|
-
"blocker.fix.running": "Running…",
|
|
2946
|
-
"blocker.fix.failed": "Failed: ",
|
|
2947
|
-
"blocker.retry": "Retry",
|
|
2948
|
-
"blocker.retry.running": "Retrying…",
|
|
2949
|
-
"blocker.copy": "Copy command",
|
|
2950
|
-
"blocker.market.open": "Open the module market",
|
|
2951
|
-
"blocker.login.title": "Sign in to {platform}",
|
|
2952
|
-
"blocker.login.titleGeneric": "Sign-in required",
|
|
2953
|
-
"blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
|
|
2954
|
-
"blocker.login.go": "Go sign in",
|
|
2955
|
-
"blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
|
|
2956
|
-
"blocker.forbidden.title": "No access to {platform}",
|
|
2957
|
-
"blocker.forbidden.titleGeneric": "No access",
|
|
2958
|
-
"blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
|
|
2959
|
-
"blocker.forbidden.open": "Open permissions page",
|
|
2960
|
-
"blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
|
|
2961
|
-
"blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
|
|
2962
|
-
"blocker.unknown.title": "Something went wrong",
|
|
2963
|
-
"panels.reading": "Reading the panel setup…",
|
|
2964
|
-
"panels.cardBroken": "This module will not render: {unit} ({reason})",
|
|
2965
|
-
"panels.cardRetry": "Retry",
|
|
2966
|
-
"panels.empty": "No modules on the panel yet",
|
|
2967
|
-
"panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
|
|
2968
|
-
"env.title": "Preparing the workbench",
|
|
2969
|
-
"env.checking": "Checking the runtime environment…",
|
|
2970
|
-
"env.installing": "Installing the missing dependency…",
|
|
2971
|
-
"env.failed": "One step away",
|
|
2972
|
-
"env.elapsed": "Waiting {seconds}s",
|
|
2973
|
-
"env.stepFailed.install": "install failed",
|
|
2974
|
-
"env.stepFailed.path": "installed but not found",
|
|
2975
|
-
"env.stepFailed.shell": "no shell channel",
|
|
2976
|
-
"env.bridge.ok": "Connected",
|
|
2977
|
-
"env.bridge.short": "Not connected",
|
|
2978
|
-
"env.bridge.why": "Panel data goes through the login state in your browser: with this channel down, modules cannot fetch data. It does not block startup, but fix it first.",
|
|
2979
|
-
"env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
|
|
2980
|
-
"env.bridge.extension": "The browser extension is not connected. Install it once from the Chrome Web Store (then hit Retry here). If it is already installed, run the command below first.",
|
|
2981
|
-
"env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
|
|
2982
|
-
"env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
|
|
2983
|
-
"env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
|
|
2984
|
-
"env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
|
|
2985
|
-
"env.fix.title": "How to fix it",
|
|
2986
|
-
"env.fix.why": "The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.",
|
|
2987
|
-
"env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
|
|
2988
|
-
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
|
|
2989
|
-
"env.fix.step": "Run this in a terminal, then hit Retry:",
|
|
2990
|
-
"env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
|
|
2991
|
-
"env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
|
|
2992
|
-
"env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
|
|
2993
|
-
"env.fix.network": "Network unreachable: check your network or proxy, then retry.",
|
|
2994
|
-
"env.fix.details": "Details (for troubleshooting)",
|
|
2995
|
-
"env.retry": "Retry",
|
|
2996
|
-
"env.copyCommand": "Copy command",
|
|
2997
|
-
"env.copied": "Copied",
|
|
2998
|
-
"env.step.opencli": "Checking the workbench opencli",
|
|
2999
|
-
"env.step.codingPlugin": "Checking the coding plugin",
|
|
3000
|
-
"env.step.bridge": "Checking the browser bridge",
|
|
3001
|
-
"env.step.warm": "Warming up site sessions",
|
|
3002
|
-
"env.warm.done": "{n} site(s) warmed up",
|
|
3003
|
-
"env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
|
|
3004
|
-
"env.unit.failed": "This module cannot start",
|
|
3005
|
-
"env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
|
|
3006
|
-
"env.unit.missingPlugin": "This module is not ready yet",
|
|
3007
|
-
"env.unit.missingCommandsHint": "Updating it should fix this.",
|
|
3008
|
-
"env.unit.unchecked": "Cannot check: no shell channel",
|
|
3009
|
-
"env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
|
|
3010
|
-
"env.unit.missingCommands": "This module is out of date",
|
|
3011
|
-
"env.unit.hint": "Retry after installing; other modules are unaffected.",
|
|
3012
|
-
"rightbar.label": "Data panels",
|
|
3013
|
-
"rightbar.expand": "Expand the data panel",
|
|
3014
|
-
"rightbar.collapse": "Collapse the data panel",
|
|
3015
|
-
"rightbar.column.label": "Right column",
|
|
3016
|
-
"rightbar.column.workbench": "Workbench panel",
|
|
3017
|
-
"rightbar.column.dsh": "dsh panel",
|
|
3018
|
-
"rightbar.refresh": "Refresh",
|
|
3019
|
-
"rightbar.refreshing": "Refreshing…",
|
|
3020
|
-
"rightbar.updatedAt": "updated {time}",
|
|
3021
|
-
"rightbar.noProject": "The current session has no workspace",
|
|
3022
|
-
"rightbar.openPlatform": "Open on the platform",
|
|
3023
|
-
"coding.notARepo.title": "This workspace is not a Coding repository",
|
|
3024
|
-
"error.unknown": "Something went wrong",
|
|
3025
|
-
"board.title": "Workbench panel",
|
|
3026
|
-
"panel.conversation": "Conversation",
|
|
3027
|
-
"panels.label": "Global panels",
|
|
3028
|
-
"configSync.nav": "Config sync",
|
|
3029
|
-
"configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
|
|
3030
|
-
"configSync.source": "Source",
|
|
3031
|
-
"configSync.sourceBroken": "its config is unreadable",
|
|
3032
|
-
"configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
|
|
3033
|
-
"configSync.sourceDead": "unreadable",
|
|
3034
|
-
"configSync.refresh": "Read again",
|
|
3035
|
-
"configSync.loading": "Reading the source config…",
|
|
3036
|
-
"configSync.readHint": "Pick another source, or read again.",
|
|
3037
|
-
"configSync.tag.new": "New",
|
|
3038
|
-
"configSync.tag.differs": "Differs",
|
|
3039
|
-
"configSync.conflictNote": "Applying replaces this workbench copy with the source",
|
|
3040
|
-
"configSync.code.lang": "yaml",
|
|
3041
|
-
"configSync.code.copy": "Copy",
|
|
3042
|
-
"configSync.code.copied": "Copied",
|
|
3043
|
-
"configSync.code.wrap": "Wrap lines",
|
|
3044
|
-
"configSync.code.unwrap": "No wrap",
|
|
3045
|
-
"configSync.code.collapse": "Collapse",
|
|
3046
|
-
"configSync.code.collapseAria": "Collapse this row",
|
|
3047
|
-
"configSync.code.expandAria": "Expand the diff ({count} more lines)",
|
|
3048
|
-
"configSync.code.expand": "Show {count} more lines",
|
|
3049
|
-
"configSync.missing": "{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market",
|
|
3050
|
-
"configSync.apply": "Sync {count} selected",
|
|
3051
|
-
"configSync.applyNone": "Pick some rows first",
|
|
3052
|
-
"configSync.applying": "Writing…",
|
|
3053
|
-
"configSync.applied": "Written to the workbench config · applied",
|
|
3054
|
-
"configSync.appliedIds": "Written this time: {ids}",
|
|
3055
|
-
"configSync.skippedIds": "Left alone (already here): {ids}",
|
|
3056
|
-
"configSync.nothing": "Nothing to sync",
|
|
3057
|
-
"configSync.unreadable": "Cannot read {path}: {reason}",
|
|
3058
|
-
"configSync.noSource": "This machine has no other profile to sync from",
|
|
3059
|
-
"configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
|
|
3060
|
-
"configSync.failed": "The sync did not go through; try again.",
|
|
3061
|
-
"debug.workspace": "this workspace",
|
|
3062
|
-
"debug.status": "Debugging “{title}”",
|
|
3063
|
-
"debug.status.trouble": "Debugging needs your attention ({title})",
|
|
3064
|
-
"debug.stalled": "Debugging paused ({title})",
|
|
3065
|
-
"debug.act.pause": "Pause debugging",
|
|
3066
|
-
"debug.act.resume": "Resume debugging",
|
|
3067
|
-
"debug.act.stop": "Stop debugging",
|
|
3068
|
-
"debug.act.stop.ask": "Confirm stop",
|
|
3069
|
-
"debug.card.here.title": "Debugging “{title}”",
|
|
3070
|
-
"debug.card.here.note": "Do not switch workspaces or touch the panel",
|
|
3071
|
-
"debug.card.away.note": "Switch back to “{title}”",
|
|
3072
|
-
"debug.card.paused.note": "Paused",
|
|
3073
|
-
"debug.card.hidden.note": "Switch back to the Workbench panel",
|
|
3074
|
-
"record.waiting": "Recording handoff · your turn",
|
|
3075
|
-
"record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
|
|
3076
|
-
"record.recording": "Recording",
|
|
3077
|
-
"record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
|
|
3078
|
-
"record.finished": "Recording finished",
|
|
3079
|
-
"record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
|
|
3080
|
-
"record.act.cancel": "Cancel",
|
|
3081
|
-
"record.act.halt": "Halt",
|
|
3082
|
-
"approval.record.site": "Site",
|
|
3083
|
-
"approval.record.what": "Records",
|
|
3084
|
-
"approval.record.lands": "Lands in",
|
|
3085
|
-
"approval.record.noUrl": "no site given (this call gets refused)",
|
|
3086
|
-
"approval.record.oneAction": "one action",
|
|
3087
|
-
"approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
|
|
3088
|
-
"approval.longTask.what": "Stops",
|
|
3089
|
-
"approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
|
|
3090
|
-
};
|
|
3091
|
-
//#endregion
|
|
3092
|
-
//#region ../shared/dist/i18n/zh.js
|
|
3093
|
-
/** 外壳自带的中文词表(命名空间 `workbench`):`en` 与它逐键对齐,模块那份在它之上合并。 */
|
|
3094
|
-
var zh = {
|
|
3095
|
-
"brand.name": "工作台",
|
|
3096
|
-
"toggle.open": "打开侧边栏",
|
|
3097
|
-
"toggle.collapse": "收起侧边栏",
|
|
3098
|
-
"project.label": "切换项目",
|
|
3099
|
-
"workspace.section": "工作区",
|
|
3100
|
-
"project.none": "未选择项目",
|
|
3101
|
-
"project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
|
|
3102
|
-
"project.add": "添加项目…",
|
|
3103
|
-
"project.add.busy": "正在新建工作区…",
|
|
3104
|
-
"project.add.failed": "新建工作区没成功",
|
|
3105
|
-
"project.search.label": "搜索工作区",
|
|
3106
|
-
"project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
|
|
3107
|
-
"project.search.empty": "没有匹配「{query}」的工作区。",
|
|
3108
|
-
"project.group.workspaces": "工作区",
|
|
3109
|
-
"project.group.defaultWorkspace": "默认工作区",
|
|
3110
|
-
"project.group.workshop": "工坊",
|
|
3111
|
-
"project.rename.row": "改「{name}」的中文名",
|
|
3112
|
-
"project.rename.current": "改当前工作区的中文名…",
|
|
3113
|
-
"project.rename.title": "给「{name}」配一个中文名",
|
|
3114
|
-
"project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
|
|
3115
|
-
"project.rename.field": "中文名",
|
|
3116
|
-
"project.rename.placeholder": "例如:工作台外壳",
|
|
3117
|
-
"project.rename.hint": "留空 = 只显示目录名",
|
|
3118
|
-
"project.rename.save": "保存",
|
|
3119
|
-
"project.rename.saving": "保存中…",
|
|
3120
|
-
"project.rename.cancel": "取消",
|
|
3121
|
-
"project.rename.failed": "改名失败了,再试一次。",
|
|
3122
|
-
"session.new": "新会话",
|
|
3123
|
-
"session.new.label": "在当前项目新建会话",
|
|
3124
|
-
"session.empty": "这个项目还没有会话。",
|
|
3125
|
-
"session.noProject": "先添加一个项目。",
|
|
3126
|
-
"session.list.label": "会话",
|
|
3127
|
-
"session.copy": "复制",
|
|
3128
|
-
"session.pinned": "已置顶",
|
|
3129
|
-
"session.actions": "{name} 的操作",
|
|
3130
|
-
"status.idle": "空闲",
|
|
3131
|
-
"status.running": "进行中",
|
|
3132
|
-
"status.waitingApproval": "等待审批",
|
|
3133
|
-
"status.planReview": "计划待审",
|
|
3134
|
-
"status.waitingAnswer": "等待回答",
|
|
3135
|
-
"status.compact.approval": "待审批",
|
|
3136
|
-
"status.compact.planReview": "计划待审",
|
|
3137
|
-
"status.compact.answer": "待回答",
|
|
3138
|
-
"status.completed": "已完成",
|
|
3139
|
-
"status.subagentsRunning.one": "{n} 个子代理运行中",
|
|
3140
|
-
"status.subagentsRunning.other": "{n} 个子代理运行中",
|
|
3141
|
-
"project.attention.warning.one": "1 个会话在等你点头",
|
|
3142
|
-
"project.attention.warning.other": "{n} 个会话在等你点头",
|
|
3143
|
-
"project.attention.running.one": "1 个会话在跑",
|
|
3144
|
-
"project.attention.running.other": "{n} 个会话在跑",
|
|
3145
|
-
"project.attention.done.one": "1 个会话跑完没看",
|
|
3146
|
-
"project.attention.done.other": "{n} 个会话跑完没看",
|
|
3147
|
-
"project.attention.state.warning": "待审批",
|
|
3148
|
-
"project.attention.state.running": "在跑",
|
|
3149
|
-
"project.attention.state.done": "新消息",
|
|
3150
|
-
"hover.copied": "已复制",
|
|
3151
|
-
"time.now": "刚刚",
|
|
3152
|
-
"time.minutes": "{n} 分钟前",
|
|
3153
|
-
"time.hours": "{n} 小时前",
|
|
3154
|
-
"time.days": "{n} 天前",
|
|
3155
|
-
"time.ago": "{t}前",
|
|
3156
|
-
"time.short.minutes": "{n}分钟",
|
|
3157
|
-
"time.short.hours": "{n}小时",
|
|
3158
|
-
"time.short.days": "{n}天",
|
|
3159
|
-
"time.short.months": "{n}个月",
|
|
3160
|
-
"time.short.years": "{n}年",
|
|
3161
|
-
"panels.title": "面板模块",
|
|
3162
|
-
"panels.groupBoardless": "无看板模块",
|
|
3163
|
-
"panels.groupPlugins": "opencli 插件",
|
|
3164
|
-
"panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
|
|
3165
|
-
"panels.market.defaultLabel": "全局默认开启",
|
|
3166
|
-
"panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
|
|
3167
|
-
"panels.followAll": "全部恢复默认",
|
|
3168
|
-
"panels.followAllConfirmTitle": "全部恢复默认?",
|
|
3169
|
-
"panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
|
|
3170
|
-
"panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
|
|
3171
|
-
"panels.followAllConfirmYes": "恢复默认",
|
|
3172
|
-
"panels.followAllConfirmNo": "取消",
|
|
3173
|
-
"panels.enabled": "这个项目已启用",
|
|
3174
|
-
"panels.disabled": "这个项目未启用",
|
|
3175
|
-
"panels.choose": "选择模块",
|
|
3176
|
-
"panels.buildModule": "造一个模块",
|
|
3177
|
-
"panels.failed": "改配置失败了,再试一次。",
|
|
3178
|
-
"panels.dragHint": "拖动调整顺序",
|
|
3179
|
-
"panels.unknownStep": "这一层没有套件提供",
|
|
3180
|
-
"panels.labelWithHint": "{label}({hint})",
|
|
3181
|
-
"panels.hintJoin": ";",
|
|
3182
|
-
"panels.dep.failed": "⚠ 起不来",
|
|
3183
|
-
"panels.dep.missingPlugin": "⚠ 还没装好",
|
|
3184
|
-
"panels.dep.missingCommands": "⚠ 需要更新",
|
|
3185
|
-
"panels.dep.unchecked": "⚠ 检测不了",
|
|
3186
|
-
"panels.tab.modules": "面板配置",
|
|
3187
|
-
"panels.tab.market": "工作台模块市场",
|
|
3188
|
-
"panels.browseMarket": "浏览模块市场",
|
|
3189
|
-
"panels.noneInstalled": "这些模块要的插件都还没装",
|
|
3190
|
-
"panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
|
|
3191
|
-
"panels.market.installed": "已安装",
|
|
3192
|
-
"panels.market.notActive": "未生效",
|
|
3193
|
-
"panels.market.notUsable": "不可用",
|
|
3194
|
-
"panels.market.broken": "装坏了",
|
|
3195
|
-
"panels.market.hasNew": "有新版本",
|
|
3196
|
-
"panels.market.hasProblem": "模块异常",
|
|
3197
|
-
"panels.market.missing": "未装",
|
|
3198
|
-
"panels.market.unchecked": "状态未知",
|
|
3199
|
-
"panels.market.checking": "检测中",
|
|
3200
|
-
"panels.market.sectionInstalled": "已安装模块",
|
|
3201
|
-
"panels.market.sectionPending": "未安装",
|
|
3202
|
-
"panels.market.sectionShared": "共用依赖",
|
|
3203
|
-
"panels.market.sharedUsedBy": "供 {modules} 模块使用",
|
|
3204
|
-
"panels.market.listSeparator": "、",
|
|
3205
|
-
"panels.market.sharedMissing": "未装",
|
|
3206
|
-
"panels.market.sharedOutdated": "有新版",
|
|
3207
|
-
"panels.market.sharedUnsatisfied": "版本不对",
|
|
3208
|
-
"panels.market.sharedOk": "已装",
|
|
3209
|
-
"panels.market.versionArrow": "{from} → {to}",
|
|
3210
|
-
"panels.market.lead": "装在这台机器上,所有项目共用。",
|
|
3211
|
-
"panels.market.install": "安装",
|
|
3212
|
-
"panels.market.update": "更新",
|
|
3213
|
-
"panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
|
|
3214
|
-
"panels.market.uninstall": "卸载",
|
|
3215
|
-
"panels.market.uninstallLabel": "卸载 {name}",
|
|
3216
|
-
"panels.market.installing": "正在安装…",
|
|
3217
|
-
"panels.market.updating": "正在更新…",
|
|
3218
|
-
"panels.market.uninstalling": "正在卸载…",
|
|
3219
|
-
"panels.market.confirmUninstallTitle": "卸载「{name}」?",
|
|
3220
|
-
"panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
|
|
3221
|
-
"panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
|
|
3222
|
-
"panels.market.confirmYes": "卸载",
|
|
3223
|
-
"panels.market.confirmNo": "取消",
|
|
3224
|
-
"panels.market.failed": "没成功:{reason}",
|
|
3225
|
-
"panels.market.needEnv": "先在启动工作台的终端里设 {env}",
|
|
3226
|
-
"panels.market.needCommands": "缺这几条命令:{commands}",
|
|
3227
|
-
"panels.market.localMark": "本地",
|
|
3228
|
-
"panels.market.localHint": "本机那份(不从源上取)。",
|
|
3229
|
-
"panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
|
|
3230
|
-
"panels.market.badSource": "安装方式没写全,只能自己动手",
|
|
3231
|
-
"panels.market.empty": "暂无可用模块",
|
|
3232
|
-
"panels.market.sectionPlugins": "已安装 opencli 插件",
|
|
3233
|
-
"panels.market.moduleOutdated": "有新版",
|
|
3234
|
-
"panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
|
|
3235
|
-
"panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
|
|
3236
|
-
"panels.market.moduleRestartHint": "重启后生效",
|
|
3237
|
-
"panels.market.pendingRestart": "重启后生效",
|
|
3238
|
-
"panels.market.workbenchName": "工作台",
|
|
3239
|
-
"panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
|
|
3240
|
-
"panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
|
|
3241
|
-
"panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
|
|
3242
|
-
"panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
|
|
3243
|
-
"panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
|
|
3244
|
-
"panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
|
|
3245
|
-
"panels.market.restartNeeded": "新版装好了,重启一次才生效。",
|
|
3246
|
-
"panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
|
|
3247
|
-
"panels.market.recheck": "重新检查更新",
|
|
3248
|
-
"panels.market.checkUpdates": "检查更新",
|
|
3249
|
-
"panels.market.checkedAt": "最近检查:{time}",
|
|
3250
|
-
"panels.market.justNow": "刚刚",
|
|
3251
|
-
"panels.market.minutesAgo": "{n} 分钟前",
|
|
3252
|
-
"panels.market.hoursAgo": "{n} 小时前",
|
|
3253
|
-
"panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
|
|
3254
|
-
"panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
|
|
3255
|
-
"panels.market.add.guideToggle": "模块安装引导和示例",
|
|
3256
|
-
"panels.market.add.guideHide": "收起引导",
|
|
3257
|
-
"panels.market.add.guideIdTitle": "包名",
|
|
3258
|
-
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
3259
|
-
"panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
|
|
3260
|
-
"panels.market.add.guideGitTitle": "Git 仓库地址",
|
|
3261
|
-
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
3262
|
-
"panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
|
|
3263
|
-
"panels.market.add.guidePathTitle": "本地模块目录",
|
|
3264
|
-
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
3265
|
-
"panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
|
|
3266
|
-
"panels.market.add.guideExampleLabel": "示例:",
|
|
3267
|
-
"panels.market.add.guideFill": "填入示例",
|
|
3268
|
-
"panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
|
|
3269
|
-
"panels.market.add.registryLegend": "从哪个 npm 源下载模块",
|
|
3270
|
-
"panels.market.add.registryOfficial": "npm 官方源",
|
|
3271
|
-
"panels.market.add.registryMirror": "中国大陆镜像源",
|
|
3272
|
-
"panels.market.add.registryWithHost": "{name}({host})",
|
|
3273
|
-
"panels.market.add.registryToggle": "安装源",
|
|
3274
|
-
"panels.market.add.installVersion": "版本 {version}",
|
|
3275
|
-
"panels.market.add.registryDefault": "默认安装源",
|
|
3276
|
-
"panels.market.add.registryCustom": "自定义地址",
|
|
3277
|
-
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
3278
|
-
"panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
|
|
3279
|
-
"panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
|
|
3280
|
-
"panels.market.add.run": "安装",
|
|
3281
|
-
"panels.market.add.edit": "编辑",
|
|
3282
|
-
"panels.market.add.changeRegistry": "更换安装源",
|
|
3283
|
-
"panels.market.add.installingTitle": "模块安装中…",
|
|
3284
|
-
"panels.market.add.installedTitle": "已安装",
|
|
3285
|
-
"panels.market.add.failedTitle": "模块安装失败",
|
|
3286
|
-
"panels.market.add.cancelledTitle": "已取消",
|
|
3287
|
-
"panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
|
|
3288
|
-
"panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
|
|
3289
|
-
"panels.market.add.problemInstalled": "该模块已安装",
|
|
3290
|
-
"panels.market.add.problemNotFound": "未找到相关模块",
|
|
3291
|
-
"panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
|
|
3292
|
-
"panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
|
|
3293
|
-
"panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
|
|
3294
|
-
"panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
|
|
3295
|
-
"panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
|
|
3296
|
-
"panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
|
|
3297
|
-
"panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
|
|
3298
|
-
"panels.market.add.pluginAlias": "插件名:{name}",
|
|
3299
|
-
"panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
|
|
3300
|
-
"panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
|
|
3301
|
-
"panels.market.add.failureNetwork": "网络连接失败",
|
|
3302
|
-
"panels.market.add.failureNotFound": "未找到相关模块",
|
|
3303
|
-
"panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
|
|
3304
|
-
"panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
|
|
3305
|
-
"panels.market.add.failurePermission": "没有写入权限,无法安装",
|
|
3306
|
-
"panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
|
|
3307
|
-
"panels.market.add.failureIntegrity": "下载的安装包校验失败",
|
|
3308
|
-
"panels.market.add.failureTimeout": "安装超时",
|
|
3309
|
-
"panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
|
|
3310
|
-
"panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
|
|
3311
|
-
"panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
|
|
3312
|
-
"panels.market.add.approveTitle": "需要你允许安装脚本",
|
|
3313
|
-
"panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
|
|
3314
|
-
"panels.market.add.approveRun": "允许并继续安装",
|
|
3315
|
-
"panels.market.add.restart": "装好了,重启一次才生效。",
|
|
3316
|
-
"panels.market.add.tookEffect": "已生效。",
|
|
3317
|
-
"panels.market.add.details": "安装详情",
|
|
3318
|
-
"panels.market.add.open": "添加模块",
|
|
3319
|
-
"panels.market.add.title": "添加模块",
|
|
3320
|
-
"panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
|
|
3321
|
-
"panels.market.add.specLabel": "包名",
|
|
3322
|
-
"panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
|
|
3323
|
-
"panels.market.add.exampleTitle": "示例",
|
|
3324
|
-
"panels.market.add.exampleFill": "填入示例",
|
|
3325
|
-
"panels.market.add.registryLabel": "安装源",
|
|
3326
|
-
"panels.market.add.registryProfile": "这个 profile 配的源",
|
|
3327
|
-
"panels.market.add.registryPnpm": "pnpm 自己配的源",
|
|
3328
|
-
"panels.market.add.check": "预检",
|
|
3329
|
-
"panels.market.add.checking": "正在预检…",
|
|
3330
|
-
"panels.market.add.classifying": "检测中…",
|
|
3331
|
-
"panels.market.add.change": "改一下",
|
|
3332
|
-
"panels.market.add.previewTitle": "将要安装",
|
|
3333
|
-
"panels.market.add.fieldName": "包名",
|
|
3334
|
-
"panels.market.add.fieldVersion": "版本",
|
|
3335
|
-
"panels.market.add.fieldDescription": "简介",
|
|
3336
|
-
"panels.market.add.fieldSource": "来源",
|
|
3337
|
-
"panels.market.add.install": "安装",
|
|
3338
|
-
"panels.market.add.installing": "正在安装…",
|
|
3339
|
-
"panels.market.add.cancel": "取消安装",
|
|
3340
|
-
"panels.market.add.close": "关闭",
|
|
3341
|
-
"panels.market.add.retry": "重试",
|
|
3342
|
-
"panels.market.add.changeSource": "换源",
|
|
3343
|
-
"panels.market.add.approveBuilds": "允许这些脚本并重试",
|
|
3344
|
-
"panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
|
|
3345
|
-
"panels.market.add.doneApplied": "装好了,已经生效。",
|
|
3346
|
-
"panels.market.add.doneRestart": "装好了,重启一次才生效。",
|
|
3347
|
-
"panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
|
|
3348
|
-
"panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
|
|
3349
|
-
"panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
|
|
3350
|
-
"panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
|
|
3351
|
-
"panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
|
|
3352
|
-
"panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
|
|
3353
|
-
"panels.market.add.cancelled": "已取消。",
|
|
3354
|
-
"panels.market.add.failed": "没成功:{reason}",
|
|
3355
|
-
"panels.market.add.removed": "已经移除了。",
|
|
3356
|
-
"panels.market.add.supplyPending": "它要的插件重启后再装。",
|
|
3357
|
-
"panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
|
|
3358
|
-
"panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
|
|
3359
|
-
"panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
|
|
3360
|
-
"panels.market.add.remove": "移除它",
|
|
3361
|
-
"panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
|
|
3362
|
-
"panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
|
|
3363
|
-
"panels.market.add.problem.notFound": "源上没有这个包。",
|
|
3364
|
-
"panels.market.add.problem.notAPackage": "这个位置没有包。",
|
|
3365
|
-
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
|
|
3366
|
-
"panels.market.add.problem.network": "源连不上。",
|
|
3367
|
-
"panels.market.add.problem.unknown": "预检没通过(原因未知)。",
|
|
3368
|
-
"panels.market.add.reason.invalidSpec": "写法不认",
|
|
3369
|
-
"panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
|
|
3370
|
-
"panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
|
|
3371
|
-
"panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
|
|
3372
|
-
"panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
|
|
3373
|
-
"panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
|
|
3374
|
-
"panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
|
|
3375
|
-
"panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
|
|
3376
|
-
"panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
|
|
3377
|
-
"panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
|
|
3378
|
-
"panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
|
|
3379
|
-
"panels.market.add.reason.diskFull": "磁盘满了",
|
|
3380
|
-
"panels.market.add.reason.permission": "没有写权限",
|
|
3381
|
-
"panels.market.add.reason.integrity": "下载内容校验不过",
|
|
3382
|
-
"panels.market.add.reason.timeout": "太久没有输出,被中断了",
|
|
3383
|
-
"panels.market.add.reason.network": "网络不通",
|
|
3384
|
-
"panels.market.add.reason.notFound": "源上没有这个包",
|
|
3385
|
-
"panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
|
|
3386
|
-
"blocker.fix.install": "帮我安装",
|
|
3387
|
-
"blocker.fix.update": "帮我升级",
|
|
3388
|
-
"blocker.fix.running": "正在执行…",
|
|
3389
|
-
"blocker.fix.failed": "执行失败:",
|
|
3390
|
-
"blocker.retry": "重试",
|
|
3391
|
-
"blocker.retry.running": "重试中…",
|
|
3392
|
-
"blocker.copy": "复制命令",
|
|
3393
|
-
"blocker.market.open": "去模块市场",
|
|
3394
|
-
"blocker.login.title": "需要登录 {platform}",
|
|
3395
|
-
"blocker.login.titleGeneric": "需要登录",
|
|
3396
|
-
"blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
|
|
3397
|
-
"blocker.login.go": "去登录",
|
|
3398
|
-
"blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
|
|
3399
|
-
"blocker.forbidden.title": "没有权限访问 {platform}",
|
|
3400
|
-
"blocker.forbidden.titleGeneric": "没有权限",
|
|
3401
|
-
"blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
|
|
3402
|
-
"blocker.forbidden.open": "打开权限页",
|
|
3403
|
-
"blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
|
|
3404
|
-
"blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
|
|
3405
|
-
"blocker.unknown.title": "出了点问题",
|
|
3406
|
-
"panels.reading": "正在读取面板配置…",
|
|
3407
|
-
"panels.cardBroken": "这个模块起不来:{unit}({reason})",
|
|
3408
|
-
"panels.cardRetry": "重试",
|
|
3409
|
-
"panels.empty": "面板里还没有模块",
|
|
3410
|
-
"panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
|
|
3411
|
-
"env.title": "准备工作台",
|
|
3412
|
-
"env.checking": "正在检测运行环境…",
|
|
3413
|
-
"env.installing": "正在安装缺失的依赖…",
|
|
3414
|
-
"env.failed": "还差一步就能用了",
|
|
3415
|
-
"env.elapsed": "已等待 {seconds} 秒",
|
|
3416
|
-
"env.stepFailed.install": "装不上",
|
|
3417
|
-
"env.stepFailed.path": "装了但还找不到",
|
|
3418
|
-
"env.stepFailed.shell": "执行通道不可用",
|
|
3419
|
-
"env.bridge.ok": "已连接",
|
|
3420
|
-
"env.bridge.short": "没连上",
|
|
3421
|
-
"env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
|
|
3422
|
-
"env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
|
|
3423
|
-
"env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
|
|
3424
|
-
"env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
|
|
3425
|
-
"env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
|
|
3426
|
-
"env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
|
|
3427
|
-
"env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
|
|
3428
|
-
"env.fix.title": "怎么解决",
|
|
3429
|
-
"env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
|
|
3430
|
-
"env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
|
|
3431
|
-
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
|
|
3432
|
-
"env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
|
|
3433
|
-
"env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
|
|
3434
|
-
"env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
|
|
3435
|
-
"env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
|
|
3436
|
-
"env.fix.network": "网络不通:检查网络或代理设置后重试。",
|
|
3437
|
-
"env.fix.details": "详细输出(排障用)",
|
|
3438
|
-
"env.retry": "重试",
|
|
3439
|
-
"env.copyCommand": "复制命令",
|
|
3440
|
-
"env.copied": "已复制",
|
|
3441
|
-
"env.step.opencli": "检测工作台的 opencli",
|
|
3442
|
-
"env.step.codingPlugin": "检测 coding 插件",
|
|
3443
|
-
"env.step.bridge": "检测浏览器通道",
|
|
3444
|
-
"env.step.warm": "预热站点登录态",
|
|
3445
|
-
"env.warm.done": "已预热 {n} 个站点",
|
|
3446
|
-
"env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
|
|
3447
|
-
"env.unit.failed": "这个模块起不来",
|
|
3448
|
-
"env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
|
|
3449
|
-
"env.unit.missingPlugin": "这个模块还没装好",
|
|
3450
|
-
"env.unit.missingCommandsHint": "更新之后就能用了。",
|
|
3451
|
-
"env.unit.unchecked": "检测不了:拿不到执行通道",
|
|
3452
|
-
"env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
|
|
3453
|
-
"env.unit.missingCommands": "这个模块的版本旧了",
|
|
3454
|
-
"env.unit.hint": "装好之后点重试;不影响其它模块。",
|
|
3455
|
-
"rightbar.label": "数据面板",
|
|
3456
|
-
"rightbar.expand": "展开数据面板",
|
|
3457
|
-
"rightbar.collapse": "收起数据面板",
|
|
3458
|
-
"rightbar.column.label": "右侧栏",
|
|
3459
|
-
"rightbar.column.workbench": "工作台面板",
|
|
3460
|
-
"rightbar.column.dsh": "dsh 面板",
|
|
3461
|
-
"rightbar.refresh": "刷新",
|
|
3462
|
-
"rightbar.refreshing": "刷新中…",
|
|
3463
|
-
"rightbar.updatedAt": "更新于 {time}",
|
|
3464
|
-
"rightbar.noProject": "当前会话没有所属项目",
|
|
3465
|
-
"rightbar.openPlatform": "在平台上打开",
|
|
3466
|
-
"coding.notARepo.title": "这个项目不是 Coding 仓库",
|
|
3467
|
-
"error.unknown": "出错了",
|
|
3468
|
-
"board.title": "工作台面板",
|
|
3469
|
-
"panel.conversation": "对话",
|
|
3470
|
-
"panels.label": "全局面板",
|
|
3471
|
-
"configSync.nav": "配置同步",
|
|
3472
|
-
"configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
|
|
3473
|
-
"configSync.source": "来源",
|
|
3474
|
-
"configSync.sourceBroken": "读不到它的配置",
|
|
3475
|
-
"configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
|
|
3476
|
-
"configSync.sourceDead": "读不到",
|
|
3477
|
-
"configSync.refresh": "重新读一遍",
|
|
3478
|
-
"configSync.loading": "正在读来源的配置…",
|
|
3479
|
-
"configSync.readHint": "换个来源,或再读一遍。",
|
|
3480
|
-
"configSync.tag.new": "新增",
|
|
3481
|
-
"configSync.tag.differs": "差异",
|
|
3482
|
-
"configSync.conflictNote": "应用后工作台这份会被来源覆盖",
|
|
3483
|
-
"configSync.code.lang": "yaml",
|
|
3484
|
-
"configSync.code.copy": "复制",
|
|
3485
|
-
"configSync.code.copied": "已复制",
|
|
3486
|
-
"configSync.code.wrap": "自动换行",
|
|
3487
|
-
"configSync.code.unwrap": "不换行",
|
|
3488
|
-
"configSync.code.collapse": "收起",
|
|
3489
|
-
"configSync.code.collapseAria": "收起这一行的配置",
|
|
3490
|
-
"configSync.code.expandAria": "展开差异(还有 {count} 行)",
|
|
3491
|
-
"configSync.code.expand": "展开剩余 {count} 行",
|
|
3492
|
-
"configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
|
|
3493
|
-
"configSync.apply": "同步选中的 {count} 行",
|
|
3494
|
-
"configSync.applyNone": "先勾几行",
|
|
3495
|
-
"configSync.applying": "正在写入…",
|
|
3496
|
-
"configSync.applied": "已写入工作台配置 · 已生效",
|
|
3497
|
-
"configSync.appliedIds": "这次写进去:{ids}",
|
|
3498
|
-
"configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
|
|
3499
|
-
"configSync.nothing": "没有需要同步的内容",
|
|
3500
|
-
"configSync.unreadable": "读不到 {path}:{reason}",
|
|
3501
|
-
"configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
|
|
3502
|
-
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
|
|
3503
|
-
"configSync.failed": "同步没成功,再试一次。",
|
|
3504
|
-
"debug.workspace": "这个工作区",
|
|
3505
|
-
"debug.status": "「{title}」调试中",
|
|
3506
|
-
"debug.status.trouble": "调试要你看一眼({title})",
|
|
3507
|
-
"debug.stalled": "调试已暂停({title})",
|
|
3508
|
-
"debug.act.pause": "暂停调试",
|
|
3509
|
-
"debug.act.resume": "继续调试",
|
|
3510
|
-
"debug.act.stop": "结束调试",
|
|
3511
|
-
"debug.act.stop.ask": "确认结束",
|
|
3512
|
-
"debug.card.here.title": "正在调试「{title}」",
|
|
3513
|
-
"debug.card.here.note": "请勿切换工作区和操作面板",
|
|
3514
|
-
"debug.card.away.note": "请切回「{title}」那一屏",
|
|
3515
|
-
"debug.card.paused.note": "已暂停",
|
|
3516
|
-
"debug.card.hidden.note": "请切回工作台面板",
|
|
3517
|
-
"record.waiting": "取证交接 · 等你出手",
|
|
3518
|
-
"record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
|
|
3519
|
-
"record.recording": "录制中",
|
|
3520
|
-
"record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
|
|
3521
|
-
"record.finished": "录制完成",
|
|
3522
|
-
"record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
|
|
3523
|
-
"record.act.cancel": "取消",
|
|
3524
|
-
"record.act.halt": "停",
|
|
3525
|
-
"approval.record.site": "站点",
|
|
3526
|
-
"approval.record.what": "录制功能",
|
|
3527
|
-
"approval.record.lands": "落点",
|
|
3528
|
-
"approval.record.noUrl": "没给站点地址(这次会被当场拒)",
|
|
3529
|
-
"approval.record.oneAction": "一次操作",
|
|
3530
|
-
"approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
|
|
3531
|
-
"approval.longTask.what": "要停的那一趟",
|
|
3532
|
-
"approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
|
|
3533
|
-
};
|
|
3534
|
-
//#endregion
|
|
3535
2441
|
//#region ../shared/dist/i18n/index.js
|
|
3536
2442
|
/** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
|
|
3537
2443
|
var dictionaries = {
|
|
3538
|
-
zh
|
|
3539
|
-
|
|
2444
|
+
zh: {
|
|
2445
|
+
"brand.name": "工作台",
|
|
2446
|
+
"toggle.open": "打开侧边栏",
|
|
2447
|
+
"toggle.collapse": "收起侧边栏",
|
|
2448
|
+
"project.label": "切换项目",
|
|
2449
|
+
"workspace.section": "工作区",
|
|
2450
|
+
"project.none": "未选择项目",
|
|
2451
|
+
"project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
|
|
2452
|
+
"project.add": "添加项目…",
|
|
2453
|
+
"project.add.busy": "正在新建工作区…",
|
|
2454
|
+
"project.add.failed": "新建工作区没成功",
|
|
2455
|
+
"project.search.label": "搜索工作区",
|
|
2456
|
+
"project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
|
|
2457
|
+
"project.search.empty": "没有匹配「{query}」的工作区。",
|
|
2458
|
+
"project.group.workspaces": "工作区",
|
|
2459
|
+
"project.group.defaultWorkspace": "默认工作区",
|
|
2460
|
+
"project.group.workshop": "工坊",
|
|
2461
|
+
"project.rename.row": "改「{name}」的中文名",
|
|
2462
|
+
"project.rename.current": "改当前工作区的中文名…",
|
|
2463
|
+
"project.rename.title": "给「{name}」配一个中文名",
|
|
2464
|
+
"project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
|
|
2465
|
+
"project.rename.field": "中文名",
|
|
2466
|
+
"project.rename.placeholder": "例如:工作台外壳",
|
|
2467
|
+
"project.rename.hint": "留空 = 只显示目录名",
|
|
2468
|
+
"project.rename.save": "保存",
|
|
2469
|
+
"project.rename.saving": "保存中…",
|
|
2470
|
+
"project.rename.cancel": "取消",
|
|
2471
|
+
"project.rename.failed": "改名失败了,再试一次。",
|
|
2472
|
+
"session.new": "新会话",
|
|
2473
|
+
"session.new.label": "在当前项目新建会话",
|
|
2474
|
+
"session.empty": "这个项目还没有会话。",
|
|
2475
|
+
"session.noProject": "先添加一个项目。",
|
|
2476
|
+
"session.list.label": "会话",
|
|
2477
|
+
"session.copy": "复制",
|
|
2478
|
+
"session.pinned": "已置顶",
|
|
2479
|
+
"session.actions": "{name} 的操作",
|
|
2480
|
+
"status.idle": "空闲",
|
|
2481
|
+
"status.running": "进行中",
|
|
2482
|
+
"status.longTask": "长任务在跑",
|
|
2483
|
+
"status.waitingApproval": "等待审批",
|
|
2484
|
+
"status.planReview": "计划待审",
|
|
2485
|
+
"status.waitingAnswer": "等待回答",
|
|
2486
|
+
"status.compact.approval": "待审批",
|
|
2487
|
+
"status.compact.planReview": "计划待审",
|
|
2488
|
+
"status.compact.answer": "待回答",
|
|
2489
|
+
"status.completed": "已完成",
|
|
2490
|
+
"status.subagentsRunning.one": "{n} 个子代理运行中",
|
|
2491
|
+
"status.subagentsRunning.other": "{n} 个子代理运行中",
|
|
2492
|
+
"project.attention.warning.one": "1 个会话在等你点头",
|
|
2493
|
+
"project.attention.warning.other": "{n} 个会话在等你点头",
|
|
2494
|
+
"project.attention.running.one": "1 个会话在跑",
|
|
2495
|
+
"project.attention.running.other": "{n} 个会话在跑",
|
|
2496
|
+
"project.attention.longTask.one": "1 个长任务在跑",
|
|
2497
|
+
"project.attention.longTask.other": "{n} 个长任务在跑",
|
|
2498
|
+
"project.attention.done.one": "1 个会话跑完没看",
|
|
2499
|
+
"project.attention.done.other": "{n} 个会话跑完没看",
|
|
2500
|
+
"project.attention.state.warning": "待审批",
|
|
2501
|
+
"project.attention.state.running": "在跑",
|
|
2502
|
+
"project.attention.state.done": "新消息",
|
|
2503
|
+
"hover.copied": "已复制",
|
|
2504
|
+
"time.now": "刚刚",
|
|
2505
|
+
"time.minutes": "{n} 分钟前",
|
|
2506
|
+
"time.hours": "{n} 小时前",
|
|
2507
|
+
"time.days": "{n} 天前",
|
|
2508
|
+
"time.ago": "{t}前",
|
|
2509
|
+
"time.short.minutes": "{n}分钟",
|
|
2510
|
+
"time.short.hours": "{n}小时",
|
|
2511
|
+
"time.short.days": "{n}天",
|
|
2512
|
+
"time.short.months": "{n}个月",
|
|
2513
|
+
"time.short.years": "{n}年",
|
|
2514
|
+
"panels.title": "面板模块",
|
|
2515
|
+
"panels.groupBoardless": "无看板模块",
|
|
2516
|
+
"panels.groupPlugins": "opencli 插件",
|
|
2517
|
+
"panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
|
|
2518
|
+
"panels.market.defaultLabel": "全局默认开启",
|
|
2519
|
+
"panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
|
|
2520
|
+
"panels.followAll": "全部恢复默认",
|
|
2521
|
+
"panels.followAllConfirmTitle": "全部恢复默认?",
|
|
2522
|
+
"panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
|
|
2523
|
+
"panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
|
|
2524
|
+
"panels.followAllConfirmYes": "恢复默认",
|
|
2525
|
+
"panels.followAllConfirmNo": "取消",
|
|
2526
|
+
"panels.enabled": "这个项目已启用",
|
|
2527
|
+
"panels.disabled": "这个项目未启用",
|
|
2528
|
+
"panels.choose": "选择模块",
|
|
2529
|
+
"panels.buildModule": "造一个模块",
|
|
2530
|
+
"panels.failed": "改配置失败了,再试一次。",
|
|
2531
|
+
"panels.dragHint": "拖动调整顺序",
|
|
2532
|
+
"panels.unknownStep": "这一层没有套件提供",
|
|
2533
|
+
"panels.labelWithHint": "{label}({hint})",
|
|
2534
|
+
"panels.hintJoin": ";",
|
|
2535
|
+
"panels.dep.failed": "⚠ 起不来",
|
|
2536
|
+
"panels.dep.missingPlugin": "⚠ 还没装好",
|
|
2537
|
+
"panels.dep.missingCommands": "⚠ 需要更新",
|
|
2538
|
+
"panels.dep.unchecked": "⚠ 检测不了",
|
|
2539
|
+
"panels.tab.modules": "面板配置",
|
|
2540
|
+
"panels.tab.market": "工作台模块市场",
|
|
2541
|
+
"panels.browseMarket": "浏览模块市场",
|
|
2542
|
+
"panels.noneInstalled": "这些模块要的插件都还没装",
|
|
2543
|
+
"panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
|
|
2544
|
+
"panels.market.installed": "已安装",
|
|
2545
|
+
"panels.market.notActive": "未生效",
|
|
2546
|
+
"panels.market.notUsable": "不可用",
|
|
2547
|
+
"panels.market.broken": "装坏了",
|
|
2548
|
+
"panels.market.hasNew": "有新版本",
|
|
2549
|
+
"panels.market.hasProblem": "模块异常",
|
|
2550
|
+
"panels.market.missing": "未装",
|
|
2551
|
+
"panels.market.unchecked": "状态未知",
|
|
2552
|
+
"panels.market.checking": "检测中",
|
|
2553
|
+
"panels.market.sectionInstalled": "已安装模块",
|
|
2554
|
+
"panels.market.sectionPending": "未安装",
|
|
2555
|
+
"panels.market.sectionShared": "共用依赖",
|
|
2556
|
+
"panels.market.sharedUsedBy": "供 {modules} 模块使用",
|
|
2557
|
+
"panels.market.listSeparator": "、",
|
|
2558
|
+
"panels.market.sharedMissing": "未装",
|
|
2559
|
+
"panels.market.sharedOutdated": "有新版",
|
|
2560
|
+
"panels.market.sharedUnsatisfied": "版本不对",
|
|
2561
|
+
"panels.market.sharedOk": "已装",
|
|
2562
|
+
"panels.market.versionArrow": "{from} → {to}",
|
|
2563
|
+
"panels.market.lead": "装在这台机器上,所有项目共用。",
|
|
2564
|
+
"panels.market.install": "安装",
|
|
2565
|
+
"panels.market.update": "更新",
|
|
2566
|
+
"panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
|
|
2567
|
+
"panels.market.uninstall": "卸载",
|
|
2568
|
+
"panels.market.uninstallLabel": "卸载 {name}",
|
|
2569
|
+
"panels.market.installing": "正在安装…",
|
|
2570
|
+
"panels.market.updating": "正在更新…",
|
|
2571
|
+
"panels.market.uninstalling": "正在卸载…",
|
|
2572
|
+
"panels.market.confirmUninstallTitle": "卸载「{name}」?",
|
|
2573
|
+
"panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
|
|
2574
|
+
"panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
|
|
2575
|
+
"panels.market.confirmYes": "卸载",
|
|
2576
|
+
"panels.market.confirmNo": "取消",
|
|
2577
|
+
"panels.market.failed": "没成功:{reason}",
|
|
2578
|
+
"panels.market.needEnv": "先在启动工作台的终端里设 {env}",
|
|
2579
|
+
"panels.market.needCommands": "缺这几条命令:{commands}",
|
|
2580
|
+
"panels.market.localMark": "本地",
|
|
2581
|
+
"panels.market.localHint": "本机那份(不从源上取)。",
|
|
2582
|
+
"panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
|
|
2583
|
+
"panels.market.badSource": "安装方式没写全,只能自己动手",
|
|
2584
|
+
"panels.market.empty": "暂无可用模块",
|
|
2585
|
+
"panels.market.sectionPlugins": "已安装 opencli 插件",
|
|
2586
|
+
"panels.market.moduleOutdated": "有新版",
|
|
2587
|
+
"panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
|
|
2588
|
+
"panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
|
|
2589
|
+
"panels.market.moduleRestartHint": "重启后生效",
|
|
2590
|
+
"panels.market.pendingRestart": "重启后生效",
|
|
2591
|
+
"panels.market.workbenchName": "工作台",
|
|
2592
|
+
"panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
|
|
2593
|
+
"panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
|
|
2594
|
+
"panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
|
|
2595
|
+
"panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
|
|
2596
|
+
"panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
|
|
2597
|
+
"panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
|
|
2598
|
+
"panels.market.restartNeeded": "新版装好了,重启一次才生效。",
|
|
2599
|
+
"panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
|
|
2600
|
+
"panels.market.recheck": "重新检查更新",
|
|
2601
|
+
"panels.market.checkUpdates": "检查更新",
|
|
2602
|
+
"panels.market.checkedAt": "最近检查:{time}",
|
|
2603
|
+
"panels.market.justNow": "刚刚",
|
|
2604
|
+
"panels.market.minutesAgo": "{n} 分钟前",
|
|
2605
|
+
"panels.market.hoursAgo": "{n} 小时前",
|
|
2606
|
+
"panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
|
|
2607
|
+
"panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
|
|
2608
|
+
"panels.market.add.guideToggle": "模块安装引导和示例",
|
|
2609
|
+
"panels.market.add.guideHide": "收起引导",
|
|
2610
|
+
"panels.market.add.guideIdTitle": "包名",
|
|
2611
|
+
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
2612
|
+
"panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
|
|
2613
|
+
"panels.market.add.guideGitTitle": "Git 仓库地址",
|
|
2614
|
+
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
2615
|
+
"panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
|
|
2616
|
+
"panels.market.add.guidePathTitle": "本地模块目录",
|
|
2617
|
+
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
2618
|
+
"panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
|
|
2619
|
+
"panels.market.add.guideExampleLabel": "示例:",
|
|
2620
|
+
"panels.market.add.guideFill": "填入示例",
|
|
2621
|
+
"panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
|
|
2622
|
+
"panels.market.add.registryLegend": "从哪个 npm 源下载模块",
|
|
2623
|
+
"panels.market.add.registryOfficial": "npm 官方源",
|
|
2624
|
+
"panels.market.add.registryMirror": "中国大陆镜像源",
|
|
2625
|
+
"panels.market.add.registryWithHost": "{name}({host})",
|
|
2626
|
+
"panels.market.add.registryToggle": "安装源",
|
|
2627
|
+
"panels.market.add.installVersion": "版本 {version}",
|
|
2628
|
+
"panels.market.add.registryDefault": "默认安装源",
|
|
2629
|
+
"panels.market.add.registryCustom": "自定义地址",
|
|
2630
|
+
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
2631
|
+
"panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
|
|
2632
|
+
"panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
|
|
2633
|
+
"panels.market.add.run": "安装",
|
|
2634
|
+
"panels.market.add.edit": "编辑",
|
|
2635
|
+
"panels.market.add.changeRegistry": "更换安装源",
|
|
2636
|
+
"panels.market.add.installingTitle": "模块安装中…",
|
|
2637
|
+
"panels.market.add.installedTitle": "已安装",
|
|
2638
|
+
"panels.market.add.failedTitle": "模块安装失败",
|
|
2639
|
+
"panels.market.add.cancelledTitle": "已取消",
|
|
2640
|
+
"panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
|
|
2641
|
+
"panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
|
|
2642
|
+
"panels.market.add.problemInstalled": "该模块已安装",
|
|
2643
|
+
"panels.market.add.problemNotFound": "未找到相关模块",
|
|
2644
|
+
"panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
|
|
2645
|
+
"panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
|
|
2646
|
+
"panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
|
|
2647
|
+
"panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
|
|
2648
|
+
"panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
|
|
2649
|
+
"panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
|
|
2650
|
+
"panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
|
|
2651
|
+
"panels.market.add.pluginAlias": "插件名:{name}",
|
|
2652
|
+
"panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
|
|
2653
|
+
"panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
|
|
2654
|
+
"panels.market.add.failureNetwork": "网络连接失败",
|
|
2655
|
+
"panels.market.add.failureNotFound": "未找到相关模块",
|
|
2656
|
+
"panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
|
|
2657
|
+
"panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
|
|
2658
|
+
"panels.market.add.failurePermission": "没有写入权限,无法安装",
|
|
2659
|
+
"panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
|
|
2660
|
+
"panels.market.add.failureIntegrity": "下载的安装包校验失败",
|
|
2661
|
+
"panels.market.add.failureTimeout": "安装超时",
|
|
2662
|
+
"panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
|
|
2663
|
+
"panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
|
|
2664
|
+
"panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
|
|
2665
|
+
"panels.market.add.approveTitle": "需要你允许安装脚本",
|
|
2666
|
+
"panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
|
|
2667
|
+
"panels.market.add.approveRun": "允许并继续安装",
|
|
2668
|
+
"panels.market.add.restart": "装好了,重启一次才生效。",
|
|
2669
|
+
"panels.market.add.tookEffect": "已生效。",
|
|
2670
|
+
"panels.market.add.details": "安装详情",
|
|
2671
|
+
"panels.market.add.open": "添加模块",
|
|
2672
|
+
"panels.market.add.title": "添加模块",
|
|
2673
|
+
"panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
|
|
2674
|
+
"panels.market.add.specLabel": "包名",
|
|
2675
|
+
"panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
|
|
2676
|
+
"panels.market.add.exampleTitle": "示例",
|
|
2677
|
+
"panels.market.add.exampleFill": "填入示例",
|
|
2678
|
+
"panels.market.add.registryLabel": "安装源",
|
|
2679
|
+
"panels.market.add.registryProfile": "这个 profile 配的源",
|
|
2680
|
+
"panels.market.add.registryPnpm": "pnpm 自己配的源",
|
|
2681
|
+
"panels.market.add.check": "预检",
|
|
2682
|
+
"panels.market.add.checking": "正在预检…",
|
|
2683
|
+
"panels.market.add.classifying": "检测中…",
|
|
2684
|
+
"panels.market.add.change": "改一下",
|
|
2685
|
+
"panels.market.add.previewTitle": "将要安装",
|
|
2686
|
+
"panels.market.add.fieldName": "包名",
|
|
2687
|
+
"panels.market.add.fieldVersion": "版本",
|
|
2688
|
+
"panels.market.add.fieldDescription": "简介",
|
|
2689
|
+
"panels.market.add.fieldSource": "来源",
|
|
2690
|
+
"panels.market.add.install": "安装",
|
|
2691
|
+
"panels.market.add.installing": "正在安装…",
|
|
2692
|
+
"panels.market.add.cancel": "取消安装",
|
|
2693
|
+
"panels.market.add.close": "关闭",
|
|
2694
|
+
"panels.market.add.retry": "重试",
|
|
2695
|
+
"panels.market.add.changeSource": "换源",
|
|
2696
|
+
"panels.market.add.approveBuilds": "允许这些脚本并重试",
|
|
2697
|
+
"panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
|
|
2698
|
+
"panels.market.add.doneApplied": "装好了,已经生效。",
|
|
2699
|
+
"panels.market.add.doneRestart": "装好了,重启一次才生效。",
|
|
2700
|
+
"panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
|
|
2701
|
+
"panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
|
|
2702
|
+
"panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
|
|
2703
|
+
"panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
|
|
2704
|
+
"panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
|
|
2705
|
+
"panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
|
|
2706
|
+
"panels.market.add.cancelled": "已取消。",
|
|
2707
|
+
"panels.market.add.failed": "没成功:{reason}",
|
|
2708
|
+
"panels.market.add.removed": "已经移除了。",
|
|
2709
|
+
"panels.market.add.supplyPending": "它要的插件重启后再装。",
|
|
2710
|
+
"panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
|
|
2711
|
+
"panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
|
|
2712
|
+
"panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
|
|
2713
|
+
"panels.market.add.remove": "移除它",
|
|
2714
|
+
"panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
|
|
2715
|
+
"panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
|
|
2716
|
+
"panels.market.add.problem.notFound": "源上没有这个包。",
|
|
2717
|
+
"panels.market.add.problem.notAPackage": "这个位置没有包。",
|
|
2718
|
+
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
|
|
2719
|
+
"panels.market.add.problem.network": "源连不上。",
|
|
2720
|
+
"panels.market.add.problem.unknown": "预检没通过(原因未知)。",
|
|
2721
|
+
"panels.market.add.reason.invalidSpec": "写法不认",
|
|
2722
|
+
"panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
|
|
2723
|
+
"panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
|
|
2724
|
+
"panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
|
|
2725
|
+
"panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
|
|
2726
|
+
"panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
|
|
2727
|
+
"panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
|
|
2728
|
+
"panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
|
|
2729
|
+
"panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
|
|
2730
|
+
"panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
|
|
2731
|
+
"panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
|
|
2732
|
+
"panels.market.add.reason.diskFull": "磁盘满了",
|
|
2733
|
+
"panels.market.add.reason.permission": "没有写权限",
|
|
2734
|
+
"panels.market.add.reason.integrity": "下载内容校验不过",
|
|
2735
|
+
"panels.market.add.reason.timeout": "太久没有输出,被中断了",
|
|
2736
|
+
"panels.market.add.reason.network": "网络不通",
|
|
2737
|
+
"panels.market.add.reason.notFound": "源上没有这个包",
|
|
2738
|
+
"panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
|
|
2739
|
+
"blocker.fix.install": "帮我安装",
|
|
2740
|
+
"blocker.fix.update": "帮我升级",
|
|
2741
|
+
"blocker.fix.running": "正在执行…",
|
|
2742
|
+
"blocker.fix.failed": "执行失败:",
|
|
2743
|
+
"blocker.retry": "重试",
|
|
2744
|
+
"blocker.retry.running": "重试中…",
|
|
2745
|
+
"blocker.copy": "复制命令",
|
|
2746
|
+
"blocker.market.open": "去模块市场",
|
|
2747
|
+
"blocker.login.title": "需要登录 {platform}",
|
|
2748
|
+
"blocker.login.titleGeneric": "需要登录",
|
|
2749
|
+
"blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
|
|
2750
|
+
"blocker.login.go": "去登录",
|
|
2751
|
+
"blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
|
|
2752
|
+
"blocker.forbidden.title": "没有权限访问 {platform}",
|
|
2753
|
+
"blocker.forbidden.titleGeneric": "没有权限",
|
|
2754
|
+
"blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
|
|
2755
|
+
"blocker.forbidden.open": "打开权限页",
|
|
2756
|
+
"blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
|
|
2757
|
+
"blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
|
|
2758
|
+
"blocker.unknown.title": "出了点问题",
|
|
2759
|
+
"panels.reading": "正在读取面板配置…",
|
|
2760
|
+
"panels.cardBroken": "这个模块起不来:{unit}({reason})",
|
|
2761
|
+
"panels.cardRetry": "重试",
|
|
2762
|
+
"panels.empty": "面板里还没有模块",
|
|
2763
|
+
"panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
|
|
2764
|
+
"env.title": "准备工作台",
|
|
2765
|
+
"env.checking": "正在检测运行环境…",
|
|
2766
|
+
"env.installing": "正在安装缺失的依赖…",
|
|
2767
|
+
"env.failed": "还差一步就能用了",
|
|
2768
|
+
"env.elapsed": "已等待 {seconds} 秒",
|
|
2769
|
+
"env.stepFailed.install": "装不上",
|
|
2770
|
+
"env.stepFailed.path": "装了但还找不到",
|
|
2771
|
+
"env.stepFailed.shell": "执行通道不可用",
|
|
2772
|
+
"env.bridge.ok": "已连接",
|
|
2773
|
+
"env.bridge.short": "没连上",
|
|
2774
|
+
"env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
|
|
2775
|
+
"env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
|
|
2776
|
+
"env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
|
|
2777
|
+
"env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
|
|
2778
|
+
"env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
|
|
2779
|
+
"env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
|
|
2780
|
+
"env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
|
|
2781
|
+
"env.fix.title": "怎么解决",
|
|
2782
|
+
"env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
|
|
2783
|
+
"env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
|
|
2784
|
+
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
|
|
2785
|
+
"env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
|
|
2786
|
+
"env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
|
|
2787
|
+
"env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
|
|
2788
|
+
"env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
|
|
2789
|
+
"env.fix.network": "网络不通:检查网络或代理设置后重试。",
|
|
2790
|
+
"env.fix.details": "详细输出(排障用)",
|
|
2791
|
+
"env.retry": "重试",
|
|
2792
|
+
"env.copyCommand": "复制命令",
|
|
2793
|
+
"env.copied": "已复制",
|
|
2794
|
+
"env.step.opencli": "检测工作台的 opencli",
|
|
2795
|
+
"env.step.codingPlugin": "检测 coding 插件",
|
|
2796
|
+
"env.step.bridge": "检测浏览器通道",
|
|
2797
|
+
"env.step.warm": "预热站点登录态",
|
|
2798
|
+
"env.warm.done": "已预热 {n} 个站点",
|
|
2799
|
+
"env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
|
|
2800
|
+
"env.unit.failed": "这个模块起不来",
|
|
2801
|
+
"env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
|
|
2802
|
+
"env.unit.missingPlugin": "这个模块还没装好",
|
|
2803
|
+
"env.unit.missingCommandsHint": "更新之后就能用了。",
|
|
2804
|
+
"env.unit.unchecked": "检测不了:拿不到执行通道",
|
|
2805
|
+
"env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
|
|
2806
|
+
"env.unit.missingCommands": "这个模块的版本旧了",
|
|
2807
|
+
"env.unit.hint": "装好之后点重试;不影响其它模块。",
|
|
2808
|
+
"rightbar.label": "数据面板",
|
|
2809
|
+
"rightbar.expand": "展开数据面板",
|
|
2810
|
+
"rightbar.collapse": "收起数据面板",
|
|
2811
|
+
"rightbar.column.label": "右侧栏",
|
|
2812
|
+
"rightbar.column.workbench": "工作台面板",
|
|
2813
|
+
"rightbar.column.dsh": "dsh 面板",
|
|
2814
|
+
"rightbar.refresh": "刷新",
|
|
2815
|
+
"rightbar.refreshing": "刷新中…",
|
|
2816
|
+
"rightbar.updatedAt": "更新于 {time}",
|
|
2817
|
+
"rightbar.noProject": "当前会话没有所属项目",
|
|
2818
|
+
"rightbar.openPlatform": "在平台上打开",
|
|
2819
|
+
"coding.notARepo.title": "这个项目不是 Coding 仓库",
|
|
2820
|
+
"error.unknown": "出错了",
|
|
2821
|
+
"board.title": "工作台面板",
|
|
2822
|
+
"panel.conversation": "对话",
|
|
2823
|
+
"panels.label": "全局面板",
|
|
2824
|
+
"configSync.nav": "配置同步",
|
|
2825
|
+
"configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
|
|
2826
|
+
"configSync.source": "来源",
|
|
2827
|
+
"configSync.sourceBroken": "读不到它的配置",
|
|
2828
|
+
"configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
|
|
2829
|
+
"configSync.sourceDead": "读不到",
|
|
2830
|
+
"configSync.refresh": "重新读一遍",
|
|
2831
|
+
"configSync.loading": "正在读来源的配置…",
|
|
2832
|
+
"configSync.readHint": "换个来源,或再读一遍。",
|
|
2833
|
+
"configSync.tag.new": "新增",
|
|
2834
|
+
"configSync.tag.differs": "差异",
|
|
2835
|
+
"configSync.conflictNote": "应用后工作台这份会被来源覆盖",
|
|
2836
|
+
"configSync.code.lang": "yaml",
|
|
2837
|
+
"configSync.code.copy": "复制",
|
|
2838
|
+
"configSync.code.copied": "已复制",
|
|
2839
|
+
"configSync.code.wrap": "自动换行",
|
|
2840
|
+
"configSync.code.unwrap": "不换行",
|
|
2841
|
+
"configSync.code.collapse": "收起",
|
|
2842
|
+
"configSync.code.collapseAria": "收起这一行的配置",
|
|
2843
|
+
"configSync.code.expandAria": "展开差异(还有 {count} 行)",
|
|
2844
|
+
"configSync.code.expand": "展开剩余 {count} 行",
|
|
2845
|
+
"configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
|
|
2846
|
+
"configSync.apply": "同步选中的 {count} 行",
|
|
2847
|
+
"configSync.applyNone": "先勾几行",
|
|
2848
|
+
"configSync.applying": "正在写入…",
|
|
2849
|
+
"configSync.applied": "已写入工作台配置 · 已生效",
|
|
2850
|
+
"configSync.appliedIds": "这次写进去:{ids}",
|
|
2851
|
+
"configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
|
|
2852
|
+
"configSync.nothing": "没有需要同步的内容",
|
|
2853
|
+
"configSync.unreadable": "读不到 {path}:{reason}",
|
|
2854
|
+
"configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
|
|
2855
|
+
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
|
|
2856
|
+
"configSync.failed": "同步没成功,再试一次。",
|
|
2857
|
+
"debug.workspace": "这个工作区",
|
|
2858
|
+
"debug.status": "「{title}」调试中",
|
|
2859
|
+
"debug.status.trouble": "调试要你看一眼({title})",
|
|
2860
|
+
"debug.stalled": "调试已暂停({title})",
|
|
2861
|
+
"debug.act.pause": "暂停调试",
|
|
2862
|
+
"debug.act.resume": "继续调试",
|
|
2863
|
+
"debug.act.stop": "结束调试",
|
|
2864
|
+
"debug.act.stop.ask": "确认结束",
|
|
2865
|
+
"debug.card.here.title": "正在调试「{title}」",
|
|
2866
|
+
"debug.card.here.note": "请勿切换工作区和操作面板",
|
|
2867
|
+
"debug.card.away.note": "请切回「{title}」那一屏",
|
|
2868
|
+
"debug.card.paused.note": "已暂停",
|
|
2869
|
+
"debug.card.hidden.note": "请切回工作台面板",
|
|
2870
|
+
"record.waiting": "取证交接 · 等你出手",
|
|
2871
|
+
"record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
|
|
2872
|
+
"record.recording": "录制中",
|
|
2873
|
+
"record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
|
|
2874
|
+
"record.recording.shots": ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)",
|
|
2875
|
+
"record.finished": "录制完成",
|
|
2876
|
+
"record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
|
|
2877
|
+
"record.act.cancel": "取消",
|
|
2878
|
+
"record.act.halt": "停",
|
|
2879
|
+
"approval.record.site": "站点",
|
|
2880
|
+
"approval.record.what": "录制功能",
|
|
2881
|
+
"approval.record.lands": "落点",
|
|
2882
|
+
"approval.record.noUrl": "没给站点地址(这次会被当场拒)",
|
|
2883
|
+
"approval.record.oneAction": "一次操作",
|
|
2884
|
+
"approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
|
|
2885
|
+
"approval.longTask.what": "要停的那一趟",
|
|
2886
|
+
"approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
|
|
2887
|
+
},
|
|
2888
|
+
en: {
|
|
2889
|
+
"brand.name": "Workbench",
|
|
2890
|
+
"toggle.open": "Open sidebar",
|
|
2891
|
+
"toggle.collapse": "Collapse sidebar",
|
|
2892
|
+
"project.label": "Switch project",
|
|
2893
|
+
"workspace.section": "Workspaces",
|
|
2894
|
+
"project.none": "No project",
|
|
2895
|
+
"project.empty": "No projects yet. Use “Add project” below.",
|
|
2896
|
+
"project.add": "Add project…",
|
|
2897
|
+
"project.add.busy": "Creating the workspace…",
|
|
2898
|
+
"project.add.failed": "Creating the workspace failed",
|
|
2899
|
+
"project.search.label": "Search workspaces",
|
|
2900
|
+
"project.search.placeholder": "Search workspaces (folder / name / path)",
|
|
2901
|
+
"project.search.empty": "No workspace matches “{query}”.",
|
|
2902
|
+
"project.group.workspaces": "Workspaces",
|
|
2903
|
+
"project.group.defaultWorkspace": "Default workspace",
|
|
2904
|
+
"project.group.workshop": "Workshop",
|
|
2905
|
+
"project.rename.row": "Rename “{name}”",
|
|
2906
|
+
"project.rename.current": "Give this workspace a display name…",
|
|
2907
|
+
"project.rename.title": "Give “{name}” a display name",
|
|
2908
|
+
"project.rename.description": "Shown after the folder name. It renames the workspace itself.",
|
|
2909
|
+
"project.rename.field": "Display name",
|
|
2910
|
+
"project.rename.placeholder": "e.g. Workbench shell",
|
|
2911
|
+
"project.rename.hint": "Empty = folder name only",
|
|
2912
|
+
"project.rename.save": "Save",
|
|
2913
|
+
"project.rename.saving": "Saving…",
|
|
2914
|
+
"project.rename.cancel": "Cancel",
|
|
2915
|
+
"project.rename.failed": "Rename failed. Try again.",
|
|
2916
|
+
"session.new": "New session",
|
|
2917
|
+
"session.new.label": "Start a session in the current project",
|
|
2918
|
+
"session.empty": "No sessions in this project yet.",
|
|
2919
|
+
"session.noProject": "Add a project first.",
|
|
2920
|
+
"session.list.label": "Sessions",
|
|
2921
|
+
"session.copy": "Copy",
|
|
2922
|
+
"session.pinned": "Pinned",
|
|
2923
|
+
"session.actions": "Actions for {name}",
|
|
2924
|
+
"status.idle": "Idle",
|
|
2925
|
+
"status.running": "Running",
|
|
2926
|
+
"status.longTask": "Long task running",
|
|
2927
|
+
"status.waitingApproval": "Waiting for approval",
|
|
2928
|
+
"status.planReview": "Plan awaiting review",
|
|
2929
|
+
"status.waitingAnswer": "Waiting for your answer",
|
|
2930
|
+
"status.compact.approval": "Approval",
|
|
2931
|
+
"status.compact.planReview": "Plan review",
|
|
2932
|
+
"status.compact.answer": "Answer",
|
|
2933
|
+
"status.completed": "Completed",
|
|
2934
|
+
"status.subagentsRunning.one": "{n} subagent running",
|
|
2935
|
+
"status.subagentsRunning.other": "{n} subagents running",
|
|
2936
|
+
"project.attention.warning.one": "1 session waiting for you",
|
|
2937
|
+
"project.attention.warning.other": "{n} sessions waiting for you",
|
|
2938
|
+
"project.attention.running.one": "1 session running",
|
|
2939
|
+
"project.attention.running.other": "{n} sessions running",
|
|
2940
|
+
"project.attention.longTask.one": "1 long task running",
|
|
2941
|
+
"project.attention.longTask.other": "{n} long tasks running",
|
|
2942
|
+
"project.attention.done.one": "1 session finished, unread",
|
|
2943
|
+
"project.attention.done.other": "{n} sessions finished, unread",
|
|
2944
|
+
"project.attention.state.warning": "Approval",
|
|
2945
|
+
"project.attention.state.running": "Running",
|
|
2946
|
+
"project.attention.state.done": "New",
|
|
2947
|
+
"hover.copied": "Copied",
|
|
2948
|
+
"time.now": "just now",
|
|
2949
|
+
"time.minutes": "{n} min ago",
|
|
2950
|
+
"time.hours": "{n} h ago",
|
|
2951
|
+
"time.days": "{n} d ago",
|
|
2952
|
+
"time.ago": "{t} ago",
|
|
2953
|
+
"time.short.minutes": "{n}min",
|
|
2954
|
+
"time.short.hours": "{n}h",
|
|
2955
|
+
"time.short.days": "{n}d",
|
|
2956
|
+
"time.short.months": "{n}mo",
|
|
2957
|
+
"time.short.years": "{n}y",
|
|
2958
|
+
"panels.title": "Panel modules",
|
|
2959
|
+
"panels.groupBoardless": "No-board modules",
|
|
2960
|
+
"panels.groupPlugins": "opencli plugins",
|
|
2961
|
+
"panels.market.defaultHint": "When on, it is on by default in every workspace; you can also turn it off for a single workspace in Panel setup.",
|
|
2962
|
+
"panels.market.defaultLabel": "On by default everywhere",
|
|
2963
|
+
"panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
|
|
2964
|
+
"panels.followAll": "Restore the default everywhere",
|
|
2965
|
+
"panels.followAllConfirmTitle": "Restore the default everywhere?",
|
|
2966
|
+
"panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
|
|
2967
|
+
"panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
|
|
2968
|
+
"panels.followAllConfirmYes": "Restore",
|
|
2969
|
+
"panels.followAllConfirmNo": "Cancel",
|
|
2970
|
+
"panels.enabled": "enabled in this project",
|
|
2971
|
+
"panels.disabled": "not enabled in this project",
|
|
2972
|
+
"panels.choose": "Choose modules",
|
|
2973
|
+
"panels.buildModule": "Build a module",
|
|
2974
|
+
"panels.failed": "Could not save the change. Try again.",
|
|
2975
|
+
"panels.dragHint": "Drag to reorder",
|
|
2976
|
+
"panels.unknownStep": "No suite provides this view",
|
|
2977
|
+
"panels.labelWithHint": "{label} ({hint})",
|
|
2978
|
+
"panels.hintJoin": "; ",
|
|
2979
|
+
"panels.dep.failed": "⚠ failed to start",
|
|
2980
|
+
"panels.dep.missingPlugin": "⚠ not ready yet",
|
|
2981
|
+
"panels.dep.missingCommands": "⚠ needs an update",
|
|
2982
|
+
"panels.dep.unchecked": "⚠ cannot check",
|
|
2983
|
+
"panels.tab.modules": "Panel setup",
|
|
2984
|
+
"panels.tab.market": "Workbench module market",
|
|
2985
|
+
"panels.browseMarket": "Browse the module market",
|
|
2986
|
+
"panels.noneInstalled": "None of these modules has its plugin installed yet",
|
|
2987
|
+
"panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
|
|
2988
|
+
"panels.market.installed": "installed",
|
|
2989
|
+
"panels.market.notActive": "not active",
|
|
2990
|
+
"panels.market.notUsable": "unusable",
|
|
2991
|
+
"panels.market.broken": "broken",
|
|
2992
|
+
"panels.market.hasNew": "New version",
|
|
2993
|
+
"panels.market.hasProblem": "Module problem",
|
|
2994
|
+
"panels.market.missing": "not installed",
|
|
2995
|
+
"panels.market.unchecked": "unknown",
|
|
2996
|
+
"panels.market.checking": "checking",
|
|
2997
|
+
"panels.market.sectionInstalled": "Installed modules",
|
|
2998
|
+
"panels.market.sectionPending": "Not installed",
|
|
2999
|
+
"panels.market.sectionShared": "Shared dependencies",
|
|
3000
|
+
"panels.market.sharedUsedBy": "Used by module {modules}",
|
|
3001
|
+
"panels.market.listSeparator": ", ",
|
|
3002
|
+
"panels.market.sharedMissing": "not installed",
|
|
3003
|
+
"panels.market.sharedOutdated": "update available",
|
|
3004
|
+
"panels.market.sharedUnsatisfied": "wrong version",
|
|
3005
|
+
"panels.market.sharedOk": "installed",
|
|
3006
|
+
"panels.market.versionArrow": "{from} → {to}",
|
|
3007
|
+
"panels.market.lead": "Installed on this machine, shared by every project.",
|
|
3008
|
+
"panels.market.install": "Install",
|
|
3009
|
+
"panels.market.update": "Update",
|
|
3010
|
+
"panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
|
|
3011
|
+
"panels.market.uninstall": "Uninstall",
|
|
3012
|
+
"panels.market.uninstallLabel": "Uninstall {name}",
|
|
3013
|
+
"panels.market.installing": "Installing…",
|
|
3014
|
+
"panels.market.updating": "Updating…",
|
|
3015
|
+
"panels.market.uninstalling": "Uninstalling…",
|
|
3016
|
+
"panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
|
|
3017
|
+
"panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
|
|
3018
|
+
"panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
|
|
3019
|
+
"panels.market.confirmYes": "Uninstall",
|
|
3020
|
+
"panels.market.confirmNo": "Cancel",
|
|
3021
|
+
"panels.market.failed": "Failed: {reason}",
|
|
3022
|
+
"panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
|
|
3023
|
+
"panels.market.needCommands": "Missing commands: {commands}",
|
|
3024
|
+
"panels.market.localMark": "local",
|
|
3025
|
+
"panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
|
|
3026
|
+
"panels.market.noSource": "This module declares no install method — install it yourself",
|
|
3027
|
+
"panels.market.badSource": "The install method is incomplete — install it yourself",
|
|
3028
|
+
"panels.market.empty": "No modules available",
|
|
3029
|
+
"panels.market.sectionPlugins": "Installed opencli plugins",
|
|
3030
|
+
"panels.market.moduleOutdated": "update available",
|
|
3031
|
+
"panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
|
|
3032
|
+
"panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
|
|
3033
|
+
"panels.market.moduleRestartHint": "restart dsh once to bring it up",
|
|
3034
|
+
"panels.market.pendingRestart": "restart required",
|
|
3035
|
+
"panels.market.workbenchName": "Workbench",
|
|
3036
|
+
"panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
|
|
3037
|
+
"panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
|
|
3038
|
+
"panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
|
|
3039
|
+
"panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
|
|
3040
|
+
"panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
|
|
3041
|
+
"panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules_install_bundle.",
|
|
3042
|
+
"panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
|
|
3043
|
+
"panels.market.foot": "After installing, enable it in the panel page of that project.",
|
|
3044
|
+
"panels.market.recheck": "Check for updates",
|
|
3045
|
+
"panels.market.checkUpdates": "Check for updates",
|
|
3046
|
+
"panels.market.checkedAt": "Last checked: {time}",
|
|
3047
|
+
"panels.market.justNow": "just now",
|
|
3048
|
+
"panels.market.minutesAgo": "{n} min ago",
|
|
3049
|
+
"panels.market.hoursAgo": "{n} h ago",
|
|
3050
|
+
"panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
|
|
3051
|
+
"panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
|
|
3052
|
+
"panels.market.add.guideToggle": "Install guide and examples",
|
|
3053
|
+
"panels.market.add.guideHide": "Hide guide",
|
|
3054
|
+
"panels.market.add.guideIdTitle": "Package name",
|
|
3055
|
+
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
3056
|
+
"panels.market.add.guideIdHint": "The module package name is its npm name (like dsh-workbench-module-xxx or @author/module) — whatever follows dsh plugin add or pnpm add in the README of a community module.",
|
|
3057
|
+
"panels.market.add.guideGitTitle": "Git URL",
|
|
3058
|
+
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
3059
|
+
"panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
|
|
3060
|
+
"panels.market.add.guidePathTitle": "Local module directory",
|
|
3061
|
+
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
3062
|
+
"panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
|
|
3063
|
+
"panels.market.add.guideExampleLabel": "Example:",
|
|
3064
|
+
"panels.market.add.guideFill": "Fill in",
|
|
3065
|
+
"panels.market.add.guideSafety": "Make sure you trust the source. Modules run on this machine with your permissions; an unknown module can damage the workbench or read and leak your data.",
|
|
3066
|
+
"panels.market.add.registryLegend": "Which npm registry to download from",
|
|
3067
|
+
"panels.market.add.registryOfficial": "npm registry",
|
|
3068
|
+
"panels.market.add.registryMirror": "China mirror",
|
|
3069
|
+
"panels.market.add.registryWithHost": "{name} ({host})",
|
|
3070
|
+
"panels.market.add.registryToggle": "Source",
|
|
3071
|
+
"panels.market.add.installVersion": "Version {version}",
|
|
3072
|
+
"panels.market.add.registryDefault": "Default source",
|
|
3073
|
+
"panels.market.add.registryCustom": "Custom address",
|
|
3074
|
+
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
3075
|
+
"panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
|
|
3076
|
+
"panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
|
|
3077
|
+
"panels.market.add.run": "Install",
|
|
3078
|
+
"panels.market.add.edit": "Edit",
|
|
3079
|
+
"panels.market.add.changeRegistry": "Change source",
|
|
3080
|
+
"panels.market.add.installingTitle": "Installing the module…",
|
|
3081
|
+
"panels.market.add.installedTitle": "Installed",
|
|
3082
|
+
"panels.market.add.failedTitle": "Module install failed",
|
|
3083
|
+
"panels.market.add.cancelledTitle": "Cancelled",
|
|
3084
|
+
"panels.market.add.failureNetworkHost": "Cannot reach {host}. Git URLs and .tgz links bypass the registry, so this machine needs direct access or a proxy; if the module is also on npm, use its package name instead.",
|
|
3085
|
+
"panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
|
|
3086
|
+
"panels.market.add.problemInstalled": "This module is already installed",
|
|
3087
|
+
"panels.market.add.problemNotFound": "No such module found",
|
|
3088
|
+
"panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
|
|
3089
|
+
"panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
|
|
3090
|
+
"panels.market.add.problemNotWorkbenchModule": "This package does not match the workbench you are running, so installing it would not work. Pick another version, or ask the module author.",
|
|
3091
|
+
"panels.market.add.problemNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing. Pick another version, or ask the package author.",
|
|
3092
|
+
"panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
|
|
3093
|
+
"panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
|
|
3094
|
+
"panels.market.add.pluginPreview": "This is an opencli plugin: it goes into the opencli plugin area and works as soon as it is installed — no restart.",
|
|
3095
|
+
"panels.market.add.pluginAlias": "Plugin name: {name}",
|
|
3096
|
+
"panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
|
|
3097
|
+
"panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
|
|
3098
|
+
"panels.market.add.failureNetwork": "The network connection failed",
|
|
3099
|
+
"panels.market.add.failureNotFound": "No such module found",
|
|
3100
|
+
"panels.market.add.failureNoMatchingVersion": "No matching version",
|
|
3101
|
+
"panels.market.add.failureDiskFull": "Out of disk space, install stopped",
|
|
3102
|
+
"panels.market.add.failurePermission": "No write permission, cannot install",
|
|
3103
|
+
"panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
|
|
3104
|
+
"panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
|
|
3105
|
+
"panels.market.add.failureTimeout": "The install timed out",
|
|
3106
|
+
"panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
|
|
3107
|
+
"panels.market.add.failureInstalled": "It is already in this profile: this dsh runs with hot reload, which refuses to install over the same package (remove it first) — and removing it failed too",
|
|
3108
|
+
"panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
|
|
3109
|
+
"panels.market.add.approveTitle": "Your approval is needed for install scripts",
|
|
3110
|
+
"panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
|
|
3111
|
+
"panels.market.add.approveRun": "Allow and continue installing",
|
|
3112
|
+
"panels.market.add.restart": "Installed — restart once to pick it up.",
|
|
3113
|
+
"panels.market.add.tookEffect": "Live.",
|
|
3114
|
+
"panels.market.add.details": "Install details",
|
|
3115
|
+
"panels.market.add.open": "Add module",
|
|
3116
|
+
"panels.market.add.title": "Add module",
|
|
3117
|
+
"panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
|
|
3118
|
+
"panels.market.add.specLabel": "Package",
|
|
3119
|
+
"panels.market.add.specHint": "The same thing you would put after `dsh plugin add`: a package name (optional @version), a git URL, a tarball, or an absolute local path.",
|
|
3120
|
+
"panels.market.add.exampleTitle": "Examples",
|
|
3121
|
+
"panels.market.add.exampleFill": "Fill in an example",
|
|
3122
|
+
"panels.market.add.registryLabel": "Source",
|
|
3123
|
+
"panels.market.add.registryProfile": "This profile's registry",
|
|
3124
|
+
"panels.market.add.registryPnpm": "pnpm's own registry",
|
|
3125
|
+
"panels.market.add.check": "Check",
|
|
3126
|
+
"panels.market.add.checking": "Checking…",
|
|
3127
|
+
"panels.market.add.classifying": "Checking…",
|
|
3128
|
+
"panels.market.add.change": "Edit",
|
|
3129
|
+
"panels.market.add.previewTitle": "About to install",
|
|
3130
|
+
"panels.market.add.fieldName": "Package",
|
|
3131
|
+
"panels.market.add.fieldVersion": "Version",
|
|
3132
|
+
"panels.market.add.fieldDescription": "Description",
|
|
3133
|
+
"panels.market.add.fieldSource": "Source",
|
|
3134
|
+
"panels.market.add.install": "Install",
|
|
3135
|
+
"panels.market.add.installing": "Installing…",
|
|
3136
|
+
"panels.market.add.cancel": "Cancel install",
|
|
3137
|
+
"panels.market.add.close": "Close",
|
|
3138
|
+
"panels.market.add.retry": "Retry",
|
|
3139
|
+
"panels.market.add.changeSource": "Change source",
|
|
3140
|
+
"panels.market.add.approveBuilds": "Allow these scripts and retry",
|
|
3141
|
+
"panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
|
|
3142
|
+
"panels.market.add.doneApplied": "Installed and live.",
|
|
3143
|
+
"panels.market.add.doneRestart": "Installed — restart once to pick it up.",
|
|
3144
|
+
"panels.market.add.restartWhy": "Why this needs a restart: {reason}",
|
|
3145
|
+
"panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
|
|
3146
|
+
"panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
|
|
3147
|
+
"panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
|
|
3148
|
+
"panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
|
|
3149
|
+
"panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
|
|
3150
|
+
"panels.market.add.cancelled": "Cancelled.",
|
|
3151
|
+
"panels.market.add.failed": "Didn't work: {reason}",
|
|
3152
|
+
"panels.market.add.removed": "It has been removed.",
|
|
3153
|
+
"panels.market.add.supplyPending": "Its plugins install after you restart.",
|
|
3154
|
+
"panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
|
|
3155
|
+
"panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
|
|
3156
|
+
"panels.market.add.removedRestart": "Removed — restart once to finish.",
|
|
3157
|
+
"panels.market.add.remove": "Remove it",
|
|
3158
|
+
"panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
|
|
3159
|
+
"panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
|
|
3160
|
+
"panels.market.add.problem.notFound": "No such package on that source.",
|
|
3161
|
+
"panels.market.add.problem.notAPackage": "There is no package at that location.",
|
|
3162
|
+
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
|
|
3163
|
+
"panels.market.add.problem.network": "The source is unreachable.",
|
|
3164
|
+
"panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
|
|
3165
|
+
"panels.market.add.reason.invalidSpec": "the spec is not accepted",
|
|
3166
|
+
"panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
|
|
3167
|
+
"panels.market.add.reason.notBundle": "it is not a dsh plugin package",
|
|
3168
|
+
"panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
|
|
3169
|
+
"panels.market.add.reason.bundleInUse": "something is still using it",
|
|
3170
|
+
"panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
|
|
3171
|
+
"panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
|
|
3172
|
+
"panels.market.add.reason.operationError": "pnpm failed (see the install output)",
|
|
3173
|
+
"panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
|
|
3174
|
+
"panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
|
|
3175
|
+
"panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
|
|
3176
|
+
"panels.market.add.reason.diskFull": "the disk is full",
|
|
3177
|
+
"panels.market.add.reason.permission": "no permission to write",
|
|
3178
|
+
"panels.market.add.reason.integrity": "the download failed its integrity check",
|
|
3179
|
+
"panels.market.add.reason.timeout": "no output for too long, so it was stopped",
|
|
3180
|
+
"panels.market.add.reason.network": "the network is unreachable",
|
|
3181
|
+
"panels.market.add.reason.notFound": "no such package on the source",
|
|
3182
|
+
"panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
|
|
3183
|
+
"blocker.fix.install": "Install for me",
|
|
3184
|
+
"blocker.fix.update": "Upgrade for me",
|
|
3185
|
+
"blocker.fix.running": "Running…",
|
|
3186
|
+
"blocker.fix.failed": "Failed: ",
|
|
3187
|
+
"blocker.retry": "Retry",
|
|
3188
|
+
"blocker.retry.running": "Retrying…",
|
|
3189
|
+
"blocker.copy": "Copy command",
|
|
3190
|
+
"blocker.market.open": "Open the module market",
|
|
3191
|
+
"blocker.login.title": "Sign in to {platform}",
|
|
3192
|
+
"blocker.login.titleGeneric": "Sign-in required",
|
|
3193
|
+
"blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
|
|
3194
|
+
"blocker.login.go": "Go sign in",
|
|
3195
|
+
"blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
|
|
3196
|
+
"blocker.forbidden.title": "No access to {platform}",
|
|
3197
|
+
"blocker.forbidden.titleGeneric": "No access",
|
|
3198
|
+
"blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
|
|
3199
|
+
"blocker.forbidden.open": "Open permissions page",
|
|
3200
|
+
"blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
|
|
3201
|
+
"blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
|
|
3202
|
+
"blocker.unknown.title": "Something went wrong",
|
|
3203
|
+
"panels.reading": "Reading the panel setup…",
|
|
3204
|
+
"panels.cardBroken": "This module will not render: {unit} ({reason})",
|
|
3205
|
+
"panels.cardRetry": "Retry",
|
|
3206
|
+
"panels.empty": "No modules on the panel yet",
|
|
3207
|
+
"panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
|
|
3208
|
+
"env.title": "Preparing the workbench",
|
|
3209
|
+
"env.checking": "Checking the runtime environment…",
|
|
3210
|
+
"env.installing": "Installing the missing dependency…",
|
|
3211
|
+
"env.failed": "One step away",
|
|
3212
|
+
"env.elapsed": "Waiting {seconds}s",
|
|
3213
|
+
"env.stepFailed.install": "install failed",
|
|
3214
|
+
"env.stepFailed.path": "installed but not found",
|
|
3215
|
+
"env.stepFailed.shell": "no shell channel",
|
|
3216
|
+
"env.bridge.ok": "Connected",
|
|
3217
|
+
"env.bridge.short": "Not connected",
|
|
3218
|
+
"env.bridge.why": "Panel data goes through the login state in your browser: with this channel down, modules cannot fetch data. It does not block startup, but fix it first.",
|
|
3219
|
+
"env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
|
|
3220
|
+
"env.bridge.extension": "The browser extension is not connected. Install it once from the Chrome Web Store (then hit Retry here). If it is already installed, run the command below first.",
|
|
3221
|
+
"env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
|
|
3222
|
+
"env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
|
|
3223
|
+
"env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
|
|
3224
|
+
"env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
|
|
3225
|
+
"env.fix.title": "How to fix it",
|
|
3226
|
+
"env.fix.why": "The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.",
|
|
3227
|
+
"env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
|
|
3228
|
+
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
|
|
3229
|
+
"env.fix.step": "Run this in a terminal, then hit Retry:",
|
|
3230
|
+
"env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
|
|
3231
|
+
"env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
|
|
3232
|
+
"env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
|
|
3233
|
+
"env.fix.network": "Network unreachable: check your network or proxy, then retry.",
|
|
3234
|
+
"env.fix.details": "Details (for troubleshooting)",
|
|
3235
|
+
"env.retry": "Retry",
|
|
3236
|
+
"env.copyCommand": "Copy command",
|
|
3237
|
+
"env.copied": "Copied",
|
|
3238
|
+
"env.step.opencli": "Checking the workbench opencli",
|
|
3239
|
+
"env.step.codingPlugin": "Checking the coding plugin",
|
|
3240
|
+
"env.step.bridge": "Checking the browser bridge",
|
|
3241
|
+
"env.step.warm": "Warming up site sessions",
|
|
3242
|
+
"env.warm.done": "{n} site(s) warmed up",
|
|
3243
|
+
"env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
|
|
3244
|
+
"env.unit.failed": "This module cannot start",
|
|
3245
|
+
"env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
|
|
3246
|
+
"env.unit.missingPlugin": "This module is not ready yet",
|
|
3247
|
+
"env.unit.missingCommandsHint": "Updating it should fix this.",
|
|
3248
|
+
"env.unit.unchecked": "Cannot check: no shell channel",
|
|
3249
|
+
"env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
|
|
3250
|
+
"env.unit.missingCommands": "This module is out of date",
|
|
3251
|
+
"env.unit.hint": "Retry after installing; other modules are unaffected.",
|
|
3252
|
+
"rightbar.label": "Data panels",
|
|
3253
|
+
"rightbar.expand": "Expand the data panel",
|
|
3254
|
+
"rightbar.collapse": "Collapse the data panel",
|
|
3255
|
+
"rightbar.column.label": "Right column",
|
|
3256
|
+
"rightbar.column.workbench": "Workbench panel",
|
|
3257
|
+
"rightbar.column.dsh": "dsh panel",
|
|
3258
|
+
"rightbar.refresh": "Refresh",
|
|
3259
|
+
"rightbar.refreshing": "Refreshing…",
|
|
3260
|
+
"rightbar.updatedAt": "updated {time}",
|
|
3261
|
+
"rightbar.noProject": "The current session has no workspace",
|
|
3262
|
+
"rightbar.openPlatform": "Open on the platform",
|
|
3263
|
+
"coding.notARepo.title": "This workspace is not a Coding repository",
|
|
3264
|
+
"error.unknown": "Something went wrong",
|
|
3265
|
+
"board.title": "Workbench panel",
|
|
3266
|
+
"panel.conversation": "Conversation",
|
|
3267
|
+
"panels.label": "Global panels",
|
|
3268
|
+
"configSync.nav": "Config sync",
|
|
3269
|
+
"configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
|
|
3270
|
+
"configSync.source": "Source",
|
|
3271
|
+
"configSync.sourceBroken": "its config is unreadable",
|
|
3272
|
+
"configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
|
|
3273
|
+
"configSync.sourceDead": "unreadable",
|
|
3274
|
+
"configSync.refresh": "Read again",
|
|
3275
|
+
"configSync.loading": "Reading the source config…",
|
|
3276
|
+
"configSync.readHint": "Pick another source, or read again.",
|
|
3277
|
+
"configSync.tag.new": "New",
|
|
3278
|
+
"configSync.tag.differs": "Differs",
|
|
3279
|
+
"configSync.conflictNote": "Applying replaces this workbench copy with the source",
|
|
3280
|
+
"configSync.code.lang": "yaml",
|
|
3281
|
+
"configSync.code.copy": "Copy",
|
|
3282
|
+
"configSync.code.copied": "Copied",
|
|
3283
|
+
"configSync.code.wrap": "Wrap lines",
|
|
3284
|
+
"configSync.code.unwrap": "No wrap",
|
|
3285
|
+
"configSync.code.collapse": "Collapse",
|
|
3286
|
+
"configSync.code.collapseAria": "Collapse this row",
|
|
3287
|
+
"configSync.code.expandAria": "Expand the diff ({count} more lines)",
|
|
3288
|
+
"configSync.code.expand": "Show {count} more lines",
|
|
3289
|
+
"configSync.missing": "{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market",
|
|
3290
|
+
"configSync.apply": "Sync {count} selected",
|
|
3291
|
+
"configSync.applyNone": "Pick some rows first",
|
|
3292
|
+
"configSync.applying": "Writing…",
|
|
3293
|
+
"configSync.applied": "Written to the workbench config · applied",
|
|
3294
|
+
"configSync.appliedIds": "Written this time: {ids}",
|
|
3295
|
+
"configSync.skippedIds": "Left alone (already here): {ids}",
|
|
3296
|
+
"configSync.nothing": "Nothing to sync",
|
|
3297
|
+
"configSync.unreadable": "Cannot read {path}: {reason}",
|
|
3298
|
+
"configSync.noSource": "This machine has no other profile to sync from",
|
|
3299
|
+
"configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
|
|
3300
|
+
"configSync.failed": "The sync did not go through; try again.",
|
|
3301
|
+
"debug.workspace": "this workspace",
|
|
3302
|
+
"debug.status": "Debugging “{title}”",
|
|
3303
|
+
"debug.status.trouble": "Debugging needs your attention ({title})",
|
|
3304
|
+
"debug.stalled": "Debugging paused ({title})",
|
|
3305
|
+
"debug.act.pause": "Pause debugging",
|
|
3306
|
+
"debug.act.resume": "Resume debugging",
|
|
3307
|
+
"debug.act.stop": "Stop debugging",
|
|
3308
|
+
"debug.act.stop.ask": "Confirm stop",
|
|
3309
|
+
"debug.card.here.title": "Debugging “{title}”",
|
|
3310
|
+
"debug.card.here.note": "Do not switch workspaces or touch the panel",
|
|
3311
|
+
"debug.card.away.note": "Switch back to “{title}”",
|
|
3312
|
+
"debug.card.paused.note": "Paused",
|
|
3313
|
+
"debug.card.hidden.note": "Switch back to the Workbench panel",
|
|
3314
|
+
"record.waiting": "Recording handoff · your turn",
|
|
3315
|
+
"record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
|
|
3316
|
+
"record.recording": "Recording",
|
|
3317
|
+
"record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
|
|
3318
|
+
"record.recording.shots": "; to keep a shot of this moment press \"Screenshot\" on the bar ({n} taken)",
|
|
3319
|
+
"record.finished": "Recording finished",
|
|
3320
|
+
"record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
|
|
3321
|
+
"record.act.cancel": "Cancel",
|
|
3322
|
+
"record.act.halt": "Halt",
|
|
3323
|
+
"approval.record.site": "Site",
|
|
3324
|
+
"approval.record.what": "Records",
|
|
3325
|
+
"approval.record.lands": "Lands in",
|
|
3326
|
+
"approval.record.noUrl": "no site given (this call gets refused)",
|
|
3327
|
+
"approval.record.oneAction": "one action",
|
|
3328
|
+
"approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
|
|
3329
|
+
"approval.longTask.what": "Stops",
|
|
3330
|
+
"approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
|
|
3331
|
+
}
|
|
3540
3332
|
};
|
|
3541
3333
|
//#endregion
|
|
3542
3334
|
//#region ../shared/dist/i18n/merge.js
|
|
@@ -3633,18 +3425,6 @@ window.__ModuleLoader__.load({
|
|
|
3633
3425
|
return target.startsWith(base);
|
|
3634
3426
|
}
|
|
3635
3427
|
/**
|
|
3636
|
-
* 把一次探针读数归成椅面归属。
|
|
3637
|
-
* @param probe - 探针读数。
|
|
3638
|
-
* @param workshop - 当前工作区根路径;`null` 表示还不知道当前是哪个工作区。
|
|
3639
|
-
* @returns 外壳不在、或板路径与工作区缺一 → `unknown`;右栏没开或没画出来 → `hidden`;板在本工作区 → `workshop`,否则 `other`。
|
|
3640
|
-
*/
|
|
3641
|
-
function boardFactOf(probe, workshop) {
|
|
3642
|
-
if (!probe.workbench) return "unknown";
|
|
3643
|
-
if (!probe.bar || !probe.open || !probe.drawn) return "hidden";
|
|
3644
|
-
if (probe.board === "" || workshop === null) return "unknown";
|
|
3645
|
-
return insideWorkshop(workshop, probe.board) ? "workshop" : "other";
|
|
3646
|
-
}
|
|
3647
|
-
/**
|
|
3648
3428
|
* 把探针读数归成左栏那句人话的档位。
|
|
3649
3429
|
* @param probe - 探针读数。
|
|
3650
3430
|
* @param workshop - 当前工作区根路径;`null` 一律 `unknown`。
|
|
@@ -3683,492 +3463,7 @@ window.__ModuleLoader__.load({
|
|
|
3683
3463
|
};
|
|
3684
3464
|
}
|
|
3685
3465
|
//#endregion
|
|
3686
|
-
//#region ../shared/dist/lib/diy-debug.js
|
|
3687
|
-
/**
|
|
3688
|
-
* 把工具入参收成人话动作。
|
|
3689
|
-
* @param value - 任意入参值。
|
|
3690
|
-
* @returns `'pause'` / `'resume'` / `'stop'` 原样;别的值(含 `undefined`、多余空白、大小写不同)给 `null`,由调用方拒。
|
|
3691
|
-
*/
|
|
3692
|
-
function parseDebugIntent(value) {
|
|
3693
|
-
return value === "pause" || value === "resume" || value === "stop" ? value : null;
|
|
3694
|
-
}
|
|
3695
|
-
/**
|
|
3696
|
-
* 调试约定的有效期(4 小时,毫秒):超过它没动静的约定算过期、当场让人。
|
|
3697
|
-
*/
|
|
3698
|
-
var DEBUG_STALE_MS = 144e5;
|
|
3699
|
-
function alive$1(state, now) {
|
|
3700
|
-
if (state === null) return null;
|
|
3701
|
-
return now - state.at <= 144e5 ? state : null;
|
|
3702
|
-
}
|
|
3703
|
-
function ownerOf$1(state, sessionId, now) {
|
|
3704
|
-
const held = alive$1(state, now);
|
|
3705
|
-
if (held === null) return "none";
|
|
3706
|
-
return held.sessionId === sessionId ? held : "not-owner";
|
|
3707
|
-
}
|
|
3708
|
-
/**
|
|
3709
|
-
* 造一份新的调试约定存储(进程内存,同一时刻只可能有一份有效约定)。
|
|
3710
|
-
* @returns 存取口;动作成不成都在返回的 `DebugMove` 里,不抛异常。
|
|
3711
|
-
*/
|
|
3712
|
-
function createDebugStore() {
|
|
3713
|
-
let held = null;
|
|
3714
|
-
const live = (now) => alive$1(held, now);
|
|
3715
|
-
return {
|
|
3716
|
-
live,
|
|
3717
|
-
begin(pact) {
|
|
3718
|
-
const current = alive$1(held, pact.now);
|
|
3719
|
-
if (current !== null) return {
|
|
3720
|
-
ok: false,
|
|
3721
|
-
code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
|
|
3722
|
-
};
|
|
3723
|
-
const state = {
|
|
3724
|
-
phase: "debugging",
|
|
3725
|
-
sessionId: pact.sessionId,
|
|
3726
|
-
workspacePath: pact.workspacePath,
|
|
3727
|
-
title: pact.title,
|
|
3728
|
-
board: pact.board,
|
|
3729
|
-
unit: pact.unit,
|
|
3730
|
-
name: pact.name,
|
|
3731
|
-
startedAt: pact.now,
|
|
3732
|
-
at: pact.now
|
|
3733
|
-
};
|
|
3734
|
-
held = state;
|
|
3735
|
-
return {
|
|
3736
|
-
ok: true,
|
|
3737
|
-
state
|
|
3738
|
-
};
|
|
3739
|
-
},
|
|
3740
|
-
pause(sessionId, now) {
|
|
3741
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3742
|
-
if (typeof found === "string") return {
|
|
3743
|
-
ok: false,
|
|
3744
|
-
code: found
|
|
3745
|
-
};
|
|
3746
|
-
if (found.phase === "paused") return {
|
|
3747
|
-
ok: false,
|
|
3748
|
-
code: "already-paused"
|
|
3749
|
-
};
|
|
3750
|
-
const state = {
|
|
3751
|
-
...found,
|
|
3752
|
-
phase: "paused",
|
|
3753
|
-
at: now
|
|
3754
|
-
};
|
|
3755
|
-
held = state;
|
|
3756
|
-
return {
|
|
3757
|
-
ok: true,
|
|
3758
|
-
state
|
|
3759
|
-
};
|
|
3760
|
-
},
|
|
3761
|
-
resume(sessionId, now) {
|
|
3762
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3763
|
-
if (typeof found === "string") return {
|
|
3764
|
-
ok: false,
|
|
3765
|
-
code: found
|
|
3766
|
-
};
|
|
3767
|
-
if (found.phase === "debugging") return {
|
|
3768
|
-
ok: false,
|
|
3769
|
-
code: "already-debugging"
|
|
3770
|
-
};
|
|
3771
|
-
const state = {
|
|
3772
|
-
...found,
|
|
3773
|
-
phase: "debugging",
|
|
3774
|
-
at: now
|
|
3775
|
-
};
|
|
3776
|
-
held = state;
|
|
3777
|
-
return {
|
|
3778
|
-
ok: true,
|
|
3779
|
-
state
|
|
3780
|
-
};
|
|
3781
|
-
},
|
|
3782
|
-
stop(sessionId, now) {
|
|
3783
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3784
|
-
if (typeof found === "string") return {
|
|
3785
|
-
ok: false,
|
|
3786
|
-
code: found
|
|
3787
|
-
};
|
|
3788
|
-
held = null;
|
|
3789
|
-
return {
|
|
3790
|
-
ok: true,
|
|
3791
|
-
state: found
|
|
3792
|
-
};
|
|
3793
|
-
}
|
|
3794
|
-
};
|
|
3795
|
-
}
|
|
3796
|
-
/**
|
|
3797
|
-
* 「谁还占着」的一句话,用于别人来抢时说清现况。
|
|
3798
|
-
* @param state - 当前有效的那份约定。
|
|
3799
|
-
* @returns 形如「会话 x(自 HH:mm:ssZ 起在调试 y)」的中文串。
|
|
3800
|
-
*/
|
|
3801
|
-
function debugOwnerText(state) {
|
|
3802
|
-
return `会话 ${state.sessionId}(自 ${new Date(state.startedAt).toISOString().slice(11, 19)}Z 起在调试 ${state.unit})`;
|
|
3803
|
-
}
|
|
3804
|
-
//#endregion
|
|
3805
|
-
//#region ../shared/dist/lib/diy-record.js
|
|
3806
|
-
/**
|
|
3807
|
-
* 录制约定的有效期(15 分钟,毫秒):超过它没动静的约定算过期、当场让人。
|
|
3808
|
-
*/
|
|
3809
|
-
var RECORD_STALE_MS = 9e5;
|
|
3810
|
-
/**
|
|
3811
|
-
* 把工具入参收成人话动作。
|
|
3812
|
-
* @param raw - 任意入参值。
|
|
3813
|
-
* @returns `'peek'` / `'halt'` / `'stop'` 原样;别的值(含 `undefined`、多余空白)给 `null`,由调用方拒。
|
|
3814
|
-
*/
|
|
3815
|
-
function parseRecordIntent(raw) {
|
|
3816
|
-
return raw === "peek" || raw === "halt" || raw === "stop" ? raw : null;
|
|
3817
|
-
}
|
|
3818
|
-
function alive(state, now) {
|
|
3819
|
-
if (state === null) return null;
|
|
3820
|
-
return now - state.at <= 9e5 ? state : null;
|
|
3821
|
-
}
|
|
3822
|
-
function ownerOf(state, sessionId, now) {
|
|
3823
|
-
const held = alive(state, now);
|
|
3824
|
-
if (held === null) return "none";
|
|
3825
|
-
return held.sessionId === sessionId ? held : "not-owner";
|
|
3826
|
-
}
|
|
3827
|
-
/**
|
|
3828
|
-
* 造一份新的录制约定存储(进程内存,同一时刻只可能有一份有效约定)。
|
|
3829
|
-
* @returns 存取口;动作成不成都在返回的 `RecordMove` 里,不抛异常。
|
|
3830
|
-
*/
|
|
3831
|
-
function createRecordStore() {
|
|
3832
|
-
let held = null;
|
|
3833
|
-
const live = (now) => alive(held, now);
|
|
3834
|
-
return {
|
|
3835
|
-
live,
|
|
3836
|
-
begin(pact) {
|
|
3837
|
-
const current = alive(held, pact.now);
|
|
3838
|
-
if (current !== null) return {
|
|
3839
|
-
ok: false,
|
|
3840
|
-
code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
|
|
3841
|
-
};
|
|
3842
|
-
const state = {
|
|
3843
|
-
phase: "armed",
|
|
3844
|
-
sessionId: pact.sessionId,
|
|
3845
|
-
workspace: pact.workspace,
|
|
3846
|
-
unit: pact.unit,
|
|
3847
|
-
name: pact.name,
|
|
3848
|
-
url: pact.url,
|
|
3849
|
-
title: pact.title,
|
|
3850
|
-
action: pact.action,
|
|
3851
|
-
expect: pact.expect,
|
|
3852
|
-
captureFile: pact.captureFile,
|
|
3853
|
-
startedAt: pact.now,
|
|
3854
|
-
t0: null,
|
|
3855
|
-
t1: null,
|
|
3856
|
-
at: pact.now
|
|
3857
|
-
};
|
|
3858
|
-
held = state;
|
|
3859
|
-
return {
|
|
3860
|
-
ok: true,
|
|
3861
|
-
state
|
|
3862
|
-
};
|
|
3863
|
-
},
|
|
3864
|
-
started(sessionId, at, now) {
|
|
3865
|
-
const found = ownerOf(held, sessionId, now);
|
|
3866
|
-
if (typeof found === "string") return {
|
|
3867
|
-
ok: false,
|
|
3868
|
-
code: found
|
|
3869
|
-
};
|
|
3870
|
-
if (found.phase === "recording") return {
|
|
3871
|
-
ok: false,
|
|
3872
|
-
code: "already-recording"
|
|
3873
|
-
};
|
|
3874
|
-
if (found.phase !== "armed") return {
|
|
3875
|
-
ok: false,
|
|
3876
|
-
code: "not-armed"
|
|
3877
|
-
};
|
|
3878
|
-
const state = {
|
|
3879
|
-
...found,
|
|
3880
|
-
phase: "recording",
|
|
3881
|
-
t0: at,
|
|
3882
|
-
at: now
|
|
3883
|
-
};
|
|
3884
|
-
held = state;
|
|
3885
|
-
return {
|
|
3886
|
-
ok: true,
|
|
3887
|
-
state
|
|
3888
|
-
};
|
|
3889
|
-
},
|
|
3890
|
-
finished(sessionId, at, now) {
|
|
3891
|
-
const found = ownerOf(held, sessionId, now);
|
|
3892
|
-
if (typeof found === "string") return {
|
|
3893
|
-
ok: false,
|
|
3894
|
-
code: found
|
|
3895
|
-
};
|
|
3896
|
-
if (found.phase !== "recording") return {
|
|
3897
|
-
ok: false,
|
|
3898
|
-
code: "not-recording"
|
|
3899
|
-
};
|
|
3900
|
-
const state = {
|
|
3901
|
-
...found,
|
|
3902
|
-
phase: "finished",
|
|
3903
|
-
t1: at,
|
|
3904
|
-
at: now
|
|
3905
|
-
};
|
|
3906
|
-
held = state;
|
|
3907
|
-
return {
|
|
3908
|
-
ok: true,
|
|
3909
|
-
state
|
|
3910
|
-
};
|
|
3911
|
-
},
|
|
3912
|
-
stop(sessionId, now) {
|
|
3913
|
-
const found = ownerOf(held, sessionId, now);
|
|
3914
|
-
if (typeof found === "string") return {
|
|
3915
|
-
ok: false,
|
|
3916
|
-
code: found
|
|
3917
|
-
};
|
|
3918
|
-
held = null;
|
|
3919
|
-
return {
|
|
3920
|
-
ok: true,
|
|
3921
|
-
state: found
|
|
3922
|
-
};
|
|
3923
|
-
}
|
|
3924
|
-
};
|
|
3925
|
-
}
|
|
3926
|
-
/**
|
|
3927
|
-
* 「谁还占着、在录哪个动作」的一句话,用于别人来抢时说清现况。
|
|
3928
|
-
* @param state - 当前有效的那份约定。
|
|
3929
|
-
* @returns 形如「会话 x(自 HH:mm:ssZ 起在录 y 的「动作」)」的中文串。
|
|
3930
|
-
*/
|
|
3931
|
-
function recordOwnerText(state) {
|
|
3932
|
-
const at = new Date(state.startedAt).toISOString().slice(11, 19);
|
|
3933
|
-
return `会话 ${state.sessionId}(自 ${at}Z 起在录 ${state.unit} 的「${state.action}」)`;
|
|
3934
|
-
}
|
|
3935
|
-
/**
|
|
3936
|
-
* 同一原因的连续崩溃算进同一次计数的窗口(10 分钟,毫秒)。
|
|
3937
|
-
*/
|
|
3938
|
-
var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
|
|
3939
|
-
/**
|
|
3940
|
-
* 上报文本字段的截断长度(2000 字符;workspace / reason / message 共用)。
|
|
3941
|
-
*/
|
|
3942
|
-
var PANEL_STATE_MAX_TEXT = 2e3;
|
|
3943
|
-
var PHASES = [
|
|
3944
|
-
"idle",
|
|
3945
|
-
"loading",
|
|
3946
|
-
"ready",
|
|
3947
|
-
"error"
|
|
3948
|
-
];
|
|
3949
|
-
function asRecord(value) {
|
|
3950
|
-
return typeof value === "object" && value !== null ? value : void 0;
|
|
3951
|
-
}
|
|
3952
|
-
function textOf$1(value, max) {
|
|
3953
|
-
if (typeof value !== "string") return "";
|
|
3954
|
-
const trimmed = value.trim();
|
|
3955
|
-
return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
|
|
3956
|
-
}
|
|
3957
|
-
function atOf(value) {
|
|
3958
|
-
if (typeof value !== "number" || !Number.isFinite(value)) return null;
|
|
3959
|
-
if (value < 0) return null;
|
|
3960
|
-
return Math.trunc(value);
|
|
3961
|
-
}
|
|
3962
|
-
function errorOf(raw) {
|
|
3963
|
-
const record = asRecord(raw);
|
|
3964
|
-
if (record === void 0) return void 0;
|
|
3965
|
-
const code = textOf$1(record["code"], 120);
|
|
3966
|
-
const message = textOf$1(record["message"], PANEL_STATE_MAX_TEXT);
|
|
3967
|
-
if (code === "" && message === "") return void 0;
|
|
3968
|
-
return {
|
|
3969
|
-
code: code === "" ? "unknown" : code,
|
|
3970
|
-
message
|
|
3971
|
-
};
|
|
3972
|
-
}
|
|
3973
|
-
/**
|
|
3974
|
-
* 收一批卡片读数上报。
|
|
3975
|
-
* @param payload - `POST` 的请求体。
|
|
3976
|
-
* @returns 至少收到一条能认的卡片才 `ok: true`;请求体不是对象、`workspace` 为空、`cards` 不是数组,
|
|
3977
|
-
* 或一条都认不出(`unit` / `route` / `phase` / `at` 缺一)时 `ok: false` + 中文原因;认不出的单条静默跳过。
|
|
3978
|
-
*/
|
|
3979
|
-
function parseCardsReport(payload) {
|
|
3980
|
-
const record = asRecord(payload);
|
|
3981
|
-
if (record === void 0) return {
|
|
3982
|
-
ok: false,
|
|
3983
|
-
message: "请求体要是一个对象"
|
|
3984
|
-
};
|
|
3985
|
-
const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
|
|
3986
|
-
if (workspace === "") return {
|
|
3987
|
-
ok: false,
|
|
3988
|
-
message: "workspace 不能是空的 —— 面板按工作区存"
|
|
3989
|
-
};
|
|
3990
|
-
const raw = record["cards"];
|
|
3991
|
-
if (!Array.isArray(raw)) return {
|
|
3992
|
-
ok: false,
|
|
3993
|
-
message: "cards 要是一个数组"
|
|
3994
|
-
};
|
|
3995
|
-
const cards = [];
|
|
3996
|
-
for (const item of raw.slice(0, 32)) {
|
|
3997
|
-
const card = asRecord(item);
|
|
3998
|
-
if (card === void 0) continue;
|
|
3999
|
-
const unit = textOf$1(card["unit"], 200);
|
|
4000
|
-
const route = textOf$1(card["route"], 400);
|
|
4001
|
-
const phase = textOf$1(card["phase"], 20);
|
|
4002
|
-
const at = atOf(card["at"]);
|
|
4003
|
-
if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
|
|
4004
|
-
const error = errorOf(card["error"]);
|
|
4005
|
-
cards.push({
|
|
4006
|
-
unit,
|
|
4007
|
-
route,
|
|
4008
|
-
phase,
|
|
4009
|
-
at,
|
|
4010
|
-
...error === void 0 ? {} : { error }
|
|
4011
|
-
});
|
|
4012
|
-
}
|
|
4013
|
-
if (cards.length === 0) return {
|
|
4014
|
-
ok: false,
|
|
4015
|
-
message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
|
|
4016
|
-
};
|
|
4017
|
-
return {
|
|
4018
|
-
ok: true,
|
|
4019
|
-
value: {
|
|
4020
|
-
workspace,
|
|
4021
|
-
cards
|
|
4022
|
-
}
|
|
4023
|
-
};
|
|
4024
|
-
}
|
|
4025
|
-
/**
|
|
4026
|
-
* 收一次卡片崩溃上报。
|
|
4027
|
-
* @param payload - `POST` 的请求体。
|
|
4028
|
-
* @returns `workspace` / `unit` / `reason` 都不能空,缺一给 `ok: false` + 中文原因;`at` 缺省或不合法时取当前时间。
|
|
4029
|
-
*/
|
|
4030
|
-
function parseCrashReport(payload) {
|
|
4031
|
-
const record = asRecord(payload);
|
|
4032
|
-
if (record === void 0) return {
|
|
4033
|
-
ok: false,
|
|
4034
|
-
message: "请求体要是一个对象"
|
|
4035
|
-
};
|
|
4036
|
-
const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
|
|
4037
|
-
const unit = textOf$1(record["unit"], 200);
|
|
4038
|
-
const reason = textOf$1(record["reason"], PANEL_STATE_MAX_TEXT);
|
|
4039
|
-
if (workspace === "") return {
|
|
4040
|
-
ok: false,
|
|
4041
|
-
message: "workspace 不能是空的"
|
|
4042
|
-
};
|
|
4043
|
-
if (unit === "") return {
|
|
4044
|
-
ok: false,
|
|
4045
|
-
message: "unit 不能是空的"
|
|
4046
|
-
};
|
|
4047
|
-
if (reason === "") return {
|
|
4048
|
-
ok: false,
|
|
4049
|
-
message: "reason 不能是空的(没有原因的崩溃没法查)"
|
|
4050
|
-
};
|
|
4051
|
-
return {
|
|
4052
|
-
ok: true,
|
|
4053
|
-
value: {
|
|
4054
|
-
workspace,
|
|
4055
|
-
unit,
|
|
4056
|
-
reason,
|
|
4057
|
-
at: atOf(record["at"]) ?? Date.now()
|
|
4058
|
-
}
|
|
4059
|
-
};
|
|
4060
|
-
}
|
|
4061
|
-
/**
|
|
4062
|
-
* 造一份面板运行态的留存(进程内存、按工作区分桶,带上面那几条上限的 LRU)。
|
|
4063
|
-
* @returns 留存口:`cards` / `crash` 收上报,`snapshot(workspace)` 取全量;没存过的工作区(含 `null`)给一份空的。
|
|
4064
|
-
*/
|
|
4065
|
-
function createPanelStateStore() {
|
|
4066
|
-
const workspaces = /* @__PURE__ */ new Map();
|
|
4067
|
-
function trim(entry, max) {
|
|
4068
|
-
while (entry.size > max) {
|
|
4069
|
-
const oldest = entry.keys().next();
|
|
4070
|
-
if (oldest.done === true) return;
|
|
4071
|
-
entry.delete(oldest.value);
|
|
4072
|
-
}
|
|
4073
|
-
}
|
|
4074
|
-
function workspaceEntryOf(workspace) {
|
|
4075
|
-
const existing = workspaces.get(workspace);
|
|
4076
|
-
if (existing !== void 0) return existing;
|
|
4077
|
-
const created = {
|
|
4078
|
-
at: 0,
|
|
4079
|
-
units: /* @__PURE__ */ new Map()
|
|
4080
|
-
};
|
|
4081
|
-
workspaces.set(workspace, created);
|
|
4082
|
-
trim(workspaces, 64);
|
|
4083
|
-
return created;
|
|
4084
|
-
}
|
|
4085
|
-
function unitEntryOf(entry, unit) {
|
|
4086
|
-
const existing = entry.units.get(unit);
|
|
4087
|
-
if (existing !== void 0) return existing;
|
|
4088
|
-
const created = {
|
|
4089
|
-
at: 0,
|
|
4090
|
-
cards: /* @__PURE__ */ new Map()
|
|
4091
|
-
};
|
|
4092
|
-
entry.units.set(unit, created);
|
|
4093
|
-
return created;
|
|
4094
|
-
}
|
|
4095
|
-
return {
|
|
4096
|
-
cards(report) {
|
|
4097
|
-
const entry = workspaceEntryOf(report.workspace);
|
|
4098
|
-
for (const card of report.cards) {
|
|
4099
|
-
const unit = unitEntryOf(entry, card.unit);
|
|
4100
|
-
unit.cards.delete(card.route);
|
|
4101
|
-
unit.cards.set(card.route, card);
|
|
4102
|
-
trim(unit.cards, 12);
|
|
4103
|
-
if (card.at > unit.at) unit.at = card.at;
|
|
4104
|
-
if (card.at > entry.at) entry.at = card.at;
|
|
4105
|
-
}
|
|
4106
|
-
},
|
|
4107
|
-
crash(report) {
|
|
4108
|
-
const entry = workspaceEntryOf(report.workspace);
|
|
4109
|
-
const unit = unitEntryOf(entry, report.unit);
|
|
4110
|
-
const previous = unit.crash;
|
|
4111
|
-
const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
|
|
4112
|
-
unit.crash = {
|
|
4113
|
-
unit: report.unit,
|
|
4114
|
-
reason: report.reason,
|
|
4115
|
-
at: report.at,
|
|
4116
|
-
count: counted ? previous.count + 1 : 1
|
|
4117
|
-
};
|
|
4118
|
-
if (report.at > unit.at) unit.at = report.at;
|
|
4119
|
-
if (report.at > entry.at) entry.at = report.at;
|
|
4120
|
-
},
|
|
4121
|
-
snapshot(workspace) {
|
|
4122
|
-
if (workspace === null) return {
|
|
4123
|
-
workspace: null,
|
|
4124
|
-
at: 0,
|
|
4125
|
-
units: []
|
|
4126
|
-
};
|
|
4127
|
-
const entry = workspaces.get(workspace);
|
|
4128
|
-
if (entry === void 0) return {
|
|
4129
|
-
workspace,
|
|
4130
|
-
at: 0,
|
|
4131
|
-
units: []
|
|
4132
|
-
};
|
|
4133
|
-
const units = [...entry.units.entries()].map(([unit, one]) => {
|
|
4134
|
-
const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
|
|
4135
|
-
const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
|
|
4136
|
-
return {
|
|
4137
|
-
unit,
|
|
4138
|
-
at: one.at,
|
|
4139
|
-
okAt,
|
|
4140
|
-
cards,
|
|
4141
|
-
...one.crash === void 0 ? {} : { crash: one.crash }
|
|
4142
|
-
};
|
|
4143
|
-
});
|
|
4144
|
-
units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
|
|
4145
|
-
return {
|
|
4146
|
-
workspace,
|
|
4147
|
-
at: entry.at,
|
|
4148
|
-
units
|
|
4149
|
-
};
|
|
4150
|
-
}
|
|
4151
|
-
};
|
|
4152
|
-
}
|
|
4153
|
-
//#endregion
|
|
4154
3466
|
//#region ../shared/dist/lib/text.js
|
|
4155
|
-
/**
|
|
4156
|
-
* 把一个值裹成 shell 里的单引号字面量(值里的单引号一并转义),保证元字符按字面量传递。
|
|
4157
|
-
* @param value - 任意值;不是字符串的先 `String()`。
|
|
4158
|
-
* @returns 可安全拼进 `/bin/sh -c` 的一段文本 —— 含空格 / `$()` / `;` / 通配符的值都不会被当成语法。
|
|
4159
|
-
*/
|
|
4160
|
-
function quoteShellArg(value) {
|
|
4161
|
-
return `'${String(value).replace(/'/g, `'\\''`)}'`;
|
|
4162
|
-
}
|
|
4163
|
-
/**
|
|
4164
|
-
* 取一段文本的末尾若干行(如命令输出),顺带去掉首尾空白。
|
|
4165
|
-
* @param text - 原文;`null` / `undefined` 当空串。
|
|
4166
|
-
* @param lines - 最多留几行,默认 6;0 给全篇、负数从开头砍掉那么多行(都是 `slice` 语义),调用方传正数。
|
|
4167
|
-
* @returns 末尾若干行、去首尾空行后的文本;原文行数不够就全给,空输入给空串。
|
|
4168
|
-
*/
|
|
4169
|
-
function tailLines(text, lines = 6) {
|
|
4170
|
-
return String(text ?? "").trim().split("\n").slice(-lines).join("\n");
|
|
4171
|
-
}
|
|
4172
3467
|
function candidateStarts(raw) {
|
|
4173
3468
|
const starts = [];
|
|
4174
3469
|
for (let index = 0; index < raw.length; index += 1) {
|
|
@@ -4222,202 +3517,6 @@ window.__ModuleLoader__.load({
|
|
|
4222
3517
|
return `${flat.slice(0, limit).trimEnd()}…`;
|
|
4223
3518
|
}
|
|
4224
3519
|
//#endregion
|
|
4225
|
-
//#region ../shared/dist/index.js
|
|
4226
|
-
var dist_exports = /* @__PURE__ */ __exportAll({
|
|
4227
|
-
ACTIONS_PREFIX: () => ACTIONS_PREFIX,
|
|
4228
|
-
API_PREFIX: () => API_PREFIX,
|
|
4229
|
-
ActivityAction: () => ActivityAction,
|
|
4230
|
-
ActivityBlock: () => ActivityBlock,
|
|
4231
|
-
ActivityLine: () => ActivityLine,
|
|
4232
|
-
ApprovalDetail: () => ApprovalDetail,
|
|
4233
|
-
ApprovalPlan: () => ApprovalPlan,
|
|
4234
|
-
CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
|
|
4235
|
-
CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
|
|
4236
|
-
Card: () => Card,
|
|
4237
|
-
CardAnchor: () => CardAnchor,
|
|
4238
|
-
CardBoundary: () => CardBoundary,
|
|
4239
|
-
CardHead: () => CardHead,
|
|
4240
|
-
CenteredState: () => CenteredState,
|
|
4241
|
-
ChoiceGroup: () => ChoiceGroup,
|
|
4242
|
-
Component: () => Component,
|
|
4243
|
-
DEBUG_STALE_MS: () => DEBUG_STALE_MS,
|
|
4244
|
-
DECLARATION_KEYS: () => DECLARATION_KEYS,
|
|
4245
|
-
DECLARATION_REQUIRED_KEYS: () => DECLARATION_REQUIRED_KEYS,
|
|
4246
|
-
DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
|
|
4247
|
-
DIY_DEBUG_ACT_PATH: () => DIY_DEBUG_ACT_PATH,
|
|
4248
|
-
DIY_DEBUG_PATH: () => DIY_DEBUG_PATH,
|
|
4249
|
-
DIY_DEBUG_SERVICE: () => DIY_DEBUG_SERVICE,
|
|
4250
|
-
DIY_RECORD_ACT_PATH: () => DIY_RECORD_ACT_PATH,
|
|
4251
|
-
DIY_RECORD_PATH: () => DIY_RECORD_PATH,
|
|
4252
|
-
DIY_RECORD_SERVICE: () => DIY_RECORD_SERVICE,
|
|
4253
|
-
EVENTS_PATH: () => EVENTS_PATH,
|
|
4254
|
-
EmptyState: () => EmptyState,
|
|
4255
|
-
FACT_SCOPE_SUFFIX: () => "*",
|
|
4256
|
-
Field: () => Field,
|
|
4257
|
-
Form: () => Form,
|
|
4258
|
-
FormActions: () => FormActions,
|
|
4259
|
-
FormRow: () => FormRow,
|
|
4260
|
-
FormRows: () => FormRows,
|
|
4261
|
-
Fragment: () => Fragment,
|
|
4262
|
-
GIT_TIMEOUT_MS: () => GIT_TIMEOUT_MS,
|
|
4263
|
-
HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
|
|
4264
|
-
INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
|
|
4265
|
-
IconBrandMark: () => IconBrandMark,
|
|
4266
|
-
IconConversation: () => IconConversation,
|
|
4267
|
-
IconModuleMark: () => IconModuleMark,
|
|
4268
|
-
IconModules: () => IconModules,
|
|
4269
|
-
IconNpm: () => IconNpm,
|
|
4270
|
-
IconOpencli: () => IconOpencli,
|
|
4271
|
-
IconPanelScreen: () => IconPanelScreen,
|
|
4272
|
-
LOCALES: () => LOCALES,
|
|
4273
|
-
LOCALE_NS: () => LOCALE_NS,
|
|
4274
|
-
LONG_TASK_IDLE_MS: () => LONG_TASK_IDLE_MS,
|
|
4275
|
-
LONG_TASK_POLL_MS: () => LONG_TASK_POLL_MS,
|
|
4276
|
-
LONG_TASK_STOP_ARM_MS: () => LONG_TASK_STOP_ARM_MS,
|
|
4277
|
-
Link: () => Link,
|
|
4278
|
-
LongTaskRow: () => LongTaskRow,
|
|
4279
|
-
MIN_BUSY_MS: () => 500,
|
|
4280
|
-
Note: () => Note,
|
|
4281
|
-
OPENCLI_MAX_CONCURRENT: () => 4,
|
|
4282
|
-
OPENCLI_PIN: () => OPENCLI_PIN,
|
|
4283
|
-
OPENCLI_TIMEOUT_MS: () => OPENCLI_TIMEOUT_MS,
|
|
4284
|
-
PANELS_SERVICE: () => PANELS_SERVICE,
|
|
4285
|
-
PANEL_LIST_LIMIT: () => 50,
|
|
4286
|
-
PANEL_POLL_MS: () => PANEL_POLL_MS,
|
|
4287
|
-
PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
|
|
4288
|
-
PANEL_STATE_MAX_CARDS: () => 12,
|
|
4289
|
-
PANEL_STATE_MAX_REPORTS: () => 32,
|
|
4290
|
-
PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
|
|
4291
|
-
PANEL_STATE_MAX_UNITS: () => 64,
|
|
4292
|
-
PANEL_STATE_PATH: () => PANEL_STATE_PATH,
|
|
4293
|
-
PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
|
|
4294
|
-
PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
|
|
4295
|
-
PLUGIN_ID: () => PLUGIN_ID,
|
|
4296
|
-
PREFS_PREFIX: () => PREFS_PREFIX,
|
|
4297
|
-
PROBE_TTL_MS: () => PROBE_TTL_MS,
|
|
4298
|
-
PROVISION_PREFIX: () => PROVISION_PREFIX,
|
|
4299
|
-
RECORD_STALE_MS: () => RECORD_STALE_MS,
|
|
4300
|
-
RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
|
|
4301
|
-
RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
|
|
4302
|
-
Row: () => Row,
|
|
4303
|
-
Rows: () => Rows,
|
|
4304
|
-
SESSION_PROJECTIONS_SERVICE: () => SESSION_PROJECTIONS_SERVICE,
|
|
4305
|
-
STORAGE_KEY_PROJECT: () => STORAGE_KEY_PROJECT,
|
|
4306
|
-
STORAGE_KEY_RIGHTBAR: () => STORAGE_KEY_RIGHTBAR,
|
|
4307
|
-
STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
|
|
4308
|
-
STORAGE_KEY_RIGHTBAR_WIDTH: () => STORAGE_KEY_RIGHTBAR_WIDTH,
|
|
4309
|
-
SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
|
|
4310
|
-
SaveBar: () => SaveBar,
|
|
4311
|
-
SelectField: () => SelectField,
|
|
4312
|
-
SettingsSection: () => SettingsSection,
|
|
4313
|
-
SkeletonRows: () => SkeletonRows,
|
|
4314
|
-
Spinner: () => Spinner,
|
|
4315
|
-
Stack: () => Stack,
|
|
4316
|
-
StateBlock: () => StateBlock,
|
|
4317
|
-
TextField: () => TextField,
|
|
4318
|
-
UNITS_SERVICE: () => UNITS_SERVICE,
|
|
4319
|
-
VERSION_CHECK_TIMEOUT_MS: () => VERSION_CHECK_TIMEOUT_MS,
|
|
4320
|
-
VERSION_CHECK_TTL_MS: () => VERSION_CHECK_TTL_MS,
|
|
4321
|
-
WARM_TIMEOUT_MS: () => WARM_TIMEOUT_MS,
|
|
4322
|
-
WORKBENCH_API_VERSION: () => 1,
|
|
4323
|
-
apiGet: () => apiGet,
|
|
4324
|
-
apiPost: () => apiPost,
|
|
4325
|
-
blockerActionLabel: () => blockerActionLabel,
|
|
4326
|
-
blockerOfCapability: () => blockerOfCapability,
|
|
4327
|
-
blockerOfError: () => blockerOfError,
|
|
4328
|
-
blockerPending: () => blockerPending,
|
|
4329
|
-
boardFactOf: () => boardFactOf,
|
|
4330
|
-
boardSituation: () => boardSituation,
|
|
4331
|
-
buildMarker: () => buildMarker,
|
|
4332
|
-
cardIdOf: () => cardIdOf,
|
|
4333
|
-
createContext: () => createContext,
|
|
4334
|
-
createDebugStore: () => createDebugStore,
|
|
4335
|
-
createFactChannel: () => createFactChannel,
|
|
4336
|
-
createPanelStateStore: () => createPanelStateStore,
|
|
4337
|
-
createRecordStore: () => createRecordStore,
|
|
4338
|
-
cx: () => cx,
|
|
4339
|
-
debugOwnerText: () => debugOwnerText,
|
|
4340
|
-
declarationProblemsOf: () => declarationProblemsOf,
|
|
4341
|
-
decodeRef: () => decodeRef,
|
|
4342
|
-
defaultSelectFilter: () => defaultSelectFilter,
|
|
4343
|
-
dictionaries: () => dictionaries,
|
|
4344
|
-
duplicateKeysOf: () => duplicateKeysOf,
|
|
4345
|
-
en: () => en,
|
|
4346
|
-
encodeRef: () => encodeRef,
|
|
4347
|
-
errorReasonOf: () => errorReasonOf,
|
|
4348
|
-
excerpt: () => excerpt,
|
|
4349
|
-
factOfRoute: () => factOfRoute,
|
|
4350
|
-
filterSelectOptions: () => filterSelectOptions,
|
|
4351
|
-
firstProblemOf: () => firstProblemOf,
|
|
4352
|
-
formActionsOf: () => formActionsOf,
|
|
4353
|
-
formFirstProblemOf: () => formFirstProblemOf,
|
|
4354
|
-
formProblemsOf: () => formProblemsOf,
|
|
4355
|
-
formRowsOf: () => formRowsOf,
|
|
4356
|
-
formSubmitOf: () => formSubmitOf,
|
|
4357
|
-
formValuesOf: () => formValuesOf,
|
|
4358
|
-
gateOf: () => gateOf,
|
|
4359
|
-
h: () => h,
|
|
4360
|
-
hasEnvSupply: () => hasEnvSupply,
|
|
4361
|
-
holdBusy: () => holdBusy,
|
|
4362
|
-
insideWorkshop: () => insideWorkshop,
|
|
4363
|
-
isFactScope: () => isFactScope,
|
|
4364
|
-
longTaskDot: () => longTaskDot,
|
|
4365
|
-
longTaskPollMs: () => longTaskPollMs,
|
|
4366
|
-
longTaskRunsOf: () => longTaskRunsOf,
|
|
4367
|
-
longTaskStopPress: () => longTaskStopPress,
|
|
4368
|
-
longTaskStopStage: () => longTaskStopStage,
|
|
4369
|
-
markerBody: () => markerBody,
|
|
4370
|
-
mergeMessages: () => mergeMessages,
|
|
4371
|
-
mergeMessagesSkipping: () => mergeMessagesSkipping,
|
|
4372
|
-
parseCardsReport: () => parseCardsReport,
|
|
4373
|
-
parseCrashReport: () => parseCrashReport,
|
|
4374
|
-
parseDebugIntent: () => parseDebugIntent,
|
|
4375
|
-
parseFactFrame: () => parseFactFrame,
|
|
4376
|
-
parseJsonLoose: () => parseJsonLoose,
|
|
4377
|
-
parseLocalTimestamp: () => parseLocalTimestamp,
|
|
4378
|
-
parseMarkers: () => parseMarkers,
|
|
4379
|
-
parseRecordIntent: () => parseRecordIntent,
|
|
4380
|
-
probeKeyOf: () => probeKeyOf,
|
|
4381
|
-
quoteShellArg: () => quoteShellArg,
|
|
4382
|
-
readDeclaration: () => readDeclaration,
|
|
4383
|
-
readFlag: () => readFlag,
|
|
4384
|
-
readText: () => readText,
|
|
4385
|
-
recordOwnerText: () => recordOwnerText,
|
|
4386
|
-
relativeTime: () => relativeTime,
|
|
4387
|
-
relativeTimeAgo: () => relativeTimeAgo,
|
|
4388
|
-
relativeTimeBucket: () => relativeTimeBucket,
|
|
4389
|
-
relativeTimeCompact: () => relativeTimeCompact,
|
|
4390
|
-
reportDuplicateKeys: () => reportDuplicateKeys,
|
|
4391
|
-
revealFirstProblem: () => revealFirstProblem,
|
|
4392
|
-
runsRouteOf: () => runsRouteOf,
|
|
4393
|
-
scopePrefixOf: () => scopePrefixOf,
|
|
4394
|
-
searchTextOf: () => searchTextOf,
|
|
4395
|
-
selectCursorValue: () => selectCursorValue,
|
|
4396
|
-
selectEntries: () => selectEntries,
|
|
4397
|
-
selectLoadingNode: () => selectLoadingNode,
|
|
4398
|
-
selectTriggerNode: () => selectTriggerNode,
|
|
4399
|
-
shortenPath: () => shortenPath,
|
|
4400
|
-
splitBlocker: () => splitBlocker,
|
|
4401
|
-
stepSelectCursor: () => stepSelectCursor,
|
|
4402
|
-
stopRouteOf: () => stopRouteOf,
|
|
4403
|
-
tailLines: () => tailLines,
|
|
4404
|
-
unitFactScope: () => unitFactScope,
|
|
4405
|
-
useCallback: () => useCallback,
|
|
4406
|
-
useContext: () => useContext,
|
|
4407
|
-
useEffect: () => useEffect,
|
|
4408
|
-
useLayoutEffect: () => useLayoutEffect,
|
|
4409
|
-
useMemo: () => useMemo,
|
|
4410
|
-
useRef: () => useRef,
|
|
4411
|
-
useState: () => useState,
|
|
4412
|
-
useSyncExternalStore: () => useSyncExternalStore,
|
|
4413
|
-
visibleFieldsOf: () => visibleFieldsOf,
|
|
4414
|
-
writeFlag: () => writeFlag,
|
|
4415
|
-
writeOutcomeOf: () => writeOutcomeOf,
|
|
4416
|
-
writeRoute: () => writeRoute,
|
|
4417
|
-
writeText: () => writeText,
|
|
4418
|
-
zh: () => zh
|
|
4419
|
-
});
|
|
4420
|
-
//#endregion
|
|
4421
3520
|
//#region src/shared/components/Tip.tsx
|
|
4422
3521
|
/**
|
|
4423
3522
|
* dsh `Tooltip` 的外壳默认值版:说明统一按右栏习惯(`bottom` / `end` / `gap 6` / 挂 body)来,其余 prop 原样转给 `Tooltip`。
|
|
@@ -4590,7 +3689,7 @@ window.__ModuleLoader__.load({
|
|
|
4590
3689
|
var CAPABILITY_FACT = "capability";
|
|
4591
3690
|
var shared = null;
|
|
4592
3691
|
var current$1 = null;
|
|
4593
|
-
var listeners$
|
|
3692
|
+
var listeners$5 = /* @__PURE__ */ new Set();
|
|
4594
3693
|
/**
|
|
4595
3694
|
* 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
|
|
4596
3695
|
*/
|
|
@@ -4601,9 +3700,9 @@ window.__ModuleLoader__.load({
|
|
|
4601
3700
|
* 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
|
|
4602
3701
|
*/
|
|
4603
3702
|
function subscribeCapabilities(listener) {
|
|
4604
|
-
listeners$
|
|
3703
|
+
listeners$5.add(listener);
|
|
4605
3704
|
return () => {
|
|
4606
|
-
listeners$
|
|
3705
|
+
listeners$5.delete(listener);
|
|
4607
3706
|
};
|
|
4608
3707
|
}
|
|
4609
3708
|
/**
|
|
@@ -4617,7 +3716,7 @@ window.__ModuleLoader__.load({
|
|
|
4617
3716
|
});
|
|
4618
3717
|
if (next === current$1) return;
|
|
4619
3718
|
current$1 = next;
|
|
4620
|
-
for (const listener of [...listeners$
|
|
3719
|
+
for (const listener of [...listeners$5]) listener();
|
|
4621
3720
|
}
|
|
4622
3721
|
/**
|
|
4623
3722
|
* 一次强探开始:点亮“正在探”;已经在探就跳过。
|
|
@@ -4789,7 +3888,7 @@ window.__ModuleLoader__.load({
|
|
|
4789
3888
|
//#endregion
|
|
4790
3889
|
//#region src/app/layouts/panel-hint.ts
|
|
4791
3890
|
var hints = /* @__PURE__ */ new Map();
|
|
4792
|
-
var listeners$
|
|
3891
|
+
var listeners$4 = /* @__PURE__ */ new Set();
|
|
4793
3892
|
function sameHint(left, right) {
|
|
4794
3893
|
if (left === null || right === null) return left === right;
|
|
4795
3894
|
if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
|
|
@@ -4801,15 +3900,15 @@ window.__ModuleLoader__.load({
|
|
|
4801
3900
|
if (sameHint(hints.get(id) ?? null, hint)) return;
|
|
4802
3901
|
if (hint === null) hints.delete(id);
|
|
4803
3902
|
else hints.set(id, hint);
|
|
4804
|
-
for (const listener of [...listeners$
|
|
3903
|
+
for (const listener of [...listeners$4]) listener();
|
|
4805
3904
|
}
|
|
4806
3905
|
function panelHintOf(id) {
|
|
4807
3906
|
return id === null ? null : hints.get(id) ?? null;
|
|
4808
3907
|
}
|
|
4809
3908
|
function subscribePanelHints(listener) {
|
|
4810
|
-
listeners$
|
|
3909
|
+
listeners$4.add(listener);
|
|
4811
3910
|
return () => {
|
|
4812
|
-
listeners$
|
|
3911
|
+
listeners$4.delete(listener);
|
|
4813
3912
|
};
|
|
4814
3913
|
}
|
|
4815
3914
|
function usePanelHint(id) {
|
|
@@ -5309,23 +4408,31 @@ window.__ModuleLoader__.load({
|
|
|
5309
4408
|
function isRestart(row) {
|
|
5310
4409
|
return row.state === "inactive" || row.state === "pending-restart";
|
|
5311
4410
|
}
|
|
5312
|
-
function awaitsRestart(
|
|
5313
|
-
const loaded = new Set(
|
|
5314
|
-
return
|
|
4411
|
+
function awaitsRestart(manifests, installed) {
|
|
4412
|
+
const loaded = new Set(manifests.map((manifest) => manifest.id));
|
|
4413
|
+
return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
|
|
5315
4414
|
}
|
|
4415
|
+
/**
|
|
4416
|
+
* 左栏市场入口那枚徽标这一刻该说什么:`problem`(模块异常)> `restart`(重启后生效)> `updates`(有新版本),
|
|
4417
|
+
* 都没有就 `null`。读法与市场页同一份数据、同一套造行函数。
|
|
4418
|
+
* `busy` 里的单元(正被市场自己更新/卸载的那一单元)当它不在名单里:更新是「先卸再装」,
|
|
4419
|
+
* 卸的那一半会让它从名册里消失,不排掉就会在跑的过程中报一次假的「重启后生效」。
|
|
4420
|
+
*/
|
|
5316
4421
|
function marketHintOf(input) {
|
|
5317
|
-
const
|
|
4422
|
+
const busy = input.busy ?? /* @__PURE__ */ new Set();
|
|
4423
|
+
const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
|
|
4424
|
+
const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
|
|
5318
4425
|
const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
|
|
5319
4426
|
const listed = new Set(catalog.map((row) => row.id));
|
|
5320
4427
|
const self = workbenchRow(input.workbench);
|
|
5321
4428
|
const rows = [
|
|
5322
4429
|
...catalog,
|
|
5323
|
-
...installedRows(
|
|
4430
|
+
...installedRows(installed, input.manifests, listed),
|
|
5324
4431
|
...installedPluginRows(input.plugins ?? []),
|
|
5325
4432
|
...self === void 0 ? [] : [self]
|
|
5326
4433
|
];
|
|
5327
4434
|
const problem = rows.some(isProblem);
|
|
5328
|
-
const restart = rows.some(isRestart) || awaitsRestart(input);
|
|
4435
|
+
const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
|
|
5329
4436
|
const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
|
|
5330
4437
|
const more = [];
|
|
5331
4438
|
if (problem) {
|
|
@@ -5352,6 +4459,81 @@ window.__ModuleLoader__.load({
|
|
|
5352
4459
|
return null;
|
|
5353
4460
|
}
|
|
5354
4461
|
//#endregion
|
|
4462
|
+
//#region src/app/layouts/rightbar/market-busy.ts
|
|
4463
|
+
var listeners$3 = /* @__PURE__ */ new Set();
|
|
4464
|
+
var published = /* @__PURE__ */ new Map();
|
|
4465
|
+
var live$2 = /* @__PURE__ */ new Set();
|
|
4466
|
+
var timer$1;
|
|
4467
|
+
/**
|
|
4468
|
+
* 一条「市场自己正在动它」的事实最多认多久(毫秒):从发布那一刻起算,到点自动撤。
|
|
4469
|
+
* 取的是工作台那一跳同一条窗口 —— 一次替换最长等这么久;正常落地会由发布方先撤掉。
|
|
4470
|
+
*/
|
|
4471
|
+
var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
|
|
4472
|
+
/**
|
|
4473
|
+
* 这一刻哪些单元算「正在被动」:发布过、且没到 {@link MARKET_BUSY_MS} 的那些 id。
|
|
4474
|
+
* 给纯函数与判据用;React 里读 {@link useMarketBusy}(同一份,只是走订阅)。
|
|
4475
|
+
*/
|
|
4476
|
+
function marketBusyIds() {
|
|
4477
|
+
return live$2;
|
|
4478
|
+
}
|
|
4479
|
+
/**
|
|
4480
|
+
* 发布「哪几个单元正被市场自己动」(每次整体替换):点下去那一刻发,落地/失败后发空数组。
|
|
4481
|
+
* 同一个 id 连续发布不会顺延它的期限;空数组等于全撤。
|
|
4482
|
+
*/
|
|
4483
|
+
function publishMarketBusy(ids) {
|
|
4484
|
+
const now = Date.now();
|
|
4485
|
+
const next = /* @__PURE__ */ new Map();
|
|
4486
|
+
for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
|
|
4487
|
+
published = next;
|
|
4488
|
+
refresh(now);
|
|
4489
|
+
}
|
|
4490
|
+
/**
|
|
4491
|
+
* 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
|
|
4492
|
+
*/
|
|
4493
|
+
function subscribeMarketBusy(listener) {
|
|
4494
|
+
listeners$3.add(listener);
|
|
4495
|
+
return () => {
|
|
4496
|
+
listeners$3.delete(listener);
|
|
4497
|
+
};
|
|
4498
|
+
}
|
|
4499
|
+
/**
|
|
4500
|
+
* 组件里读「正被市场自己动的单元」:返回的集合在两次通知之间是同一份引用,可以直接进渲染。
|
|
4501
|
+
*/
|
|
4502
|
+
function useMarketBusy() {
|
|
4503
|
+
return useSyncExternalStore(subscribeMarketBusy, marketBusyIds);
|
|
4504
|
+
}
|
|
4505
|
+
/**
|
|
4506
|
+
* 把「市场正在动哪个单元」挂到这一拍上:`id` 变了就整体替换发布,`null` 等于撤。
|
|
4507
|
+
* 卸载那一下**不清**(更新还在跑,徽标不该改口);到 {@link MARKET_BUSY_MS} 由自己到期兜底。
|
|
4508
|
+
*/
|
|
4509
|
+
function usePublishMarketBusy(id) {
|
|
4510
|
+
useEffect(() => {
|
|
4511
|
+
publishMarketBusy(id === null ? [] : [id]);
|
|
4512
|
+
}, [id]);
|
|
4513
|
+
}
|
|
4514
|
+
function sameSet(left, right) {
|
|
4515
|
+
if (left.size !== right.size) return false;
|
|
4516
|
+
for (const id of left) if (!right.has(id)) return false;
|
|
4517
|
+
return true;
|
|
4518
|
+
}
|
|
4519
|
+
function schedule(now) {
|
|
4520
|
+
if (timer$1 !== void 0) clearTimeout(timer$1);
|
|
4521
|
+
timer$1 = void 0;
|
|
4522
|
+
let soonest = Number.POSITIVE_INFINITY;
|
|
4523
|
+
for (const at of published.values()) soonest = Math.min(soonest, at);
|
|
4524
|
+
if (soonest === Number.POSITIVE_INFINITY) return;
|
|
4525
|
+
timer$1 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
|
|
4526
|
+
}
|
|
4527
|
+
function refresh(now) {
|
|
4528
|
+
for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
|
|
4529
|
+
const next = new Set(published.keys());
|
|
4530
|
+
if (!sameSet(live$2, next)) {
|
|
4531
|
+
live$2 = next;
|
|
4532
|
+
for (const listener of [...listeners$3]) listener();
|
|
4533
|
+
}
|
|
4534
|
+
schedule(now);
|
|
4535
|
+
}
|
|
4536
|
+
//#endregion
|
|
5355
4537
|
//#region src/shared/hooks/use-host-write.ts
|
|
5356
4538
|
var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
|
|
5357
4539
|
/**
|
|
@@ -6286,6 +5468,7 @@ window.__ModuleLoader__.load({
|
|
|
6286
5468
|
const removing = removingIdOf(pending, failed);
|
|
6287
5469
|
const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
|
|
6288
5470
|
const pinned = pinnedRowOf(pending, steady.held);
|
|
5471
|
+
usePublishMarketBusy(heldIdOf(pending, steady.held));
|
|
6289
5472
|
const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === heldIdOf(pending, steady.held)) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed);
|
|
6290
5473
|
const pendingRow = pendingRowOf({
|
|
6291
5474
|
pending,
|
|
@@ -6369,7 +5552,18 @@ window.__ModuleLoader__.load({
|
|
|
6369
5552
|
default: return;
|
|
6370
5553
|
}
|
|
6371
5554
|
}
|
|
6372
|
-
|
|
5555
|
+
var NO_IDS$1 = /* @__PURE__ */ new Set();
|
|
5556
|
+
/**
|
|
5557
|
+
* 把一条会话读成行上要的那几格。
|
|
5558
|
+
* @param summary 会话摘要。
|
|
5559
|
+
* @param statusById 会话状态表。
|
|
5560
|
+
* @param list 会话快照(子代理花名册在这里)。
|
|
5561
|
+
* @param pinnedIds 置顶的那些。
|
|
5562
|
+
* @param archivedIds 归档的那些。
|
|
5563
|
+
* @param longTaskIds 有长任务在跑的那些会话(外壳那条读口按“这趟是谁起的”算出来的);不给就是都没有。
|
|
5564
|
+
* @returns 行模型;`longTask` 为真表示这条会话起的某趟长任务还在跑(它自己那一轮可能早结束了)。
|
|
5565
|
+
*/
|
|
5566
|
+
function sessionNode(summary, statusById, list, pinnedIds, archivedIds, longTaskIds = NO_IDS$1) {
|
|
6373
5567
|
const status = statusById.get(summary.id);
|
|
6374
5568
|
const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
|
|
6375
5569
|
let runningSubagentCount = 0;
|
|
@@ -6384,6 +5578,7 @@ window.__ModuleLoader__.load({
|
|
|
6384
5578
|
blank: summary.blank,
|
|
6385
5579
|
running: status?.running ?? summary.running,
|
|
6386
5580
|
runningSubagentCount,
|
|
5581
|
+
longTask: longTaskIds.has(summary.id),
|
|
6387
5582
|
completed: status?.completionUnread === true,
|
|
6388
5583
|
pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
|
|
6389
5584
|
updatedAt: summary.updatedAt,
|
|
@@ -6395,6 +5590,10 @@ window.__ModuleLoader__.load({
|
|
|
6395
5590
|
state: "ongoing",
|
|
6396
5591
|
label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
|
|
6397
5592
|
} : void 0;
|
|
5593
|
+
const longTask = {
|
|
5594
|
+
state: "ongoing",
|
|
5595
|
+
label: t("status.longTask")
|
|
5596
|
+
};
|
|
6398
5597
|
let pending;
|
|
6399
5598
|
switch (node.pendingInteraction) {
|
|
6400
5599
|
case "approval":
|
|
@@ -6426,8 +5625,15 @@ window.__ModuleLoader__.load({
|
|
|
6426
5625
|
state: "ongoing",
|
|
6427
5626
|
label: t("status.running")
|
|
6428
5627
|
};
|
|
6429
|
-
|
|
5628
|
+
const rest = node.longTask ? [longTask] : [];
|
|
5629
|
+
if (subagents === void 0) return [primary, ...rest];
|
|
5630
|
+
return [
|
|
5631
|
+
primary,
|
|
5632
|
+
...rest,
|
|
5633
|
+
subagents
|
|
5634
|
+
];
|
|
6430
5635
|
}
|
|
5636
|
+
if (node.longTask) return subagents === void 0 ? [longTask] : [longTask, subagents];
|
|
6431
5637
|
if (subagents !== void 0) return [subagents];
|
|
6432
5638
|
if (node.completed) return [{
|
|
6433
5639
|
state: "done",
|
|
@@ -6488,6 +5694,24 @@ window.__ModuleLoader__.load({
|
|
|
6488
5694
|
}
|
|
6489
5695
|
//#endregion
|
|
6490
5696
|
//#region src/modules/sessions/model/attention.ts
|
|
5697
|
+
/**
|
|
5698
|
+
* 把外壳那条长任务读口交回的行折成两侧的归属:有会话可归的进 `bySession`(那一行自己亮),
|
|
5699
|
+
* 每一条都按它属于哪个工作区进 `byWorkspace`(没有会话可归的那些只有这一侧看得见)。
|
|
5700
|
+
* @param rows 还在跑的长任务;每行要有它属于哪个工作区,会话那格可以没有。
|
|
5701
|
+
* @returns 两侧的归属;空输入就是两侧都空。
|
|
5702
|
+
*/
|
|
5703
|
+
function longTaskPresenceOf(rows) {
|
|
5704
|
+
const bySession = /* @__PURE__ */ new Set();
|
|
5705
|
+
const byWorkspace = /* @__PURE__ */ new Map();
|
|
5706
|
+
for (const row of rows) {
|
|
5707
|
+
if (row.session !== void 0) bySession.add(row.session);
|
|
5708
|
+
byWorkspace.set(row.workspace, (byWorkspace.get(row.workspace) ?? 0) + 1);
|
|
5709
|
+
}
|
|
5710
|
+
return {
|
|
5711
|
+
bySession,
|
|
5712
|
+
byWorkspace
|
|
5713
|
+
};
|
|
5714
|
+
}
|
|
6491
5715
|
var RANK = {
|
|
6492
5716
|
warning: 2,
|
|
6493
5717
|
done: 1,
|
|
@@ -6513,10 +5737,10 @@ window.__ModuleLoader__.load({
|
|
|
6513
5737
|
done: "project.attention.state.done"
|
|
6514
5738
|
};
|
|
6515
5739
|
var NO_IDS = /* @__PURE__ */ new Set();
|
|
6516
|
-
function attentionOfSession(summary, statusById, sessions) {
|
|
6517
|
-
const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS);
|
|
5740
|
+
function attentionOfSession(summary, statusById, sessions, longTaskIds = NO_IDS) {
|
|
5741
|
+
const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS, longTaskIds);
|
|
6518
5742
|
if (node.pendingInteraction !== void 0) return "warning";
|
|
6519
|
-
if (node.running || node.runningSubagentCount > 0) return "ongoing";
|
|
5743
|
+
if (node.running || node.runningSubagentCount > 0 || node.longTask) return "ongoing";
|
|
6520
5744
|
if (node.completed) return "done";
|
|
6521
5745
|
}
|
|
6522
5746
|
function attentionSessionIdOf(input) {
|
|
@@ -6525,7 +5749,7 @@ window.__ModuleLoader__.load({
|
|
|
6525
5749
|
let best;
|
|
6526
5750
|
let bestRank = -1;
|
|
6527
5751
|
for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
|
|
6528
|
-
const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
|
|
5752
|
+
const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
|
|
6529
5753
|
if (ofSession === void 0) continue;
|
|
6530
5754
|
const rank = RANK[ofSession];
|
|
6531
5755
|
if (best === void 0 || rank > bestRank || rank === bestRank && isLater(summary, best)) {
|
|
@@ -6549,7 +5773,7 @@ window.__ModuleLoader__.load({
|
|
|
6549
5773
|
let tagged;
|
|
6550
5774
|
let taggedCount = 0;
|
|
6551
5775
|
for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
|
|
6552
|
-
const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
|
|
5776
|
+
const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
|
|
6553
5777
|
if (ofSession === void 0) continue;
|
|
6554
5778
|
if (severity === void 0 || RANK[ofSession] > RANK[severity]) {
|
|
6555
5779
|
severity = ofSession;
|
|
@@ -6562,6 +5786,15 @@ window.__ModuleLoader__.load({
|
|
|
6562
5786
|
} else if (ofSession === tagged) taggedCount += 1;
|
|
6563
5787
|
}
|
|
6564
5788
|
}
|
|
5789
|
+
const longTasks = input.longTasks?.byWorkspace.get(workspace.path) ?? 0;
|
|
5790
|
+
if (severity === void 0 && longTasks > 0) {
|
|
5791
|
+
byWorkspace.set(workspace.workspaceId, {
|
|
5792
|
+
severity: "ongoing",
|
|
5793
|
+
count: longTasks,
|
|
5794
|
+
longTask: true
|
|
5795
|
+
});
|
|
5796
|
+
continue;
|
|
5797
|
+
}
|
|
6565
5798
|
if (severity === void 0) continue;
|
|
6566
5799
|
byWorkspace.set(workspace.workspaceId, {
|
|
6567
5800
|
severity,
|
|
@@ -6590,6 +5823,7 @@ window.__ModuleLoader__.load({
|
|
|
6590
5823
|
};
|
|
6591
5824
|
}
|
|
6592
5825
|
function attentionLabel(attention, t) {
|
|
5826
|
+
if (attention.longTask === true) return t(attention.count === 1 ? "project.attention.longTask.one" : "project.attention.longTask.other", { n: attention.count });
|
|
6593
5827
|
const keys = SENTENCES[attention.severity];
|
|
6594
5828
|
return t(attention.count === 1 ? keys.one : keys.other, { n: attention.count });
|
|
6595
5829
|
}
|
|
@@ -7347,7 +6581,8 @@ window.__ModuleLoader__.load({
|
|
|
7347
6581
|
modules,
|
|
7348
6582
|
installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
|
|
7349
6583
|
plugins,
|
|
7350
|
-
workbench
|
|
6584
|
+
workbench,
|
|
6585
|
+
busy: useMarketBusy()
|
|
7351
6586
|
});
|
|
7352
6587
|
useEffect(() => {
|
|
7353
6588
|
publishPanelHint(MARKET_PANEL_ID, hint);
|
|
@@ -7955,14 +7190,17 @@ window.__ModuleLoader__.load({
|
|
|
7955
7190
|
//#endregion
|
|
7956
7191
|
//#region src/app/layouts/sidebar/RecordFooterAction.tsx
|
|
7957
7192
|
function recordFooterView(state, t) {
|
|
7958
|
-
if (state.phase === "recording")
|
|
7959
|
-
|
|
7960
|
-
|
|
7961
|
-
|
|
7962
|
-
|
|
7963
|
-
|
|
7964
|
-
|
|
7965
|
-
|
|
7193
|
+
if (state.phase === "recording") {
|
|
7194
|
+
const taken = state.shots === void 0 ? 0 : state.shots.length;
|
|
7195
|
+
return {
|
|
7196
|
+
label: t("record.recording"),
|
|
7197
|
+
note: taken === 0 ? t("record.recording.note") : `${t("record.recording.note")}${t("record.recording.shots", { n: taken })}`,
|
|
7198
|
+
acts: [{
|
|
7199
|
+
intent: "halt",
|
|
7200
|
+
label: t("record.act.halt")
|
|
7201
|
+
}]
|
|
7202
|
+
};
|
|
7203
|
+
}
|
|
7966
7204
|
if (state.phase === "finished") return {
|
|
7967
7205
|
label: t("record.finished"),
|
|
7968
7206
|
note: t("record.finished.note"),
|
|
@@ -8655,16 +7893,21 @@ window.__ModuleLoader__.load({
|
|
|
8655
7893
|
if (step.status === "failed") return "×";
|
|
8656
7894
|
return "-";
|
|
8657
7895
|
}
|
|
7896
|
+
/**
|
|
7897
|
+
* 每一拍轮询带什么参数:平时什么都不带(宿主那边跟着正在跑的那一轮,刚跑出 `ready` 的直接回上一次),
|
|
7898
|
+
* 用户按了「重试」之后的那一拍带 `hard=1`(不看新鲜度、一律重来)。首拍不再强探 —— 页面上一次
|
|
7899
|
+
* 刚体检过就不必再跑一轮,两页同时刷新也只有一轮。
|
|
7900
|
+
*/
|
|
8658
7901
|
function createForcePlan() {
|
|
8659
|
-
let
|
|
7902
|
+
let hard = false;
|
|
8660
7903
|
return {
|
|
8661
7904
|
next() {
|
|
8662
|
-
const
|
|
8663
|
-
|
|
8664
|
-
return
|
|
7905
|
+
const query = hard ? { hard: 1 } : {};
|
|
7906
|
+
hard = false;
|
|
7907
|
+
return query;
|
|
8665
7908
|
},
|
|
8666
7909
|
again() {
|
|
8667
|
-
|
|
7910
|
+
hard = true;
|
|
8668
7911
|
}
|
|
8669
7912
|
};
|
|
8670
7913
|
}
|
|
@@ -8866,7 +8109,7 @@ window.__ModuleLoader__.load({
|
|
|
8866
8109
|
async function poll() {
|
|
8867
8110
|
if (cancelled) return;
|
|
8868
8111
|
if (pinned !== null) return;
|
|
8869
|
-
const response = await request("preflight", forcePlan.next()
|
|
8112
|
+
const response = await request("preflight", forcePlan.next()).catch(() => null);
|
|
8870
8113
|
if (cancelled) return;
|
|
8871
8114
|
if (response === null || !response.ok) {
|
|
8872
8115
|
close();
|
|
@@ -10702,7 +9945,8 @@ window.__ModuleLoader__.load({
|
|
|
10702
9945
|
workspace: target,
|
|
10703
9946
|
sessions: input.sessions,
|
|
10704
9947
|
statusById: input.statusById,
|
|
10705
|
-
archivedIds: input.archivedIds
|
|
9948
|
+
archivedIds: input.archivedIds,
|
|
9949
|
+
longTasks: input.longTasks
|
|
10706
9950
|
}) ?? firstSessionIdOf(target, input.sessions, input.archivedIds);
|
|
10707
9951
|
if (picked === null) input.startSession(input.workspaceId);
|
|
10708
9952
|
else input.openSession(picked);
|
|
@@ -10761,6 +10005,24 @@ window.__ModuleLoader__.load({
|
|
|
10761
10005
|
}, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: 16 })))));
|
|
10762
10006
|
}
|
|
10763
10007
|
//#endregion
|
|
10008
|
+
//#region src/shared/hooks/use-shell-long-tasks.ts
|
|
10009
|
+
/**
|
|
10010
|
+
* 左栏那颗 loading 点读的长任务清单:**全进程还在跑的**那些(不分单元、不分工作区,每行带它属于
|
|
10011
|
+
* 哪个工作区、是哪个会话起的)。起 / 走一步 / 收尾宿主都会推一条事实,收到就当场重读;那个定时器
|
|
10012
|
+
* 只是兜底 —— 有在跑的按快档问,都闲着按慢档。
|
|
10013
|
+
* @returns 还在跑的长任务;读数还没回来时是空数组。
|
|
10014
|
+
*/
|
|
10015
|
+
function useShellLongTasks() {
|
|
10016
|
+
const [tick, setTick] = useState(0);
|
|
10017
|
+
const runs = useApiResource("long-tasks", {}, tick).value?.runs ?? [];
|
|
10018
|
+
const every = longTaskPollMs(runs.length > 0);
|
|
10019
|
+
useEffect(() => {
|
|
10020
|
+
const timer = setInterval(() => setTick((count) => count + 1), every);
|
|
10021
|
+
return () => clearInterval(timer);
|
|
10022
|
+
}, [every]);
|
|
10023
|
+
return runs;
|
|
10024
|
+
}
|
|
10025
|
+
//#endregion
|
|
10764
10026
|
//#region src/app/layouts/sidebar/current-workspace.ts
|
|
10765
10027
|
function resolveCurrentWorkspace(input) {
|
|
10766
10028
|
const ofSession = workspaceOfSession(input.items, currentSessionId(input.sessions, input.panelActive));
|
|
@@ -10770,7 +10032,7 @@ window.__ModuleLoader__.load({
|
|
|
10770
10032
|
//#endregion
|
|
10771
10033
|
//#region src/app/layouts/sidebar/use-attention.ts
|
|
10772
10034
|
function useSidebarAttention(input) {
|
|
10773
|
-
const { items, sessions, statusById, archived, storedId, panelActive } = input;
|
|
10035
|
+
const { items, sessions, statusById, archived, storedId, panelActive, longTasks } = input;
|
|
10774
10036
|
const archivedIds = useMemo(() => new Set(archived), [archived]);
|
|
10775
10037
|
const current = resolveCurrentWorkspace({
|
|
10776
10038
|
items,
|
|
@@ -10786,16 +10048,26 @@ window.__ModuleLoader__.load({
|
|
|
10786
10048
|
sessions,
|
|
10787
10049
|
statusById,
|
|
10788
10050
|
archivedIds,
|
|
10789
|
-
currentWorkspaceId: current?.workspaceId ?? null
|
|
10051
|
+
currentWorkspaceId: current?.workspaceId ?? null,
|
|
10052
|
+
longTasks
|
|
10790
10053
|
}), [
|
|
10791
10054
|
items,
|
|
10792
10055
|
sessions,
|
|
10793
10056
|
statusById,
|
|
10794
10057
|
archivedIds,
|
|
10795
|
-
current
|
|
10058
|
+
current,
|
|
10059
|
+
longTasks
|
|
10796
10060
|
])
|
|
10797
10061
|
};
|
|
10798
10062
|
}
|
|
10063
|
+
/**
|
|
10064
|
+
* 左栏要的那份长任务归属:外壳那条读口交回「全进程还在跑的长任务」,这里折成会话侧与工作区侧。
|
|
10065
|
+
* @returns 两侧的归属(谁起了 / 哪个工作区里有几趟)。
|
|
10066
|
+
*/
|
|
10067
|
+
function useLongTaskPresence() {
|
|
10068
|
+
const runs = useShellLongTasks();
|
|
10069
|
+
return useMemo(() => longTaskPresenceOf(runs), [runs]);
|
|
10070
|
+
}
|
|
10799
10071
|
//#endregion
|
|
10800
10072
|
//#region src/app/layouts/sidebar/PanelNav.tsx
|
|
10801
10073
|
function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntry, t }) {
|
|
@@ -11309,7 +10581,7 @@ window.__ModuleLoader__.load({
|
|
|
11309
10581
|
}, [list, rows]);
|
|
11310
10582
|
return edges;
|
|
11311
10583
|
}
|
|
11312
|
-
function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
|
|
10584
|
+
function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
|
|
11313
10585
|
const list = useSessions((state) => state);
|
|
11314
10586
|
const statusById = useSessionStatus((state) => state);
|
|
11315
10587
|
const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);
|
|
@@ -11336,7 +10608,7 @@ window.__ModuleLoader__.load({
|
|
|
11336
10608
|
"aria-label": t("session.list.label")
|
|
11337
10609
|
}, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
|
|
11338
10610
|
key: row.id,
|
|
11339
|
-
node: sessionNode(row, statusById, list, pinned, archivedSet),
|
|
10611
|
+
node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
|
|
11340
10612
|
active: row.id === currentId,
|
|
11341
10613
|
onOpen,
|
|
11342
10614
|
renderSlot,
|
|
@@ -11382,13 +10654,15 @@ window.__ModuleLoader__.load({
|
|
|
11382
10654
|
const [createFailed, setCreateFailed] = useState(false);
|
|
11383
10655
|
useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
|
|
11384
10656
|
useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
|
|
10657
|
+
const longTasks = useLongTaskPresence();
|
|
11385
10658
|
const { current, archivedIds: archivedSet, attention } = useSidebarAttention({
|
|
11386
10659
|
items,
|
|
11387
10660
|
sessions,
|
|
11388
10661
|
statusById,
|
|
11389
10662
|
archived,
|
|
11390
10663
|
storedId,
|
|
11391
|
-
panelActive: activePanelId !== null
|
|
10664
|
+
panelActive: activePanelId !== null,
|
|
10665
|
+
longTasks
|
|
11392
10666
|
});
|
|
11393
10667
|
const pickProject = (workspaceId) => {
|
|
11394
10668
|
setStoredId(workspaceId);
|
|
@@ -11400,6 +10674,7 @@ window.__ModuleLoader__.load({
|
|
|
11400
10674
|
sessions,
|
|
11401
10675
|
statusById,
|
|
11402
10676
|
archivedIds: archivedSet,
|
|
10677
|
+
longTasks,
|
|
11403
10678
|
openSession,
|
|
11404
10679
|
startSession
|
|
11405
10680
|
});
|
|
@@ -11478,6 +10753,7 @@ window.__ModuleLoader__.load({
|
|
|
11478
10753
|
pinnedIds,
|
|
11479
10754
|
archived,
|
|
11480
10755
|
panelActive: activePanelId !== null,
|
|
10756
|
+
longTasks,
|
|
11481
10757
|
useSessions: props.useSessions,
|
|
11482
10758
|
useSessionStatus: props.useSessionStatus,
|
|
11483
10759
|
onOpen: props.openSession,
|
|
@@ -11782,23 +11058,79 @@ window.__ModuleLoader__.load({
|
|
|
11782
11058
|
},
|
|
11783
11059
|
components: {
|
|
11784
11060
|
...BlockerState_exports,
|
|
11785
|
-
|
|
11786
|
-
|
|
11787
|
-
|
|
11788
|
-
|
|
11789
|
-
|
|
11790
|
-
|
|
11791
|
-
|
|
11792
|
-
|
|
11061
|
+
ActivityAction,
|
|
11062
|
+
ActivityBlock,
|
|
11063
|
+
ActivityLine,
|
|
11064
|
+
ApprovalDetail,
|
|
11065
|
+
ApprovalPlan,
|
|
11066
|
+
Card,
|
|
11067
|
+
CardAnchor,
|
|
11068
|
+
CardBoundary,
|
|
11069
|
+
CardHead,
|
|
11070
|
+
CenteredState,
|
|
11071
|
+
ChoiceGroup,
|
|
11072
|
+
ConfirmBar,
|
|
11073
|
+
EmptyState,
|
|
11074
|
+
Field,
|
|
11075
|
+
Form,
|
|
11076
|
+
FormActions,
|
|
11077
|
+
FormRow,
|
|
11078
|
+
FormRows,
|
|
11079
|
+
IconBrandMark,
|
|
11080
|
+
IconConversation,
|
|
11081
|
+
IconModuleMark,
|
|
11082
|
+
IconNpm,
|
|
11083
|
+
IconOpencli,
|
|
11084
|
+
IconPanelScreen,
|
|
11085
|
+
Link,
|
|
11086
|
+
LongTaskRow,
|
|
11087
|
+
Note,
|
|
11088
|
+
Row,
|
|
11089
|
+
Rows,
|
|
11090
|
+
SaveBar,
|
|
11091
|
+
SelectField,
|
|
11092
|
+
SettingsSection,
|
|
11093
|
+
SkeletonRows,
|
|
11094
|
+
Spinner,
|
|
11095
|
+
Stack,
|
|
11096
|
+
StateBlock,
|
|
11097
|
+
TextField,
|
|
11793
11098
|
Tip
|
|
11794
11099
|
},
|
|
11795
11100
|
api: {
|
|
11796
|
-
|
|
11101
|
+
apiGet,
|
|
11102
|
+
apiPost,
|
|
11797
11103
|
...context_chips_exports
|
|
11798
11104
|
},
|
|
11799
11105
|
lib: {
|
|
11800
|
-
|
|
11801
|
-
|
|
11106
|
+
MIN_BUSY_MS: 500,
|
|
11107
|
+
blockerOfCapability,
|
|
11108
|
+
blockerOfError,
|
|
11109
|
+
cardIdOf,
|
|
11110
|
+
cx,
|
|
11111
|
+
defaultSelectFilter,
|
|
11112
|
+
duplicateKeysOf,
|
|
11113
|
+
errorReasonOf,
|
|
11114
|
+
excerpt,
|
|
11115
|
+
filterSelectOptions,
|
|
11116
|
+
firstProblemOf,
|
|
11117
|
+
formFirstProblemOf,
|
|
11118
|
+
formValuesOf,
|
|
11119
|
+
holdBusy,
|
|
11120
|
+
parseJsonLoose,
|
|
11121
|
+
parseLocalTimestamp,
|
|
11122
|
+
readText,
|
|
11123
|
+
relativeTime,
|
|
11124
|
+
relativeTimeAgo,
|
|
11125
|
+
relativeTimeBucket,
|
|
11126
|
+
relativeTimeCompact,
|
|
11127
|
+
revealFirstProblem,
|
|
11128
|
+
searchTextOf,
|
|
11129
|
+
selectCursorValue,
|
|
11130
|
+
selectEntries,
|
|
11131
|
+
shortenPath,
|
|
11132
|
+
stepSelectCursor,
|
|
11133
|
+
writeText
|
|
11802
11134
|
}
|
|
11803
11135
|
};
|
|
11804
11136
|
function messagesOf(units) {
|
|
@@ -11807,7 +11139,7 @@ window.__ModuleLoader__.load({
|
|
|
11807
11139
|
...face.messages === void 0 ? {} : { messages: face.messages }
|
|
11808
11140
|
}));
|
|
11809
11141
|
}
|
|
11810
|
-
var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
|
|
11142
|
+
var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
|
|
11811
11143
|
function workbenchCss() {
|
|
11812
11144
|
return `${tokens_default}\n${palette_default}\n${scale_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}\n${chrome_default}\n${board_default}\n${motion_default}\n${COMPONENT_CSS_MARKER}`;
|
|
11813
11145
|
}
|