@dsh-workbench/core 0.3.5 → 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 +1372 -1928
- package/dist/client/client.body.js +1372 -1928
- package/dist/client/index.js +1372 -1928
- package/dist/host/index.js +1569 -751
- package/dist/types/app/client.d.ts +76 -3355
- 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/client.d.ts +1 -1
- package/dist/types/modules/panels/model/approval.d.ts +8 -0
- 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/panels/model/long-task-tools.d.ts +15 -0
- package/dist/types/modules/panels/model/long-task-tools.test.d.ts +1 -0
- package/dist/types/modules/panels/unit.d.ts +5 -3
- 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/approval-call.d.ts +16 -0
- package/dist/types/shared/api/host/long-task-notice.d.ts +30 -0
- package/dist/types/shared/api/host/long-tasks.d.ts +10 -0
- package/dist/types/shared/api/host/mount-units.d.ts +3 -1
- 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-long-task.d.ts +8 -2
- 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 +26 -26
- package/skills/workbench-module-diy/PANEL.md +1 -1
- package/skills/workbench-module-diy/TOOLING.md +5 -1
- package/skills/workbench-module-diy/TOOLS.md +22 -2
- package/skills/workbench-module-diy/WRITES.md +20 -3
package/dist/client/index.js
CHANGED
|
@@ -287,8 +287,6 @@ function blockerOfCapability(capability, t) {
|
|
|
287
287
|
* 引用标记的固定名字;完整标记是 @<这个名字>:<编码文本>,改它等于作废历史会话里已写下的引用。
|
|
288
288
|
*/
|
|
289
289
|
var CONTEXT_MARKER_NAME = "工作台";
|
|
290
|
-
var MARKER = new RegExp(`@${CONTEXT_MARKER_NAME}:([a-z][a-z0-9-]*:[A-Za-z0-9._~%#/-]+)`, "g");
|
|
291
|
-
var TRAILING_PUNCTUATION = /[.,;:!?]+$/;
|
|
292
290
|
/**
|
|
293
291
|
* 把引用拼回标记体里的那一段文本(不含 @ 与标记名)。
|
|
294
292
|
* @param ref 要拼的引用。
|
|
@@ -298,23 +296,6 @@ function encodeRef(ref) {
|
|
|
298
296
|
return `${ref.kind}:${ref.parts.join("/")}`;
|
|
299
297
|
}
|
|
300
298
|
/**
|
|
301
|
-
* 把 kind:part/part 文本读回引用。
|
|
302
|
-
* @param text 待解析文本。
|
|
303
|
-
* @returns 没冒号、冒号在首尾、种类不是小写字母开头、或冒号后为空时给 undefined;不抛异常。
|
|
304
|
-
*/
|
|
305
|
-
function decodeRef(text) {
|
|
306
|
-
const at = text.indexOf(":");
|
|
307
|
-
if (at <= 0 || at === text.length - 1) return void 0;
|
|
308
|
-
const kind = text.slice(0, at);
|
|
309
|
-
if (!/^[a-z][a-z0-9-]*$/.test(kind)) return void 0;
|
|
310
|
-
const parts = text.slice(at + 1).split("/").filter((part) => part !== "");
|
|
311
|
-
if (parts.length === 0) return void 0;
|
|
312
|
-
return {
|
|
313
|
-
kind,
|
|
314
|
-
parts
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
299
|
* 拼出 @ 后面那半截(标记名加已编码文本),比较与拼接都用它。
|
|
319
300
|
* @param encoded encodeRef 的结果。
|
|
320
301
|
* @returns 形如 工作台:file:src/a.ts。
|
|
@@ -331,32 +312,6 @@ function buildMarker(ref) {
|
|
|
331
312
|
return `@${markerBody(encodeRef(ref))}`;
|
|
332
313
|
}
|
|
333
314
|
/**
|
|
334
|
-
* 从一段文本里按出现顺序捞出所有标记引用,同一个引用只留第一次。
|
|
335
|
-
* @param text 任意文本;null / undefined 当空串。
|
|
336
|
-
* @returns 解析不出来的标记会被丢掉,所以结果只含合法引用,可能为空数组。
|
|
337
|
-
*/
|
|
338
|
-
function parseMarkers(text) {
|
|
339
|
-
const seen = /* @__PURE__ */ new Set();
|
|
340
|
-
const refs = [];
|
|
341
|
-
for (const match of String(text ?? "").matchAll(MARKER)) {
|
|
342
|
-
const ref = decodeRef(match[1].replace(TRAILING_PUNCTUATION, ""));
|
|
343
|
-
if (ref === void 0) continue;
|
|
344
|
-
const key = encodeRef(ref);
|
|
345
|
-
if (seen.has(key)) continue;
|
|
346
|
-
seen.add(key);
|
|
347
|
-
refs.push(ref);
|
|
348
|
-
}
|
|
349
|
-
return refs;
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* 由单元 id 拼出它那一族事实的范围名。
|
|
353
|
-
* @param unit 单元 id,不带后缀。
|
|
354
|
-
* @returns <unit>* —— 永远是范围名,不是某一条事实。
|
|
355
|
-
*/
|
|
356
|
-
function unitFactScope(unit) {
|
|
357
|
-
return `${unit}*`;
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
315
|
* 判一个名字是不是范围查法,不是问这条事实存不存在。
|
|
361
316
|
* @param name 事实名或范围名。
|
|
362
317
|
* @returns 单字符 * 不算范围;只有「至少一个字符加 *」才算。
|
|
@@ -555,6 +510,14 @@ function runsRouteOf(unit) {
|
|
|
555
510
|
return `${unit}/runs`;
|
|
556
511
|
}
|
|
557
512
|
/**
|
|
513
|
+
* 停止那条写路由(走 actions 通道的资源名):`<单元>/runs/stop`。
|
|
514
|
+
* @param unit 单元 id。
|
|
515
|
+
* @returns <unit>/runs/stop。
|
|
516
|
+
*/
|
|
517
|
+
function stopRouteOf(unit) {
|
|
518
|
+
return `${unit}/runs/stop`;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
558
521
|
* 有长任务在跑时的轮询间隔(毫秒)。
|
|
559
522
|
*/
|
|
560
523
|
var LONG_TASK_POLL_MS = 1500;
|
|
@@ -582,8 +545,8 @@ function longTaskRunsOf(state) {
|
|
|
582
545
|
}
|
|
583
546
|
/**
|
|
584
547
|
* 把长任务态折成状态点的那一档。
|
|
585
|
-
* @param status
|
|
586
|
-
* @returns ongoing / done / error / idle;needs-login
|
|
548
|
+
* @param status 长任务的五种态。
|
|
549
|
+
* @returns ongoing / done / error / idle;needs-login 也算进行中;`stopped` 落进 idle —— 灰点:不是成功、不是出错,是用户自己按停的。
|
|
587
550
|
*/
|
|
588
551
|
function longTaskDot(status) {
|
|
589
552
|
if (status === "ok") return "done";
|
|
@@ -591,6 +554,28 @@ function longTaskDot(status) {
|
|
|
591
554
|
if (status === "running" || status === "needs-login") return "ongoing";
|
|
592
555
|
return "idle";
|
|
593
556
|
}
|
|
557
|
+
/**
|
|
558
|
+
* 算停止钮现在在哪一档。
|
|
559
|
+
* @param state armed = 已经按过第一下、在等第二下;busy = 停止请求已经在飞。
|
|
560
|
+
* @returns busy 优先(在飞时按不动),其次 armed,否则 idle。
|
|
561
|
+
*/
|
|
562
|
+
function longTaskStopStage(state) {
|
|
563
|
+
if (state.busy) return "busy";
|
|
564
|
+
return state.armed ? "armed" : "idle";
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* 按一下该干什么:第一次只上膛('arm'),上了膛再按才真发('fire'),在飞时按不动('ignore')。
|
|
568
|
+
* @param stage 现在这一档(先过 `longTaskStopStage`)。
|
|
569
|
+
* @returns 'arm' / 'fire' / 'ignore',调用点照它上膛、落膛加发请求、或什么都不做。
|
|
570
|
+
*/
|
|
571
|
+
function longTaskStopPress(stage) {
|
|
572
|
+
if (stage === "busy") return "ignore";
|
|
573
|
+
return stage === "armed" ? "fire" : "arm";
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* 上膛后多久自己落膛(毫秒)。3 秒 = dsh 那行现在的取值。
|
|
577
|
+
*/
|
|
578
|
+
var LONG_TASK_STOP_ARM_MS = 3e3;
|
|
594
579
|
//#endregion
|
|
595
580
|
//#region ../shared/dist/api/unit-board.js
|
|
596
581
|
/**
|
|
@@ -634,154 +619,6 @@ function probeKeyOf(error) {
|
|
|
634
619
|
if (error === void 0) return null;
|
|
635
620
|
return error.code === "" ? "unknown" : error.code;
|
|
636
621
|
}
|
|
637
|
-
/**
|
|
638
|
-
* 外壳愿意认的协议版本;不在表里的模块当场被拒,不猜语义。
|
|
639
|
-
*/
|
|
640
|
-
var SUPPORTED_API_VERSIONS = [1];
|
|
641
|
-
/**
|
|
642
|
-
* 协议认得的全部键;写了别的键不会被采纳(外壳静默忽略),所以字段名拼错不会有提示。
|
|
643
|
-
*/
|
|
644
|
-
var DECLARATION_KEYS = [
|
|
645
|
-
"apiVersion",
|
|
646
|
-
"unit",
|
|
647
|
-
"card",
|
|
648
|
-
"tools",
|
|
649
|
-
"host",
|
|
650
|
-
"env"
|
|
651
|
-
];
|
|
652
|
-
/**
|
|
653
|
-
* 协议要求必写的键;env 不在其中(没有环境需要就不写)。
|
|
654
|
-
*/
|
|
655
|
-
var DECLARATION_REQUIRED_KEYS = [
|
|
656
|
-
"apiVersion",
|
|
657
|
-
"unit",
|
|
658
|
-
"card",
|
|
659
|
-
"tools",
|
|
660
|
-
"host"
|
|
661
|
-
];
|
|
662
|
-
var CARD_KEYS = ["titleKey", "order"];
|
|
663
|
-
var TOOL_KEYS = [
|
|
664
|
-
"name",
|
|
665
|
-
"writes",
|
|
666
|
-
"key"
|
|
667
|
-
];
|
|
668
|
-
var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
|
|
669
|
-
var HOST_KEYS = ["inject", "optional"];
|
|
670
|
-
function text(value) {
|
|
671
|
-
return typeof value === "string" ? value.trim() : "";
|
|
672
|
-
}
|
|
673
|
-
function isRecord(value) {
|
|
674
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
675
|
-
}
|
|
676
|
-
function outsideKeys(value, allowed) {
|
|
677
|
-
return Object.keys(value).filter((key) => !allowed.includes(key));
|
|
678
|
-
}
|
|
679
|
-
function listOf(keys) {
|
|
680
|
-
return keys.map((key) => JSON.stringify(key)).join(" / ");
|
|
681
|
-
}
|
|
682
|
-
function stringArrayProblems(at, value) {
|
|
683
|
-
if (!Array.isArray(value)) return [`${at} 要是一串字符串,现在是 ${JSON.stringify(value)}`];
|
|
684
|
-
return value.flatMap((item, index) => text(item) === "" ? [`${at}[${index}] 不是非空字符串:${JSON.stringify(item)}`] : []);
|
|
685
|
-
}
|
|
686
|
-
/**
|
|
687
|
-
* 查清单里 dsh.workbench 那一段的形状,回一串给人看的问题(中文,带字段路径)。
|
|
688
|
-
* @param subject 报错时用的主语,一般是包名。
|
|
689
|
-
* @param raw 清单里那段原始值,可能什么都不是。
|
|
690
|
-
* @returns 空数组表示形状过得去;版本不对就当场返回(后面的字段无从判起)。
|
|
691
|
-
*/
|
|
692
|
-
function declarationProblemsOf(subject, raw) {
|
|
693
|
-
if (!isRecord(raw)) return [`${subject}: dsh.workbench 不是一个对象 —— ${JSON.stringify(raw)}`];
|
|
694
|
-
const version = raw.apiVersion;
|
|
695
|
-
if (version === void 0) return [`${subject}: dsh.workbench 没有 apiVersion —— 协议从 v1 起,写 \`"apiVersion": 1\`。缺它 = 外壳不认这个模块(ADR-0038 §2.3)`];
|
|
696
|
-
if (!Number.isInteger(version) || !SUPPORTED_API_VERSIONS.includes(version)) return [`${subject}: dsh.workbench.apiVersion 是 ${JSON.stringify(version)},这里只认 ${SUPPORTED_API_VERSIONS.join(" / ")}(要整数)`];
|
|
697
|
-
const problems = [];
|
|
698
|
-
const unknown = outsideKeys(raw, DECLARATION_KEYS);
|
|
699
|
-
if (unknown.length > 0) problems.push(`${subject}: dsh.workbench 里有协议 v1 不认识的键 ${listOf(unknown)} —— 只有 ${listOf(DECLARATION_KEYS)}。(拼错的键会被外壳**静默忽略**:那句声明等于没写)`);
|
|
700
|
-
for (const key of DECLARATION_REQUIRED_KEYS) if (raw[key] === void 0) problems.push(`${subject}: dsh.workbench 缺 ${key}` + (key === "card" ? "(这个模块没有卡片就写 `\"card\": null`)" : ""));
|
|
701
|
-
const card = raw.card;
|
|
702
|
-
if (card !== void 0 && card !== null) {
|
|
703
|
-
if (!isRecord(card)) problems.push(`${subject}: dsh.workbench.card 要么是对象、要么是 null,现在是 ${JSON.stringify(card)}`);
|
|
704
|
-
else {
|
|
705
|
-
const extra = outsideKeys(card, CARD_KEYS);
|
|
706
|
-
if (extra.length > 0) problems.push(`${subject}: dsh.workbench.card 里有不认的键 ${listOf(extra)} —— card 只有 ${listOf(CARD_KEYS)}(卡片默认显不显示由运行期的面板配置决定,清单里没有这一位)`);
|
|
707
|
-
if (text(card.titleKey) === "") problems.push(`${subject}: dsh.workbench.card.titleKey 要是非空字符串(面板那一格的文案键)`);
|
|
708
|
-
if (typeof card.order !== "number" || !Number.isFinite(card.order)) problems.push(`${subject}: dsh.workbench.card.order 要是数字,现在是 ${JSON.stringify(card.order)}`);
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
const tools = raw.tools;
|
|
712
|
-
if (tools !== void 0) {
|
|
713
|
-
if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
|
|
714
|
-
else {
|
|
715
|
-
const seen = /* @__PURE__ */ new Set();
|
|
716
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
717
|
-
tools.forEach((tool, index) => {
|
|
718
|
-
const at = `dsh.workbench.tools[${index}]`;
|
|
719
|
-
if (!isRecord(tool)) {
|
|
720
|
-
problems.push(`${subject}: ${at} 要是对象,现在是 ${JSON.stringify(tool)}`);
|
|
721
|
-
return;
|
|
722
|
-
}
|
|
723
|
-
const extra = outsideKeys(tool, TOOL_KEYS);
|
|
724
|
-
if (extra.length > 0) problems.push(`${subject}: ${at} 里有不认的键 ${listOf(extra)} —— tools 只有 ${listOf(TOOL_KEYS)}`);
|
|
725
|
-
const name = text(tool.name);
|
|
726
|
-
if (name === "") problems.push(`${subject}: ${at}.name 要是非空字符串`);
|
|
727
|
-
else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
|
|
728
|
-
else seen.add(name);
|
|
729
|
-
if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
|
|
730
|
-
if (tool.key !== void 0) {
|
|
731
|
-
const key = text(tool.key);
|
|
732
|
-
if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
|
|
733
|
-
else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
|
|
734
|
-
else seenKeys.add(key);
|
|
735
|
-
}
|
|
736
|
-
});
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
const host = raw.host;
|
|
740
|
-
if (host !== void 0) {
|
|
741
|
-
if (!isRecord(host)) problems.push(`${subject}: dsh.workbench.host 要是对象,现在是 ${JSON.stringify(host)}`);
|
|
742
|
-
else {
|
|
743
|
-
const extra = outsideKeys(host, HOST_KEYS);
|
|
744
|
-
if (extra.length > 0) problems.push(`${subject}: dsh.workbench.host 里有不认的键 ${listOf(extra)} —— host 只有 ${listOf(HOST_KEYS)}`);
|
|
745
|
-
if (host.inject === void 0) problems.push(`${subject}: dsh.workbench.host.inject 没写 —— 它声明这个模块要外壳的哪几个服务,外壳靠它判"能不能挂"。一个都不要也要写 \`"inject": []\``);
|
|
746
|
-
else problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.inject`, host.inject));
|
|
747
|
-
if (host.optional !== void 0) problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.optional`, host.optional));
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
if (raw.env !== void 0 && !isRecord(raw.env)) problems.push(`${subject}: dsh.workbench.env 要是对象(command / plugins / libs)—— 语义由门禁的 env 判据查,这里只查形状`);
|
|
751
|
-
return problems;
|
|
752
|
-
}
|
|
753
|
-
/**
|
|
754
|
-
* 读一份清单:先查形状,过了再把声明规整成 manifest。
|
|
755
|
-
* @param subject 报错时用的主语。
|
|
756
|
-
* @param raw 清单里 dsh.workbench 那段原始值。
|
|
757
|
-
* @returns 有问题时只有 problems;没问题时 declaration 与 manifest 都给,manifest 里的字符串已 trim。
|
|
758
|
-
*/
|
|
759
|
-
function readDeclaration(subject, raw) {
|
|
760
|
-
const problems = declarationProblemsOf(subject, raw);
|
|
761
|
-
if (problems.length > 0) return { problems };
|
|
762
|
-
const declaration = raw;
|
|
763
|
-
const card = declaration.card;
|
|
764
|
-
return {
|
|
765
|
-
declaration,
|
|
766
|
-
problems: [],
|
|
767
|
-
manifest: {
|
|
768
|
-
id: text(declaration.unit),
|
|
769
|
-
card: card === null ? null : {
|
|
770
|
-
titleKey: text(card.titleKey),
|
|
771
|
-
order: card.order
|
|
772
|
-
},
|
|
773
|
-
tools: declaration.tools.map((tool) => ({
|
|
774
|
-
name: text(tool.name),
|
|
775
|
-
writes: tool.writes
|
|
776
|
-
})),
|
|
777
|
-
host: {
|
|
778
|
-
inject: [...declaration.host.inject ?? []],
|
|
779
|
-
...declaration.host.optional === void 0 ? {} : { optional: [...declaration.host.optional] }
|
|
780
|
-
},
|
|
781
|
-
...declaration.env === void 0 ? {} : { env: declaration.env }
|
|
782
|
-
}
|
|
783
|
-
};
|
|
784
|
-
}
|
|
785
622
|
//#endregion
|
|
786
623
|
//#region ../shared/dist/api/unit.js
|
|
787
624
|
/**
|
|
@@ -794,68 +631,22 @@ function hasEnvSupply(manifest) {
|
|
|
794
631
|
}
|
|
795
632
|
//#endregion
|
|
796
633
|
//#region ../shared/dist/config/constants.js
|
|
797
|
-
/** 外壳插件的包名:浏览器模块表与宿主按它注册、认领这枚插件。 */
|
|
798
|
-
var PLUGIN_ID = "@dsh-workbench/core";
|
|
799
|
-
/** 与外壳同批发布的兄弟包名:`release.ts` 用它判一版三包是否都已在源上。 */
|
|
800
|
-
var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
|
|
801
634
|
/** 外壳宿主 HTTP API 的根前缀;prefs / actions / provision 等路由都挂在它下面。 */
|
|
802
635
|
var API_PREFIX = "/workbench/api";
|
|
803
|
-
|
|
804
|
-
var PREFS_PREFIX = `${API_PREFIX}/prefs`;
|
|
636
|
+
`${API_PREFIX}`;
|
|
805
637
|
/** 事实(facts)SSE 事件流的端点路径;前端 `EventSource` 按它带 `since` 游标续传。 */
|
|
806
638
|
var EVENTS_PATH = "/workbench/events";
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
/** 机器供给(provision)的路由前缀:只收 POST,装机时用它铺一份运行环境。 */
|
|
810
|
-
var PROVISION_PREFIX = `${API_PREFIX}/provision`;
|
|
639
|
+
`${API_PREFIX}`;
|
|
640
|
+
`${API_PREFIX}`;
|
|
811
641
|
/** 面板运行态上报的路径段:崩溃与卡片收尾分别 POST 到 `panel-state/crash`、`panel-state/cards`。 */
|
|
812
642
|
var PANEL_STATE_PATH = "panel-state";
|
|
813
|
-
|
|
814
|
-
var DIY_DEBUG_PATH = "diy-debug";
|
|
815
|
-
/** 调试动作的子路径(`diy-debug/act`);仓内暂无调用点,动作现走 `DIY_DEBUG_SERVICE`。 */
|
|
816
|
-
var DIY_DEBUG_ACT_PATH = `${DIY_DEBUG_PATH}/act`;
|
|
817
|
-
/** DIY 录制交接的路径段;宿主按它登记 `/workbench/api/diy-record` 前缀。 */
|
|
818
|
-
var DIY_RECORD_PATH = "diy-record";
|
|
819
|
-
/** 录制动作的子路径(`diy-record/act`);仓内暂无调用点,录制现走 `DIY_RECORD_SERVICE`。 */
|
|
820
|
-
var DIY_RECORD_ACT_PATH = `${DIY_RECORD_PATH}/act`;
|
|
821
|
-
/** 面板运行态的路由前缀,挂在外壳 API 下:上报口用它,拒报回 report-refused。 */
|
|
822
|
-
var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
|
|
823
|
-
/** 钉住的 opencli 插件版本:`opencli-runtime` 按它校验、取那一份。 */
|
|
824
|
-
var OPENCLI_PIN = "1.8.8";
|
|
825
|
-
/** 缺陷看板套件的 dsh 服务名(`workbenchCodingIssues`):套件照它登记自己那份服务。 */
|
|
826
|
-
var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
|
|
827
|
-
/** 面板套件的 dsh 服务名(`workbenchPanels`):宿主经它取套件公布的清单与订阅。 */
|
|
828
|
-
var PANELS_SERVICE = "workbenchPanels";
|
|
643
|
+
`${API_PREFIX}${PANEL_STATE_PATH}`;
|
|
829
644
|
/** 单元花名册服务的 dsh 服务名(`workbenchUnits`):模块经它认领自己的单元。 */
|
|
830
645
|
var UNITS_SERVICE = "workbenchUnits";
|
|
831
|
-
/** 面板运行态服务的 dsh 服务名(`workbenchPanelState`):宿主注册,读口按它取。 */
|
|
832
|
-
var PANEL_STATE_SERVICE = "workbenchPanelState";
|
|
833
|
-
/** DIY 调试约定服务的 dsh 服务名(`workbenchDiyDebug`):调试动作走它,不走 HTTP。 */
|
|
834
|
-
var DIY_DEBUG_SERVICE = "workbenchDiyDebug";
|
|
835
|
-
/** DIY 录制交接服务的 dsh 服务名(`workbenchDiyRecord`):`diy-acts.ts` 经它收发录制三拍。 */
|
|
836
|
-
var DIY_RECORD_SERVICE = "workbenchDiyRecord";
|
|
837
|
-
/** 会话投影服务的 dsh 服务名(`sessionProjections`):宿主经 `stateOf(session, 'agentPreset')` 读那一档。 */
|
|
838
|
-
var SESSION_PROJECTIONS_SERVICE = "sessionProjections";
|
|
839
|
-
/** 单次 opencli 调用的默认超时(毫秒);调用点没传 `timeoutMs` 时按它算。 */
|
|
840
|
-
var OPENCLI_TIMEOUT_MS = 12e4;
|
|
841
|
-
/** 启动预热站点那一跳的超时(毫秒);超时按未热对待,不挡面板。 */
|
|
842
|
-
var WARM_TIMEOUT_MS = 2e4;
|
|
843
|
-
/** 装 / 卸模块包的超时(毫秒):pnpm 与取包内容都按它算。 */
|
|
844
|
-
var INSTALL_TIMEOUT_MS = 3e5;
|
|
845
|
-
/** 查 registry 版本那一次请求的超时(毫秒)。 */
|
|
846
|
-
var VERSION_CHECK_TIMEOUT_MS = 1e4;
|
|
847
646
|
/** 版本查询结果的缓存有效期(毫秒):期内不发第二次请求。 */
|
|
848
647
|
var VERSION_CHECK_TTL_MS = 6e5;
|
|
849
|
-
/** 单元探测结果的缓存有效期(毫秒)。 */
|
|
850
|
-
var PROBE_TTL_MS = 3e4;
|
|
851
|
-
/** 工具读出来的值交给面板后的保留时长(毫秒):过期就不再算这一拍。 */
|
|
852
|
-
var HANDOFF_TTL_MS = 15e3;
|
|
853
|
-
/** 跑本地 git 命令的超时(毫秒);短于对外的 `OPENCLI_TIMEOUT_MS`。 */
|
|
854
|
-
var GIT_TIMEOUT_MS = 1e4;
|
|
855
648
|
/** 面板轮询事实的间隔(毫秒):SSE 断了走这条兜底轮询。 */
|
|
856
649
|
var PANEL_POLL_MS = 2e3;
|
|
857
|
-
/** 没起中文名的工作区默认标题:左栏按它分组、显示。 */
|
|
858
|
-
var DEFAULT_WORKSPACE_TITLE = "default-workspace";
|
|
859
650
|
/** 记住当前项目的 localStorage 键。 */
|
|
860
651
|
var STORAGE_KEY_PROJECT = "dsh-workbench.project";
|
|
861
652
|
/** 记住右栏展开与否的 localStorage 键。 */
|
|
@@ -866,8 +657,6 @@ var STORAGE_KEY_RIGHTBAR_COLUMN = "dsh-workbench.rightbar.column";
|
|
|
866
657
|
var STORAGE_KEY_RIGHTBAR_WIDTH = "dsh-workbench.rightbar.width";
|
|
867
658
|
/** dsh i18n 的命名空间:词表都注册在它下面,`ctx.locale.register` / `bind` 按它取。 */
|
|
868
659
|
var LOCALE_NS = "workbench";
|
|
869
|
-
/** 外壳支持的语言标识,顺序即回退顺序:首项是基准,其余词表必须与它逐键同构。 */
|
|
870
|
-
var LOCALES = ["zh", "en"];
|
|
871
660
|
//#endregion
|
|
872
661
|
//#region ../shared/dist/api/workbench-client.js
|
|
873
662
|
/**
|
|
@@ -935,14 +724,8 @@ var Fragment = react.Fragment;
|
|
|
935
724
|
* React 的 `Component` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
936
725
|
*/
|
|
937
726
|
var Component = react.Component;
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
*/
|
|
941
|
-
var createContext = react.createContext;
|
|
942
|
-
/**
|
|
943
|
-
* React 的 `useContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
944
|
-
*/
|
|
945
|
-
var useContext = react.useContext;
|
|
727
|
+
react.createContext;
|
|
728
|
+
react.useContext;
|
|
946
729
|
/**
|
|
947
730
|
* React 的 `useState` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
948
731
|
*/
|
|
@@ -1392,18 +1175,6 @@ function ChoiceGroup(props) {
|
|
|
1392
1175
|
});
|
|
1393
1176
|
}
|
|
1394
1177
|
//#endregion
|
|
1395
|
-
//#region ../shared/dist/components/Field.js
|
|
1396
|
-
/**
|
|
1397
|
-
* 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
|
|
1398
|
-
* @param props.label - 左侧标签,必给。
|
|
1399
|
-
* @param props.hint - 控件下面那行说明;不给不画。
|
|
1400
|
-
* @param props.children - 控件本体,落在标签与说明之间。
|
|
1401
|
-
* @returns 一个 `<label>`,点标签会聚焦里面的控件。
|
|
1402
|
-
*/
|
|
1403
|
-
function Field({ label, hint, children }) {
|
|
1404
|
-
return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
|
|
1405
|
-
}
|
|
1406
|
-
//#endregion
|
|
1407
1178
|
//#region ../shared/dist/components/FormActions.js
|
|
1408
1179
|
var RANK$1 = {
|
|
1409
1180
|
default: 0,
|
|
@@ -1454,6 +1225,66 @@ function FormActions({ actions }) {
|
|
|
1454
1225
|
}));
|
|
1455
1226
|
}
|
|
1456
1227
|
//#endregion
|
|
1228
|
+
//#region ../shared/dist/components/Rows.js
|
|
1229
|
+
/**
|
|
1230
|
+
* 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
|
|
1231
|
+
* @param props.children - 一串 `Row`。
|
|
1232
|
+
* @returns 竖排的 div。
|
|
1233
|
+
*/
|
|
1234
|
+
function Rows({ children }) {
|
|
1235
|
+
return h("div", { className: "wb-rows" }, children);
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
|
|
1239
|
+
* @param props.label - 左边那格(键)。
|
|
1240
|
+
* @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
|
|
1241
|
+
* @returns 一行两格。
|
|
1242
|
+
*/
|
|
1243
|
+
function Row({ label, value }) {
|
|
1244
|
+
return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
|
|
1245
|
+
}
|
|
1246
|
+
//#endregion
|
|
1247
|
+
//#region ../shared/dist/components/ConfirmBar.js
|
|
1248
|
+
/**
|
|
1249
|
+
* 「先问一句再动手」那一条:标题 + 说明 + 键值 + 失败那句 + 动作区,形状一次收口。
|
|
1250
|
+
* **要不要问**归调用点(ADR-0054 §2 规则三),这一件只回答"问的时候长什么样"。
|
|
1251
|
+
* @param props.title - 那一句问话("发布到 prod?")。
|
|
1252
|
+
* @param props.hint - 标题下面那句说明或正文;不给不占位。
|
|
1253
|
+
* @param props.rows - 键值两格(键值列宽与分隔线归 `Rows` / `Row`);不给或空数组不渲染。值那一格可以放控件。
|
|
1254
|
+
* @param props.actions - 动作清单(归 `FormActions`:一个区一颗 `primary`、永远在右、窄了折行)。
|
|
1255
|
+
* @param props.problem - 失败那句(走 `Note tone="problem"`,读屏是 `alert`);不给不占位。
|
|
1256
|
+
* @param props.busy - 整条在忙(只喂 `aria-busy`;按钮自己的转圈与禁用归 `actions` 里那一颗)。
|
|
1257
|
+
* @param props.label - 读屏的组名;不给时 `title` 是字符串就拿它顶上,两者都没有就不设。
|
|
1258
|
+
* @returns 一个 `role="group"` 的条;`actions` 空数组时最后那一块不渲染。
|
|
1259
|
+
*/
|
|
1260
|
+
function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
|
|
1261
|
+
return h("div", {
|
|
1262
|
+
className: "wb-confirmBar",
|
|
1263
|
+
role: "group",
|
|
1264
|
+
"aria-label": label ?? (typeof title === "string" ? title : void 0),
|
|
1265
|
+
"aria-busy": busy
|
|
1266
|
+
}, 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, {
|
|
1267
|
+
key: row.key,
|
|
1268
|
+
label: row.label,
|
|
1269
|
+
value: row.value
|
|
1270
|
+
}))), problem === void 0 ? null : h(Note, {
|
|
1271
|
+
tone: "problem",
|
|
1272
|
+
role: "alert"
|
|
1273
|
+
}, problem), h(FormActions, { actions }));
|
|
1274
|
+
}
|
|
1275
|
+
//#endregion
|
|
1276
|
+
//#region ../shared/dist/components/Field.js
|
|
1277
|
+
/**
|
|
1278
|
+
* 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
|
|
1279
|
+
* @param props.label - 左侧标签,必给。
|
|
1280
|
+
* @param props.hint - 控件下面那行说明;不给不画。
|
|
1281
|
+
* @param props.children - 控件本体,落在标签与说明之间。
|
|
1282
|
+
* @returns 一个 `<label>`,点标签会聚焦里面的控件。
|
|
1283
|
+
*/
|
|
1284
|
+
function Field({ label, hint, children }) {
|
|
1285
|
+
return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
|
|
1286
|
+
}
|
|
1287
|
+
//#endregion
|
|
1457
1288
|
//#region ../shared/dist/components/FormRows.js
|
|
1458
1289
|
/**
|
|
1459
1290
|
* 表单行的容器:同一份 `FormRows` 共用一个标签列(列宽由最长的标签定),行距也归它。
|
|
@@ -1542,11 +1373,14 @@ function formProblemsOf(fields, show) {
|
|
|
1542
1373
|
const values = formValuesOf(fields);
|
|
1543
1374
|
const problems = {};
|
|
1544
1375
|
for (const field of fields) {
|
|
1545
|
-
const found = show ?
|
|
1376
|
+
const found = show ? problemOf(field, values) : void 0;
|
|
1546
1377
|
problems[field.key] = found ? found : void 0;
|
|
1547
1378
|
}
|
|
1548
1379
|
return problems;
|
|
1549
1380
|
}
|
|
1381
|
+
function problemOf(field, values) {
|
|
1382
|
+
return field.validate?.(field.value, values);
|
|
1383
|
+
}
|
|
1550
1384
|
/**
|
|
1551
1385
|
* 按字段顺序取第一处错误 —— 提交被挡住时要带进视口的就是这一格。
|
|
1552
1386
|
* 判的是**真值**(与 `formProblemsOf` 同一口径):假值那种"错误文案"渲染出来本来就是空的,不算错。
|
|
@@ -1627,12 +1461,17 @@ function formRowsOf(args) {
|
|
|
1627
1461
|
hint: field.hint,
|
|
1628
1462
|
problem: args.showProblem ? args.problems[field.key] : void 0,
|
|
1629
1463
|
layout: field.layout
|
|
1630
|
-
}, field.
|
|
1464
|
+
}, controlOf(field, args.problems, args.showProblem, args.busy)));
|
|
1465
|
+
}
|
|
1466
|
+
function controlOf(field, problems, showProblem, busy) {
|
|
1467
|
+
return field.control({
|
|
1631
1468
|
id: `wb-form-${field.key}`,
|
|
1632
1469
|
name: field.key,
|
|
1633
|
-
invalid:
|
|
1634
|
-
disabled:
|
|
1635
|
-
|
|
1470
|
+
invalid: showProblem && Boolean(problems[field.key]),
|
|
1471
|
+
disabled: busy || field.disabled === true,
|
|
1472
|
+
value: field.value,
|
|
1473
|
+
onChange: field.onChange
|
|
1474
|
+
});
|
|
1636
1475
|
}
|
|
1637
1476
|
//#endregion
|
|
1638
1477
|
//#region ../shared/dist/lib/form-problem.js
|
|
@@ -1669,13 +1508,15 @@ function revealFirstProblem(root) {
|
|
|
1669
1508
|
//#region ../shared/dist/components/Form.js
|
|
1670
1509
|
/**
|
|
1671
1510
|
* 整张表单:`fields` 进,行、错误、操作区、(被挡住的)提交都由它安排 —— 它自己一个值都不存,
|
|
1672
|
-
*
|
|
1511
|
+
* 值仍归调用点(`value` 与 `onChange` 写在字段配置的同一格里,`Form` 只是把两者原样递给那一格的 `control`)。
|
|
1512
|
+
* 写了 `Form<Values>` 就按 `Values` 把每一格的键与值类型钉住(`Values` 里会 `visible: false` 的键写成可选键);
|
|
1513
|
+
* 不写就是默认档,键值都不钉。
|
|
1673
1514
|
* 还没提交过时一格错都不显示;第一次提交之后每次渲染重算,改好了当场消。
|
|
1674
1515
|
* 提交那一拍永远先算一遍:有错就不调 `onSubmit`,并把第一个有错的 `FormRow` 带进视口、聚焦它里面的控件。
|
|
1675
1516
|
* 回车与点提交钮走的是同一条路:真 `<form>` 的隐式提交在**只有一个文本框**时也会 fire,所以 `busy` / `disabled` 时回车同样不提交。
|
|
1676
1517
|
* 调用点只管数据与语义:行怎么排、错误摆哪、什么时候校验、按钮在哪,这里没有口子。
|
|
1677
|
-
* @param props.fields - 每格的键 / 标签 / 值 / 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
|
|
1678
|
-
* @param props.onSubmit - 校验全过的那一拍,回的是从 `fields`
|
|
1518
|
+
* @param props.fields - 每格的键 / 标签 / 值 / 值怎么改(`onChange`)/ 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
|
|
1519
|
+
* @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表(按 `visibleFieldsOf` 过滤过,不可见那格不在里面);被挡住时不会被调。
|
|
1679
1520
|
* @param props.submit - 提交钮文案;`busyLabel` 是提交中换的那句,不给就沿用 `label`。
|
|
1680
1521
|
* @param props.cancel - 取消钮;给了就排在提交钮左边,`busy` 时一起禁用。
|
|
1681
1522
|
* @param props.extra - 其余动作(default / danger),排在最左,`busy` 时一起禁用。
|
|
@@ -1765,7 +1606,7 @@ function RowLink({ href, text }) {
|
|
|
1765
1606
|
/**
|
|
1766
1607
|
* 长任务那一行:状态点 + 标题 + 链接,跑失败时把步骤与原始输出收在两处可展开里。
|
|
1767
1608
|
* 发布、扫描、迁移这类跑得久的事都用它,别自己画进度。
|
|
1768
|
-
* @param props.status - `longTaskDot`
|
|
1609
|
+
* @param props.status - `longTaskDot` 认的五态之一,决定状态点颜色与要不要画"失败"那两块。
|
|
1769
1610
|
* @param props.headline - 这一行在干什么(一句话)。
|
|
1770
1611
|
* @param props.problem - 失败原因;不给不画。
|
|
1771
1612
|
* @param props.links - 行尾的链接,通常指向产物或日志。
|
|
@@ -1773,15 +1614,39 @@ function RowLink({ href, text }) {
|
|
|
1773
1614
|
* @param props.raw - 原始输出;只在失败时画,且要同时给 `rawTitle` 才成一块可展开。
|
|
1774
1615
|
* @param props.stepsTitle - 步骤那块展开行的标题;`rawTitle` 同理是原始输出那块。
|
|
1775
1616
|
* @param props.copyLabel - 复制钮文案:给了才画复制钮;`copiedLabel` 是复制成功后那句。
|
|
1617
|
+
* @param props.stop - 给了才在最右边画那颗两按停止钮;**不给就一个像素都不变**。只在生产方认 `signal` 时给。
|
|
1776
1618
|
* @returns 一行长任务。
|
|
1777
1619
|
*/
|
|
1778
1620
|
function LongTaskRow(props) {
|
|
1779
1621
|
const [stepsOpen, setStepsOpen] = useState(false);
|
|
1780
1622
|
const [rawOpen, setRawOpen] = useState(false);
|
|
1623
|
+
const [armed, setArmed] = useState(false);
|
|
1781
1624
|
const failed = props.status === "failed";
|
|
1782
1625
|
const problem = props.problem ?? "";
|
|
1783
1626
|
const raw = (props.raw ?? "").trim();
|
|
1784
1627
|
const steps = props.steps ?? [];
|
|
1628
|
+
const stop = props.stop;
|
|
1629
|
+
const busy = stop?.busy === true;
|
|
1630
|
+
const stopWhy = stop?.failed ?? "";
|
|
1631
|
+
useEffect(() => {
|
|
1632
|
+
if (!armed) return void 0;
|
|
1633
|
+
const timer = setTimeout(() => setArmed(false), LONG_TASK_STOP_ARM_MS);
|
|
1634
|
+
return () => clearTimeout(timer);
|
|
1635
|
+
}, [armed]);
|
|
1636
|
+
const onStopPress = () => {
|
|
1637
|
+
if (stop === void 0) return;
|
|
1638
|
+
const press = longTaskStopPress(longTaskStopStage({
|
|
1639
|
+
armed,
|
|
1640
|
+
busy
|
|
1641
|
+
}));
|
|
1642
|
+
if (press === "ignore") return;
|
|
1643
|
+
if (press === "arm") {
|
|
1644
|
+
setArmed(true);
|
|
1645
|
+
return;
|
|
1646
|
+
}
|
|
1647
|
+
setArmed(false);
|
|
1648
|
+
stop.onStop();
|
|
1649
|
+
};
|
|
1785
1650
|
return h("div", { className: "wb-longTask" }, h("p", { className: "wb-longTaskHead" }, h(StateDot, {
|
|
1786
1651
|
state: longTaskDot(props.status),
|
|
1787
1652
|
size: 10
|
|
@@ -1789,7 +1654,18 @@ function LongTaskRow(props) {
|
|
|
1789
1654
|
href: link.href,
|
|
1790
1655
|
key: `${link.text}@${link.href}`,
|
|
1791
1656
|
text: link.text
|
|
1792
|
-
}))
|
|
1657
|
+
})), stop === void 0 ? null : h("button", {
|
|
1658
|
+
type: "button",
|
|
1659
|
+
className: `wb-longTaskStop${armed ? " wb-longTaskStopArmed" : ""}`,
|
|
1660
|
+
"data-stop-state": longTaskStopStage({
|
|
1661
|
+
armed,
|
|
1662
|
+
busy
|
|
1663
|
+
}),
|
|
1664
|
+
"aria-label": armed ? stop.armedLabel ?? stop.askLabel : stop.label,
|
|
1665
|
+
disabled: busy,
|
|
1666
|
+
onClick: onStopPress,
|
|
1667
|
+
onBlur: () => setArmed(false)
|
|
1668
|
+
}, h(IconStopFillRegular, { size: 12 }), armed ? h("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(DisclosureRow, {
|
|
1793
1669
|
className: "wb-longTaskDump",
|
|
1794
1670
|
icon: h(IconFlatListOutlineRegular, { size: 14 }),
|
|
1795
1671
|
title: props.stepsTitle,
|
|
@@ -1871,25 +1747,6 @@ function EmptyState({ text, icon = null, compact = false }) {
|
|
|
1871
1747
|
});
|
|
1872
1748
|
}
|
|
1873
1749
|
//#endregion
|
|
1874
|
-
//#region ../shared/dist/components/Rows.js
|
|
1875
|
-
/**
|
|
1876
|
-
* 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
|
|
1877
|
-
* @param props.children - 一串 `Row`。
|
|
1878
|
-
* @returns 竖排的 div。
|
|
1879
|
-
*/
|
|
1880
|
-
function Rows({ children }) {
|
|
1881
|
-
return h("div", { className: "wb-rows" }, children);
|
|
1882
|
-
}
|
|
1883
|
-
/**
|
|
1884
|
-
* 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
|
|
1885
|
-
* @param props.label - 左边那格(键)。
|
|
1886
|
-
* @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
|
|
1887
|
-
* @returns 一行两格。
|
|
1888
|
-
*/
|
|
1889
|
-
function Row({ label, value }) {
|
|
1890
|
-
return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
|
|
1891
|
-
}
|
|
1892
|
-
//#endregion
|
|
1893
1750
|
//#region ../shared/dist/components/SaveBar.js
|
|
1894
1751
|
/**
|
|
1895
1752
|
* 设置面底下那条"取消 / 保存":就是 `FormActions` 的两颗固定动作,顺序与间距不归调用点。
|
|
@@ -2577,893 +2434,897 @@ function writeFlag(key, value) {
|
|
|
2577
2434
|
writeText(key, value ? "true" : "false");
|
|
2578
2435
|
}
|
|
2579
2436
|
//#endregion
|
|
2580
|
-
//#region ../shared/dist/i18n/en.js
|
|
2581
|
-
/** 外壳自带的英文词表:键必须与 `zh` 逐一对应,值不许为空串。 */
|
|
2582
|
-
var en = {
|
|
2583
|
-
"brand.name": "Workbench",
|
|
2584
|
-
"toggle.open": "Open sidebar",
|
|
2585
|
-
"toggle.collapse": "Collapse sidebar",
|
|
2586
|
-
"project.label": "Switch project",
|
|
2587
|
-
"workspace.section": "Workspaces",
|
|
2588
|
-
"project.none": "No project",
|
|
2589
|
-
"project.empty": "No projects yet. Use “Add project” below.",
|
|
2590
|
-
"project.add": "Add project…",
|
|
2591
|
-
"project.add.busy": "Creating the workspace…",
|
|
2592
|
-
"project.add.failed": "Creating the workspace failed",
|
|
2593
|
-
"project.search.label": "Search workspaces",
|
|
2594
|
-
"project.search.placeholder": "Search workspaces (folder / name / path)",
|
|
2595
|
-
"project.search.empty": "No workspace matches “{query}”.",
|
|
2596
|
-
"project.group.workspaces": "Workspaces",
|
|
2597
|
-
"project.group.defaultWorkspace": "Default workspace",
|
|
2598
|
-
"project.group.workshop": "Workshop",
|
|
2599
|
-
"project.rename.row": "Rename “{name}”",
|
|
2600
|
-
"project.rename.current": "Give this workspace a display name…",
|
|
2601
|
-
"project.rename.title": "Give “{name}” a display name",
|
|
2602
|
-
"project.rename.description": "Shown after the folder name. It renames the workspace itself.",
|
|
2603
|
-
"project.rename.field": "Display name",
|
|
2604
|
-
"project.rename.placeholder": "e.g. Workbench shell",
|
|
2605
|
-
"project.rename.hint": "Empty = folder name only",
|
|
2606
|
-
"project.rename.save": "Save",
|
|
2607
|
-
"project.rename.saving": "Saving…",
|
|
2608
|
-
"project.rename.cancel": "Cancel",
|
|
2609
|
-
"project.rename.failed": "Rename failed. Try again.",
|
|
2610
|
-
"session.new": "New session",
|
|
2611
|
-
"session.new.label": "Start a session in the current project",
|
|
2612
|
-
"session.empty": "No sessions in this project yet.",
|
|
2613
|
-
"session.noProject": "Add a project first.",
|
|
2614
|
-
"session.list.label": "Sessions",
|
|
2615
|
-
"session.copy": "Copy",
|
|
2616
|
-
"session.pinned": "Pinned",
|
|
2617
|
-
"session.actions": "Actions for {name}",
|
|
2618
|
-
"status.idle": "Idle",
|
|
2619
|
-
"status.running": "Running",
|
|
2620
|
-
"status.waitingApproval": "Waiting for approval",
|
|
2621
|
-
"status.planReview": "Plan awaiting review",
|
|
2622
|
-
"status.waitingAnswer": "Waiting for your answer",
|
|
2623
|
-
"status.compact.approval": "Approval",
|
|
2624
|
-
"status.compact.planReview": "Plan review",
|
|
2625
|
-
"status.compact.answer": "Answer",
|
|
2626
|
-
"status.completed": "Completed",
|
|
2627
|
-
"status.subagentsRunning.one": "{n} subagent running",
|
|
2628
|
-
"status.subagentsRunning.other": "{n} subagents running",
|
|
2629
|
-
"project.attention.warning.one": "1 session waiting for you",
|
|
2630
|
-
"project.attention.warning.other": "{n} sessions waiting for you",
|
|
2631
|
-
"project.attention.running.one": "1 session running",
|
|
2632
|
-
"project.attention.running.other": "{n} sessions running",
|
|
2633
|
-
"project.attention.done.one": "1 session finished, unread",
|
|
2634
|
-
"project.attention.done.other": "{n} sessions finished, unread",
|
|
2635
|
-
"project.attention.state.warning": "Approval",
|
|
2636
|
-
"project.attention.state.running": "Running",
|
|
2637
|
-
"project.attention.state.done": "New",
|
|
2638
|
-
"hover.copied": "Copied",
|
|
2639
|
-
"time.now": "just now",
|
|
2640
|
-
"time.minutes": "{n} min ago",
|
|
2641
|
-
"time.hours": "{n} h ago",
|
|
2642
|
-
"time.days": "{n} d ago",
|
|
2643
|
-
"time.ago": "{t} ago",
|
|
2644
|
-
"time.short.minutes": "{n}min",
|
|
2645
|
-
"time.short.hours": "{n}h",
|
|
2646
|
-
"time.short.days": "{n}d",
|
|
2647
|
-
"time.short.months": "{n}mo",
|
|
2648
|
-
"time.short.years": "{n}y",
|
|
2649
|
-
"panels.title": "Panel modules",
|
|
2650
|
-
"panels.groupBoardless": "No-board modules",
|
|
2651
|
-
"panels.groupPlugins": "opencli plugins",
|
|
2652
|
-
"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.",
|
|
2653
|
-
"panels.market.defaultLabel": "On by default everywhere",
|
|
2654
|
-
"panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
|
|
2655
|
-
"panels.followAll": "Restore the default everywhere",
|
|
2656
|
-
"panels.followAllConfirmTitle": "Restore the default everywhere?",
|
|
2657
|
-
"panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
|
|
2658
|
-
"panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
|
|
2659
|
-
"panels.followAllConfirmYes": "Restore",
|
|
2660
|
-
"panels.followAllConfirmNo": "Cancel",
|
|
2661
|
-
"panels.enabled": "enabled in this project",
|
|
2662
|
-
"panels.disabled": "not enabled in this project",
|
|
2663
|
-
"panels.choose": "Choose modules",
|
|
2664
|
-
"panels.buildModule": "Build a module",
|
|
2665
|
-
"panels.failed": "Could not save the change. Try again.",
|
|
2666
|
-
"panels.dragHint": "Drag to reorder",
|
|
2667
|
-
"panels.unknownStep": "No suite provides this view",
|
|
2668
|
-
"panels.labelWithHint": "{label} ({hint})",
|
|
2669
|
-
"panels.hintJoin": "; ",
|
|
2670
|
-
"panels.dep.failed": "⚠ failed to start",
|
|
2671
|
-
"panels.dep.missingPlugin": "⚠ not ready yet",
|
|
2672
|
-
"panels.dep.missingCommands": "⚠ needs an update",
|
|
2673
|
-
"panels.dep.unchecked": "⚠ cannot check",
|
|
2674
|
-
"panels.tab.modules": "Panel setup",
|
|
2675
|
-
"panels.tab.market": "Workbench module market",
|
|
2676
|
-
"panels.browseMarket": "Browse the module market",
|
|
2677
|
-
"panels.noneInstalled": "None of these modules has its plugin installed yet",
|
|
2678
|
-
"panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
|
|
2679
|
-
"panels.market.installed": "installed",
|
|
2680
|
-
"panels.market.notActive": "not active",
|
|
2681
|
-
"panels.market.notUsable": "unusable",
|
|
2682
|
-
"panels.market.broken": "broken",
|
|
2683
|
-
"panels.market.hasNew": "New version",
|
|
2684
|
-
"panels.market.hasProblem": "Module problem",
|
|
2685
|
-
"panels.market.missing": "not installed",
|
|
2686
|
-
"panels.market.unchecked": "unknown",
|
|
2687
|
-
"panels.market.checking": "checking",
|
|
2688
|
-
"panels.market.sectionInstalled": "Installed modules",
|
|
2689
|
-
"panels.market.sectionPending": "Not installed",
|
|
2690
|
-
"panels.market.sectionShared": "Shared dependencies",
|
|
2691
|
-
"panels.market.sharedUsedBy": "Used by module {modules}",
|
|
2692
|
-
"panels.market.listSeparator": ", ",
|
|
2693
|
-
"panels.market.sharedMissing": "not installed",
|
|
2694
|
-
"panels.market.sharedOutdated": "update available",
|
|
2695
|
-
"panels.market.sharedUnsatisfied": "wrong version",
|
|
2696
|
-
"panels.market.sharedOk": "installed",
|
|
2697
|
-
"panels.market.versionArrow": "{from} → {to}",
|
|
2698
|
-
"panels.market.lead": "Installed on this machine, shared by every project.",
|
|
2699
|
-
"panels.market.install": "Install",
|
|
2700
|
-
"panels.market.update": "Update",
|
|
2701
|
-
"panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
|
|
2702
|
-
"panels.market.uninstall": "Uninstall",
|
|
2703
|
-
"panels.market.uninstallLabel": "Uninstall {name}",
|
|
2704
|
-
"panels.market.installing": "Installing…",
|
|
2705
|
-
"panels.market.updating": "Updating…",
|
|
2706
|
-
"panels.market.uninstalling": "Uninstalling…",
|
|
2707
|
-
"panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
|
|
2708
|
-
"panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
|
|
2709
|
-
"panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
|
|
2710
|
-
"panels.market.confirmYes": "Uninstall",
|
|
2711
|
-
"panels.market.confirmNo": "Cancel",
|
|
2712
|
-
"panels.market.failed": "Failed: {reason}",
|
|
2713
|
-
"panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
|
|
2714
|
-
"panels.market.needCommands": "Missing commands: {commands}",
|
|
2715
|
-
"panels.market.localMark": "local",
|
|
2716
|
-
"panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
|
|
2717
|
-
"panels.market.noSource": "This module declares no install method — install it yourself",
|
|
2718
|
-
"panels.market.badSource": "The install method is incomplete — install it yourself",
|
|
2719
|
-
"panels.market.empty": "No modules available",
|
|
2720
|
-
"panels.market.sectionPlugins": "Installed opencli plugins",
|
|
2721
|
-
"panels.market.moduleOutdated": "update available",
|
|
2722
|
-
"panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
|
|
2723
|
-
"panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
|
|
2724
|
-
"panels.market.moduleRestartHint": "restart dsh once to bring it up",
|
|
2725
|
-
"panels.market.pendingRestart": "restart required",
|
|
2726
|
-
"panels.market.workbenchName": "Workbench",
|
|
2727
|
-
"panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
|
|
2728
|
-
"panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
|
|
2729
|
-
"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.",
|
|
2730
|
-
"panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
|
|
2731
|
-
"panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
|
|
2732
|
-
"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.",
|
|
2733
|
-
"panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
|
|
2734
|
-
"panels.market.foot": "After installing, enable it in the panel page of that project.",
|
|
2735
|
-
"panels.market.recheck": "Check for updates",
|
|
2736
|
-
"panels.market.checkUpdates": "Check for updates",
|
|
2737
|
-
"panels.market.checkedAt": "Last checked: {time}",
|
|
2738
|
-
"panels.market.justNow": "just now",
|
|
2739
|
-
"panels.market.minutesAgo": "{n} min ago",
|
|
2740
|
-
"panels.market.hoursAgo": "{n} h ago",
|
|
2741
|
-
"panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
|
|
2742
|
-
"panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
|
|
2743
|
-
"panels.market.add.guideToggle": "Install guide and examples",
|
|
2744
|
-
"panels.market.add.guideHide": "Hide guide",
|
|
2745
|
-
"panels.market.add.guideIdTitle": "Package name",
|
|
2746
|
-
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
2747
|
-
"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.",
|
|
2748
|
-
"panels.market.add.guideGitTitle": "Git URL",
|
|
2749
|
-
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
2750
|
-
"panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
|
|
2751
|
-
"panels.market.add.guidePathTitle": "Local module directory",
|
|
2752
|
-
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
2753
|
-
"panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
|
|
2754
|
-
"panels.market.add.guideExampleLabel": "Example:",
|
|
2755
|
-
"panels.market.add.guideFill": "Fill in",
|
|
2756
|
-
"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.",
|
|
2757
|
-
"panels.market.add.registryLegend": "Which npm registry to download from",
|
|
2758
|
-
"panels.market.add.registryOfficial": "npm registry",
|
|
2759
|
-
"panels.market.add.registryMirror": "China mirror",
|
|
2760
|
-
"panels.market.add.registryWithHost": "{name} ({host})",
|
|
2761
|
-
"panels.market.add.registryToggle": "Source",
|
|
2762
|
-
"panels.market.add.installVersion": "Version {version}",
|
|
2763
|
-
"panels.market.add.registryDefault": "Default source",
|
|
2764
|
-
"panels.market.add.registryCustom": "Custom address",
|
|
2765
|
-
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
2766
|
-
"panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
|
|
2767
|
-
"panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
|
|
2768
|
-
"panels.market.add.run": "Install",
|
|
2769
|
-
"panels.market.add.edit": "Edit",
|
|
2770
|
-
"panels.market.add.changeRegistry": "Change source",
|
|
2771
|
-
"panels.market.add.installingTitle": "Installing the module…",
|
|
2772
|
-
"panels.market.add.installedTitle": "Installed",
|
|
2773
|
-
"panels.market.add.failedTitle": "Module install failed",
|
|
2774
|
-
"panels.market.add.cancelledTitle": "Cancelled",
|
|
2775
|
-
"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.",
|
|
2776
|
-
"panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
|
|
2777
|
-
"panels.market.add.problemInstalled": "This module is already installed",
|
|
2778
|
-
"panels.market.add.problemNotFound": "No such module found",
|
|
2779
|
-
"panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
|
|
2780
|
-
"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.",
|
|
2781
|
-
"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.",
|
|
2782
|
-
"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.",
|
|
2783
|
-
"panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
|
|
2784
|
-
"panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
|
|
2785
|
-
"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.",
|
|
2786
|
-
"panels.market.add.pluginAlias": "Plugin name: {name}",
|
|
2787
|
-
"panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
|
|
2788
|
-
"panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
|
|
2789
|
-
"panels.market.add.failureNetwork": "The network connection failed",
|
|
2790
|
-
"panels.market.add.failureNotFound": "No such module found",
|
|
2791
|
-
"panels.market.add.failureNoMatchingVersion": "No matching version",
|
|
2792
|
-
"panels.market.add.failureDiskFull": "Out of disk space, install stopped",
|
|
2793
|
-
"panels.market.add.failurePermission": "No write permission, cannot install",
|
|
2794
|
-
"panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
|
|
2795
|
-
"panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
|
|
2796
|
-
"panels.market.add.failureTimeout": "The install timed out",
|
|
2797
|
-
"panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
|
|
2798
|
-
"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",
|
|
2799
|
-
"panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
|
|
2800
|
-
"panels.market.add.approveTitle": "Your approval is needed for install scripts",
|
|
2801
|
-
"panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
|
|
2802
|
-
"panels.market.add.approveRun": "Allow and continue installing",
|
|
2803
|
-
"panels.market.add.restart": "Installed — restart once to pick it up.",
|
|
2804
|
-
"panels.market.add.tookEffect": "Live.",
|
|
2805
|
-
"panels.market.add.details": "Install details",
|
|
2806
|
-
"panels.market.add.open": "Add module",
|
|
2807
|
-
"panels.market.add.title": "Add module",
|
|
2808
|
-
"panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
|
|
2809
|
-
"panels.market.add.specLabel": "Package",
|
|
2810
|
-
"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.",
|
|
2811
|
-
"panels.market.add.exampleTitle": "Examples",
|
|
2812
|
-
"panels.market.add.exampleFill": "Fill in an example",
|
|
2813
|
-
"panels.market.add.registryLabel": "Source",
|
|
2814
|
-
"panels.market.add.registryProfile": "This profile's registry",
|
|
2815
|
-
"panels.market.add.registryPnpm": "pnpm's own registry",
|
|
2816
|
-
"panels.market.add.check": "Check",
|
|
2817
|
-
"panels.market.add.checking": "Checking…",
|
|
2818
|
-
"panels.market.add.classifying": "Checking…",
|
|
2819
|
-
"panels.market.add.change": "Edit",
|
|
2820
|
-
"panels.market.add.previewTitle": "About to install",
|
|
2821
|
-
"panels.market.add.fieldName": "Package",
|
|
2822
|
-
"panels.market.add.fieldVersion": "Version",
|
|
2823
|
-
"panels.market.add.fieldDescription": "Description",
|
|
2824
|
-
"panels.market.add.fieldSource": "Source",
|
|
2825
|
-
"panels.market.add.install": "Install",
|
|
2826
|
-
"panels.market.add.installing": "Installing…",
|
|
2827
|
-
"panels.market.add.cancel": "Cancel install",
|
|
2828
|
-
"panels.market.add.close": "Close",
|
|
2829
|
-
"panels.market.add.retry": "Retry",
|
|
2830
|
-
"panels.market.add.changeSource": "Change source",
|
|
2831
|
-
"panels.market.add.approveBuilds": "Allow these scripts and retry",
|
|
2832
|
-
"panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
|
|
2833
|
-
"panels.market.add.doneApplied": "Installed and live.",
|
|
2834
|
-
"panels.market.add.doneRestart": "Installed — restart once to pick it up.",
|
|
2835
|
-
"panels.market.add.restartWhy": "Why this needs a restart: {reason}",
|
|
2836
|
-
"panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
|
|
2837
|
-
"panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
|
|
2838
|
-
"panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
|
|
2839
|
-
"panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
|
|
2840
|
-
"panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
|
|
2841
|
-
"panels.market.add.cancelled": "Cancelled.",
|
|
2842
|
-
"panels.market.add.failed": "Didn't work: {reason}",
|
|
2843
|
-
"panels.market.add.removed": "It has been removed.",
|
|
2844
|
-
"panels.market.add.supplyPending": "Its plugins install after you restart.",
|
|
2845
|
-
"panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
|
|
2846
|
-
"panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
|
|
2847
|
-
"panels.market.add.removedRestart": "Removed — restart once to finish.",
|
|
2848
|
-
"panels.market.add.remove": "Remove it",
|
|
2849
|
-
"panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
|
|
2850
|
-
"panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
|
|
2851
|
-
"panels.market.add.problem.notFound": "No such package on that source.",
|
|
2852
|
-
"panels.market.add.problem.notAPackage": "There is no package at that location.",
|
|
2853
|
-
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
|
|
2854
|
-
"panels.market.add.problem.network": "The source is unreachable.",
|
|
2855
|
-
"panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
|
|
2856
|
-
"panels.market.add.reason.invalidSpec": "the spec is not accepted",
|
|
2857
|
-
"panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
|
|
2858
|
-
"panels.market.add.reason.notBundle": "it is not a dsh plugin package",
|
|
2859
|
-
"panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
|
|
2860
|
-
"panels.market.add.reason.bundleInUse": "something is still using it",
|
|
2861
|
-
"panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
|
|
2862
|
-
"panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
|
|
2863
|
-
"panels.market.add.reason.operationError": "pnpm failed (see the install output)",
|
|
2864
|
-
"panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
|
|
2865
|
-
"panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
|
|
2866
|
-
"panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
|
|
2867
|
-
"panels.market.add.reason.diskFull": "the disk is full",
|
|
2868
|
-
"panels.market.add.reason.permission": "no permission to write",
|
|
2869
|
-
"panels.market.add.reason.integrity": "the download failed its integrity check",
|
|
2870
|
-
"panels.market.add.reason.timeout": "no output for too long, so it was stopped",
|
|
2871
|
-
"panels.market.add.reason.network": "the network is unreachable",
|
|
2872
|
-
"panels.market.add.reason.notFound": "no such package on the source",
|
|
2873
|
-
"panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
|
|
2874
|
-
"blocker.fix.install": "Install for me",
|
|
2875
|
-
"blocker.fix.update": "Upgrade for me",
|
|
2876
|
-
"blocker.fix.running": "Running…",
|
|
2877
|
-
"blocker.fix.failed": "Failed: ",
|
|
2878
|
-
"blocker.retry": "Retry",
|
|
2879
|
-
"blocker.retry.running": "Retrying…",
|
|
2880
|
-
"blocker.copy": "Copy command",
|
|
2881
|
-
"blocker.market.open": "Open the module market",
|
|
2882
|
-
"blocker.login.title": "Sign in to {platform}",
|
|
2883
|
-
"blocker.login.titleGeneric": "Sign-in required",
|
|
2884
|
-
"blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
|
|
2885
|
-
"blocker.login.go": "Go sign in",
|
|
2886
|
-
"blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
|
|
2887
|
-
"blocker.forbidden.title": "No access to {platform}",
|
|
2888
|
-
"blocker.forbidden.titleGeneric": "No access",
|
|
2889
|
-
"blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
|
|
2890
|
-
"blocker.forbidden.open": "Open permissions page",
|
|
2891
|
-
"blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
|
|
2892
|
-
"blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
|
|
2893
|
-
"blocker.unknown.title": "Something went wrong",
|
|
2894
|
-
"panels.reading": "Reading the panel setup…",
|
|
2895
|
-
"panels.cardBroken": "This module will not render: {unit} ({reason})",
|
|
2896
|
-
"panels.cardRetry": "Retry",
|
|
2897
|
-
"panels.empty": "No modules on the panel yet",
|
|
2898
|
-
"panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
|
|
2899
|
-
"env.title": "Preparing the workbench",
|
|
2900
|
-
"env.checking": "Checking the runtime environment…",
|
|
2901
|
-
"env.installing": "Installing the missing dependency…",
|
|
2902
|
-
"env.failed": "One step away",
|
|
2903
|
-
"env.elapsed": "Waiting {seconds}s",
|
|
2904
|
-
"env.stepFailed.install": "install failed",
|
|
2905
|
-
"env.stepFailed.path": "installed but not found",
|
|
2906
|
-
"env.stepFailed.shell": "no shell channel",
|
|
2907
|
-
"env.bridge.ok": "Connected",
|
|
2908
|
-
"env.bridge.short": "Not connected",
|
|
2909
|
-
"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.",
|
|
2910
|
-
"env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
|
|
2911
|
-
"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.",
|
|
2912
|
-
"env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
|
|
2913
|
-
"env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
|
|
2914
|
-
"env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
|
|
2915
|
-
"env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
|
|
2916
|
-
"env.fix.title": "How to fix it",
|
|
2917
|
-
"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.",
|
|
2918
|
-
"env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
|
|
2919
|
-
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
|
|
2920
|
-
"env.fix.step": "Run this in a terminal, then hit Retry:",
|
|
2921
|
-
"env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
|
|
2922
|
-
"env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
|
|
2923
|
-
"env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
|
|
2924
|
-
"env.fix.network": "Network unreachable: check your network or proxy, then retry.",
|
|
2925
|
-
"env.fix.details": "Details (for troubleshooting)",
|
|
2926
|
-
"env.retry": "Retry",
|
|
2927
|
-
"env.copyCommand": "Copy command",
|
|
2928
|
-
"env.copied": "Copied",
|
|
2929
|
-
"env.step.opencli": "Checking the workbench opencli",
|
|
2930
|
-
"env.step.codingPlugin": "Checking the coding plugin",
|
|
2931
|
-
"env.step.bridge": "Checking the browser bridge",
|
|
2932
|
-
"env.step.warm": "Warming up site sessions",
|
|
2933
|
-
"env.warm.done": "{n} site(s) warmed up",
|
|
2934
|
-
"env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
|
|
2935
|
-
"env.unit.failed": "This module cannot start",
|
|
2936
|
-
"env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
|
|
2937
|
-
"env.unit.missingPlugin": "This module is not ready yet",
|
|
2938
|
-
"env.unit.missingCommandsHint": "Updating it should fix this.",
|
|
2939
|
-
"env.unit.unchecked": "Cannot check: no shell channel",
|
|
2940
|
-
"env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
|
|
2941
|
-
"env.unit.missingCommands": "This module is out of date",
|
|
2942
|
-
"env.unit.hint": "Retry after installing; other modules are unaffected.",
|
|
2943
|
-
"rightbar.label": "Data panels",
|
|
2944
|
-
"rightbar.expand": "Expand the data panel",
|
|
2945
|
-
"rightbar.collapse": "Collapse the data panel",
|
|
2946
|
-
"rightbar.column.label": "Right column",
|
|
2947
|
-
"rightbar.column.workbench": "Workbench panel",
|
|
2948
|
-
"rightbar.column.dsh": "dsh panel",
|
|
2949
|
-
"rightbar.refresh": "Refresh",
|
|
2950
|
-
"rightbar.refreshing": "Refreshing…",
|
|
2951
|
-
"rightbar.updatedAt": "updated {time}",
|
|
2952
|
-
"rightbar.noProject": "The current session has no workspace",
|
|
2953
|
-
"rightbar.openPlatform": "Open on the platform",
|
|
2954
|
-
"coding.notARepo.title": "This workspace is not a Coding repository",
|
|
2955
|
-
"error.unknown": "Something went wrong",
|
|
2956
|
-
"board.title": "Workbench panel",
|
|
2957
|
-
"panel.conversation": "Conversation",
|
|
2958
|
-
"panels.label": "Global panels",
|
|
2959
|
-
"configSync.nav": "Config sync",
|
|
2960
|
-
"configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
|
|
2961
|
-
"configSync.source": "Source",
|
|
2962
|
-
"configSync.sourceBroken": "its config is unreadable",
|
|
2963
|
-
"configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
|
|
2964
|
-
"configSync.sourceDead": "unreadable",
|
|
2965
|
-
"configSync.refresh": "Read again",
|
|
2966
|
-
"configSync.loading": "Reading the source config…",
|
|
2967
|
-
"configSync.readHint": "Pick another source, or read again.",
|
|
2968
|
-
"configSync.tag.new": "New",
|
|
2969
|
-
"configSync.tag.differs": "Differs",
|
|
2970
|
-
"configSync.conflictNote": "Applying replaces this workbench copy with the source",
|
|
2971
|
-
"configSync.code.lang": "yaml",
|
|
2972
|
-
"configSync.code.copy": "Copy",
|
|
2973
|
-
"configSync.code.copied": "Copied",
|
|
2974
|
-
"configSync.code.wrap": "Wrap lines",
|
|
2975
|
-
"configSync.code.unwrap": "No wrap",
|
|
2976
|
-
"configSync.code.collapse": "Collapse",
|
|
2977
|
-
"configSync.code.collapseAria": "Collapse this row",
|
|
2978
|
-
"configSync.code.expandAria": "Expand the diff ({count} more lines)",
|
|
2979
|
-
"configSync.code.expand": "Show {count} more lines",
|
|
2980
|
-
"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",
|
|
2981
|
-
"configSync.apply": "Sync {count} selected",
|
|
2982
|
-
"configSync.applyNone": "Pick some rows first",
|
|
2983
|
-
"configSync.applying": "Writing…",
|
|
2984
|
-
"configSync.applied": "Written to the workbench config · applied",
|
|
2985
|
-
"configSync.appliedIds": "Written this time: {ids}",
|
|
2986
|
-
"configSync.skippedIds": "Left alone (already here): {ids}",
|
|
2987
|
-
"configSync.nothing": "Nothing to sync",
|
|
2988
|
-
"configSync.unreadable": "Cannot read {path}: {reason}",
|
|
2989
|
-
"configSync.noSource": "This machine has no other profile to sync from",
|
|
2990
|
-
"configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
|
|
2991
|
-
"configSync.failed": "The sync did not go through; try again.",
|
|
2992
|
-
"debug.workspace": "this workspace",
|
|
2993
|
-
"debug.status": "Debugging “{title}”",
|
|
2994
|
-
"debug.status.trouble": "Debugging needs your attention ({title})",
|
|
2995
|
-
"debug.stalled": "Debugging paused ({title})",
|
|
2996
|
-
"debug.act.pause": "Pause debugging",
|
|
2997
|
-
"debug.act.resume": "Resume debugging",
|
|
2998
|
-
"debug.act.stop": "Stop debugging",
|
|
2999
|
-
"debug.act.stop.ask": "Confirm stop",
|
|
3000
|
-
"debug.card.here.title": "Debugging “{title}”",
|
|
3001
|
-
"debug.card.here.note": "Do not switch workspaces or touch the panel",
|
|
3002
|
-
"debug.card.away.note": "Switch back to “{title}”",
|
|
3003
|
-
"debug.card.paused.note": "Paused",
|
|
3004
|
-
"debug.card.hidden.note": "Switch back to the Workbench panel",
|
|
3005
|
-
"record.waiting": "Recording handoff · your turn",
|
|
3006
|
-
"record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
|
|
3007
|
-
"record.recording": "Recording",
|
|
3008
|
-
"record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
|
|
3009
|
-
"record.finished": "Recording finished",
|
|
3010
|
-
"record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
|
|
3011
|
-
"record.act.cancel": "Cancel",
|
|
3012
|
-
"record.act.halt": "Halt",
|
|
3013
|
-
"approval.record.site": "Site",
|
|
3014
|
-
"approval.record.what": "Records",
|
|
3015
|
-
"approval.record.lands": "Lands in",
|
|
3016
|
-
"approval.record.noUrl": "no site given (this call gets refused)",
|
|
3017
|
-
"approval.record.oneAction": "one action",
|
|
3018
|
-
"approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)"
|
|
3019
|
-
};
|
|
3020
|
-
//#endregion
|
|
3021
|
-
//#region ../shared/dist/i18n/zh.js
|
|
3022
|
-
/** 外壳自带的中文词表(命名空间 `workbench`):`en` 与它逐键对齐,模块那份在它之上合并。 */
|
|
3023
|
-
var zh = {
|
|
3024
|
-
"brand.name": "工作台",
|
|
3025
|
-
"toggle.open": "打开侧边栏",
|
|
3026
|
-
"toggle.collapse": "收起侧边栏",
|
|
3027
|
-
"project.label": "切换项目",
|
|
3028
|
-
"workspace.section": "工作区",
|
|
3029
|
-
"project.none": "未选择项目",
|
|
3030
|
-
"project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
|
|
3031
|
-
"project.add": "添加项目…",
|
|
3032
|
-
"project.add.busy": "正在新建工作区…",
|
|
3033
|
-
"project.add.failed": "新建工作区没成功",
|
|
3034
|
-
"project.search.label": "搜索工作区",
|
|
3035
|
-
"project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
|
|
3036
|
-
"project.search.empty": "没有匹配「{query}」的工作区。",
|
|
3037
|
-
"project.group.workspaces": "工作区",
|
|
3038
|
-
"project.group.defaultWorkspace": "默认工作区",
|
|
3039
|
-
"project.group.workshop": "工坊",
|
|
3040
|
-
"project.rename.row": "改「{name}」的中文名",
|
|
3041
|
-
"project.rename.current": "改当前工作区的中文名…",
|
|
3042
|
-
"project.rename.title": "给「{name}」配一个中文名",
|
|
3043
|
-
"project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
|
|
3044
|
-
"project.rename.field": "中文名",
|
|
3045
|
-
"project.rename.placeholder": "例如:工作台外壳",
|
|
3046
|
-
"project.rename.hint": "留空 = 只显示目录名",
|
|
3047
|
-
"project.rename.save": "保存",
|
|
3048
|
-
"project.rename.saving": "保存中…",
|
|
3049
|
-
"project.rename.cancel": "取消",
|
|
3050
|
-
"project.rename.failed": "改名失败了,再试一次。",
|
|
3051
|
-
"session.new": "新会话",
|
|
3052
|
-
"session.new.label": "在当前项目新建会话",
|
|
3053
|
-
"session.empty": "这个项目还没有会话。",
|
|
3054
|
-
"session.noProject": "先添加一个项目。",
|
|
3055
|
-
"session.list.label": "会话",
|
|
3056
|
-
"session.copy": "复制",
|
|
3057
|
-
"session.pinned": "已置顶",
|
|
3058
|
-
"session.actions": "{name} 的操作",
|
|
3059
|
-
"status.idle": "空闲",
|
|
3060
|
-
"status.running": "进行中",
|
|
3061
|
-
"status.waitingApproval": "等待审批",
|
|
3062
|
-
"status.planReview": "计划待审",
|
|
3063
|
-
"status.waitingAnswer": "等待回答",
|
|
3064
|
-
"status.compact.approval": "待审批",
|
|
3065
|
-
"status.compact.planReview": "计划待审",
|
|
3066
|
-
"status.compact.answer": "待回答",
|
|
3067
|
-
"status.completed": "已完成",
|
|
3068
|
-
"status.subagentsRunning.one": "{n} 个子代理运行中",
|
|
3069
|
-
"status.subagentsRunning.other": "{n} 个子代理运行中",
|
|
3070
|
-
"project.attention.warning.one": "1 个会话在等你点头",
|
|
3071
|
-
"project.attention.warning.other": "{n} 个会话在等你点头",
|
|
3072
|
-
"project.attention.running.one": "1 个会话在跑",
|
|
3073
|
-
"project.attention.running.other": "{n} 个会话在跑",
|
|
3074
|
-
"project.attention.done.one": "1 个会话跑完没看",
|
|
3075
|
-
"project.attention.done.other": "{n} 个会话跑完没看",
|
|
3076
|
-
"project.attention.state.warning": "待审批",
|
|
3077
|
-
"project.attention.state.running": "在跑",
|
|
3078
|
-
"project.attention.state.done": "新消息",
|
|
3079
|
-
"hover.copied": "已复制",
|
|
3080
|
-
"time.now": "刚刚",
|
|
3081
|
-
"time.minutes": "{n} 分钟前",
|
|
3082
|
-
"time.hours": "{n} 小时前",
|
|
3083
|
-
"time.days": "{n} 天前",
|
|
3084
|
-
"time.ago": "{t}前",
|
|
3085
|
-
"time.short.minutes": "{n}分钟",
|
|
3086
|
-
"time.short.hours": "{n}小时",
|
|
3087
|
-
"time.short.days": "{n}天",
|
|
3088
|
-
"time.short.months": "{n}个月",
|
|
3089
|
-
"time.short.years": "{n}年",
|
|
3090
|
-
"panels.title": "面板模块",
|
|
3091
|
-
"panels.groupBoardless": "无看板模块",
|
|
3092
|
-
"panels.groupPlugins": "opencli 插件",
|
|
3093
|
-
"panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
|
|
3094
|
-
"panels.market.defaultLabel": "全局默认开启",
|
|
3095
|
-
"panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
|
|
3096
|
-
"panels.followAll": "全部恢复默认",
|
|
3097
|
-
"panels.followAllConfirmTitle": "全部恢复默认?",
|
|
3098
|
-
"panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
|
|
3099
|
-
"panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
|
|
3100
|
-
"panels.followAllConfirmYes": "恢复默认",
|
|
3101
|
-
"panels.followAllConfirmNo": "取消",
|
|
3102
|
-
"panels.enabled": "这个项目已启用",
|
|
3103
|
-
"panels.disabled": "这个项目未启用",
|
|
3104
|
-
"panels.choose": "选择模块",
|
|
3105
|
-
"panels.buildModule": "造一个模块",
|
|
3106
|
-
"panels.failed": "改配置失败了,再试一次。",
|
|
3107
|
-
"panels.dragHint": "拖动调整顺序",
|
|
3108
|
-
"panels.unknownStep": "这一层没有套件提供",
|
|
3109
|
-
"panels.labelWithHint": "{label}({hint})",
|
|
3110
|
-
"panels.hintJoin": ";",
|
|
3111
|
-
"panels.dep.failed": "⚠ 起不来",
|
|
3112
|
-
"panels.dep.missingPlugin": "⚠ 还没装好",
|
|
3113
|
-
"panels.dep.missingCommands": "⚠ 需要更新",
|
|
3114
|
-
"panels.dep.unchecked": "⚠ 检测不了",
|
|
3115
|
-
"panels.tab.modules": "面板配置",
|
|
3116
|
-
"panels.tab.market": "工作台模块市场",
|
|
3117
|
-
"panels.browseMarket": "浏览模块市场",
|
|
3118
|
-
"panels.noneInstalled": "这些模块要的插件都还没装",
|
|
3119
|
-
"panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
|
|
3120
|
-
"panels.market.installed": "已安装",
|
|
3121
|
-
"panels.market.notActive": "未生效",
|
|
3122
|
-
"panels.market.notUsable": "不可用",
|
|
3123
|
-
"panels.market.broken": "装坏了",
|
|
3124
|
-
"panels.market.hasNew": "有新版本",
|
|
3125
|
-
"panels.market.hasProblem": "模块异常",
|
|
3126
|
-
"panels.market.missing": "未装",
|
|
3127
|
-
"panels.market.unchecked": "状态未知",
|
|
3128
|
-
"panels.market.checking": "检测中",
|
|
3129
|
-
"panels.market.sectionInstalled": "已安装模块",
|
|
3130
|
-
"panels.market.sectionPending": "未安装",
|
|
3131
|
-
"panels.market.sectionShared": "共用依赖",
|
|
3132
|
-
"panels.market.sharedUsedBy": "供 {modules} 模块使用",
|
|
3133
|
-
"panels.market.listSeparator": "、",
|
|
3134
|
-
"panels.market.sharedMissing": "未装",
|
|
3135
|
-
"panels.market.sharedOutdated": "有新版",
|
|
3136
|
-
"panels.market.sharedUnsatisfied": "版本不对",
|
|
3137
|
-
"panels.market.sharedOk": "已装",
|
|
3138
|
-
"panels.market.versionArrow": "{from} → {to}",
|
|
3139
|
-
"panels.market.lead": "装在这台机器上,所有项目共用。",
|
|
3140
|
-
"panels.market.install": "安装",
|
|
3141
|
-
"panels.market.update": "更新",
|
|
3142
|
-
"panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
|
|
3143
|
-
"panels.market.uninstall": "卸载",
|
|
3144
|
-
"panels.market.uninstallLabel": "卸载 {name}",
|
|
3145
|
-
"panels.market.installing": "正在安装…",
|
|
3146
|
-
"panels.market.updating": "正在更新…",
|
|
3147
|
-
"panels.market.uninstalling": "正在卸载…",
|
|
3148
|
-
"panels.market.confirmUninstallTitle": "卸载「{name}」?",
|
|
3149
|
-
"panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
|
|
3150
|
-
"panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
|
|
3151
|
-
"panels.market.confirmYes": "卸载",
|
|
3152
|
-
"panels.market.confirmNo": "取消",
|
|
3153
|
-
"panels.market.failed": "没成功:{reason}",
|
|
3154
|
-
"panels.market.needEnv": "先在启动工作台的终端里设 {env}",
|
|
3155
|
-
"panels.market.needCommands": "缺这几条命令:{commands}",
|
|
3156
|
-
"panels.market.localMark": "本地",
|
|
3157
|
-
"panels.market.localHint": "本机那份(不从源上取)。",
|
|
3158
|
-
"panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
|
|
3159
|
-
"panels.market.badSource": "安装方式没写全,只能自己动手",
|
|
3160
|
-
"panels.market.empty": "暂无可用模块",
|
|
3161
|
-
"panels.market.sectionPlugins": "已安装 opencli 插件",
|
|
3162
|
-
"panels.market.moduleOutdated": "有新版",
|
|
3163
|
-
"panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
|
|
3164
|
-
"panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
|
|
3165
|
-
"panels.market.moduleRestartHint": "重启后生效",
|
|
3166
|
-
"panels.market.pendingRestart": "重启后生效",
|
|
3167
|
-
"panels.market.workbenchName": "工作台",
|
|
3168
|
-
"panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
|
|
3169
|
-
"panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
|
|
3170
|
-
"panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
|
|
3171
|
-
"panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
|
|
3172
|
-
"panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
|
|
3173
|
-
"panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
|
|
3174
|
-
"panels.market.restartNeeded": "新版装好了,重启一次才生效。",
|
|
3175
|
-
"panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
|
|
3176
|
-
"panels.market.recheck": "重新检查更新",
|
|
3177
|
-
"panels.market.checkUpdates": "检查更新",
|
|
3178
|
-
"panels.market.checkedAt": "最近检查:{time}",
|
|
3179
|
-
"panels.market.justNow": "刚刚",
|
|
3180
|
-
"panels.market.minutesAgo": "{n} 分钟前",
|
|
3181
|
-
"panels.market.hoursAgo": "{n} 小时前",
|
|
3182
|
-
"panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
|
|
3183
|
-
"panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
|
|
3184
|
-
"panels.market.add.guideToggle": "模块安装引导和示例",
|
|
3185
|
-
"panels.market.add.guideHide": "收起引导",
|
|
3186
|
-
"panels.market.add.guideIdTitle": "包名",
|
|
3187
|
-
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
3188
|
-
"panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
|
|
3189
|
-
"panels.market.add.guideGitTitle": "Git 仓库地址",
|
|
3190
|
-
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
3191
|
-
"panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
|
|
3192
|
-
"panels.market.add.guidePathTitle": "本地模块目录",
|
|
3193
|
-
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
3194
|
-
"panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
|
|
3195
|
-
"panels.market.add.guideExampleLabel": "示例:",
|
|
3196
|
-
"panels.market.add.guideFill": "填入示例",
|
|
3197
|
-
"panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
|
|
3198
|
-
"panels.market.add.registryLegend": "从哪个 npm 源下载模块",
|
|
3199
|
-
"panels.market.add.registryOfficial": "npm 官方源",
|
|
3200
|
-
"panels.market.add.registryMirror": "中国大陆镜像源",
|
|
3201
|
-
"panels.market.add.registryWithHost": "{name}({host})",
|
|
3202
|
-
"panels.market.add.registryToggle": "安装源",
|
|
3203
|
-
"panels.market.add.installVersion": "版本 {version}",
|
|
3204
|
-
"panels.market.add.registryDefault": "默认安装源",
|
|
3205
|
-
"panels.market.add.registryCustom": "自定义地址",
|
|
3206
|
-
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
3207
|
-
"panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
|
|
3208
|
-
"panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
|
|
3209
|
-
"panels.market.add.run": "安装",
|
|
3210
|
-
"panels.market.add.edit": "编辑",
|
|
3211
|
-
"panels.market.add.changeRegistry": "更换安装源",
|
|
3212
|
-
"panels.market.add.installingTitle": "模块安装中…",
|
|
3213
|
-
"panels.market.add.installedTitle": "已安装",
|
|
3214
|
-
"panels.market.add.failedTitle": "模块安装失败",
|
|
3215
|
-
"panels.market.add.cancelledTitle": "已取消",
|
|
3216
|
-
"panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
|
|
3217
|
-
"panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
|
|
3218
|
-
"panels.market.add.problemInstalled": "该模块已安装",
|
|
3219
|
-
"panels.market.add.problemNotFound": "未找到相关模块",
|
|
3220
|
-
"panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
|
|
3221
|
-
"panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
|
|
3222
|
-
"panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
|
|
3223
|
-
"panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
|
|
3224
|
-
"panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
|
|
3225
|
-
"panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
|
|
3226
|
-
"panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
|
|
3227
|
-
"panels.market.add.pluginAlias": "插件名:{name}",
|
|
3228
|
-
"panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
|
|
3229
|
-
"panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
|
|
3230
|
-
"panels.market.add.failureNetwork": "网络连接失败",
|
|
3231
|
-
"panels.market.add.failureNotFound": "未找到相关模块",
|
|
3232
|
-
"panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
|
|
3233
|
-
"panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
|
|
3234
|
-
"panels.market.add.failurePermission": "没有写入权限,无法安装",
|
|
3235
|
-
"panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
|
|
3236
|
-
"panels.market.add.failureIntegrity": "下载的安装包校验失败",
|
|
3237
|
-
"panels.market.add.failureTimeout": "安装超时",
|
|
3238
|
-
"panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
|
|
3239
|
-
"panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
|
|
3240
|
-
"panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
|
|
3241
|
-
"panels.market.add.approveTitle": "需要你允许安装脚本",
|
|
3242
|
-
"panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
|
|
3243
|
-
"panels.market.add.approveRun": "允许并继续安装",
|
|
3244
|
-
"panels.market.add.restart": "装好了,重启一次才生效。",
|
|
3245
|
-
"panels.market.add.tookEffect": "已生效。",
|
|
3246
|
-
"panels.market.add.details": "安装详情",
|
|
3247
|
-
"panels.market.add.open": "添加模块",
|
|
3248
|
-
"panels.market.add.title": "添加模块",
|
|
3249
|
-
"panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
|
|
3250
|
-
"panels.market.add.specLabel": "包名",
|
|
3251
|
-
"panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
|
|
3252
|
-
"panels.market.add.exampleTitle": "示例",
|
|
3253
|
-
"panels.market.add.exampleFill": "填入示例",
|
|
3254
|
-
"panels.market.add.registryLabel": "安装源",
|
|
3255
|
-
"panels.market.add.registryProfile": "这个 profile 配的源",
|
|
3256
|
-
"panels.market.add.registryPnpm": "pnpm 自己配的源",
|
|
3257
|
-
"panels.market.add.check": "预检",
|
|
3258
|
-
"panels.market.add.checking": "正在预检…",
|
|
3259
|
-
"panels.market.add.classifying": "检测中…",
|
|
3260
|
-
"panels.market.add.change": "改一下",
|
|
3261
|
-
"panels.market.add.previewTitle": "将要安装",
|
|
3262
|
-
"panels.market.add.fieldName": "包名",
|
|
3263
|
-
"panels.market.add.fieldVersion": "版本",
|
|
3264
|
-
"panels.market.add.fieldDescription": "简介",
|
|
3265
|
-
"panels.market.add.fieldSource": "来源",
|
|
3266
|
-
"panels.market.add.install": "安装",
|
|
3267
|
-
"panels.market.add.installing": "正在安装…",
|
|
3268
|
-
"panels.market.add.cancel": "取消安装",
|
|
3269
|
-
"panels.market.add.close": "关闭",
|
|
3270
|
-
"panels.market.add.retry": "重试",
|
|
3271
|
-
"panels.market.add.changeSource": "换源",
|
|
3272
|
-
"panels.market.add.approveBuilds": "允许这些脚本并重试",
|
|
3273
|
-
"panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
|
|
3274
|
-
"panels.market.add.doneApplied": "装好了,已经生效。",
|
|
3275
|
-
"panels.market.add.doneRestart": "装好了,重启一次才生效。",
|
|
3276
|
-
"panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
|
|
3277
|
-
"panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
|
|
3278
|
-
"panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
|
|
3279
|
-
"panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
|
|
3280
|
-
"panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
|
|
3281
|
-
"panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
|
|
3282
|
-
"panels.market.add.cancelled": "已取消。",
|
|
3283
|
-
"panels.market.add.failed": "没成功:{reason}",
|
|
3284
|
-
"panels.market.add.removed": "已经移除了。",
|
|
3285
|
-
"panels.market.add.supplyPending": "它要的插件重启后再装。",
|
|
3286
|
-
"panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
|
|
3287
|
-
"panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
|
|
3288
|
-
"panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
|
|
3289
|
-
"panels.market.add.remove": "移除它",
|
|
3290
|
-
"panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
|
|
3291
|
-
"panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
|
|
3292
|
-
"panels.market.add.problem.notFound": "源上没有这个包。",
|
|
3293
|
-
"panels.market.add.problem.notAPackage": "这个位置没有包。",
|
|
3294
|
-
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
|
|
3295
|
-
"panels.market.add.problem.network": "源连不上。",
|
|
3296
|
-
"panels.market.add.problem.unknown": "预检没通过(原因未知)。",
|
|
3297
|
-
"panels.market.add.reason.invalidSpec": "写法不认",
|
|
3298
|
-
"panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
|
|
3299
|
-
"panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
|
|
3300
|
-
"panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
|
|
3301
|
-
"panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
|
|
3302
|
-
"panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
|
|
3303
|
-
"panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
|
|
3304
|
-
"panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
|
|
3305
|
-
"panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
|
|
3306
|
-
"panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
|
|
3307
|
-
"panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
|
|
3308
|
-
"panels.market.add.reason.diskFull": "磁盘满了",
|
|
3309
|
-
"panels.market.add.reason.permission": "没有写权限",
|
|
3310
|
-
"panels.market.add.reason.integrity": "下载内容校验不过",
|
|
3311
|
-
"panels.market.add.reason.timeout": "太久没有输出,被中断了",
|
|
3312
|
-
"panels.market.add.reason.network": "网络不通",
|
|
3313
|
-
"panels.market.add.reason.notFound": "源上没有这个包",
|
|
3314
|
-
"panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
|
|
3315
|
-
"blocker.fix.install": "帮我安装",
|
|
3316
|
-
"blocker.fix.update": "帮我升级",
|
|
3317
|
-
"blocker.fix.running": "正在执行…",
|
|
3318
|
-
"blocker.fix.failed": "执行失败:",
|
|
3319
|
-
"blocker.retry": "重试",
|
|
3320
|
-
"blocker.retry.running": "重试中…",
|
|
3321
|
-
"blocker.copy": "复制命令",
|
|
3322
|
-
"blocker.market.open": "去模块市场",
|
|
3323
|
-
"blocker.login.title": "需要登录 {platform}",
|
|
3324
|
-
"blocker.login.titleGeneric": "需要登录",
|
|
3325
|
-
"blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
|
|
3326
|
-
"blocker.login.go": "去登录",
|
|
3327
|
-
"blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
|
|
3328
|
-
"blocker.forbidden.title": "没有权限访问 {platform}",
|
|
3329
|
-
"blocker.forbidden.titleGeneric": "没有权限",
|
|
3330
|
-
"blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
|
|
3331
|
-
"blocker.forbidden.open": "打开权限页",
|
|
3332
|
-
"blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
|
|
3333
|
-
"blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
|
|
3334
|
-
"blocker.unknown.title": "出了点问题",
|
|
3335
|
-
"panels.reading": "正在读取面板配置…",
|
|
3336
|
-
"panels.cardBroken": "这个模块起不来:{unit}({reason})",
|
|
3337
|
-
"panels.cardRetry": "重试",
|
|
3338
|
-
"panels.empty": "面板里还没有模块",
|
|
3339
|
-
"panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
|
|
3340
|
-
"env.title": "准备工作台",
|
|
3341
|
-
"env.checking": "正在检测运行环境…",
|
|
3342
|
-
"env.installing": "正在安装缺失的依赖…",
|
|
3343
|
-
"env.failed": "还差一步就能用了",
|
|
3344
|
-
"env.elapsed": "已等待 {seconds} 秒",
|
|
3345
|
-
"env.stepFailed.install": "装不上",
|
|
3346
|
-
"env.stepFailed.path": "装了但还找不到",
|
|
3347
|
-
"env.stepFailed.shell": "执行通道不可用",
|
|
3348
|
-
"env.bridge.ok": "已连接",
|
|
3349
|
-
"env.bridge.short": "没连上",
|
|
3350
|
-
"env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
|
|
3351
|
-
"env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
|
|
3352
|
-
"env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
|
|
3353
|
-
"env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
|
|
3354
|
-
"env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
|
|
3355
|
-
"env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
|
|
3356
|
-
"env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
|
|
3357
|
-
"env.fix.title": "怎么解决",
|
|
3358
|
-
"env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
|
|
3359
|
-
"env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
|
|
3360
|
-
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
|
|
3361
|
-
"env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
|
|
3362
|
-
"env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
|
|
3363
|
-
"env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
|
|
3364
|
-
"env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
|
|
3365
|
-
"env.fix.network": "网络不通:检查网络或代理设置后重试。",
|
|
3366
|
-
"env.fix.details": "详细输出(排障用)",
|
|
3367
|
-
"env.retry": "重试",
|
|
3368
|
-
"env.copyCommand": "复制命令",
|
|
3369
|
-
"env.copied": "已复制",
|
|
3370
|
-
"env.step.opencli": "检测工作台的 opencli",
|
|
3371
|
-
"env.step.codingPlugin": "检测 coding 插件",
|
|
3372
|
-
"env.step.bridge": "检测浏览器通道",
|
|
3373
|
-
"env.step.warm": "预热站点登录态",
|
|
3374
|
-
"env.warm.done": "已预热 {n} 个站点",
|
|
3375
|
-
"env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
|
|
3376
|
-
"env.unit.failed": "这个模块起不来",
|
|
3377
|
-
"env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
|
|
3378
|
-
"env.unit.missingPlugin": "这个模块还没装好",
|
|
3379
|
-
"env.unit.missingCommandsHint": "更新之后就能用了。",
|
|
3380
|
-
"env.unit.unchecked": "检测不了:拿不到执行通道",
|
|
3381
|
-
"env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
|
|
3382
|
-
"env.unit.missingCommands": "这个模块的版本旧了",
|
|
3383
|
-
"env.unit.hint": "装好之后点重试;不影响其它模块。",
|
|
3384
|
-
"rightbar.label": "数据面板",
|
|
3385
|
-
"rightbar.expand": "展开数据面板",
|
|
3386
|
-
"rightbar.collapse": "收起数据面板",
|
|
3387
|
-
"rightbar.column.label": "右侧栏",
|
|
3388
|
-
"rightbar.column.workbench": "工作台面板",
|
|
3389
|
-
"rightbar.column.dsh": "dsh 面板",
|
|
3390
|
-
"rightbar.refresh": "刷新",
|
|
3391
|
-
"rightbar.refreshing": "刷新中…",
|
|
3392
|
-
"rightbar.updatedAt": "更新于 {time}",
|
|
3393
|
-
"rightbar.noProject": "当前会话没有所属项目",
|
|
3394
|
-
"rightbar.openPlatform": "在平台上打开",
|
|
3395
|
-
"coding.notARepo.title": "这个项目不是 Coding 仓库",
|
|
3396
|
-
"error.unknown": "出错了",
|
|
3397
|
-
"board.title": "工作台面板",
|
|
3398
|
-
"panel.conversation": "对话",
|
|
3399
|
-
"panels.label": "全局面板",
|
|
3400
|
-
"configSync.nav": "配置同步",
|
|
3401
|
-
"configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
|
|
3402
|
-
"configSync.source": "来源",
|
|
3403
|
-
"configSync.sourceBroken": "读不到它的配置",
|
|
3404
|
-
"configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
|
|
3405
|
-
"configSync.sourceDead": "读不到",
|
|
3406
|
-
"configSync.refresh": "重新读一遍",
|
|
3407
|
-
"configSync.loading": "正在读来源的配置…",
|
|
3408
|
-
"configSync.readHint": "换个来源,或再读一遍。",
|
|
3409
|
-
"configSync.tag.new": "新增",
|
|
3410
|
-
"configSync.tag.differs": "差异",
|
|
3411
|
-
"configSync.conflictNote": "应用后工作台这份会被来源覆盖",
|
|
3412
|
-
"configSync.code.lang": "yaml",
|
|
3413
|
-
"configSync.code.copy": "复制",
|
|
3414
|
-
"configSync.code.copied": "已复制",
|
|
3415
|
-
"configSync.code.wrap": "自动换行",
|
|
3416
|
-
"configSync.code.unwrap": "不换行",
|
|
3417
|
-
"configSync.code.collapse": "收起",
|
|
3418
|
-
"configSync.code.collapseAria": "收起这一行的配置",
|
|
3419
|
-
"configSync.code.expandAria": "展开差异(还有 {count} 行)",
|
|
3420
|
-
"configSync.code.expand": "展开剩余 {count} 行",
|
|
3421
|
-
"configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
|
|
3422
|
-
"configSync.apply": "同步选中的 {count} 行",
|
|
3423
|
-
"configSync.applyNone": "先勾几行",
|
|
3424
|
-
"configSync.applying": "正在写入…",
|
|
3425
|
-
"configSync.applied": "已写入工作台配置 · 已生效",
|
|
3426
|
-
"configSync.appliedIds": "这次写进去:{ids}",
|
|
3427
|
-
"configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
|
|
3428
|
-
"configSync.nothing": "没有需要同步的内容",
|
|
3429
|
-
"configSync.unreadable": "读不到 {path}:{reason}",
|
|
3430
|
-
"configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
|
|
3431
|
-
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
|
|
3432
|
-
"configSync.failed": "同步没成功,再试一次。",
|
|
3433
|
-
"debug.workspace": "这个工作区",
|
|
3434
|
-
"debug.status": "「{title}」调试中",
|
|
3435
|
-
"debug.status.trouble": "调试要你看一眼({title})",
|
|
3436
|
-
"debug.stalled": "调试已暂停({title})",
|
|
3437
|
-
"debug.act.pause": "暂停调试",
|
|
3438
|
-
"debug.act.resume": "继续调试",
|
|
3439
|
-
"debug.act.stop": "结束调试",
|
|
3440
|
-
"debug.act.stop.ask": "确认结束",
|
|
3441
|
-
"debug.card.here.title": "正在调试「{title}」",
|
|
3442
|
-
"debug.card.here.note": "请勿切换工作区和操作面板",
|
|
3443
|
-
"debug.card.away.note": "请切回「{title}」那一屏",
|
|
3444
|
-
"debug.card.paused.note": "已暂停",
|
|
3445
|
-
"debug.card.hidden.note": "请切回工作台面板",
|
|
3446
|
-
"record.waiting": "取证交接 · 等你出手",
|
|
3447
|
-
"record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
|
|
3448
|
-
"record.recording": "录制中",
|
|
3449
|
-
"record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
|
|
3450
|
-
"record.finished": "录制完成",
|
|
3451
|
-
"record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
|
|
3452
|
-
"record.act.cancel": "取消",
|
|
3453
|
-
"record.act.halt": "停",
|
|
3454
|
-
"approval.record.site": "站点",
|
|
3455
|
-
"approval.record.what": "录制功能",
|
|
3456
|
-
"approval.record.lands": "落点",
|
|
3457
|
-
"approval.record.noUrl": "没给站点地址(这次会被当场拒)",
|
|
3458
|
-
"approval.record.oneAction": "一次操作",
|
|
3459
|
-
"approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)"
|
|
3460
|
-
};
|
|
3461
|
-
//#endregion
|
|
3462
2437
|
//#region ../shared/dist/i18n/index.js
|
|
3463
2438
|
/** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
|
|
3464
2439
|
var dictionaries = {
|
|
3465
|
-
zh
|
|
3466
|
-
|
|
2440
|
+
zh: {
|
|
2441
|
+
"brand.name": "工作台",
|
|
2442
|
+
"toggle.open": "打开侧边栏",
|
|
2443
|
+
"toggle.collapse": "收起侧边栏",
|
|
2444
|
+
"project.label": "切换项目",
|
|
2445
|
+
"workspace.section": "工作区",
|
|
2446
|
+
"project.none": "未选择项目",
|
|
2447
|
+
"project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
|
|
2448
|
+
"project.add": "添加项目…",
|
|
2449
|
+
"project.add.busy": "正在新建工作区…",
|
|
2450
|
+
"project.add.failed": "新建工作区没成功",
|
|
2451
|
+
"project.search.label": "搜索工作区",
|
|
2452
|
+
"project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
|
|
2453
|
+
"project.search.empty": "没有匹配「{query}」的工作区。",
|
|
2454
|
+
"project.group.workspaces": "工作区",
|
|
2455
|
+
"project.group.defaultWorkspace": "默认工作区",
|
|
2456
|
+
"project.group.workshop": "工坊",
|
|
2457
|
+
"project.rename.row": "改「{name}」的中文名",
|
|
2458
|
+
"project.rename.current": "改当前工作区的中文名…",
|
|
2459
|
+
"project.rename.title": "给「{name}」配一个中文名",
|
|
2460
|
+
"project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
|
|
2461
|
+
"project.rename.field": "中文名",
|
|
2462
|
+
"project.rename.placeholder": "例如:工作台外壳",
|
|
2463
|
+
"project.rename.hint": "留空 = 只显示目录名",
|
|
2464
|
+
"project.rename.save": "保存",
|
|
2465
|
+
"project.rename.saving": "保存中…",
|
|
2466
|
+
"project.rename.cancel": "取消",
|
|
2467
|
+
"project.rename.failed": "改名失败了,再试一次。",
|
|
2468
|
+
"session.new": "新会话",
|
|
2469
|
+
"session.new.label": "在当前项目新建会话",
|
|
2470
|
+
"session.empty": "这个项目还没有会话。",
|
|
2471
|
+
"session.noProject": "先添加一个项目。",
|
|
2472
|
+
"session.list.label": "会话",
|
|
2473
|
+
"session.copy": "复制",
|
|
2474
|
+
"session.pinned": "已置顶",
|
|
2475
|
+
"session.actions": "{name} 的操作",
|
|
2476
|
+
"status.idle": "空闲",
|
|
2477
|
+
"status.running": "进行中",
|
|
2478
|
+
"status.longTask": "长任务在跑",
|
|
2479
|
+
"status.waitingApproval": "等待审批",
|
|
2480
|
+
"status.planReview": "计划待审",
|
|
2481
|
+
"status.waitingAnswer": "等待回答",
|
|
2482
|
+
"status.compact.approval": "待审批",
|
|
2483
|
+
"status.compact.planReview": "计划待审",
|
|
2484
|
+
"status.compact.answer": "待回答",
|
|
2485
|
+
"status.completed": "已完成",
|
|
2486
|
+
"status.subagentsRunning.one": "{n} 个子代理运行中",
|
|
2487
|
+
"status.subagentsRunning.other": "{n} 个子代理运行中",
|
|
2488
|
+
"project.attention.warning.one": "1 个会话在等你点头",
|
|
2489
|
+
"project.attention.warning.other": "{n} 个会话在等你点头",
|
|
2490
|
+
"project.attention.running.one": "1 个会话在跑",
|
|
2491
|
+
"project.attention.running.other": "{n} 个会话在跑",
|
|
2492
|
+
"project.attention.longTask.one": "1 个长任务在跑",
|
|
2493
|
+
"project.attention.longTask.other": "{n} 个长任务在跑",
|
|
2494
|
+
"project.attention.done.one": "1 个会话跑完没看",
|
|
2495
|
+
"project.attention.done.other": "{n} 个会话跑完没看",
|
|
2496
|
+
"project.attention.state.warning": "待审批",
|
|
2497
|
+
"project.attention.state.running": "在跑",
|
|
2498
|
+
"project.attention.state.done": "新消息",
|
|
2499
|
+
"hover.copied": "已复制",
|
|
2500
|
+
"time.now": "刚刚",
|
|
2501
|
+
"time.minutes": "{n} 分钟前",
|
|
2502
|
+
"time.hours": "{n} 小时前",
|
|
2503
|
+
"time.days": "{n} 天前",
|
|
2504
|
+
"time.ago": "{t}前",
|
|
2505
|
+
"time.short.minutes": "{n}分钟",
|
|
2506
|
+
"time.short.hours": "{n}小时",
|
|
2507
|
+
"time.short.days": "{n}天",
|
|
2508
|
+
"time.short.months": "{n}个月",
|
|
2509
|
+
"time.short.years": "{n}年",
|
|
2510
|
+
"panels.title": "面板模块",
|
|
2511
|
+
"panels.groupBoardless": "无看板模块",
|
|
2512
|
+
"panels.groupPlugins": "opencli 插件",
|
|
2513
|
+
"panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
|
|
2514
|
+
"panels.market.defaultLabel": "全局默认开启",
|
|
2515
|
+
"panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
|
|
2516
|
+
"panels.followAll": "全部恢复默认",
|
|
2517
|
+
"panels.followAllConfirmTitle": "全部恢复默认?",
|
|
2518
|
+
"panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
|
|
2519
|
+
"panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
|
|
2520
|
+
"panels.followAllConfirmYes": "恢复默认",
|
|
2521
|
+
"panels.followAllConfirmNo": "取消",
|
|
2522
|
+
"panels.enabled": "这个项目已启用",
|
|
2523
|
+
"panels.disabled": "这个项目未启用",
|
|
2524
|
+
"panels.choose": "选择模块",
|
|
2525
|
+
"panels.buildModule": "造一个模块",
|
|
2526
|
+
"panels.failed": "改配置失败了,再试一次。",
|
|
2527
|
+
"panels.dragHint": "拖动调整顺序",
|
|
2528
|
+
"panels.unknownStep": "这一层没有套件提供",
|
|
2529
|
+
"panels.labelWithHint": "{label}({hint})",
|
|
2530
|
+
"panels.hintJoin": ";",
|
|
2531
|
+
"panels.dep.failed": "⚠ 起不来",
|
|
2532
|
+
"panels.dep.missingPlugin": "⚠ 还没装好",
|
|
2533
|
+
"panels.dep.missingCommands": "⚠ 需要更新",
|
|
2534
|
+
"panels.dep.unchecked": "⚠ 检测不了",
|
|
2535
|
+
"panels.tab.modules": "面板配置",
|
|
2536
|
+
"panels.tab.market": "工作台模块市场",
|
|
2537
|
+
"panels.browseMarket": "浏览模块市场",
|
|
2538
|
+
"panels.noneInstalled": "这些模块要的插件都还没装",
|
|
2539
|
+
"panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
|
|
2540
|
+
"panels.market.installed": "已安装",
|
|
2541
|
+
"panels.market.notActive": "未生效",
|
|
2542
|
+
"panels.market.notUsable": "不可用",
|
|
2543
|
+
"panels.market.broken": "装坏了",
|
|
2544
|
+
"panels.market.hasNew": "有新版本",
|
|
2545
|
+
"panels.market.hasProblem": "模块异常",
|
|
2546
|
+
"panels.market.missing": "未装",
|
|
2547
|
+
"panels.market.unchecked": "状态未知",
|
|
2548
|
+
"panels.market.checking": "检测中",
|
|
2549
|
+
"panels.market.sectionInstalled": "已安装模块",
|
|
2550
|
+
"panels.market.sectionPending": "未安装",
|
|
2551
|
+
"panels.market.sectionShared": "共用依赖",
|
|
2552
|
+
"panels.market.sharedUsedBy": "供 {modules} 模块使用",
|
|
2553
|
+
"panels.market.listSeparator": "、",
|
|
2554
|
+
"panels.market.sharedMissing": "未装",
|
|
2555
|
+
"panels.market.sharedOutdated": "有新版",
|
|
2556
|
+
"panels.market.sharedUnsatisfied": "版本不对",
|
|
2557
|
+
"panels.market.sharedOk": "已装",
|
|
2558
|
+
"panels.market.versionArrow": "{from} → {to}",
|
|
2559
|
+
"panels.market.lead": "装在这台机器上,所有项目共用。",
|
|
2560
|
+
"panels.market.install": "安装",
|
|
2561
|
+
"panels.market.update": "更新",
|
|
2562
|
+
"panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
|
|
2563
|
+
"panels.market.uninstall": "卸载",
|
|
2564
|
+
"panels.market.uninstallLabel": "卸载 {name}",
|
|
2565
|
+
"panels.market.installing": "正在安装…",
|
|
2566
|
+
"panels.market.updating": "正在更新…",
|
|
2567
|
+
"panels.market.uninstalling": "正在卸载…",
|
|
2568
|
+
"panels.market.confirmUninstallTitle": "卸载「{name}」?",
|
|
2569
|
+
"panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
|
|
2570
|
+
"panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
|
|
2571
|
+
"panels.market.confirmYes": "卸载",
|
|
2572
|
+
"panels.market.confirmNo": "取消",
|
|
2573
|
+
"panels.market.failed": "没成功:{reason}",
|
|
2574
|
+
"panels.market.needEnv": "先在启动工作台的终端里设 {env}",
|
|
2575
|
+
"panels.market.needCommands": "缺这几条命令:{commands}",
|
|
2576
|
+
"panels.market.localMark": "本地",
|
|
2577
|
+
"panels.market.localHint": "本机那份(不从源上取)。",
|
|
2578
|
+
"panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
|
|
2579
|
+
"panels.market.badSource": "安装方式没写全,只能自己动手",
|
|
2580
|
+
"panels.market.empty": "暂无可用模块",
|
|
2581
|
+
"panels.market.sectionPlugins": "已安装 opencli 插件",
|
|
2582
|
+
"panels.market.moduleOutdated": "有新版",
|
|
2583
|
+
"panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
|
|
2584
|
+
"panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
|
|
2585
|
+
"panels.market.moduleRestartHint": "重启后生效",
|
|
2586
|
+
"panels.market.pendingRestart": "重启后生效",
|
|
2587
|
+
"panels.market.workbenchName": "工作台",
|
|
2588
|
+
"panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
|
|
2589
|
+
"panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
|
|
2590
|
+
"panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
|
|
2591
|
+
"panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
|
|
2592
|
+
"panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
|
|
2593
|
+
"panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
|
|
2594
|
+
"panels.market.restartNeeded": "新版装好了,重启一次才生效。",
|
|
2595
|
+
"panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
|
|
2596
|
+
"panels.market.recheck": "重新检查更新",
|
|
2597
|
+
"panels.market.checkUpdates": "检查更新",
|
|
2598
|
+
"panels.market.checkedAt": "最近检查:{time}",
|
|
2599
|
+
"panels.market.justNow": "刚刚",
|
|
2600
|
+
"panels.market.minutesAgo": "{n} 分钟前",
|
|
2601
|
+
"panels.market.hoursAgo": "{n} 小时前",
|
|
2602
|
+
"panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
|
|
2603
|
+
"panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
|
|
2604
|
+
"panels.market.add.guideToggle": "模块安装引导和示例",
|
|
2605
|
+
"panels.market.add.guideHide": "收起引导",
|
|
2606
|
+
"panels.market.add.guideIdTitle": "包名",
|
|
2607
|
+
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
2608
|
+
"panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
|
|
2609
|
+
"panels.market.add.guideGitTitle": "Git 仓库地址",
|
|
2610
|
+
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
2611
|
+
"panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
|
|
2612
|
+
"panels.market.add.guidePathTitle": "本地模块目录",
|
|
2613
|
+
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
2614
|
+
"panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
|
|
2615
|
+
"panels.market.add.guideExampleLabel": "示例:",
|
|
2616
|
+
"panels.market.add.guideFill": "填入示例",
|
|
2617
|
+
"panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
|
|
2618
|
+
"panels.market.add.registryLegend": "从哪个 npm 源下载模块",
|
|
2619
|
+
"panels.market.add.registryOfficial": "npm 官方源",
|
|
2620
|
+
"panels.market.add.registryMirror": "中国大陆镜像源",
|
|
2621
|
+
"panels.market.add.registryWithHost": "{name}({host})",
|
|
2622
|
+
"panels.market.add.registryToggle": "安装源",
|
|
2623
|
+
"panels.market.add.installVersion": "版本 {version}",
|
|
2624
|
+
"panels.market.add.registryDefault": "默认安装源",
|
|
2625
|
+
"panels.market.add.registryCustom": "自定义地址",
|
|
2626
|
+
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
2627
|
+
"panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
|
|
2628
|
+
"panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
|
|
2629
|
+
"panels.market.add.run": "安装",
|
|
2630
|
+
"panels.market.add.edit": "编辑",
|
|
2631
|
+
"panels.market.add.changeRegistry": "更换安装源",
|
|
2632
|
+
"panels.market.add.installingTitle": "模块安装中…",
|
|
2633
|
+
"panels.market.add.installedTitle": "已安装",
|
|
2634
|
+
"panels.market.add.failedTitle": "模块安装失败",
|
|
2635
|
+
"panels.market.add.cancelledTitle": "已取消",
|
|
2636
|
+
"panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
|
|
2637
|
+
"panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
|
|
2638
|
+
"panels.market.add.problemInstalled": "该模块已安装",
|
|
2639
|
+
"panels.market.add.problemNotFound": "未找到相关模块",
|
|
2640
|
+
"panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
|
|
2641
|
+
"panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
|
|
2642
|
+
"panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
|
|
2643
|
+
"panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
|
|
2644
|
+
"panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
|
|
2645
|
+
"panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
|
|
2646
|
+
"panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
|
|
2647
|
+
"panels.market.add.pluginAlias": "插件名:{name}",
|
|
2648
|
+
"panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
|
|
2649
|
+
"panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
|
|
2650
|
+
"panels.market.add.failureNetwork": "网络连接失败",
|
|
2651
|
+
"panels.market.add.failureNotFound": "未找到相关模块",
|
|
2652
|
+
"panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
|
|
2653
|
+
"panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
|
|
2654
|
+
"panels.market.add.failurePermission": "没有写入权限,无法安装",
|
|
2655
|
+
"panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
|
|
2656
|
+
"panels.market.add.failureIntegrity": "下载的安装包校验失败",
|
|
2657
|
+
"panels.market.add.failureTimeout": "安装超时",
|
|
2658
|
+
"panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
|
|
2659
|
+
"panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
|
|
2660
|
+
"panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
|
|
2661
|
+
"panels.market.add.approveTitle": "需要你允许安装脚本",
|
|
2662
|
+
"panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
|
|
2663
|
+
"panels.market.add.approveRun": "允许并继续安装",
|
|
2664
|
+
"panels.market.add.restart": "装好了,重启一次才生效。",
|
|
2665
|
+
"panels.market.add.tookEffect": "已生效。",
|
|
2666
|
+
"panels.market.add.details": "安装详情",
|
|
2667
|
+
"panels.market.add.open": "添加模块",
|
|
2668
|
+
"panels.market.add.title": "添加模块",
|
|
2669
|
+
"panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
|
|
2670
|
+
"panels.market.add.specLabel": "包名",
|
|
2671
|
+
"panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
|
|
2672
|
+
"panels.market.add.exampleTitle": "示例",
|
|
2673
|
+
"panels.market.add.exampleFill": "填入示例",
|
|
2674
|
+
"panels.market.add.registryLabel": "安装源",
|
|
2675
|
+
"panels.market.add.registryProfile": "这个 profile 配的源",
|
|
2676
|
+
"panels.market.add.registryPnpm": "pnpm 自己配的源",
|
|
2677
|
+
"panels.market.add.check": "预检",
|
|
2678
|
+
"panels.market.add.checking": "正在预检…",
|
|
2679
|
+
"panels.market.add.classifying": "检测中…",
|
|
2680
|
+
"panels.market.add.change": "改一下",
|
|
2681
|
+
"panels.market.add.previewTitle": "将要安装",
|
|
2682
|
+
"panels.market.add.fieldName": "包名",
|
|
2683
|
+
"panels.market.add.fieldVersion": "版本",
|
|
2684
|
+
"panels.market.add.fieldDescription": "简介",
|
|
2685
|
+
"panels.market.add.fieldSource": "来源",
|
|
2686
|
+
"panels.market.add.install": "安装",
|
|
2687
|
+
"panels.market.add.installing": "正在安装…",
|
|
2688
|
+
"panels.market.add.cancel": "取消安装",
|
|
2689
|
+
"panels.market.add.close": "关闭",
|
|
2690
|
+
"panels.market.add.retry": "重试",
|
|
2691
|
+
"panels.market.add.changeSource": "换源",
|
|
2692
|
+
"panels.market.add.approveBuilds": "允许这些脚本并重试",
|
|
2693
|
+
"panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
|
|
2694
|
+
"panels.market.add.doneApplied": "装好了,已经生效。",
|
|
2695
|
+
"panels.market.add.doneRestart": "装好了,重启一次才生效。",
|
|
2696
|
+
"panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
|
|
2697
|
+
"panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
|
|
2698
|
+
"panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
|
|
2699
|
+
"panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
|
|
2700
|
+
"panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
|
|
2701
|
+
"panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
|
|
2702
|
+
"panels.market.add.cancelled": "已取消。",
|
|
2703
|
+
"panels.market.add.failed": "没成功:{reason}",
|
|
2704
|
+
"panels.market.add.removed": "已经移除了。",
|
|
2705
|
+
"panels.market.add.supplyPending": "它要的插件重启后再装。",
|
|
2706
|
+
"panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
|
|
2707
|
+
"panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
|
|
2708
|
+
"panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
|
|
2709
|
+
"panels.market.add.remove": "移除它",
|
|
2710
|
+
"panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
|
|
2711
|
+
"panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
|
|
2712
|
+
"panels.market.add.problem.notFound": "源上没有这个包。",
|
|
2713
|
+
"panels.market.add.problem.notAPackage": "这个位置没有包。",
|
|
2714
|
+
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
|
|
2715
|
+
"panels.market.add.problem.network": "源连不上。",
|
|
2716
|
+
"panels.market.add.problem.unknown": "预检没通过(原因未知)。",
|
|
2717
|
+
"panels.market.add.reason.invalidSpec": "写法不认",
|
|
2718
|
+
"panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
|
|
2719
|
+
"panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
|
|
2720
|
+
"panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
|
|
2721
|
+
"panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
|
|
2722
|
+
"panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
|
|
2723
|
+
"panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
|
|
2724
|
+
"panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
|
|
2725
|
+
"panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
|
|
2726
|
+
"panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
|
|
2727
|
+
"panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
|
|
2728
|
+
"panels.market.add.reason.diskFull": "磁盘满了",
|
|
2729
|
+
"panels.market.add.reason.permission": "没有写权限",
|
|
2730
|
+
"panels.market.add.reason.integrity": "下载内容校验不过",
|
|
2731
|
+
"panels.market.add.reason.timeout": "太久没有输出,被中断了",
|
|
2732
|
+
"panels.market.add.reason.network": "网络不通",
|
|
2733
|
+
"panels.market.add.reason.notFound": "源上没有这个包",
|
|
2734
|
+
"panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
|
|
2735
|
+
"blocker.fix.install": "帮我安装",
|
|
2736
|
+
"blocker.fix.update": "帮我升级",
|
|
2737
|
+
"blocker.fix.running": "正在执行…",
|
|
2738
|
+
"blocker.fix.failed": "执行失败:",
|
|
2739
|
+
"blocker.retry": "重试",
|
|
2740
|
+
"blocker.retry.running": "重试中…",
|
|
2741
|
+
"blocker.copy": "复制命令",
|
|
2742
|
+
"blocker.market.open": "去模块市场",
|
|
2743
|
+
"blocker.login.title": "需要登录 {platform}",
|
|
2744
|
+
"blocker.login.titleGeneric": "需要登录",
|
|
2745
|
+
"blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
|
|
2746
|
+
"blocker.login.go": "去登录",
|
|
2747
|
+
"blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
|
|
2748
|
+
"blocker.forbidden.title": "没有权限访问 {platform}",
|
|
2749
|
+
"blocker.forbidden.titleGeneric": "没有权限",
|
|
2750
|
+
"blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
|
|
2751
|
+
"blocker.forbidden.open": "打开权限页",
|
|
2752
|
+
"blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
|
|
2753
|
+
"blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
|
|
2754
|
+
"blocker.unknown.title": "出了点问题",
|
|
2755
|
+
"panels.reading": "正在读取面板配置…",
|
|
2756
|
+
"panels.cardBroken": "这个模块起不来:{unit}({reason})",
|
|
2757
|
+
"panels.cardRetry": "重试",
|
|
2758
|
+
"panels.empty": "面板里还没有模块",
|
|
2759
|
+
"panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
|
|
2760
|
+
"env.title": "准备工作台",
|
|
2761
|
+
"env.checking": "正在检测运行环境…",
|
|
2762
|
+
"env.installing": "正在安装缺失的依赖…",
|
|
2763
|
+
"env.failed": "还差一步就能用了",
|
|
2764
|
+
"env.elapsed": "已等待 {seconds} 秒",
|
|
2765
|
+
"env.stepFailed.install": "装不上",
|
|
2766
|
+
"env.stepFailed.path": "装了但还找不到",
|
|
2767
|
+
"env.stepFailed.shell": "执行通道不可用",
|
|
2768
|
+
"env.bridge.ok": "已连接",
|
|
2769
|
+
"env.bridge.short": "没连上",
|
|
2770
|
+
"env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
|
|
2771
|
+
"env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
|
|
2772
|
+
"env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
|
|
2773
|
+
"env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
|
|
2774
|
+
"env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
|
|
2775
|
+
"env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
|
|
2776
|
+
"env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
|
|
2777
|
+
"env.fix.title": "怎么解决",
|
|
2778
|
+
"env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
|
|
2779
|
+
"env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
|
|
2780
|
+
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
|
|
2781
|
+
"env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
|
|
2782
|
+
"env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
|
|
2783
|
+
"env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
|
|
2784
|
+
"env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
|
|
2785
|
+
"env.fix.network": "网络不通:检查网络或代理设置后重试。",
|
|
2786
|
+
"env.fix.details": "详细输出(排障用)",
|
|
2787
|
+
"env.retry": "重试",
|
|
2788
|
+
"env.copyCommand": "复制命令",
|
|
2789
|
+
"env.copied": "已复制",
|
|
2790
|
+
"env.step.opencli": "检测工作台的 opencli",
|
|
2791
|
+
"env.step.codingPlugin": "检测 coding 插件",
|
|
2792
|
+
"env.step.bridge": "检测浏览器通道",
|
|
2793
|
+
"env.step.warm": "预热站点登录态",
|
|
2794
|
+
"env.warm.done": "已预热 {n} 个站点",
|
|
2795
|
+
"env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
|
|
2796
|
+
"env.unit.failed": "这个模块起不来",
|
|
2797
|
+
"env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
|
|
2798
|
+
"env.unit.missingPlugin": "这个模块还没装好",
|
|
2799
|
+
"env.unit.missingCommandsHint": "更新之后就能用了。",
|
|
2800
|
+
"env.unit.unchecked": "检测不了:拿不到执行通道",
|
|
2801
|
+
"env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
|
|
2802
|
+
"env.unit.missingCommands": "这个模块的版本旧了",
|
|
2803
|
+
"env.unit.hint": "装好之后点重试;不影响其它模块。",
|
|
2804
|
+
"rightbar.label": "数据面板",
|
|
2805
|
+
"rightbar.expand": "展开数据面板",
|
|
2806
|
+
"rightbar.collapse": "收起数据面板",
|
|
2807
|
+
"rightbar.column.label": "右侧栏",
|
|
2808
|
+
"rightbar.column.workbench": "工作台面板",
|
|
2809
|
+
"rightbar.column.dsh": "dsh 面板",
|
|
2810
|
+
"rightbar.refresh": "刷新",
|
|
2811
|
+
"rightbar.refreshing": "刷新中…",
|
|
2812
|
+
"rightbar.updatedAt": "更新于 {time}",
|
|
2813
|
+
"rightbar.noProject": "当前会话没有所属项目",
|
|
2814
|
+
"rightbar.openPlatform": "在平台上打开",
|
|
2815
|
+
"coding.notARepo.title": "这个项目不是 Coding 仓库",
|
|
2816
|
+
"error.unknown": "出错了",
|
|
2817
|
+
"board.title": "工作台面板",
|
|
2818
|
+
"panel.conversation": "对话",
|
|
2819
|
+
"panels.label": "全局面板",
|
|
2820
|
+
"configSync.nav": "配置同步",
|
|
2821
|
+
"configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
|
|
2822
|
+
"configSync.source": "来源",
|
|
2823
|
+
"configSync.sourceBroken": "读不到它的配置",
|
|
2824
|
+
"configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
|
|
2825
|
+
"configSync.sourceDead": "读不到",
|
|
2826
|
+
"configSync.refresh": "重新读一遍",
|
|
2827
|
+
"configSync.loading": "正在读来源的配置…",
|
|
2828
|
+
"configSync.readHint": "换个来源,或再读一遍。",
|
|
2829
|
+
"configSync.tag.new": "新增",
|
|
2830
|
+
"configSync.tag.differs": "差异",
|
|
2831
|
+
"configSync.conflictNote": "应用后工作台这份会被来源覆盖",
|
|
2832
|
+
"configSync.code.lang": "yaml",
|
|
2833
|
+
"configSync.code.copy": "复制",
|
|
2834
|
+
"configSync.code.copied": "已复制",
|
|
2835
|
+
"configSync.code.wrap": "自动换行",
|
|
2836
|
+
"configSync.code.unwrap": "不换行",
|
|
2837
|
+
"configSync.code.collapse": "收起",
|
|
2838
|
+
"configSync.code.collapseAria": "收起这一行的配置",
|
|
2839
|
+
"configSync.code.expandAria": "展开差异(还有 {count} 行)",
|
|
2840
|
+
"configSync.code.expand": "展开剩余 {count} 行",
|
|
2841
|
+
"configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
|
|
2842
|
+
"configSync.apply": "同步选中的 {count} 行",
|
|
2843
|
+
"configSync.applyNone": "先勾几行",
|
|
2844
|
+
"configSync.applying": "正在写入…",
|
|
2845
|
+
"configSync.applied": "已写入工作台配置 · 已生效",
|
|
2846
|
+
"configSync.appliedIds": "这次写进去:{ids}",
|
|
2847
|
+
"configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
|
|
2848
|
+
"configSync.nothing": "没有需要同步的内容",
|
|
2849
|
+
"configSync.unreadable": "读不到 {path}:{reason}",
|
|
2850
|
+
"configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
|
|
2851
|
+
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
|
|
2852
|
+
"configSync.failed": "同步没成功,再试一次。",
|
|
2853
|
+
"debug.workspace": "这个工作区",
|
|
2854
|
+
"debug.status": "「{title}」调试中",
|
|
2855
|
+
"debug.status.trouble": "调试要你看一眼({title})",
|
|
2856
|
+
"debug.stalled": "调试已暂停({title})",
|
|
2857
|
+
"debug.act.pause": "暂停调试",
|
|
2858
|
+
"debug.act.resume": "继续调试",
|
|
2859
|
+
"debug.act.stop": "结束调试",
|
|
2860
|
+
"debug.act.stop.ask": "确认结束",
|
|
2861
|
+
"debug.card.here.title": "正在调试「{title}」",
|
|
2862
|
+
"debug.card.here.note": "请勿切换工作区和操作面板",
|
|
2863
|
+
"debug.card.away.note": "请切回「{title}」那一屏",
|
|
2864
|
+
"debug.card.paused.note": "已暂停",
|
|
2865
|
+
"debug.card.hidden.note": "请切回工作台面板",
|
|
2866
|
+
"record.waiting": "取证交接 · 等你出手",
|
|
2867
|
+
"record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
|
|
2868
|
+
"record.recording": "录制中",
|
|
2869
|
+
"record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
|
|
2870
|
+
"record.recording.shots": ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)",
|
|
2871
|
+
"record.finished": "录制完成",
|
|
2872
|
+
"record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
|
|
2873
|
+
"record.act.cancel": "取消",
|
|
2874
|
+
"record.act.halt": "停",
|
|
2875
|
+
"approval.record.site": "站点",
|
|
2876
|
+
"approval.record.what": "录制功能",
|
|
2877
|
+
"approval.record.lands": "落点",
|
|
2878
|
+
"approval.record.noUrl": "没给站点地址(这次会被当场拒)",
|
|
2879
|
+
"approval.record.oneAction": "一次操作",
|
|
2880
|
+
"approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
|
|
2881
|
+
"approval.longTask.what": "要停的那一趟",
|
|
2882
|
+
"approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
|
|
2883
|
+
},
|
|
2884
|
+
en: {
|
|
2885
|
+
"brand.name": "Workbench",
|
|
2886
|
+
"toggle.open": "Open sidebar",
|
|
2887
|
+
"toggle.collapse": "Collapse sidebar",
|
|
2888
|
+
"project.label": "Switch project",
|
|
2889
|
+
"workspace.section": "Workspaces",
|
|
2890
|
+
"project.none": "No project",
|
|
2891
|
+
"project.empty": "No projects yet. Use “Add project” below.",
|
|
2892
|
+
"project.add": "Add project…",
|
|
2893
|
+
"project.add.busy": "Creating the workspace…",
|
|
2894
|
+
"project.add.failed": "Creating the workspace failed",
|
|
2895
|
+
"project.search.label": "Search workspaces",
|
|
2896
|
+
"project.search.placeholder": "Search workspaces (folder / name / path)",
|
|
2897
|
+
"project.search.empty": "No workspace matches “{query}”.",
|
|
2898
|
+
"project.group.workspaces": "Workspaces",
|
|
2899
|
+
"project.group.defaultWorkspace": "Default workspace",
|
|
2900
|
+
"project.group.workshop": "Workshop",
|
|
2901
|
+
"project.rename.row": "Rename “{name}”",
|
|
2902
|
+
"project.rename.current": "Give this workspace a display name…",
|
|
2903
|
+
"project.rename.title": "Give “{name}” a display name",
|
|
2904
|
+
"project.rename.description": "Shown after the folder name. It renames the workspace itself.",
|
|
2905
|
+
"project.rename.field": "Display name",
|
|
2906
|
+
"project.rename.placeholder": "e.g. Workbench shell",
|
|
2907
|
+
"project.rename.hint": "Empty = folder name only",
|
|
2908
|
+
"project.rename.save": "Save",
|
|
2909
|
+
"project.rename.saving": "Saving…",
|
|
2910
|
+
"project.rename.cancel": "Cancel",
|
|
2911
|
+
"project.rename.failed": "Rename failed. Try again.",
|
|
2912
|
+
"session.new": "New session",
|
|
2913
|
+
"session.new.label": "Start a session in the current project",
|
|
2914
|
+
"session.empty": "No sessions in this project yet.",
|
|
2915
|
+
"session.noProject": "Add a project first.",
|
|
2916
|
+
"session.list.label": "Sessions",
|
|
2917
|
+
"session.copy": "Copy",
|
|
2918
|
+
"session.pinned": "Pinned",
|
|
2919
|
+
"session.actions": "Actions for {name}",
|
|
2920
|
+
"status.idle": "Idle",
|
|
2921
|
+
"status.running": "Running",
|
|
2922
|
+
"status.longTask": "Long task running",
|
|
2923
|
+
"status.waitingApproval": "Waiting for approval",
|
|
2924
|
+
"status.planReview": "Plan awaiting review",
|
|
2925
|
+
"status.waitingAnswer": "Waiting for your answer",
|
|
2926
|
+
"status.compact.approval": "Approval",
|
|
2927
|
+
"status.compact.planReview": "Plan review",
|
|
2928
|
+
"status.compact.answer": "Answer",
|
|
2929
|
+
"status.completed": "Completed",
|
|
2930
|
+
"status.subagentsRunning.one": "{n} subagent running",
|
|
2931
|
+
"status.subagentsRunning.other": "{n} subagents running",
|
|
2932
|
+
"project.attention.warning.one": "1 session waiting for you",
|
|
2933
|
+
"project.attention.warning.other": "{n} sessions waiting for you",
|
|
2934
|
+
"project.attention.running.one": "1 session running",
|
|
2935
|
+
"project.attention.running.other": "{n} sessions running",
|
|
2936
|
+
"project.attention.longTask.one": "1 long task running",
|
|
2937
|
+
"project.attention.longTask.other": "{n} long tasks running",
|
|
2938
|
+
"project.attention.done.one": "1 session finished, unread",
|
|
2939
|
+
"project.attention.done.other": "{n} sessions finished, unread",
|
|
2940
|
+
"project.attention.state.warning": "Approval",
|
|
2941
|
+
"project.attention.state.running": "Running",
|
|
2942
|
+
"project.attention.state.done": "New",
|
|
2943
|
+
"hover.copied": "Copied",
|
|
2944
|
+
"time.now": "just now",
|
|
2945
|
+
"time.minutes": "{n} min ago",
|
|
2946
|
+
"time.hours": "{n} h ago",
|
|
2947
|
+
"time.days": "{n} d ago",
|
|
2948
|
+
"time.ago": "{t} ago",
|
|
2949
|
+
"time.short.minutes": "{n}min",
|
|
2950
|
+
"time.short.hours": "{n}h",
|
|
2951
|
+
"time.short.days": "{n}d",
|
|
2952
|
+
"time.short.months": "{n}mo",
|
|
2953
|
+
"time.short.years": "{n}y",
|
|
2954
|
+
"panels.title": "Panel modules",
|
|
2955
|
+
"panels.groupBoardless": "No-board modules",
|
|
2956
|
+
"panels.groupPlugins": "opencli plugins",
|
|
2957
|
+
"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.",
|
|
2958
|
+
"panels.market.defaultLabel": "On by default everywhere",
|
|
2959
|
+
"panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
|
|
2960
|
+
"panels.followAll": "Restore the default everywhere",
|
|
2961
|
+
"panels.followAllConfirmTitle": "Restore the default everywhere?",
|
|
2962
|
+
"panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
|
|
2963
|
+
"panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
|
|
2964
|
+
"panels.followAllConfirmYes": "Restore",
|
|
2965
|
+
"panels.followAllConfirmNo": "Cancel",
|
|
2966
|
+
"panels.enabled": "enabled in this project",
|
|
2967
|
+
"panels.disabled": "not enabled in this project",
|
|
2968
|
+
"panels.choose": "Choose modules",
|
|
2969
|
+
"panels.buildModule": "Build a module",
|
|
2970
|
+
"panels.failed": "Could not save the change. Try again.",
|
|
2971
|
+
"panels.dragHint": "Drag to reorder",
|
|
2972
|
+
"panels.unknownStep": "No suite provides this view",
|
|
2973
|
+
"panels.labelWithHint": "{label} ({hint})",
|
|
2974
|
+
"panels.hintJoin": "; ",
|
|
2975
|
+
"panels.dep.failed": "⚠ failed to start",
|
|
2976
|
+
"panels.dep.missingPlugin": "⚠ not ready yet",
|
|
2977
|
+
"panels.dep.missingCommands": "⚠ needs an update",
|
|
2978
|
+
"panels.dep.unchecked": "⚠ cannot check",
|
|
2979
|
+
"panels.tab.modules": "Panel setup",
|
|
2980
|
+
"panels.tab.market": "Workbench module market",
|
|
2981
|
+
"panels.browseMarket": "Browse the module market",
|
|
2982
|
+
"panels.noneInstalled": "None of these modules has its plugin installed yet",
|
|
2983
|
+
"panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
|
|
2984
|
+
"panels.market.installed": "installed",
|
|
2985
|
+
"panels.market.notActive": "not active",
|
|
2986
|
+
"panels.market.notUsable": "unusable",
|
|
2987
|
+
"panels.market.broken": "broken",
|
|
2988
|
+
"panels.market.hasNew": "New version",
|
|
2989
|
+
"panels.market.hasProblem": "Module problem",
|
|
2990
|
+
"panels.market.missing": "not installed",
|
|
2991
|
+
"panels.market.unchecked": "unknown",
|
|
2992
|
+
"panels.market.checking": "checking",
|
|
2993
|
+
"panels.market.sectionInstalled": "Installed modules",
|
|
2994
|
+
"panels.market.sectionPending": "Not installed",
|
|
2995
|
+
"panels.market.sectionShared": "Shared dependencies",
|
|
2996
|
+
"panels.market.sharedUsedBy": "Used by module {modules}",
|
|
2997
|
+
"panels.market.listSeparator": ", ",
|
|
2998
|
+
"panels.market.sharedMissing": "not installed",
|
|
2999
|
+
"panels.market.sharedOutdated": "update available",
|
|
3000
|
+
"panels.market.sharedUnsatisfied": "wrong version",
|
|
3001
|
+
"panels.market.sharedOk": "installed",
|
|
3002
|
+
"panels.market.versionArrow": "{from} → {to}",
|
|
3003
|
+
"panels.market.lead": "Installed on this machine, shared by every project.",
|
|
3004
|
+
"panels.market.install": "Install",
|
|
3005
|
+
"panels.market.update": "Update",
|
|
3006
|
+
"panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
|
|
3007
|
+
"panels.market.uninstall": "Uninstall",
|
|
3008
|
+
"panels.market.uninstallLabel": "Uninstall {name}",
|
|
3009
|
+
"panels.market.installing": "Installing…",
|
|
3010
|
+
"panels.market.updating": "Updating…",
|
|
3011
|
+
"panels.market.uninstalling": "Uninstalling…",
|
|
3012
|
+
"panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
|
|
3013
|
+
"panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
|
|
3014
|
+
"panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
|
|
3015
|
+
"panels.market.confirmYes": "Uninstall",
|
|
3016
|
+
"panels.market.confirmNo": "Cancel",
|
|
3017
|
+
"panels.market.failed": "Failed: {reason}",
|
|
3018
|
+
"panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
|
|
3019
|
+
"panels.market.needCommands": "Missing commands: {commands}",
|
|
3020
|
+
"panels.market.localMark": "local",
|
|
3021
|
+
"panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
|
|
3022
|
+
"panels.market.noSource": "This module declares no install method — install it yourself",
|
|
3023
|
+
"panels.market.badSource": "The install method is incomplete — install it yourself",
|
|
3024
|
+
"panels.market.empty": "No modules available",
|
|
3025
|
+
"panels.market.sectionPlugins": "Installed opencli plugins",
|
|
3026
|
+
"panels.market.moduleOutdated": "update available",
|
|
3027
|
+
"panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
|
|
3028
|
+
"panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
|
|
3029
|
+
"panels.market.moduleRestartHint": "restart dsh once to bring it up",
|
|
3030
|
+
"panels.market.pendingRestart": "restart required",
|
|
3031
|
+
"panels.market.workbenchName": "Workbench",
|
|
3032
|
+
"panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
|
|
3033
|
+
"panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
|
|
3034
|
+
"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.",
|
|
3035
|
+
"panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
|
|
3036
|
+
"panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
|
|
3037
|
+
"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.",
|
|
3038
|
+
"panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
|
|
3039
|
+
"panels.market.foot": "After installing, enable it in the panel page of that project.",
|
|
3040
|
+
"panels.market.recheck": "Check for updates",
|
|
3041
|
+
"panels.market.checkUpdates": "Check for updates",
|
|
3042
|
+
"panels.market.checkedAt": "Last checked: {time}",
|
|
3043
|
+
"panels.market.justNow": "just now",
|
|
3044
|
+
"panels.market.minutesAgo": "{n} min ago",
|
|
3045
|
+
"panels.market.hoursAgo": "{n} h ago",
|
|
3046
|
+
"panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
|
|
3047
|
+
"panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
|
|
3048
|
+
"panels.market.add.guideToggle": "Install guide and examples",
|
|
3049
|
+
"panels.market.add.guideHide": "Hide guide",
|
|
3050
|
+
"panels.market.add.guideIdTitle": "Package name",
|
|
3051
|
+
"panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
|
|
3052
|
+
"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.",
|
|
3053
|
+
"panels.market.add.guideGitTitle": "Git URL",
|
|
3054
|
+
"panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
|
|
3055
|
+
"panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
|
|
3056
|
+
"panels.market.add.guidePathTitle": "Local module directory",
|
|
3057
|
+
"panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
|
|
3058
|
+
"panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
|
|
3059
|
+
"panels.market.add.guideExampleLabel": "Example:",
|
|
3060
|
+
"panels.market.add.guideFill": "Fill in",
|
|
3061
|
+
"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.",
|
|
3062
|
+
"panels.market.add.registryLegend": "Which npm registry to download from",
|
|
3063
|
+
"panels.market.add.registryOfficial": "npm registry",
|
|
3064
|
+
"panels.market.add.registryMirror": "China mirror",
|
|
3065
|
+
"panels.market.add.registryWithHost": "{name} ({host})",
|
|
3066
|
+
"panels.market.add.registryToggle": "Source",
|
|
3067
|
+
"panels.market.add.installVersion": "Version {version}",
|
|
3068
|
+
"panels.market.add.registryDefault": "Default source",
|
|
3069
|
+
"panels.market.add.registryCustom": "Custom address",
|
|
3070
|
+
"panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
|
|
3071
|
+
"panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
|
|
3072
|
+
"panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
|
|
3073
|
+
"panels.market.add.run": "Install",
|
|
3074
|
+
"panels.market.add.edit": "Edit",
|
|
3075
|
+
"panels.market.add.changeRegistry": "Change source",
|
|
3076
|
+
"panels.market.add.installingTitle": "Installing the module…",
|
|
3077
|
+
"panels.market.add.installedTitle": "Installed",
|
|
3078
|
+
"panels.market.add.failedTitle": "Module install failed",
|
|
3079
|
+
"panels.market.add.cancelledTitle": "Cancelled",
|
|
3080
|
+
"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.",
|
|
3081
|
+
"panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
|
|
3082
|
+
"panels.market.add.problemInstalled": "This module is already installed",
|
|
3083
|
+
"panels.market.add.problemNotFound": "No such module found",
|
|
3084
|
+
"panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
|
|
3085
|
+
"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.",
|
|
3086
|
+
"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.",
|
|
3087
|
+
"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.",
|
|
3088
|
+
"panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
|
|
3089
|
+
"panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
|
|
3090
|
+
"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.",
|
|
3091
|
+
"panels.market.add.pluginAlias": "Plugin name: {name}",
|
|
3092
|
+
"panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
|
|
3093
|
+
"panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
|
|
3094
|
+
"panels.market.add.failureNetwork": "The network connection failed",
|
|
3095
|
+
"panels.market.add.failureNotFound": "No such module found",
|
|
3096
|
+
"panels.market.add.failureNoMatchingVersion": "No matching version",
|
|
3097
|
+
"panels.market.add.failureDiskFull": "Out of disk space, install stopped",
|
|
3098
|
+
"panels.market.add.failurePermission": "No write permission, cannot install",
|
|
3099
|
+
"panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
|
|
3100
|
+
"panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
|
|
3101
|
+
"panels.market.add.failureTimeout": "The install timed out",
|
|
3102
|
+
"panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
|
|
3103
|
+
"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",
|
|
3104
|
+
"panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
|
|
3105
|
+
"panels.market.add.approveTitle": "Your approval is needed for install scripts",
|
|
3106
|
+
"panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
|
|
3107
|
+
"panels.market.add.approveRun": "Allow and continue installing",
|
|
3108
|
+
"panels.market.add.restart": "Installed — restart once to pick it up.",
|
|
3109
|
+
"panels.market.add.tookEffect": "Live.",
|
|
3110
|
+
"panels.market.add.details": "Install details",
|
|
3111
|
+
"panels.market.add.open": "Add module",
|
|
3112
|
+
"panels.market.add.title": "Add module",
|
|
3113
|
+
"panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
|
|
3114
|
+
"panels.market.add.specLabel": "Package",
|
|
3115
|
+
"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.",
|
|
3116
|
+
"panels.market.add.exampleTitle": "Examples",
|
|
3117
|
+
"panels.market.add.exampleFill": "Fill in an example",
|
|
3118
|
+
"panels.market.add.registryLabel": "Source",
|
|
3119
|
+
"panels.market.add.registryProfile": "This profile's registry",
|
|
3120
|
+
"panels.market.add.registryPnpm": "pnpm's own registry",
|
|
3121
|
+
"panels.market.add.check": "Check",
|
|
3122
|
+
"panels.market.add.checking": "Checking…",
|
|
3123
|
+
"panels.market.add.classifying": "Checking…",
|
|
3124
|
+
"panels.market.add.change": "Edit",
|
|
3125
|
+
"panels.market.add.previewTitle": "About to install",
|
|
3126
|
+
"panels.market.add.fieldName": "Package",
|
|
3127
|
+
"panels.market.add.fieldVersion": "Version",
|
|
3128
|
+
"panels.market.add.fieldDescription": "Description",
|
|
3129
|
+
"panels.market.add.fieldSource": "Source",
|
|
3130
|
+
"panels.market.add.install": "Install",
|
|
3131
|
+
"panels.market.add.installing": "Installing…",
|
|
3132
|
+
"panels.market.add.cancel": "Cancel install",
|
|
3133
|
+
"panels.market.add.close": "Close",
|
|
3134
|
+
"panels.market.add.retry": "Retry",
|
|
3135
|
+
"panels.market.add.changeSource": "Change source",
|
|
3136
|
+
"panels.market.add.approveBuilds": "Allow these scripts and retry",
|
|
3137
|
+
"panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
|
|
3138
|
+
"panels.market.add.doneApplied": "Installed and live.",
|
|
3139
|
+
"panels.market.add.doneRestart": "Installed — restart once to pick it up.",
|
|
3140
|
+
"panels.market.add.restartWhy": "Why this needs a restart: {reason}",
|
|
3141
|
+
"panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
|
|
3142
|
+
"panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
|
|
3143
|
+
"panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
|
|
3144
|
+
"panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
|
|
3145
|
+
"panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
|
|
3146
|
+
"panels.market.add.cancelled": "Cancelled.",
|
|
3147
|
+
"panels.market.add.failed": "Didn't work: {reason}",
|
|
3148
|
+
"panels.market.add.removed": "It has been removed.",
|
|
3149
|
+
"panels.market.add.supplyPending": "Its plugins install after you restart.",
|
|
3150
|
+
"panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
|
|
3151
|
+
"panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
|
|
3152
|
+
"panels.market.add.removedRestart": "Removed — restart once to finish.",
|
|
3153
|
+
"panels.market.add.remove": "Remove it",
|
|
3154
|
+
"panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
|
|
3155
|
+
"panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
|
|
3156
|
+
"panels.market.add.problem.notFound": "No such package on that source.",
|
|
3157
|
+
"panels.market.add.problem.notAPackage": "There is no package at that location.",
|
|
3158
|
+
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
|
|
3159
|
+
"panels.market.add.problem.network": "The source is unreachable.",
|
|
3160
|
+
"panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
|
|
3161
|
+
"panels.market.add.reason.invalidSpec": "the spec is not accepted",
|
|
3162
|
+
"panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
|
|
3163
|
+
"panels.market.add.reason.notBundle": "it is not a dsh plugin package",
|
|
3164
|
+
"panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
|
|
3165
|
+
"panels.market.add.reason.bundleInUse": "something is still using it",
|
|
3166
|
+
"panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
|
|
3167
|
+
"panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
|
|
3168
|
+
"panels.market.add.reason.operationError": "pnpm failed (see the install output)",
|
|
3169
|
+
"panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
|
|
3170
|
+
"panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
|
|
3171
|
+
"panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
|
|
3172
|
+
"panels.market.add.reason.diskFull": "the disk is full",
|
|
3173
|
+
"panels.market.add.reason.permission": "no permission to write",
|
|
3174
|
+
"panels.market.add.reason.integrity": "the download failed its integrity check",
|
|
3175
|
+
"panels.market.add.reason.timeout": "no output for too long, so it was stopped",
|
|
3176
|
+
"panels.market.add.reason.network": "the network is unreachable",
|
|
3177
|
+
"panels.market.add.reason.notFound": "no such package on the source",
|
|
3178
|
+
"panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
|
|
3179
|
+
"blocker.fix.install": "Install for me",
|
|
3180
|
+
"blocker.fix.update": "Upgrade for me",
|
|
3181
|
+
"blocker.fix.running": "Running…",
|
|
3182
|
+
"blocker.fix.failed": "Failed: ",
|
|
3183
|
+
"blocker.retry": "Retry",
|
|
3184
|
+
"blocker.retry.running": "Retrying…",
|
|
3185
|
+
"blocker.copy": "Copy command",
|
|
3186
|
+
"blocker.market.open": "Open the module market",
|
|
3187
|
+
"blocker.login.title": "Sign in to {platform}",
|
|
3188
|
+
"blocker.login.titleGeneric": "Sign-in required",
|
|
3189
|
+
"blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
|
|
3190
|
+
"blocker.login.go": "Go sign in",
|
|
3191
|
+
"blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
|
|
3192
|
+
"blocker.forbidden.title": "No access to {platform}",
|
|
3193
|
+
"blocker.forbidden.titleGeneric": "No access",
|
|
3194
|
+
"blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
|
|
3195
|
+
"blocker.forbidden.open": "Open permissions page",
|
|
3196
|
+
"blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
|
|
3197
|
+
"blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
|
|
3198
|
+
"blocker.unknown.title": "Something went wrong",
|
|
3199
|
+
"panels.reading": "Reading the panel setup…",
|
|
3200
|
+
"panels.cardBroken": "This module will not render: {unit} ({reason})",
|
|
3201
|
+
"panels.cardRetry": "Retry",
|
|
3202
|
+
"panels.empty": "No modules on the panel yet",
|
|
3203
|
+
"panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
|
|
3204
|
+
"env.title": "Preparing the workbench",
|
|
3205
|
+
"env.checking": "Checking the runtime environment…",
|
|
3206
|
+
"env.installing": "Installing the missing dependency…",
|
|
3207
|
+
"env.failed": "One step away",
|
|
3208
|
+
"env.elapsed": "Waiting {seconds}s",
|
|
3209
|
+
"env.stepFailed.install": "install failed",
|
|
3210
|
+
"env.stepFailed.path": "installed but not found",
|
|
3211
|
+
"env.stepFailed.shell": "no shell channel",
|
|
3212
|
+
"env.bridge.ok": "Connected",
|
|
3213
|
+
"env.bridge.short": "Not connected",
|
|
3214
|
+
"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.",
|
|
3215
|
+
"env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
|
|
3216
|
+
"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.",
|
|
3217
|
+
"env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
|
|
3218
|
+
"env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
|
|
3219
|
+
"env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
|
|
3220
|
+
"env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
|
|
3221
|
+
"env.fix.title": "How to fix it",
|
|
3222
|
+
"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.",
|
|
3223
|
+
"env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
|
|
3224
|
+
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
|
|
3225
|
+
"env.fix.step": "Run this in a terminal, then hit Retry:",
|
|
3226
|
+
"env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
|
|
3227
|
+
"env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
|
|
3228
|
+
"env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
|
|
3229
|
+
"env.fix.network": "Network unreachable: check your network or proxy, then retry.",
|
|
3230
|
+
"env.fix.details": "Details (for troubleshooting)",
|
|
3231
|
+
"env.retry": "Retry",
|
|
3232
|
+
"env.copyCommand": "Copy command",
|
|
3233
|
+
"env.copied": "Copied",
|
|
3234
|
+
"env.step.opencli": "Checking the workbench opencli",
|
|
3235
|
+
"env.step.codingPlugin": "Checking the coding plugin",
|
|
3236
|
+
"env.step.bridge": "Checking the browser bridge",
|
|
3237
|
+
"env.step.warm": "Warming up site sessions",
|
|
3238
|
+
"env.warm.done": "{n} site(s) warmed up",
|
|
3239
|
+
"env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
|
|
3240
|
+
"env.unit.failed": "This module cannot start",
|
|
3241
|
+
"env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
|
|
3242
|
+
"env.unit.missingPlugin": "This module is not ready yet",
|
|
3243
|
+
"env.unit.missingCommandsHint": "Updating it should fix this.",
|
|
3244
|
+
"env.unit.unchecked": "Cannot check: no shell channel",
|
|
3245
|
+
"env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
|
|
3246
|
+
"env.unit.missingCommands": "This module is out of date",
|
|
3247
|
+
"env.unit.hint": "Retry after installing; other modules are unaffected.",
|
|
3248
|
+
"rightbar.label": "Data panels",
|
|
3249
|
+
"rightbar.expand": "Expand the data panel",
|
|
3250
|
+
"rightbar.collapse": "Collapse the data panel",
|
|
3251
|
+
"rightbar.column.label": "Right column",
|
|
3252
|
+
"rightbar.column.workbench": "Workbench panel",
|
|
3253
|
+
"rightbar.column.dsh": "dsh panel",
|
|
3254
|
+
"rightbar.refresh": "Refresh",
|
|
3255
|
+
"rightbar.refreshing": "Refreshing…",
|
|
3256
|
+
"rightbar.updatedAt": "updated {time}",
|
|
3257
|
+
"rightbar.noProject": "The current session has no workspace",
|
|
3258
|
+
"rightbar.openPlatform": "Open on the platform",
|
|
3259
|
+
"coding.notARepo.title": "This workspace is not a Coding repository",
|
|
3260
|
+
"error.unknown": "Something went wrong",
|
|
3261
|
+
"board.title": "Workbench panel",
|
|
3262
|
+
"panel.conversation": "Conversation",
|
|
3263
|
+
"panels.label": "Global panels",
|
|
3264
|
+
"configSync.nav": "Config sync",
|
|
3265
|
+
"configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
|
|
3266
|
+
"configSync.source": "Source",
|
|
3267
|
+
"configSync.sourceBroken": "its config is unreadable",
|
|
3268
|
+
"configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
|
|
3269
|
+
"configSync.sourceDead": "unreadable",
|
|
3270
|
+
"configSync.refresh": "Read again",
|
|
3271
|
+
"configSync.loading": "Reading the source config…",
|
|
3272
|
+
"configSync.readHint": "Pick another source, or read again.",
|
|
3273
|
+
"configSync.tag.new": "New",
|
|
3274
|
+
"configSync.tag.differs": "Differs",
|
|
3275
|
+
"configSync.conflictNote": "Applying replaces this workbench copy with the source",
|
|
3276
|
+
"configSync.code.lang": "yaml",
|
|
3277
|
+
"configSync.code.copy": "Copy",
|
|
3278
|
+
"configSync.code.copied": "Copied",
|
|
3279
|
+
"configSync.code.wrap": "Wrap lines",
|
|
3280
|
+
"configSync.code.unwrap": "No wrap",
|
|
3281
|
+
"configSync.code.collapse": "Collapse",
|
|
3282
|
+
"configSync.code.collapseAria": "Collapse this row",
|
|
3283
|
+
"configSync.code.expandAria": "Expand the diff ({count} more lines)",
|
|
3284
|
+
"configSync.code.expand": "Show {count} more lines",
|
|
3285
|
+
"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",
|
|
3286
|
+
"configSync.apply": "Sync {count} selected",
|
|
3287
|
+
"configSync.applyNone": "Pick some rows first",
|
|
3288
|
+
"configSync.applying": "Writing…",
|
|
3289
|
+
"configSync.applied": "Written to the workbench config · applied",
|
|
3290
|
+
"configSync.appliedIds": "Written this time: {ids}",
|
|
3291
|
+
"configSync.skippedIds": "Left alone (already here): {ids}",
|
|
3292
|
+
"configSync.nothing": "Nothing to sync",
|
|
3293
|
+
"configSync.unreadable": "Cannot read {path}: {reason}",
|
|
3294
|
+
"configSync.noSource": "This machine has no other profile to sync from",
|
|
3295
|
+
"configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
|
|
3296
|
+
"configSync.failed": "The sync did not go through; try again.",
|
|
3297
|
+
"debug.workspace": "this workspace",
|
|
3298
|
+
"debug.status": "Debugging “{title}”",
|
|
3299
|
+
"debug.status.trouble": "Debugging needs your attention ({title})",
|
|
3300
|
+
"debug.stalled": "Debugging paused ({title})",
|
|
3301
|
+
"debug.act.pause": "Pause debugging",
|
|
3302
|
+
"debug.act.resume": "Resume debugging",
|
|
3303
|
+
"debug.act.stop": "Stop debugging",
|
|
3304
|
+
"debug.act.stop.ask": "Confirm stop",
|
|
3305
|
+
"debug.card.here.title": "Debugging “{title}”",
|
|
3306
|
+
"debug.card.here.note": "Do not switch workspaces or touch the panel",
|
|
3307
|
+
"debug.card.away.note": "Switch back to “{title}”",
|
|
3308
|
+
"debug.card.paused.note": "Paused",
|
|
3309
|
+
"debug.card.hidden.note": "Switch back to the Workbench panel",
|
|
3310
|
+
"record.waiting": "Recording handoff · your turn",
|
|
3311
|
+
"record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
|
|
3312
|
+
"record.recording": "Recording",
|
|
3313
|
+
"record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
|
|
3314
|
+
"record.recording.shots": "; to keep a shot of this moment press \"Screenshot\" on the bar ({n} taken)",
|
|
3315
|
+
"record.finished": "Recording finished",
|
|
3316
|
+
"record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
|
|
3317
|
+
"record.act.cancel": "Cancel",
|
|
3318
|
+
"record.act.halt": "Halt",
|
|
3319
|
+
"approval.record.site": "Site",
|
|
3320
|
+
"approval.record.what": "Records",
|
|
3321
|
+
"approval.record.lands": "Lands in",
|
|
3322
|
+
"approval.record.noUrl": "no site given (this call gets refused)",
|
|
3323
|
+
"approval.record.oneAction": "one action",
|
|
3324
|
+
"approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
|
|
3325
|
+
"approval.longTask.what": "Stops",
|
|
3326
|
+
"approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
|
|
3327
|
+
}
|
|
3467
3328
|
};
|
|
3468
3329
|
//#endregion
|
|
3469
3330
|
//#region ../shared/dist/i18n/merge.js
|
|
@@ -3560,18 +3421,6 @@ function insideWorkshop(root, target) {
|
|
|
3560
3421
|
return target.startsWith(base);
|
|
3561
3422
|
}
|
|
3562
3423
|
/**
|
|
3563
|
-
* 把一次探针读数归成椅面归属。
|
|
3564
|
-
* @param probe - 探针读数。
|
|
3565
|
-
* @param workshop - 当前工作区根路径;`null` 表示还不知道当前是哪个工作区。
|
|
3566
|
-
* @returns 外壳不在、或板路径与工作区缺一 → `unknown`;右栏没开或没画出来 → `hidden`;板在本工作区 → `workshop`,否则 `other`。
|
|
3567
|
-
*/
|
|
3568
|
-
function boardFactOf(probe, workshop) {
|
|
3569
|
-
if (!probe.workbench) return "unknown";
|
|
3570
|
-
if (!probe.bar || !probe.open || !probe.drawn) return "hidden";
|
|
3571
|
-
if (probe.board === "" || workshop === null) return "unknown";
|
|
3572
|
-
return insideWorkshop(workshop, probe.board) ? "workshop" : "other";
|
|
3573
|
-
}
|
|
3574
|
-
/**
|
|
3575
3424
|
* 把探针读数归成左栏那句人话的档位。
|
|
3576
3425
|
* @param probe - 探针读数。
|
|
3577
3426
|
* @param workshop - 当前工作区根路径;`null` 一律 `unknown`。
|
|
@@ -3610,492 +3459,7 @@ function holdBusy(since, now, floorMs) {
|
|
|
3610
3459
|
};
|
|
3611
3460
|
}
|
|
3612
3461
|
//#endregion
|
|
3613
|
-
//#region ../shared/dist/lib/diy-debug.js
|
|
3614
|
-
/**
|
|
3615
|
-
* 把工具入参收成人话动作。
|
|
3616
|
-
* @param value - 任意入参值。
|
|
3617
|
-
* @returns `'pause'` / `'resume'` / `'stop'` 原样;别的值(含 `undefined`、多余空白、大小写不同)给 `null`,由调用方拒。
|
|
3618
|
-
*/
|
|
3619
|
-
function parseDebugIntent(value) {
|
|
3620
|
-
return value === "pause" || value === "resume" || value === "stop" ? value : null;
|
|
3621
|
-
}
|
|
3622
|
-
/**
|
|
3623
|
-
* 调试约定的有效期(4 小时,毫秒):超过它没动静的约定算过期、当场让人。
|
|
3624
|
-
*/
|
|
3625
|
-
var DEBUG_STALE_MS = 144e5;
|
|
3626
|
-
function alive$1(state, now) {
|
|
3627
|
-
if (state === null) return null;
|
|
3628
|
-
return now - state.at <= 144e5 ? state : null;
|
|
3629
|
-
}
|
|
3630
|
-
function ownerOf$1(state, sessionId, now) {
|
|
3631
|
-
const held = alive$1(state, now);
|
|
3632
|
-
if (held === null) return "none";
|
|
3633
|
-
return held.sessionId === sessionId ? held : "not-owner";
|
|
3634
|
-
}
|
|
3635
|
-
/**
|
|
3636
|
-
* 造一份新的调试约定存储(进程内存,同一时刻只可能有一份有效约定)。
|
|
3637
|
-
* @returns 存取口;动作成不成都在返回的 `DebugMove` 里,不抛异常。
|
|
3638
|
-
*/
|
|
3639
|
-
function createDebugStore() {
|
|
3640
|
-
let held = null;
|
|
3641
|
-
const live = (now) => alive$1(held, now);
|
|
3642
|
-
return {
|
|
3643
|
-
live,
|
|
3644
|
-
begin(pact) {
|
|
3645
|
-
const current = alive$1(held, pact.now);
|
|
3646
|
-
if (current !== null) return {
|
|
3647
|
-
ok: false,
|
|
3648
|
-
code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
|
|
3649
|
-
};
|
|
3650
|
-
const state = {
|
|
3651
|
-
phase: "debugging",
|
|
3652
|
-
sessionId: pact.sessionId,
|
|
3653
|
-
workspacePath: pact.workspacePath,
|
|
3654
|
-
title: pact.title,
|
|
3655
|
-
board: pact.board,
|
|
3656
|
-
unit: pact.unit,
|
|
3657
|
-
name: pact.name,
|
|
3658
|
-
startedAt: pact.now,
|
|
3659
|
-
at: pact.now
|
|
3660
|
-
};
|
|
3661
|
-
held = state;
|
|
3662
|
-
return {
|
|
3663
|
-
ok: true,
|
|
3664
|
-
state
|
|
3665
|
-
};
|
|
3666
|
-
},
|
|
3667
|
-
pause(sessionId, now) {
|
|
3668
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3669
|
-
if (typeof found === "string") return {
|
|
3670
|
-
ok: false,
|
|
3671
|
-
code: found
|
|
3672
|
-
};
|
|
3673
|
-
if (found.phase === "paused") return {
|
|
3674
|
-
ok: false,
|
|
3675
|
-
code: "already-paused"
|
|
3676
|
-
};
|
|
3677
|
-
const state = {
|
|
3678
|
-
...found,
|
|
3679
|
-
phase: "paused",
|
|
3680
|
-
at: now
|
|
3681
|
-
};
|
|
3682
|
-
held = state;
|
|
3683
|
-
return {
|
|
3684
|
-
ok: true,
|
|
3685
|
-
state
|
|
3686
|
-
};
|
|
3687
|
-
},
|
|
3688
|
-
resume(sessionId, now) {
|
|
3689
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3690
|
-
if (typeof found === "string") return {
|
|
3691
|
-
ok: false,
|
|
3692
|
-
code: found
|
|
3693
|
-
};
|
|
3694
|
-
if (found.phase === "debugging") return {
|
|
3695
|
-
ok: false,
|
|
3696
|
-
code: "already-debugging"
|
|
3697
|
-
};
|
|
3698
|
-
const state = {
|
|
3699
|
-
...found,
|
|
3700
|
-
phase: "debugging",
|
|
3701
|
-
at: now
|
|
3702
|
-
};
|
|
3703
|
-
held = state;
|
|
3704
|
-
return {
|
|
3705
|
-
ok: true,
|
|
3706
|
-
state
|
|
3707
|
-
};
|
|
3708
|
-
},
|
|
3709
|
-
stop(sessionId, now) {
|
|
3710
|
-
const found = ownerOf$1(held, sessionId, now);
|
|
3711
|
-
if (typeof found === "string") return {
|
|
3712
|
-
ok: false,
|
|
3713
|
-
code: found
|
|
3714
|
-
};
|
|
3715
|
-
held = null;
|
|
3716
|
-
return {
|
|
3717
|
-
ok: true,
|
|
3718
|
-
state: found
|
|
3719
|
-
};
|
|
3720
|
-
}
|
|
3721
|
-
};
|
|
3722
|
-
}
|
|
3723
|
-
/**
|
|
3724
|
-
* 「谁还占着」的一句话,用于别人来抢时说清现况。
|
|
3725
|
-
* @param state - 当前有效的那份约定。
|
|
3726
|
-
* @returns 形如「会话 x(自 HH:mm:ssZ 起在调试 y)」的中文串。
|
|
3727
|
-
*/
|
|
3728
|
-
function debugOwnerText(state) {
|
|
3729
|
-
return `会话 ${state.sessionId}(自 ${new Date(state.startedAt).toISOString().slice(11, 19)}Z 起在调试 ${state.unit})`;
|
|
3730
|
-
}
|
|
3731
|
-
//#endregion
|
|
3732
|
-
//#region ../shared/dist/lib/diy-record.js
|
|
3733
|
-
/**
|
|
3734
|
-
* 录制约定的有效期(15 分钟,毫秒):超过它没动静的约定算过期、当场让人。
|
|
3735
|
-
*/
|
|
3736
|
-
var RECORD_STALE_MS = 9e5;
|
|
3737
|
-
/**
|
|
3738
|
-
* 把工具入参收成人话动作。
|
|
3739
|
-
* @param raw - 任意入参值。
|
|
3740
|
-
* @returns `'peek'` / `'halt'` / `'stop'` 原样;别的值(含 `undefined`、多余空白)给 `null`,由调用方拒。
|
|
3741
|
-
*/
|
|
3742
|
-
function parseRecordIntent(raw) {
|
|
3743
|
-
return raw === "peek" || raw === "halt" || raw === "stop" ? raw : null;
|
|
3744
|
-
}
|
|
3745
|
-
function alive(state, now) {
|
|
3746
|
-
if (state === null) return null;
|
|
3747
|
-
return now - state.at <= 9e5 ? state : null;
|
|
3748
|
-
}
|
|
3749
|
-
function ownerOf(state, sessionId, now) {
|
|
3750
|
-
const held = alive(state, now);
|
|
3751
|
-
if (held === null) return "none";
|
|
3752
|
-
return held.sessionId === sessionId ? held : "not-owner";
|
|
3753
|
-
}
|
|
3754
|
-
/**
|
|
3755
|
-
* 造一份新的录制约定存储(进程内存,同一时刻只可能有一份有效约定)。
|
|
3756
|
-
* @returns 存取口;动作成不成都在返回的 `RecordMove` 里,不抛异常。
|
|
3757
|
-
*/
|
|
3758
|
-
function createRecordStore() {
|
|
3759
|
-
let held = null;
|
|
3760
|
-
const live = (now) => alive(held, now);
|
|
3761
|
-
return {
|
|
3762
|
-
live,
|
|
3763
|
-
begin(pact) {
|
|
3764
|
-
const current = alive(held, pact.now);
|
|
3765
|
-
if (current !== null) return {
|
|
3766
|
-
ok: false,
|
|
3767
|
-
code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
|
|
3768
|
-
};
|
|
3769
|
-
const state = {
|
|
3770
|
-
phase: "armed",
|
|
3771
|
-
sessionId: pact.sessionId,
|
|
3772
|
-
workspace: pact.workspace,
|
|
3773
|
-
unit: pact.unit,
|
|
3774
|
-
name: pact.name,
|
|
3775
|
-
url: pact.url,
|
|
3776
|
-
title: pact.title,
|
|
3777
|
-
action: pact.action,
|
|
3778
|
-
expect: pact.expect,
|
|
3779
|
-
captureFile: pact.captureFile,
|
|
3780
|
-
startedAt: pact.now,
|
|
3781
|
-
t0: null,
|
|
3782
|
-
t1: null,
|
|
3783
|
-
at: pact.now
|
|
3784
|
-
};
|
|
3785
|
-
held = state;
|
|
3786
|
-
return {
|
|
3787
|
-
ok: true,
|
|
3788
|
-
state
|
|
3789
|
-
};
|
|
3790
|
-
},
|
|
3791
|
-
started(sessionId, at, now) {
|
|
3792
|
-
const found = ownerOf(held, sessionId, now);
|
|
3793
|
-
if (typeof found === "string") return {
|
|
3794
|
-
ok: false,
|
|
3795
|
-
code: found
|
|
3796
|
-
};
|
|
3797
|
-
if (found.phase === "recording") return {
|
|
3798
|
-
ok: false,
|
|
3799
|
-
code: "already-recording"
|
|
3800
|
-
};
|
|
3801
|
-
if (found.phase !== "armed") return {
|
|
3802
|
-
ok: false,
|
|
3803
|
-
code: "not-armed"
|
|
3804
|
-
};
|
|
3805
|
-
const state = {
|
|
3806
|
-
...found,
|
|
3807
|
-
phase: "recording",
|
|
3808
|
-
t0: at,
|
|
3809
|
-
at: now
|
|
3810
|
-
};
|
|
3811
|
-
held = state;
|
|
3812
|
-
return {
|
|
3813
|
-
ok: true,
|
|
3814
|
-
state
|
|
3815
|
-
};
|
|
3816
|
-
},
|
|
3817
|
-
finished(sessionId, at, now) {
|
|
3818
|
-
const found = ownerOf(held, sessionId, now);
|
|
3819
|
-
if (typeof found === "string") return {
|
|
3820
|
-
ok: false,
|
|
3821
|
-
code: found
|
|
3822
|
-
};
|
|
3823
|
-
if (found.phase !== "recording") return {
|
|
3824
|
-
ok: false,
|
|
3825
|
-
code: "not-recording"
|
|
3826
|
-
};
|
|
3827
|
-
const state = {
|
|
3828
|
-
...found,
|
|
3829
|
-
phase: "finished",
|
|
3830
|
-
t1: at,
|
|
3831
|
-
at: now
|
|
3832
|
-
};
|
|
3833
|
-
held = state;
|
|
3834
|
-
return {
|
|
3835
|
-
ok: true,
|
|
3836
|
-
state
|
|
3837
|
-
};
|
|
3838
|
-
},
|
|
3839
|
-
stop(sessionId, now) {
|
|
3840
|
-
const found = ownerOf(held, sessionId, now);
|
|
3841
|
-
if (typeof found === "string") return {
|
|
3842
|
-
ok: false,
|
|
3843
|
-
code: found
|
|
3844
|
-
};
|
|
3845
|
-
held = null;
|
|
3846
|
-
return {
|
|
3847
|
-
ok: true,
|
|
3848
|
-
state: found
|
|
3849
|
-
};
|
|
3850
|
-
}
|
|
3851
|
-
};
|
|
3852
|
-
}
|
|
3853
|
-
/**
|
|
3854
|
-
* 「谁还占着、在录哪个动作」的一句话,用于别人来抢时说清现况。
|
|
3855
|
-
* @param state - 当前有效的那份约定。
|
|
3856
|
-
* @returns 形如「会话 x(自 HH:mm:ssZ 起在录 y 的「动作」)」的中文串。
|
|
3857
|
-
*/
|
|
3858
|
-
function recordOwnerText(state) {
|
|
3859
|
-
const at = new Date(state.startedAt).toISOString().slice(11, 19);
|
|
3860
|
-
return `会话 ${state.sessionId}(自 ${at}Z 起在录 ${state.unit} 的「${state.action}」)`;
|
|
3861
|
-
}
|
|
3862
|
-
/**
|
|
3863
|
-
* 同一原因的连续崩溃算进同一次计数的窗口(10 分钟,毫秒)。
|
|
3864
|
-
*/
|
|
3865
|
-
var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
|
|
3866
|
-
/**
|
|
3867
|
-
* 上报文本字段的截断长度(2000 字符;workspace / reason / message 共用)。
|
|
3868
|
-
*/
|
|
3869
|
-
var PANEL_STATE_MAX_TEXT = 2e3;
|
|
3870
|
-
var PHASES = [
|
|
3871
|
-
"idle",
|
|
3872
|
-
"loading",
|
|
3873
|
-
"ready",
|
|
3874
|
-
"error"
|
|
3875
|
-
];
|
|
3876
|
-
function asRecord(value) {
|
|
3877
|
-
return typeof value === "object" && value !== null ? value : void 0;
|
|
3878
|
-
}
|
|
3879
|
-
function textOf$1(value, max) {
|
|
3880
|
-
if (typeof value !== "string") return "";
|
|
3881
|
-
const trimmed = value.trim();
|
|
3882
|
-
return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
|
|
3883
|
-
}
|
|
3884
|
-
function atOf(value) {
|
|
3885
|
-
if (typeof value !== "number" || !Number.isFinite(value)) return null;
|
|
3886
|
-
if (value < 0) return null;
|
|
3887
|
-
return Math.trunc(value);
|
|
3888
|
-
}
|
|
3889
|
-
function errorOf(raw) {
|
|
3890
|
-
const record = asRecord(raw);
|
|
3891
|
-
if (record === void 0) return void 0;
|
|
3892
|
-
const code = textOf$1(record["code"], 120);
|
|
3893
|
-
const message = textOf$1(record["message"], PANEL_STATE_MAX_TEXT);
|
|
3894
|
-
if (code === "" && message === "") return void 0;
|
|
3895
|
-
return {
|
|
3896
|
-
code: code === "" ? "unknown" : code,
|
|
3897
|
-
message
|
|
3898
|
-
};
|
|
3899
|
-
}
|
|
3900
|
-
/**
|
|
3901
|
-
* 收一批卡片读数上报。
|
|
3902
|
-
* @param payload - `POST` 的请求体。
|
|
3903
|
-
* @returns 至少收到一条能认的卡片才 `ok: true`;请求体不是对象、`workspace` 为空、`cards` 不是数组,
|
|
3904
|
-
* 或一条都认不出(`unit` / `route` / `phase` / `at` 缺一)时 `ok: false` + 中文原因;认不出的单条静默跳过。
|
|
3905
|
-
*/
|
|
3906
|
-
function parseCardsReport(payload) {
|
|
3907
|
-
const record = asRecord(payload);
|
|
3908
|
-
if (record === void 0) return {
|
|
3909
|
-
ok: false,
|
|
3910
|
-
message: "请求体要是一个对象"
|
|
3911
|
-
};
|
|
3912
|
-
const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
|
|
3913
|
-
if (workspace === "") return {
|
|
3914
|
-
ok: false,
|
|
3915
|
-
message: "workspace 不能是空的 —— 面板按工作区存"
|
|
3916
|
-
};
|
|
3917
|
-
const raw = record["cards"];
|
|
3918
|
-
if (!Array.isArray(raw)) return {
|
|
3919
|
-
ok: false,
|
|
3920
|
-
message: "cards 要是一个数组"
|
|
3921
|
-
};
|
|
3922
|
-
const cards = [];
|
|
3923
|
-
for (const item of raw.slice(0, 32)) {
|
|
3924
|
-
const card = asRecord(item);
|
|
3925
|
-
if (card === void 0) continue;
|
|
3926
|
-
const unit = textOf$1(card["unit"], 200);
|
|
3927
|
-
const route = textOf$1(card["route"], 400);
|
|
3928
|
-
const phase = textOf$1(card["phase"], 20);
|
|
3929
|
-
const at = atOf(card["at"]);
|
|
3930
|
-
if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
|
|
3931
|
-
const error = errorOf(card["error"]);
|
|
3932
|
-
cards.push({
|
|
3933
|
-
unit,
|
|
3934
|
-
route,
|
|
3935
|
-
phase,
|
|
3936
|
-
at,
|
|
3937
|
-
...error === void 0 ? {} : { error }
|
|
3938
|
-
});
|
|
3939
|
-
}
|
|
3940
|
-
if (cards.length === 0) return {
|
|
3941
|
-
ok: false,
|
|
3942
|
-
message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
|
|
3943
|
-
};
|
|
3944
|
-
return {
|
|
3945
|
-
ok: true,
|
|
3946
|
-
value: {
|
|
3947
|
-
workspace,
|
|
3948
|
-
cards
|
|
3949
|
-
}
|
|
3950
|
-
};
|
|
3951
|
-
}
|
|
3952
|
-
/**
|
|
3953
|
-
* 收一次卡片崩溃上报。
|
|
3954
|
-
* @param payload - `POST` 的请求体。
|
|
3955
|
-
* @returns `workspace` / `unit` / `reason` 都不能空,缺一给 `ok: false` + 中文原因;`at` 缺省或不合法时取当前时间。
|
|
3956
|
-
*/
|
|
3957
|
-
function parseCrashReport(payload) {
|
|
3958
|
-
const record = asRecord(payload);
|
|
3959
|
-
if (record === void 0) return {
|
|
3960
|
-
ok: false,
|
|
3961
|
-
message: "请求体要是一个对象"
|
|
3962
|
-
};
|
|
3963
|
-
const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
|
|
3964
|
-
const unit = textOf$1(record["unit"], 200);
|
|
3965
|
-
const reason = textOf$1(record["reason"], PANEL_STATE_MAX_TEXT);
|
|
3966
|
-
if (workspace === "") return {
|
|
3967
|
-
ok: false,
|
|
3968
|
-
message: "workspace 不能是空的"
|
|
3969
|
-
};
|
|
3970
|
-
if (unit === "") return {
|
|
3971
|
-
ok: false,
|
|
3972
|
-
message: "unit 不能是空的"
|
|
3973
|
-
};
|
|
3974
|
-
if (reason === "") return {
|
|
3975
|
-
ok: false,
|
|
3976
|
-
message: "reason 不能是空的(没有原因的崩溃没法查)"
|
|
3977
|
-
};
|
|
3978
|
-
return {
|
|
3979
|
-
ok: true,
|
|
3980
|
-
value: {
|
|
3981
|
-
workspace,
|
|
3982
|
-
unit,
|
|
3983
|
-
reason,
|
|
3984
|
-
at: atOf(record["at"]) ?? Date.now()
|
|
3985
|
-
}
|
|
3986
|
-
};
|
|
3987
|
-
}
|
|
3988
|
-
/**
|
|
3989
|
-
* 造一份面板运行态的留存(进程内存、按工作区分桶,带上面那几条上限的 LRU)。
|
|
3990
|
-
* @returns 留存口:`cards` / `crash` 收上报,`snapshot(workspace)` 取全量;没存过的工作区(含 `null`)给一份空的。
|
|
3991
|
-
*/
|
|
3992
|
-
function createPanelStateStore() {
|
|
3993
|
-
const workspaces = /* @__PURE__ */ new Map();
|
|
3994
|
-
function trim(entry, max) {
|
|
3995
|
-
while (entry.size > max) {
|
|
3996
|
-
const oldest = entry.keys().next();
|
|
3997
|
-
if (oldest.done === true) return;
|
|
3998
|
-
entry.delete(oldest.value);
|
|
3999
|
-
}
|
|
4000
|
-
}
|
|
4001
|
-
function workspaceEntryOf(workspace) {
|
|
4002
|
-
const existing = workspaces.get(workspace);
|
|
4003
|
-
if (existing !== void 0) return existing;
|
|
4004
|
-
const created = {
|
|
4005
|
-
at: 0,
|
|
4006
|
-
units: /* @__PURE__ */ new Map()
|
|
4007
|
-
};
|
|
4008
|
-
workspaces.set(workspace, created);
|
|
4009
|
-
trim(workspaces, 64);
|
|
4010
|
-
return created;
|
|
4011
|
-
}
|
|
4012
|
-
function unitEntryOf(entry, unit) {
|
|
4013
|
-
const existing = entry.units.get(unit);
|
|
4014
|
-
if (existing !== void 0) return existing;
|
|
4015
|
-
const created = {
|
|
4016
|
-
at: 0,
|
|
4017
|
-
cards: /* @__PURE__ */ new Map()
|
|
4018
|
-
};
|
|
4019
|
-
entry.units.set(unit, created);
|
|
4020
|
-
return created;
|
|
4021
|
-
}
|
|
4022
|
-
return {
|
|
4023
|
-
cards(report) {
|
|
4024
|
-
const entry = workspaceEntryOf(report.workspace);
|
|
4025
|
-
for (const card of report.cards) {
|
|
4026
|
-
const unit = unitEntryOf(entry, card.unit);
|
|
4027
|
-
unit.cards.delete(card.route);
|
|
4028
|
-
unit.cards.set(card.route, card);
|
|
4029
|
-
trim(unit.cards, 12);
|
|
4030
|
-
if (card.at > unit.at) unit.at = card.at;
|
|
4031
|
-
if (card.at > entry.at) entry.at = card.at;
|
|
4032
|
-
}
|
|
4033
|
-
},
|
|
4034
|
-
crash(report) {
|
|
4035
|
-
const entry = workspaceEntryOf(report.workspace);
|
|
4036
|
-
const unit = unitEntryOf(entry, report.unit);
|
|
4037
|
-
const previous = unit.crash;
|
|
4038
|
-
const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
|
|
4039
|
-
unit.crash = {
|
|
4040
|
-
unit: report.unit,
|
|
4041
|
-
reason: report.reason,
|
|
4042
|
-
at: report.at,
|
|
4043
|
-
count: counted ? previous.count + 1 : 1
|
|
4044
|
-
};
|
|
4045
|
-
if (report.at > unit.at) unit.at = report.at;
|
|
4046
|
-
if (report.at > entry.at) entry.at = report.at;
|
|
4047
|
-
},
|
|
4048
|
-
snapshot(workspace) {
|
|
4049
|
-
if (workspace === null) return {
|
|
4050
|
-
workspace: null,
|
|
4051
|
-
at: 0,
|
|
4052
|
-
units: []
|
|
4053
|
-
};
|
|
4054
|
-
const entry = workspaces.get(workspace);
|
|
4055
|
-
if (entry === void 0) return {
|
|
4056
|
-
workspace,
|
|
4057
|
-
at: 0,
|
|
4058
|
-
units: []
|
|
4059
|
-
};
|
|
4060
|
-
const units = [...entry.units.entries()].map(([unit, one]) => {
|
|
4061
|
-
const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
|
|
4062
|
-
const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
|
|
4063
|
-
return {
|
|
4064
|
-
unit,
|
|
4065
|
-
at: one.at,
|
|
4066
|
-
okAt,
|
|
4067
|
-
cards,
|
|
4068
|
-
...one.crash === void 0 ? {} : { crash: one.crash }
|
|
4069
|
-
};
|
|
4070
|
-
});
|
|
4071
|
-
units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
|
|
4072
|
-
return {
|
|
4073
|
-
workspace,
|
|
4074
|
-
at: entry.at,
|
|
4075
|
-
units
|
|
4076
|
-
};
|
|
4077
|
-
}
|
|
4078
|
-
};
|
|
4079
|
-
}
|
|
4080
|
-
//#endregion
|
|
4081
3462
|
//#region ../shared/dist/lib/text.js
|
|
4082
|
-
/**
|
|
4083
|
-
* 把一个值裹成 shell 里的单引号字面量(值里的单引号一并转义),保证元字符按字面量传递。
|
|
4084
|
-
* @param value - 任意值;不是字符串的先 `String()`。
|
|
4085
|
-
* @returns 可安全拼进 `/bin/sh -c` 的一段文本 —— 含空格 / `$()` / `;` / 通配符的值都不会被当成语法。
|
|
4086
|
-
*/
|
|
4087
|
-
function quoteShellArg(value) {
|
|
4088
|
-
return `'${String(value).replace(/'/g, `'\\''`)}'`;
|
|
4089
|
-
}
|
|
4090
|
-
/**
|
|
4091
|
-
* 取一段文本的末尾若干行(如命令输出),顺带去掉首尾空白。
|
|
4092
|
-
* @param text - 原文;`null` / `undefined` 当空串。
|
|
4093
|
-
* @param lines - 最多留几行,默认 6;0 给全篇、负数从开头砍掉那么多行(都是 `slice` 语义),调用方传正数。
|
|
4094
|
-
* @returns 末尾若干行、去首尾空行后的文本;原文行数不够就全给,空输入给空串。
|
|
4095
|
-
*/
|
|
4096
|
-
function tailLines(text, lines = 6) {
|
|
4097
|
-
return String(text ?? "").trim().split("\n").slice(-lines).join("\n");
|
|
4098
|
-
}
|
|
4099
3463
|
function candidateStarts(raw) {
|
|
4100
3464
|
const starts = [];
|
|
4101
3465
|
for (let index = 0; index < raw.length; index += 1) {
|
|
@@ -4149,198 +3513,6 @@ function excerpt(text, limit = 80) {
|
|
|
4149
3513
|
return `${flat.slice(0, limit).trimEnd()}…`;
|
|
4150
3514
|
}
|
|
4151
3515
|
//#endregion
|
|
4152
|
-
//#region ../shared/dist/index.js
|
|
4153
|
-
var dist_exports = /* @__PURE__ */ __exportAll({
|
|
4154
|
-
ACTIONS_PREFIX: () => ACTIONS_PREFIX,
|
|
4155
|
-
API_PREFIX: () => API_PREFIX,
|
|
4156
|
-
ActivityAction: () => ActivityAction,
|
|
4157
|
-
ActivityBlock: () => ActivityBlock,
|
|
4158
|
-
ActivityLine: () => ActivityLine,
|
|
4159
|
-
ApprovalDetail: () => ApprovalDetail,
|
|
4160
|
-
ApprovalPlan: () => ApprovalPlan,
|
|
4161
|
-
CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
|
|
4162
|
-
CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
|
|
4163
|
-
Card: () => Card,
|
|
4164
|
-
CardAnchor: () => CardAnchor,
|
|
4165
|
-
CardBoundary: () => CardBoundary,
|
|
4166
|
-
CardHead: () => CardHead,
|
|
4167
|
-
CenteredState: () => CenteredState,
|
|
4168
|
-
ChoiceGroup: () => ChoiceGroup,
|
|
4169
|
-
Component: () => Component,
|
|
4170
|
-
DEBUG_STALE_MS: () => DEBUG_STALE_MS,
|
|
4171
|
-
DECLARATION_KEYS: () => DECLARATION_KEYS,
|
|
4172
|
-
DECLARATION_REQUIRED_KEYS: () => DECLARATION_REQUIRED_KEYS,
|
|
4173
|
-
DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
|
|
4174
|
-
DIY_DEBUG_ACT_PATH: () => DIY_DEBUG_ACT_PATH,
|
|
4175
|
-
DIY_DEBUG_PATH: () => DIY_DEBUG_PATH,
|
|
4176
|
-
DIY_DEBUG_SERVICE: () => DIY_DEBUG_SERVICE,
|
|
4177
|
-
DIY_RECORD_ACT_PATH: () => DIY_RECORD_ACT_PATH,
|
|
4178
|
-
DIY_RECORD_PATH: () => DIY_RECORD_PATH,
|
|
4179
|
-
DIY_RECORD_SERVICE: () => DIY_RECORD_SERVICE,
|
|
4180
|
-
EVENTS_PATH: () => EVENTS_PATH,
|
|
4181
|
-
EmptyState: () => EmptyState,
|
|
4182
|
-
FACT_SCOPE_SUFFIX: () => "*",
|
|
4183
|
-
Field: () => Field,
|
|
4184
|
-
Form: () => Form,
|
|
4185
|
-
FormActions: () => FormActions,
|
|
4186
|
-
FormRow: () => FormRow,
|
|
4187
|
-
FormRows: () => FormRows,
|
|
4188
|
-
Fragment: () => Fragment,
|
|
4189
|
-
GIT_TIMEOUT_MS: () => GIT_TIMEOUT_MS,
|
|
4190
|
-
HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
|
|
4191
|
-
INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
|
|
4192
|
-
IconBrandMark: () => IconBrandMark,
|
|
4193
|
-
IconConversation: () => IconConversation,
|
|
4194
|
-
IconModuleMark: () => IconModuleMark,
|
|
4195
|
-
IconModules: () => IconModules,
|
|
4196
|
-
IconNpm: () => IconNpm,
|
|
4197
|
-
IconOpencli: () => IconOpencli,
|
|
4198
|
-
IconPanelScreen: () => IconPanelScreen,
|
|
4199
|
-
LOCALES: () => LOCALES,
|
|
4200
|
-
LOCALE_NS: () => LOCALE_NS,
|
|
4201
|
-
LONG_TASK_IDLE_MS: () => LONG_TASK_IDLE_MS,
|
|
4202
|
-
LONG_TASK_POLL_MS: () => LONG_TASK_POLL_MS,
|
|
4203
|
-
Link: () => Link,
|
|
4204
|
-
LongTaskRow: () => LongTaskRow,
|
|
4205
|
-
MIN_BUSY_MS: () => 500,
|
|
4206
|
-
Note: () => Note,
|
|
4207
|
-
OPENCLI_MAX_CONCURRENT: () => 4,
|
|
4208
|
-
OPENCLI_PIN: () => OPENCLI_PIN,
|
|
4209
|
-
OPENCLI_TIMEOUT_MS: () => OPENCLI_TIMEOUT_MS,
|
|
4210
|
-
PANELS_SERVICE: () => PANELS_SERVICE,
|
|
4211
|
-
PANEL_LIST_LIMIT: () => 50,
|
|
4212
|
-
PANEL_POLL_MS: () => PANEL_POLL_MS,
|
|
4213
|
-
PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
|
|
4214
|
-
PANEL_STATE_MAX_CARDS: () => 12,
|
|
4215
|
-
PANEL_STATE_MAX_REPORTS: () => 32,
|
|
4216
|
-
PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
|
|
4217
|
-
PANEL_STATE_MAX_UNITS: () => 64,
|
|
4218
|
-
PANEL_STATE_PATH: () => PANEL_STATE_PATH,
|
|
4219
|
-
PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
|
|
4220
|
-
PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
|
|
4221
|
-
PLUGIN_ID: () => PLUGIN_ID,
|
|
4222
|
-
PREFS_PREFIX: () => PREFS_PREFIX,
|
|
4223
|
-
PROBE_TTL_MS: () => PROBE_TTL_MS,
|
|
4224
|
-
PROVISION_PREFIX: () => PROVISION_PREFIX,
|
|
4225
|
-
RECORD_STALE_MS: () => RECORD_STALE_MS,
|
|
4226
|
-
RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
|
|
4227
|
-
RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
|
|
4228
|
-
Row: () => Row,
|
|
4229
|
-
Rows: () => Rows,
|
|
4230
|
-
SESSION_PROJECTIONS_SERVICE: () => SESSION_PROJECTIONS_SERVICE,
|
|
4231
|
-
STORAGE_KEY_PROJECT: () => STORAGE_KEY_PROJECT,
|
|
4232
|
-
STORAGE_KEY_RIGHTBAR: () => STORAGE_KEY_RIGHTBAR,
|
|
4233
|
-
STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
|
|
4234
|
-
STORAGE_KEY_RIGHTBAR_WIDTH: () => STORAGE_KEY_RIGHTBAR_WIDTH,
|
|
4235
|
-
SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
|
|
4236
|
-
SaveBar: () => SaveBar,
|
|
4237
|
-
SelectField: () => SelectField,
|
|
4238
|
-
SettingsSection: () => SettingsSection,
|
|
4239
|
-
SkeletonRows: () => SkeletonRows,
|
|
4240
|
-
Spinner: () => Spinner,
|
|
4241
|
-
Stack: () => Stack,
|
|
4242
|
-
StateBlock: () => StateBlock,
|
|
4243
|
-
TextField: () => TextField,
|
|
4244
|
-
UNITS_SERVICE: () => UNITS_SERVICE,
|
|
4245
|
-
VERSION_CHECK_TIMEOUT_MS: () => VERSION_CHECK_TIMEOUT_MS,
|
|
4246
|
-
VERSION_CHECK_TTL_MS: () => VERSION_CHECK_TTL_MS,
|
|
4247
|
-
WARM_TIMEOUT_MS: () => WARM_TIMEOUT_MS,
|
|
4248
|
-
WORKBENCH_API_VERSION: () => 1,
|
|
4249
|
-
apiGet: () => apiGet,
|
|
4250
|
-
apiPost: () => apiPost,
|
|
4251
|
-
blockerActionLabel: () => blockerActionLabel,
|
|
4252
|
-
blockerOfCapability: () => blockerOfCapability,
|
|
4253
|
-
blockerOfError: () => blockerOfError,
|
|
4254
|
-
blockerPending: () => blockerPending,
|
|
4255
|
-
boardFactOf: () => boardFactOf,
|
|
4256
|
-
boardSituation: () => boardSituation,
|
|
4257
|
-
buildMarker: () => buildMarker,
|
|
4258
|
-
cardIdOf: () => cardIdOf,
|
|
4259
|
-
createContext: () => createContext,
|
|
4260
|
-
createDebugStore: () => createDebugStore,
|
|
4261
|
-
createFactChannel: () => createFactChannel,
|
|
4262
|
-
createPanelStateStore: () => createPanelStateStore,
|
|
4263
|
-
createRecordStore: () => createRecordStore,
|
|
4264
|
-
cx: () => cx,
|
|
4265
|
-
debugOwnerText: () => debugOwnerText,
|
|
4266
|
-
declarationProblemsOf: () => declarationProblemsOf,
|
|
4267
|
-
decodeRef: () => decodeRef,
|
|
4268
|
-
defaultSelectFilter: () => defaultSelectFilter,
|
|
4269
|
-
dictionaries: () => dictionaries,
|
|
4270
|
-
duplicateKeysOf: () => duplicateKeysOf,
|
|
4271
|
-
en: () => en,
|
|
4272
|
-
encodeRef: () => encodeRef,
|
|
4273
|
-
errorReasonOf: () => errorReasonOf,
|
|
4274
|
-
excerpt: () => excerpt,
|
|
4275
|
-
factOfRoute: () => factOfRoute,
|
|
4276
|
-
filterSelectOptions: () => filterSelectOptions,
|
|
4277
|
-
firstProblemOf: () => firstProblemOf,
|
|
4278
|
-
formActionsOf: () => formActionsOf,
|
|
4279
|
-
formFirstProblemOf: () => formFirstProblemOf,
|
|
4280
|
-
formProblemsOf: () => formProblemsOf,
|
|
4281
|
-
formRowsOf: () => formRowsOf,
|
|
4282
|
-
formSubmitOf: () => formSubmitOf,
|
|
4283
|
-
formValuesOf: () => formValuesOf,
|
|
4284
|
-
gateOf: () => gateOf,
|
|
4285
|
-
h: () => h,
|
|
4286
|
-
hasEnvSupply: () => hasEnvSupply,
|
|
4287
|
-
holdBusy: () => holdBusy,
|
|
4288
|
-
insideWorkshop: () => insideWorkshop,
|
|
4289
|
-
isFactScope: () => isFactScope,
|
|
4290
|
-
longTaskDot: () => longTaskDot,
|
|
4291
|
-
longTaskPollMs: () => longTaskPollMs,
|
|
4292
|
-
longTaskRunsOf: () => longTaskRunsOf,
|
|
4293
|
-
markerBody: () => markerBody,
|
|
4294
|
-
mergeMessages: () => mergeMessages,
|
|
4295
|
-
mergeMessagesSkipping: () => mergeMessagesSkipping,
|
|
4296
|
-
parseCardsReport: () => parseCardsReport,
|
|
4297
|
-
parseCrashReport: () => parseCrashReport,
|
|
4298
|
-
parseDebugIntent: () => parseDebugIntent,
|
|
4299
|
-
parseFactFrame: () => parseFactFrame,
|
|
4300
|
-
parseJsonLoose: () => parseJsonLoose,
|
|
4301
|
-
parseLocalTimestamp: () => parseLocalTimestamp,
|
|
4302
|
-
parseMarkers: () => parseMarkers,
|
|
4303
|
-
parseRecordIntent: () => parseRecordIntent,
|
|
4304
|
-
probeKeyOf: () => probeKeyOf,
|
|
4305
|
-
quoteShellArg: () => quoteShellArg,
|
|
4306
|
-
readDeclaration: () => readDeclaration,
|
|
4307
|
-
readFlag: () => readFlag,
|
|
4308
|
-
readText: () => readText,
|
|
4309
|
-
recordOwnerText: () => recordOwnerText,
|
|
4310
|
-
relativeTime: () => relativeTime,
|
|
4311
|
-
relativeTimeAgo: () => relativeTimeAgo,
|
|
4312
|
-
relativeTimeBucket: () => relativeTimeBucket,
|
|
4313
|
-
relativeTimeCompact: () => relativeTimeCompact,
|
|
4314
|
-
reportDuplicateKeys: () => reportDuplicateKeys,
|
|
4315
|
-
revealFirstProblem: () => revealFirstProblem,
|
|
4316
|
-
runsRouteOf: () => runsRouteOf,
|
|
4317
|
-
scopePrefixOf: () => scopePrefixOf,
|
|
4318
|
-
searchTextOf: () => searchTextOf,
|
|
4319
|
-
selectCursorValue: () => selectCursorValue,
|
|
4320
|
-
selectEntries: () => selectEntries,
|
|
4321
|
-
selectLoadingNode: () => selectLoadingNode,
|
|
4322
|
-
selectTriggerNode: () => selectTriggerNode,
|
|
4323
|
-
shortenPath: () => shortenPath,
|
|
4324
|
-
splitBlocker: () => splitBlocker,
|
|
4325
|
-
stepSelectCursor: () => stepSelectCursor,
|
|
4326
|
-
tailLines: () => tailLines,
|
|
4327
|
-
unitFactScope: () => unitFactScope,
|
|
4328
|
-
useCallback: () => useCallback,
|
|
4329
|
-
useContext: () => useContext,
|
|
4330
|
-
useEffect: () => useEffect,
|
|
4331
|
-
useLayoutEffect: () => useLayoutEffect,
|
|
4332
|
-
useMemo: () => useMemo,
|
|
4333
|
-
useRef: () => useRef,
|
|
4334
|
-
useState: () => useState,
|
|
4335
|
-
useSyncExternalStore: () => useSyncExternalStore,
|
|
4336
|
-
visibleFieldsOf: () => visibleFieldsOf,
|
|
4337
|
-
writeFlag: () => writeFlag,
|
|
4338
|
-
writeOutcomeOf: () => writeOutcomeOf,
|
|
4339
|
-
writeRoute: () => writeRoute,
|
|
4340
|
-
writeText: () => writeText,
|
|
4341
|
-
zh: () => zh
|
|
4342
|
-
});
|
|
4343
|
-
//#endregion
|
|
4344
3516
|
//#region src/shared/components/Tip.tsx
|
|
4345
3517
|
/**
|
|
4346
3518
|
* dsh `Tooltip` 的外壳默认值版:说明统一按右栏习惯(`bottom` / `end` / `gap 6` / 挂 body)来,其余 prop 原样转给 `Tooltip`。
|
|
@@ -4513,7 +3685,7 @@ function setProbe(next) {
|
|
|
4513
3685
|
var CAPABILITY_FACT = "capability";
|
|
4514
3686
|
var shared = null;
|
|
4515
3687
|
var current$1 = null;
|
|
4516
|
-
var listeners$
|
|
3688
|
+
var listeners$5 = /* @__PURE__ */ new Set();
|
|
4517
3689
|
/**
|
|
4518
3690
|
* 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
|
|
4519
3691
|
*/
|
|
@@ -4524,9 +3696,9 @@ function capabilityValue() {
|
|
|
4524
3696
|
* 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
|
|
4525
3697
|
*/
|
|
4526
3698
|
function subscribeCapabilities(listener) {
|
|
4527
|
-
listeners$
|
|
3699
|
+
listeners$5.add(listener);
|
|
4528
3700
|
return () => {
|
|
4529
|
-
listeners$
|
|
3701
|
+
listeners$5.delete(listener);
|
|
4530
3702
|
};
|
|
4531
3703
|
}
|
|
4532
3704
|
/**
|
|
@@ -4540,7 +3712,7 @@ function setCapabilities(next, rechecked = false) {
|
|
|
4540
3712
|
});
|
|
4541
3713
|
if (next === current$1) return;
|
|
4542
3714
|
current$1 = next;
|
|
4543
|
-
for (const listener of [...listeners$
|
|
3715
|
+
for (const listener of [...listeners$5]) listener();
|
|
4544
3716
|
}
|
|
4545
3717
|
/**
|
|
4546
3718
|
* 一次强探开始:点亮“正在探”;已经在探就跳过。
|
|
@@ -4712,7 +3884,7 @@ var devSurface = {
|
|
|
4712
3884
|
//#endregion
|
|
4713
3885
|
//#region src/app/layouts/panel-hint.ts
|
|
4714
3886
|
var hints = /* @__PURE__ */ new Map();
|
|
4715
|
-
var listeners$
|
|
3887
|
+
var listeners$4 = /* @__PURE__ */ new Set();
|
|
4716
3888
|
function sameHint(left, right) {
|
|
4717
3889
|
if (left === null || right === null) return left === right;
|
|
4718
3890
|
if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
|
|
@@ -4724,15 +3896,15 @@ function publishPanelHint(id, hint) {
|
|
|
4724
3896
|
if (sameHint(hints.get(id) ?? null, hint)) return;
|
|
4725
3897
|
if (hint === null) hints.delete(id);
|
|
4726
3898
|
else hints.set(id, hint);
|
|
4727
|
-
for (const listener of [...listeners$
|
|
3899
|
+
for (const listener of [...listeners$4]) listener();
|
|
4728
3900
|
}
|
|
4729
3901
|
function panelHintOf(id) {
|
|
4730
3902
|
return id === null ? null : hints.get(id) ?? null;
|
|
4731
3903
|
}
|
|
4732
3904
|
function subscribePanelHints(listener) {
|
|
4733
|
-
listeners$
|
|
3905
|
+
listeners$4.add(listener);
|
|
4734
3906
|
return () => {
|
|
4735
|
-
listeners$
|
|
3907
|
+
listeners$4.delete(listener);
|
|
4736
3908
|
};
|
|
4737
3909
|
}
|
|
4738
3910
|
function usePanelHint(id) {
|
|
@@ -5232,23 +4404,31 @@ function isProblem(row) {
|
|
|
5232
4404
|
function isRestart(row) {
|
|
5233
4405
|
return row.state === "inactive" || row.state === "pending-restart";
|
|
5234
4406
|
}
|
|
5235
|
-
function awaitsRestart(
|
|
5236
|
-
const loaded = new Set(
|
|
5237
|
-
return
|
|
4407
|
+
function awaitsRestart(manifests, installed) {
|
|
4408
|
+
const loaded = new Set(manifests.map((manifest) => manifest.id));
|
|
4409
|
+
return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
|
|
5238
4410
|
}
|
|
4411
|
+
/**
|
|
4412
|
+
* 左栏市场入口那枚徽标这一刻该说什么:`problem`(模块异常)> `restart`(重启后生效)> `updates`(有新版本),
|
|
4413
|
+
* 都没有就 `null`。读法与市场页同一份数据、同一套造行函数。
|
|
4414
|
+
* `busy` 里的单元(正被市场自己更新/卸载的那一单元)当它不在名单里:更新是「先卸再装」,
|
|
4415
|
+
* 卸的那一半会让它从名册里消失,不排掉就会在跑的过程中报一次假的「重启后生效」。
|
|
4416
|
+
*/
|
|
5239
4417
|
function marketHintOf(input) {
|
|
5240
|
-
const
|
|
4418
|
+
const busy = input.busy ?? /* @__PURE__ */ new Set();
|
|
4419
|
+
const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
|
|
4420
|
+
const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
|
|
5241
4421
|
const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
|
|
5242
4422
|
const listed = new Set(catalog.map((row) => row.id));
|
|
5243
4423
|
const self = workbenchRow(input.workbench);
|
|
5244
4424
|
const rows = [
|
|
5245
4425
|
...catalog,
|
|
5246
|
-
...installedRows(
|
|
4426
|
+
...installedRows(installed, input.manifests, listed),
|
|
5247
4427
|
...installedPluginRows(input.plugins ?? []),
|
|
5248
4428
|
...self === void 0 ? [] : [self]
|
|
5249
4429
|
];
|
|
5250
4430
|
const problem = rows.some(isProblem);
|
|
5251
|
-
const restart = rows.some(isRestart) || awaitsRestart(input);
|
|
4431
|
+
const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
|
|
5252
4432
|
const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
|
|
5253
4433
|
const more = [];
|
|
5254
4434
|
if (problem) {
|
|
@@ -5275,6 +4455,81 @@ function marketHintOf(input) {
|
|
|
5275
4455
|
return null;
|
|
5276
4456
|
}
|
|
5277
4457
|
//#endregion
|
|
4458
|
+
//#region src/app/layouts/rightbar/market-busy.ts
|
|
4459
|
+
var listeners$3 = /* @__PURE__ */ new Set();
|
|
4460
|
+
var published = /* @__PURE__ */ new Map();
|
|
4461
|
+
var live$2 = /* @__PURE__ */ new Set();
|
|
4462
|
+
var timer$1;
|
|
4463
|
+
/**
|
|
4464
|
+
* 一条「市场自己正在动它」的事实最多认多久(毫秒):从发布那一刻起算,到点自动撤。
|
|
4465
|
+
* 取的是工作台那一跳同一条窗口 —— 一次替换最长等这么久;正常落地会由发布方先撤掉。
|
|
4466
|
+
*/
|
|
4467
|
+
var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
|
|
4468
|
+
/**
|
|
4469
|
+
* 这一刻哪些单元算「正在被动」:发布过、且没到 {@link MARKET_BUSY_MS} 的那些 id。
|
|
4470
|
+
* 给纯函数与判据用;React 里读 {@link useMarketBusy}(同一份,只是走订阅)。
|
|
4471
|
+
*/
|
|
4472
|
+
function marketBusyIds() {
|
|
4473
|
+
return live$2;
|
|
4474
|
+
}
|
|
4475
|
+
/**
|
|
4476
|
+
* 发布「哪几个单元正被市场自己动」(每次整体替换):点下去那一刻发,落地/失败后发空数组。
|
|
4477
|
+
* 同一个 id 连续发布不会顺延它的期限;空数组等于全撤。
|
|
4478
|
+
*/
|
|
4479
|
+
function publishMarketBusy(ids) {
|
|
4480
|
+
const now = Date.now();
|
|
4481
|
+
const next = /* @__PURE__ */ new Map();
|
|
4482
|
+
for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
|
|
4483
|
+
published = next;
|
|
4484
|
+
refresh(now);
|
|
4485
|
+
}
|
|
4486
|
+
/**
|
|
4487
|
+
* 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
|
|
4488
|
+
*/
|
|
4489
|
+
function subscribeMarketBusy(listener) {
|
|
4490
|
+
listeners$3.add(listener);
|
|
4491
|
+
return () => {
|
|
4492
|
+
listeners$3.delete(listener);
|
|
4493
|
+
};
|
|
4494
|
+
}
|
|
4495
|
+
/**
|
|
4496
|
+
* 组件里读「正被市场自己动的单元」:返回的集合在两次通知之间是同一份引用,可以直接进渲染。
|
|
4497
|
+
*/
|
|
4498
|
+
function useMarketBusy() {
|
|
4499
|
+
return useSyncExternalStore(subscribeMarketBusy, marketBusyIds);
|
|
4500
|
+
}
|
|
4501
|
+
/**
|
|
4502
|
+
* 把「市场正在动哪个单元」挂到这一拍上:`id` 变了就整体替换发布,`null` 等于撤。
|
|
4503
|
+
* 卸载那一下**不清**(更新还在跑,徽标不该改口);到 {@link MARKET_BUSY_MS} 由自己到期兜底。
|
|
4504
|
+
*/
|
|
4505
|
+
function usePublishMarketBusy(id) {
|
|
4506
|
+
useEffect(() => {
|
|
4507
|
+
publishMarketBusy(id === null ? [] : [id]);
|
|
4508
|
+
}, [id]);
|
|
4509
|
+
}
|
|
4510
|
+
function sameSet(left, right) {
|
|
4511
|
+
if (left.size !== right.size) return false;
|
|
4512
|
+
for (const id of left) if (!right.has(id)) return false;
|
|
4513
|
+
return true;
|
|
4514
|
+
}
|
|
4515
|
+
function schedule(now) {
|
|
4516
|
+
if (timer$1 !== void 0) clearTimeout(timer$1);
|
|
4517
|
+
timer$1 = void 0;
|
|
4518
|
+
let soonest = Number.POSITIVE_INFINITY;
|
|
4519
|
+
for (const at of published.values()) soonest = Math.min(soonest, at);
|
|
4520
|
+
if (soonest === Number.POSITIVE_INFINITY) return;
|
|
4521
|
+
timer$1 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
|
|
4522
|
+
}
|
|
4523
|
+
function refresh(now) {
|
|
4524
|
+
for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
|
|
4525
|
+
const next = new Set(published.keys());
|
|
4526
|
+
if (!sameSet(live$2, next)) {
|
|
4527
|
+
live$2 = next;
|
|
4528
|
+
for (const listener of [...listeners$3]) listener();
|
|
4529
|
+
}
|
|
4530
|
+
schedule(now);
|
|
4531
|
+
}
|
|
4532
|
+
//#endregion
|
|
5278
4533
|
//#region src/shared/hooks/use-host-write.ts
|
|
5279
4534
|
var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
|
|
5280
4535
|
/**
|
|
@@ -6209,6 +5464,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
6209
5464
|
const removing = removingIdOf(pending, failed);
|
|
6210
5465
|
const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
|
|
6211
5466
|
const pinned = pinnedRowOf(pending, steady.held);
|
|
5467
|
+
usePublishMarketBusy(heldIdOf(pending, steady.held));
|
|
6212
5468
|
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);
|
|
6213
5469
|
const pendingRow = pendingRowOf({
|
|
6214
5470
|
pending,
|
|
@@ -6292,7 +5548,18 @@ function visiblePendingKind(kind) {
|
|
|
6292
5548
|
default: return;
|
|
6293
5549
|
}
|
|
6294
5550
|
}
|
|
6295
|
-
|
|
5551
|
+
var NO_IDS$1 = /* @__PURE__ */ new Set();
|
|
5552
|
+
/**
|
|
5553
|
+
* 把一条会话读成行上要的那几格。
|
|
5554
|
+
* @param summary 会话摘要。
|
|
5555
|
+
* @param statusById 会话状态表。
|
|
5556
|
+
* @param list 会话快照(子代理花名册在这里)。
|
|
5557
|
+
* @param pinnedIds 置顶的那些。
|
|
5558
|
+
* @param archivedIds 归档的那些。
|
|
5559
|
+
* @param longTaskIds 有长任务在跑的那些会话(外壳那条读口按“这趟是谁起的”算出来的);不给就是都没有。
|
|
5560
|
+
* @returns 行模型;`longTask` 为真表示这条会话起的某趟长任务还在跑(它自己那一轮可能早结束了)。
|
|
5561
|
+
*/
|
|
5562
|
+
function sessionNode(summary, statusById, list, pinnedIds, archivedIds, longTaskIds = NO_IDS$1) {
|
|
6296
5563
|
const status = statusById.get(summary.id);
|
|
6297
5564
|
const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
|
|
6298
5565
|
let runningSubagentCount = 0;
|
|
@@ -6307,6 +5574,7 @@ function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
|
|
|
6307
5574
|
blank: summary.blank,
|
|
6308
5575
|
running: status?.running ?? summary.running,
|
|
6309
5576
|
runningSubagentCount,
|
|
5577
|
+
longTask: longTaskIds.has(summary.id),
|
|
6310
5578
|
completed: status?.completionUnread === true,
|
|
6311
5579
|
pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
|
|
6312
5580
|
updatedAt: summary.updatedAt,
|
|
@@ -6318,6 +5586,10 @@ function sessionStatuses(node, t) {
|
|
|
6318
5586
|
state: "ongoing",
|
|
6319
5587
|
label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
|
|
6320
5588
|
} : void 0;
|
|
5589
|
+
const longTask = {
|
|
5590
|
+
state: "ongoing",
|
|
5591
|
+
label: t("status.longTask")
|
|
5592
|
+
};
|
|
6321
5593
|
let pending;
|
|
6322
5594
|
switch (node.pendingInteraction) {
|
|
6323
5595
|
case "approval":
|
|
@@ -6349,8 +5621,15 @@ function sessionStatuses(node, t) {
|
|
|
6349
5621
|
state: "ongoing",
|
|
6350
5622
|
label: t("status.running")
|
|
6351
5623
|
};
|
|
6352
|
-
|
|
5624
|
+
const rest = node.longTask ? [longTask] : [];
|
|
5625
|
+
if (subagents === void 0) return [primary, ...rest];
|
|
5626
|
+
return [
|
|
5627
|
+
primary,
|
|
5628
|
+
...rest,
|
|
5629
|
+
subagents
|
|
5630
|
+
];
|
|
6353
5631
|
}
|
|
5632
|
+
if (node.longTask) return subagents === void 0 ? [longTask] : [longTask, subagents];
|
|
6354
5633
|
if (subagents !== void 0) return [subagents];
|
|
6355
5634
|
if (node.completed) return [{
|
|
6356
5635
|
state: "done",
|
|
@@ -6411,6 +5690,24 @@ function scrollEdgesOf(metrics) {
|
|
|
6411
5690
|
}
|
|
6412
5691
|
//#endregion
|
|
6413
5692
|
//#region src/modules/sessions/model/attention.ts
|
|
5693
|
+
/**
|
|
5694
|
+
* 把外壳那条长任务读口交回的行折成两侧的归属:有会话可归的进 `bySession`(那一行自己亮),
|
|
5695
|
+
* 每一条都按它属于哪个工作区进 `byWorkspace`(没有会话可归的那些只有这一侧看得见)。
|
|
5696
|
+
* @param rows 还在跑的长任务;每行要有它属于哪个工作区,会话那格可以没有。
|
|
5697
|
+
* @returns 两侧的归属;空输入就是两侧都空。
|
|
5698
|
+
*/
|
|
5699
|
+
function longTaskPresenceOf(rows) {
|
|
5700
|
+
const bySession = /* @__PURE__ */ new Set();
|
|
5701
|
+
const byWorkspace = /* @__PURE__ */ new Map();
|
|
5702
|
+
for (const row of rows) {
|
|
5703
|
+
if (row.session !== void 0) bySession.add(row.session);
|
|
5704
|
+
byWorkspace.set(row.workspace, (byWorkspace.get(row.workspace) ?? 0) + 1);
|
|
5705
|
+
}
|
|
5706
|
+
return {
|
|
5707
|
+
bySession,
|
|
5708
|
+
byWorkspace
|
|
5709
|
+
};
|
|
5710
|
+
}
|
|
6414
5711
|
var RANK = {
|
|
6415
5712
|
warning: 2,
|
|
6416
5713
|
done: 1,
|
|
@@ -6436,10 +5733,10 @@ var WORDS = {
|
|
|
6436
5733
|
done: "project.attention.state.done"
|
|
6437
5734
|
};
|
|
6438
5735
|
var NO_IDS = /* @__PURE__ */ new Set();
|
|
6439
|
-
function attentionOfSession(summary, statusById, sessions) {
|
|
6440
|
-
const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS);
|
|
5736
|
+
function attentionOfSession(summary, statusById, sessions, longTaskIds = NO_IDS) {
|
|
5737
|
+
const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS, longTaskIds);
|
|
6441
5738
|
if (node.pendingInteraction !== void 0) return "warning";
|
|
6442
|
-
if (node.running || node.runningSubagentCount > 0) return "ongoing";
|
|
5739
|
+
if (node.running || node.runningSubagentCount > 0 || node.longTask) return "ongoing";
|
|
6443
5740
|
if (node.completed) return "done";
|
|
6444
5741
|
}
|
|
6445
5742
|
function attentionSessionIdOf(input) {
|
|
@@ -6448,7 +5745,7 @@ function attentionSessionIdOf(input) {
|
|
|
6448
5745
|
let best;
|
|
6449
5746
|
let bestRank = -1;
|
|
6450
5747
|
for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
|
|
6451
|
-
const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
|
|
5748
|
+
const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
|
|
6452
5749
|
if (ofSession === void 0) continue;
|
|
6453
5750
|
const rank = RANK[ofSession];
|
|
6454
5751
|
if (best === void 0 || rank > bestRank || rank === bestRank && isLater(summary, best)) {
|
|
@@ -6472,7 +5769,7 @@ function attentionOf(input) {
|
|
|
6472
5769
|
let tagged;
|
|
6473
5770
|
let taggedCount = 0;
|
|
6474
5771
|
for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
|
|
6475
|
-
const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
|
|
5772
|
+
const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
|
|
6476
5773
|
if (ofSession === void 0) continue;
|
|
6477
5774
|
if (severity === void 0 || RANK[ofSession] > RANK[severity]) {
|
|
6478
5775
|
severity = ofSession;
|
|
@@ -6485,6 +5782,15 @@ function attentionOf(input) {
|
|
|
6485
5782
|
} else if (ofSession === tagged) taggedCount += 1;
|
|
6486
5783
|
}
|
|
6487
5784
|
}
|
|
5785
|
+
const longTasks = input.longTasks?.byWorkspace.get(workspace.path) ?? 0;
|
|
5786
|
+
if (severity === void 0 && longTasks > 0) {
|
|
5787
|
+
byWorkspace.set(workspace.workspaceId, {
|
|
5788
|
+
severity: "ongoing",
|
|
5789
|
+
count: longTasks,
|
|
5790
|
+
longTask: true
|
|
5791
|
+
});
|
|
5792
|
+
continue;
|
|
5793
|
+
}
|
|
6488
5794
|
if (severity === void 0) continue;
|
|
6489
5795
|
byWorkspace.set(workspace.workspaceId, {
|
|
6490
5796
|
severity,
|
|
@@ -6513,6 +5819,7 @@ function merge(current, next) {
|
|
|
6513
5819
|
};
|
|
6514
5820
|
}
|
|
6515
5821
|
function attentionLabel(attention, t) {
|
|
5822
|
+
if (attention.longTask === true) return t(attention.count === 1 ? "project.attention.longTask.one" : "project.attention.longTask.other", { n: attention.count });
|
|
6516
5823
|
const keys = SENTENCES[attention.severity];
|
|
6517
5824
|
return t(attention.count === 1 ? keys.one : keys.other, { n: attention.count });
|
|
6518
5825
|
}
|
|
@@ -7270,7 +6577,8 @@ function makeMarketEntryIcon(units) {
|
|
|
7270
6577
|
modules,
|
|
7271
6578
|
installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
|
|
7272
6579
|
plugins,
|
|
7273
|
-
workbench
|
|
6580
|
+
workbench,
|
|
6581
|
+
busy: useMarketBusy()
|
|
7274
6582
|
});
|
|
7275
6583
|
useEffect(() => {
|
|
7276
6584
|
publishPanelHint(MARKET_PANEL_ID, hint);
|
|
@@ -7878,14 +7186,17 @@ var RecordFooterAction_module_default = {
|
|
|
7878
7186
|
//#endregion
|
|
7879
7187
|
//#region src/app/layouts/sidebar/RecordFooterAction.tsx
|
|
7880
7188
|
function recordFooterView(state, t) {
|
|
7881
|
-
if (state.phase === "recording")
|
|
7882
|
-
|
|
7883
|
-
|
|
7884
|
-
|
|
7885
|
-
|
|
7886
|
-
|
|
7887
|
-
|
|
7888
|
-
|
|
7189
|
+
if (state.phase === "recording") {
|
|
7190
|
+
const taken = state.shots === void 0 ? 0 : state.shots.length;
|
|
7191
|
+
return {
|
|
7192
|
+
label: t("record.recording"),
|
|
7193
|
+
note: taken === 0 ? t("record.recording.note") : `${t("record.recording.note")}${t("record.recording.shots", { n: taken })}`,
|
|
7194
|
+
acts: [{
|
|
7195
|
+
intent: "halt",
|
|
7196
|
+
label: t("record.act.halt")
|
|
7197
|
+
}]
|
|
7198
|
+
};
|
|
7199
|
+
}
|
|
7889
7200
|
if (state.phase === "finished") return {
|
|
7890
7201
|
label: t("record.finished"),
|
|
7891
7202
|
note: t("record.finished.note"),
|
|
@@ -8578,16 +7889,21 @@ function stepMark(step) {
|
|
|
8578
7889
|
if (step.status === "failed") return "×";
|
|
8579
7890
|
return "-";
|
|
8580
7891
|
}
|
|
7892
|
+
/**
|
|
7893
|
+
* 每一拍轮询带什么参数:平时什么都不带(宿主那边跟着正在跑的那一轮,刚跑出 `ready` 的直接回上一次),
|
|
7894
|
+
* 用户按了「重试」之后的那一拍带 `hard=1`(不看新鲜度、一律重来)。首拍不再强探 —— 页面上一次
|
|
7895
|
+
* 刚体检过就不必再跑一轮,两页同时刷新也只有一轮。
|
|
7896
|
+
*/
|
|
8581
7897
|
function createForcePlan() {
|
|
8582
|
-
let
|
|
7898
|
+
let hard = false;
|
|
8583
7899
|
return {
|
|
8584
7900
|
next() {
|
|
8585
|
-
const
|
|
8586
|
-
|
|
8587
|
-
return
|
|
7901
|
+
const query = hard ? { hard: 1 } : {};
|
|
7902
|
+
hard = false;
|
|
7903
|
+
return query;
|
|
8588
7904
|
},
|
|
8589
7905
|
again() {
|
|
8590
|
-
|
|
7906
|
+
hard = true;
|
|
8591
7907
|
}
|
|
8592
7908
|
};
|
|
8593
7909
|
}
|
|
@@ -8789,7 +8105,7 @@ function createBootGate(ctx, options = {}) {
|
|
|
8789
8105
|
async function poll() {
|
|
8790
8106
|
if (cancelled) return;
|
|
8791
8107
|
if (pinned !== null) return;
|
|
8792
|
-
const response = await request("preflight", forcePlan.next()
|
|
8108
|
+
const response = await request("preflight", forcePlan.next()).catch(() => null);
|
|
8793
8109
|
if (cancelled) return;
|
|
8794
8110
|
if (response === null || !response.ok) {
|
|
8795
8111
|
close();
|
|
@@ -8879,6 +8195,8 @@ var DIY_RECORD_PREPARE_TOOL = "workbench_diy_record_prepare";
|
|
|
8879
8195
|
var DIY_RECORD_READ_TOOL = "workbench_diy_record_read";
|
|
8880
8196
|
var DIY_RECORD_DETAIL_TOOL = "workbench_diy_record_detail";
|
|
8881
8197
|
var DIY_RECORD_STOP_TOOL = "workbench_diy_record_stop";
|
|
8198
|
+
var LONG_TASKS_LIST_TOOL = "workbench_long_tasks_list";
|
|
8199
|
+
var LONG_TASKS_STOP_TOOL = "workbench_long_tasks_stop";
|
|
8882
8200
|
var DIY_DEBUG_START_TOOL = "workbench_diy_debug_start";
|
|
8883
8201
|
var DIY_DEBUG_PAUSE_TOOL = "workbench_diy_debug_pause";
|
|
8884
8202
|
var DIY_DEBUG_RESUME_TOOL = "workbench_diy_debug_resume";
|
|
@@ -8931,7 +8249,9 @@ var ALL_TOOLS = [
|
|
|
8931
8249
|
DIY_DEBUG_START_TOOL,
|
|
8932
8250
|
DIY_DEBUG_PAUSE_TOOL,
|
|
8933
8251
|
DIY_DEBUG_RESUME_TOOL,
|
|
8934
|
-
DIY_DEBUG_STOP_TOOL
|
|
8252
|
+
DIY_DEBUG_STOP_TOOL,
|
|
8253
|
+
LONG_TASKS_LIST_TOOL,
|
|
8254
|
+
LONG_TASKS_STOP_TOOL
|
|
8935
8255
|
];
|
|
8936
8256
|
var READ_TOOLS = [
|
|
8937
8257
|
PANELS_LIST_TOOL,
|
|
@@ -8961,7 +8281,8 @@ var READ_TOOLS = [
|
|
|
8961
8281
|
DIY_LOGS_STOP_TOOL,
|
|
8962
8282
|
DIY_RECORD_READ_TOOL,
|
|
8963
8283
|
DIY_RECORD_DETAIL_TOOL,
|
|
8964
|
-
DIY_RECORD_STOP_TOOL
|
|
8284
|
+
DIY_RECORD_STOP_TOOL,
|
|
8285
|
+
LONG_TASKS_LIST_TOOL
|
|
8965
8286
|
];
|
|
8966
8287
|
var WRITE_TOOLS = [
|
|
8967
8288
|
PANELS_SHOW_TOOL,
|
|
@@ -8983,7 +8304,8 @@ var WRITE_TOOLS = [
|
|
|
8983
8304
|
DIY_DEBUG_START_TOOL,
|
|
8984
8305
|
DIY_DEBUG_PAUSE_TOOL,
|
|
8985
8306
|
DIY_DEBUG_RESUME_TOOL,
|
|
8986
|
-
DIY_DEBUG_STOP_TOOL
|
|
8307
|
+
DIY_DEBUG_STOP_TOOL,
|
|
8308
|
+
LONG_TASKS_STOP_TOOL
|
|
8987
8309
|
];
|
|
8988
8310
|
[...READ_TOOLS.map((name) => ({
|
|
8989
8311
|
name,
|
|
@@ -9020,11 +8342,23 @@ function recordApprovalRows(args, t) {
|
|
|
9020
8342
|
function shellClaimsApprovalDetail(tool) {
|
|
9021
8343
|
return ALL_TOOLS.includes(tool);
|
|
9022
8344
|
}
|
|
8345
|
+
function stopApprovalRows(args, t) {
|
|
8346
|
+
const unit = textOf(args, "unit");
|
|
8347
|
+
const id = textOf(args, "id");
|
|
8348
|
+
return [{
|
|
8349
|
+
label: t("approval.longTask.what"),
|
|
8350
|
+
value: `${unit === "" ? "<unit>" : unit} · ${id === "" ? "<id>" : id}`
|
|
8351
|
+
}];
|
|
8352
|
+
}
|
|
9023
8353
|
function shellApprovalPlan(input, t) {
|
|
9024
8354
|
if (input.tool === "workbench_diy_record_prepare") return {
|
|
9025
8355
|
rows: recordApprovalRows(input.args, t),
|
|
9026
8356
|
warn: t("approval.record.noSwitch")
|
|
9027
8357
|
};
|
|
8358
|
+
if (input.tool === "workbench_long_tasks_stop") return {
|
|
8359
|
+
rows: stopApprovalRows(input.args, t),
|
|
8360
|
+
warn: t("approval.longTask.signal")
|
|
8361
|
+
};
|
|
9028
8362
|
return shellClaimsApprovalDetail(input.tool) ? { rows: [] } : void 0;
|
|
9029
8363
|
}
|
|
9030
8364
|
function shellApprovalDetail(input, t) {
|
|
@@ -10607,7 +9941,8 @@ function openPickedProject(input) {
|
|
|
10607
9941
|
workspace: target,
|
|
10608
9942
|
sessions: input.sessions,
|
|
10609
9943
|
statusById: input.statusById,
|
|
10610
|
-
archivedIds: input.archivedIds
|
|
9944
|
+
archivedIds: input.archivedIds,
|
|
9945
|
+
longTasks: input.longTasks
|
|
10611
9946
|
}) ?? firstSessionIdOf(target, input.sessions, input.archivedIds);
|
|
10612
9947
|
if (picked === null) input.startSession(input.workspaceId);
|
|
10613
9948
|
else input.openSession(picked);
|
|
@@ -10666,6 +10001,24 @@ function WorkspaceSection({ t, wide, onNewSession }) {
|
|
|
10666
10001
|
}, /* @__PURE__ */ h(IconNewChatOutlineRegular, { size: 16 })))));
|
|
10667
10002
|
}
|
|
10668
10003
|
//#endregion
|
|
10004
|
+
//#region src/shared/hooks/use-shell-long-tasks.ts
|
|
10005
|
+
/**
|
|
10006
|
+
* 左栏那颗 loading 点读的长任务清单:**全进程还在跑的**那些(不分单元、不分工作区,每行带它属于
|
|
10007
|
+
* 哪个工作区、是哪个会话起的)。起 / 走一步 / 收尾宿主都会推一条事实,收到就当场重读;那个定时器
|
|
10008
|
+
* 只是兜底 —— 有在跑的按快档问,都闲着按慢档。
|
|
10009
|
+
* @returns 还在跑的长任务;读数还没回来时是空数组。
|
|
10010
|
+
*/
|
|
10011
|
+
function useShellLongTasks() {
|
|
10012
|
+
const [tick, setTick] = useState(0);
|
|
10013
|
+
const runs = useApiResource("long-tasks", {}, tick).value?.runs ?? [];
|
|
10014
|
+
const every = longTaskPollMs(runs.length > 0);
|
|
10015
|
+
useEffect(() => {
|
|
10016
|
+
const timer = setInterval(() => setTick((count) => count + 1), every);
|
|
10017
|
+
return () => clearInterval(timer);
|
|
10018
|
+
}, [every]);
|
|
10019
|
+
return runs;
|
|
10020
|
+
}
|
|
10021
|
+
//#endregion
|
|
10669
10022
|
//#region src/app/layouts/sidebar/current-workspace.ts
|
|
10670
10023
|
function resolveCurrentWorkspace(input) {
|
|
10671
10024
|
const ofSession = workspaceOfSession(input.items, currentSessionId(input.sessions, input.panelActive));
|
|
@@ -10675,7 +10028,7 @@ function resolveCurrentWorkspace(input) {
|
|
|
10675
10028
|
//#endregion
|
|
10676
10029
|
//#region src/app/layouts/sidebar/use-attention.ts
|
|
10677
10030
|
function useSidebarAttention(input) {
|
|
10678
|
-
const { items, sessions, statusById, archived, storedId, panelActive } = input;
|
|
10031
|
+
const { items, sessions, statusById, archived, storedId, panelActive, longTasks } = input;
|
|
10679
10032
|
const archivedIds = useMemo(() => new Set(archived), [archived]);
|
|
10680
10033
|
const current = resolveCurrentWorkspace({
|
|
10681
10034
|
items,
|
|
@@ -10691,16 +10044,26 @@ function useSidebarAttention(input) {
|
|
|
10691
10044
|
sessions,
|
|
10692
10045
|
statusById,
|
|
10693
10046
|
archivedIds,
|
|
10694
|
-
currentWorkspaceId: current?.workspaceId ?? null
|
|
10047
|
+
currentWorkspaceId: current?.workspaceId ?? null,
|
|
10048
|
+
longTasks
|
|
10695
10049
|
}), [
|
|
10696
10050
|
items,
|
|
10697
10051
|
sessions,
|
|
10698
10052
|
statusById,
|
|
10699
10053
|
archivedIds,
|
|
10700
|
-
current
|
|
10054
|
+
current,
|
|
10055
|
+
longTasks
|
|
10701
10056
|
])
|
|
10702
10057
|
};
|
|
10703
10058
|
}
|
|
10059
|
+
/**
|
|
10060
|
+
* 左栏要的那份长任务归属:外壳那条读口交回「全进程还在跑的长任务」,这里折成会话侧与工作区侧。
|
|
10061
|
+
* @returns 两侧的归属(谁起了 / 哪个工作区里有几趟)。
|
|
10062
|
+
*/
|
|
10063
|
+
function useLongTaskPresence() {
|
|
10064
|
+
const runs = useShellLongTasks();
|
|
10065
|
+
return useMemo(() => longTaskPresenceOf(runs), [runs]);
|
|
10066
|
+
}
|
|
10704
10067
|
//#endregion
|
|
10705
10068
|
//#region src/app/layouts/sidebar/PanelNav.tsx
|
|
10706
10069
|
function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntry, t }) {
|
|
@@ -11214,7 +10577,7 @@ function useScrollEdges(list, rows) {
|
|
|
11214
10577
|
}, [list, rows]);
|
|
11215
10578
|
return edges;
|
|
11216
10579
|
}
|
|
11217
|
-
function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
|
|
10580
|
+
function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
|
|
11218
10581
|
const list = useSessions((state) => state);
|
|
11219
10582
|
const statusById = useSessionStatus((state) => state);
|
|
11220
10583
|
const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);
|
|
@@ -11241,7 +10604,7 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions,
|
|
|
11241
10604
|
"aria-label": t("session.list.label")
|
|
11242
10605
|
}, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
|
|
11243
10606
|
key: row.id,
|
|
11244
|
-
node: sessionNode(row, statusById, list, pinned, archivedSet),
|
|
10607
|
+
node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
|
|
11245
10608
|
active: row.id === currentId,
|
|
11246
10609
|
onOpen,
|
|
11247
10610
|
renderSlot,
|
|
@@ -11287,13 +10650,15 @@ function Sidebar(props) {
|
|
|
11287
10650
|
const [createFailed, setCreateFailed] = useState(false);
|
|
11288
10651
|
useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
|
|
11289
10652
|
useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
|
|
10653
|
+
const longTasks = useLongTaskPresence();
|
|
11290
10654
|
const { current, archivedIds: archivedSet, attention } = useSidebarAttention({
|
|
11291
10655
|
items,
|
|
11292
10656
|
sessions,
|
|
11293
10657
|
statusById,
|
|
11294
10658
|
archived,
|
|
11295
10659
|
storedId,
|
|
11296
|
-
panelActive: activePanelId !== null
|
|
10660
|
+
panelActive: activePanelId !== null,
|
|
10661
|
+
longTasks
|
|
11297
10662
|
});
|
|
11298
10663
|
const pickProject = (workspaceId) => {
|
|
11299
10664
|
setStoredId(workspaceId);
|
|
@@ -11305,6 +10670,7 @@ function Sidebar(props) {
|
|
|
11305
10670
|
sessions,
|
|
11306
10671
|
statusById,
|
|
11307
10672
|
archivedIds: archivedSet,
|
|
10673
|
+
longTasks,
|
|
11308
10674
|
openSession,
|
|
11309
10675
|
startSession
|
|
11310
10676
|
});
|
|
@@ -11383,6 +10749,7 @@ function Sidebar(props) {
|
|
|
11383
10749
|
pinnedIds,
|
|
11384
10750
|
archived,
|
|
11385
10751
|
panelActive: activePanelId !== null,
|
|
10752
|
+
longTasks,
|
|
11386
10753
|
useSessions: props.useSessions,
|
|
11387
10754
|
useSessionStatus: props.useSessionStatus,
|
|
11388
10755
|
onOpen: props.openSession,
|
|
@@ -11445,18 +10812,39 @@ var use_long_task_exports = /* @__PURE__ */ __exportAll({ useLongTask: () => use
|
|
|
11445
10812
|
* 卡片要轮询长任务那一行时调用:有在跑的(`running` / `needs-login`)按 `longTaskPollMs` 走快档、空闲走慢档;
|
|
11446
10813
|
* `workspace` 为 `null`、`mocked: true` 或 `enabled: false` 时不轮。换单元 / 换工作区就是换读数身份,
|
|
11447
10814
|
* 旧那批立刻清空、读数回来前 `runs` 是空数组。
|
|
10815
|
+
* `stop(id)` 走 actions 通道的 `<单元>/runs/stop`;不在跑的那一趟会带回一句人话,不抛错。
|
|
11448
10816
|
*/
|
|
11449
10817
|
function useLongTask(options) {
|
|
11450
10818
|
const enabled = options.enabled !== false && options.mocked !== true && options.workspace !== null;
|
|
11451
10819
|
const [tick, setTick] = useState(0);
|
|
11452
10820
|
const runs = longTaskRunsOf(useApiResource(runsRouteOf(options.unit), { path: options.workspace ?? void 0 }, tick, { enabled }));
|
|
10821
|
+
const write = useHostWrite({
|
|
10822
|
+
channel: "actions",
|
|
10823
|
+
resource: stopRouteOf(options.unit),
|
|
10824
|
+
networkText: "网络不通,停止请求没发出去"
|
|
10825
|
+
});
|
|
10826
|
+
const [stopping, setStopping] = useState(null);
|
|
10827
|
+
const send = write.send;
|
|
10828
|
+
const stop = useCallback(async (id) => {
|
|
10829
|
+
setStopping(id);
|
|
10830
|
+
try {
|
|
10831
|
+
return await send({ id });
|
|
10832
|
+
} finally {
|
|
10833
|
+
setStopping((current) => current === id ? null : current);
|
|
10834
|
+
}
|
|
10835
|
+
}, [send]);
|
|
11453
10836
|
const every = longTaskPollMs(runs.some((run) => longTaskDot(run.status) === "ongoing"), options.pollMs);
|
|
11454
10837
|
useEffect(() => {
|
|
11455
10838
|
if (!enabled) return void 0;
|
|
11456
10839
|
const timer = setInterval(() => setTick((count) => count + 1), every);
|
|
11457
10840
|
return () => clearInterval(timer);
|
|
11458
10841
|
}, [enabled, every]);
|
|
11459
|
-
return {
|
|
10842
|
+
return {
|
|
10843
|
+
runs,
|
|
10844
|
+
stop,
|
|
10845
|
+
stopping,
|
|
10846
|
+
stopFailed: write.failed
|
|
10847
|
+
};
|
|
11460
10848
|
}
|
|
11461
10849
|
//#endregion
|
|
11462
10850
|
//#region src/shared/hooks/use-unit-board.ts
|
|
@@ -11666,23 +11054,79 @@ var kit = {
|
|
|
11666
11054
|
},
|
|
11667
11055
|
components: {
|
|
11668
11056
|
...BlockerState_exports,
|
|
11669
|
-
|
|
11670
|
-
|
|
11671
|
-
|
|
11672
|
-
|
|
11673
|
-
|
|
11674
|
-
|
|
11675
|
-
|
|
11676
|
-
|
|
11057
|
+
ActivityAction,
|
|
11058
|
+
ActivityBlock,
|
|
11059
|
+
ActivityLine,
|
|
11060
|
+
ApprovalDetail,
|
|
11061
|
+
ApprovalPlan,
|
|
11062
|
+
Card,
|
|
11063
|
+
CardAnchor,
|
|
11064
|
+
CardBoundary,
|
|
11065
|
+
CardHead,
|
|
11066
|
+
CenteredState,
|
|
11067
|
+
ChoiceGroup,
|
|
11068
|
+
ConfirmBar,
|
|
11069
|
+
EmptyState,
|
|
11070
|
+
Field,
|
|
11071
|
+
Form,
|
|
11072
|
+
FormActions,
|
|
11073
|
+
FormRow,
|
|
11074
|
+
FormRows,
|
|
11075
|
+
IconBrandMark,
|
|
11076
|
+
IconConversation,
|
|
11077
|
+
IconModuleMark,
|
|
11078
|
+
IconNpm,
|
|
11079
|
+
IconOpencli,
|
|
11080
|
+
IconPanelScreen,
|
|
11081
|
+
Link,
|
|
11082
|
+
LongTaskRow,
|
|
11083
|
+
Note,
|
|
11084
|
+
Row,
|
|
11085
|
+
Rows,
|
|
11086
|
+
SaveBar,
|
|
11087
|
+
SelectField,
|
|
11088
|
+
SettingsSection,
|
|
11089
|
+
SkeletonRows,
|
|
11090
|
+
Spinner,
|
|
11091
|
+
Stack,
|
|
11092
|
+
StateBlock,
|
|
11093
|
+
TextField,
|
|
11677
11094
|
Tip
|
|
11678
11095
|
},
|
|
11679
11096
|
api: {
|
|
11680
|
-
|
|
11097
|
+
apiGet,
|
|
11098
|
+
apiPost,
|
|
11681
11099
|
...context_chips_exports
|
|
11682
11100
|
},
|
|
11683
11101
|
lib: {
|
|
11684
|
-
|
|
11685
|
-
|
|
11102
|
+
MIN_BUSY_MS: 500,
|
|
11103
|
+
blockerOfCapability,
|
|
11104
|
+
blockerOfError,
|
|
11105
|
+
cardIdOf,
|
|
11106
|
+
cx,
|
|
11107
|
+
defaultSelectFilter,
|
|
11108
|
+
duplicateKeysOf,
|
|
11109
|
+
errorReasonOf,
|
|
11110
|
+
excerpt,
|
|
11111
|
+
filterSelectOptions,
|
|
11112
|
+
firstProblemOf,
|
|
11113
|
+
formFirstProblemOf,
|
|
11114
|
+
formValuesOf,
|
|
11115
|
+
holdBusy,
|
|
11116
|
+
parseJsonLoose,
|
|
11117
|
+
parseLocalTimestamp,
|
|
11118
|
+
readText,
|
|
11119
|
+
relativeTime,
|
|
11120
|
+
relativeTimeAgo,
|
|
11121
|
+
relativeTimeBucket,
|
|
11122
|
+
relativeTimeCompact,
|
|
11123
|
+
revealFirstProblem,
|
|
11124
|
+
searchTextOf,
|
|
11125
|
+
selectCursorValue,
|
|
11126
|
+
selectEntries,
|
|
11127
|
+
shortenPath,
|
|
11128
|
+
stepSelectCursor,
|
|
11129
|
+
writeText
|
|
11686
11130
|
}
|
|
11687
11131
|
};
|
|
11688
11132
|
function messagesOf(units) {
|
|
@@ -11691,7 +11135,7 @@ function messagesOf(units) {
|
|
|
11691
11135
|
...face.messages === void 0 ? {} : { messages: face.messages }
|
|
11692
11136
|
}));
|
|
11693
11137
|
}
|
|
11694
|
-
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-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-formControl {\n display: flex;\n align-items: center;\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.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*/";
|
|
11138
|
+
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*/";
|
|
11695
11139
|
function workbenchCss() {
|
|
11696
11140
|
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}`;
|
|
11697
11141
|
}
|