@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.
Files changed (53) hide show
  1. package/client.js +1372 -1928
  2. package/dist/client/client.body.js +1372 -1928
  3. package/dist/client/index.js +1372 -1928
  4. package/dist/host/index.js +1569 -751
  5. package/dist/types/app/client.d.ts +76 -3355
  6. package/dist/types/app/layouts/env-gate/boot-gate.d.ts +8 -1
  7. package/dist/types/app/layouts/rightbar/market-busy.d.ts +28 -0
  8. package/dist/types/app/layouts/rightbar/market-hint.d.ts +7 -0
  9. package/dist/types/app/layouts/sidebar/DebugFooterAction.d.ts +2 -1
  10. package/dist/types/app/layouts/sidebar/RecordFooterAction.d.ts +2 -1
  11. package/dist/types/app/layouts/sidebar/SessionList.d.ts +3 -1
  12. package/dist/types/app/layouts/sidebar/session-pick.d.ts +2 -0
  13. package/dist/types/app/layouts/sidebar/use-attention.d.ts +7 -1
  14. package/dist/types/modules/panels/client.d.ts +1 -1
  15. package/dist/types/modules/panels/model/approval.d.ts +8 -0
  16. package/dist/types/modules/panels/model/diy-context.d.ts +9 -0
  17. package/dist/types/modules/panels/model/diy-record-beat.test.d.ts +1 -0
  18. package/dist/types/modules/panels/model/diy-record-close.test.d.ts +1 -0
  19. package/dist/types/modules/panels/model/diy-record-hook.test.d.ts +1 -0
  20. package/dist/types/modules/panels/model/diy-record-open.d.ts +28 -0
  21. package/dist/types/modules/panels/model/diy-record-open.test.d.ts +1 -0
  22. package/dist/types/modules/panels/model/diy-record-shot.test.d.ts +1 -0
  23. package/dist/types/modules/panels/model/diy-record-text.d.ts +16 -1
  24. package/dist/types/modules/panels/model/diy-record-tools.d.ts +2 -1
  25. package/dist/types/modules/panels/model/diy-record.d.ts +40 -1
  26. package/dist/types/modules/panels/model/diy-report.d.ts +1 -1
  27. package/dist/types/modules/panels/model/long-task-tools.d.ts +15 -0
  28. package/dist/types/modules/panels/model/long-task-tools.test.d.ts +1 -0
  29. package/dist/types/modules/panels/unit.d.ts +5 -3
  30. package/dist/types/modules/sessions/index.d.ts +1 -1
  31. package/dist/types/modules/sessions/model/attention-long-task.test.d.ts +1 -0
  32. package/dist/types/modules/sessions/model/attention.d.ts +23 -1
  33. package/dist/types/modules/sessions/model/session-node.d.ts +12 -1
  34. package/dist/types/shared/api/host/approval-call.d.ts +16 -0
  35. package/dist/types/shared/api/host/long-task-notice.d.ts +30 -0
  36. package/dist/types/shared/api/host/long-tasks.d.ts +10 -0
  37. package/dist/types/shared/api/host/mount-units.d.ts +3 -1
  38. package/dist/types/shared/api/host/preflight.d.ts +7 -1
  39. package/dist/types/shared/api/host/workshop-root.d.ts +9 -0
  40. package/dist/types/shared/api/long-tasks.d.ts +19 -0
  41. package/dist/types/shared/hooks/panel-state-report.d.ts +1 -1
  42. package/dist/types/shared/hooks/use-diy-debug.d.ts +1 -1
  43. package/dist/types/shared/hooks/use-diy-record.d.ts +1 -1
  44. package/dist/types/shared/hooks/use-long-task.d.ts +8 -2
  45. package/dist/types/shared/hooks/use-shell-long-tasks.d.ts +8 -0
  46. package/package.json +2 -2
  47. package/skills/workbench-module-diy/BUILD.md +1 -1
  48. package/skills/workbench-module-diy/FAMILY.md +1 -1
  49. package/skills/workbench-module-diy/KIT.md +26 -26
  50. package/skills/workbench-module-diy/PANEL.md +1 -1
  51. package/skills/workbench-module-diy/TOOLING.md +5 -1
  52. package/skills/workbench-module-diy/TOOLS.md +22 -2
  53. package/skills/workbench-module-diy/WRITES.md +20 -3
package/client.js CHANGED
@@ -291,8 +291,6 @@ window.__ModuleLoader__.load({
291
291
  * 引用标记的固定名字;完整标记是 @<这个名字>:<编码文本>,改它等于作废历史会话里已写下的引用。
292
292
  */
293
293
  var CONTEXT_MARKER_NAME = "工作台";
294
- var MARKER = new RegExp(`@${CONTEXT_MARKER_NAME}:([a-z][a-z0-9-]*:[A-Za-z0-9._~%#/-]+)`, "g");
295
- var TRAILING_PUNCTUATION = /[.,;:!?]+$/;
296
294
  /**
297
295
  * 把引用拼回标记体里的那一段文本(不含 @ 与标记名)。
298
296
  * @param ref 要拼的引用。
@@ -302,23 +300,6 @@ window.__ModuleLoader__.load({
302
300
  return `${ref.kind}:${ref.parts.join("/")}`;
303
301
  }
304
302
  /**
305
- * 把 kind:part/part 文本读回引用。
306
- * @param text 待解析文本。
307
- * @returns 没冒号、冒号在首尾、种类不是小写字母开头、或冒号后为空时给 undefined;不抛异常。
308
- */
309
- function decodeRef(text) {
310
- const at = text.indexOf(":");
311
- if (at <= 0 || at === text.length - 1) return void 0;
312
- const kind = text.slice(0, at);
313
- if (!/^[a-z][a-z0-9-]*$/.test(kind)) return void 0;
314
- const parts = text.slice(at + 1).split("/").filter((part) => part !== "");
315
- if (parts.length === 0) return void 0;
316
- return {
317
- kind,
318
- parts
319
- };
320
- }
321
- /**
322
303
  * 拼出 @ 后面那半截(标记名加已编码文本),比较与拼接都用它。
323
304
  * @param encoded encodeRef 的结果。
324
305
  * @returns 形如 工作台:file:src/a.ts。
@@ -335,32 +316,6 @@ window.__ModuleLoader__.load({
335
316
  return `@${markerBody(encodeRef(ref))}`;
336
317
  }
337
318
  /**
338
- * 从一段文本里按出现顺序捞出所有标记引用,同一个引用只留第一次。
339
- * @param text 任意文本;null / undefined 当空串。
340
- * @returns 解析不出来的标记会被丢掉,所以结果只含合法引用,可能为空数组。
341
- */
342
- function parseMarkers(text) {
343
- const seen = /* @__PURE__ */ new Set();
344
- const refs = [];
345
- for (const match of String(text ?? "").matchAll(MARKER)) {
346
- const ref = decodeRef(match[1].replace(TRAILING_PUNCTUATION, ""));
347
- if (ref === void 0) continue;
348
- const key = encodeRef(ref);
349
- if (seen.has(key)) continue;
350
- seen.add(key);
351
- refs.push(ref);
352
- }
353
- return refs;
354
- }
355
- /**
356
- * 由单元 id 拼出它那一族事实的范围名。
357
- * @param unit 单元 id,不带后缀。
358
- * @returns <unit>* —— 永远是范围名,不是某一条事实。
359
- */
360
- function unitFactScope(unit) {
361
- return `${unit}*`;
362
- }
363
- /**
364
319
  * 判一个名字是不是范围查法,不是问这条事实存不存在。
365
320
  * @param name 事实名或范围名。
366
321
  * @returns 单字符 * 不算范围;只有「至少一个字符加 *」才算。
@@ -559,6 +514,14 @@ window.__ModuleLoader__.load({
559
514
  return `${unit}/runs`;
560
515
  }
561
516
  /**
517
+ * 停止那条写路由(走 actions 通道的资源名):`<单元>/runs/stop`。
518
+ * @param unit 单元 id。
519
+ * @returns <unit>/runs/stop。
520
+ */
521
+ function stopRouteOf(unit) {
522
+ return `${unit}/runs/stop`;
523
+ }
524
+ /**
562
525
  * 有长任务在跑时的轮询间隔(毫秒)。
563
526
  */
564
527
  var LONG_TASK_POLL_MS = 1500;
@@ -586,8 +549,8 @@ window.__ModuleLoader__.load({
586
549
  }
587
550
  /**
588
551
  * 把长任务态折成状态点的那一档。
589
- * @param status 长任务的四种态。
590
- * @returns ongoing / done / error / idle;needs-login 也算进行中。
552
+ * @param status 长任务的五种态。
553
+ * @returns ongoing / done / error / idle;needs-login 也算进行中;`stopped` 落进 idle —— 灰点:不是成功、不是出错,是用户自己按停的。
591
554
  */
592
555
  function longTaskDot(status) {
593
556
  if (status === "ok") return "done";
@@ -595,6 +558,28 @@ window.__ModuleLoader__.load({
595
558
  if (status === "running" || status === "needs-login") return "ongoing";
596
559
  return "idle";
597
560
  }
561
+ /**
562
+ * 算停止钮现在在哪一档。
563
+ * @param state armed = 已经按过第一下、在等第二下;busy = 停止请求已经在飞。
564
+ * @returns busy 优先(在飞时按不动),其次 armed,否则 idle。
565
+ */
566
+ function longTaskStopStage(state) {
567
+ if (state.busy) return "busy";
568
+ return state.armed ? "armed" : "idle";
569
+ }
570
+ /**
571
+ * 按一下该干什么:第一次只上膛('arm'),上了膛再按才真发('fire'),在飞时按不动('ignore')。
572
+ * @param stage 现在这一档(先过 `longTaskStopStage`)。
573
+ * @returns 'arm' / 'fire' / 'ignore',调用点照它上膛、落膛加发请求、或什么都不做。
574
+ */
575
+ function longTaskStopPress(stage) {
576
+ if (stage === "busy") return "ignore";
577
+ return stage === "armed" ? "fire" : "arm";
578
+ }
579
+ /**
580
+ * 上膛后多久自己落膛(毫秒)。3 秒 = dsh 那行现在的取值。
581
+ */
582
+ var LONG_TASK_STOP_ARM_MS = 3e3;
598
583
  //#endregion
599
584
  //#region ../shared/dist/api/unit-board.js
600
585
  /**
@@ -638,154 +623,6 @@ window.__ModuleLoader__.load({
638
623
  if (error === void 0) return null;
639
624
  return error.code === "" ? "unknown" : error.code;
640
625
  }
641
- /**
642
- * 外壳愿意认的协议版本;不在表里的模块当场被拒,不猜语义。
643
- */
644
- var SUPPORTED_API_VERSIONS = [1];
645
- /**
646
- * 协议认得的全部键;写了别的键不会被采纳(外壳静默忽略),所以字段名拼错不会有提示。
647
- */
648
- var DECLARATION_KEYS = [
649
- "apiVersion",
650
- "unit",
651
- "card",
652
- "tools",
653
- "host",
654
- "env"
655
- ];
656
- /**
657
- * 协议要求必写的键;env 不在其中(没有环境需要就不写)。
658
- */
659
- var DECLARATION_REQUIRED_KEYS = [
660
- "apiVersion",
661
- "unit",
662
- "card",
663
- "tools",
664
- "host"
665
- ];
666
- var CARD_KEYS = ["titleKey", "order"];
667
- var TOOL_KEYS = [
668
- "name",
669
- "writes",
670
- "key"
671
- ];
672
- var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
673
- var HOST_KEYS = ["inject", "optional"];
674
- function text(value) {
675
- return typeof value === "string" ? value.trim() : "";
676
- }
677
- function isRecord(value) {
678
- return typeof value === "object" && value !== null && !Array.isArray(value);
679
- }
680
- function outsideKeys(value, allowed) {
681
- return Object.keys(value).filter((key) => !allowed.includes(key));
682
- }
683
- function listOf(keys) {
684
- return keys.map((key) => JSON.stringify(key)).join(" / ");
685
- }
686
- function stringArrayProblems(at, value) {
687
- if (!Array.isArray(value)) return [`${at} 要是一串字符串,现在是 ${JSON.stringify(value)}`];
688
- return value.flatMap((item, index) => text(item) === "" ? [`${at}[${index}] 不是非空字符串:${JSON.stringify(item)}`] : []);
689
- }
690
- /**
691
- * 查清单里 dsh.workbench 那一段的形状,回一串给人看的问题(中文,带字段路径)。
692
- * @param subject 报错时用的主语,一般是包名。
693
- * @param raw 清单里那段原始值,可能什么都不是。
694
- * @returns 空数组表示形状过得去;版本不对就当场返回(后面的字段无从判起)。
695
- */
696
- function declarationProblemsOf(subject, raw) {
697
- if (!isRecord(raw)) return [`${subject}: dsh.workbench 不是一个对象 —— ${JSON.stringify(raw)}`];
698
- const version = raw.apiVersion;
699
- if (version === void 0) return [`${subject}: dsh.workbench 没有 apiVersion —— 协议从 v1 起,写 \`"apiVersion": 1\`。缺它 = 外壳不认这个模块(ADR-0038 §2.3)`];
700
- if (!Number.isInteger(version) || !SUPPORTED_API_VERSIONS.includes(version)) return [`${subject}: dsh.workbench.apiVersion 是 ${JSON.stringify(version)},这里只认 ${SUPPORTED_API_VERSIONS.join(" / ")}(要整数)`];
701
- const problems = [];
702
- const unknown = outsideKeys(raw, DECLARATION_KEYS);
703
- if (unknown.length > 0) problems.push(`${subject}: dsh.workbench 里有协议 v1 不认识的键 ${listOf(unknown)} —— 只有 ${listOf(DECLARATION_KEYS)}。(拼错的键会被外壳**静默忽略**:那句声明等于没写)`);
704
- for (const key of DECLARATION_REQUIRED_KEYS) if (raw[key] === void 0) problems.push(`${subject}: dsh.workbench 缺 ${key}` + (key === "card" ? "(这个模块没有卡片就写 `\"card\": null`)" : ""));
705
- const card = raw.card;
706
- if (card !== void 0 && card !== null) {
707
- if (!isRecord(card)) problems.push(`${subject}: dsh.workbench.card 要么是对象、要么是 null,现在是 ${JSON.stringify(card)}`);
708
- else {
709
- const extra = outsideKeys(card, CARD_KEYS);
710
- if (extra.length > 0) problems.push(`${subject}: dsh.workbench.card 里有不认的键 ${listOf(extra)} —— card 只有 ${listOf(CARD_KEYS)}(卡片默认显不显示由运行期的面板配置决定,清单里没有这一位)`);
711
- if (text(card.titleKey) === "") problems.push(`${subject}: dsh.workbench.card.titleKey 要是非空字符串(面板那一格的文案键)`);
712
- if (typeof card.order !== "number" || !Number.isFinite(card.order)) problems.push(`${subject}: dsh.workbench.card.order 要是数字,现在是 ${JSON.stringify(card.order)}`);
713
- }
714
- }
715
- const tools = raw.tools;
716
- if (tools !== void 0) {
717
- if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
718
- else {
719
- const seen = /* @__PURE__ */ new Set();
720
- const seenKeys = /* @__PURE__ */ new Set();
721
- tools.forEach((tool, index) => {
722
- const at = `dsh.workbench.tools[${index}]`;
723
- if (!isRecord(tool)) {
724
- problems.push(`${subject}: ${at} 要是对象,现在是 ${JSON.stringify(tool)}`);
725
- return;
726
- }
727
- const extra = outsideKeys(tool, TOOL_KEYS);
728
- if (extra.length > 0) problems.push(`${subject}: ${at} 里有不认的键 ${listOf(extra)} —— tools 只有 ${listOf(TOOL_KEYS)}`);
729
- const name = text(tool.name);
730
- if (name === "") problems.push(`${subject}: ${at}.name 要是非空字符串`);
731
- else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
732
- else seen.add(name);
733
- if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
734
- if (tool.key !== void 0) {
735
- const key = text(tool.key);
736
- if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
737
- else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
738
- else seenKeys.add(key);
739
- }
740
- });
741
- }
742
- }
743
- const host = raw.host;
744
- if (host !== void 0) {
745
- if (!isRecord(host)) problems.push(`${subject}: dsh.workbench.host 要是对象,现在是 ${JSON.stringify(host)}`);
746
- else {
747
- const extra = outsideKeys(host, HOST_KEYS);
748
- if (extra.length > 0) problems.push(`${subject}: dsh.workbench.host 里有不认的键 ${listOf(extra)} —— host 只有 ${listOf(HOST_KEYS)}`);
749
- if (host.inject === void 0) problems.push(`${subject}: dsh.workbench.host.inject 没写 —— 它声明这个模块要外壳的哪几个服务,外壳靠它判"能不能挂"。一个都不要也要写 \`"inject": []\``);
750
- else problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.inject`, host.inject));
751
- if (host.optional !== void 0) problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.optional`, host.optional));
752
- }
753
- }
754
- if (raw.env !== void 0 && !isRecord(raw.env)) problems.push(`${subject}: dsh.workbench.env 要是对象(command / plugins / libs)—— 语义由门禁的 env 判据查,这里只查形状`);
755
- return problems;
756
- }
757
- /**
758
- * 读一份清单:先查形状,过了再把声明规整成 manifest。
759
- * @param subject 报错时用的主语。
760
- * @param raw 清单里 dsh.workbench 那段原始值。
761
- * @returns 有问题时只有 problems;没问题时 declaration 与 manifest 都给,manifest 里的字符串已 trim。
762
- */
763
- function readDeclaration(subject, raw) {
764
- const problems = declarationProblemsOf(subject, raw);
765
- if (problems.length > 0) return { problems };
766
- const declaration = raw;
767
- const card = declaration.card;
768
- return {
769
- declaration,
770
- problems: [],
771
- manifest: {
772
- id: text(declaration.unit),
773
- card: card === null ? null : {
774
- titleKey: text(card.titleKey),
775
- order: card.order
776
- },
777
- tools: declaration.tools.map((tool) => ({
778
- name: text(tool.name),
779
- writes: tool.writes
780
- })),
781
- host: {
782
- inject: [...declaration.host.inject ?? []],
783
- ...declaration.host.optional === void 0 ? {} : { optional: [...declaration.host.optional] }
784
- },
785
- ...declaration.env === void 0 ? {} : { env: declaration.env }
786
- }
787
- };
788
- }
789
626
  //#endregion
790
627
  //#region ../shared/dist/api/unit.js
791
628
  /**
@@ -798,68 +635,22 @@ window.__ModuleLoader__.load({
798
635
  }
799
636
  //#endregion
800
637
  //#region ../shared/dist/config/constants.js
801
- /** 外壳插件的包名:浏览器模块表与宿主按它注册、认领这枚插件。 */
802
- var PLUGIN_ID = "@dsh-workbench/core";
803
- /** 与外壳同批发布的兄弟包名:`release.ts` 用它判一版三包是否都已在源上。 */
804
- var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
805
638
  /** 外壳宿主 HTTP API 的根前缀;prefs / actions / provision 等路由都挂在它下面。 */
806
639
  var API_PREFIX = "/workbench/api";
807
- /** 模块偏好读写的路由前缀,挂在外壳 API 下:走写通道,拒写回 write-refused。 */
808
- var PREFS_PREFIX = `${API_PREFIX}/prefs`;
640
+ `${API_PREFIX}`;
809
641
  /** 事实(facts)SSE 事件流的端点路径;前端 `EventSource` 按它带 `since` 游标续传。 */
810
642
  var EVENTS_PATH = "/workbench/events";
811
- /** 写动作的路由前缀,挂在外壳 API 下:模块的写通道 POST 到这里。 */
812
- var ACTIONS_PREFIX = `${API_PREFIX}/actions`;
813
- /** 机器供给(provision)的路由前缀:只收 POST,装机时用它铺一份运行环境。 */
814
- var PROVISION_PREFIX = `${API_PREFIX}/provision`;
643
+ `${API_PREFIX}`;
644
+ `${API_PREFIX}`;
815
645
  /** 面板运行态上报的路径段:崩溃与卡片收尾分别 POST 到 `panel-state/crash`、`panel-state/cards`。 */
816
646
  var PANEL_STATE_PATH = "panel-state";
817
- /** DIY 调试动作的路径段;宿主按它登记 `/workbench/api/diy-debug` 前缀。 */
818
- var DIY_DEBUG_PATH = "diy-debug";
819
- /** 调试动作的子路径(`diy-debug/act`);仓内暂无调用点,动作现走 `DIY_DEBUG_SERVICE`。 */
820
- var DIY_DEBUG_ACT_PATH = `${DIY_DEBUG_PATH}/act`;
821
- /** DIY 录制交接的路径段;宿主按它登记 `/workbench/api/diy-record` 前缀。 */
822
- var DIY_RECORD_PATH = "diy-record";
823
- /** 录制动作的子路径(`diy-record/act`);仓内暂无调用点,录制现走 `DIY_RECORD_SERVICE`。 */
824
- var DIY_RECORD_ACT_PATH = `${DIY_RECORD_PATH}/act`;
825
- /** 面板运行态的路由前缀,挂在外壳 API 下:上报口用它,拒报回 report-refused。 */
826
- var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
827
- /** 钉住的 opencli 插件版本:`opencli-runtime` 按它校验、取那一份。 */
828
- var OPENCLI_PIN = "1.8.8";
829
- /** 缺陷看板套件的 dsh 服务名(`workbenchCodingIssues`):套件照它登记自己那份服务。 */
830
- var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
831
- /** 面板套件的 dsh 服务名(`workbenchPanels`):宿主经它取套件公布的清单与订阅。 */
832
- var PANELS_SERVICE = "workbenchPanels";
647
+ `${API_PREFIX}${PANEL_STATE_PATH}`;
833
648
  /** 单元花名册服务的 dsh 服务名(`workbenchUnits`):模块经它认领自己的单元。 */
834
649
  var UNITS_SERVICE = "workbenchUnits";
835
- /** 面板运行态服务的 dsh 服务名(`workbenchPanelState`):宿主注册,读口按它取。 */
836
- var PANEL_STATE_SERVICE = "workbenchPanelState";
837
- /** DIY 调试约定服务的 dsh 服务名(`workbenchDiyDebug`):调试动作走它,不走 HTTP。 */
838
- var DIY_DEBUG_SERVICE = "workbenchDiyDebug";
839
- /** DIY 录制交接服务的 dsh 服务名(`workbenchDiyRecord`):`diy-acts.ts` 经它收发录制三拍。 */
840
- var DIY_RECORD_SERVICE = "workbenchDiyRecord";
841
- /** 会话投影服务的 dsh 服务名(`sessionProjections`):宿主经 `stateOf(session, 'agentPreset')` 读那一档。 */
842
- var SESSION_PROJECTIONS_SERVICE = "sessionProjections";
843
- /** 单次 opencli 调用的默认超时(毫秒);调用点没传 `timeoutMs` 时按它算。 */
844
- var OPENCLI_TIMEOUT_MS = 12e4;
845
- /** 启动预热站点那一跳的超时(毫秒);超时按未热对待,不挡面板。 */
846
- var WARM_TIMEOUT_MS = 2e4;
847
- /** 装 / 卸模块包的超时(毫秒):pnpm 与取包内容都按它算。 */
848
- var INSTALL_TIMEOUT_MS = 3e5;
849
- /** 查 registry 版本那一次请求的超时(毫秒)。 */
850
- var VERSION_CHECK_TIMEOUT_MS = 1e4;
851
650
  /** 版本查询结果的缓存有效期(毫秒):期内不发第二次请求。 */
852
651
  var VERSION_CHECK_TTL_MS = 6e5;
853
- /** 单元探测结果的缓存有效期(毫秒)。 */
854
- var PROBE_TTL_MS = 3e4;
855
- /** 工具读出来的值交给面板后的保留时长(毫秒):过期就不再算这一拍。 */
856
- var HANDOFF_TTL_MS = 15e3;
857
- /** 跑本地 git 命令的超时(毫秒);短于对外的 `OPENCLI_TIMEOUT_MS`。 */
858
- var GIT_TIMEOUT_MS = 1e4;
859
652
  /** 面板轮询事实的间隔(毫秒):SSE 断了走这条兜底轮询。 */
860
653
  var PANEL_POLL_MS = 2e3;
861
- /** 没起中文名的工作区默认标题:左栏按它分组、显示。 */
862
- var DEFAULT_WORKSPACE_TITLE = "default-workspace";
863
654
  /** 记住当前项目的 localStorage 键。 */
864
655
  var STORAGE_KEY_PROJECT = "dsh-workbench.project";
865
656
  /** 记住右栏展开与否的 localStorage 键。 */
@@ -870,8 +661,6 @@ window.__ModuleLoader__.load({
870
661
  var STORAGE_KEY_RIGHTBAR_WIDTH = "dsh-workbench.rightbar.width";
871
662
  /** dsh i18n 的命名空间:词表都注册在它下面,`ctx.locale.register` / `bind` 按它取。 */
872
663
  var LOCALE_NS = "workbench";
873
- /** 外壳支持的语言标识,顺序即回退顺序:首项是基准,其余词表必须与它逐键同构。 */
874
- var LOCALES = ["zh", "en"];
875
664
  //#endregion
876
665
  //#region ../shared/dist/api/workbench-client.js
877
666
  /**
@@ -939,14 +728,8 @@ window.__ModuleLoader__.load({
939
728
  * React 的 `Component` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
940
729
  */
941
730
  var Component = react.Component;
942
- /**
943
- * React 的 `createContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
944
- */
945
- var createContext = react.createContext;
946
- /**
947
- * React 的 `useContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
948
- */
949
- var useContext = react.useContext;
731
+ react.createContext;
732
+ react.useContext;
950
733
  /**
951
734
  * React 的 `useState` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
952
735
  */
@@ -1396,18 +1179,6 @@ window.__ModuleLoader__.load({
1396
1179
  });
1397
1180
  }
1398
1181
  //#endregion
1399
- //#region ../shared/dist/components/Field.js
1400
- /**
1401
- * 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
1402
- * @param props.label - 左侧标签,必给。
1403
- * @param props.hint - 控件下面那行说明;不给不画。
1404
- * @param props.children - 控件本体,落在标签与说明之间。
1405
- * @returns 一个 `<label>`,点标签会聚焦里面的控件。
1406
- */
1407
- function Field({ label, hint, children }) {
1408
- return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1409
- }
1410
- //#endregion
1411
1182
  //#region ../shared/dist/components/FormActions.js
1412
1183
  var RANK$1 = {
1413
1184
  default: 0,
@@ -1458,6 +1229,66 @@ window.__ModuleLoader__.load({
1458
1229
  }));
1459
1230
  }
1460
1231
  //#endregion
1232
+ //#region ../shared/dist/components/Rows.js
1233
+ /**
1234
+ * 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
1235
+ * @param props.children - 一串 `Row`。
1236
+ * @returns 竖排的 div。
1237
+ */
1238
+ function Rows({ children }) {
1239
+ return h("div", { className: "wb-rows" }, children);
1240
+ }
1241
+ /**
1242
+ * 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
1243
+ * @param props.label - 左边那格(键)。
1244
+ * @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
1245
+ * @returns 一行两格。
1246
+ */
1247
+ function Row({ label, value }) {
1248
+ return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
1249
+ }
1250
+ //#endregion
1251
+ //#region ../shared/dist/components/ConfirmBar.js
1252
+ /**
1253
+ * 「先问一句再动手」那一条:标题 + 说明 + 键值 + 失败那句 + 动作区,形状一次收口。
1254
+ * **要不要问**归调用点(ADR-0054 §2 规则三),这一件只回答"问的时候长什么样"。
1255
+ * @param props.title - 那一句问话("发布到 prod?")。
1256
+ * @param props.hint - 标题下面那句说明或正文;不给不占位。
1257
+ * @param props.rows - 键值两格(键值列宽与分隔线归 `Rows` / `Row`);不给或空数组不渲染。值那一格可以放控件。
1258
+ * @param props.actions - 动作清单(归 `FormActions`:一个区一颗 `primary`、永远在右、窄了折行)。
1259
+ * @param props.problem - 失败那句(走 `Note tone="problem"`,读屏是 `alert`);不给不占位。
1260
+ * @param props.busy - 整条在忙(只喂 `aria-busy`;按钮自己的转圈与禁用归 `actions` 里那一颗)。
1261
+ * @param props.label - 读屏的组名;不给时 `title` 是字符串就拿它顶上,两者都没有就不设。
1262
+ * @returns 一个 `role="group"` 的条;`actions` 空数组时最后那一块不渲染。
1263
+ */
1264
+ function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
1265
+ return h("div", {
1266
+ className: "wb-confirmBar",
1267
+ role: "group",
1268
+ "aria-label": label ?? (typeof title === "string" ? title : void 0),
1269
+ "aria-busy": busy
1270
+ }, h("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h(Rows, null, rows.map((row) => h(Row, {
1271
+ key: row.key,
1272
+ label: row.label,
1273
+ value: row.value
1274
+ }))), problem === void 0 ? null : h(Note, {
1275
+ tone: "problem",
1276
+ role: "alert"
1277
+ }, problem), h(FormActions, { actions }));
1278
+ }
1279
+ //#endregion
1280
+ //#region ../shared/dist/components/Field.js
1281
+ /**
1282
+ * 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
1283
+ * @param props.label - 左侧标签,必给。
1284
+ * @param props.hint - 控件下面那行说明;不给不画。
1285
+ * @param props.children - 控件本体,落在标签与说明之间。
1286
+ * @returns 一个 `<label>`,点标签会聚焦里面的控件。
1287
+ */
1288
+ function Field({ label, hint, children }) {
1289
+ return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1290
+ }
1291
+ //#endregion
1461
1292
  //#region ../shared/dist/components/FormRows.js
1462
1293
  /**
1463
1294
  * 表单行的容器:同一份 `FormRows` 共用一个标签列(列宽由最长的标签定),行距也归它。
@@ -1546,11 +1377,14 @@ window.__ModuleLoader__.load({
1546
1377
  const values = formValuesOf(fields);
1547
1378
  const problems = {};
1548
1379
  for (const field of fields) {
1549
- const found = show ? field.validate?.(field.value, values) : void 0;
1380
+ const found = show ? problemOf(field, values) : void 0;
1550
1381
  problems[field.key] = found ? found : void 0;
1551
1382
  }
1552
1383
  return problems;
1553
1384
  }
1385
+ function problemOf(field, values) {
1386
+ return field.validate?.(field.value, values);
1387
+ }
1554
1388
  /**
1555
1389
  * 按字段顺序取第一处错误 —— 提交被挡住时要带进视口的就是这一格。
1556
1390
  * 判的是**真值**(与 `formProblemsOf` 同一口径):假值那种"错误文案"渲染出来本来就是空的,不算错。
@@ -1631,12 +1465,17 @@ window.__ModuleLoader__.load({
1631
1465
  hint: field.hint,
1632
1466
  problem: args.showProblem ? args.problems[field.key] : void 0,
1633
1467
  layout: field.layout
1634
- }, field.control({
1468
+ }, controlOf(field, args.problems, args.showProblem, args.busy)));
1469
+ }
1470
+ function controlOf(field, problems, showProblem, busy) {
1471
+ return field.control({
1635
1472
  id: `wb-form-${field.key}`,
1636
1473
  name: field.key,
1637
- invalid: args.showProblem && Boolean(args.problems[field.key]),
1638
- disabled: args.busy || field.disabled === true
1639
- })));
1474
+ invalid: showProblem && Boolean(problems[field.key]),
1475
+ disabled: busy || field.disabled === true,
1476
+ value: field.value,
1477
+ onChange: field.onChange
1478
+ });
1640
1479
  }
1641
1480
  //#endregion
1642
1481
  //#region ../shared/dist/lib/form-problem.js
@@ -1673,13 +1512,15 @@ window.__ModuleLoader__.load({
1673
1512
  //#region ../shared/dist/components/Form.js
1674
1513
  /**
1675
1514
  * 整张表单:`fields` 进,行、错误、操作区、(被挡住的)提交都由它安排 —— 它自己一个值都不存,
1676
- * 值仍归调用点的 model(`value` 只读给校验看)。
1515
+ * 值仍归调用点(`value` 与 `onChange` 写在字段配置的同一格里,`Form` 只是把两者原样递给那一格的 `control`)。
1516
+ * 写了 `Form<Values>` 就按 `Values` 把每一格的键与值类型钉住(`Values` 里会 `visible: false` 的键写成可选键);
1517
+ * 不写就是默认档,键值都不钉。
1677
1518
  * 还没提交过时一格错都不显示;第一次提交之后每次渲染重算,改好了当场消。
1678
1519
  * 提交那一拍永远先算一遍:有错就不调 `onSubmit`,并把第一个有错的 `FormRow` 带进视口、聚焦它里面的控件。
1679
1520
  * 回车与点提交钮走的是同一条路:真 `<form>` 的隐式提交在**只有一个文本框**时也会 fire,所以 `busy` / `disabled` 时回车同样不提交。
1680
1521
  * 调用点只管数据与语义:行怎么排、错误摆哪、什么时候校验、按钮在哪,这里没有口子。
1681
- * @param props.fields - 每格的键 / 标签 / 值 / 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
1682
- * @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表;被挡住时不会被调。
1522
+ * @param props.fields - 每格的键 / 标签 / 值 / 值怎么改(`onChange`)/ 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
1523
+ * @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表(按 `visibleFieldsOf` 过滤过,不可见那格不在里面);被挡住时不会被调。
1683
1524
  * @param props.submit - 提交钮文案;`busyLabel` 是提交中换的那句,不给就沿用 `label`。
1684
1525
  * @param props.cancel - 取消钮;给了就排在提交钮左边,`busy` 时一起禁用。
1685
1526
  * @param props.extra - 其余动作(default / danger),排在最左,`busy` 时一起禁用。
@@ -1769,7 +1610,7 @@ window.__ModuleLoader__.load({
1769
1610
  /**
1770
1611
  * 长任务那一行:状态点 + 标题 + 链接,跑失败时把步骤与原始输出收在两处可展开里。
1771
1612
  * 发布、扫描、迁移这类跑得久的事都用它,别自己画进度。
1772
- * @param props.status - `longTaskDot` 认的四态之一,决定状态点颜色与要不要画"失败"那两块。
1613
+ * @param props.status - `longTaskDot` 认的五态之一,决定状态点颜色与要不要画"失败"那两块。
1773
1614
  * @param props.headline - 这一行在干什么(一句话)。
1774
1615
  * @param props.problem - 失败原因;不给不画。
1775
1616
  * @param props.links - 行尾的链接,通常指向产物或日志。
@@ -1777,15 +1618,39 @@ window.__ModuleLoader__.load({
1777
1618
  * @param props.raw - 原始输出;只在失败时画,且要同时给 `rawTitle` 才成一块可展开。
1778
1619
  * @param props.stepsTitle - 步骤那块展开行的标题;`rawTitle` 同理是原始输出那块。
1779
1620
  * @param props.copyLabel - 复制钮文案:给了才画复制钮;`copiedLabel` 是复制成功后那句。
1621
+ * @param props.stop - 给了才在最右边画那颗两按停止钮;**不给就一个像素都不变**。只在生产方认 `signal` 时给。
1780
1622
  * @returns 一行长任务。
1781
1623
  */
1782
1624
  function LongTaskRow(props) {
1783
1625
  const [stepsOpen, setStepsOpen] = useState(false);
1784
1626
  const [rawOpen, setRawOpen] = useState(false);
1627
+ const [armed, setArmed] = useState(false);
1785
1628
  const failed = props.status === "failed";
1786
1629
  const problem = props.problem ?? "";
1787
1630
  const raw = (props.raw ?? "").trim();
1788
1631
  const steps = props.steps ?? [];
1632
+ const stop = props.stop;
1633
+ const busy = stop?.busy === true;
1634
+ const stopWhy = stop?.failed ?? "";
1635
+ useEffect(() => {
1636
+ if (!armed) return void 0;
1637
+ const timer = setTimeout(() => setArmed(false), LONG_TASK_STOP_ARM_MS);
1638
+ return () => clearTimeout(timer);
1639
+ }, [armed]);
1640
+ const onStopPress = () => {
1641
+ if (stop === void 0) return;
1642
+ const press = longTaskStopPress(longTaskStopStage({
1643
+ armed,
1644
+ busy
1645
+ }));
1646
+ if (press === "ignore") return;
1647
+ if (press === "arm") {
1648
+ setArmed(true);
1649
+ return;
1650
+ }
1651
+ setArmed(false);
1652
+ stop.onStop();
1653
+ };
1789
1654
  return h("div", { className: "wb-longTask" }, h("p", { className: "wb-longTaskHead" }, h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1790
1655
  state: longTaskDot(props.status),
1791
1656
  size: 10
@@ -1793,7 +1658,18 @@ window.__ModuleLoader__.load({
1793
1658
  href: link.href,
1794
1659
  key: `${link.text}@${link.href}`,
1795
1660
  text: link.text
1796
- }))), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1661
+ })), stop === void 0 ? null : h("button", {
1662
+ type: "button",
1663
+ className: `wb-longTaskStop${armed ? " wb-longTaskStopArmed" : ""}`,
1664
+ "data-stop-state": longTaskStopStage({
1665
+ armed,
1666
+ busy
1667
+ }),
1668
+ "aria-label": armed ? stop.armedLabel ?? stop.askLabel : stop.label,
1669
+ disabled: busy,
1670
+ onClick: onStopPress,
1671
+ onBlur: () => setArmed(false)
1672
+ }, h(_deepseek_ai_dsh_client_ui_primitives.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(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1797
1673
  className: "wb-longTaskDump",
1798
1674
  icon: h(_deepseek_ai_dsh_client_ui_primitives.IconFlatListOutlineRegular, { size: 14 }),
1799
1675
  title: props.stepsTitle,
@@ -1875,25 +1751,6 @@ window.__ModuleLoader__.load({
1875
1751
  });
1876
1752
  }
1877
1753
  //#endregion
1878
- //#region ../shared/dist/components/Rows.js
1879
- /**
1880
- * 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
1881
- * @param props.children - 一串 `Row`。
1882
- * @returns 竖排的 div。
1883
- */
1884
- function Rows({ children }) {
1885
- return h("div", { className: "wb-rows" }, children);
1886
- }
1887
- /**
1888
- * 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
1889
- * @param props.label - 左边那格(键)。
1890
- * @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
1891
- * @returns 一行两格。
1892
- */
1893
- function Row({ label, value }) {
1894
- return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
1895
- }
1896
- //#endregion
1897
1754
  //#region ../shared/dist/components/SaveBar.js
1898
1755
  /**
1899
1756
  * 设置面底下那条"取消 / 保存":就是 `FormActions` 的两颗固定动作,顺序与间距不归调用点。
@@ -2581,893 +2438,897 @@ window.__ModuleLoader__.load({
2581
2438
  writeText(key, value ? "true" : "false");
2582
2439
  }
2583
2440
  //#endregion
2584
- //#region ../shared/dist/i18n/en.js
2585
- /** 外壳自带的英文词表:键必须与 `zh` 逐一对应,值不许为空串。 */
2586
- var en = {
2587
- "brand.name": "Workbench",
2588
- "toggle.open": "Open sidebar",
2589
- "toggle.collapse": "Collapse sidebar",
2590
- "project.label": "Switch project",
2591
- "workspace.section": "Workspaces",
2592
- "project.none": "No project",
2593
- "project.empty": "No projects yet. Use “Add project” below.",
2594
- "project.add": "Add project…",
2595
- "project.add.busy": "Creating the workspace…",
2596
- "project.add.failed": "Creating the workspace failed",
2597
- "project.search.label": "Search workspaces",
2598
- "project.search.placeholder": "Search workspaces (folder / name / path)",
2599
- "project.search.empty": "No workspace matches “{query}”.",
2600
- "project.group.workspaces": "Workspaces",
2601
- "project.group.defaultWorkspace": "Default workspace",
2602
- "project.group.workshop": "Workshop",
2603
- "project.rename.row": "Rename “{name}”",
2604
- "project.rename.current": "Give this workspace a display name…",
2605
- "project.rename.title": "Give “{name}” a display name",
2606
- "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
2607
- "project.rename.field": "Display name",
2608
- "project.rename.placeholder": "e.g. Workbench shell",
2609
- "project.rename.hint": "Empty = folder name only",
2610
- "project.rename.save": "Save",
2611
- "project.rename.saving": "Saving…",
2612
- "project.rename.cancel": "Cancel",
2613
- "project.rename.failed": "Rename failed. Try again.",
2614
- "session.new": "New session",
2615
- "session.new.label": "Start a session in the current project",
2616
- "session.empty": "No sessions in this project yet.",
2617
- "session.noProject": "Add a project first.",
2618
- "session.list.label": "Sessions",
2619
- "session.copy": "Copy",
2620
- "session.pinned": "Pinned",
2621
- "session.actions": "Actions for {name}",
2622
- "status.idle": "Idle",
2623
- "status.running": "Running",
2624
- "status.waitingApproval": "Waiting for approval",
2625
- "status.planReview": "Plan awaiting review",
2626
- "status.waitingAnswer": "Waiting for your answer",
2627
- "status.compact.approval": "Approval",
2628
- "status.compact.planReview": "Plan review",
2629
- "status.compact.answer": "Answer",
2630
- "status.completed": "Completed",
2631
- "status.subagentsRunning.one": "{n} subagent running",
2632
- "status.subagentsRunning.other": "{n} subagents running",
2633
- "project.attention.warning.one": "1 session waiting for you",
2634
- "project.attention.warning.other": "{n} sessions waiting for you",
2635
- "project.attention.running.one": "1 session running",
2636
- "project.attention.running.other": "{n} sessions running",
2637
- "project.attention.done.one": "1 session finished, unread",
2638
- "project.attention.done.other": "{n} sessions finished, unread",
2639
- "project.attention.state.warning": "Approval",
2640
- "project.attention.state.running": "Running",
2641
- "project.attention.state.done": "New",
2642
- "hover.copied": "Copied",
2643
- "time.now": "just now",
2644
- "time.minutes": "{n} min ago",
2645
- "time.hours": "{n} h ago",
2646
- "time.days": "{n} d ago",
2647
- "time.ago": "{t} ago",
2648
- "time.short.minutes": "{n}min",
2649
- "time.short.hours": "{n}h",
2650
- "time.short.days": "{n}d",
2651
- "time.short.months": "{n}mo",
2652
- "time.short.years": "{n}y",
2653
- "panels.title": "Panel modules",
2654
- "panels.groupBoardless": "No-board modules",
2655
- "panels.groupPlugins": "opencli plugins",
2656
- "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.",
2657
- "panels.market.defaultLabel": "On by default everywhere",
2658
- "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
2659
- "panels.followAll": "Restore the default everywhere",
2660
- "panels.followAllConfirmTitle": "Restore the default everywhere?",
2661
- "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
2662
- "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
2663
- "panels.followAllConfirmYes": "Restore",
2664
- "panels.followAllConfirmNo": "Cancel",
2665
- "panels.enabled": "enabled in this project",
2666
- "panels.disabled": "not enabled in this project",
2667
- "panels.choose": "Choose modules",
2668
- "panels.buildModule": "Build a module",
2669
- "panels.failed": "Could not save the change. Try again.",
2670
- "panels.dragHint": "Drag to reorder",
2671
- "panels.unknownStep": "No suite provides this view",
2672
- "panels.labelWithHint": "{label} ({hint})",
2673
- "panels.hintJoin": "; ",
2674
- "panels.dep.failed": "⚠ failed to start",
2675
- "panels.dep.missingPlugin": "⚠ not ready yet",
2676
- "panels.dep.missingCommands": "⚠ needs an update",
2677
- "panels.dep.unchecked": "⚠ cannot check",
2678
- "panels.tab.modules": "Panel setup",
2679
- "panels.tab.market": "Workbench module market",
2680
- "panels.browseMarket": "Browse the module market",
2681
- "panels.noneInstalled": "None of these modules has its plugin installed yet",
2682
- "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
2683
- "panels.market.installed": "installed",
2684
- "panels.market.notActive": "not active",
2685
- "panels.market.notUsable": "unusable",
2686
- "panels.market.broken": "broken",
2687
- "panels.market.hasNew": "New version",
2688
- "panels.market.hasProblem": "Module problem",
2689
- "panels.market.missing": "not installed",
2690
- "panels.market.unchecked": "unknown",
2691
- "panels.market.checking": "checking",
2692
- "panels.market.sectionInstalled": "Installed modules",
2693
- "panels.market.sectionPending": "Not installed",
2694
- "panels.market.sectionShared": "Shared dependencies",
2695
- "panels.market.sharedUsedBy": "Used by module {modules}",
2696
- "panels.market.listSeparator": ", ",
2697
- "panels.market.sharedMissing": "not installed",
2698
- "panels.market.sharedOutdated": "update available",
2699
- "panels.market.sharedUnsatisfied": "wrong version",
2700
- "panels.market.sharedOk": "installed",
2701
- "panels.market.versionArrow": "{from} → {to}",
2702
- "panels.market.lead": "Installed on this machine, shared by every project.",
2703
- "panels.market.install": "Install",
2704
- "panels.market.update": "Update",
2705
- "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
2706
- "panels.market.uninstall": "Uninstall",
2707
- "panels.market.uninstallLabel": "Uninstall {name}",
2708
- "panels.market.installing": "Installing…",
2709
- "panels.market.updating": "Updating…",
2710
- "panels.market.uninstalling": "Uninstalling…",
2711
- "panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
2712
- "panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
2713
- "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
2714
- "panels.market.confirmYes": "Uninstall",
2715
- "panels.market.confirmNo": "Cancel",
2716
- "panels.market.failed": "Failed: {reason}",
2717
- "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
2718
- "panels.market.needCommands": "Missing commands: {commands}",
2719
- "panels.market.localMark": "local",
2720
- "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
2721
- "panels.market.noSource": "This module declares no install method — install it yourself",
2722
- "panels.market.badSource": "The install method is incomplete — install it yourself",
2723
- "panels.market.empty": "No modules available",
2724
- "panels.market.sectionPlugins": "Installed opencli plugins",
2725
- "panels.market.moduleOutdated": "update available",
2726
- "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
2727
- "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
2728
- "panels.market.moduleRestartHint": "restart dsh once to bring it up",
2729
- "panels.market.pendingRestart": "restart required",
2730
- "panels.market.workbenchName": "Workbench",
2731
- "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
2732
- "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
2733
- "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.",
2734
- "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
2735
- "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
2736
- "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.",
2737
- "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
2738
- "panels.market.foot": "After installing, enable it in the panel page of that project.",
2739
- "panels.market.recheck": "Check for updates",
2740
- "panels.market.checkUpdates": "Check for updates",
2741
- "panels.market.checkedAt": "Last checked: {time}",
2742
- "panels.market.justNow": "just now",
2743
- "panels.market.minutesAgo": "{n} min ago",
2744
- "panels.market.hoursAgo": "{n} h ago",
2745
- "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
2746
- "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
2747
- "panels.market.add.guideToggle": "Install guide and examples",
2748
- "panels.market.add.guideHide": "Hide guide",
2749
- "panels.market.add.guideIdTitle": "Package name",
2750
- "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
2751
- "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.",
2752
- "panels.market.add.guideGitTitle": "Git URL",
2753
- "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
2754
- "panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
2755
- "panels.market.add.guidePathTitle": "Local module directory",
2756
- "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
2757
- "panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
2758
- "panels.market.add.guideExampleLabel": "Example:",
2759
- "panels.market.add.guideFill": "Fill in",
2760
- "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.",
2761
- "panels.market.add.registryLegend": "Which npm registry to download from",
2762
- "panels.market.add.registryOfficial": "npm registry",
2763
- "panels.market.add.registryMirror": "China mirror",
2764
- "panels.market.add.registryWithHost": "{name} ({host})",
2765
- "panels.market.add.registryToggle": "Source",
2766
- "panels.market.add.installVersion": "Version {version}",
2767
- "panels.market.add.registryDefault": "Default source",
2768
- "panels.market.add.registryCustom": "Custom address",
2769
- "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
2770
- "panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
2771
- "panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
2772
- "panels.market.add.run": "Install",
2773
- "panels.market.add.edit": "Edit",
2774
- "panels.market.add.changeRegistry": "Change source",
2775
- "panels.market.add.installingTitle": "Installing the module…",
2776
- "panels.market.add.installedTitle": "Installed",
2777
- "panels.market.add.failedTitle": "Module install failed",
2778
- "panels.market.add.cancelledTitle": "Cancelled",
2779
- "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.",
2780
- "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
2781
- "panels.market.add.problemInstalled": "This module is already installed",
2782
- "panels.market.add.problemNotFound": "No such module found",
2783
- "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
2784
- "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.",
2785
- "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.",
2786
- "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.",
2787
- "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
2788
- "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
2789
- "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.",
2790
- "panels.market.add.pluginAlias": "Plugin name: {name}",
2791
- "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
2792
- "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
2793
- "panels.market.add.failureNetwork": "The network connection failed",
2794
- "panels.market.add.failureNotFound": "No such module found",
2795
- "panels.market.add.failureNoMatchingVersion": "No matching version",
2796
- "panels.market.add.failureDiskFull": "Out of disk space, install stopped",
2797
- "panels.market.add.failurePermission": "No write permission, cannot install",
2798
- "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
2799
- "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
2800
- "panels.market.add.failureTimeout": "The install timed out",
2801
- "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
2802
- "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",
2803
- "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
2804
- "panels.market.add.approveTitle": "Your approval is needed for install scripts",
2805
- "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
2806
- "panels.market.add.approveRun": "Allow and continue installing",
2807
- "panels.market.add.restart": "Installed — restart once to pick it up.",
2808
- "panels.market.add.tookEffect": "Live.",
2809
- "panels.market.add.details": "Install details",
2810
- "panels.market.add.open": "Add module",
2811
- "panels.market.add.title": "Add module",
2812
- "panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
2813
- "panels.market.add.specLabel": "Package",
2814
- "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.",
2815
- "panels.market.add.exampleTitle": "Examples",
2816
- "panels.market.add.exampleFill": "Fill in an example",
2817
- "panels.market.add.registryLabel": "Source",
2818
- "panels.market.add.registryProfile": "This profile's registry",
2819
- "panels.market.add.registryPnpm": "pnpm's own registry",
2820
- "panels.market.add.check": "Check",
2821
- "panels.market.add.checking": "Checking…",
2822
- "panels.market.add.classifying": "Checking…",
2823
- "panels.market.add.change": "Edit",
2824
- "panels.market.add.previewTitle": "About to install",
2825
- "panels.market.add.fieldName": "Package",
2826
- "panels.market.add.fieldVersion": "Version",
2827
- "panels.market.add.fieldDescription": "Description",
2828
- "panels.market.add.fieldSource": "Source",
2829
- "panels.market.add.install": "Install",
2830
- "panels.market.add.installing": "Installing…",
2831
- "panels.market.add.cancel": "Cancel install",
2832
- "panels.market.add.close": "Close",
2833
- "panels.market.add.retry": "Retry",
2834
- "panels.market.add.changeSource": "Change source",
2835
- "panels.market.add.approveBuilds": "Allow these scripts and retry",
2836
- "panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
2837
- "panels.market.add.doneApplied": "Installed and live.",
2838
- "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
2839
- "panels.market.add.restartWhy": "Why this needs a restart: {reason}",
2840
- "panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
2841
- "panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
2842
- "panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
2843
- "panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
2844
- "panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
2845
- "panels.market.add.cancelled": "Cancelled.",
2846
- "panels.market.add.failed": "Didn't work: {reason}",
2847
- "panels.market.add.removed": "It has been removed.",
2848
- "panels.market.add.supplyPending": "Its plugins install after you restart.",
2849
- "panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
2850
- "panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
2851
- "panels.market.add.removedRestart": "Removed — restart once to finish.",
2852
- "panels.market.add.remove": "Remove it",
2853
- "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
2854
- "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
2855
- "panels.market.add.problem.notFound": "No such package on that source.",
2856
- "panels.market.add.problem.notAPackage": "There is no package at that location.",
2857
- "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
2858
- "panels.market.add.problem.network": "The source is unreachable.",
2859
- "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
2860
- "panels.market.add.reason.invalidSpec": "the spec is not accepted",
2861
- "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
2862
- "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
2863
- "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
2864
- "panels.market.add.reason.bundleInUse": "something is still using it",
2865
- "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
2866
- "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
2867
- "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
2868
- "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
2869
- "panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
2870
- "panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
2871
- "panels.market.add.reason.diskFull": "the disk is full",
2872
- "panels.market.add.reason.permission": "no permission to write",
2873
- "panels.market.add.reason.integrity": "the download failed its integrity check",
2874
- "panels.market.add.reason.timeout": "no output for too long, so it was stopped",
2875
- "panels.market.add.reason.network": "the network is unreachable",
2876
- "panels.market.add.reason.notFound": "no such package on the source",
2877
- "panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
2878
- "blocker.fix.install": "Install for me",
2879
- "blocker.fix.update": "Upgrade for me",
2880
- "blocker.fix.running": "Running…",
2881
- "blocker.fix.failed": "Failed: ",
2882
- "blocker.retry": "Retry",
2883
- "blocker.retry.running": "Retrying…",
2884
- "blocker.copy": "Copy command",
2885
- "blocker.market.open": "Open the module market",
2886
- "blocker.login.title": "Sign in to {platform}",
2887
- "blocker.login.titleGeneric": "Sign-in required",
2888
- "blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
2889
- "blocker.login.go": "Go sign in",
2890
- "blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
2891
- "blocker.forbidden.title": "No access to {platform}",
2892
- "blocker.forbidden.titleGeneric": "No access",
2893
- "blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
2894
- "blocker.forbidden.open": "Open permissions page",
2895
- "blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
2896
- "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
2897
- "blocker.unknown.title": "Something went wrong",
2898
- "panels.reading": "Reading the panel setup…",
2899
- "panels.cardBroken": "This module will not render: {unit} ({reason})",
2900
- "panels.cardRetry": "Retry",
2901
- "panels.empty": "No modules on the panel yet",
2902
- "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
2903
- "env.title": "Preparing the workbench",
2904
- "env.checking": "Checking the runtime environment…",
2905
- "env.installing": "Installing the missing dependency…",
2906
- "env.failed": "One step away",
2907
- "env.elapsed": "Waiting {seconds}s",
2908
- "env.stepFailed.install": "install failed",
2909
- "env.stepFailed.path": "installed but not found",
2910
- "env.stepFailed.shell": "no shell channel",
2911
- "env.bridge.ok": "Connected",
2912
- "env.bridge.short": "Not connected",
2913
- "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.",
2914
- "env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
2915
- "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.",
2916
- "env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
2917
- "env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
2918
- "env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
2919
- "env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
2920
- "env.fix.title": "How to fix it",
2921
- "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.",
2922
- "env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
2923
- "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
2924
- "env.fix.step": "Run this in a terminal, then hit Retry:",
2925
- "env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
2926
- "env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
2927
- "env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
2928
- "env.fix.network": "Network unreachable: check your network or proxy, then retry.",
2929
- "env.fix.details": "Details (for troubleshooting)",
2930
- "env.retry": "Retry",
2931
- "env.copyCommand": "Copy command",
2932
- "env.copied": "Copied",
2933
- "env.step.opencli": "Checking the workbench opencli",
2934
- "env.step.codingPlugin": "Checking the coding plugin",
2935
- "env.step.bridge": "Checking the browser bridge",
2936
- "env.step.warm": "Warming up site sessions",
2937
- "env.warm.done": "{n} site(s) warmed up",
2938
- "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
2939
- "env.unit.failed": "This module cannot start",
2940
- "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
2941
- "env.unit.missingPlugin": "This module is not ready yet",
2942
- "env.unit.missingCommandsHint": "Updating it should fix this.",
2943
- "env.unit.unchecked": "Cannot check: no shell channel",
2944
- "env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
2945
- "env.unit.missingCommands": "This module is out of date",
2946
- "env.unit.hint": "Retry after installing; other modules are unaffected.",
2947
- "rightbar.label": "Data panels",
2948
- "rightbar.expand": "Expand the data panel",
2949
- "rightbar.collapse": "Collapse the data panel",
2950
- "rightbar.column.label": "Right column",
2951
- "rightbar.column.workbench": "Workbench panel",
2952
- "rightbar.column.dsh": "dsh panel",
2953
- "rightbar.refresh": "Refresh",
2954
- "rightbar.refreshing": "Refreshing…",
2955
- "rightbar.updatedAt": "updated {time}",
2956
- "rightbar.noProject": "The current session has no workspace",
2957
- "rightbar.openPlatform": "Open on the platform",
2958
- "coding.notARepo.title": "This workspace is not a Coding repository",
2959
- "error.unknown": "Something went wrong",
2960
- "board.title": "Workbench panel",
2961
- "panel.conversation": "Conversation",
2962
- "panels.label": "Global panels",
2963
- "configSync.nav": "Config sync",
2964
- "configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
2965
- "configSync.source": "Source",
2966
- "configSync.sourceBroken": "its config is unreadable",
2967
- "configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
2968
- "configSync.sourceDead": "unreadable",
2969
- "configSync.refresh": "Read again",
2970
- "configSync.loading": "Reading the source config…",
2971
- "configSync.readHint": "Pick another source, or read again.",
2972
- "configSync.tag.new": "New",
2973
- "configSync.tag.differs": "Differs",
2974
- "configSync.conflictNote": "Applying replaces this workbench copy with the source",
2975
- "configSync.code.lang": "yaml",
2976
- "configSync.code.copy": "Copy",
2977
- "configSync.code.copied": "Copied",
2978
- "configSync.code.wrap": "Wrap lines",
2979
- "configSync.code.unwrap": "No wrap",
2980
- "configSync.code.collapse": "Collapse",
2981
- "configSync.code.collapseAria": "Collapse this row",
2982
- "configSync.code.expandAria": "Expand the diff ({count} more lines)",
2983
- "configSync.code.expand": "Show {count} more lines",
2984
- "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",
2985
- "configSync.apply": "Sync {count} selected",
2986
- "configSync.applyNone": "Pick some rows first",
2987
- "configSync.applying": "Writing…",
2988
- "configSync.applied": "Written to the workbench config · applied",
2989
- "configSync.appliedIds": "Written this time: {ids}",
2990
- "configSync.skippedIds": "Left alone (already here): {ids}",
2991
- "configSync.nothing": "Nothing to sync",
2992
- "configSync.unreadable": "Cannot read {path}: {reason}",
2993
- "configSync.noSource": "This machine has no other profile to sync from",
2994
- "configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
2995
- "configSync.failed": "The sync did not go through; try again.",
2996
- "debug.workspace": "this workspace",
2997
- "debug.status": "Debugging “{title}”",
2998
- "debug.status.trouble": "Debugging needs your attention ({title})",
2999
- "debug.stalled": "Debugging paused ({title})",
3000
- "debug.act.pause": "Pause debugging",
3001
- "debug.act.resume": "Resume debugging",
3002
- "debug.act.stop": "Stop debugging",
3003
- "debug.act.stop.ask": "Confirm stop",
3004
- "debug.card.here.title": "Debugging “{title}”",
3005
- "debug.card.here.note": "Do not switch workspaces or touch the panel",
3006
- "debug.card.away.note": "Switch back to “{title}”",
3007
- "debug.card.paused.note": "Paused",
3008
- "debug.card.hidden.note": "Switch back to the Workbench panel",
3009
- "record.waiting": "Recording handoff · your turn",
3010
- "record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
3011
- "record.recording": "Recording",
3012
- "record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
3013
- "record.finished": "Recording finished",
3014
- "record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
3015
- "record.act.cancel": "Cancel",
3016
- "record.act.halt": "Halt",
3017
- "approval.record.site": "Site",
3018
- "approval.record.what": "Records",
3019
- "approval.record.lands": "Lands in",
3020
- "approval.record.noUrl": "no site given (this call gets refused)",
3021
- "approval.record.oneAction": "one action",
3022
- "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)"
3023
- };
3024
- //#endregion
3025
- //#region ../shared/dist/i18n/zh.js
3026
- /** 外壳自带的中文词表(命名空间 `workbench`):`en` 与它逐键对齐,模块那份在它之上合并。 */
3027
- var zh = {
3028
- "brand.name": "工作台",
3029
- "toggle.open": "打开侧边栏",
3030
- "toggle.collapse": "收起侧边栏",
3031
- "project.label": "切换项目",
3032
- "workspace.section": "工作区",
3033
- "project.none": "未选择项目",
3034
- "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
3035
- "project.add": "添加项目…",
3036
- "project.add.busy": "正在新建工作区…",
3037
- "project.add.failed": "新建工作区没成功",
3038
- "project.search.label": "搜索工作区",
3039
- "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
3040
- "project.search.empty": "没有匹配「{query}」的工作区。",
3041
- "project.group.workspaces": "工作区",
3042
- "project.group.defaultWorkspace": "默认工作区",
3043
- "project.group.workshop": "工坊",
3044
- "project.rename.row": "改「{name}」的中文名",
3045
- "project.rename.current": "改当前工作区的中文名…",
3046
- "project.rename.title": "给「{name}」配一个中文名",
3047
- "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
3048
- "project.rename.field": "中文名",
3049
- "project.rename.placeholder": "例如:工作台外壳",
3050
- "project.rename.hint": "留空 = 只显示目录名",
3051
- "project.rename.save": "保存",
3052
- "project.rename.saving": "保存中…",
3053
- "project.rename.cancel": "取消",
3054
- "project.rename.failed": "改名失败了,再试一次。",
3055
- "session.new": "新会话",
3056
- "session.new.label": "在当前项目新建会话",
3057
- "session.empty": "这个项目还没有会话。",
3058
- "session.noProject": "先添加一个项目。",
3059
- "session.list.label": "会话",
3060
- "session.copy": "复制",
3061
- "session.pinned": "已置顶",
3062
- "session.actions": "{name} 的操作",
3063
- "status.idle": "空闲",
3064
- "status.running": "进行中",
3065
- "status.waitingApproval": "等待审批",
3066
- "status.planReview": "计划待审",
3067
- "status.waitingAnswer": "等待回答",
3068
- "status.compact.approval": "待审批",
3069
- "status.compact.planReview": "计划待审",
3070
- "status.compact.answer": "待回答",
3071
- "status.completed": "已完成",
3072
- "status.subagentsRunning.one": "{n} 个子代理运行中",
3073
- "status.subagentsRunning.other": "{n} 个子代理运行中",
3074
- "project.attention.warning.one": "1 个会话在等你点头",
3075
- "project.attention.warning.other": "{n} 个会话在等你点头",
3076
- "project.attention.running.one": "1 个会话在跑",
3077
- "project.attention.running.other": "{n} 个会话在跑",
3078
- "project.attention.done.one": "1 个会话跑完没看",
3079
- "project.attention.done.other": "{n} 个会话跑完没看",
3080
- "project.attention.state.warning": "待审批",
3081
- "project.attention.state.running": "在跑",
3082
- "project.attention.state.done": "新消息",
3083
- "hover.copied": "已复制",
3084
- "time.now": "刚刚",
3085
- "time.minutes": "{n} 分钟前",
3086
- "time.hours": "{n} 小时前",
3087
- "time.days": "{n} 天前",
3088
- "time.ago": "{t}前",
3089
- "time.short.minutes": "{n}分钟",
3090
- "time.short.hours": "{n}小时",
3091
- "time.short.days": "{n}天",
3092
- "time.short.months": "{n}个月",
3093
- "time.short.years": "{n}年",
3094
- "panels.title": "面板模块",
3095
- "panels.groupBoardless": "无看板模块",
3096
- "panels.groupPlugins": "opencli 插件",
3097
- "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
3098
- "panels.market.defaultLabel": "全局默认开启",
3099
- "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
3100
- "panels.followAll": "全部恢复默认",
3101
- "panels.followAllConfirmTitle": "全部恢复默认?",
3102
- "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
3103
- "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
3104
- "panels.followAllConfirmYes": "恢复默认",
3105
- "panels.followAllConfirmNo": "取消",
3106
- "panels.enabled": "这个项目已启用",
3107
- "panels.disabled": "这个项目未启用",
3108
- "panels.choose": "选择模块",
3109
- "panels.buildModule": "造一个模块",
3110
- "panels.failed": "改配置失败了,再试一次。",
3111
- "panels.dragHint": "拖动调整顺序",
3112
- "panels.unknownStep": "这一层没有套件提供",
3113
- "panels.labelWithHint": "{label}({hint})",
3114
- "panels.hintJoin": ";",
3115
- "panels.dep.failed": "⚠ 起不来",
3116
- "panels.dep.missingPlugin": "⚠ 还没装好",
3117
- "panels.dep.missingCommands": "⚠ 需要更新",
3118
- "panels.dep.unchecked": "⚠ 检测不了",
3119
- "panels.tab.modules": "面板配置",
3120
- "panels.tab.market": "工作台模块市场",
3121
- "panels.browseMarket": "浏览模块市场",
3122
- "panels.noneInstalled": "这些模块要的插件都还没装",
3123
- "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
3124
- "panels.market.installed": "已安装",
3125
- "panels.market.notActive": "未生效",
3126
- "panels.market.notUsable": "不可用",
3127
- "panels.market.broken": "装坏了",
3128
- "panels.market.hasNew": "有新版本",
3129
- "panels.market.hasProblem": "模块异常",
3130
- "panels.market.missing": "未装",
3131
- "panels.market.unchecked": "状态未知",
3132
- "panels.market.checking": "检测中",
3133
- "panels.market.sectionInstalled": "已安装模块",
3134
- "panels.market.sectionPending": "未安装",
3135
- "panels.market.sectionShared": "共用依赖",
3136
- "panels.market.sharedUsedBy": "供 {modules} 模块使用",
3137
- "panels.market.listSeparator": "、",
3138
- "panels.market.sharedMissing": "未装",
3139
- "panels.market.sharedOutdated": "有新版",
3140
- "panels.market.sharedUnsatisfied": "版本不对",
3141
- "panels.market.sharedOk": "已装",
3142
- "panels.market.versionArrow": "{from} → {to}",
3143
- "panels.market.lead": "装在这台机器上,所有项目共用。",
3144
- "panels.market.install": "安装",
3145
- "panels.market.update": "更新",
3146
- "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
3147
- "panels.market.uninstall": "卸载",
3148
- "panels.market.uninstallLabel": "卸载 {name}",
3149
- "panels.market.installing": "正在安装…",
3150
- "panels.market.updating": "正在更新…",
3151
- "panels.market.uninstalling": "正在卸载…",
3152
- "panels.market.confirmUninstallTitle": "卸载「{name}」?",
3153
- "panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
3154
- "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
3155
- "panels.market.confirmYes": "卸载",
3156
- "panels.market.confirmNo": "取消",
3157
- "panels.market.failed": "没成功:{reason}",
3158
- "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
3159
- "panels.market.needCommands": "缺这几条命令:{commands}",
3160
- "panels.market.localMark": "本地",
3161
- "panels.market.localHint": "本机那份(不从源上取)。",
3162
- "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
3163
- "panels.market.badSource": "安装方式没写全,只能自己动手",
3164
- "panels.market.empty": "暂无可用模块",
3165
- "panels.market.sectionPlugins": "已安装 opencli 插件",
3166
- "panels.market.moduleOutdated": "有新版",
3167
- "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
3168
- "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
3169
- "panels.market.moduleRestartHint": "重启后生效",
3170
- "panels.market.pendingRestart": "重启后生效",
3171
- "panels.market.workbenchName": "工作台",
3172
- "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
3173
- "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
3174
- "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
3175
- "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
3176
- "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
3177
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
3178
- "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
3179
- "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
3180
- "panels.market.recheck": "重新检查更新",
3181
- "panels.market.checkUpdates": "检查更新",
3182
- "panels.market.checkedAt": "最近检查:{time}",
3183
- "panels.market.justNow": "刚刚",
3184
- "panels.market.minutesAgo": "{n} 分钟前",
3185
- "panels.market.hoursAgo": "{n} 小时前",
3186
- "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
3187
- "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
3188
- "panels.market.add.guideToggle": "模块安装引导和示例",
3189
- "panels.market.add.guideHide": "收起引导",
3190
- "panels.market.add.guideIdTitle": "包名",
3191
- "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
3192
- "panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
3193
- "panels.market.add.guideGitTitle": "Git 仓库地址",
3194
- "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
3195
- "panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
3196
- "panels.market.add.guidePathTitle": "本地模块目录",
3197
- "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
3198
- "panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
3199
- "panels.market.add.guideExampleLabel": "示例:",
3200
- "panels.market.add.guideFill": "填入示例",
3201
- "panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
3202
- "panels.market.add.registryLegend": "从哪个 npm 源下载模块",
3203
- "panels.market.add.registryOfficial": "npm 官方源",
3204
- "panels.market.add.registryMirror": "中国大陆镜像源",
3205
- "panels.market.add.registryWithHost": "{name}({host})",
3206
- "panels.market.add.registryToggle": "安装源",
3207
- "panels.market.add.installVersion": "版本 {version}",
3208
- "panels.market.add.registryDefault": "默认安装源",
3209
- "panels.market.add.registryCustom": "自定义地址",
3210
- "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
3211
- "panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
3212
- "panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
3213
- "panels.market.add.run": "安装",
3214
- "panels.market.add.edit": "编辑",
3215
- "panels.market.add.changeRegistry": "更换安装源",
3216
- "panels.market.add.installingTitle": "模块安装中…",
3217
- "panels.market.add.installedTitle": "已安装",
3218
- "panels.market.add.failedTitle": "模块安装失败",
3219
- "panels.market.add.cancelledTitle": "已取消",
3220
- "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
3221
- "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
3222
- "panels.market.add.problemInstalled": "该模块已安装",
3223
- "panels.market.add.problemNotFound": "未找到相关模块",
3224
- "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
3225
- "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
3226
- "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
3227
- "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
3228
- "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
3229
- "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
3230
- "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
3231
- "panels.market.add.pluginAlias": "插件名:{name}",
3232
- "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
3233
- "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
3234
- "panels.market.add.failureNetwork": "网络连接失败",
3235
- "panels.market.add.failureNotFound": "未找到相关模块",
3236
- "panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
3237
- "panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
3238
- "panels.market.add.failurePermission": "没有写入权限,无法安装",
3239
- "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
3240
- "panels.market.add.failureIntegrity": "下载的安装包校验失败",
3241
- "panels.market.add.failureTimeout": "安装超时",
3242
- "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
3243
- "panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
3244
- "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
3245
- "panels.market.add.approveTitle": "需要你允许安装脚本",
3246
- "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
3247
- "panels.market.add.approveRun": "允许并继续安装",
3248
- "panels.market.add.restart": "装好了,重启一次才生效。",
3249
- "panels.market.add.tookEffect": "已生效。",
3250
- "panels.market.add.details": "安装详情",
3251
- "panels.market.add.open": "添加模块",
3252
- "panels.market.add.title": "添加模块",
3253
- "panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
3254
- "panels.market.add.specLabel": "包名",
3255
- "panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
3256
- "panels.market.add.exampleTitle": "示例",
3257
- "panels.market.add.exampleFill": "填入示例",
3258
- "panels.market.add.registryLabel": "安装源",
3259
- "panels.market.add.registryProfile": "这个 profile 配的源",
3260
- "panels.market.add.registryPnpm": "pnpm 自己配的源",
3261
- "panels.market.add.check": "预检",
3262
- "panels.market.add.checking": "正在预检…",
3263
- "panels.market.add.classifying": "检测中…",
3264
- "panels.market.add.change": "改一下",
3265
- "panels.market.add.previewTitle": "将要安装",
3266
- "panels.market.add.fieldName": "包名",
3267
- "panels.market.add.fieldVersion": "版本",
3268
- "panels.market.add.fieldDescription": "简介",
3269
- "panels.market.add.fieldSource": "来源",
3270
- "panels.market.add.install": "安装",
3271
- "panels.market.add.installing": "正在安装…",
3272
- "panels.market.add.cancel": "取消安装",
3273
- "panels.market.add.close": "关闭",
3274
- "panels.market.add.retry": "重试",
3275
- "panels.market.add.changeSource": "换源",
3276
- "panels.market.add.approveBuilds": "允许这些脚本并重试",
3277
- "panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
3278
- "panels.market.add.doneApplied": "装好了,已经生效。",
3279
- "panels.market.add.doneRestart": "装好了,重启一次才生效。",
3280
- "panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
3281
- "panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
3282
- "panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
3283
- "panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
3284
- "panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
3285
- "panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
3286
- "panels.market.add.cancelled": "已取消。",
3287
- "panels.market.add.failed": "没成功:{reason}",
3288
- "panels.market.add.removed": "已经移除了。",
3289
- "panels.market.add.supplyPending": "它要的插件重启后再装。",
3290
- "panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
3291
- "panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
3292
- "panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
3293
- "panels.market.add.remove": "移除它",
3294
- "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
3295
- "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
3296
- "panels.market.add.problem.notFound": "源上没有这个包。",
3297
- "panels.market.add.problem.notAPackage": "这个位置没有包。",
3298
- "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
3299
- "panels.market.add.problem.network": "源连不上。",
3300
- "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
3301
- "panels.market.add.reason.invalidSpec": "写法不认",
3302
- "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
3303
- "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
3304
- "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
3305
- "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
3306
- "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
3307
- "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
3308
- "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
3309
- "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
3310
- "panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
3311
- "panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
3312
- "panels.market.add.reason.diskFull": "磁盘满了",
3313
- "panels.market.add.reason.permission": "没有写权限",
3314
- "panels.market.add.reason.integrity": "下载内容校验不过",
3315
- "panels.market.add.reason.timeout": "太久没有输出,被中断了",
3316
- "panels.market.add.reason.network": "网络不通",
3317
- "panels.market.add.reason.notFound": "源上没有这个包",
3318
- "panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
3319
- "blocker.fix.install": "帮我安装",
3320
- "blocker.fix.update": "帮我升级",
3321
- "blocker.fix.running": "正在执行…",
3322
- "blocker.fix.failed": "执行失败:",
3323
- "blocker.retry": "重试",
3324
- "blocker.retry.running": "重试中…",
3325
- "blocker.copy": "复制命令",
3326
- "blocker.market.open": "去模块市场",
3327
- "blocker.login.title": "需要登录 {platform}",
3328
- "blocker.login.titleGeneric": "需要登录",
3329
- "blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
3330
- "blocker.login.go": "去登录",
3331
- "blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
3332
- "blocker.forbidden.title": "没有权限访问 {platform}",
3333
- "blocker.forbidden.titleGeneric": "没有权限",
3334
- "blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
3335
- "blocker.forbidden.open": "打开权限页",
3336
- "blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
3337
- "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
3338
- "blocker.unknown.title": "出了点问题",
3339
- "panels.reading": "正在读取面板配置…",
3340
- "panels.cardBroken": "这个模块起不来:{unit}({reason})",
3341
- "panels.cardRetry": "重试",
3342
- "panels.empty": "面板里还没有模块",
3343
- "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
3344
- "env.title": "准备工作台",
3345
- "env.checking": "正在检测运行环境…",
3346
- "env.installing": "正在安装缺失的依赖…",
3347
- "env.failed": "还差一步就能用了",
3348
- "env.elapsed": "已等待 {seconds} 秒",
3349
- "env.stepFailed.install": "装不上",
3350
- "env.stepFailed.path": "装了但还找不到",
3351
- "env.stepFailed.shell": "执行通道不可用",
3352
- "env.bridge.ok": "已连接",
3353
- "env.bridge.short": "没连上",
3354
- "env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
3355
- "env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
3356
- "env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
3357
- "env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
3358
- "env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
3359
- "env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
3360
- "env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
3361
- "env.fix.title": "怎么解决",
3362
- "env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
3363
- "env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
3364
- "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
3365
- "env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
3366
- "env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
3367
- "env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
3368
- "env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
3369
- "env.fix.network": "网络不通:检查网络或代理设置后重试。",
3370
- "env.fix.details": "详细输出(排障用)",
3371
- "env.retry": "重试",
3372
- "env.copyCommand": "复制命令",
3373
- "env.copied": "已复制",
3374
- "env.step.opencli": "检测工作台的 opencli",
3375
- "env.step.codingPlugin": "检测 coding 插件",
3376
- "env.step.bridge": "检测浏览器通道",
3377
- "env.step.warm": "预热站点登录态",
3378
- "env.warm.done": "已预热 {n} 个站点",
3379
- "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
3380
- "env.unit.failed": "这个模块起不来",
3381
- "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
3382
- "env.unit.missingPlugin": "这个模块还没装好",
3383
- "env.unit.missingCommandsHint": "更新之后就能用了。",
3384
- "env.unit.unchecked": "检测不了:拿不到执行通道",
3385
- "env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
3386
- "env.unit.missingCommands": "这个模块的版本旧了",
3387
- "env.unit.hint": "装好之后点重试;不影响其它模块。",
3388
- "rightbar.label": "数据面板",
3389
- "rightbar.expand": "展开数据面板",
3390
- "rightbar.collapse": "收起数据面板",
3391
- "rightbar.column.label": "右侧栏",
3392
- "rightbar.column.workbench": "工作台面板",
3393
- "rightbar.column.dsh": "dsh 面板",
3394
- "rightbar.refresh": "刷新",
3395
- "rightbar.refreshing": "刷新中…",
3396
- "rightbar.updatedAt": "更新于 {time}",
3397
- "rightbar.noProject": "当前会话没有所属项目",
3398
- "rightbar.openPlatform": "在平台上打开",
3399
- "coding.notARepo.title": "这个项目不是 Coding 仓库",
3400
- "error.unknown": "出错了",
3401
- "board.title": "工作台面板",
3402
- "panel.conversation": "对话",
3403
- "panels.label": "全局面板",
3404
- "configSync.nav": "配置同步",
3405
- "configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
3406
- "configSync.source": "来源",
3407
- "configSync.sourceBroken": "读不到它的配置",
3408
- "configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
3409
- "configSync.sourceDead": "读不到",
3410
- "configSync.refresh": "重新读一遍",
3411
- "configSync.loading": "正在读来源的配置…",
3412
- "configSync.readHint": "换个来源,或再读一遍。",
3413
- "configSync.tag.new": "新增",
3414
- "configSync.tag.differs": "差异",
3415
- "configSync.conflictNote": "应用后工作台这份会被来源覆盖",
3416
- "configSync.code.lang": "yaml",
3417
- "configSync.code.copy": "复制",
3418
- "configSync.code.copied": "已复制",
3419
- "configSync.code.wrap": "自动换行",
3420
- "configSync.code.unwrap": "不换行",
3421
- "configSync.code.collapse": "收起",
3422
- "configSync.code.collapseAria": "收起这一行的配置",
3423
- "configSync.code.expandAria": "展开差异(还有 {count} 行)",
3424
- "configSync.code.expand": "展开剩余 {count} 行",
3425
- "configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
3426
- "configSync.apply": "同步选中的 {count} 行",
3427
- "configSync.applyNone": "先勾几行",
3428
- "configSync.applying": "正在写入…",
3429
- "configSync.applied": "已写入工作台配置 · 已生效",
3430
- "configSync.appliedIds": "这次写进去:{ids}",
3431
- "configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
3432
- "configSync.nothing": "没有需要同步的内容",
3433
- "configSync.unreadable": "读不到 {path}:{reason}",
3434
- "configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
3435
- "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
3436
- "configSync.failed": "同步没成功,再试一次。",
3437
- "debug.workspace": "这个工作区",
3438
- "debug.status": "「{title}」调试中",
3439
- "debug.status.trouble": "调试要你看一眼({title})",
3440
- "debug.stalled": "调试已暂停({title})",
3441
- "debug.act.pause": "暂停调试",
3442
- "debug.act.resume": "继续调试",
3443
- "debug.act.stop": "结束调试",
3444
- "debug.act.stop.ask": "确认结束",
3445
- "debug.card.here.title": "正在调试「{title}」",
3446
- "debug.card.here.note": "请勿切换工作区和操作面板",
3447
- "debug.card.away.note": "请切回「{title}」那一屏",
3448
- "debug.card.paused.note": "已暂停",
3449
- "debug.card.hidden.note": "请切回工作台面板",
3450
- "record.waiting": "取证交接 · 等你出手",
3451
- "record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
3452
- "record.recording": "录制中",
3453
- "record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
3454
- "record.finished": "录制完成",
3455
- "record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
3456
- "record.act.cancel": "取消",
3457
- "record.act.halt": "停",
3458
- "approval.record.site": "站点",
3459
- "approval.record.what": "录制功能",
3460
- "approval.record.lands": "落点",
3461
- "approval.record.noUrl": "没给站点地址(这次会被当场拒)",
3462
- "approval.record.oneAction": "一次操作",
3463
- "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)"
3464
- };
3465
- //#endregion
3466
2441
  //#region ../shared/dist/i18n/index.js
3467
2442
  /** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
3468
2443
  var dictionaries = {
3469
- zh,
3470
- en
2444
+ zh: {
2445
+ "brand.name": "工作台",
2446
+ "toggle.open": "打开侧边栏",
2447
+ "toggle.collapse": "收起侧边栏",
2448
+ "project.label": "切换项目",
2449
+ "workspace.section": "工作区",
2450
+ "project.none": "未选择项目",
2451
+ "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
2452
+ "project.add": "添加项目…",
2453
+ "project.add.busy": "正在新建工作区…",
2454
+ "project.add.failed": "新建工作区没成功",
2455
+ "project.search.label": "搜索工作区",
2456
+ "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
2457
+ "project.search.empty": "没有匹配「{query}」的工作区。",
2458
+ "project.group.workspaces": "工作区",
2459
+ "project.group.defaultWorkspace": "默认工作区",
2460
+ "project.group.workshop": "工坊",
2461
+ "project.rename.row": "改「{name}」的中文名",
2462
+ "project.rename.current": "改当前工作区的中文名…",
2463
+ "project.rename.title": "给「{name}」配一个中文名",
2464
+ "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
2465
+ "project.rename.field": "中文名",
2466
+ "project.rename.placeholder": "例如:工作台外壳",
2467
+ "project.rename.hint": "留空 = 只显示目录名",
2468
+ "project.rename.save": "保存",
2469
+ "project.rename.saving": "保存中…",
2470
+ "project.rename.cancel": "取消",
2471
+ "project.rename.failed": "改名失败了,再试一次。",
2472
+ "session.new": "新会话",
2473
+ "session.new.label": "在当前项目新建会话",
2474
+ "session.empty": "这个项目还没有会话。",
2475
+ "session.noProject": "先添加一个项目。",
2476
+ "session.list.label": "会话",
2477
+ "session.copy": "复制",
2478
+ "session.pinned": "已置顶",
2479
+ "session.actions": "{name} 的操作",
2480
+ "status.idle": "空闲",
2481
+ "status.running": "进行中",
2482
+ "status.longTask": "长任务在跑",
2483
+ "status.waitingApproval": "等待审批",
2484
+ "status.planReview": "计划待审",
2485
+ "status.waitingAnswer": "等待回答",
2486
+ "status.compact.approval": "待审批",
2487
+ "status.compact.planReview": "计划待审",
2488
+ "status.compact.answer": "待回答",
2489
+ "status.completed": "已完成",
2490
+ "status.subagentsRunning.one": "{n} 个子代理运行中",
2491
+ "status.subagentsRunning.other": "{n} 个子代理运行中",
2492
+ "project.attention.warning.one": "1 个会话在等你点头",
2493
+ "project.attention.warning.other": "{n} 个会话在等你点头",
2494
+ "project.attention.running.one": "1 个会话在跑",
2495
+ "project.attention.running.other": "{n} 个会话在跑",
2496
+ "project.attention.longTask.one": "1 个长任务在跑",
2497
+ "project.attention.longTask.other": "{n} 个长任务在跑",
2498
+ "project.attention.done.one": "1 个会话跑完没看",
2499
+ "project.attention.done.other": "{n} 个会话跑完没看",
2500
+ "project.attention.state.warning": "待审批",
2501
+ "project.attention.state.running": "在跑",
2502
+ "project.attention.state.done": "新消息",
2503
+ "hover.copied": "已复制",
2504
+ "time.now": "刚刚",
2505
+ "time.minutes": "{n} 分钟前",
2506
+ "time.hours": "{n} 小时前",
2507
+ "time.days": "{n} 天前",
2508
+ "time.ago": "{t}前",
2509
+ "time.short.minutes": "{n}分钟",
2510
+ "time.short.hours": "{n}小时",
2511
+ "time.short.days": "{n}天",
2512
+ "time.short.months": "{n}个月",
2513
+ "time.short.years": "{n}年",
2514
+ "panels.title": "面板模块",
2515
+ "panels.groupBoardless": "无看板模块",
2516
+ "panels.groupPlugins": "opencli 插件",
2517
+ "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
2518
+ "panels.market.defaultLabel": "全局默认开启",
2519
+ "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
2520
+ "panels.followAll": "全部恢复默认",
2521
+ "panels.followAllConfirmTitle": "全部恢复默认?",
2522
+ "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
2523
+ "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
2524
+ "panels.followAllConfirmYes": "恢复默认",
2525
+ "panels.followAllConfirmNo": "取消",
2526
+ "panels.enabled": "这个项目已启用",
2527
+ "panels.disabled": "这个项目未启用",
2528
+ "panels.choose": "选择模块",
2529
+ "panels.buildModule": "造一个模块",
2530
+ "panels.failed": "改配置失败了,再试一次。",
2531
+ "panels.dragHint": "拖动调整顺序",
2532
+ "panels.unknownStep": "这一层没有套件提供",
2533
+ "panels.labelWithHint": "{label}({hint})",
2534
+ "panels.hintJoin": ";",
2535
+ "panels.dep.failed": "⚠ 起不来",
2536
+ "panels.dep.missingPlugin": "⚠ 还没装好",
2537
+ "panels.dep.missingCommands": "⚠ 需要更新",
2538
+ "panels.dep.unchecked": "⚠ 检测不了",
2539
+ "panels.tab.modules": "面板配置",
2540
+ "panels.tab.market": "工作台模块市场",
2541
+ "panels.browseMarket": "浏览模块市场",
2542
+ "panels.noneInstalled": "这些模块要的插件都还没装",
2543
+ "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
2544
+ "panels.market.installed": "已安装",
2545
+ "panels.market.notActive": "未生效",
2546
+ "panels.market.notUsable": "不可用",
2547
+ "panels.market.broken": "装坏了",
2548
+ "panels.market.hasNew": "有新版本",
2549
+ "panels.market.hasProblem": "模块异常",
2550
+ "panels.market.missing": "未装",
2551
+ "panels.market.unchecked": "状态未知",
2552
+ "panels.market.checking": "检测中",
2553
+ "panels.market.sectionInstalled": "已安装模块",
2554
+ "panels.market.sectionPending": "未安装",
2555
+ "panels.market.sectionShared": "共用依赖",
2556
+ "panels.market.sharedUsedBy": "供 {modules} 模块使用",
2557
+ "panels.market.listSeparator": "、",
2558
+ "panels.market.sharedMissing": "未装",
2559
+ "panels.market.sharedOutdated": "有新版",
2560
+ "panels.market.sharedUnsatisfied": "版本不对",
2561
+ "panels.market.sharedOk": "已装",
2562
+ "panels.market.versionArrow": "{from} → {to}",
2563
+ "panels.market.lead": "装在这台机器上,所有项目共用。",
2564
+ "panels.market.install": "安装",
2565
+ "panels.market.update": "更新",
2566
+ "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
2567
+ "panels.market.uninstall": "卸载",
2568
+ "panels.market.uninstallLabel": "卸载 {name}",
2569
+ "panels.market.installing": "正在安装…",
2570
+ "panels.market.updating": "正在更新…",
2571
+ "panels.market.uninstalling": "正在卸载…",
2572
+ "panels.market.confirmUninstallTitle": "卸载「{name}」?",
2573
+ "panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
2574
+ "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
2575
+ "panels.market.confirmYes": "卸载",
2576
+ "panels.market.confirmNo": "取消",
2577
+ "panels.market.failed": "没成功:{reason}",
2578
+ "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
2579
+ "panels.market.needCommands": "缺这几条命令:{commands}",
2580
+ "panels.market.localMark": "本地",
2581
+ "panels.market.localHint": "本机那份(不从源上取)。",
2582
+ "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
2583
+ "panels.market.badSource": "安装方式没写全,只能自己动手",
2584
+ "panels.market.empty": "暂无可用模块",
2585
+ "panels.market.sectionPlugins": "已安装 opencli 插件",
2586
+ "panels.market.moduleOutdated": "有新版",
2587
+ "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
2588
+ "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
2589
+ "panels.market.moduleRestartHint": "重启后生效",
2590
+ "panels.market.pendingRestart": "重启后生效",
2591
+ "panels.market.workbenchName": "工作台",
2592
+ "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
2593
+ "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
2594
+ "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
2595
+ "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
2596
+ "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
2597
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
2598
+ "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
2599
+ "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
2600
+ "panels.market.recheck": "重新检查更新",
2601
+ "panels.market.checkUpdates": "检查更新",
2602
+ "panels.market.checkedAt": "最近检查:{time}",
2603
+ "panels.market.justNow": "刚刚",
2604
+ "panels.market.minutesAgo": "{n} 分钟前",
2605
+ "panels.market.hoursAgo": "{n} 小时前",
2606
+ "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
2607
+ "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
2608
+ "panels.market.add.guideToggle": "模块安装引导和示例",
2609
+ "panels.market.add.guideHide": "收起引导",
2610
+ "panels.market.add.guideIdTitle": "包名",
2611
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
2612
+ "panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
2613
+ "panels.market.add.guideGitTitle": "Git 仓库地址",
2614
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
2615
+ "panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
2616
+ "panels.market.add.guidePathTitle": "本地模块目录",
2617
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
2618
+ "panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
2619
+ "panels.market.add.guideExampleLabel": "示例:",
2620
+ "panels.market.add.guideFill": "填入示例",
2621
+ "panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
2622
+ "panels.market.add.registryLegend": "从哪个 npm 源下载模块",
2623
+ "panels.market.add.registryOfficial": "npm 官方源",
2624
+ "panels.market.add.registryMirror": "中国大陆镜像源",
2625
+ "panels.market.add.registryWithHost": "{name}({host})",
2626
+ "panels.market.add.registryToggle": "安装源",
2627
+ "panels.market.add.installVersion": "版本 {version}",
2628
+ "panels.market.add.registryDefault": "默认安装源",
2629
+ "panels.market.add.registryCustom": "自定义地址",
2630
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
2631
+ "panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
2632
+ "panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
2633
+ "panels.market.add.run": "安装",
2634
+ "panels.market.add.edit": "编辑",
2635
+ "panels.market.add.changeRegistry": "更换安装源",
2636
+ "panels.market.add.installingTitle": "模块安装中…",
2637
+ "panels.market.add.installedTitle": "已安装",
2638
+ "panels.market.add.failedTitle": "模块安装失败",
2639
+ "panels.market.add.cancelledTitle": "已取消",
2640
+ "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
2641
+ "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
2642
+ "panels.market.add.problemInstalled": "该模块已安装",
2643
+ "panels.market.add.problemNotFound": "未找到相关模块",
2644
+ "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
2645
+ "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
2646
+ "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
2647
+ "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
2648
+ "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
2649
+ "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
2650
+ "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
2651
+ "panels.market.add.pluginAlias": "插件名:{name}",
2652
+ "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
2653
+ "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
2654
+ "panels.market.add.failureNetwork": "网络连接失败",
2655
+ "panels.market.add.failureNotFound": "未找到相关模块",
2656
+ "panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
2657
+ "panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
2658
+ "panels.market.add.failurePermission": "没有写入权限,无法安装",
2659
+ "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
2660
+ "panels.market.add.failureIntegrity": "下载的安装包校验失败",
2661
+ "panels.market.add.failureTimeout": "安装超时",
2662
+ "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
2663
+ "panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
2664
+ "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
2665
+ "panels.market.add.approveTitle": "需要你允许安装脚本",
2666
+ "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
2667
+ "panels.market.add.approveRun": "允许并继续安装",
2668
+ "panels.market.add.restart": "装好了,重启一次才生效。",
2669
+ "panels.market.add.tookEffect": "已生效。",
2670
+ "panels.market.add.details": "安装详情",
2671
+ "panels.market.add.open": "添加模块",
2672
+ "panels.market.add.title": "添加模块",
2673
+ "panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
2674
+ "panels.market.add.specLabel": "包名",
2675
+ "panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
2676
+ "panels.market.add.exampleTitle": "示例",
2677
+ "panels.market.add.exampleFill": "填入示例",
2678
+ "panels.market.add.registryLabel": "安装源",
2679
+ "panels.market.add.registryProfile": "这个 profile 配的源",
2680
+ "panels.market.add.registryPnpm": "pnpm 自己配的源",
2681
+ "panels.market.add.check": "预检",
2682
+ "panels.market.add.checking": "正在预检…",
2683
+ "panels.market.add.classifying": "检测中…",
2684
+ "panels.market.add.change": "改一下",
2685
+ "panels.market.add.previewTitle": "将要安装",
2686
+ "panels.market.add.fieldName": "包名",
2687
+ "panels.market.add.fieldVersion": "版本",
2688
+ "panels.market.add.fieldDescription": "简介",
2689
+ "panels.market.add.fieldSource": "来源",
2690
+ "panels.market.add.install": "安装",
2691
+ "panels.market.add.installing": "正在安装…",
2692
+ "panels.market.add.cancel": "取消安装",
2693
+ "panels.market.add.close": "关闭",
2694
+ "panels.market.add.retry": "重试",
2695
+ "panels.market.add.changeSource": "换源",
2696
+ "panels.market.add.approveBuilds": "允许这些脚本并重试",
2697
+ "panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
2698
+ "panels.market.add.doneApplied": "装好了,已经生效。",
2699
+ "panels.market.add.doneRestart": "装好了,重启一次才生效。",
2700
+ "panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
2701
+ "panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
2702
+ "panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
2703
+ "panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
2704
+ "panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
2705
+ "panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
2706
+ "panels.market.add.cancelled": "已取消。",
2707
+ "panels.market.add.failed": "没成功:{reason}",
2708
+ "panels.market.add.removed": "已经移除了。",
2709
+ "panels.market.add.supplyPending": "它要的插件重启后再装。",
2710
+ "panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
2711
+ "panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
2712
+ "panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
2713
+ "panels.market.add.remove": "移除它",
2714
+ "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
2715
+ "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
2716
+ "panels.market.add.problem.notFound": "源上没有这个包。",
2717
+ "panels.market.add.problem.notAPackage": "这个位置没有包。",
2718
+ "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
2719
+ "panels.market.add.problem.network": "源连不上。",
2720
+ "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
2721
+ "panels.market.add.reason.invalidSpec": "写法不认",
2722
+ "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
2723
+ "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
2724
+ "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
2725
+ "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
2726
+ "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
2727
+ "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
2728
+ "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
2729
+ "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
2730
+ "panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
2731
+ "panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
2732
+ "panels.market.add.reason.diskFull": "磁盘满了",
2733
+ "panels.market.add.reason.permission": "没有写权限",
2734
+ "panels.market.add.reason.integrity": "下载内容校验不过",
2735
+ "panels.market.add.reason.timeout": "太久没有输出,被中断了",
2736
+ "panels.market.add.reason.network": "网络不通",
2737
+ "panels.market.add.reason.notFound": "源上没有这个包",
2738
+ "panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
2739
+ "blocker.fix.install": "帮我安装",
2740
+ "blocker.fix.update": "帮我升级",
2741
+ "blocker.fix.running": "正在执行…",
2742
+ "blocker.fix.failed": "执行失败:",
2743
+ "blocker.retry": "重试",
2744
+ "blocker.retry.running": "重试中…",
2745
+ "blocker.copy": "复制命令",
2746
+ "blocker.market.open": "去模块市场",
2747
+ "blocker.login.title": "需要登录 {platform}",
2748
+ "blocker.login.titleGeneric": "需要登录",
2749
+ "blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
2750
+ "blocker.login.go": "去登录",
2751
+ "blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
2752
+ "blocker.forbidden.title": "没有权限访问 {platform}",
2753
+ "blocker.forbidden.titleGeneric": "没有权限",
2754
+ "blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
2755
+ "blocker.forbidden.open": "打开权限页",
2756
+ "blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
2757
+ "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
2758
+ "blocker.unknown.title": "出了点问题",
2759
+ "panels.reading": "正在读取面板配置…",
2760
+ "panels.cardBroken": "这个模块起不来:{unit}({reason})",
2761
+ "panels.cardRetry": "重试",
2762
+ "panels.empty": "面板里还没有模块",
2763
+ "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
2764
+ "env.title": "准备工作台",
2765
+ "env.checking": "正在检测运行环境…",
2766
+ "env.installing": "正在安装缺失的依赖…",
2767
+ "env.failed": "还差一步就能用了",
2768
+ "env.elapsed": "已等待 {seconds} 秒",
2769
+ "env.stepFailed.install": "装不上",
2770
+ "env.stepFailed.path": "装了但还找不到",
2771
+ "env.stepFailed.shell": "执行通道不可用",
2772
+ "env.bridge.ok": "已连接",
2773
+ "env.bridge.short": "没连上",
2774
+ "env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
2775
+ "env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
2776
+ "env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
2777
+ "env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
2778
+ "env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
2779
+ "env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
2780
+ "env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
2781
+ "env.fix.title": "怎么解决",
2782
+ "env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
2783
+ "env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
2784
+ "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
2785
+ "env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
2786
+ "env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
2787
+ "env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
2788
+ "env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
2789
+ "env.fix.network": "网络不通:检查网络或代理设置后重试。",
2790
+ "env.fix.details": "详细输出(排障用)",
2791
+ "env.retry": "重试",
2792
+ "env.copyCommand": "复制命令",
2793
+ "env.copied": "已复制",
2794
+ "env.step.opencli": "检测工作台的 opencli",
2795
+ "env.step.codingPlugin": "检测 coding 插件",
2796
+ "env.step.bridge": "检测浏览器通道",
2797
+ "env.step.warm": "预热站点登录态",
2798
+ "env.warm.done": "已预热 {n} 个站点",
2799
+ "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
2800
+ "env.unit.failed": "这个模块起不来",
2801
+ "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
2802
+ "env.unit.missingPlugin": "这个模块还没装好",
2803
+ "env.unit.missingCommandsHint": "更新之后就能用了。",
2804
+ "env.unit.unchecked": "检测不了:拿不到执行通道",
2805
+ "env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
2806
+ "env.unit.missingCommands": "这个模块的版本旧了",
2807
+ "env.unit.hint": "装好之后点重试;不影响其它模块。",
2808
+ "rightbar.label": "数据面板",
2809
+ "rightbar.expand": "展开数据面板",
2810
+ "rightbar.collapse": "收起数据面板",
2811
+ "rightbar.column.label": "右侧栏",
2812
+ "rightbar.column.workbench": "工作台面板",
2813
+ "rightbar.column.dsh": "dsh 面板",
2814
+ "rightbar.refresh": "刷新",
2815
+ "rightbar.refreshing": "刷新中…",
2816
+ "rightbar.updatedAt": "更新于 {time}",
2817
+ "rightbar.noProject": "当前会话没有所属项目",
2818
+ "rightbar.openPlatform": "在平台上打开",
2819
+ "coding.notARepo.title": "这个项目不是 Coding 仓库",
2820
+ "error.unknown": "出错了",
2821
+ "board.title": "工作台面板",
2822
+ "panel.conversation": "对话",
2823
+ "panels.label": "全局面板",
2824
+ "configSync.nav": "配置同步",
2825
+ "configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
2826
+ "configSync.source": "来源",
2827
+ "configSync.sourceBroken": "读不到它的配置",
2828
+ "configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
2829
+ "configSync.sourceDead": "读不到",
2830
+ "configSync.refresh": "重新读一遍",
2831
+ "configSync.loading": "正在读来源的配置…",
2832
+ "configSync.readHint": "换个来源,或再读一遍。",
2833
+ "configSync.tag.new": "新增",
2834
+ "configSync.tag.differs": "差异",
2835
+ "configSync.conflictNote": "应用后工作台这份会被来源覆盖",
2836
+ "configSync.code.lang": "yaml",
2837
+ "configSync.code.copy": "复制",
2838
+ "configSync.code.copied": "已复制",
2839
+ "configSync.code.wrap": "自动换行",
2840
+ "configSync.code.unwrap": "不换行",
2841
+ "configSync.code.collapse": "收起",
2842
+ "configSync.code.collapseAria": "收起这一行的配置",
2843
+ "configSync.code.expandAria": "展开差异(还有 {count} 行)",
2844
+ "configSync.code.expand": "展开剩余 {count} 行",
2845
+ "configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
2846
+ "configSync.apply": "同步选中的 {count} 行",
2847
+ "configSync.applyNone": "先勾几行",
2848
+ "configSync.applying": "正在写入…",
2849
+ "configSync.applied": "已写入工作台配置 · 已生效",
2850
+ "configSync.appliedIds": "这次写进去:{ids}",
2851
+ "configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
2852
+ "configSync.nothing": "没有需要同步的内容",
2853
+ "configSync.unreadable": "读不到 {path}:{reason}",
2854
+ "configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
2855
+ "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
2856
+ "configSync.failed": "同步没成功,再试一次。",
2857
+ "debug.workspace": "这个工作区",
2858
+ "debug.status": "「{title}」调试中",
2859
+ "debug.status.trouble": "调试要你看一眼({title})",
2860
+ "debug.stalled": "调试已暂停({title})",
2861
+ "debug.act.pause": "暂停调试",
2862
+ "debug.act.resume": "继续调试",
2863
+ "debug.act.stop": "结束调试",
2864
+ "debug.act.stop.ask": "确认结束",
2865
+ "debug.card.here.title": "正在调试「{title}」",
2866
+ "debug.card.here.note": "请勿切换工作区和操作面板",
2867
+ "debug.card.away.note": "请切回「{title}」那一屏",
2868
+ "debug.card.paused.note": "已暂停",
2869
+ "debug.card.hidden.note": "请切回工作台面板",
2870
+ "record.waiting": "取证交接 · 等你出手",
2871
+ "record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
2872
+ "record.recording": "录制中",
2873
+ "record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
2874
+ "record.recording.shots": ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)",
2875
+ "record.finished": "录制完成",
2876
+ "record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
2877
+ "record.act.cancel": "取消",
2878
+ "record.act.halt": "停",
2879
+ "approval.record.site": "站点",
2880
+ "approval.record.what": "录制功能",
2881
+ "approval.record.lands": "落点",
2882
+ "approval.record.noUrl": "没给站点地址(这次会被当场拒)",
2883
+ "approval.record.oneAction": "一次操作",
2884
+ "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
2885
+ "approval.longTask.what": "要停的那一趟",
2886
+ "approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
2887
+ },
2888
+ en: {
2889
+ "brand.name": "Workbench",
2890
+ "toggle.open": "Open sidebar",
2891
+ "toggle.collapse": "Collapse sidebar",
2892
+ "project.label": "Switch project",
2893
+ "workspace.section": "Workspaces",
2894
+ "project.none": "No project",
2895
+ "project.empty": "No projects yet. Use “Add project” below.",
2896
+ "project.add": "Add project…",
2897
+ "project.add.busy": "Creating the workspace…",
2898
+ "project.add.failed": "Creating the workspace failed",
2899
+ "project.search.label": "Search workspaces",
2900
+ "project.search.placeholder": "Search workspaces (folder / name / path)",
2901
+ "project.search.empty": "No workspace matches “{query}”.",
2902
+ "project.group.workspaces": "Workspaces",
2903
+ "project.group.defaultWorkspace": "Default workspace",
2904
+ "project.group.workshop": "Workshop",
2905
+ "project.rename.row": "Rename “{name}”",
2906
+ "project.rename.current": "Give this workspace a display name…",
2907
+ "project.rename.title": "Give “{name}” a display name",
2908
+ "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
2909
+ "project.rename.field": "Display name",
2910
+ "project.rename.placeholder": "e.g. Workbench shell",
2911
+ "project.rename.hint": "Empty = folder name only",
2912
+ "project.rename.save": "Save",
2913
+ "project.rename.saving": "Saving…",
2914
+ "project.rename.cancel": "Cancel",
2915
+ "project.rename.failed": "Rename failed. Try again.",
2916
+ "session.new": "New session",
2917
+ "session.new.label": "Start a session in the current project",
2918
+ "session.empty": "No sessions in this project yet.",
2919
+ "session.noProject": "Add a project first.",
2920
+ "session.list.label": "Sessions",
2921
+ "session.copy": "Copy",
2922
+ "session.pinned": "Pinned",
2923
+ "session.actions": "Actions for {name}",
2924
+ "status.idle": "Idle",
2925
+ "status.running": "Running",
2926
+ "status.longTask": "Long task running",
2927
+ "status.waitingApproval": "Waiting for approval",
2928
+ "status.planReview": "Plan awaiting review",
2929
+ "status.waitingAnswer": "Waiting for your answer",
2930
+ "status.compact.approval": "Approval",
2931
+ "status.compact.planReview": "Plan review",
2932
+ "status.compact.answer": "Answer",
2933
+ "status.completed": "Completed",
2934
+ "status.subagentsRunning.one": "{n} subagent running",
2935
+ "status.subagentsRunning.other": "{n} subagents running",
2936
+ "project.attention.warning.one": "1 session waiting for you",
2937
+ "project.attention.warning.other": "{n} sessions waiting for you",
2938
+ "project.attention.running.one": "1 session running",
2939
+ "project.attention.running.other": "{n} sessions running",
2940
+ "project.attention.longTask.one": "1 long task running",
2941
+ "project.attention.longTask.other": "{n} long tasks running",
2942
+ "project.attention.done.one": "1 session finished, unread",
2943
+ "project.attention.done.other": "{n} sessions finished, unread",
2944
+ "project.attention.state.warning": "Approval",
2945
+ "project.attention.state.running": "Running",
2946
+ "project.attention.state.done": "New",
2947
+ "hover.copied": "Copied",
2948
+ "time.now": "just now",
2949
+ "time.minutes": "{n} min ago",
2950
+ "time.hours": "{n} h ago",
2951
+ "time.days": "{n} d ago",
2952
+ "time.ago": "{t} ago",
2953
+ "time.short.minutes": "{n}min",
2954
+ "time.short.hours": "{n}h",
2955
+ "time.short.days": "{n}d",
2956
+ "time.short.months": "{n}mo",
2957
+ "time.short.years": "{n}y",
2958
+ "panels.title": "Panel modules",
2959
+ "panels.groupBoardless": "No-board modules",
2960
+ "panels.groupPlugins": "opencli plugins",
2961
+ "panels.market.defaultHint": "When on, it is on by default in every workspace; you can also turn it off for a single workspace in Panel setup.",
2962
+ "panels.market.defaultLabel": "On by default everywhere",
2963
+ "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
2964
+ "panels.followAll": "Restore the default everywhere",
2965
+ "panels.followAllConfirmTitle": "Restore the default everywhere?",
2966
+ "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
2967
+ "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
2968
+ "panels.followAllConfirmYes": "Restore",
2969
+ "panels.followAllConfirmNo": "Cancel",
2970
+ "panels.enabled": "enabled in this project",
2971
+ "panels.disabled": "not enabled in this project",
2972
+ "panels.choose": "Choose modules",
2973
+ "panels.buildModule": "Build a module",
2974
+ "panels.failed": "Could not save the change. Try again.",
2975
+ "panels.dragHint": "Drag to reorder",
2976
+ "panels.unknownStep": "No suite provides this view",
2977
+ "panels.labelWithHint": "{label} ({hint})",
2978
+ "panels.hintJoin": "; ",
2979
+ "panels.dep.failed": "⚠ failed to start",
2980
+ "panels.dep.missingPlugin": "⚠ not ready yet",
2981
+ "panels.dep.missingCommands": "⚠ needs an update",
2982
+ "panels.dep.unchecked": "⚠ cannot check",
2983
+ "panels.tab.modules": "Panel setup",
2984
+ "panels.tab.market": "Workbench module market",
2985
+ "panels.browseMarket": "Browse the module market",
2986
+ "panels.noneInstalled": "None of these modules has its plugin installed yet",
2987
+ "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
2988
+ "panels.market.installed": "installed",
2989
+ "panels.market.notActive": "not active",
2990
+ "panels.market.notUsable": "unusable",
2991
+ "panels.market.broken": "broken",
2992
+ "panels.market.hasNew": "New version",
2993
+ "panels.market.hasProblem": "Module problem",
2994
+ "panels.market.missing": "not installed",
2995
+ "panels.market.unchecked": "unknown",
2996
+ "panels.market.checking": "checking",
2997
+ "panels.market.sectionInstalled": "Installed modules",
2998
+ "panels.market.sectionPending": "Not installed",
2999
+ "panels.market.sectionShared": "Shared dependencies",
3000
+ "panels.market.sharedUsedBy": "Used by module {modules}",
3001
+ "panels.market.listSeparator": ", ",
3002
+ "panels.market.sharedMissing": "not installed",
3003
+ "panels.market.sharedOutdated": "update available",
3004
+ "panels.market.sharedUnsatisfied": "wrong version",
3005
+ "panels.market.sharedOk": "installed",
3006
+ "panels.market.versionArrow": "{from} → {to}",
3007
+ "panels.market.lead": "Installed on this machine, shared by every project.",
3008
+ "panels.market.install": "Install",
3009
+ "panels.market.update": "Update",
3010
+ "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
3011
+ "panels.market.uninstall": "Uninstall",
3012
+ "panels.market.uninstallLabel": "Uninstall {name}",
3013
+ "panels.market.installing": "Installing…",
3014
+ "panels.market.updating": "Updating…",
3015
+ "panels.market.uninstalling": "Uninstalling…",
3016
+ "panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
3017
+ "panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
3018
+ "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
3019
+ "panels.market.confirmYes": "Uninstall",
3020
+ "panels.market.confirmNo": "Cancel",
3021
+ "panels.market.failed": "Failed: {reason}",
3022
+ "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
3023
+ "panels.market.needCommands": "Missing commands: {commands}",
3024
+ "panels.market.localMark": "local",
3025
+ "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
3026
+ "panels.market.noSource": "This module declares no install method — install it yourself",
3027
+ "panels.market.badSource": "The install method is incomplete — install it yourself",
3028
+ "panels.market.empty": "No modules available",
3029
+ "panels.market.sectionPlugins": "Installed opencli plugins",
3030
+ "panels.market.moduleOutdated": "update available",
3031
+ "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
3032
+ "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
3033
+ "panels.market.moduleRestartHint": "restart dsh once to bring it up",
3034
+ "panels.market.pendingRestart": "restart required",
3035
+ "panels.market.workbenchName": "Workbench",
3036
+ "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
3037
+ "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
3038
+ "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
3039
+ "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
3040
+ "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
3041
+ "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules_install_bundle.",
3042
+ "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
3043
+ "panels.market.foot": "After installing, enable it in the panel page of that project.",
3044
+ "panels.market.recheck": "Check for updates",
3045
+ "panels.market.checkUpdates": "Check for updates",
3046
+ "panels.market.checkedAt": "Last checked: {time}",
3047
+ "panels.market.justNow": "just now",
3048
+ "panels.market.minutesAgo": "{n} min ago",
3049
+ "panels.market.hoursAgo": "{n} h ago",
3050
+ "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
3051
+ "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
3052
+ "panels.market.add.guideToggle": "Install guide and examples",
3053
+ "panels.market.add.guideHide": "Hide guide",
3054
+ "panels.market.add.guideIdTitle": "Package name",
3055
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
3056
+ "panels.market.add.guideIdHint": "The module package name is its npm name (like dsh-workbench-module-xxx or @author/module) — whatever follows dsh plugin add or pnpm add in the README of a community module.",
3057
+ "panels.market.add.guideGitTitle": "Git URL",
3058
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
3059
+ "panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
3060
+ "panels.market.add.guidePathTitle": "Local module directory",
3061
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
3062
+ "panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
3063
+ "panels.market.add.guideExampleLabel": "Example:",
3064
+ "panels.market.add.guideFill": "Fill in",
3065
+ "panels.market.add.guideSafety": "Make sure you trust the source. Modules run on this machine with your permissions; an unknown module can damage the workbench or read and leak your data.",
3066
+ "panels.market.add.registryLegend": "Which npm registry to download from",
3067
+ "panels.market.add.registryOfficial": "npm registry",
3068
+ "panels.market.add.registryMirror": "China mirror",
3069
+ "panels.market.add.registryWithHost": "{name} ({host})",
3070
+ "panels.market.add.registryToggle": "Source",
3071
+ "panels.market.add.installVersion": "Version {version}",
3072
+ "panels.market.add.registryDefault": "Default source",
3073
+ "panels.market.add.registryCustom": "Custom address",
3074
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
3075
+ "panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
3076
+ "panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
3077
+ "panels.market.add.run": "Install",
3078
+ "panels.market.add.edit": "Edit",
3079
+ "panels.market.add.changeRegistry": "Change source",
3080
+ "panels.market.add.installingTitle": "Installing the module…",
3081
+ "panels.market.add.installedTitle": "Installed",
3082
+ "panels.market.add.failedTitle": "Module install failed",
3083
+ "panels.market.add.cancelledTitle": "Cancelled",
3084
+ "panels.market.add.failureNetworkHost": "Cannot reach {host}. Git URLs and .tgz links bypass the registry, so this machine needs direct access or a proxy; if the module is also on npm, use its package name instead.",
3085
+ "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
3086
+ "panels.market.add.problemInstalled": "This module is already installed",
3087
+ "panels.market.add.problemNotFound": "No such module found",
3088
+ "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
3089
+ "panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
3090
+ "panels.market.add.problemNotWorkbenchModule": "This package does not match the workbench you are running, so installing it would not work. Pick another version, or ask the module author.",
3091
+ "panels.market.add.problemNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing. Pick another version, or ask the package author.",
3092
+ "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
3093
+ "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
3094
+ "panels.market.add.pluginPreview": "This is an opencli plugin: it goes into the opencli plugin area and works as soon as it is installed — no restart.",
3095
+ "panels.market.add.pluginAlias": "Plugin name: {name}",
3096
+ "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
3097
+ "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
3098
+ "panels.market.add.failureNetwork": "The network connection failed",
3099
+ "panels.market.add.failureNotFound": "No such module found",
3100
+ "panels.market.add.failureNoMatchingVersion": "No matching version",
3101
+ "panels.market.add.failureDiskFull": "Out of disk space, install stopped",
3102
+ "panels.market.add.failurePermission": "No write permission, cannot install",
3103
+ "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
3104
+ "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
3105
+ "panels.market.add.failureTimeout": "The install timed out",
3106
+ "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
3107
+ "panels.market.add.failureInstalled": "It is already in this profile: this dsh runs with hot reload, which refuses to install over the same package (remove it first) — and removing it failed too",
3108
+ "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
3109
+ "panels.market.add.approveTitle": "Your approval is needed for install scripts",
3110
+ "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
3111
+ "panels.market.add.approveRun": "Allow and continue installing",
3112
+ "panels.market.add.restart": "Installed — restart once to pick it up.",
3113
+ "panels.market.add.tookEffect": "Live.",
3114
+ "panels.market.add.details": "Install details",
3115
+ "panels.market.add.open": "Add module",
3116
+ "panels.market.add.title": "Add module",
3117
+ "panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
3118
+ "panels.market.add.specLabel": "Package",
3119
+ "panels.market.add.specHint": "The same thing you would put after `dsh plugin add`: a package name (optional @version), a git URL, a tarball, or an absolute local path.",
3120
+ "panels.market.add.exampleTitle": "Examples",
3121
+ "panels.market.add.exampleFill": "Fill in an example",
3122
+ "panels.market.add.registryLabel": "Source",
3123
+ "panels.market.add.registryProfile": "This profile's registry",
3124
+ "panels.market.add.registryPnpm": "pnpm's own registry",
3125
+ "panels.market.add.check": "Check",
3126
+ "panels.market.add.checking": "Checking…",
3127
+ "panels.market.add.classifying": "Checking…",
3128
+ "panels.market.add.change": "Edit",
3129
+ "panels.market.add.previewTitle": "About to install",
3130
+ "panels.market.add.fieldName": "Package",
3131
+ "panels.market.add.fieldVersion": "Version",
3132
+ "panels.market.add.fieldDescription": "Description",
3133
+ "panels.market.add.fieldSource": "Source",
3134
+ "panels.market.add.install": "Install",
3135
+ "panels.market.add.installing": "Installing…",
3136
+ "panels.market.add.cancel": "Cancel install",
3137
+ "panels.market.add.close": "Close",
3138
+ "panels.market.add.retry": "Retry",
3139
+ "panels.market.add.changeSource": "Change source",
3140
+ "panels.market.add.approveBuilds": "Allow these scripts and retry",
3141
+ "panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
3142
+ "panels.market.add.doneApplied": "Installed and live.",
3143
+ "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
3144
+ "panels.market.add.restartWhy": "Why this needs a restart: {reason}",
3145
+ "panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
3146
+ "panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
3147
+ "panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
3148
+ "panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
3149
+ "panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
3150
+ "panels.market.add.cancelled": "Cancelled.",
3151
+ "panels.market.add.failed": "Didn't work: {reason}",
3152
+ "panels.market.add.removed": "It has been removed.",
3153
+ "panels.market.add.supplyPending": "Its plugins install after you restart.",
3154
+ "panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
3155
+ "panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
3156
+ "panels.market.add.removedRestart": "Removed — restart once to finish.",
3157
+ "panels.market.add.remove": "Remove it",
3158
+ "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
3159
+ "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
3160
+ "panels.market.add.problem.notFound": "No such package on that source.",
3161
+ "panels.market.add.problem.notAPackage": "There is no package at that location.",
3162
+ "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
3163
+ "panels.market.add.problem.network": "The source is unreachable.",
3164
+ "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
3165
+ "panels.market.add.reason.invalidSpec": "the spec is not accepted",
3166
+ "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
3167
+ "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
3168
+ "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
3169
+ "panels.market.add.reason.bundleInUse": "something is still using it",
3170
+ "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
3171
+ "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
3172
+ "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
3173
+ "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
3174
+ "panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
3175
+ "panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
3176
+ "panels.market.add.reason.diskFull": "the disk is full",
3177
+ "panels.market.add.reason.permission": "no permission to write",
3178
+ "panels.market.add.reason.integrity": "the download failed its integrity check",
3179
+ "panels.market.add.reason.timeout": "no output for too long, so it was stopped",
3180
+ "panels.market.add.reason.network": "the network is unreachable",
3181
+ "panels.market.add.reason.notFound": "no such package on the source",
3182
+ "panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
3183
+ "blocker.fix.install": "Install for me",
3184
+ "blocker.fix.update": "Upgrade for me",
3185
+ "blocker.fix.running": "Running…",
3186
+ "blocker.fix.failed": "Failed: ",
3187
+ "blocker.retry": "Retry",
3188
+ "blocker.retry.running": "Retrying…",
3189
+ "blocker.copy": "Copy command",
3190
+ "blocker.market.open": "Open the module market",
3191
+ "blocker.login.title": "Sign in to {platform}",
3192
+ "blocker.login.titleGeneric": "Sign-in required",
3193
+ "blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
3194
+ "blocker.login.go": "Go sign in",
3195
+ "blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
3196
+ "blocker.forbidden.title": "No access to {platform}",
3197
+ "blocker.forbidden.titleGeneric": "No access",
3198
+ "blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
3199
+ "blocker.forbidden.open": "Open permissions page",
3200
+ "blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
3201
+ "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
3202
+ "blocker.unknown.title": "Something went wrong",
3203
+ "panels.reading": "Reading the panel setup…",
3204
+ "panels.cardBroken": "This module will not render: {unit} ({reason})",
3205
+ "panels.cardRetry": "Retry",
3206
+ "panels.empty": "No modules on the panel yet",
3207
+ "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
3208
+ "env.title": "Preparing the workbench",
3209
+ "env.checking": "Checking the runtime environment…",
3210
+ "env.installing": "Installing the missing dependency…",
3211
+ "env.failed": "One step away",
3212
+ "env.elapsed": "Waiting {seconds}s",
3213
+ "env.stepFailed.install": "install failed",
3214
+ "env.stepFailed.path": "installed but not found",
3215
+ "env.stepFailed.shell": "no shell channel",
3216
+ "env.bridge.ok": "Connected",
3217
+ "env.bridge.short": "Not connected",
3218
+ "env.bridge.why": "Panel data goes through the login state in your browser: with this channel down, modules cannot fetch data. It does not block startup, but fix it first.",
3219
+ "env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
3220
+ "env.bridge.extension": "The browser extension is not connected. Install it once from the Chrome Web Store (then hit Retry here). If it is already installed, run the command below first.",
3221
+ "env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
3222
+ "env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
3223
+ "env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
3224
+ "env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
3225
+ "env.fix.title": "How to fix it",
3226
+ "env.fix.why": "The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.",
3227
+ "env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
3228
+ "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
3229
+ "env.fix.step": "Run this in a terminal, then hit Retry:",
3230
+ "env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
3231
+ "env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
3232
+ "env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
3233
+ "env.fix.network": "Network unreachable: check your network or proxy, then retry.",
3234
+ "env.fix.details": "Details (for troubleshooting)",
3235
+ "env.retry": "Retry",
3236
+ "env.copyCommand": "Copy command",
3237
+ "env.copied": "Copied",
3238
+ "env.step.opencli": "Checking the workbench opencli",
3239
+ "env.step.codingPlugin": "Checking the coding plugin",
3240
+ "env.step.bridge": "Checking the browser bridge",
3241
+ "env.step.warm": "Warming up site sessions",
3242
+ "env.warm.done": "{n} site(s) warmed up",
3243
+ "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
3244
+ "env.unit.failed": "This module cannot start",
3245
+ "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
3246
+ "env.unit.missingPlugin": "This module is not ready yet",
3247
+ "env.unit.missingCommandsHint": "Updating it should fix this.",
3248
+ "env.unit.unchecked": "Cannot check: no shell channel",
3249
+ "env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
3250
+ "env.unit.missingCommands": "This module is out of date",
3251
+ "env.unit.hint": "Retry after installing; other modules are unaffected.",
3252
+ "rightbar.label": "Data panels",
3253
+ "rightbar.expand": "Expand the data panel",
3254
+ "rightbar.collapse": "Collapse the data panel",
3255
+ "rightbar.column.label": "Right column",
3256
+ "rightbar.column.workbench": "Workbench panel",
3257
+ "rightbar.column.dsh": "dsh panel",
3258
+ "rightbar.refresh": "Refresh",
3259
+ "rightbar.refreshing": "Refreshing…",
3260
+ "rightbar.updatedAt": "updated {time}",
3261
+ "rightbar.noProject": "The current session has no workspace",
3262
+ "rightbar.openPlatform": "Open on the platform",
3263
+ "coding.notARepo.title": "This workspace is not a Coding repository",
3264
+ "error.unknown": "Something went wrong",
3265
+ "board.title": "Workbench panel",
3266
+ "panel.conversation": "Conversation",
3267
+ "panels.label": "Global panels",
3268
+ "configSync.nav": "Config sync",
3269
+ "configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
3270
+ "configSync.source": "Source",
3271
+ "configSync.sourceBroken": "its config is unreadable",
3272
+ "configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
3273
+ "configSync.sourceDead": "unreadable",
3274
+ "configSync.refresh": "Read again",
3275
+ "configSync.loading": "Reading the source config…",
3276
+ "configSync.readHint": "Pick another source, or read again.",
3277
+ "configSync.tag.new": "New",
3278
+ "configSync.tag.differs": "Differs",
3279
+ "configSync.conflictNote": "Applying replaces this workbench copy with the source",
3280
+ "configSync.code.lang": "yaml",
3281
+ "configSync.code.copy": "Copy",
3282
+ "configSync.code.copied": "Copied",
3283
+ "configSync.code.wrap": "Wrap lines",
3284
+ "configSync.code.unwrap": "No wrap",
3285
+ "configSync.code.collapse": "Collapse",
3286
+ "configSync.code.collapseAria": "Collapse this row",
3287
+ "configSync.code.expandAria": "Expand the diff ({count} more lines)",
3288
+ "configSync.code.expand": "Show {count} more lines",
3289
+ "configSync.missing": "{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market",
3290
+ "configSync.apply": "Sync {count} selected",
3291
+ "configSync.applyNone": "Pick some rows first",
3292
+ "configSync.applying": "Writing…",
3293
+ "configSync.applied": "Written to the workbench config · applied",
3294
+ "configSync.appliedIds": "Written this time: {ids}",
3295
+ "configSync.skippedIds": "Left alone (already here): {ids}",
3296
+ "configSync.nothing": "Nothing to sync",
3297
+ "configSync.unreadable": "Cannot read {path}: {reason}",
3298
+ "configSync.noSource": "This machine has no other profile to sync from",
3299
+ "configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
3300
+ "configSync.failed": "The sync did not go through; try again.",
3301
+ "debug.workspace": "this workspace",
3302
+ "debug.status": "Debugging “{title}”",
3303
+ "debug.status.trouble": "Debugging needs your attention ({title})",
3304
+ "debug.stalled": "Debugging paused ({title})",
3305
+ "debug.act.pause": "Pause debugging",
3306
+ "debug.act.resume": "Resume debugging",
3307
+ "debug.act.stop": "Stop debugging",
3308
+ "debug.act.stop.ask": "Confirm stop",
3309
+ "debug.card.here.title": "Debugging “{title}”",
3310
+ "debug.card.here.note": "Do not switch workspaces or touch the panel",
3311
+ "debug.card.away.note": "Switch back to “{title}”",
3312
+ "debug.card.paused.note": "Paused",
3313
+ "debug.card.hidden.note": "Switch back to the Workbench panel",
3314
+ "record.waiting": "Recording handoff · your turn",
3315
+ "record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
3316
+ "record.recording": "Recording",
3317
+ "record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
3318
+ "record.recording.shots": "; to keep a shot of this moment press \"Screenshot\" on the bar ({n} taken)",
3319
+ "record.finished": "Recording finished",
3320
+ "record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
3321
+ "record.act.cancel": "Cancel",
3322
+ "record.act.halt": "Halt",
3323
+ "approval.record.site": "Site",
3324
+ "approval.record.what": "Records",
3325
+ "approval.record.lands": "Lands in",
3326
+ "approval.record.noUrl": "no site given (this call gets refused)",
3327
+ "approval.record.oneAction": "one action",
3328
+ "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
3329
+ "approval.longTask.what": "Stops",
3330
+ "approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
3331
+ }
3471
3332
  };
3472
3333
  //#endregion
3473
3334
  //#region ../shared/dist/i18n/merge.js
@@ -3564,18 +3425,6 @@ window.__ModuleLoader__.load({
3564
3425
  return target.startsWith(base);
3565
3426
  }
3566
3427
  /**
3567
- * 把一次探针读数归成椅面归属。
3568
- * @param probe - 探针读数。
3569
- * @param workshop - 当前工作区根路径;`null` 表示还不知道当前是哪个工作区。
3570
- * @returns 外壳不在、或板路径与工作区缺一 → `unknown`;右栏没开或没画出来 → `hidden`;板在本工作区 → `workshop`,否则 `other`。
3571
- */
3572
- function boardFactOf(probe, workshop) {
3573
- if (!probe.workbench) return "unknown";
3574
- if (!probe.bar || !probe.open || !probe.drawn) return "hidden";
3575
- if (probe.board === "" || workshop === null) return "unknown";
3576
- return insideWorkshop(workshop, probe.board) ? "workshop" : "other";
3577
- }
3578
- /**
3579
3428
  * 把探针读数归成左栏那句人话的档位。
3580
3429
  * @param probe - 探针读数。
3581
3430
  * @param workshop - 当前工作区根路径;`null` 一律 `unknown`。
@@ -3614,492 +3463,7 @@ window.__ModuleLoader__.load({
3614
3463
  };
3615
3464
  }
3616
3465
  //#endregion
3617
- //#region ../shared/dist/lib/diy-debug.js
3618
- /**
3619
- * 把工具入参收成人话动作。
3620
- * @param value - 任意入参值。
3621
- * @returns `'pause'` / `'resume'` / `'stop'` 原样;别的值(含 `undefined`、多余空白、大小写不同)给 `null`,由调用方拒。
3622
- */
3623
- function parseDebugIntent(value) {
3624
- return value === "pause" || value === "resume" || value === "stop" ? value : null;
3625
- }
3626
- /**
3627
- * 调试约定的有效期(4 小时,毫秒):超过它没动静的约定算过期、当场让人。
3628
- */
3629
- var DEBUG_STALE_MS = 144e5;
3630
- function alive$1(state, now) {
3631
- if (state === null) return null;
3632
- return now - state.at <= 144e5 ? state : null;
3633
- }
3634
- function ownerOf$1(state, sessionId, now) {
3635
- const held = alive$1(state, now);
3636
- if (held === null) return "none";
3637
- return held.sessionId === sessionId ? held : "not-owner";
3638
- }
3639
- /**
3640
- * 造一份新的调试约定存储(进程内存,同一时刻只可能有一份有效约定)。
3641
- * @returns 存取口;动作成不成都在返回的 `DebugMove` 里,不抛异常。
3642
- */
3643
- function createDebugStore() {
3644
- let held = null;
3645
- const live = (now) => alive$1(held, now);
3646
- return {
3647
- live,
3648
- begin(pact) {
3649
- const current = alive$1(held, pact.now);
3650
- if (current !== null) return {
3651
- ok: false,
3652
- code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
3653
- };
3654
- const state = {
3655
- phase: "debugging",
3656
- sessionId: pact.sessionId,
3657
- workspacePath: pact.workspacePath,
3658
- title: pact.title,
3659
- board: pact.board,
3660
- unit: pact.unit,
3661
- name: pact.name,
3662
- startedAt: pact.now,
3663
- at: pact.now
3664
- };
3665
- held = state;
3666
- return {
3667
- ok: true,
3668
- state
3669
- };
3670
- },
3671
- pause(sessionId, now) {
3672
- const found = ownerOf$1(held, sessionId, now);
3673
- if (typeof found === "string") return {
3674
- ok: false,
3675
- code: found
3676
- };
3677
- if (found.phase === "paused") return {
3678
- ok: false,
3679
- code: "already-paused"
3680
- };
3681
- const state = {
3682
- ...found,
3683
- phase: "paused",
3684
- at: now
3685
- };
3686
- held = state;
3687
- return {
3688
- ok: true,
3689
- state
3690
- };
3691
- },
3692
- resume(sessionId, now) {
3693
- const found = ownerOf$1(held, sessionId, now);
3694
- if (typeof found === "string") return {
3695
- ok: false,
3696
- code: found
3697
- };
3698
- if (found.phase === "debugging") return {
3699
- ok: false,
3700
- code: "already-debugging"
3701
- };
3702
- const state = {
3703
- ...found,
3704
- phase: "debugging",
3705
- at: now
3706
- };
3707
- held = state;
3708
- return {
3709
- ok: true,
3710
- state
3711
- };
3712
- },
3713
- stop(sessionId, now) {
3714
- const found = ownerOf$1(held, sessionId, now);
3715
- if (typeof found === "string") return {
3716
- ok: false,
3717
- code: found
3718
- };
3719
- held = null;
3720
- return {
3721
- ok: true,
3722
- state: found
3723
- };
3724
- }
3725
- };
3726
- }
3727
- /**
3728
- * 「谁还占着」的一句话,用于别人来抢时说清现况。
3729
- * @param state - 当前有效的那份约定。
3730
- * @returns 形如「会话 x(自 HH:mm:ssZ 起在调试 y)」的中文串。
3731
- */
3732
- function debugOwnerText(state) {
3733
- return `会话 ${state.sessionId}(自 ${new Date(state.startedAt).toISOString().slice(11, 19)}Z 起在调试 ${state.unit})`;
3734
- }
3735
- //#endregion
3736
- //#region ../shared/dist/lib/diy-record.js
3737
- /**
3738
- * 录制约定的有效期(15 分钟,毫秒):超过它没动静的约定算过期、当场让人。
3739
- */
3740
- var RECORD_STALE_MS = 9e5;
3741
- /**
3742
- * 把工具入参收成人话动作。
3743
- * @param raw - 任意入参值。
3744
- * @returns `'peek'` / `'halt'` / `'stop'` 原样;别的值(含 `undefined`、多余空白)给 `null`,由调用方拒。
3745
- */
3746
- function parseRecordIntent(raw) {
3747
- return raw === "peek" || raw === "halt" || raw === "stop" ? raw : null;
3748
- }
3749
- function alive(state, now) {
3750
- if (state === null) return null;
3751
- return now - state.at <= 9e5 ? state : null;
3752
- }
3753
- function ownerOf(state, sessionId, now) {
3754
- const held = alive(state, now);
3755
- if (held === null) return "none";
3756
- return held.sessionId === sessionId ? held : "not-owner";
3757
- }
3758
- /**
3759
- * 造一份新的录制约定存储(进程内存,同一时刻只可能有一份有效约定)。
3760
- * @returns 存取口;动作成不成都在返回的 `RecordMove` 里,不抛异常。
3761
- */
3762
- function createRecordStore() {
3763
- let held = null;
3764
- const live = (now) => alive(held, now);
3765
- return {
3766
- live,
3767
- begin(pact) {
3768
- const current = alive(held, pact.now);
3769
- if (current !== null) return {
3770
- ok: false,
3771
- code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
3772
- };
3773
- const state = {
3774
- phase: "armed",
3775
- sessionId: pact.sessionId,
3776
- workspace: pact.workspace,
3777
- unit: pact.unit,
3778
- name: pact.name,
3779
- url: pact.url,
3780
- title: pact.title,
3781
- action: pact.action,
3782
- expect: pact.expect,
3783
- captureFile: pact.captureFile,
3784
- startedAt: pact.now,
3785
- t0: null,
3786
- t1: null,
3787
- at: pact.now
3788
- };
3789
- held = state;
3790
- return {
3791
- ok: true,
3792
- state
3793
- };
3794
- },
3795
- started(sessionId, at, now) {
3796
- const found = ownerOf(held, sessionId, now);
3797
- if (typeof found === "string") return {
3798
- ok: false,
3799
- code: found
3800
- };
3801
- if (found.phase === "recording") return {
3802
- ok: false,
3803
- code: "already-recording"
3804
- };
3805
- if (found.phase !== "armed") return {
3806
- ok: false,
3807
- code: "not-armed"
3808
- };
3809
- const state = {
3810
- ...found,
3811
- phase: "recording",
3812
- t0: at,
3813
- at: now
3814
- };
3815
- held = state;
3816
- return {
3817
- ok: true,
3818
- state
3819
- };
3820
- },
3821
- finished(sessionId, at, now) {
3822
- const found = ownerOf(held, sessionId, now);
3823
- if (typeof found === "string") return {
3824
- ok: false,
3825
- code: found
3826
- };
3827
- if (found.phase !== "recording") return {
3828
- ok: false,
3829
- code: "not-recording"
3830
- };
3831
- const state = {
3832
- ...found,
3833
- phase: "finished",
3834
- t1: at,
3835
- at: now
3836
- };
3837
- held = state;
3838
- return {
3839
- ok: true,
3840
- state
3841
- };
3842
- },
3843
- stop(sessionId, now) {
3844
- const found = ownerOf(held, sessionId, now);
3845
- if (typeof found === "string") return {
3846
- ok: false,
3847
- code: found
3848
- };
3849
- held = null;
3850
- return {
3851
- ok: true,
3852
- state: found
3853
- };
3854
- }
3855
- };
3856
- }
3857
- /**
3858
- * 「谁还占着、在录哪个动作」的一句话,用于别人来抢时说清现况。
3859
- * @param state - 当前有效的那份约定。
3860
- * @returns 形如「会话 x(自 HH:mm:ssZ 起在录 y 的「动作」)」的中文串。
3861
- */
3862
- function recordOwnerText(state) {
3863
- const at = new Date(state.startedAt).toISOString().slice(11, 19);
3864
- return `会话 ${state.sessionId}(自 ${at}Z 起在录 ${state.unit} 的「${state.action}」)`;
3865
- }
3866
- /**
3867
- * 同一原因的连续崩溃算进同一次计数的窗口(10 分钟,毫秒)。
3868
- */
3869
- var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
3870
- /**
3871
- * 上报文本字段的截断长度(2000 字符;workspace / reason / message 共用)。
3872
- */
3873
- var PANEL_STATE_MAX_TEXT = 2e3;
3874
- var PHASES = [
3875
- "idle",
3876
- "loading",
3877
- "ready",
3878
- "error"
3879
- ];
3880
- function asRecord(value) {
3881
- return typeof value === "object" && value !== null ? value : void 0;
3882
- }
3883
- function textOf$1(value, max) {
3884
- if (typeof value !== "string") return "";
3885
- const trimmed = value.trim();
3886
- return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
3887
- }
3888
- function atOf(value) {
3889
- if (typeof value !== "number" || !Number.isFinite(value)) return null;
3890
- if (value < 0) return null;
3891
- return Math.trunc(value);
3892
- }
3893
- function errorOf(raw) {
3894
- const record = asRecord(raw);
3895
- if (record === void 0) return void 0;
3896
- const code = textOf$1(record["code"], 120);
3897
- const message = textOf$1(record["message"], PANEL_STATE_MAX_TEXT);
3898
- if (code === "" && message === "") return void 0;
3899
- return {
3900
- code: code === "" ? "unknown" : code,
3901
- message
3902
- };
3903
- }
3904
- /**
3905
- * 收一批卡片读数上报。
3906
- * @param payload - `POST` 的请求体。
3907
- * @returns 至少收到一条能认的卡片才 `ok: true`;请求体不是对象、`workspace` 为空、`cards` 不是数组,
3908
- * 或一条都认不出(`unit` / `route` / `phase` / `at` 缺一)时 `ok: false` + 中文原因;认不出的单条静默跳过。
3909
- */
3910
- function parseCardsReport(payload) {
3911
- const record = asRecord(payload);
3912
- if (record === void 0) return {
3913
- ok: false,
3914
- message: "请求体要是一个对象"
3915
- };
3916
- const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
3917
- if (workspace === "") return {
3918
- ok: false,
3919
- message: "workspace 不能是空的 —— 面板按工作区存"
3920
- };
3921
- const raw = record["cards"];
3922
- if (!Array.isArray(raw)) return {
3923
- ok: false,
3924
- message: "cards 要是一个数组"
3925
- };
3926
- const cards = [];
3927
- for (const item of raw.slice(0, 32)) {
3928
- const card = asRecord(item);
3929
- if (card === void 0) continue;
3930
- const unit = textOf$1(card["unit"], 200);
3931
- const route = textOf$1(card["route"], 400);
3932
- const phase = textOf$1(card["phase"], 20);
3933
- const at = atOf(card["at"]);
3934
- if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
3935
- const error = errorOf(card["error"]);
3936
- cards.push({
3937
- unit,
3938
- route,
3939
- phase,
3940
- at,
3941
- ...error === void 0 ? {} : { error }
3942
- });
3943
- }
3944
- if (cards.length === 0) return {
3945
- ok: false,
3946
- message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
3947
- };
3948
- return {
3949
- ok: true,
3950
- value: {
3951
- workspace,
3952
- cards
3953
- }
3954
- };
3955
- }
3956
- /**
3957
- * 收一次卡片崩溃上报。
3958
- * @param payload - `POST` 的请求体。
3959
- * @returns `workspace` / `unit` / `reason` 都不能空,缺一给 `ok: false` + 中文原因;`at` 缺省或不合法时取当前时间。
3960
- */
3961
- function parseCrashReport(payload) {
3962
- const record = asRecord(payload);
3963
- if (record === void 0) return {
3964
- ok: false,
3965
- message: "请求体要是一个对象"
3966
- };
3967
- const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
3968
- const unit = textOf$1(record["unit"], 200);
3969
- const reason = textOf$1(record["reason"], PANEL_STATE_MAX_TEXT);
3970
- if (workspace === "") return {
3971
- ok: false,
3972
- message: "workspace 不能是空的"
3973
- };
3974
- if (unit === "") return {
3975
- ok: false,
3976
- message: "unit 不能是空的"
3977
- };
3978
- if (reason === "") return {
3979
- ok: false,
3980
- message: "reason 不能是空的(没有原因的崩溃没法查)"
3981
- };
3982
- return {
3983
- ok: true,
3984
- value: {
3985
- workspace,
3986
- unit,
3987
- reason,
3988
- at: atOf(record["at"]) ?? Date.now()
3989
- }
3990
- };
3991
- }
3992
- /**
3993
- * 造一份面板运行态的留存(进程内存、按工作区分桶,带上面那几条上限的 LRU)。
3994
- * @returns 留存口:`cards` / `crash` 收上报,`snapshot(workspace)` 取全量;没存过的工作区(含 `null`)给一份空的。
3995
- */
3996
- function createPanelStateStore() {
3997
- const workspaces = /* @__PURE__ */ new Map();
3998
- function trim(entry, max) {
3999
- while (entry.size > max) {
4000
- const oldest = entry.keys().next();
4001
- if (oldest.done === true) return;
4002
- entry.delete(oldest.value);
4003
- }
4004
- }
4005
- function workspaceEntryOf(workspace) {
4006
- const existing = workspaces.get(workspace);
4007
- if (existing !== void 0) return existing;
4008
- const created = {
4009
- at: 0,
4010
- units: /* @__PURE__ */ new Map()
4011
- };
4012
- workspaces.set(workspace, created);
4013
- trim(workspaces, 64);
4014
- return created;
4015
- }
4016
- function unitEntryOf(entry, unit) {
4017
- const existing = entry.units.get(unit);
4018
- if (existing !== void 0) return existing;
4019
- const created = {
4020
- at: 0,
4021
- cards: /* @__PURE__ */ new Map()
4022
- };
4023
- entry.units.set(unit, created);
4024
- return created;
4025
- }
4026
- return {
4027
- cards(report) {
4028
- const entry = workspaceEntryOf(report.workspace);
4029
- for (const card of report.cards) {
4030
- const unit = unitEntryOf(entry, card.unit);
4031
- unit.cards.delete(card.route);
4032
- unit.cards.set(card.route, card);
4033
- trim(unit.cards, 12);
4034
- if (card.at > unit.at) unit.at = card.at;
4035
- if (card.at > entry.at) entry.at = card.at;
4036
- }
4037
- },
4038
- crash(report) {
4039
- const entry = workspaceEntryOf(report.workspace);
4040
- const unit = unitEntryOf(entry, report.unit);
4041
- const previous = unit.crash;
4042
- const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
4043
- unit.crash = {
4044
- unit: report.unit,
4045
- reason: report.reason,
4046
- at: report.at,
4047
- count: counted ? previous.count + 1 : 1
4048
- };
4049
- if (report.at > unit.at) unit.at = report.at;
4050
- if (report.at > entry.at) entry.at = report.at;
4051
- },
4052
- snapshot(workspace) {
4053
- if (workspace === null) return {
4054
- workspace: null,
4055
- at: 0,
4056
- units: []
4057
- };
4058
- const entry = workspaces.get(workspace);
4059
- if (entry === void 0) return {
4060
- workspace,
4061
- at: 0,
4062
- units: []
4063
- };
4064
- const units = [...entry.units.entries()].map(([unit, one]) => {
4065
- const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
4066
- const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
4067
- return {
4068
- unit,
4069
- at: one.at,
4070
- okAt,
4071
- cards,
4072
- ...one.crash === void 0 ? {} : { crash: one.crash }
4073
- };
4074
- });
4075
- units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
4076
- return {
4077
- workspace,
4078
- at: entry.at,
4079
- units
4080
- };
4081
- }
4082
- };
4083
- }
4084
- //#endregion
4085
3466
  //#region ../shared/dist/lib/text.js
4086
- /**
4087
- * 把一个值裹成 shell 里的单引号字面量(值里的单引号一并转义),保证元字符按字面量传递。
4088
- * @param value - 任意值;不是字符串的先 `String()`。
4089
- * @returns 可安全拼进 `/bin/sh -c` 的一段文本 —— 含空格 / `$()` / `;` / 通配符的值都不会被当成语法。
4090
- */
4091
- function quoteShellArg(value) {
4092
- return `'${String(value).replace(/'/g, `'\\''`)}'`;
4093
- }
4094
- /**
4095
- * 取一段文本的末尾若干行(如命令输出),顺带去掉首尾空白。
4096
- * @param text - 原文;`null` / `undefined` 当空串。
4097
- * @param lines - 最多留几行,默认 6;0 给全篇、负数从开头砍掉那么多行(都是 `slice` 语义),调用方传正数。
4098
- * @returns 末尾若干行、去首尾空行后的文本;原文行数不够就全给,空输入给空串。
4099
- */
4100
- function tailLines(text, lines = 6) {
4101
- return String(text ?? "").trim().split("\n").slice(-lines).join("\n");
4102
- }
4103
3467
  function candidateStarts(raw) {
4104
3468
  const starts = [];
4105
3469
  for (let index = 0; index < raw.length; index += 1) {
@@ -4153,198 +3517,6 @@ window.__ModuleLoader__.load({
4153
3517
  return `${flat.slice(0, limit).trimEnd()}…`;
4154
3518
  }
4155
3519
  //#endregion
4156
- //#region ../shared/dist/index.js
4157
- var dist_exports = /* @__PURE__ */ __exportAll({
4158
- ACTIONS_PREFIX: () => ACTIONS_PREFIX,
4159
- API_PREFIX: () => API_PREFIX,
4160
- ActivityAction: () => ActivityAction,
4161
- ActivityBlock: () => ActivityBlock,
4162
- ActivityLine: () => ActivityLine,
4163
- ApprovalDetail: () => ApprovalDetail,
4164
- ApprovalPlan: () => ApprovalPlan,
4165
- CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
4166
- CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
4167
- Card: () => Card,
4168
- CardAnchor: () => CardAnchor,
4169
- CardBoundary: () => CardBoundary,
4170
- CardHead: () => CardHead,
4171
- CenteredState: () => CenteredState,
4172
- ChoiceGroup: () => ChoiceGroup,
4173
- Component: () => Component,
4174
- DEBUG_STALE_MS: () => DEBUG_STALE_MS,
4175
- DECLARATION_KEYS: () => DECLARATION_KEYS,
4176
- DECLARATION_REQUIRED_KEYS: () => DECLARATION_REQUIRED_KEYS,
4177
- DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
4178
- DIY_DEBUG_ACT_PATH: () => DIY_DEBUG_ACT_PATH,
4179
- DIY_DEBUG_PATH: () => DIY_DEBUG_PATH,
4180
- DIY_DEBUG_SERVICE: () => DIY_DEBUG_SERVICE,
4181
- DIY_RECORD_ACT_PATH: () => DIY_RECORD_ACT_PATH,
4182
- DIY_RECORD_PATH: () => DIY_RECORD_PATH,
4183
- DIY_RECORD_SERVICE: () => DIY_RECORD_SERVICE,
4184
- EVENTS_PATH: () => EVENTS_PATH,
4185
- EmptyState: () => EmptyState,
4186
- FACT_SCOPE_SUFFIX: () => "*",
4187
- Field: () => Field,
4188
- Form: () => Form,
4189
- FormActions: () => FormActions,
4190
- FormRow: () => FormRow,
4191
- FormRows: () => FormRows,
4192
- Fragment: () => Fragment,
4193
- GIT_TIMEOUT_MS: () => GIT_TIMEOUT_MS,
4194
- HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
4195
- INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
4196
- IconBrandMark: () => IconBrandMark,
4197
- IconConversation: () => IconConversation,
4198
- IconModuleMark: () => IconModuleMark,
4199
- IconModules: () => IconModules,
4200
- IconNpm: () => IconNpm,
4201
- IconOpencli: () => IconOpencli,
4202
- IconPanelScreen: () => IconPanelScreen,
4203
- LOCALES: () => LOCALES,
4204
- LOCALE_NS: () => LOCALE_NS,
4205
- LONG_TASK_IDLE_MS: () => LONG_TASK_IDLE_MS,
4206
- LONG_TASK_POLL_MS: () => LONG_TASK_POLL_MS,
4207
- Link: () => Link,
4208
- LongTaskRow: () => LongTaskRow,
4209
- MIN_BUSY_MS: () => 500,
4210
- Note: () => Note,
4211
- OPENCLI_MAX_CONCURRENT: () => 4,
4212
- OPENCLI_PIN: () => OPENCLI_PIN,
4213
- OPENCLI_TIMEOUT_MS: () => OPENCLI_TIMEOUT_MS,
4214
- PANELS_SERVICE: () => PANELS_SERVICE,
4215
- PANEL_LIST_LIMIT: () => 50,
4216
- PANEL_POLL_MS: () => PANEL_POLL_MS,
4217
- PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
4218
- PANEL_STATE_MAX_CARDS: () => 12,
4219
- PANEL_STATE_MAX_REPORTS: () => 32,
4220
- PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
4221
- PANEL_STATE_MAX_UNITS: () => 64,
4222
- PANEL_STATE_PATH: () => PANEL_STATE_PATH,
4223
- PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
4224
- PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
4225
- PLUGIN_ID: () => PLUGIN_ID,
4226
- PREFS_PREFIX: () => PREFS_PREFIX,
4227
- PROBE_TTL_MS: () => PROBE_TTL_MS,
4228
- PROVISION_PREFIX: () => PROVISION_PREFIX,
4229
- RECORD_STALE_MS: () => RECORD_STALE_MS,
4230
- RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
4231
- RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
4232
- Row: () => Row,
4233
- Rows: () => Rows,
4234
- SESSION_PROJECTIONS_SERVICE: () => SESSION_PROJECTIONS_SERVICE,
4235
- STORAGE_KEY_PROJECT: () => STORAGE_KEY_PROJECT,
4236
- STORAGE_KEY_RIGHTBAR: () => STORAGE_KEY_RIGHTBAR,
4237
- STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
4238
- STORAGE_KEY_RIGHTBAR_WIDTH: () => STORAGE_KEY_RIGHTBAR_WIDTH,
4239
- SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
4240
- SaveBar: () => SaveBar,
4241
- SelectField: () => SelectField,
4242
- SettingsSection: () => SettingsSection,
4243
- SkeletonRows: () => SkeletonRows,
4244
- Spinner: () => Spinner,
4245
- Stack: () => Stack,
4246
- StateBlock: () => StateBlock,
4247
- TextField: () => TextField,
4248
- UNITS_SERVICE: () => UNITS_SERVICE,
4249
- VERSION_CHECK_TIMEOUT_MS: () => VERSION_CHECK_TIMEOUT_MS,
4250
- VERSION_CHECK_TTL_MS: () => VERSION_CHECK_TTL_MS,
4251
- WARM_TIMEOUT_MS: () => WARM_TIMEOUT_MS,
4252
- WORKBENCH_API_VERSION: () => 1,
4253
- apiGet: () => apiGet,
4254
- apiPost: () => apiPost,
4255
- blockerActionLabel: () => blockerActionLabel,
4256
- blockerOfCapability: () => blockerOfCapability,
4257
- blockerOfError: () => blockerOfError,
4258
- blockerPending: () => blockerPending,
4259
- boardFactOf: () => boardFactOf,
4260
- boardSituation: () => boardSituation,
4261
- buildMarker: () => buildMarker,
4262
- cardIdOf: () => cardIdOf,
4263
- createContext: () => createContext,
4264
- createDebugStore: () => createDebugStore,
4265
- createFactChannel: () => createFactChannel,
4266
- createPanelStateStore: () => createPanelStateStore,
4267
- createRecordStore: () => createRecordStore,
4268
- cx: () => cx,
4269
- debugOwnerText: () => debugOwnerText,
4270
- declarationProblemsOf: () => declarationProblemsOf,
4271
- decodeRef: () => decodeRef,
4272
- defaultSelectFilter: () => defaultSelectFilter,
4273
- dictionaries: () => dictionaries,
4274
- duplicateKeysOf: () => duplicateKeysOf,
4275
- en: () => en,
4276
- encodeRef: () => encodeRef,
4277
- errorReasonOf: () => errorReasonOf,
4278
- excerpt: () => excerpt,
4279
- factOfRoute: () => factOfRoute,
4280
- filterSelectOptions: () => filterSelectOptions,
4281
- firstProblemOf: () => firstProblemOf,
4282
- formActionsOf: () => formActionsOf,
4283
- formFirstProblemOf: () => formFirstProblemOf,
4284
- formProblemsOf: () => formProblemsOf,
4285
- formRowsOf: () => formRowsOf,
4286
- formSubmitOf: () => formSubmitOf,
4287
- formValuesOf: () => formValuesOf,
4288
- gateOf: () => gateOf,
4289
- h: () => h,
4290
- hasEnvSupply: () => hasEnvSupply,
4291
- holdBusy: () => holdBusy,
4292
- insideWorkshop: () => insideWorkshop,
4293
- isFactScope: () => isFactScope,
4294
- longTaskDot: () => longTaskDot,
4295
- longTaskPollMs: () => longTaskPollMs,
4296
- longTaskRunsOf: () => longTaskRunsOf,
4297
- markerBody: () => markerBody,
4298
- mergeMessages: () => mergeMessages,
4299
- mergeMessagesSkipping: () => mergeMessagesSkipping,
4300
- parseCardsReport: () => parseCardsReport,
4301
- parseCrashReport: () => parseCrashReport,
4302
- parseDebugIntent: () => parseDebugIntent,
4303
- parseFactFrame: () => parseFactFrame,
4304
- parseJsonLoose: () => parseJsonLoose,
4305
- parseLocalTimestamp: () => parseLocalTimestamp,
4306
- parseMarkers: () => parseMarkers,
4307
- parseRecordIntent: () => parseRecordIntent,
4308
- probeKeyOf: () => probeKeyOf,
4309
- quoteShellArg: () => quoteShellArg,
4310
- readDeclaration: () => readDeclaration,
4311
- readFlag: () => readFlag,
4312
- readText: () => readText,
4313
- recordOwnerText: () => recordOwnerText,
4314
- relativeTime: () => relativeTime,
4315
- relativeTimeAgo: () => relativeTimeAgo,
4316
- relativeTimeBucket: () => relativeTimeBucket,
4317
- relativeTimeCompact: () => relativeTimeCompact,
4318
- reportDuplicateKeys: () => reportDuplicateKeys,
4319
- revealFirstProblem: () => revealFirstProblem,
4320
- runsRouteOf: () => runsRouteOf,
4321
- scopePrefixOf: () => scopePrefixOf,
4322
- searchTextOf: () => searchTextOf,
4323
- selectCursorValue: () => selectCursorValue,
4324
- selectEntries: () => selectEntries,
4325
- selectLoadingNode: () => selectLoadingNode,
4326
- selectTriggerNode: () => selectTriggerNode,
4327
- shortenPath: () => shortenPath,
4328
- splitBlocker: () => splitBlocker,
4329
- stepSelectCursor: () => stepSelectCursor,
4330
- tailLines: () => tailLines,
4331
- unitFactScope: () => unitFactScope,
4332
- useCallback: () => useCallback,
4333
- useContext: () => useContext,
4334
- useEffect: () => useEffect,
4335
- useLayoutEffect: () => useLayoutEffect,
4336
- useMemo: () => useMemo,
4337
- useRef: () => useRef,
4338
- useState: () => useState,
4339
- useSyncExternalStore: () => useSyncExternalStore,
4340
- visibleFieldsOf: () => visibleFieldsOf,
4341
- writeFlag: () => writeFlag,
4342
- writeOutcomeOf: () => writeOutcomeOf,
4343
- writeRoute: () => writeRoute,
4344
- writeText: () => writeText,
4345
- zh: () => zh
4346
- });
4347
- //#endregion
4348
3520
  //#region src/shared/components/Tip.tsx
4349
3521
  /**
4350
3522
  * dsh `Tooltip` 的外壳默认值版:说明统一按右栏习惯(`bottom` / `end` / `gap 6` / 挂 body)来,其余 prop 原样转给 `Tooltip`。
@@ -4517,7 +3689,7 @@ window.__ModuleLoader__.load({
4517
3689
  var CAPABILITY_FACT = "capability";
4518
3690
  var shared = null;
4519
3691
  var current$1 = null;
4520
- var listeners$4 = /* @__PURE__ */ new Set();
3692
+ var listeners$5 = /* @__PURE__ */ new Set();
4521
3693
  /**
4522
3694
  * 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
4523
3695
  */
@@ -4528,9 +3700,9 @@ window.__ModuleLoader__.load({
4528
3700
  * 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
4529
3701
  */
4530
3702
  function subscribeCapabilities(listener) {
4531
- listeners$4.add(listener);
3703
+ listeners$5.add(listener);
4532
3704
  return () => {
4533
- listeners$4.delete(listener);
3705
+ listeners$5.delete(listener);
4534
3706
  };
4535
3707
  }
4536
3708
  /**
@@ -4544,7 +3716,7 @@ window.__ModuleLoader__.load({
4544
3716
  });
4545
3717
  if (next === current$1) return;
4546
3718
  current$1 = next;
4547
- for (const listener of [...listeners$4]) listener();
3719
+ for (const listener of [...listeners$5]) listener();
4548
3720
  }
4549
3721
  /**
4550
3722
  * 一次强探开始:点亮“正在探”;已经在探就跳过。
@@ -4716,7 +3888,7 @@ window.__ModuleLoader__.load({
4716
3888
  //#endregion
4717
3889
  //#region src/app/layouts/panel-hint.ts
4718
3890
  var hints = /* @__PURE__ */ new Map();
4719
- var listeners$3 = /* @__PURE__ */ new Set();
3891
+ var listeners$4 = /* @__PURE__ */ new Set();
4720
3892
  function sameHint(left, right) {
4721
3893
  if (left === null || right === null) return left === right;
4722
3894
  if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
@@ -4728,15 +3900,15 @@ window.__ModuleLoader__.load({
4728
3900
  if (sameHint(hints.get(id) ?? null, hint)) return;
4729
3901
  if (hint === null) hints.delete(id);
4730
3902
  else hints.set(id, hint);
4731
- for (const listener of [...listeners$3]) listener();
3903
+ for (const listener of [...listeners$4]) listener();
4732
3904
  }
4733
3905
  function panelHintOf(id) {
4734
3906
  return id === null ? null : hints.get(id) ?? null;
4735
3907
  }
4736
3908
  function subscribePanelHints(listener) {
4737
- listeners$3.add(listener);
3909
+ listeners$4.add(listener);
4738
3910
  return () => {
4739
- listeners$3.delete(listener);
3911
+ listeners$4.delete(listener);
4740
3912
  };
4741
3913
  }
4742
3914
  function usePanelHint(id) {
@@ -5236,23 +4408,31 @@ window.__ModuleLoader__.load({
5236
4408
  function isRestart(row) {
5237
4409
  return row.state === "inactive" || row.state === "pending-restart";
5238
4410
  }
5239
- function awaitsRestart(input) {
5240
- const loaded = new Set(input.manifests.map((manifest) => manifest.id));
5241
- return (input.installed ?? []).some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
4411
+ function awaitsRestart(manifests, installed) {
4412
+ const loaded = new Set(manifests.map((manifest) => manifest.id));
4413
+ return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
5242
4414
  }
4415
+ /**
4416
+ * 左栏市场入口那枚徽标这一刻该说什么:`problem`(模块异常)> `restart`(重启后生效)> `updates`(有新版本),
4417
+ * 都没有就 `null`。读法与市场页同一份数据、同一套造行函数。
4418
+ * `busy` 里的单元(正被市场自己更新/卸载的那一单元)当它不在名单里:更新是「先卸再装」,
4419
+ * 卸的那一半会让它从名册里消失,不排掉就会在跑的过程中报一次假的「重启后生效」。
4420
+ */
5243
4421
  function marketHintOf(input) {
5244
- const marketable = marketCatalog(input.manifests, input.installable);
4422
+ const busy = input.busy ?? /* @__PURE__ */ new Set();
4423
+ const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
4424
+ const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
5245
4425
  const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
5246
4426
  const listed = new Set(catalog.map((row) => row.id));
5247
4427
  const self = workbenchRow(input.workbench);
5248
4428
  const rows = [
5249
4429
  ...catalog,
5250
- ...installedRows(input.installed ?? [], input.manifests, listed),
4430
+ ...installedRows(installed, input.manifests, listed),
5251
4431
  ...installedPluginRows(input.plugins ?? []),
5252
4432
  ...self === void 0 ? [] : [self]
5253
4433
  ];
5254
4434
  const problem = rows.some(isProblem);
5255
- const restart = rows.some(isRestart) || awaitsRestart(input);
4435
+ const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
5256
4436
  const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
5257
4437
  const more = [];
5258
4438
  if (problem) {
@@ -5279,6 +4459,81 @@ window.__ModuleLoader__.load({
5279
4459
  return null;
5280
4460
  }
5281
4461
  //#endregion
4462
+ //#region src/app/layouts/rightbar/market-busy.ts
4463
+ var listeners$3 = /* @__PURE__ */ new Set();
4464
+ var published = /* @__PURE__ */ new Map();
4465
+ var live$2 = /* @__PURE__ */ new Set();
4466
+ var timer$1;
4467
+ /**
4468
+ * 一条「市场自己正在动它」的事实最多认多久(毫秒):从发布那一刻起算,到点自动撤。
4469
+ * 取的是工作台那一跳同一条窗口 —— 一次替换最长等这么久;正常落地会由发布方先撤掉。
4470
+ */
4471
+ var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
4472
+ /**
4473
+ * 这一刻哪些单元算「正在被动」:发布过、且没到 {@link MARKET_BUSY_MS} 的那些 id。
4474
+ * 给纯函数与判据用;React 里读 {@link useMarketBusy}(同一份,只是走订阅)。
4475
+ */
4476
+ function marketBusyIds() {
4477
+ return live$2;
4478
+ }
4479
+ /**
4480
+ * 发布「哪几个单元正被市场自己动」(每次整体替换):点下去那一刻发,落地/失败后发空数组。
4481
+ * 同一个 id 连续发布不会顺延它的期限;空数组等于全撤。
4482
+ */
4483
+ function publishMarketBusy(ids) {
4484
+ const now = Date.now();
4485
+ const next = /* @__PURE__ */ new Map();
4486
+ for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
4487
+ published = next;
4488
+ refresh(now);
4489
+ }
4490
+ /**
4491
+ * 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
4492
+ */
4493
+ function subscribeMarketBusy(listener) {
4494
+ listeners$3.add(listener);
4495
+ return () => {
4496
+ listeners$3.delete(listener);
4497
+ };
4498
+ }
4499
+ /**
4500
+ * 组件里读「正被市场自己动的单元」:返回的集合在两次通知之间是同一份引用,可以直接进渲染。
4501
+ */
4502
+ function useMarketBusy() {
4503
+ return useSyncExternalStore(subscribeMarketBusy, marketBusyIds);
4504
+ }
4505
+ /**
4506
+ * 把「市场正在动哪个单元」挂到这一拍上:`id` 变了就整体替换发布,`null` 等于撤。
4507
+ * 卸载那一下**不清**(更新还在跑,徽标不该改口);到 {@link MARKET_BUSY_MS} 由自己到期兜底。
4508
+ */
4509
+ function usePublishMarketBusy(id) {
4510
+ useEffect(() => {
4511
+ publishMarketBusy(id === null ? [] : [id]);
4512
+ }, [id]);
4513
+ }
4514
+ function sameSet(left, right) {
4515
+ if (left.size !== right.size) return false;
4516
+ for (const id of left) if (!right.has(id)) return false;
4517
+ return true;
4518
+ }
4519
+ function schedule(now) {
4520
+ if (timer$1 !== void 0) clearTimeout(timer$1);
4521
+ timer$1 = void 0;
4522
+ let soonest = Number.POSITIVE_INFINITY;
4523
+ for (const at of published.values()) soonest = Math.min(soonest, at);
4524
+ if (soonest === Number.POSITIVE_INFINITY) return;
4525
+ timer$1 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
4526
+ }
4527
+ function refresh(now) {
4528
+ for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
4529
+ const next = new Set(published.keys());
4530
+ if (!sameSet(live$2, next)) {
4531
+ live$2 = next;
4532
+ for (const listener of [...listeners$3]) listener();
4533
+ }
4534
+ schedule(now);
4535
+ }
4536
+ //#endregion
5282
4537
  //#region src/shared/hooks/use-host-write.ts
5283
4538
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
5284
4539
  /**
@@ -6213,6 +5468,7 @@ window.__ModuleLoader__.load({
6213
5468
  const removing = removingIdOf(pending, failed);
6214
5469
  const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
6215
5470
  const pinned = pinnedRowOf(pending, steady.held);
5471
+ usePublishMarketBusy(heldIdOf(pending, steady.held));
6216
5472
  const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === heldIdOf(pending, steady.held)) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed);
6217
5473
  const pendingRow = pendingRowOf({
6218
5474
  pending,
@@ -6296,7 +5552,18 @@ window.__ModuleLoader__.load({
6296
5552
  default: return;
6297
5553
  }
6298
5554
  }
6299
- function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
5555
+ var NO_IDS$1 = /* @__PURE__ */ new Set();
5556
+ /**
5557
+ * 把一条会话读成行上要的那几格。
5558
+ * @param summary 会话摘要。
5559
+ * @param statusById 会话状态表。
5560
+ * @param list 会话快照(子代理花名册在这里)。
5561
+ * @param pinnedIds 置顶的那些。
5562
+ * @param archivedIds 归档的那些。
5563
+ * @param longTaskIds 有长任务在跑的那些会话(外壳那条读口按“这趟是谁起的”算出来的);不给就是都没有。
5564
+ * @returns 行模型;`longTask` 为真表示这条会话起的某趟长任务还在跑(它自己那一轮可能早结束了)。
5565
+ */
5566
+ function sessionNode(summary, statusById, list, pinnedIds, archivedIds, longTaskIds = NO_IDS$1) {
6300
5567
  const status = statusById.get(summary.id);
6301
5568
  const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
6302
5569
  let runningSubagentCount = 0;
@@ -6311,6 +5578,7 @@ window.__ModuleLoader__.load({
6311
5578
  blank: summary.blank,
6312
5579
  running: status?.running ?? summary.running,
6313
5580
  runningSubagentCount,
5581
+ longTask: longTaskIds.has(summary.id),
6314
5582
  completed: status?.completionUnread === true,
6315
5583
  pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
6316
5584
  updatedAt: summary.updatedAt,
@@ -6322,6 +5590,10 @@ window.__ModuleLoader__.load({
6322
5590
  state: "ongoing",
6323
5591
  label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
6324
5592
  } : void 0;
5593
+ const longTask = {
5594
+ state: "ongoing",
5595
+ label: t("status.longTask")
5596
+ };
6325
5597
  let pending;
6326
5598
  switch (node.pendingInteraction) {
6327
5599
  case "approval":
@@ -6353,8 +5625,15 @@ window.__ModuleLoader__.load({
6353
5625
  state: "ongoing",
6354
5626
  label: t("status.running")
6355
5627
  };
6356
- return subagents === void 0 ? [primary] : [primary, subagents];
5628
+ const rest = node.longTask ? [longTask] : [];
5629
+ if (subagents === void 0) return [primary, ...rest];
5630
+ return [
5631
+ primary,
5632
+ ...rest,
5633
+ subagents
5634
+ ];
6357
5635
  }
5636
+ if (node.longTask) return subagents === void 0 ? [longTask] : [longTask, subagents];
6358
5637
  if (subagents !== void 0) return [subagents];
6359
5638
  if (node.completed) return [{
6360
5639
  state: "done",
@@ -6415,6 +5694,24 @@ window.__ModuleLoader__.load({
6415
5694
  }
6416
5695
  //#endregion
6417
5696
  //#region src/modules/sessions/model/attention.ts
5697
+ /**
5698
+ * 把外壳那条长任务读口交回的行折成两侧的归属:有会话可归的进 `bySession`(那一行自己亮),
5699
+ * 每一条都按它属于哪个工作区进 `byWorkspace`(没有会话可归的那些只有这一侧看得见)。
5700
+ * @param rows 还在跑的长任务;每行要有它属于哪个工作区,会话那格可以没有。
5701
+ * @returns 两侧的归属;空输入就是两侧都空。
5702
+ */
5703
+ function longTaskPresenceOf(rows) {
5704
+ const bySession = /* @__PURE__ */ new Set();
5705
+ const byWorkspace = /* @__PURE__ */ new Map();
5706
+ for (const row of rows) {
5707
+ if (row.session !== void 0) bySession.add(row.session);
5708
+ byWorkspace.set(row.workspace, (byWorkspace.get(row.workspace) ?? 0) + 1);
5709
+ }
5710
+ return {
5711
+ bySession,
5712
+ byWorkspace
5713
+ };
5714
+ }
6418
5715
  var RANK = {
6419
5716
  warning: 2,
6420
5717
  done: 1,
@@ -6440,10 +5737,10 @@ window.__ModuleLoader__.load({
6440
5737
  done: "project.attention.state.done"
6441
5738
  };
6442
5739
  var NO_IDS = /* @__PURE__ */ new Set();
6443
- function attentionOfSession(summary, statusById, sessions) {
6444
- const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS);
5740
+ function attentionOfSession(summary, statusById, sessions, longTaskIds = NO_IDS) {
5741
+ const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS, longTaskIds);
6445
5742
  if (node.pendingInteraction !== void 0) return "warning";
6446
- if (node.running || node.runningSubagentCount > 0) return "ongoing";
5743
+ if (node.running || node.runningSubagentCount > 0 || node.longTask) return "ongoing";
6447
5744
  if (node.completed) return "done";
6448
5745
  }
6449
5746
  function attentionSessionIdOf(input) {
@@ -6452,7 +5749,7 @@ window.__ModuleLoader__.load({
6452
5749
  let best;
6453
5750
  let bestRank = -1;
6454
5751
  for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
6455
- const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
5752
+ const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
6456
5753
  if (ofSession === void 0) continue;
6457
5754
  const rank = RANK[ofSession];
6458
5755
  if (best === void 0 || rank > bestRank || rank === bestRank && isLater(summary, best)) {
@@ -6476,7 +5773,7 @@ window.__ModuleLoader__.load({
6476
5773
  let tagged;
6477
5774
  let taggedCount = 0;
6478
5775
  for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
6479
- const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
5776
+ const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
6480
5777
  if (ofSession === void 0) continue;
6481
5778
  if (severity === void 0 || RANK[ofSession] > RANK[severity]) {
6482
5779
  severity = ofSession;
@@ -6489,6 +5786,15 @@ window.__ModuleLoader__.load({
6489
5786
  } else if (ofSession === tagged) taggedCount += 1;
6490
5787
  }
6491
5788
  }
5789
+ const longTasks = input.longTasks?.byWorkspace.get(workspace.path) ?? 0;
5790
+ if (severity === void 0 && longTasks > 0) {
5791
+ byWorkspace.set(workspace.workspaceId, {
5792
+ severity: "ongoing",
5793
+ count: longTasks,
5794
+ longTask: true
5795
+ });
5796
+ continue;
5797
+ }
6492
5798
  if (severity === void 0) continue;
6493
5799
  byWorkspace.set(workspace.workspaceId, {
6494
5800
  severity,
@@ -6517,6 +5823,7 @@ window.__ModuleLoader__.load({
6517
5823
  };
6518
5824
  }
6519
5825
  function attentionLabel(attention, t) {
5826
+ if (attention.longTask === true) return t(attention.count === 1 ? "project.attention.longTask.one" : "project.attention.longTask.other", { n: attention.count });
6520
5827
  const keys = SENTENCES[attention.severity];
6521
5828
  return t(attention.count === 1 ? keys.one : keys.other, { n: attention.count });
6522
5829
  }
@@ -7274,7 +6581,8 @@ window.__ModuleLoader__.load({
7274
6581
  modules,
7275
6582
  installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
7276
6583
  plugins,
7277
- workbench
6584
+ workbench,
6585
+ busy: useMarketBusy()
7278
6586
  });
7279
6587
  useEffect(() => {
7280
6588
  publishPanelHint(MARKET_PANEL_ID, hint);
@@ -7882,14 +7190,17 @@ window.__ModuleLoader__.load({
7882
7190
  //#endregion
7883
7191
  //#region src/app/layouts/sidebar/RecordFooterAction.tsx
7884
7192
  function recordFooterView(state, t) {
7885
- if (state.phase === "recording") return {
7886
- label: t("record.recording"),
7887
- note: t("record.recording.note"),
7888
- acts: [{
7889
- intent: "halt",
7890
- label: t("record.act.halt")
7891
- }]
7892
- };
7193
+ if (state.phase === "recording") {
7194
+ const taken = state.shots === void 0 ? 0 : state.shots.length;
7195
+ return {
7196
+ label: t("record.recording"),
7197
+ note: taken === 0 ? t("record.recording.note") : `${t("record.recording.note")}${t("record.recording.shots", { n: taken })}`,
7198
+ acts: [{
7199
+ intent: "halt",
7200
+ label: t("record.act.halt")
7201
+ }]
7202
+ };
7203
+ }
7893
7204
  if (state.phase === "finished") return {
7894
7205
  label: t("record.finished"),
7895
7206
  note: t("record.finished.note"),
@@ -8582,16 +7893,21 @@ window.__ModuleLoader__.load({
8582
7893
  if (step.status === "failed") return "×";
8583
7894
  return "-";
8584
7895
  }
7896
+ /**
7897
+ * 每一拍轮询带什么参数:平时什么都不带(宿主那边跟着正在跑的那一轮,刚跑出 `ready` 的直接回上一次),
7898
+ * 用户按了「重试」之后的那一拍带 `hard=1`(不看新鲜度、一律重来)。首拍不再强探 —— 页面上一次
7899
+ * 刚体检过就不必再跑一轮,两页同时刷新也只有一轮。
7900
+ */
8585
7901
  function createForcePlan() {
8586
- let force = true;
7902
+ let hard = false;
8587
7903
  return {
8588
7904
  next() {
8589
- const current = force;
8590
- force = false;
8591
- return current;
7905
+ const query = hard ? { hard: 1 } : {};
7906
+ hard = false;
7907
+ return query;
8592
7908
  },
8593
7909
  again() {
8594
- force = true;
7910
+ hard = true;
8595
7911
  }
8596
7912
  };
8597
7913
  }
@@ -8793,7 +8109,7 @@ window.__ModuleLoader__.load({
8793
8109
  async function poll() {
8794
8110
  if (cancelled) return;
8795
8111
  if (pinned !== null) return;
8796
- const response = await request("preflight", forcePlan.next() ? { force: 1 } : {}).catch(() => null);
8112
+ const response = await request("preflight", forcePlan.next()).catch(() => null);
8797
8113
  if (cancelled) return;
8798
8114
  if (response === null || !response.ok) {
8799
8115
  close();
@@ -8883,6 +8199,8 @@ window.__ModuleLoader__.load({
8883
8199
  var DIY_RECORD_READ_TOOL = "workbench_diy_record_read";
8884
8200
  var DIY_RECORD_DETAIL_TOOL = "workbench_diy_record_detail";
8885
8201
  var DIY_RECORD_STOP_TOOL = "workbench_diy_record_stop";
8202
+ var LONG_TASKS_LIST_TOOL = "workbench_long_tasks_list";
8203
+ var LONG_TASKS_STOP_TOOL = "workbench_long_tasks_stop";
8886
8204
  var DIY_DEBUG_START_TOOL = "workbench_diy_debug_start";
8887
8205
  var DIY_DEBUG_PAUSE_TOOL = "workbench_diy_debug_pause";
8888
8206
  var DIY_DEBUG_RESUME_TOOL = "workbench_diy_debug_resume";
@@ -8935,7 +8253,9 @@ window.__ModuleLoader__.load({
8935
8253
  DIY_DEBUG_START_TOOL,
8936
8254
  DIY_DEBUG_PAUSE_TOOL,
8937
8255
  DIY_DEBUG_RESUME_TOOL,
8938
- DIY_DEBUG_STOP_TOOL
8256
+ DIY_DEBUG_STOP_TOOL,
8257
+ LONG_TASKS_LIST_TOOL,
8258
+ LONG_TASKS_STOP_TOOL
8939
8259
  ];
8940
8260
  var READ_TOOLS = [
8941
8261
  PANELS_LIST_TOOL,
@@ -8965,7 +8285,8 @@ window.__ModuleLoader__.load({
8965
8285
  DIY_LOGS_STOP_TOOL,
8966
8286
  DIY_RECORD_READ_TOOL,
8967
8287
  DIY_RECORD_DETAIL_TOOL,
8968
- DIY_RECORD_STOP_TOOL
8288
+ DIY_RECORD_STOP_TOOL,
8289
+ LONG_TASKS_LIST_TOOL
8969
8290
  ];
8970
8291
  var WRITE_TOOLS = [
8971
8292
  PANELS_SHOW_TOOL,
@@ -8987,7 +8308,8 @@ window.__ModuleLoader__.load({
8987
8308
  DIY_DEBUG_START_TOOL,
8988
8309
  DIY_DEBUG_PAUSE_TOOL,
8989
8310
  DIY_DEBUG_RESUME_TOOL,
8990
- DIY_DEBUG_STOP_TOOL
8311
+ DIY_DEBUG_STOP_TOOL,
8312
+ LONG_TASKS_STOP_TOOL
8991
8313
  ];
8992
8314
  [...READ_TOOLS.map((name) => ({
8993
8315
  name,
@@ -9024,11 +8346,23 @@ window.__ModuleLoader__.load({
9024
8346
  function shellClaimsApprovalDetail(tool) {
9025
8347
  return ALL_TOOLS.includes(tool);
9026
8348
  }
8349
+ function stopApprovalRows(args, t) {
8350
+ const unit = textOf(args, "unit");
8351
+ const id = textOf(args, "id");
8352
+ return [{
8353
+ label: t("approval.longTask.what"),
8354
+ value: `${unit === "" ? "<unit>" : unit} · ${id === "" ? "<id>" : id}`
8355
+ }];
8356
+ }
9027
8357
  function shellApprovalPlan(input, t) {
9028
8358
  if (input.tool === "workbench_diy_record_prepare") return {
9029
8359
  rows: recordApprovalRows(input.args, t),
9030
8360
  warn: t("approval.record.noSwitch")
9031
8361
  };
8362
+ if (input.tool === "workbench_long_tasks_stop") return {
8363
+ rows: stopApprovalRows(input.args, t),
8364
+ warn: t("approval.longTask.signal")
8365
+ };
9032
8366
  return shellClaimsApprovalDetail(input.tool) ? { rows: [] } : void 0;
9033
8367
  }
9034
8368
  function shellApprovalDetail(input, t) {
@@ -10611,7 +9945,8 @@ window.__ModuleLoader__.load({
10611
9945
  workspace: target,
10612
9946
  sessions: input.sessions,
10613
9947
  statusById: input.statusById,
10614
- archivedIds: input.archivedIds
9948
+ archivedIds: input.archivedIds,
9949
+ longTasks: input.longTasks
10615
9950
  }) ?? firstSessionIdOf(target, input.sessions, input.archivedIds);
10616
9951
  if (picked === null) input.startSession(input.workspaceId);
10617
9952
  else input.openSession(picked);
@@ -10670,6 +10005,24 @@ window.__ModuleLoader__.load({
10670
10005
  }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: 16 })))));
10671
10006
  }
10672
10007
  //#endregion
10008
+ //#region src/shared/hooks/use-shell-long-tasks.ts
10009
+ /**
10010
+ * 左栏那颗 loading 点读的长任务清单:**全进程还在跑的**那些(不分单元、不分工作区,每行带它属于
10011
+ * 哪个工作区、是哪个会话起的)。起 / 走一步 / 收尾宿主都会推一条事实,收到就当场重读;那个定时器
10012
+ * 只是兜底 —— 有在跑的按快档问,都闲着按慢档。
10013
+ * @returns 还在跑的长任务;读数还没回来时是空数组。
10014
+ */
10015
+ function useShellLongTasks() {
10016
+ const [tick, setTick] = useState(0);
10017
+ const runs = useApiResource("long-tasks", {}, tick).value?.runs ?? [];
10018
+ const every = longTaskPollMs(runs.length > 0);
10019
+ useEffect(() => {
10020
+ const timer = setInterval(() => setTick((count) => count + 1), every);
10021
+ return () => clearInterval(timer);
10022
+ }, [every]);
10023
+ return runs;
10024
+ }
10025
+ //#endregion
10673
10026
  //#region src/app/layouts/sidebar/current-workspace.ts
10674
10027
  function resolveCurrentWorkspace(input) {
10675
10028
  const ofSession = workspaceOfSession(input.items, currentSessionId(input.sessions, input.panelActive));
@@ -10679,7 +10032,7 @@ window.__ModuleLoader__.load({
10679
10032
  //#endregion
10680
10033
  //#region src/app/layouts/sidebar/use-attention.ts
10681
10034
  function useSidebarAttention(input) {
10682
- const { items, sessions, statusById, archived, storedId, panelActive } = input;
10035
+ const { items, sessions, statusById, archived, storedId, panelActive, longTasks } = input;
10683
10036
  const archivedIds = useMemo(() => new Set(archived), [archived]);
10684
10037
  const current = resolveCurrentWorkspace({
10685
10038
  items,
@@ -10695,16 +10048,26 @@ window.__ModuleLoader__.load({
10695
10048
  sessions,
10696
10049
  statusById,
10697
10050
  archivedIds,
10698
- currentWorkspaceId: current?.workspaceId ?? null
10051
+ currentWorkspaceId: current?.workspaceId ?? null,
10052
+ longTasks
10699
10053
  }), [
10700
10054
  items,
10701
10055
  sessions,
10702
10056
  statusById,
10703
10057
  archivedIds,
10704
- current
10058
+ current,
10059
+ longTasks
10705
10060
  ])
10706
10061
  };
10707
10062
  }
10063
+ /**
10064
+ * 左栏要的那份长任务归属:外壳那条读口交回「全进程还在跑的长任务」,这里折成会话侧与工作区侧。
10065
+ * @returns 两侧的归属(谁起了 / 哪个工作区里有几趟)。
10066
+ */
10067
+ function useLongTaskPresence() {
10068
+ const runs = useShellLongTasks();
10069
+ return useMemo(() => longTaskPresenceOf(runs), [runs]);
10070
+ }
10708
10071
  //#endregion
10709
10072
  //#region src/app/layouts/sidebar/PanelNav.tsx
10710
10073
  function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntry, t }) {
@@ -11218,7 +10581,7 @@ window.__ModuleLoader__.load({
11218
10581
  }, [list, rows]);
11219
10582
  return edges;
11220
10583
  }
11221
- function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
10584
+ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
11222
10585
  const list = useSessions((state) => state);
11223
10586
  const statusById = useSessionStatus((state) => state);
11224
10587
  const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);
@@ -11245,7 +10608,7 @@ window.__ModuleLoader__.load({
11245
10608
  "aria-label": t("session.list.label")
11246
10609
  }, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
11247
10610
  key: row.id,
11248
- node: sessionNode(row, statusById, list, pinned, archivedSet),
10611
+ node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
11249
10612
  active: row.id === currentId,
11250
10613
  onOpen,
11251
10614
  renderSlot,
@@ -11291,13 +10654,15 @@ window.__ModuleLoader__.load({
11291
10654
  const [createFailed, setCreateFailed] = useState(false);
11292
10655
  useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
11293
10656
  useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
10657
+ const longTasks = useLongTaskPresence();
11294
10658
  const { current, archivedIds: archivedSet, attention } = useSidebarAttention({
11295
10659
  items,
11296
10660
  sessions,
11297
10661
  statusById,
11298
10662
  archived,
11299
10663
  storedId,
11300
- panelActive: activePanelId !== null
10664
+ panelActive: activePanelId !== null,
10665
+ longTasks
11301
10666
  });
11302
10667
  const pickProject = (workspaceId) => {
11303
10668
  setStoredId(workspaceId);
@@ -11309,6 +10674,7 @@ window.__ModuleLoader__.load({
11309
10674
  sessions,
11310
10675
  statusById,
11311
10676
  archivedIds: archivedSet,
10677
+ longTasks,
11312
10678
  openSession,
11313
10679
  startSession
11314
10680
  });
@@ -11387,6 +10753,7 @@ window.__ModuleLoader__.load({
11387
10753
  pinnedIds,
11388
10754
  archived,
11389
10755
  panelActive: activePanelId !== null,
10756
+ longTasks,
11390
10757
  useSessions: props.useSessions,
11391
10758
  useSessionStatus: props.useSessionStatus,
11392
10759
  onOpen: props.openSession,
@@ -11449,18 +10816,39 @@ window.__ModuleLoader__.load({
11449
10816
  * 卡片要轮询长任务那一行时调用:有在跑的(`running` / `needs-login`)按 `longTaskPollMs` 走快档、空闲走慢档;
11450
10817
  * `workspace` 为 `null`、`mocked: true` 或 `enabled: false` 时不轮。换单元 / 换工作区就是换读数身份,
11451
10818
  * 旧那批立刻清空、读数回来前 `runs` 是空数组。
10819
+ * `stop(id)` 走 actions 通道的 `<单元>/runs/stop`;不在跑的那一趟会带回一句人话,不抛错。
11452
10820
  */
11453
10821
  function useLongTask(options) {
11454
10822
  const enabled = options.enabled !== false && options.mocked !== true && options.workspace !== null;
11455
10823
  const [tick, setTick] = useState(0);
11456
10824
  const runs = longTaskRunsOf(useApiResource(runsRouteOf(options.unit), { path: options.workspace ?? void 0 }, tick, { enabled }));
10825
+ const write = useHostWrite({
10826
+ channel: "actions",
10827
+ resource: stopRouteOf(options.unit),
10828
+ networkText: "网络不通,停止请求没发出去"
10829
+ });
10830
+ const [stopping, setStopping] = useState(null);
10831
+ const send = write.send;
10832
+ const stop = useCallback(async (id) => {
10833
+ setStopping(id);
10834
+ try {
10835
+ return await send({ id });
10836
+ } finally {
10837
+ setStopping((current) => current === id ? null : current);
10838
+ }
10839
+ }, [send]);
11457
10840
  const every = longTaskPollMs(runs.some((run) => longTaskDot(run.status) === "ongoing"), options.pollMs);
11458
10841
  useEffect(() => {
11459
10842
  if (!enabled) return void 0;
11460
10843
  const timer = setInterval(() => setTick((count) => count + 1), every);
11461
10844
  return () => clearInterval(timer);
11462
10845
  }, [enabled, every]);
11463
- return { runs };
10846
+ return {
10847
+ runs,
10848
+ stop,
10849
+ stopping,
10850
+ stopFailed: write.failed
10851
+ };
11464
10852
  }
11465
10853
  //#endregion
11466
10854
  //#region src/shared/hooks/use-unit-board.ts
@@ -11670,23 +11058,79 @@ window.__ModuleLoader__.load({
11670
11058
  },
11671
11059
  components: {
11672
11060
  ...BlockerState_exports,
11673
- ...dist_exports,
11674
- ...dist_exports,
11675
- ...dist_exports,
11676
- ...dist_exports,
11677
- ...dist_exports,
11678
- ...dist_exports,
11679
- ...dist_exports,
11680
- ...dist_exports,
11061
+ ActivityAction,
11062
+ ActivityBlock,
11063
+ ActivityLine,
11064
+ ApprovalDetail,
11065
+ ApprovalPlan,
11066
+ Card,
11067
+ CardAnchor,
11068
+ CardBoundary,
11069
+ CardHead,
11070
+ CenteredState,
11071
+ ChoiceGroup,
11072
+ ConfirmBar,
11073
+ EmptyState,
11074
+ Field,
11075
+ Form,
11076
+ FormActions,
11077
+ FormRow,
11078
+ FormRows,
11079
+ IconBrandMark,
11080
+ IconConversation,
11081
+ IconModuleMark,
11082
+ IconNpm,
11083
+ IconOpencli,
11084
+ IconPanelScreen,
11085
+ Link,
11086
+ LongTaskRow,
11087
+ Note,
11088
+ Row,
11089
+ Rows,
11090
+ SaveBar,
11091
+ SelectField,
11092
+ SettingsSection,
11093
+ SkeletonRows,
11094
+ Spinner,
11095
+ Stack,
11096
+ StateBlock,
11097
+ TextField,
11681
11098
  Tip
11682
11099
  },
11683
11100
  api: {
11684
- ...dist_exports,
11101
+ apiGet,
11102
+ apiPost,
11685
11103
  ...context_chips_exports
11686
11104
  },
11687
11105
  lib: {
11688
- ...dist_exports,
11689
- ...dist_exports
11106
+ MIN_BUSY_MS: 500,
11107
+ blockerOfCapability,
11108
+ blockerOfError,
11109
+ cardIdOf,
11110
+ cx,
11111
+ defaultSelectFilter,
11112
+ duplicateKeysOf,
11113
+ errorReasonOf,
11114
+ excerpt,
11115
+ filterSelectOptions,
11116
+ firstProblemOf,
11117
+ formFirstProblemOf,
11118
+ formValuesOf,
11119
+ holdBusy,
11120
+ parseJsonLoose,
11121
+ parseLocalTimestamp,
11122
+ readText,
11123
+ relativeTime,
11124
+ relativeTimeAgo,
11125
+ relativeTimeBucket,
11126
+ relativeTimeCompact,
11127
+ revealFirstProblem,
11128
+ searchTextOf,
11129
+ selectCursorValue,
11130
+ selectEntries,
11131
+ shortenPath,
11132
+ stepSelectCursor,
11133
+ writeText
11690
11134
  }
11691
11135
  };
11692
11136
  function messagesOf(units) {
@@ -11695,7 +11139,7 @@ window.__ModuleLoader__.load({
11695
11139
  ...face.messages === void 0 ? {} : { messages: face.messages }
11696
11140
  }));
11697
11141
  }
11698
- 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*/";
11142
+ var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
11699
11143
  function workbenchCss() {
11700
11144
  return `${tokens_default}\n${palette_default}\n${scale_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}\n${chrome_default}\n${board_default}\n${motion_default}\n${COMPONENT_CSS_MARKER}`;
11701
11145
  }