@dsh-workbench/core 0.3.6 → 0.3.8

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 (44) hide show
  1. package/client.js +1275 -1930
  2. package/dist/client/client.body.js +1275 -1930
  3. package/dist/client/index.js +1275 -1930
  4. package/dist/host/index.js +1240 -790
  5. package/dist/types/app/client.d.ts +77 -3388
  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/model/diy-context.d.ts +9 -0
  15. package/dist/types/modules/panels/model/diy-record-beat.test.d.ts +1 -0
  16. package/dist/types/modules/panels/model/diy-record-close.test.d.ts +1 -0
  17. package/dist/types/modules/panels/model/diy-record-hook.test.d.ts +1 -0
  18. package/dist/types/modules/panels/model/diy-record-open.d.ts +28 -0
  19. package/dist/types/modules/panels/model/diy-record-open.test.d.ts +1 -0
  20. package/dist/types/modules/panels/model/diy-record-shot.test.d.ts +1 -0
  21. package/dist/types/modules/panels/model/diy-record-text.d.ts +16 -1
  22. package/dist/types/modules/panels/model/diy-record-tools.d.ts +2 -1
  23. package/dist/types/modules/panels/model/diy-record.d.ts +40 -1
  24. package/dist/types/modules/panels/model/diy-report.d.ts +1 -1
  25. package/dist/types/modules/sessions/index.d.ts +1 -1
  26. package/dist/types/modules/sessions/model/attention-long-task.test.d.ts +1 -0
  27. package/dist/types/modules/sessions/model/attention.d.ts +23 -1
  28. package/dist/types/modules/sessions/model/session-node.d.ts +12 -1
  29. package/dist/types/shared/api/host/long-tasks.d.ts +10 -0
  30. package/dist/types/shared/api/host/preflight.d.ts +7 -1
  31. package/dist/types/shared/api/host/workshop-root.d.ts +9 -0
  32. package/dist/types/shared/api/long-tasks.d.ts +19 -0
  33. package/dist/types/shared/hooks/panel-state-report.d.ts +1 -1
  34. package/dist/types/shared/hooks/use-diy-debug.d.ts +1 -1
  35. package/dist/types/shared/hooks/use-diy-record.d.ts +1 -1
  36. package/dist/types/shared/hooks/use-long-task.d.ts +3 -0
  37. package/dist/types/shared/hooks/use-shell-long-tasks.d.ts +8 -0
  38. package/package.json +2 -2
  39. package/skills/workbench-module-diy/BUILD.md +1 -1
  40. package/skills/workbench-module-diy/FAMILY.md +1 -1
  41. package/skills/workbench-module-diy/KIT.md +29 -30
  42. package/skills/workbench-module-diy/PANEL.md +1 -1
  43. package/skills/workbench-module-diy/TOOLS.md +3 -1
  44. package/skills/workbench-module-diy/WRITES.md +20 -3
@@ -284,8 +284,6 @@ function blockerOfCapability(capability, t) {
284
284
  * 引用标记的固定名字;完整标记是 @<这个名字>:<编码文本>,改它等于作废历史会话里已写下的引用。
285
285
  */
286
286
  var CONTEXT_MARKER_NAME = "工作台";
287
- var MARKER = new RegExp(`@${CONTEXT_MARKER_NAME}:([a-z][a-z0-9-]*:[A-Za-z0-9._~%#/-]+)`, "g");
288
- var TRAILING_PUNCTUATION = /[.,;:!?]+$/;
289
287
  /**
290
288
  * 把引用拼回标记体里的那一段文本(不含 @ 与标记名)。
291
289
  * @param ref 要拼的引用。
@@ -295,23 +293,6 @@ function encodeRef(ref) {
295
293
  return `${ref.kind}:${ref.parts.join("/")}`;
296
294
  }
297
295
  /**
298
- * 把 kind:part/part 文本读回引用。
299
- * @param text 待解析文本。
300
- * @returns 没冒号、冒号在首尾、种类不是小写字母开头、或冒号后为空时给 undefined;不抛异常。
301
- */
302
- function decodeRef(text) {
303
- const at = text.indexOf(":");
304
- if (at <= 0 || at === text.length - 1) return void 0;
305
- const kind = text.slice(0, at);
306
- if (!/^[a-z][a-z0-9-]*$/.test(kind)) return void 0;
307
- const parts = text.slice(at + 1).split("/").filter((part) => part !== "");
308
- if (parts.length === 0) return void 0;
309
- return {
310
- kind,
311
- parts
312
- };
313
- }
314
- /**
315
296
  * 拼出 @ 后面那半截(标记名加已编码文本),比较与拼接都用它。
316
297
  * @param encoded encodeRef 的结果。
317
298
  * @returns 形如 工作台:file:src/a.ts。
@@ -328,32 +309,6 @@ function buildMarker(ref) {
328
309
  return `@${markerBody(encodeRef(ref))}`;
329
310
  }
330
311
  /**
331
- * 从一段文本里按出现顺序捞出所有标记引用,同一个引用只留第一次。
332
- * @param text 任意文本;null / undefined 当空串。
333
- * @returns 解析不出来的标记会被丢掉,所以结果只含合法引用,可能为空数组。
334
- */
335
- function parseMarkers(text) {
336
- const seen = /* @__PURE__ */ new Set();
337
- const refs = [];
338
- for (const match of String(text ?? "").matchAll(MARKER)) {
339
- const ref = decodeRef(match[1].replace(TRAILING_PUNCTUATION, ""));
340
- if (ref === void 0) continue;
341
- const key = encodeRef(ref);
342
- if (seen.has(key)) continue;
343
- seen.add(key);
344
- refs.push(ref);
345
- }
346
- return refs;
347
- }
348
- /**
349
- * 由单元 id 拼出它那一族事实的范围名。
350
- * @param unit 单元 id,不带后缀。
351
- * @returns <unit>* —— 永远是范围名,不是某一条事实。
352
- */
353
- function unitFactScope(unit) {
354
- return `${unit}*`;
355
- }
356
- /**
357
312
  * 判一个名字是不是范围查法,不是问这条事实存不存在。
358
313
  * @param name 事实名或范围名。
359
314
  * @returns 单字符 * 不算范围;只有「至少一个字符加 *」才算。
@@ -597,6 +552,16 @@ function longTaskDot(status) {
597
552
  return "idle";
598
553
  }
599
554
  /**
555
+ * 这一趟还在不在跑(`running` 与 `needs-login` 都算)。
556
+ * 卡片要判"这一行要不要摆停止钮""这套环境里有没有活着的跑"时用这个 —— **不是** `longTaskDot`:
557
+ * 那一件是状态点的**长相**(四档),归 `LongTaskRow` 自己用,不该被调用点拿去当判据。
558
+ * @param status 长任务的五种态。
559
+ * @returns 在跑 `true`;成功 / 失败 / 用户按停都是 `false`。
560
+ */
561
+ function longTaskIsLive(status) {
562
+ return status === "running" || status === "needs-login";
563
+ }
564
+ /**
600
565
  * 算停止钮现在在哪一档。
601
566
  * @param state armed = 已经按过第一下、在等第二下;busy = 停止请求已经在飞。
602
567
  * @returns busy 优先(在飞时按不动),其次 armed,否则 idle。
@@ -661,154 +626,6 @@ function probeKeyOf(error) {
661
626
  if (error === void 0) return null;
662
627
  return error.code === "" ? "unknown" : error.code;
663
628
  }
664
- /**
665
- * 外壳愿意认的协议版本;不在表里的模块当场被拒,不猜语义。
666
- */
667
- var SUPPORTED_API_VERSIONS = [1];
668
- /**
669
- * 协议认得的全部键;写了别的键不会被采纳(外壳静默忽略),所以字段名拼错不会有提示。
670
- */
671
- var DECLARATION_KEYS = [
672
- "apiVersion",
673
- "unit",
674
- "card",
675
- "tools",
676
- "host",
677
- "env"
678
- ];
679
- /**
680
- * 协议要求必写的键;env 不在其中(没有环境需要就不写)。
681
- */
682
- var DECLARATION_REQUIRED_KEYS = [
683
- "apiVersion",
684
- "unit",
685
- "card",
686
- "tools",
687
- "host"
688
- ];
689
- var CARD_KEYS = ["titleKey", "order"];
690
- var TOOL_KEYS = [
691
- "name",
692
- "writes",
693
- "key"
694
- ];
695
- var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
696
- var HOST_KEYS = ["inject", "optional"];
697
- function text(value) {
698
- return typeof value === "string" ? value.trim() : "";
699
- }
700
- function isRecord(value) {
701
- return typeof value === "object" && value !== null && !Array.isArray(value);
702
- }
703
- function outsideKeys(value, allowed) {
704
- return Object.keys(value).filter((key) => !allowed.includes(key));
705
- }
706
- function listOf(keys) {
707
- return keys.map((key) => JSON.stringify(key)).join(" / ");
708
- }
709
- function stringArrayProblems(at, value) {
710
- if (!Array.isArray(value)) return [`${at} 要是一串字符串,现在是 ${JSON.stringify(value)}`];
711
- return value.flatMap((item, index) => text(item) === "" ? [`${at}[${index}] 不是非空字符串:${JSON.stringify(item)}`] : []);
712
- }
713
- /**
714
- * 查清单里 dsh.workbench 那一段的形状,回一串给人看的问题(中文,带字段路径)。
715
- * @param subject 报错时用的主语,一般是包名。
716
- * @param raw 清单里那段原始值,可能什么都不是。
717
- * @returns 空数组表示形状过得去;版本不对就当场返回(后面的字段无从判起)。
718
- */
719
- function declarationProblemsOf(subject, raw) {
720
- if (!isRecord(raw)) return [`${subject}: dsh.workbench 不是一个对象 —— ${JSON.stringify(raw)}`];
721
- const version = raw.apiVersion;
722
- if (version === void 0) return [`${subject}: dsh.workbench 没有 apiVersion —— 协议从 v1 起,写 \`"apiVersion": 1\`。缺它 = 外壳不认这个模块(ADR-0038 §2.3)`];
723
- if (!Number.isInteger(version) || !SUPPORTED_API_VERSIONS.includes(version)) return [`${subject}: dsh.workbench.apiVersion 是 ${JSON.stringify(version)},这里只认 ${SUPPORTED_API_VERSIONS.join(" / ")}(要整数)`];
724
- const problems = [];
725
- const unknown = outsideKeys(raw, DECLARATION_KEYS);
726
- if (unknown.length > 0) problems.push(`${subject}: dsh.workbench 里有协议 v1 不认识的键 ${listOf(unknown)} —— 只有 ${listOf(DECLARATION_KEYS)}。(拼错的键会被外壳**静默忽略**:那句声明等于没写)`);
727
- for (const key of DECLARATION_REQUIRED_KEYS) if (raw[key] === void 0) problems.push(`${subject}: dsh.workbench 缺 ${key}` + (key === "card" ? "(这个模块没有卡片就写 `\"card\": null`)" : ""));
728
- const card = raw.card;
729
- if (card !== void 0 && card !== null) {
730
- if (!isRecord(card)) problems.push(`${subject}: dsh.workbench.card 要么是对象、要么是 null,现在是 ${JSON.stringify(card)}`);
731
- else {
732
- const extra = outsideKeys(card, CARD_KEYS);
733
- if (extra.length > 0) problems.push(`${subject}: dsh.workbench.card 里有不认的键 ${listOf(extra)} —— card 只有 ${listOf(CARD_KEYS)}(卡片默认显不显示由运行期的面板配置决定,清单里没有这一位)`);
734
- if (text(card.titleKey) === "") problems.push(`${subject}: dsh.workbench.card.titleKey 要是非空字符串(面板那一格的文案键)`);
735
- if (typeof card.order !== "number" || !Number.isFinite(card.order)) problems.push(`${subject}: dsh.workbench.card.order 要是数字,现在是 ${JSON.stringify(card.order)}`);
736
- }
737
- }
738
- const tools = raw.tools;
739
- if (tools !== void 0) {
740
- if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
741
- else {
742
- const seen = /* @__PURE__ */ new Set();
743
- const seenKeys = /* @__PURE__ */ new Set();
744
- tools.forEach((tool, index) => {
745
- const at = `dsh.workbench.tools[${index}]`;
746
- if (!isRecord(tool)) {
747
- problems.push(`${subject}: ${at} 要是对象,现在是 ${JSON.stringify(tool)}`);
748
- return;
749
- }
750
- const extra = outsideKeys(tool, TOOL_KEYS);
751
- if (extra.length > 0) problems.push(`${subject}: ${at} 里有不认的键 ${listOf(extra)} —— tools 只有 ${listOf(TOOL_KEYS)}`);
752
- const name = text(tool.name);
753
- if (name === "") problems.push(`${subject}: ${at}.name 要是非空字符串`);
754
- else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
755
- else seen.add(name);
756
- if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
757
- if (tool.key !== void 0) {
758
- const key = text(tool.key);
759
- if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
760
- else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
761
- else seenKeys.add(key);
762
- }
763
- });
764
- }
765
- }
766
- const host = raw.host;
767
- if (host !== void 0) {
768
- if (!isRecord(host)) problems.push(`${subject}: dsh.workbench.host 要是对象,现在是 ${JSON.stringify(host)}`);
769
- else {
770
- const extra = outsideKeys(host, HOST_KEYS);
771
- if (extra.length > 0) problems.push(`${subject}: dsh.workbench.host 里有不认的键 ${listOf(extra)} —— host 只有 ${listOf(HOST_KEYS)}`);
772
- if (host.inject === void 0) problems.push(`${subject}: dsh.workbench.host.inject 没写 —— 它声明这个模块要外壳的哪几个服务,外壳靠它判"能不能挂"。一个都不要也要写 \`"inject": []\``);
773
- else problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.inject`, host.inject));
774
- if (host.optional !== void 0) problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.optional`, host.optional));
775
- }
776
- }
777
- if (raw.env !== void 0 && !isRecord(raw.env)) problems.push(`${subject}: dsh.workbench.env 要是对象(command / plugins / libs)—— 语义由门禁的 env 判据查,这里只查形状`);
778
- return problems;
779
- }
780
- /**
781
- * 读一份清单:先查形状,过了再把声明规整成 manifest。
782
- * @param subject 报错时用的主语。
783
- * @param raw 清单里 dsh.workbench 那段原始值。
784
- * @returns 有问题时只有 problems;没问题时 declaration 与 manifest 都给,manifest 里的字符串已 trim。
785
- */
786
- function readDeclaration(subject, raw) {
787
- const problems = declarationProblemsOf(subject, raw);
788
- if (problems.length > 0) return { problems };
789
- const declaration = raw;
790
- const card = declaration.card;
791
- return {
792
- declaration,
793
- problems: [],
794
- manifest: {
795
- id: text(declaration.unit),
796
- card: card === null ? null : {
797
- titleKey: text(card.titleKey),
798
- order: card.order
799
- },
800
- tools: declaration.tools.map((tool) => ({
801
- name: text(tool.name),
802
- writes: tool.writes
803
- })),
804
- host: {
805
- inject: [...declaration.host.inject ?? []],
806
- ...declaration.host.optional === void 0 ? {} : { optional: [...declaration.host.optional] }
807
- },
808
- ...declaration.env === void 0 ? {} : { env: declaration.env }
809
- }
810
- };
811
- }
812
629
  //#endregion
813
630
  //#region ../shared/dist/api/unit.js
814
631
  /**
@@ -821,68 +638,22 @@ function hasEnvSupply(manifest) {
821
638
  }
822
639
  //#endregion
823
640
  //#region ../shared/dist/config/constants.js
824
- /** 外壳插件的包名:浏览器模块表与宿主按它注册、认领这枚插件。 */
825
- var PLUGIN_ID = "@dsh-workbench/core";
826
- /** 与外壳同批发布的兄弟包名:`release.ts` 用它判一版三包是否都已在源上。 */
827
- var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
828
641
  /** 外壳宿主 HTTP API 的根前缀;prefs / actions / provision 等路由都挂在它下面。 */
829
642
  var API_PREFIX = "/workbench/api";
830
- /** 模块偏好读写的路由前缀,挂在外壳 API 下:走写通道,拒写回 write-refused。 */
831
- var PREFS_PREFIX = `${API_PREFIX}/prefs`;
643
+ `${API_PREFIX}`;
832
644
  /** 事实(facts)SSE 事件流的端点路径;前端 `EventSource` 按它带 `since` 游标续传。 */
833
645
  var EVENTS_PATH = "/workbench/events";
834
- /** 写动作的路由前缀,挂在外壳 API 下:模块的写通道 POST 到这里。 */
835
- var ACTIONS_PREFIX = `${API_PREFIX}/actions`;
836
- /** 机器供给(provision)的路由前缀:只收 POST,装机时用它铺一份运行环境。 */
837
- var PROVISION_PREFIX = `${API_PREFIX}/provision`;
646
+ `${API_PREFIX}`;
647
+ `${API_PREFIX}`;
838
648
  /** 面板运行态上报的路径段:崩溃与卡片收尾分别 POST 到 `panel-state/crash`、`panel-state/cards`。 */
839
649
  var PANEL_STATE_PATH = "panel-state";
840
- /** DIY 调试动作的路径段;宿主按它登记 `/workbench/api/diy-debug` 前缀。 */
841
- var DIY_DEBUG_PATH = "diy-debug";
842
- /** 调试动作的子路径(`diy-debug/act`);仓内暂无调用点,动作现走 `DIY_DEBUG_SERVICE`。 */
843
- var DIY_DEBUG_ACT_PATH = `${DIY_DEBUG_PATH}/act`;
844
- /** DIY 录制交接的路径段;宿主按它登记 `/workbench/api/diy-record` 前缀。 */
845
- var DIY_RECORD_PATH = "diy-record";
846
- /** 录制动作的子路径(`diy-record/act`);仓内暂无调用点,录制现走 `DIY_RECORD_SERVICE`。 */
847
- var DIY_RECORD_ACT_PATH = `${DIY_RECORD_PATH}/act`;
848
- /** 面板运行态的路由前缀,挂在外壳 API 下:上报口用它,拒报回 report-refused。 */
849
- var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
850
- /** 钉住的 opencli 插件版本:`opencli-runtime` 按它校验、取那一份。 */
851
- var OPENCLI_PIN = "1.8.8";
852
- /** 缺陷看板套件的 dsh 服务名(`workbenchCodingIssues`):套件照它登记自己那份服务。 */
853
- var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
854
- /** 面板套件的 dsh 服务名(`workbenchPanels`):宿主经它取套件公布的清单与订阅。 */
855
- var PANELS_SERVICE = "workbenchPanels";
650
+ `${API_PREFIX}${PANEL_STATE_PATH}`;
856
651
  /** 单元花名册服务的 dsh 服务名(`workbenchUnits`):模块经它认领自己的单元。 */
857
652
  var UNITS_SERVICE = "workbenchUnits";
858
- /** 面板运行态服务的 dsh 服务名(`workbenchPanelState`):宿主注册,读口按它取。 */
859
- var PANEL_STATE_SERVICE = "workbenchPanelState";
860
- /** DIY 调试约定服务的 dsh 服务名(`workbenchDiyDebug`):调试动作走它,不走 HTTP。 */
861
- var DIY_DEBUG_SERVICE = "workbenchDiyDebug";
862
- /** DIY 录制交接服务的 dsh 服务名(`workbenchDiyRecord`):`diy-acts.ts` 经它收发录制三拍。 */
863
- var DIY_RECORD_SERVICE = "workbenchDiyRecord";
864
- /** 会话投影服务的 dsh 服务名(`sessionProjections`):宿主经 `stateOf(session, 'agentPreset')` 读那一档。 */
865
- var SESSION_PROJECTIONS_SERVICE = "sessionProjections";
866
- /** 单次 opencli 调用的默认超时(毫秒);调用点没传 `timeoutMs` 时按它算。 */
867
- var OPENCLI_TIMEOUT_MS = 12e4;
868
- /** 启动预热站点那一跳的超时(毫秒);超时按未热对待,不挡面板。 */
869
- var WARM_TIMEOUT_MS = 2e4;
870
- /** 装 / 卸模块包的超时(毫秒):pnpm 与取包内容都按它算。 */
871
- var INSTALL_TIMEOUT_MS = 3e5;
872
- /** 查 registry 版本那一次请求的超时(毫秒)。 */
873
- var VERSION_CHECK_TIMEOUT_MS = 1e4;
874
653
  /** 版本查询结果的缓存有效期(毫秒):期内不发第二次请求。 */
875
654
  var VERSION_CHECK_TTL_MS = 6e5;
876
- /** 单元探测结果的缓存有效期(毫秒)。 */
877
- var PROBE_TTL_MS = 3e4;
878
- /** 工具读出来的值交给面板后的保留时长(毫秒):过期就不再算这一拍。 */
879
- var HANDOFF_TTL_MS = 15e3;
880
- /** 跑本地 git 命令的超时(毫秒);短于对外的 `OPENCLI_TIMEOUT_MS`。 */
881
- var GIT_TIMEOUT_MS = 1e4;
882
655
  /** 面板轮询事实的间隔(毫秒):SSE 断了走这条兜底轮询。 */
883
656
  var PANEL_POLL_MS = 2e3;
884
- /** 没起中文名的工作区默认标题:左栏按它分组、显示。 */
885
- var DEFAULT_WORKSPACE_TITLE = "default-workspace";
886
657
  /** 记住当前项目的 localStorage 键。 */
887
658
  var STORAGE_KEY_PROJECT = "dsh-workbench.project";
888
659
  /** 记住右栏展开与否的 localStorage 键。 */
@@ -893,8 +664,6 @@ var STORAGE_KEY_RIGHTBAR_COLUMN = "dsh-workbench.rightbar.column";
893
664
  var STORAGE_KEY_RIGHTBAR_WIDTH = "dsh-workbench.rightbar.width";
894
665
  /** dsh i18n 的命名空间:词表都注册在它下面,`ctx.locale.register` / `bind` 按它取。 */
895
666
  var LOCALE_NS = "workbench";
896
- /** 外壳支持的语言标识,顺序即回退顺序:首项是基准,其余词表必须与它逐键同构。 */
897
- var LOCALES = ["zh", "en"];
898
667
  //#endregion
899
668
  //#region ../shared/dist/api/workbench-client.js
900
669
  /**
@@ -962,14 +731,8 @@ var Fragment = react.Fragment;
962
731
  * React 的 `Component` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
963
732
  */
964
733
  var Component = react.Component;
965
- /**
966
- * React 的 `createContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
967
- */
968
- var createContext = react.createContext;
969
- /**
970
- * React 的 `useContext` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
971
- */
972
- var useContext = react.useContext;
734
+ react.createContext;
735
+ react.useContext;
973
736
  /**
974
737
  * React 的 `useState` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
975
738
  */
@@ -1419,18 +1182,6 @@ function ChoiceGroup(props) {
1419
1182
  });
1420
1183
  }
1421
1184
  //#endregion
1422
- //#region ../shared/dist/components/Field.js
1423
- /**
1424
- * 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
1425
- * @param props.label - 左侧标签,必给。
1426
- * @param props.hint - 控件下面那行说明;不给不画。
1427
- * @param props.children - 控件本体,落在标签与说明之间。
1428
- * @returns 一个 `<label>`,点标签会聚焦里面的控件。
1429
- */
1430
- function Field({ label, hint, children }) {
1431
- return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1432
- }
1433
- //#endregion
1434
1185
  //#region ../shared/dist/components/FormActions.js
1435
1186
  var RANK$1 = {
1436
1187
  default: 0,
@@ -1481,6 +1232,66 @@ function FormActions({ actions }) {
1481
1232
  }));
1482
1233
  }
1483
1234
  //#endregion
1235
+ //#region ../shared/dist/components/Rows.js
1236
+ /**
1237
+ * 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
1238
+ * @param props.children - 一串 `Row`。
1239
+ * @returns 竖排的 div。
1240
+ */
1241
+ function Rows({ children }) {
1242
+ return h("div", { className: "wb-rows" }, children);
1243
+ }
1244
+ /**
1245
+ * 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
1246
+ * @param props.label - 左边那格(键)。
1247
+ * @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
1248
+ * @returns 一行两格。
1249
+ */
1250
+ function Row({ label, value }) {
1251
+ return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
1252
+ }
1253
+ //#endregion
1254
+ //#region ../shared/dist/components/ConfirmBar.js
1255
+ /**
1256
+ * 「先问一句再动手」那一条:标题 + 说明 + 键值 + 失败那句 + 动作区,形状一次收口。
1257
+ * **要不要问**归调用点(ADR-0054 §2 规则三),这一件只回答"问的时候长什么样"。
1258
+ * @param props.title - 那一句问话("发布到 prod?")。
1259
+ * @param props.hint - 标题下面那句说明或正文;不给不占位。
1260
+ * @param props.rows - 键值两格(键值列宽与分隔线归 `Rows` / `Row`);不给或空数组不渲染。值那一格可以放控件。
1261
+ * @param props.actions - 动作清单(归 `FormActions`:一个区一颗 `primary`、永远在右、窄了折行)。
1262
+ * @param props.problem - 失败那句(走 `Note tone="problem"`,读屏是 `alert`);不给不占位。
1263
+ * @param props.busy - 整条在忙(只喂 `aria-busy`;按钮自己的转圈与禁用归 `actions` 里那一颗)。
1264
+ * @param props.label - 读屏的组名;不给时 `title` 是字符串就拿它顶上,两者都没有就不设。
1265
+ * @returns 一个 `role="group"` 的条;`actions` 空数组时最后那一块不渲染。
1266
+ */
1267
+ function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
1268
+ return h("div", {
1269
+ className: "wb-confirmBar",
1270
+ role: "group",
1271
+ "aria-label": label ?? (typeof title === "string" ? title : void 0),
1272
+ "aria-busy": busy
1273
+ }, 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, {
1274
+ key: row.key,
1275
+ label: row.label,
1276
+ value: row.value
1277
+ }))), problem === void 0 ? null : h(Note, {
1278
+ tone: "problem",
1279
+ role: "alert"
1280
+ }, problem), h(FormActions, { actions }));
1281
+ }
1282
+ //#endregion
1283
+ //#region ../shared/dist/components/Field.js
1284
+ /**
1285
+ * 标签 + 控件的排布:没进 `FormRow` 时用它兜住一个字段的标签与说明。
1286
+ * @param props.label - 左侧标签,必给。
1287
+ * @param props.hint - 控件下面那行说明;不给不画。
1288
+ * @param props.children - 控件本体,落在标签与说明之间。
1289
+ * @returns 一个 `<label>`,点标签会聚焦里面的控件。
1290
+ */
1291
+ function Field({ label, hint, children }) {
1292
+ return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1293
+ }
1294
+ //#endregion
1484
1295
  //#region ../shared/dist/components/FormRows.js
1485
1296
  /**
1486
1297
  * 表单行的容器:同一份 `FormRows` 共用一个标签列(列宽由最长的标签定),行距也归它。
@@ -1569,11 +1380,14 @@ function formProblemsOf(fields, show) {
1569
1380
  const values = formValuesOf(fields);
1570
1381
  const problems = {};
1571
1382
  for (const field of fields) {
1572
- const found = show ? field.validate?.(field.value, values) : void 0;
1383
+ const found = show ? problemOf(field, values) : void 0;
1573
1384
  problems[field.key] = found ? found : void 0;
1574
1385
  }
1575
1386
  return problems;
1576
1387
  }
1388
+ function problemOf(field, values) {
1389
+ return field.validate?.(field.value, values);
1390
+ }
1577
1391
  /**
1578
1392
  * 按字段顺序取第一处错误 —— 提交被挡住时要带进视口的就是这一格。
1579
1393
  * 判的是**真值**(与 `formProblemsOf` 同一口径):假值那种"错误文案"渲染出来本来就是空的,不算错。
@@ -1654,12 +1468,17 @@ function formRowsOf(args) {
1654
1468
  hint: field.hint,
1655
1469
  problem: args.showProblem ? args.problems[field.key] : void 0,
1656
1470
  layout: field.layout
1657
- }, field.control({
1471
+ }, controlOf(field, args.problems, args.showProblem, args.busy)));
1472
+ }
1473
+ function controlOf(field, problems, showProblem, busy) {
1474
+ return field.control({
1658
1475
  id: `wb-form-${field.key}`,
1659
1476
  name: field.key,
1660
- invalid: args.showProblem && Boolean(args.problems[field.key]),
1661
- disabled: args.busy || field.disabled === true
1662
- })));
1477
+ invalid: showProblem && Boolean(problems[field.key]),
1478
+ disabled: busy || field.disabled === true,
1479
+ value: field.value,
1480
+ onChange: field.onChange
1481
+ });
1663
1482
  }
1664
1483
  //#endregion
1665
1484
  //#region ../shared/dist/lib/form-problem.js
@@ -1696,13 +1515,15 @@ function revealFirstProblem(root) {
1696
1515
  //#region ../shared/dist/components/Form.js
1697
1516
  /**
1698
1517
  * 整张表单:`fields` 进,行、错误、操作区、(被挡住的)提交都由它安排 —— 它自己一个值都不存,
1699
- * 值仍归调用点的 model(`value` 只读给校验看)。
1518
+ * 值仍归调用点(`value` 与 `onChange` 写在字段配置的同一格里,`Form` 只是把两者原样递给那一格的 `control`)。
1519
+ * 写了 `Form<Values>` 就按 `Values` 把每一格的键与值类型钉住(`Values` 里会 `visible: false` 的键写成可选键);
1520
+ * 不写就是默认档,键值都不钉。
1700
1521
  * 还没提交过时一格错都不显示;第一次提交之后每次渲染重算,改好了当场消。
1701
1522
  * 提交那一拍永远先算一遍:有错就不调 `onSubmit`,并把第一个有错的 `FormRow` 带进视口、聚焦它里面的控件。
1702
1523
  * 回车与点提交钮走的是同一条路:真 `<form>` 的隐式提交在**只有一个文本框**时也会 fire,所以 `busy` / `disabled` 时回车同样不提交。
1703
1524
  * 调用点只管数据与语义:行怎么排、错误摆哪、什么时候校验、按钮在哪,这里没有口子。
1704
- * @param props.fields - 每格的键 / 标签 / 值 / 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
1705
- * @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表;被挡住时不会被调。
1525
+ * @param props.fields - 每格的键 / 标签 / 值 / 值怎么改(`onChange`)/ 校验 / 控件;`visible: false` 的那格当它不存在(不渲染、不校验、不进 `values`)。
1526
+ * @param props.onSubmit - 校验全过的那一拍,回的是从 `fields` 现取的键值表(按 `visibleFieldsOf` 过滤过,不可见那格不在里面);被挡住时不会被调。
1706
1527
  * @param props.submit - 提交钮文案;`busyLabel` 是提交中换的那句,不给就沿用 `label`。
1707
1528
  * @param props.cancel - 取消钮;给了就排在提交钮左边,`busy` 时一起禁用。
1708
1529
  * @param props.extra - 其余动作(default / danger),排在最左,`busy` 时一起禁用。
@@ -1933,25 +1754,6 @@ function EmptyState({ text, icon = null, compact = false }) {
1933
1754
  });
1934
1755
  }
1935
1756
  //#endregion
1936
- //#region ../shared/dist/components/Rows.js
1937
- /**
1938
- * 键值行的容器:分隔线、行距与两端对齐在它和 `Row` 里,别自己写 `ul` / `li` 拼。
1939
- * @param props.children - 一串 `Row`。
1940
- * @returns 竖排的 div。
1941
- */
1942
- function Rows({ children }) {
1943
- return h("div", { className: "wb-rows" }, children);
1944
- }
1945
- /**
1946
- * 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
1947
- * @param props.label - 左边那格(键)。
1948
- * @param props.value - 右边那格(值),可以是数字、时间或一小段节点。
1949
- * @returns 一行两格。
1950
- */
1951
- function Row({ label, value }) {
1952
- return h("div", { className: "wb-row" }, h("span", { className: "wb-rowKey" }, label), h("span", { className: "wb-rowValue" }, value));
1953
- }
1954
- //#endregion
1955
1757
  //#region ../shared/dist/components/SaveBar.js
1956
1758
  /**
1957
1759
  * 设置面底下那条"取消 / 保存":就是 `FormActions` 的两颗固定动作,顺序与间距不归调用点。
@@ -2639,897 +2441,897 @@ function writeFlag(key, value) {
2639
2441
  writeText(key, value ? "true" : "false");
2640
2442
  }
2641
2443
  //#endregion
2642
- //#region ../shared/dist/i18n/en.js
2643
- /** 外壳自带的英文词表:键必须与 `zh` 逐一对应,值不许为空串。 */
2644
- var en = {
2645
- "brand.name": "Workbench",
2646
- "toggle.open": "Open sidebar",
2647
- "toggle.collapse": "Collapse sidebar",
2648
- "project.label": "Switch project",
2649
- "workspace.section": "Workspaces",
2650
- "project.none": "No project",
2651
- "project.empty": "No projects yet. Use “Add project” below.",
2652
- "project.add": "Add project…",
2653
- "project.add.busy": "Creating the workspace…",
2654
- "project.add.failed": "Creating the workspace failed",
2655
- "project.search.label": "Search workspaces",
2656
- "project.search.placeholder": "Search workspaces (folder / name / path)",
2657
- "project.search.empty": "No workspace matches “{query}”.",
2658
- "project.group.workspaces": "Workspaces",
2659
- "project.group.defaultWorkspace": "Default workspace",
2660
- "project.group.workshop": "Workshop",
2661
- "project.rename.row": "Rename “{name}”",
2662
- "project.rename.current": "Give this workspace a display name…",
2663
- "project.rename.title": "Give “{name}” a display name",
2664
- "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
2665
- "project.rename.field": "Display name",
2666
- "project.rename.placeholder": "e.g. Workbench shell",
2667
- "project.rename.hint": "Empty = folder name only",
2668
- "project.rename.save": "Save",
2669
- "project.rename.saving": "Saving…",
2670
- "project.rename.cancel": "Cancel",
2671
- "project.rename.failed": "Rename failed. Try again.",
2672
- "session.new": "New session",
2673
- "session.new.label": "Start a session in the current project",
2674
- "session.empty": "No sessions in this project yet.",
2675
- "session.noProject": "Add a project first.",
2676
- "session.list.label": "Sessions",
2677
- "session.copy": "Copy",
2678
- "session.pinned": "Pinned",
2679
- "session.actions": "Actions for {name}",
2680
- "status.idle": "Idle",
2681
- "status.running": "Running",
2682
- "status.waitingApproval": "Waiting for approval",
2683
- "status.planReview": "Plan awaiting review",
2684
- "status.waitingAnswer": "Waiting for your answer",
2685
- "status.compact.approval": "Approval",
2686
- "status.compact.planReview": "Plan review",
2687
- "status.compact.answer": "Answer",
2688
- "status.completed": "Completed",
2689
- "status.subagentsRunning.one": "{n} subagent running",
2690
- "status.subagentsRunning.other": "{n} subagents running",
2691
- "project.attention.warning.one": "1 session waiting for you",
2692
- "project.attention.warning.other": "{n} sessions waiting for you",
2693
- "project.attention.running.one": "1 session running",
2694
- "project.attention.running.other": "{n} sessions running",
2695
- "project.attention.done.one": "1 session finished, unread",
2696
- "project.attention.done.other": "{n} sessions finished, unread",
2697
- "project.attention.state.warning": "Approval",
2698
- "project.attention.state.running": "Running",
2699
- "project.attention.state.done": "New",
2700
- "hover.copied": "Copied",
2701
- "time.now": "just now",
2702
- "time.minutes": "{n} min ago",
2703
- "time.hours": "{n} h ago",
2704
- "time.days": "{n} d ago",
2705
- "time.ago": "{t} ago",
2706
- "time.short.minutes": "{n}min",
2707
- "time.short.hours": "{n}h",
2708
- "time.short.days": "{n}d",
2709
- "time.short.months": "{n}mo",
2710
- "time.short.years": "{n}y",
2711
- "panels.title": "Panel modules",
2712
- "panels.groupBoardless": "No-board modules",
2713
- "panels.groupPlugins": "opencli plugins",
2714
- "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.",
2715
- "panels.market.defaultLabel": "On by default everywhere",
2716
- "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
2717
- "panels.followAll": "Restore the default everywhere",
2718
- "panels.followAllConfirmTitle": "Restore the default everywhere?",
2719
- "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
2720
- "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
2721
- "panels.followAllConfirmYes": "Restore",
2722
- "panels.followAllConfirmNo": "Cancel",
2723
- "panels.enabled": "enabled in this project",
2724
- "panels.disabled": "not enabled in this project",
2725
- "panels.choose": "Choose modules",
2726
- "panels.buildModule": "Build a module",
2727
- "panels.failed": "Could not save the change. Try again.",
2728
- "panels.dragHint": "Drag to reorder",
2729
- "panels.unknownStep": "No suite provides this view",
2730
- "panels.labelWithHint": "{label} ({hint})",
2731
- "panels.hintJoin": "; ",
2732
- "panels.dep.failed": "⚠ failed to start",
2733
- "panels.dep.missingPlugin": "⚠ not ready yet",
2734
- "panels.dep.missingCommands": "⚠ needs an update",
2735
- "panels.dep.unchecked": "⚠ cannot check",
2736
- "panels.tab.modules": "Panel setup",
2737
- "panels.tab.market": "Workbench module market",
2738
- "panels.browseMarket": "Browse the module market",
2739
- "panels.noneInstalled": "None of these modules has its plugin installed yet",
2740
- "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
2741
- "panels.market.installed": "installed",
2742
- "panels.market.notActive": "not active",
2743
- "panels.market.notUsable": "unusable",
2744
- "panels.market.broken": "broken",
2745
- "panels.market.hasNew": "New version",
2746
- "panels.market.hasProblem": "Module problem",
2747
- "panels.market.missing": "not installed",
2748
- "panels.market.unchecked": "unknown",
2749
- "panels.market.checking": "checking",
2750
- "panels.market.sectionInstalled": "Installed modules",
2751
- "panels.market.sectionPending": "Not installed",
2752
- "panels.market.sectionShared": "Shared dependencies",
2753
- "panels.market.sharedUsedBy": "Used by module {modules}",
2754
- "panels.market.listSeparator": ", ",
2755
- "panels.market.sharedMissing": "not installed",
2756
- "panels.market.sharedOutdated": "update available",
2757
- "panels.market.sharedUnsatisfied": "wrong version",
2758
- "panels.market.sharedOk": "installed",
2759
- "panels.market.versionArrow": "{from} → {to}",
2760
- "panels.market.lead": "Installed on this machine, shared by every project.",
2761
- "panels.market.install": "Install",
2762
- "panels.market.update": "Update",
2763
- "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
2764
- "panels.market.uninstall": "Uninstall",
2765
- "panels.market.uninstallLabel": "Uninstall {name}",
2766
- "panels.market.installing": "Installing…",
2767
- "panels.market.updating": "Updating…",
2768
- "panels.market.uninstalling": "Uninstalling…",
2769
- "panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
2770
- "panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
2771
- "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
2772
- "panels.market.confirmYes": "Uninstall",
2773
- "panels.market.confirmNo": "Cancel",
2774
- "panels.market.failed": "Failed: {reason}",
2775
- "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
2776
- "panels.market.needCommands": "Missing commands: {commands}",
2777
- "panels.market.localMark": "local",
2778
- "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
2779
- "panels.market.noSource": "This module declares no install method — install it yourself",
2780
- "panels.market.badSource": "The install method is incomplete — install it yourself",
2781
- "panels.market.empty": "No modules available",
2782
- "panels.market.sectionPlugins": "Installed opencli plugins",
2783
- "panels.market.moduleOutdated": "update available",
2784
- "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
2785
- "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
2786
- "panels.market.moduleRestartHint": "restart dsh once to bring it up",
2787
- "panels.market.pendingRestart": "restart required",
2788
- "panels.market.workbenchName": "Workbench",
2789
- "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
2790
- "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
2791
- "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.",
2792
- "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
2793
- "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
2794
- "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.",
2795
- "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
2796
- "panels.market.foot": "After installing, enable it in the panel page of that project.",
2797
- "panels.market.recheck": "Check for updates",
2798
- "panels.market.checkUpdates": "Check for updates",
2799
- "panels.market.checkedAt": "Last checked: {time}",
2800
- "panels.market.justNow": "just now",
2801
- "panels.market.minutesAgo": "{n} min ago",
2802
- "panels.market.hoursAgo": "{n} h ago",
2803
- "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
2804
- "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
2805
- "panels.market.add.guideToggle": "Install guide and examples",
2806
- "panels.market.add.guideHide": "Hide guide",
2807
- "panels.market.add.guideIdTitle": "Package name",
2808
- "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
2809
- "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.",
2810
- "panels.market.add.guideGitTitle": "Git URL",
2811
- "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
2812
- "panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
2813
- "panels.market.add.guidePathTitle": "Local module directory",
2814
- "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
2815
- "panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
2816
- "panels.market.add.guideExampleLabel": "Example:",
2817
- "panels.market.add.guideFill": "Fill in",
2818
- "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.",
2819
- "panels.market.add.registryLegend": "Which npm registry to download from",
2820
- "panels.market.add.registryOfficial": "npm registry",
2821
- "panels.market.add.registryMirror": "China mirror",
2822
- "panels.market.add.registryWithHost": "{name} ({host})",
2823
- "panels.market.add.registryToggle": "Source",
2824
- "panels.market.add.installVersion": "Version {version}",
2825
- "panels.market.add.registryDefault": "Default source",
2826
- "panels.market.add.registryCustom": "Custom address",
2827
- "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
2828
- "panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
2829
- "panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
2830
- "panels.market.add.run": "Install",
2831
- "panels.market.add.edit": "Edit",
2832
- "panels.market.add.changeRegistry": "Change source",
2833
- "panels.market.add.installingTitle": "Installing the module…",
2834
- "panels.market.add.installedTitle": "Installed",
2835
- "panels.market.add.failedTitle": "Module install failed",
2836
- "panels.market.add.cancelledTitle": "Cancelled",
2837
- "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.",
2838
- "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
2839
- "panels.market.add.problemInstalled": "This module is already installed",
2840
- "panels.market.add.problemNotFound": "No such module found",
2841
- "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
2842
- "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.",
2843
- "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.",
2844
- "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.",
2845
- "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
2846
- "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
2847
- "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.",
2848
- "panels.market.add.pluginAlias": "Plugin name: {name}",
2849
- "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
2850
- "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
2851
- "panels.market.add.failureNetwork": "The network connection failed",
2852
- "panels.market.add.failureNotFound": "No such module found",
2853
- "panels.market.add.failureNoMatchingVersion": "No matching version",
2854
- "panels.market.add.failureDiskFull": "Out of disk space, install stopped",
2855
- "panels.market.add.failurePermission": "No write permission, cannot install",
2856
- "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
2857
- "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
2858
- "panels.market.add.failureTimeout": "The install timed out",
2859
- "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
2860
- "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",
2861
- "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
2862
- "panels.market.add.approveTitle": "Your approval is needed for install scripts",
2863
- "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
2864
- "panels.market.add.approveRun": "Allow and continue installing",
2865
- "panels.market.add.restart": "Installed — restart once to pick it up.",
2866
- "panels.market.add.tookEffect": "Live.",
2867
- "panels.market.add.details": "Install details",
2868
- "panels.market.add.open": "Add module",
2869
- "panels.market.add.title": "Add module",
2870
- "panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
2871
- "panels.market.add.specLabel": "Package",
2872
- "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.",
2873
- "panels.market.add.exampleTitle": "Examples",
2874
- "panels.market.add.exampleFill": "Fill in an example",
2875
- "panels.market.add.registryLabel": "Source",
2876
- "panels.market.add.registryProfile": "This profile's registry",
2877
- "panels.market.add.registryPnpm": "pnpm's own registry",
2878
- "panels.market.add.check": "Check",
2879
- "panels.market.add.checking": "Checking…",
2880
- "panels.market.add.classifying": "Checking…",
2881
- "panels.market.add.change": "Edit",
2882
- "panels.market.add.previewTitle": "About to install",
2883
- "panels.market.add.fieldName": "Package",
2884
- "panels.market.add.fieldVersion": "Version",
2885
- "panels.market.add.fieldDescription": "Description",
2886
- "panels.market.add.fieldSource": "Source",
2887
- "panels.market.add.install": "Install",
2888
- "panels.market.add.installing": "Installing…",
2889
- "panels.market.add.cancel": "Cancel install",
2890
- "panels.market.add.close": "Close",
2891
- "panels.market.add.retry": "Retry",
2892
- "panels.market.add.changeSource": "Change source",
2893
- "panels.market.add.approveBuilds": "Allow these scripts and retry",
2894
- "panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
2895
- "panels.market.add.doneApplied": "Installed and live.",
2896
- "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
2897
- "panels.market.add.restartWhy": "Why this needs a restart: {reason}",
2898
- "panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
2899
- "panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
2900
- "panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
2901
- "panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
2902
- "panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
2903
- "panels.market.add.cancelled": "Cancelled.",
2904
- "panels.market.add.failed": "Didn't work: {reason}",
2905
- "panels.market.add.removed": "It has been removed.",
2906
- "panels.market.add.supplyPending": "Its plugins install after you restart.",
2907
- "panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
2908
- "panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
2909
- "panels.market.add.removedRestart": "Removed — restart once to finish.",
2910
- "panels.market.add.remove": "Remove it",
2911
- "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
2912
- "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
2913
- "panels.market.add.problem.notFound": "No such package on that source.",
2914
- "panels.market.add.problem.notAPackage": "There is no package at that location.",
2915
- "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
2916
- "panels.market.add.problem.network": "The source is unreachable.",
2917
- "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
2918
- "panels.market.add.reason.invalidSpec": "the spec is not accepted",
2919
- "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
2920
- "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
2921
- "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
2922
- "panels.market.add.reason.bundleInUse": "something is still using it",
2923
- "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
2924
- "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
2925
- "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
2926
- "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
2927
- "panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
2928
- "panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
2929
- "panels.market.add.reason.diskFull": "the disk is full",
2930
- "panels.market.add.reason.permission": "no permission to write",
2931
- "panels.market.add.reason.integrity": "the download failed its integrity check",
2932
- "panels.market.add.reason.timeout": "no output for too long, so it was stopped",
2933
- "panels.market.add.reason.network": "the network is unreachable",
2934
- "panels.market.add.reason.notFound": "no such package on the source",
2935
- "panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
2936
- "blocker.fix.install": "Install for me",
2937
- "blocker.fix.update": "Upgrade for me",
2938
- "blocker.fix.running": "Running…",
2939
- "blocker.fix.failed": "Failed: ",
2940
- "blocker.retry": "Retry",
2941
- "blocker.retry.running": "Retrying…",
2942
- "blocker.copy": "Copy command",
2943
- "blocker.market.open": "Open the module market",
2944
- "blocker.login.title": "Sign in to {platform}",
2945
- "blocker.login.titleGeneric": "Sign-in required",
2946
- "blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
2947
- "blocker.login.go": "Go sign in",
2948
- "blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
2949
- "blocker.forbidden.title": "No access to {platform}",
2950
- "blocker.forbidden.titleGeneric": "No access",
2951
- "blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
2952
- "blocker.forbidden.open": "Open permissions page",
2953
- "blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
2954
- "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
2955
- "blocker.unknown.title": "Something went wrong",
2956
- "panels.reading": "Reading the panel setup…",
2957
- "panels.cardBroken": "This module will not render: {unit} ({reason})",
2958
- "panels.cardRetry": "Retry",
2959
- "panels.empty": "No modules on the panel yet",
2960
- "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
2961
- "env.title": "Preparing the workbench",
2962
- "env.checking": "Checking the runtime environment…",
2963
- "env.installing": "Installing the missing dependency…",
2964
- "env.failed": "One step away",
2965
- "env.elapsed": "Waiting {seconds}s",
2966
- "env.stepFailed.install": "install failed",
2967
- "env.stepFailed.path": "installed but not found",
2968
- "env.stepFailed.shell": "no shell channel",
2969
- "env.bridge.ok": "Connected",
2970
- "env.bridge.short": "Not connected",
2971
- "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.",
2972
- "env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
2973
- "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.",
2974
- "env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
2975
- "env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
2976
- "env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
2977
- "env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
2978
- "env.fix.title": "How to fix it",
2979
- "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.",
2980
- "env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
2981
- "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
2982
- "env.fix.step": "Run this in a terminal, then hit Retry:",
2983
- "env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
2984
- "env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
2985
- "env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
2986
- "env.fix.network": "Network unreachable: check your network or proxy, then retry.",
2987
- "env.fix.details": "Details (for troubleshooting)",
2988
- "env.retry": "Retry",
2989
- "env.copyCommand": "Copy command",
2990
- "env.copied": "Copied",
2991
- "env.step.opencli": "Checking the workbench opencli",
2992
- "env.step.codingPlugin": "Checking the coding plugin",
2993
- "env.step.bridge": "Checking the browser bridge",
2994
- "env.step.warm": "Warming up site sessions",
2995
- "env.warm.done": "{n} site(s) warmed up",
2996
- "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
2997
- "env.unit.failed": "This module cannot start",
2998
- "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
2999
- "env.unit.missingPlugin": "This module is not ready yet",
3000
- "env.unit.missingCommandsHint": "Updating it should fix this.",
3001
- "env.unit.unchecked": "Cannot check: no shell channel",
3002
- "env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
3003
- "env.unit.missingCommands": "This module is out of date",
3004
- "env.unit.hint": "Retry after installing; other modules are unaffected.",
3005
- "rightbar.label": "Data panels",
3006
- "rightbar.expand": "Expand the data panel",
3007
- "rightbar.collapse": "Collapse the data panel",
3008
- "rightbar.column.label": "Right column",
3009
- "rightbar.column.workbench": "Workbench panel",
3010
- "rightbar.column.dsh": "dsh panel",
3011
- "rightbar.refresh": "Refresh",
3012
- "rightbar.refreshing": "Refreshing…",
3013
- "rightbar.updatedAt": "updated {time}",
3014
- "rightbar.noProject": "The current session has no workspace",
3015
- "rightbar.openPlatform": "Open on the platform",
3016
- "coding.notARepo.title": "This workspace is not a Coding repository",
3017
- "error.unknown": "Something went wrong",
3018
- "board.title": "Workbench panel",
3019
- "panel.conversation": "Conversation",
3020
- "panels.label": "Global panels",
3021
- "configSync.nav": "Config sync",
3022
- "configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
3023
- "configSync.source": "Source",
3024
- "configSync.sourceBroken": "its config is unreadable",
3025
- "configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
3026
- "configSync.sourceDead": "unreadable",
3027
- "configSync.refresh": "Read again",
3028
- "configSync.loading": "Reading the source config…",
3029
- "configSync.readHint": "Pick another source, or read again.",
3030
- "configSync.tag.new": "New",
3031
- "configSync.tag.differs": "Differs",
3032
- "configSync.conflictNote": "Applying replaces this workbench copy with the source",
3033
- "configSync.code.lang": "yaml",
3034
- "configSync.code.copy": "Copy",
3035
- "configSync.code.copied": "Copied",
3036
- "configSync.code.wrap": "Wrap lines",
3037
- "configSync.code.unwrap": "No wrap",
3038
- "configSync.code.collapse": "Collapse",
3039
- "configSync.code.collapseAria": "Collapse this row",
3040
- "configSync.code.expandAria": "Expand the diff ({count} more lines)",
3041
- "configSync.code.expand": "Show {count} more lines",
3042
- "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",
3043
- "configSync.apply": "Sync {count} selected",
3044
- "configSync.applyNone": "Pick some rows first",
3045
- "configSync.applying": "Writing…",
3046
- "configSync.applied": "Written to the workbench config · applied",
3047
- "configSync.appliedIds": "Written this time: {ids}",
3048
- "configSync.skippedIds": "Left alone (already here): {ids}",
3049
- "configSync.nothing": "Nothing to sync",
3050
- "configSync.unreadable": "Cannot read {path}: {reason}",
3051
- "configSync.noSource": "This machine has no other profile to sync from",
3052
- "configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
3053
- "configSync.failed": "The sync did not go through; try again.",
3054
- "debug.workspace": "this workspace",
3055
- "debug.status": "Debugging “{title}”",
3056
- "debug.status.trouble": "Debugging needs your attention ({title})",
3057
- "debug.stalled": "Debugging paused ({title})",
3058
- "debug.act.pause": "Pause debugging",
3059
- "debug.act.resume": "Resume debugging",
3060
- "debug.act.stop": "Stop debugging",
3061
- "debug.act.stop.ask": "Confirm stop",
3062
- "debug.card.here.title": "Debugging “{title}”",
3063
- "debug.card.here.note": "Do not switch workspaces or touch the panel",
3064
- "debug.card.away.note": "Switch back to “{title}”",
3065
- "debug.card.paused.note": "Paused",
3066
- "debug.card.hidden.note": "Switch back to the Workbench panel",
3067
- "record.waiting": "Recording handoff · your turn",
3068
- "record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
3069
- "record.recording": "Recording",
3070
- "record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
3071
- "record.finished": "Recording finished",
3072
- "record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
3073
- "record.act.cancel": "Cancel",
3074
- "record.act.halt": "Halt",
3075
- "approval.record.site": "Site",
3076
- "approval.record.what": "Records",
3077
- "approval.record.lands": "Lands in",
3078
- "approval.record.noUrl": "no site given (this call gets refused)",
3079
- "approval.record.oneAction": "one action",
3080
- "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
3081
- "approval.longTask.what": "Stops",
3082
- "approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
3083
- };
3084
- //#endregion
3085
- //#region ../shared/dist/i18n/zh.js
3086
- /** 外壳自带的中文词表(命名空间 `workbench`):`en` 与它逐键对齐,模块那份在它之上合并。 */
3087
- var zh = {
3088
- "brand.name": "工作台",
3089
- "toggle.open": "打开侧边栏",
3090
- "toggle.collapse": "收起侧边栏",
3091
- "project.label": "切换项目",
3092
- "workspace.section": "工作区",
3093
- "project.none": "未选择项目",
3094
- "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
3095
- "project.add": "添加项目…",
3096
- "project.add.busy": "正在新建工作区…",
3097
- "project.add.failed": "新建工作区没成功",
3098
- "project.search.label": "搜索工作区",
3099
- "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
3100
- "project.search.empty": "没有匹配「{query}」的工作区。",
3101
- "project.group.workspaces": "工作区",
3102
- "project.group.defaultWorkspace": "默认工作区",
3103
- "project.group.workshop": "工坊",
3104
- "project.rename.row": "改「{name}」的中文名",
3105
- "project.rename.current": "改当前工作区的中文名…",
3106
- "project.rename.title": "给「{name}」配一个中文名",
3107
- "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
3108
- "project.rename.field": "中文名",
3109
- "project.rename.placeholder": "例如:工作台外壳",
3110
- "project.rename.hint": "留空 = 只显示目录名",
3111
- "project.rename.save": "保存",
3112
- "project.rename.saving": "保存中…",
3113
- "project.rename.cancel": "取消",
3114
- "project.rename.failed": "改名失败了,再试一次。",
3115
- "session.new": "新会话",
3116
- "session.new.label": "在当前项目新建会话",
3117
- "session.empty": "这个项目还没有会话。",
3118
- "session.noProject": "先添加一个项目。",
3119
- "session.list.label": "会话",
3120
- "session.copy": "复制",
3121
- "session.pinned": "已置顶",
3122
- "session.actions": "{name} 的操作",
3123
- "status.idle": "空闲",
3124
- "status.running": "进行中",
3125
- "status.waitingApproval": "等待审批",
3126
- "status.planReview": "计划待审",
3127
- "status.waitingAnswer": "等待回答",
3128
- "status.compact.approval": "待审批",
3129
- "status.compact.planReview": "计划待审",
3130
- "status.compact.answer": "待回答",
3131
- "status.completed": "已完成",
3132
- "status.subagentsRunning.one": "{n} 个子代理运行中",
3133
- "status.subagentsRunning.other": "{n} 个子代理运行中",
3134
- "project.attention.warning.one": "1 个会话在等你点头",
3135
- "project.attention.warning.other": "{n} 个会话在等你点头",
3136
- "project.attention.running.one": "1 个会话在跑",
3137
- "project.attention.running.other": "{n} 个会话在跑",
3138
- "project.attention.done.one": "1 个会话跑完没看",
3139
- "project.attention.done.other": "{n} 个会话跑完没看",
3140
- "project.attention.state.warning": "待审批",
3141
- "project.attention.state.running": "在跑",
3142
- "project.attention.state.done": "新消息",
3143
- "hover.copied": "已复制",
3144
- "time.now": "刚刚",
3145
- "time.minutes": "{n} 分钟前",
3146
- "time.hours": "{n} 小时前",
3147
- "time.days": "{n} 天前",
3148
- "time.ago": "{t}前",
3149
- "time.short.minutes": "{n}分钟",
3150
- "time.short.hours": "{n}小时",
3151
- "time.short.days": "{n}天",
3152
- "time.short.months": "{n}个月",
3153
- "time.short.years": "{n}年",
3154
- "panels.title": "面板模块",
3155
- "panels.groupBoardless": "无看板模块",
3156
- "panels.groupPlugins": "opencli 插件",
3157
- "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
3158
- "panels.market.defaultLabel": "全局默认开启",
3159
- "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
3160
- "panels.followAll": "全部恢复默认",
3161
- "panels.followAllConfirmTitle": "全部恢复默认?",
3162
- "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
3163
- "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
3164
- "panels.followAllConfirmYes": "恢复默认",
3165
- "panels.followAllConfirmNo": "取消",
3166
- "panels.enabled": "这个项目已启用",
3167
- "panels.disabled": "这个项目未启用",
3168
- "panels.choose": "选择模块",
3169
- "panels.buildModule": "造一个模块",
3170
- "panels.failed": "改配置失败了,再试一次。",
3171
- "panels.dragHint": "拖动调整顺序",
3172
- "panels.unknownStep": "这一层没有套件提供",
3173
- "panels.labelWithHint": "{label}({hint})",
3174
- "panels.hintJoin": ";",
3175
- "panels.dep.failed": "⚠ 起不来",
3176
- "panels.dep.missingPlugin": "⚠ 还没装好",
3177
- "panels.dep.missingCommands": "⚠ 需要更新",
3178
- "panels.dep.unchecked": "⚠ 检测不了",
3179
- "panels.tab.modules": "面板配置",
3180
- "panels.tab.market": "工作台模块市场",
3181
- "panels.browseMarket": "浏览模块市场",
3182
- "panels.noneInstalled": "这些模块要的插件都还没装",
3183
- "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
3184
- "panels.market.installed": "已安装",
3185
- "panels.market.notActive": "未生效",
3186
- "panels.market.notUsable": "不可用",
3187
- "panels.market.broken": "装坏了",
3188
- "panels.market.hasNew": "有新版本",
3189
- "panels.market.hasProblem": "模块异常",
3190
- "panels.market.missing": "未装",
3191
- "panels.market.unchecked": "状态未知",
3192
- "panels.market.checking": "检测中",
3193
- "panels.market.sectionInstalled": "已安装模块",
3194
- "panels.market.sectionPending": "未安装",
3195
- "panels.market.sectionShared": "共用依赖",
3196
- "panels.market.sharedUsedBy": "供 {modules} 模块使用",
3197
- "panels.market.listSeparator": "、",
3198
- "panels.market.sharedMissing": "未装",
3199
- "panels.market.sharedOutdated": "有新版",
3200
- "panels.market.sharedUnsatisfied": "版本不对",
3201
- "panels.market.sharedOk": "已装",
3202
- "panels.market.versionArrow": "{from} → {to}",
3203
- "panels.market.lead": "装在这台机器上,所有项目共用。",
3204
- "panels.market.install": "安装",
3205
- "panels.market.update": "更新",
3206
- "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
3207
- "panels.market.uninstall": "卸载",
3208
- "panels.market.uninstallLabel": "卸载 {name}",
3209
- "panels.market.installing": "正在安装…",
3210
- "panels.market.updating": "正在更新…",
3211
- "panels.market.uninstalling": "正在卸载…",
3212
- "panels.market.confirmUninstallTitle": "卸载「{name}」?",
3213
- "panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
3214
- "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
3215
- "panels.market.confirmYes": "卸载",
3216
- "panels.market.confirmNo": "取消",
3217
- "panels.market.failed": "没成功:{reason}",
3218
- "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
3219
- "panels.market.needCommands": "缺这几条命令:{commands}",
3220
- "panels.market.localMark": "本地",
3221
- "panels.market.localHint": "本机那份(不从源上取)。",
3222
- "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
3223
- "panels.market.badSource": "安装方式没写全,只能自己动手",
3224
- "panels.market.empty": "暂无可用模块",
3225
- "panels.market.sectionPlugins": "已安装 opencli 插件",
3226
- "panels.market.moduleOutdated": "有新版",
3227
- "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
3228
- "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
3229
- "panels.market.moduleRestartHint": "重启后生效",
3230
- "panels.market.pendingRestart": "重启后生效",
3231
- "panels.market.workbenchName": "工作台",
3232
- "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
3233
- "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
3234
- "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
3235
- "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
3236
- "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
3237
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
3238
- "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
3239
- "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
3240
- "panels.market.recheck": "重新检查更新",
3241
- "panels.market.checkUpdates": "检查更新",
3242
- "panels.market.checkedAt": "最近检查:{time}",
3243
- "panels.market.justNow": "刚刚",
3244
- "panels.market.minutesAgo": "{n} 分钟前",
3245
- "panels.market.hoursAgo": "{n} 小时前",
3246
- "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
3247
- "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
3248
- "panels.market.add.guideToggle": "模块安装引导和示例",
3249
- "panels.market.add.guideHide": "收起引导",
3250
- "panels.market.add.guideIdTitle": "包名",
3251
- "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
3252
- "panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
3253
- "panels.market.add.guideGitTitle": "Git 仓库地址",
3254
- "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
3255
- "panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
3256
- "panels.market.add.guidePathTitle": "本地模块目录",
3257
- "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
3258
- "panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
3259
- "panels.market.add.guideExampleLabel": "示例:",
3260
- "panels.market.add.guideFill": "填入示例",
3261
- "panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
3262
- "panels.market.add.registryLegend": "从哪个 npm 源下载模块",
3263
- "panels.market.add.registryOfficial": "npm 官方源",
3264
- "panels.market.add.registryMirror": "中国大陆镜像源",
3265
- "panels.market.add.registryWithHost": "{name}({host})",
3266
- "panels.market.add.registryToggle": "安装源",
3267
- "panels.market.add.installVersion": "版本 {version}",
3268
- "panels.market.add.registryDefault": "默认安装源",
3269
- "panels.market.add.registryCustom": "自定义地址",
3270
- "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
3271
- "panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
3272
- "panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
3273
- "panels.market.add.run": "安装",
3274
- "panels.market.add.edit": "编辑",
3275
- "panels.market.add.changeRegistry": "更换安装源",
3276
- "panels.market.add.installingTitle": "模块安装中…",
3277
- "panels.market.add.installedTitle": "已安装",
3278
- "panels.market.add.failedTitle": "模块安装失败",
3279
- "panels.market.add.cancelledTitle": "已取消",
3280
- "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
3281
- "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
3282
- "panels.market.add.problemInstalled": "该模块已安装",
3283
- "panels.market.add.problemNotFound": "未找到相关模块",
3284
- "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
3285
- "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
3286
- "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
3287
- "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
3288
- "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
3289
- "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
3290
- "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
3291
- "panels.market.add.pluginAlias": "插件名:{name}",
3292
- "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
3293
- "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
3294
- "panels.market.add.failureNetwork": "网络连接失败",
3295
- "panels.market.add.failureNotFound": "未找到相关模块",
3296
- "panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
3297
- "panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
3298
- "panels.market.add.failurePermission": "没有写入权限,无法安装",
3299
- "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
3300
- "panels.market.add.failureIntegrity": "下载的安装包校验失败",
3301
- "panels.market.add.failureTimeout": "安装超时",
3302
- "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
3303
- "panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
3304
- "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
3305
- "panels.market.add.approveTitle": "需要你允许安装脚本",
3306
- "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
3307
- "panels.market.add.approveRun": "允许并继续安装",
3308
- "panels.market.add.restart": "装好了,重启一次才生效。",
3309
- "panels.market.add.tookEffect": "已生效。",
3310
- "panels.market.add.details": "安装详情",
3311
- "panels.market.add.open": "添加模块",
3312
- "panels.market.add.title": "添加模块",
3313
- "panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
3314
- "panels.market.add.specLabel": "包名",
3315
- "panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
3316
- "panels.market.add.exampleTitle": "示例",
3317
- "panels.market.add.exampleFill": "填入示例",
3318
- "panels.market.add.registryLabel": "安装源",
3319
- "panels.market.add.registryProfile": "这个 profile 配的源",
3320
- "panels.market.add.registryPnpm": "pnpm 自己配的源",
3321
- "panels.market.add.check": "预检",
3322
- "panels.market.add.checking": "正在预检…",
3323
- "panels.market.add.classifying": "检测中…",
3324
- "panels.market.add.change": "改一下",
3325
- "panels.market.add.previewTitle": "将要安装",
3326
- "panels.market.add.fieldName": "包名",
3327
- "panels.market.add.fieldVersion": "版本",
3328
- "panels.market.add.fieldDescription": "简介",
3329
- "panels.market.add.fieldSource": "来源",
3330
- "panels.market.add.install": "安装",
3331
- "panels.market.add.installing": "正在安装…",
3332
- "panels.market.add.cancel": "取消安装",
3333
- "panels.market.add.close": "关闭",
3334
- "panels.market.add.retry": "重试",
3335
- "panels.market.add.changeSource": "换源",
3336
- "panels.market.add.approveBuilds": "允许这些脚本并重试",
3337
- "panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
3338
- "panels.market.add.doneApplied": "装好了,已经生效。",
3339
- "panels.market.add.doneRestart": "装好了,重启一次才生效。",
3340
- "panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
3341
- "panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
3342
- "panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
3343
- "panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
3344
- "panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
3345
- "panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
3346
- "panels.market.add.cancelled": "已取消。",
3347
- "panels.market.add.failed": "没成功:{reason}",
3348
- "panels.market.add.removed": "已经移除了。",
3349
- "panels.market.add.supplyPending": "它要的插件重启后再装。",
3350
- "panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
3351
- "panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
3352
- "panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
3353
- "panels.market.add.remove": "移除它",
3354
- "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
3355
- "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
3356
- "panels.market.add.problem.notFound": "源上没有这个包。",
3357
- "panels.market.add.problem.notAPackage": "这个位置没有包。",
3358
- "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
3359
- "panels.market.add.problem.network": "源连不上。",
3360
- "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
3361
- "panels.market.add.reason.invalidSpec": "写法不认",
3362
- "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
3363
- "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
3364
- "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
3365
- "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
3366
- "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
3367
- "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
3368
- "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
3369
- "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
3370
- "panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
3371
- "panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
3372
- "panels.market.add.reason.diskFull": "磁盘满了",
3373
- "panels.market.add.reason.permission": "没有写权限",
3374
- "panels.market.add.reason.integrity": "下载内容校验不过",
3375
- "panels.market.add.reason.timeout": "太久没有输出,被中断了",
3376
- "panels.market.add.reason.network": "网络不通",
3377
- "panels.market.add.reason.notFound": "源上没有这个包",
3378
- "panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
3379
- "blocker.fix.install": "帮我安装",
3380
- "blocker.fix.update": "帮我升级",
3381
- "blocker.fix.running": "正在执行…",
3382
- "blocker.fix.failed": "执行失败:",
3383
- "blocker.retry": "重试",
3384
- "blocker.retry.running": "重试中…",
3385
- "blocker.copy": "复制命令",
3386
- "blocker.market.open": "去模块市场",
3387
- "blocker.login.title": "需要登录 {platform}",
3388
- "blocker.login.titleGeneric": "需要登录",
3389
- "blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
3390
- "blocker.login.go": "去登录",
3391
- "blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
3392
- "blocker.forbidden.title": "没有权限访问 {platform}",
3393
- "blocker.forbidden.titleGeneric": "没有权限",
3394
- "blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
3395
- "blocker.forbidden.open": "打开权限页",
3396
- "blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
3397
- "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
3398
- "blocker.unknown.title": "出了点问题",
3399
- "panels.reading": "正在读取面板配置…",
3400
- "panels.cardBroken": "这个模块起不来:{unit}({reason})",
3401
- "panels.cardRetry": "重试",
3402
- "panels.empty": "面板里还没有模块",
3403
- "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
3404
- "env.title": "准备工作台",
3405
- "env.checking": "正在检测运行环境…",
3406
- "env.installing": "正在安装缺失的依赖…",
3407
- "env.failed": "还差一步就能用了",
3408
- "env.elapsed": "已等待 {seconds} 秒",
3409
- "env.stepFailed.install": "装不上",
3410
- "env.stepFailed.path": "装了但还找不到",
3411
- "env.stepFailed.shell": "执行通道不可用",
3412
- "env.bridge.ok": "已连接",
3413
- "env.bridge.short": "没连上",
3414
- "env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
3415
- "env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
3416
- "env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
3417
- "env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
3418
- "env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
3419
- "env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
3420
- "env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
3421
- "env.fix.title": "怎么解决",
3422
- "env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
3423
- "env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
3424
- "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
3425
- "env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
3426
- "env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
3427
- "env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
3428
- "env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
3429
- "env.fix.network": "网络不通:检查网络或代理设置后重试。",
3430
- "env.fix.details": "详细输出(排障用)",
3431
- "env.retry": "重试",
3432
- "env.copyCommand": "复制命令",
3433
- "env.copied": "已复制",
3434
- "env.step.opencli": "检测工作台的 opencli",
3435
- "env.step.codingPlugin": "检测 coding 插件",
3436
- "env.step.bridge": "检测浏览器通道",
3437
- "env.step.warm": "预热站点登录态",
3438
- "env.warm.done": "已预热 {n} 个站点",
3439
- "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
3440
- "env.unit.failed": "这个模块起不来",
3441
- "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
3442
- "env.unit.missingPlugin": "这个模块还没装好",
3443
- "env.unit.missingCommandsHint": "更新之后就能用了。",
3444
- "env.unit.unchecked": "检测不了:拿不到执行通道",
3445
- "env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
3446
- "env.unit.missingCommands": "这个模块的版本旧了",
3447
- "env.unit.hint": "装好之后点重试;不影响其它模块。",
3448
- "rightbar.label": "数据面板",
3449
- "rightbar.expand": "展开数据面板",
3450
- "rightbar.collapse": "收起数据面板",
3451
- "rightbar.column.label": "右侧栏",
3452
- "rightbar.column.workbench": "工作台面板",
3453
- "rightbar.column.dsh": "dsh 面板",
3454
- "rightbar.refresh": "刷新",
3455
- "rightbar.refreshing": "刷新中…",
3456
- "rightbar.updatedAt": "更新于 {time}",
3457
- "rightbar.noProject": "当前会话没有所属项目",
3458
- "rightbar.openPlatform": "在平台上打开",
3459
- "coding.notARepo.title": "这个项目不是 Coding 仓库",
3460
- "error.unknown": "出错了",
3461
- "board.title": "工作台面板",
3462
- "panel.conversation": "对话",
3463
- "panels.label": "全局面板",
3464
- "configSync.nav": "配置同步",
3465
- "configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
3466
- "configSync.source": "来源",
3467
- "configSync.sourceBroken": "读不到它的配置",
3468
- "configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
3469
- "configSync.sourceDead": "读不到",
3470
- "configSync.refresh": "重新读一遍",
3471
- "configSync.loading": "正在读来源的配置…",
3472
- "configSync.readHint": "换个来源,或再读一遍。",
3473
- "configSync.tag.new": "新增",
3474
- "configSync.tag.differs": "差异",
3475
- "configSync.conflictNote": "应用后工作台这份会被来源覆盖",
3476
- "configSync.code.lang": "yaml",
3477
- "configSync.code.copy": "复制",
3478
- "configSync.code.copied": "已复制",
3479
- "configSync.code.wrap": "自动换行",
3480
- "configSync.code.unwrap": "不换行",
3481
- "configSync.code.collapse": "收起",
3482
- "configSync.code.collapseAria": "收起这一行的配置",
3483
- "configSync.code.expandAria": "展开差异(还有 {count} 行)",
3484
- "configSync.code.expand": "展开剩余 {count} 行",
3485
- "configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
3486
- "configSync.apply": "同步选中的 {count} 行",
3487
- "configSync.applyNone": "先勾几行",
3488
- "configSync.applying": "正在写入…",
3489
- "configSync.applied": "已写入工作台配置 · 已生效",
3490
- "configSync.appliedIds": "这次写进去:{ids}",
3491
- "configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
3492
- "configSync.nothing": "没有需要同步的内容",
3493
- "configSync.unreadable": "读不到 {path}:{reason}",
3494
- "configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
3495
- "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
3496
- "configSync.failed": "同步没成功,再试一次。",
3497
- "debug.workspace": "这个工作区",
3498
- "debug.status": "「{title}」调试中",
3499
- "debug.status.trouble": "调试要你看一眼({title})",
3500
- "debug.stalled": "调试已暂停({title})",
3501
- "debug.act.pause": "暂停调试",
3502
- "debug.act.resume": "继续调试",
3503
- "debug.act.stop": "结束调试",
3504
- "debug.act.stop.ask": "确认结束",
3505
- "debug.card.here.title": "正在调试「{title}」",
3506
- "debug.card.here.note": "请勿切换工作区和操作面板",
3507
- "debug.card.away.note": "请切回「{title}」那一屏",
3508
- "debug.card.paused.note": "已暂停",
3509
- "debug.card.hidden.note": "请切回工作台面板",
3510
- "record.waiting": "取证交接 · 等你出手",
3511
- "record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
3512
- "record.recording": "录制中",
3513
- "record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
3514
- "record.finished": "录制完成",
3515
- "record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
3516
- "record.act.cancel": "取消",
3517
- "record.act.halt": "停",
3518
- "approval.record.site": "站点",
3519
- "approval.record.what": "录制功能",
3520
- "approval.record.lands": "落点",
3521
- "approval.record.noUrl": "没给站点地址(这次会被当场拒)",
3522
- "approval.record.oneAction": "一次操作",
3523
- "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
3524
- "approval.longTask.what": "要停的那一趟",
3525
- "approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
3526
- };
3527
- //#endregion
3528
2444
  //#region ../shared/dist/i18n/index.js
3529
2445
  /** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
3530
2446
  var dictionaries = {
3531
- zh,
3532
- en
2447
+ zh: {
2448
+ "brand.name": "工作台",
2449
+ "toggle.open": "打开侧边栏",
2450
+ "toggle.collapse": "收起侧边栏",
2451
+ "project.label": "切换项目",
2452
+ "workspace.section": "工作区",
2453
+ "project.none": "未选择项目",
2454
+ "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
2455
+ "project.add": "添加项目…",
2456
+ "project.add.busy": "正在新建工作区…",
2457
+ "project.add.failed": "新建工作区没成功",
2458
+ "project.search.label": "搜索工作区",
2459
+ "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
2460
+ "project.search.empty": "没有匹配「{query}」的工作区。",
2461
+ "project.group.workspaces": "工作区",
2462
+ "project.group.defaultWorkspace": "默认工作区",
2463
+ "project.group.workshop": "工坊",
2464
+ "project.rename.row": "改「{name}」的中文名",
2465
+ "project.rename.current": "改当前工作区的中文名…",
2466
+ "project.rename.title": "给「{name}」配一个中文名",
2467
+ "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
2468
+ "project.rename.field": "中文名",
2469
+ "project.rename.placeholder": "例如:工作台外壳",
2470
+ "project.rename.hint": "留空 = 只显示目录名",
2471
+ "project.rename.save": "保存",
2472
+ "project.rename.saving": "保存中…",
2473
+ "project.rename.cancel": "取消",
2474
+ "project.rename.failed": "改名失败了,再试一次。",
2475
+ "session.new": "新会话",
2476
+ "session.new.label": "在当前项目新建会话",
2477
+ "session.empty": "这个项目还没有会话。",
2478
+ "session.noProject": "先添加一个项目。",
2479
+ "session.list.label": "会话",
2480
+ "session.copy": "复制",
2481
+ "session.pinned": "已置顶",
2482
+ "session.actions": "{name} 的操作",
2483
+ "status.idle": "空闲",
2484
+ "status.running": "进行中",
2485
+ "status.longTask": "长任务在跑",
2486
+ "status.waitingApproval": "等待审批",
2487
+ "status.planReview": "计划待审",
2488
+ "status.waitingAnswer": "等待回答",
2489
+ "status.compact.approval": "待审批",
2490
+ "status.compact.planReview": "计划待审",
2491
+ "status.compact.answer": "待回答",
2492
+ "status.completed": "已完成",
2493
+ "status.subagentsRunning.one": "{n} 个子代理运行中",
2494
+ "status.subagentsRunning.other": "{n} 个子代理运行中",
2495
+ "project.attention.warning.one": "1 个会话在等你点头",
2496
+ "project.attention.warning.other": "{n} 个会话在等你点头",
2497
+ "project.attention.running.one": "1 个会话在跑",
2498
+ "project.attention.running.other": "{n} 个会话在跑",
2499
+ "project.attention.longTask.one": "1 个长任务在跑",
2500
+ "project.attention.longTask.other": "{n} 个长任务在跑",
2501
+ "project.attention.done.one": "1 个会话跑完没看",
2502
+ "project.attention.done.other": "{n} 个会话跑完没看",
2503
+ "project.attention.state.warning": "待审批",
2504
+ "project.attention.state.running": "在跑",
2505
+ "project.attention.state.done": "新消息",
2506
+ "hover.copied": "已复制",
2507
+ "time.now": "刚刚",
2508
+ "time.minutes": "{n} 分钟前",
2509
+ "time.hours": "{n} 小时前",
2510
+ "time.days": "{n} 天前",
2511
+ "time.ago": "{t}前",
2512
+ "time.short.minutes": "{n}分钟",
2513
+ "time.short.hours": "{n}小时",
2514
+ "time.short.days": "{n}天",
2515
+ "time.short.months": "{n}个月",
2516
+ "time.short.years": "{n}年",
2517
+ "panels.title": "面板模块",
2518
+ "panels.groupBoardless": "无看板模块",
2519
+ "panels.groupPlugins": "opencli 插件",
2520
+ "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
2521
+ "panels.market.defaultLabel": "全局默认开启",
2522
+ "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
2523
+ "panels.followAll": "全部恢复默认",
2524
+ "panels.followAllConfirmTitle": "全部恢复默认?",
2525
+ "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
2526
+ "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
2527
+ "panels.followAllConfirmYes": "恢复默认",
2528
+ "panels.followAllConfirmNo": "取消",
2529
+ "panels.enabled": "这个项目已启用",
2530
+ "panels.disabled": "这个项目未启用",
2531
+ "panels.choose": "选择模块",
2532
+ "panels.buildModule": "造一个模块",
2533
+ "panels.failed": "改配置失败了,再试一次。",
2534
+ "panels.dragHint": "拖动调整顺序",
2535
+ "panels.unknownStep": "这一层没有套件提供",
2536
+ "panels.labelWithHint": "{label}({hint})",
2537
+ "panels.hintJoin": ";",
2538
+ "panels.dep.failed": "⚠ 起不来",
2539
+ "panels.dep.missingPlugin": "⚠ 还没装好",
2540
+ "panels.dep.missingCommands": "⚠ 需要更新",
2541
+ "panels.dep.unchecked": "⚠ 检测不了",
2542
+ "panels.tab.modules": "面板配置",
2543
+ "panels.tab.market": "工作台模块市场",
2544
+ "panels.browseMarket": "浏览模块市场",
2545
+ "panels.noneInstalled": "这些模块要的插件都还没装",
2546
+ "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
2547
+ "panels.market.installed": "已安装",
2548
+ "panels.market.notActive": "未生效",
2549
+ "panels.market.notUsable": "不可用",
2550
+ "panels.market.broken": "装坏了",
2551
+ "panels.market.hasNew": "有新版本",
2552
+ "panels.market.hasProblem": "模块异常",
2553
+ "panels.market.missing": "未装",
2554
+ "panels.market.unchecked": "状态未知",
2555
+ "panels.market.checking": "检测中",
2556
+ "panels.market.sectionInstalled": "已安装模块",
2557
+ "panels.market.sectionPending": "未安装",
2558
+ "panels.market.sectionShared": "共用依赖",
2559
+ "panels.market.sharedUsedBy": "供 {modules} 模块使用",
2560
+ "panels.market.listSeparator": "、",
2561
+ "panels.market.sharedMissing": "未装",
2562
+ "panels.market.sharedOutdated": "有新版",
2563
+ "panels.market.sharedUnsatisfied": "版本不对",
2564
+ "panels.market.sharedOk": "已装",
2565
+ "panels.market.versionArrow": "{from} → {to}",
2566
+ "panels.market.lead": "装在这台机器上,所有项目共用。",
2567
+ "panels.market.install": "安装",
2568
+ "panels.market.update": "更新",
2569
+ "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
2570
+ "panels.market.uninstall": "卸载",
2571
+ "panels.market.uninstallLabel": "卸载 {name}",
2572
+ "panels.market.installing": "正在安装…",
2573
+ "panels.market.updating": "正在更新…",
2574
+ "panels.market.uninstalling": "正在卸载…",
2575
+ "panels.market.confirmUninstallTitle": "卸载「{name}」?",
2576
+ "panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
2577
+ "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
2578
+ "panels.market.confirmYes": "卸载",
2579
+ "panels.market.confirmNo": "取消",
2580
+ "panels.market.failed": "没成功:{reason}",
2581
+ "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
2582
+ "panels.market.needCommands": "缺这几条命令:{commands}",
2583
+ "panels.market.localMark": "本地",
2584
+ "panels.market.localHint": "本机那份(不从源上取)。",
2585
+ "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
2586
+ "panels.market.badSource": "安装方式没写全,只能自己动手",
2587
+ "panels.market.empty": "暂无可用模块",
2588
+ "panels.market.sectionPlugins": "已安装 opencli 插件",
2589
+ "panels.market.moduleOutdated": "有新版",
2590
+ "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
2591
+ "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
2592
+ "panels.market.moduleRestartHint": "重启后生效",
2593
+ "panels.market.pendingRestart": "重启后生效",
2594
+ "panels.market.workbenchName": "工作台",
2595
+ "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
2596
+ "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
2597
+ "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
2598
+ "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
2599
+ "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
2600
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
2601
+ "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
2602
+ "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
2603
+ "panels.market.recheck": "重新检查更新",
2604
+ "panels.market.checkUpdates": "检查更新",
2605
+ "panels.market.checkedAt": "最近检查:{time}",
2606
+ "panels.market.justNow": "刚刚",
2607
+ "panels.market.minutesAgo": "{n} 分钟前",
2608
+ "panels.market.hoursAgo": "{n} 小时前",
2609
+ "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
2610
+ "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
2611
+ "panels.market.add.guideToggle": "模块安装引导和示例",
2612
+ "panels.market.add.guideHide": "收起引导",
2613
+ "panels.market.add.guideIdTitle": "包名",
2614
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
2615
+ "panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
2616
+ "panels.market.add.guideGitTitle": "Git 仓库地址",
2617
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
2618
+ "panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
2619
+ "panels.market.add.guidePathTitle": "本地模块目录",
2620
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
2621
+ "panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
2622
+ "panels.market.add.guideExampleLabel": "示例:",
2623
+ "panels.market.add.guideFill": "填入示例",
2624
+ "panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
2625
+ "panels.market.add.registryLegend": "从哪个 npm 源下载模块",
2626
+ "panels.market.add.registryOfficial": "npm 官方源",
2627
+ "panels.market.add.registryMirror": "中国大陆镜像源",
2628
+ "panels.market.add.registryWithHost": "{name}({host})",
2629
+ "panels.market.add.registryToggle": "安装源",
2630
+ "panels.market.add.installVersion": "版本 {version}",
2631
+ "panels.market.add.registryDefault": "默认安装源",
2632
+ "panels.market.add.registryCustom": "自定义地址",
2633
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
2634
+ "panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
2635
+ "panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
2636
+ "panels.market.add.run": "安装",
2637
+ "panels.market.add.edit": "编辑",
2638
+ "panels.market.add.changeRegistry": "更换安装源",
2639
+ "panels.market.add.installingTitle": "模块安装中…",
2640
+ "panels.market.add.installedTitle": "已安装",
2641
+ "panels.market.add.failedTitle": "模块安装失败",
2642
+ "panels.market.add.cancelledTitle": "已取消",
2643
+ "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
2644
+ "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
2645
+ "panels.market.add.problemInstalled": "该模块已安装",
2646
+ "panels.market.add.problemNotFound": "未找到相关模块",
2647
+ "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
2648
+ "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
2649
+ "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
2650
+ "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
2651
+ "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
2652
+ "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
2653
+ "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
2654
+ "panels.market.add.pluginAlias": "插件名:{name}",
2655
+ "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
2656
+ "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
2657
+ "panels.market.add.failureNetwork": "网络连接失败",
2658
+ "panels.market.add.failureNotFound": "未找到相关模块",
2659
+ "panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
2660
+ "panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
2661
+ "panels.market.add.failurePermission": "没有写入权限,无法安装",
2662
+ "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
2663
+ "panels.market.add.failureIntegrity": "下载的安装包校验失败",
2664
+ "panels.market.add.failureTimeout": "安装超时",
2665
+ "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
2666
+ "panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
2667
+ "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
2668
+ "panels.market.add.approveTitle": "需要你允许安装脚本",
2669
+ "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
2670
+ "panels.market.add.approveRun": "允许并继续安装",
2671
+ "panels.market.add.restart": "装好了,重启一次才生效。",
2672
+ "panels.market.add.tookEffect": "已生效。",
2673
+ "panels.market.add.details": "安装详情",
2674
+ "panels.market.add.open": "添加模块",
2675
+ "panels.market.add.title": "添加模块",
2676
+ "panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
2677
+ "panels.market.add.specLabel": "包名",
2678
+ "panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
2679
+ "panels.market.add.exampleTitle": "示例",
2680
+ "panels.market.add.exampleFill": "填入示例",
2681
+ "panels.market.add.registryLabel": "安装源",
2682
+ "panels.market.add.registryProfile": "这个 profile 配的源",
2683
+ "panels.market.add.registryPnpm": "pnpm 自己配的源",
2684
+ "panels.market.add.check": "预检",
2685
+ "panels.market.add.checking": "正在预检…",
2686
+ "panels.market.add.classifying": "检测中…",
2687
+ "panels.market.add.change": "改一下",
2688
+ "panels.market.add.previewTitle": "将要安装",
2689
+ "panels.market.add.fieldName": "包名",
2690
+ "panels.market.add.fieldVersion": "版本",
2691
+ "panels.market.add.fieldDescription": "简介",
2692
+ "panels.market.add.fieldSource": "来源",
2693
+ "panels.market.add.install": "安装",
2694
+ "panels.market.add.installing": "正在安装…",
2695
+ "panels.market.add.cancel": "取消安装",
2696
+ "panels.market.add.close": "关闭",
2697
+ "panels.market.add.retry": "重试",
2698
+ "panels.market.add.changeSource": "换源",
2699
+ "panels.market.add.approveBuilds": "允许这些脚本并重试",
2700
+ "panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
2701
+ "panels.market.add.doneApplied": "装好了,已经生效。",
2702
+ "panels.market.add.doneRestart": "装好了,重启一次才生效。",
2703
+ "panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
2704
+ "panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
2705
+ "panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
2706
+ "panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
2707
+ "panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
2708
+ "panels.market.add.restartWhy.module-comparison": "dsh 没能把已加载的插件与盘上的文件对上",
2709
+ "panels.market.add.cancelled": "已取消。",
2710
+ "panels.market.add.failed": "没成功:{reason}",
2711
+ "panels.market.add.removed": "已经移除了。",
2712
+ "panels.market.add.supplyPending": "它要的插件重启后再装。",
2713
+ "panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
2714
+ "panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
2715
+ "panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
2716
+ "panels.market.add.remove": "移除它",
2717
+ "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
2718
+ "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
2719
+ "panels.market.add.problem.notFound": "源上没有这个包。",
2720
+ "panels.market.add.problem.notAPackage": "这个位置没有包。",
2721
+ "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
2722
+ "panels.market.add.problem.network": "源连不上。",
2723
+ "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
2724
+ "panels.market.add.reason.invalidSpec": "写法不认",
2725
+ "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
2726
+ "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
2727
+ "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
2728
+ "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
2729
+ "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
2730
+ "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
2731
+ "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
2732
+ "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
2733
+ "panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
2734
+ "panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
2735
+ "panels.market.add.reason.diskFull": "磁盘满了",
2736
+ "panels.market.add.reason.permission": "没有写权限",
2737
+ "panels.market.add.reason.integrity": "下载内容校验不过",
2738
+ "panels.market.add.reason.timeout": "太久没有输出,被中断了",
2739
+ "panels.market.add.reason.network": "网络不通",
2740
+ "panels.market.add.reason.notFound": "源上没有这个包",
2741
+ "panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
2742
+ "blocker.fix.install": "帮我安装",
2743
+ "blocker.fix.update": "帮我升级",
2744
+ "blocker.fix.running": "正在执行…",
2745
+ "blocker.fix.failed": "执行失败:",
2746
+ "blocker.retry": "重试",
2747
+ "blocker.retry.running": "重试中…",
2748
+ "blocker.copy": "复制命令",
2749
+ "blocker.market.open": "去模块市场",
2750
+ "blocker.login.title": "需要登录 {platform}",
2751
+ "blocker.login.titleGeneric": "需要登录",
2752
+ "blocker.login.hint": "工作台用你的浏览器登录态;登录一次就行,之后不用再登。",
2753
+ "blocker.login.go": "去登录",
2754
+ "blocker.login.manual": "在终端执行 `opencli coding team-current`,按提示完成登录后重试。",
2755
+ "blocker.forbidden.title": "没有权限访问 {platform}",
2756
+ "blocker.forbidden.titleGeneric": "没有权限",
2757
+ "blocker.forbidden.hint": "账号已登录,但没有这个项目/仓库的权限;申请之后再试。",
2758
+ "blocker.forbidden.open": "打开权限页",
2759
+ "blocker.timeout.hint": "无头浏览器可能没起来,重试一次通常就好。",
2760
+ "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
2761
+ "blocker.unknown.title": "出了点问题",
2762
+ "panels.reading": "正在读取面板配置…",
2763
+ "panels.cardBroken": "这个模块起不来:{unit}({reason})",
2764
+ "panels.cardRetry": "重试",
2765
+ "panels.empty": "面板里还没有模块",
2766
+ "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
2767
+ "env.title": "准备工作台",
2768
+ "env.checking": "正在检测运行环境…",
2769
+ "env.installing": "正在安装缺失的依赖…",
2770
+ "env.failed": "还差一步就能用了",
2771
+ "env.elapsed": "已等待 {seconds} 秒",
2772
+ "env.stepFailed.install": "装不上",
2773
+ "env.stepFailed.path": "装了但还找不到",
2774
+ "env.stepFailed.shell": "执行通道不可用",
2775
+ "env.bridge.ok": "已连接",
2776
+ "env.bridge.short": "没连上",
2777
+ "env.bridge.why": "面板的数据要走你浏览器里的登录态:这个通道没连上,模块就取不到数据(不拦路,但先修好它)。",
2778
+ "env.bridge.daemon": "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。",
2779
+ "env.bridge.extension": "浏览器扩展没连上:在 Chrome 应用商店装一次就好(装完回来点「重试」)。已经装过的话,先跑下面这条命令。",
2780
+ "env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
2781
+ "env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
2782
+ "env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
2783
+ "env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
2784
+ "env.fix.title": "怎么解决",
2785
+ "env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
2786
+ "env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
2787
+ "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
2788
+ "env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
2789
+ "env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
2790
+ "env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
2791
+ "env.fix.permission": "权限不够:在命令前加 sudo 重跑,或先把 npm 的全局目录配到你的用户目录。",
2792
+ "env.fix.network": "网络不通:检查网络或代理设置后重试。",
2793
+ "env.fix.details": "详细输出(排障用)",
2794
+ "env.retry": "重试",
2795
+ "env.copyCommand": "复制命令",
2796
+ "env.copied": "已复制",
2797
+ "env.step.opencli": "检测工作台的 opencli",
2798
+ "env.step.codingPlugin": "检测 coding 插件",
2799
+ "env.step.bridge": "检测浏览器通道",
2800
+ "env.step.warm": "预热站点登录态",
2801
+ "env.warm.done": "已预热 {n} 个站点",
2802
+ "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
2803
+ "env.unit.failed": "这个模块起不来",
2804
+ "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
2805
+ "env.unit.missingPlugin": "这个模块还没装好",
2806
+ "env.unit.missingCommandsHint": "更新之后就能用了。",
2807
+ "env.unit.unchecked": "检测不了:拿不到执行通道",
2808
+ "env.unit.uncheckedHint": "不是这个模块的问题,是执行通道不可用 —— 重启一次工作台再试。",
2809
+ "env.unit.missingCommands": "这个模块的版本旧了",
2810
+ "env.unit.hint": "装好之后点重试;不影响其它模块。",
2811
+ "rightbar.label": "数据面板",
2812
+ "rightbar.expand": "展开数据面板",
2813
+ "rightbar.collapse": "收起数据面板",
2814
+ "rightbar.column.label": "右侧栏",
2815
+ "rightbar.column.workbench": "工作台面板",
2816
+ "rightbar.column.dsh": "dsh 面板",
2817
+ "rightbar.refresh": "刷新",
2818
+ "rightbar.refreshing": "刷新中…",
2819
+ "rightbar.updatedAt": "更新于 {time}",
2820
+ "rightbar.noProject": "当前会话没有所属项目",
2821
+ "rightbar.openPlatform": "在平台上打开",
2822
+ "coding.notARepo.title": "这个项目不是 Coding 仓库",
2823
+ "error.unknown": "出错了",
2824
+ "board.title": "工作台面板",
2825
+ "panel.conversation": "对话",
2826
+ "panels.label": "全局面板",
2827
+ "configSync.nav": "配置同步",
2828
+ "configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
2829
+ "configSync.source": "来源",
2830
+ "configSync.sourceBroken": "读不到它的配置",
2831
+ "configSync.sourceRows": "{name} 这份里你有 {count} 行可搬",
2832
+ "configSync.sourceDead": "读不到",
2833
+ "configSync.refresh": "重新读一遍",
2834
+ "configSync.loading": "正在读来源的配置…",
2835
+ "configSync.readHint": "换个来源,或再读一遍。",
2836
+ "configSync.tag.new": "新增",
2837
+ "configSync.tag.differs": "差异",
2838
+ "configSync.conflictNote": "应用后工作台这份会被来源覆盖",
2839
+ "configSync.code.lang": "yaml",
2840
+ "configSync.code.copy": "复制",
2841
+ "configSync.code.copied": "已复制",
2842
+ "configSync.code.wrap": "自动换行",
2843
+ "configSync.code.unwrap": "不换行",
2844
+ "configSync.code.collapse": "收起",
2845
+ "configSync.code.collapseAria": "收起这一行的配置",
2846
+ "configSync.code.expandAria": "展开差异(还有 {count} 行)",
2847
+ "configSync.code.expand": "展开剩余 {count} 行",
2848
+ "configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
2849
+ "configSync.apply": "同步选中的 {count} 行",
2850
+ "configSync.applyNone": "先勾几行",
2851
+ "configSync.applying": "正在写入…",
2852
+ "configSync.applied": "已写入工作台配置 · 已生效",
2853
+ "configSync.appliedIds": "这次写进去:{ids}",
2854
+ "configSync.skippedIds": "这几行工作台自己已有,没动:{ids}",
2855
+ "configSync.nothing": "没有需要同步的内容",
2856
+ "configSync.unreadable": "读不到 {path}:{reason}",
2857
+ "configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
2858
+ "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
2859
+ "configSync.failed": "同步没成功,再试一次。",
2860
+ "debug.workspace": "这个工作区",
2861
+ "debug.status": "「{title}」调试中",
2862
+ "debug.status.trouble": "调试要你看一眼({title})",
2863
+ "debug.stalled": "调试已暂停({title})",
2864
+ "debug.act.pause": "暂停调试",
2865
+ "debug.act.resume": "继续调试",
2866
+ "debug.act.stop": "结束调试",
2867
+ "debug.act.stop.ask": "确认结束",
2868
+ "debug.card.here.title": "正在调试「{title}」",
2869
+ "debug.card.here.note": "请勿切换工作区和操作面板",
2870
+ "debug.card.away.note": "请切回「{title}」那一屏",
2871
+ "debug.card.paused.note": "已暂停",
2872
+ "debug.card.hidden.note": "请切回工作台面板",
2873
+ "record.waiting": "取证交接 · 等你出手",
2874
+ "record.waiting.note": "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)",
2875
+ "record.recording": "录制中",
2876
+ "record.recording.note": "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收",
2877
+ "record.recording.shots": ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)",
2878
+ "record.finished": "录制完成",
2879
+ "record.finished.note": "这一段录完了 —— agent 会自己来取并收工,不用你点",
2880
+ "record.act.cancel": "取消",
2881
+ "record.act.halt": "停",
2882
+ "approval.record.site": "站点",
2883
+ "approval.record.what": "录制功能",
2884
+ "approval.record.lands": "落点",
2885
+ "approval.record.noUrl": "没给站点地址(这次会被当场拒)",
2886
+ "approval.record.oneAction": "一次操作",
2887
+ "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
2888
+ "approval.longTask.what": "要停的那一趟",
2889
+ "approval.longTask.signal": "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己"
2890
+ },
2891
+ en: {
2892
+ "brand.name": "Workbench",
2893
+ "toggle.open": "Open sidebar",
2894
+ "toggle.collapse": "Collapse sidebar",
2895
+ "project.label": "Switch project",
2896
+ "workspace.section": "Workspaces",
2897
+ "project.none": "No project",
2898
+ "project.empty": "No projects yet. Use “Add project” below.",
2899
+ "project.add": "Add project…",
2900
+ "project.add.busy": "Creating the workspace…",
2901
+ "project.add.failed": "Creating the workspace failed",
2902
+ "project.search.label": "Search workspaces",
2903
+ "project.search.placeholder": "Search workspaces (folder / name / path)",
2904
+ "project.search.empty": "No workspace matches “{query}”.",
2905
+ "project.group.workspaces": "Workspaces",
2906
+ "project.group.defaultWorkspace": "Default workspace",
2907
+ "project.group.workshop": "Workshop",
2908
+ "project.rename.row": "Rename “{name}”",
2909
+ "project.rename.current": "Give this workspace a display name…",
2910
+ "project.rename.title": "Give “{name}” a display name",
2911
+ "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
2912
+ "project.rename.field": "Display name",
2913
+ "project.rename.placeholder": "e.g. Workbench shell",
2914
+ "project.rename.hint": "Empty = folder name only",
2915
+ "project.rename.save": "Save",
2916
+ "project.rename.saving": "Saving…",
2917
+ "project.rename.cancel": "Cancel",
2918
+ "project.rename.failed": "Rename failed. Try again.",
2919
+ "session.new": "New session",
2920
+ "session.new.label": "Start a session in the current project",
2921
+ "session.empty": "No sessions in this project yet.",
2922
+ "session.noProject": "Add a project first.",
2923
+ "session.list.label": "Sessions",
2924
+ "session.copy": "Copy",
2925
+ "session.pinned": "Pinned",
2926
+ "session.actions": "Actions for {name}",
2927
+ "status.idle": "Idle",
2928
+ "status.running": "Running",
2929
+ "status.longTask": "Long task running",
2930
+ "status.waitingApproval": "Waiting for approval",
2931
+ "status.planReview": "Plan awaiting review",
2932
+ "status.waitingAnswer": "Waiting for your answer",
2933
+ "status.compact.approval": "Approval",
2934
+ "status.compact.planReview": "Plan review",
2935
+ "status.compact.answer": "Answer",
2936
+ "status.completed": "Completed",
2937
+ "status.subagentsRunning.one": "{n} subagent running",
2938
+ "status.subagentsRunning.other": "{n} subagents running",
2939
+ "project.attention.warning.one": "1 session waiting for you",
2940
+ "project.attention.warning.other": "{n} sessions waiting for you",
2941
+ "project.attention.running.one": "1 session running",
2942
+ "project.attention.running.other": "{n} sessions running",
2943
+ "project.attention.longTask.one": "1 long task running",
2944
+ "project.attention.longTask.other": "{n} long tasks running",
2945
+ "project.attention.done.one": "1 session finished, unread",
2946
+ "project.attention.done.other": "{n} sessions finished, unread",
2947
+ "project.attention.state.warning": "Approval",
2948
+ "project.attention.state.running": "Running",
2949
+ "project.attention.state.done": "New",
2950
+ "hover.copied": "Copied",
2951
+ "time.now": "just now",
2952
+ "time.minutes": "{n} min ago",
2953
+ "time.hours": "{n} h ago",
2954
+ "time.days": "{n} d ago",
2955
+ "time.ago": "{t} ago",
2956
+ "time.short.minutes": "{n}min",
2957
+ "time.short.hours": "{n}h",
2958
+ "time.short.days": "{n}d",
2959
+ "time.short.months": "{n}mo",
2960
+ "time.short.years": "{n}y",
2961
+ "panels.title": "Panel modules",
2962
+ "panels.groupBoardless": "No-board modules",
2963
+ "panels.groupPlugins": "opencli plugins",
2964
+ "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.",
2965
+ "panels.market.defaultLabel": "On by default everywhere",
2966
+ "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
2967
+ "panels.followAll": "Restore the default everywhere",
2968
+ "panels.followAllConfirmTitle": "Restore the default everywhere?",
2969
+ "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
2970
+ "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
2971
+ "panels.followAllConfirmYes": "Restore",
2972
+ "panels.followAllConfirmNo": "Cancel",
2973
+ "panels.enabled": "enabled in this project",
2974
+ "panels.disabled": "not enabled in this project",
2975
+ "panels.choose": "Choose modules",
2976
+ "panels.buildModule": "Build a module",
2977
+ "panels.failed": "Could not save the change. Try again.",
2978
+ "panels.dragHint": "Drag to reorder",
2979
+ "panels.unknownStep": "No suite provides this view",
2980
+ "panels.labelWithHint": "{label} ({hint})",
2981
+ "panels.hintJoin": "; ",
2982
+ "panels.dep.failed": "⚠ failed to start",
2983
+ "panels.dep.missingPlugin": "⚠ not ready yet",
2984
+ "panels.dep.missingCommands": "⚠ needs an update",
2985
+ "panels.dep.unchecked": "⚠ cannot check",
2986
+ "panels.tab.modules": "Panel setup",
2987
+ "panels.tab.market": "Workbench module market",
2988
+ "panels.browseMarket": "Browse the module market",
2989
+ "panels.noneInstalled": "None of these modules has its plugin installed yet",
2990
+ "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
2991
+ "panels.market.installed": "installed",
2992
+ "panels.market.notActive": "not active",
2993
+ "panels.market.notUsable": "unusable",
2994
+ "panels.market.broken": "broken",
2995
+ "panels.market.hasNew": "New version",
2996
+ "panels.market.hasProblem": "Module problem",
2997
+ "panels.market.missing": "not installed",
2998
+ "panels.market.unchecked": "unknown",
2999
+ "panels.market.checking": "checking",
3000
+ "panels.market.sectionInstalled": "Installed modules",
3001
+ "panels.market.sectionPending": "Not installed",
3002
+ "panels.market.sectionShared": "Shared dependencies",
3003
+ "panels.market.sharedUsedBy": "Used by module {modules}",
3004
+ "panels.market.listSeparator": ", ",
3005
+ "panels.market.sharedMissing": "not installed",
3006
+ "panels.market.sharedOutdated": "update available",
3007
+ "panels.market.sharedUnsatisfied": "wrong version",
3008
+ "panels.market.sharedOk": "installed",
3009
+ "panels.market.versionArrow": "{from} → {to}",
3010
+ "panels.market.lead": "Installed on this machine, shared by every project.",
3011
+ "panels.market.install": "Install",
3012
+ "panels.market.update": "Update",
3013
+ "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
3014
+ "panels.market.uninstall": "Uninstall",
3015
+ "panels.market.uninstallLabel": "Uninstall {name}",
3016
+ "panels.market.installing": "Installing…",
3017
+ "panels.market.updating": "Updating…",
3018
+ "panels.market.uninstalling": "Uninstalling…",
3019
+ "panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
3020
+ "panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
3021
+ "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
3022
+ "panels.market.confirmYes": "Uninstall",
3023
+ "panels.market.confirmNo": "Cancel",
3024
+ "panels.market.failed": "Failed: {reason}",
3025
+ "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
3026
+ "panels.market.needCommands": "Missing commands: {commands}",
3027
+ "panels.market.localMark": "local",
3028
+ "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
3029
+ "panels.market.noSource": "This module declares no install method — install it yourself",
3030
+ "panels.market.badSource": "The install method is incomplete — install it yourself",
3031
+ "panels.market.empty": "No modules available",
3032
+ "panels.market.sectionPlugins": "Installed opencli plugins",
3033
+ "panels.market.moduleOutdated": "update available",
3034
+ "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
3035
+ "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
3036
+ "panels.market.moduleRestartHint": "restart dsh once to bring it up",
3037
+ "panels.market.pendingRestart": "restart required",
3038
+ "panels.market.workbenchName": "Workbench",
3039
+ "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
3040
+ "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
3041
+ "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.",
3042
+ "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
3043
+ "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
3044
+ "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.",
3045
+ "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
3046
+ "panels.market.foot": "After installing, enable it in the panel page of that project.",
3047
+ "panels.market.recheck": "Check for updates",
3048
+ "panels.market.checkUpdates": "Check for updates",
3049
+ "panels.market.checkedAt": "Last checked: {time}",
3050
+ "panels.market.justNow": "just now",
3051
+ "panels.market.minutesAgo": "{n} min ago",
3052
+ "panels.market.hoursAgo": "{n} h ago",
3053
+ "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
3054
+ "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
3055
+ "panels.market.add.guideToggle": "Install guide and examples",
3056
+ "panels.market.add.guideHide": "Hide guide",
3057
+ "panels.market.add.guideIdTitle": "Package name",
3058
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
3059
+ "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.",
3060
+ "panels.market.add.guideGitTitle": "Git URL",
3061
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
3062
+ "panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
3063
+ "panels.market.add.guidePathTitle": "Local module directory",
3064
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
3065
+ "panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
3066
+ "panels.market.add.guideExampleLabel": "Example:",
3067
+ "panels.market.add.guideFill": "Fill in",
3068
+ "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.",
3069
+ "panels.market.add.registryLegend": "Which npm registry to download from",
3070
+ "panels.market.add.registryOfficial": "npm registry",
3071
+ "panels.market.add.registryMirror": "China mirror",
3072
+ "panels.market.add.registryWithHost": "{name} ({host})",
3073
+ "panels.market.add.registryToggle": "Source",
3074
+ "panels.market.add.installVersion": "Version {version}",
3075
+ "panels.market.add.registryDefault": "Default source",
3076
+ "panels.market.add.registryCustom": "Custom address",
3077
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
3078
+ "panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
3079
+ "panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
3080
+ "panels.market.add.run": "Install",
3081
+ "panels.market.add.edit": "Edit",
3082
+ "panels.market.add.changeRegistry": "Change source",
3083
+ "panels.market.add.installingTitle": "Installing the module…",
3084
+ "panels.market.add.installedTitle": "Installed",
3085
+ "panels.market.add.failedTitle": "Module install failed",
3086
+ "panels.market.add.cancelledTitle": "Cancelled",
3087
+ "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.",
3088
+ "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
3089
+ "panels.market.add.problemInstalled": "This module is already installed",
3090
+ "panels.market.add.problemNotFound": "No such module found",
3091
+ "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
3092
+ "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.",
3093
+ "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.",
3094
+ "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.",
3095
+ "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
3096
+ "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
3097
+ "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.",
3098
+ "panels.market.add.pluginAlias": "Plugin name: {name}",
3099
+ "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
3100
+ "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
3101
+ "panels.market.add.failureNetwork": "The network connection failed",
3102
+ "panels.market.add.failureNotFound": "No such module found",
3103
+ "panels.market.add.failureNoMatchingVersion": "No matching version",
3104
+ "panels.market.add.failureDiskFull": "Out of disk space, install stopped",
3105
+ "panels.market.add.failurePermission": "No write permission, cannot install",
3106
+ "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
3107
+ "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
3108
+ "panels.market.add.failureTimeout": "The install timed out",
3109
+ "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
3110
+ "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",
3111
+ "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
3112
+ "panels.market.add.approveTitle": "Your approval is needed for install scripts",
3113
+ "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
3114
+ "panels.market.add.approveRun": "Allow and continue installing",
3115
+ "panels.market.add.restart": "Installed — restart once to pick it up.",
3116
+ "panels.market.add.tookEffect": "Live.",
3117
+ "panels.market.add.details": "Install details",
3118
+ "panels.market.add.open": "Add module",
3119
+ "panels.market.add.title": "Add module",
3120
+ "panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
3121
+ "panels.market.add.specLabel": "Package",
3122
+ "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.",
3123
+ "panels.market.add.exampleTitle": "Examples",
3124
+ "panels.market.add.exampleFill": "Fill in an example",
3125
+ "panels.market.add.registryLabel": "Source",
3126
+ "panels.market.add.registryProfile": "This profile's registry",
3127
+ "panels.market.add.registryPnpm": "pnpm's own registry",
3128
+ "panels.market.add.check": "Check",
3129
+ "panels.market.add.checking": "Checking…",
3130
+ "panels.market.add.classifying": "Checking…",
3131
+ "panels.market.add.change": "Edit",
3132
+ "panels.market.add.previewTitle": "About to install",
3133
+ "panels.market.add.fieldName": "Package",
3134
+ "panels.market.add.fieldVersion": "Version",
3135
+ "panels.market.add.fieldDescription": "Description",
3136
+ "panels.market.add.fieldSource": "Source",
3137
+ "panels.market.add.install": "Install",
3138
+ "panels.market.add.installing": "Installing…",
3139
+ "panels.market.add.cancel": "Cancel install",
3140
+ "panels.market.add.close": "Close",
3141
+ "panels.market.add.retry": "Retry",
3142
+ "panels.market.add.changeSource": "Change source",
3143
+ "panels.market.add.approveBuilds": "Allow these scripts and retry",
3144
+ "panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
3145
+ "panels.market.add.doneApplied": "Installed and live.",
3146
+ "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
3147
+ "panels.market.add.restartWhy": "Why this needs a restart: {reason}",
3148
+ "panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
3149
+ "panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
3150
+ "panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
3151
+ "panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
3152
+ "panels.market.add.restartWhy.module-comparison": "dsh could not compare loaded plugins with their files",
3153
+ "panels.market.add.cancelled": "Cancelled.",
3154
+ "panels.market.add.failed": "Didn't work: {reason}",
3155
+ "panels.market.add.removed": "It has been removed.",
3156
+ "panels.market.add.supplyPending": "Its plugins install after you restart.",
3157
+ "panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
3158
+ "panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
3159
+ "panels.market.add.removedRestart": "Removed — restart once to finish.",
3160
+ "panels.market.add.remove": "Remove it",
3161
+ "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
3162
+ "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
3163
+ "panels.market.add.problem.notFound": "No such package on that source.",
3164
+ "panels.market.add.problem.notAPackage": "There is no package at that location.",
3165
+ "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
3166
+ "panels.market.add.problem.network": "The source is unreachable.",
3167
+ "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
3168
+ "panels.market.add.reason.invalidSpec": "the spec is not accepted",
3169
+ "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
3170
+ "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
3171
+ "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
3172
+ "panels.market.add.reason.bundleInUse": "something is still using it",
3173
+ "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
3174
+ "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
3175
+ "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
3176
+ "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
3177
+ "panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
3178
+ "panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
3179
+ "panels.market.add.reason.diskFull": "the disk is full",
3180
+ "panels.market.add.reason.permission": "no permission to write",
3181
+ "panels.market.add.reason.integrity": "the download failed its integrity check",
3182
+ "panels.market.add.reason.timeout": "no output for too long, so it was stopped",
3183
+ "panels.market.add.reason.network": "the network is unreachable",
3184
+ "panels.market.add.reason.notFound": "no such package on the source",
3185
+ "panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
3186
+ "blocker.fix.install": "Install for me",
3187
+ "blocker.fix.update": "Upgrade for me",
3188
+ "blocker.fix.running": "Running…",
3189
+ "blocker.fix.failed": "Failed: ",
3190
+ "blocker.retry": "Retry",
3191
+ "blocker.retry.running": "Retrying…",
3192
+ "blocker.copy": "Copy command",
3193
+ "blocker.market.open": "Open the module market",
3194
+ "blocker.login.title": "Sign in to {platform}",
3195
+ "blocker.login.titleGeneric": "Sign-in required",
3196
+ "blocker.login.hint": "The workbench uses your browser session; sign in once and you are done.",
3197
+ "blocker.login.go": "Go sign in",
3198
+ "blocker.login.manual": "Run `opencli coding team-current` in a terminal, finish signing in, then retry.",
3199
+ "blocker.forbidden.title": "No access to {platform}",
3200
+ "blocker.forbidden.titleGeneric": "No access",
3201
+ "blocker.forbidden.hint": "You are signed in, but this project/repo is not permitted for your account.",
3202
+ "blocker.forbidden.open": "Open permissions page",
3203
+ "blocker.timeout.hint": "The headless browser may not have started; retrying usually helps.",
3204
+ "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
3205
+ "blocker.unknown.title": "Something went wrong",
3206
+ "panels.reading": "Reading the panel setup…",
3207
+ "panels.cardBroken": "This module will not render: {unit} ({reason})",
3208
+ "panels.cardRetry": "Retry",
3209
+ "panels.empty": "No modules on the panel yet",
3210
+ "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
3211
+ "env.title": "Preparing the workbench",
3212
+ "env.checking": "Checking the runtime environment…",
3213
+ "env.installing": "Installing the missing dependency…",
3214
+ "env.failed": "One step away",
3215
+ "env.elapsed": "Waiting {seconds}s",
3216
+ "env.stepFailed.install": "install failed",
3217
+ "env.stepFailed.path": "installed but not found",
3218
+ "env.stepFailed.shell": "no shell channel",
3219
+ "env.bridge.ok": "Connected",
3220
+ "env.bridge.short": "Not connected",
3221
+ "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.",
3222
+ "env.bridge.daemon": "The background service is not running. It usually starts by itself — run the command below in your terminal first.",
3223
+ "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.",
3224
+ "env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
3225
+ "env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
3226
+ "env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
3227
+ "env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
3228
+ "env.fix.title": "How to fix it",
3229
+ "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.",
3230
+ "env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
3231
+ "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
3232
+ "env.fix.step": "Run this in a terminal, then hit Retry:",
3233
+ "env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
3234
+ "env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
3235
+ "env.fix.permission": "Permission denied: rerun with sudo, or point npm’s global directory at your home.",
3236
+ "env.fix.network": "Network unreachable: check your network or proxy, then retry.",
3237
+ "env.fix.details": "Details (for troubleshooting)",
3238
+ "env.retry": "Retry",
3239
+ "env.copyCommand": "Copy command",
3240
+ "env.copied": "Copied",
3241
+ "env.step.opencli": "Checking the workbench opencli",
3242
+ "env.step.codingPlugin": "Checking the coding plugin",
3243
+ "env.step.bridge": "Checking the browser bridge",
3244
+ "env.step.warm": "Warming up site sessions",
3245
+ "env.warm.done": "{n} site(s) warmed up",
3246
+ "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
3247
+ "env.unit.failed": "This module cannot start",
3248
+ "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
3249
+ "env.unit.missingPlugin": "This module is not ready yet",
3250
+ "env.unit.missingCommandsHint": "Updating it should fix this.",
3251
+ "env.unit.unchecked": "Cannot check: no shell channel",
3252
+ "env.unit.uncheckedHint": "The module is not the problem — the shell channel is unavailable. Restart the workbench.",
3253
+ "env.unit.missingCommands": "This module is out of date",
3254
+ "env.unit.hint": "Retry after installing; other modules are unaffected.",
3255
+ "rightbar.label": "Data panels",
3256
+ "rightbar.expand": "Expand the data panel",
3257
+ "rightbar.collapse": "Collapse the data panel",
3258
+ "rightbar.column.label": "Right column",
3259
+ "rightbar.column.workbench": "Workbench panel",
3260
+ "rightbar.column.dsh": "dsh panel",
3261
+ "rightbar.refresh": "Refresh",
3262
+ "rightbar.refreshing": "Refreshing…",
3263
+ "rightbar.updatedAt": "updated {time}",
3264
+ "rightbar.noProject": "The current session has no workspace",
3265
+ "rightbar.openPlatform": "Open on the platform",
3266
+ "coding.notARepo.title": "This workspace is not a Coding repository",
3267
+ "error.unknown": "Something went wrong",
3268
+ "board.title": "Workbench panel",
3269
+ "panel.conversation": "Conversation",
3270
+ "panels.label": "Global panels",
3271
+ "configSync.nav": "Config sync",
3272
+ "configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
3273
+ "configSync.source": "Source",
3274
+ "configSync.sourceBroken": "its config is unreadable",
3275
+ "configSync.sourceRows": "{name}: {count} rows are new or different for the workbench",
3276
+ "configSync.sourceDead": "unreadable",
3277
+ "configSync.refresh": "Read again",
3278
+ "configSync.loading": "Reading the source config…",
3279
+ "configSync.readHint": "Pick another source, or read again.",
3280
+ "configSync.tag.new": "New",
3281
+ "configSync.tag.differs": "Differs",
3282
+ "configSync.conflictNote": "Applying replaces this workbench copy with the source",
3283
+ "configSync.code.lang": "yaml",
3284
+ "configSync.code.copy": "Copy",
3285
+ "configSync.code.copied": "Copied",
3286
+ "configSync.code.wrap": "Wrap lines",
3287
+ "configSync.code.unwrap": "No wrap",
3288
+ "configSync.code.collapse": "Collapse",
3289
+ "configSync.code.collapseAria": "Collapse this row",
3290
+ "configSync.code.expandAria": "Expand the diff ({count} more lines)",
3291
+ "configSync.code.expand": "Show {count} more lines",
3292
+ "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",
3293
+ "configSync.apply": "Sync {count} selected",
3294
+ "configSync.applyNone": "Pick some rows first",
3295
+ "configSync.applying": "Writing…",
3296
+ "configSync.applied": "Written to the workbench config · applied",
3297
+ "configSync.appliedIds": "Written this time: {ids}",
3298
+ "configSync.skippedIds": "Left alone (already here): {ids}",
3299
+ "configSync.nothing": "Nothing to sync",
3300
+ "configSync.unreadable": "Cannot read {path}: {reason}",
3301
+ "configSync.noSource": "This machine has no other profile to sync from",
3302
+ "configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
3303
+ "configSync.failed": "The sync did not go through; try again.",
3304
+ "debug.workspace": "this workspace",
3305
+ "debug.status": "Debugging “{title}”",
3306
+ "debug.status.trouble": "Debugging needs your attention ({title})",
3307
+ "debug.stalled": "Debugging paused ({title})",
3308
+ "debug.act.pause": "Pause debugging",
3309
+ "debug.act.resume": "Resume debugging",
3310
+ "debug.act.stop": "Stop debugging",
3311
+ "debug.act.stop.ask": "Confirm stop",
3312
+ "debug.card.here.title": "Debugging “{title}”",
3313
+ "debug.card.here.note": "Do not switch workspaces or touch the panel",
3314
+ "debug.card.away.note": "Switch back to “{title}”",
3315
+ "debug.card.paused.note": "Paused",
3316
+ "debug.card.hidden.note": "Switch back to the Workbench panel",
3317
+ "record.waiting": "Recording handoff · your turn",
3318
+ "record.waiting.note": "Press \"Start recording\" on that page, then \"Stop recording\" when done (it will not switch you back)",
3319
+ "record.recording": "Recording",
3320
+ "record.recording.note": "Press \"Stop recording\" when done; if the bar is gone press Halt so the agent grabs it first",
3321
+ "record.recording.shots": "; to keep a shot of this moment press \"Screenshot\" on the bar ({n} taken)",
3322
+ "record.finished": "Recording finished",
3323
+ "record.finished.note": "This run is done — the agent will grab it and wrap up on its own",
3324
+ "record.act.cancel": "Cancel",
3325
+ "record.act.halt": "Halt",
3326
+ "approval.record.site": "Site",
3327
+ "approval.record.what": "Records",
3328
+ "approval.record.lands": "Lands in",
3329
+ "approval.record.noUrl": "no site given (this call gets refused)",
3330
+ "approval.record.oneAction": "one action",
3331
+ "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
3332
+ "approval.longTask.what": "Stops",
3333
+ "approval.longTask.signal": "stopping only sends an interrupt signal — how the platform-side run finishes is up to the module"
3334
+ }
3533
3335
  };
3534
3336
  //#endregion
3535
3337
  //#region ../shared/dist/i18n/merge.js
@@ -3626,18 +3428,6 @@ function insideWorkshop(root, target) {
3626
3428
  return target.startsWith(base);
3627
3429
  }
3628
3430
  /**
3629
- * 把一次探针读数归成椅面归属。
3630
- * @param probe - 探针读数。
3631
- * @param workshop - 当前工作区根路径;`null` 表示还不知道当前是哪个工作区。
3632
- * @returns 外壳不在、或板路径与工作区缺一 → `unknown`;右栏没开或没画出来 → `hidden`;板在本工作区 → `workshop`,否则 `other`。
3633
- */
3634
- function boardFactOf(probe, workshop) {
3635
- if (!probe.workbench) return "unknown";
3636
- if (!probe.bar || !probe.open || !probe.drawn) return "hidden";
3637
- if (probe.board === "" || workshop === null) return "unknown";
3638
- return insideWorkshop(workshop, probe.board) ? "workshop" : "other";
3639
- }
3640
- /**
3641
3431
  * 把探针读数归成左栏那句人话的档位。
3642
3432
  * @param probe - 探针读数。
3643
3433
  * @param workshop - 当前工作区根路径;`null` 一律 `unknown`。
@@ -3676,492 +3466,7 @@ function holdBusy(since, now, floorMs) {
3676
3466
  };
3677
3467
  }
3678
3468
  //#endregion
3679
- //#region ../shared/dist/lib/diy-debug.js
3680
- /**
3681
- * 把工具入参收成人话动作。
3682
- * @param value - 任意入参值。
3683
- * @returns `'pause'` / `'resume'` / `'stop'` 原样;别的值(含 `undefined`、多余空白、大小写不同)给 `null`,由调用方拒。
3684
- */
3685
- function parseDebugIntent(value) {
3686
- return value === "pause" || value === "resume" || value === "stop" ? value : null;
3687
- }
3688
- /**
3689
- * 调试约定的有效期(4 小时,毫秒):超过它没动静的约定算过期、当场让人。
3690
- */
3691
- var DEBUG_STALE_MS = 144e5;
3692
- function alive$1(state, now) {
3693
- if (state === null) return null;
3694
- return now - state.at <= 144e5 ? state : null;
3695
- }
3696
- function ownerOf$1(state, sessionId, now) {
3697
- const held = alive$1(state, now);
3698
- if (held === null) return "none";
3699
- return held.sessionId === sessionId ? held : "not-owner";
3700
- }
3701
- /**
3702
- * 造一份新的调试约定存储(进程内存,同一时刻只可能有一份有效约定)。
3703
- * @returns 存取口;动作成不成都在返回的 `DebugMove` 里,不抛异常。
3704
- */
3705
- function createDebugStore() {
3706
- let held = null;
3707
- const live = (now) => alive$1(held, now);
3708
- return {
3709
- live,
3710
- begin(pact) {
3711
- const current = alive$1(held, pact.now);
3712
- if (current !== null) return {
3713
- ok: false,
3714
- code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
3715
- };
3716
- const state = {
3717
- phase: "debugging",
3718
- sessionId: pact.sessionId,
3719
- workspacePath: pact.workspacePath,
3720
- title: pact.title,
3721
- board: pact.board,
3722
- unit: pact.unit,
3723
- name: pact.name,
3724
- startedAt: pact.now,
3725
- at: pact.now
3726
- };
3727
- held = state;
3728
- return {
3729
- ok: true,
3730
- state
3731
- };
3732
- },
3733
- pause(sessionId, now) {
3734
- const found = ownerOf$1(held, sessionId, now);
3735
- if (typeof found === "string") return {
3736
- ok: false,
3737
- code: found
3738
- };
3739
- if (found.phase === "paused") return {
3740
- ok: false,
3741
- code: "already-paused"
3742
- };
3743
- const state = {
3744
- ...found,
3745
- phase: "paused",
3746
- at: now
3747
- };
3748
- held = state;
3749
- return {
3750
- ok: true,
3751
- state
3752
- };
3753
- },
3754
- resume(sessionId, now) {
3755
- const found = ownerOf$1(held, sessionId, now);
3756
- if (typeof found === "string") return {
3757
- ok: false,
3758
- code: found
3759
- };
3760
- if (found.phase === "debugging") return {
3761
- ok: false,
3762
- code: "already-debugging"
3763
- };
3764
- const state = {
3765
- ...found,
3766
- phase: "debugging",
3767
- at: now
3768
- };
3769
- held = state;
3770
- return {
3771
- ok: true,
3772
- state
3773
- };
3774
- },
3775
- stop(sessionId, now) {
3776
- const found = ownerOf$1(held, sessionId, now);
3777
- if (typeof found === "string") return {
3778
- ok: false,
3779
- code: found
3780
- };
3781
- held = null;
3782
- return {
3783
- ok: true,
3784
- state: found
3785
- };
3786
- }
3787
- };
3788
- }
3789
- /**
3790
- * 「谁还占着」的一句话,用于别人来抢时说清现况。
3791
- * @param state - 当前有效的那份约定。
3792
- * @returns 形如「会话 x(自 HH:mm:ssZ 起在调试 y)」的中文串。
3793
- */
3794
- function debugOwnerText(state) {
3795
- return `会话 ${state.sessionId}(自 ${new Date(state.startedAt).toISOString().slice(11, 19)}Z 起在调试 ${state.unit})`;
3796
- }
3797
- //#endregion
3798
- //#region ../shared/dist/lib/diy-record.js
3799
- /**
3800
- * 录制约定的有效期(15 分钟,毫秒):超过它没动静的约定算过期、当场让人。
3801
- */
3802
- var RECORD_STALE_MS = 9e5;
3803
- /**
3804
- * 把工具入参收成人话动作。
3805
- * @param raw - 任意入参值。
3806
- * @returns `'peek'` / `'halt'` / `'stop'` 原样;别的值(含 `undefined`、多余空白)给 `null`,由调用方拒。
3807
- */
3808
- function parseRecordIntent(raw) {
3809
- return raw === "peek" || raw === "halt" || raw === "stop" ? raw : null;
3810
- }
3811
- function alive(state, now) {
3812
- if (state === null) return null;
3813
- return now - state.at <= 9e5 ? state : null;
3814
- }
3815
- function ownerOf(state, sessionId, now) {
3816
- const held = alive(state, now);
3817
- if (held === null) return "none";
3818
- return held.sessionId === sessionId ? held : "not-owner";
3819
- }
3820
- /**
3821
- * 造一份新的录制约定存储(进程内存,同一时刻只可能有一份有效约定)。
3822
- * @returns 存取口;动作成不成都在返回的 `RecordMove` 里,不抛异常。
3823
- */
3824
- function createRecordStore() {
3825
- let held = null;
3826
- const live = (now) => alive(held, now);
3827
- return {
3828
- live,
3829
- begin(pact) {
3830
- const current = alive(held, pact.now);
3831
- if (current !== null) return {
3832
- ok: false,
3833
- code: current.sessionId === pact.sessionId ? "already-held" : "held-by-other"
3834
- };
3835
- const state = {
3836
- phase: "armed",
3837
- sessionId: pact.sessionId,
3838
- workspace: pact.workspace,
3839
- unit: pact.unit,
3840
- name: pact.name,
3841
- url: pact.url,
3842
- title: pact.title,
3843
- action: pact.action,
3844
- expect: pact.expect,
3845
- captureFile: pact.captureFile,
3846
- startedAt: pact.now,
3847
- t0: null,
3848
- t1: null,
3849
- at: pact.now
3850
- };
3851
- held = state;
3852
- return {
3853
- ok: true,
3854
- state
3855
- };
3856
- },
3857
- started(sessionId, at, now) {
3858
- const found = ownerOf(held, sessionId, now);
3859
- if (typeof found === "string") return {
3860
- ok: false,
3861
- code: found
3862
- };
3863
- if (found.phase === "recording") return {
3864
- ok: false,
3865
- code: "already-recording"
3866
- };
3867
- if (found.phase !== "armed") return {
3868
- ok: false,
3869
- code: "not-armed"
3870
- };
3871
- const state = {
3872
- ...found,
3873
- phase: "recording",
3874
- t0: at,
3875
- at: now
3876
- };
3877
- held = state;
3878
- return {
3879
- ok: true,
3880
- state
3881
- };
3882
- },
3883
- finished(sessionId, at, now) {
3884
- const found = ownerOf(held, sessionId, now);
3885
- if (typeof found === "string") return {
3886
- ok: false,
3887
- code: found
3888
- };
3889
- if (found.phase !== "recording") return {
3890
- ok: false,
3891
- code: "not-recording"
3892
- };
3893
- const state = {
3894
- ...found,
3895
- phase: "finished",
3896
- t1: at,
3897
- at: now
3898
- };
3899
- held = state;
3900
- return {
3901
- ok: true,
3902
- state
3903
- };
3904
- },
3905
- stop(sessionId, now) {
3906
- const found = ownerOf(held, sessionId, now);
3907
- if (typeof found === "string") return {
3908
- ok: false,
3909
- code: found
3910
- };
3911
- held = null;
3912
- return {
3913
- ok: true,
3914
- state: found
3915
- };
3916
- }
3917
- };
3918
- }
3919
- /**
3920
- * 「谁还占着、在录哪个动作」的一句话,用于别人来抢时说清现况。
3921
- * @param state - 当前有效的那份约定。
3922
- * @returns 形如「会话 x(自 HH:mm:ssZ 起在录 y 的「动作」)」的中文串。
3923
- */
3924
- function recordOwnerText(state) {
3925
- const at = new Date(state.startedAt).toISOString().slice(11, 19);
3926
- return `会话 ${state.sessionId}(自 ${at}Z 起在录 ${state.unit} 的「${state.action}」)`;
3927
- }
3928
- /**
3929
- * 同一原因的连续崩溃算进同一次计数的窗口(10 分钟,毫秒)。
3930
- */
3931
- var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
3932
- /**
3933
- * 上报文本字段的截断长度(2000 字符;workspace / reason / message 共用)。
3934
- */
3935
- var PANEL_STATE_MAX_TEXT = 2e3;
3936
- var PHASES = [
3937
- "idle",
3938
- "loading",
3939
- "ready",
3940
- "error"
3941
- ];
3942
- function asRecord(value) {
3943
- return typeof value === "object" && value !== null ? value : void 0;
3944
- }
3945
- function textOf$1(value, max) {
3946
- if (typeof value !== "string") return "";
3947
- const trimmed = value.trim();
3948
- return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
3949
- }
3950
- function atOf(value) {
3951
- if (typeof value !== "number" || !Number.isFinite(value)) return null;
3952
- if (value < 0) return null;
3953
- return Math.trunc(value);
3954
- }
3955
- function errorOf(raw) {
3956
- const record = asRecord(raw);
3957
- if (record === void 0) return void 0;
3958
- const code = textOf$1(record["code"], 120);
3959
- const message = textOf$1(record["message"], PANEL_STATE_MAX_TEXT);
3960
- if (code === "" && message === "") return void 0;
3961
- return {
3962
- code: code === "" ? "unknown" : code,
3963
- message
3964
- };
3965
- }
3966
- /**
3967
- * 收一批卡片读数上报。
3968
- * @param payload - `POST` 的请求体。
3969
- * @returns 至少收到一条能认的卡片才 `ok: true`;请求体不是对象、`workspace` 为空、`cards` 不是数组,
3970
- * 或一条都认不出(`unit` / `route` / `phase` / `at` 缺一)时 `ok: false` + 中文原因;认不出的单条静默跳过。
3971
- */
3972
- function parseCardsReport(payload) {
3973
- const record = asRecord(payload);
3974
- if (record === void 0) return {
3975
- ok: false,
3976
- message: "请求体要是一个对象"
3977
- };
3978
- const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
3979
- if (workspace === "") return {
3980
- ok: false,
3981
- message: "workspace 不能是空的 —— 面板按工作区存"
3982
- };
3983
- const raw = record["cards"];
3984
- if (!Array.isArray(raw)) return {
3985
- ok: false,
3986
- message: "cards 要是一个数组"
3987
- };
3988
- const cards = [];
3989
- for (const item of raw.slice(0, 32)) {
3990
- const card = asRecord(item);
3991
- if (card === void 0) continue;
3992
- const unit = textOf$1(card["unit"], 200);
3993
- const route = textOf$1(card["route"], 400);
3994
- const phase = textOf$1(card["phase"], 20);
3995
- const at = atOf(card["at"]);
3996
- if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
3997
- const error = errorOf(card["error"]);
3998
- cards.push({
3999
- unit,
4000
- route,
4001
- phase,
4002
- at,
4003
- ...error === void 0 ? {} : { error }
4004
- });
4005
- }
4006
- if (cards.length === 0) return {
4007
- ok: false,
4008
- message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
4009
- };
4010
- return {
4011
- ok: true,
4012
- value: {
4013
- workspace,
4014
- cards
4015
- }
4016
- };
4017
- }
4018
- /**
4019
- * 收一次卡片崩溃上报。
4020
- * @param payload - `POST` 的请求体。
4021
- * @returns `workspace` / `unit` / `reason` 都不能空,缺一给 `ok: false` + 中文原因;`at` 缺省或不合法时取当前时间。
4022
- */
4023
- function parseCrashReport(payload) {
4024
- const record = asRecord(payload);
4025
- if (record === void 0) return {
4026
- ok: false,
4027
- message: "请求体要是一个对象"
4028
- };
4029
- const workspace = textOf$1(record["workspace"], PANEL_STATE_MAX_TEXT);
4030
- const unit = textOf$1(record["unit"], 200);
4031
- const reason = textOf$1(record["reason"], PANEL_STATE_MAX_TEXT);
4032
- if (workspace === "") return {
4033
- ok: false,
4034
- message: "workspace 不能是空的"
4035
- };
4036
- if (unit === "") return {
4037
- ok: false,
4038
- message: "unit 不能是空的"
4039
- };
4040
- if (reason === "") return {
4041
- ok: false,
4042
- message: "reason 不能是空的(没有原因的崩溃没法查)"
4043
- };
4044
- return {
4045
- ok: true,
4046
- value: {
4047
- workspace,
4048
- unit,
4049
- reason,
4050
- at: atOf(record["at"]) ?? Date.now()
4051
- }
4052
- };
4053
- }
4054
- /**
4055
- * 造一份面板运行态的留存(进程内存、按工作区分桶,带上面那几条上限的 LRU)。
4056
- * @returns 留存口:`cards` / `crash` 收上报,`snapshot(workspace)` 取全量;没存过的工作区(含 `null`)给一份空的。
4057
- */
4058
- function createPanelStateStore() {
4059
- const workspaces = /* @__PURE__ */ new Map();
4060
- function trim(entry, max) {
4061
- while (entry.size > max) {
4062
- const oldest = entry.keys().next();
4063
- if (oldest.done === true) return;
4064
- entry.delete(oldest.value);
4065
- }
4066
- }
4067
- function workspaceEntryOf(workspace) {
4068
- const existing = workspaces.get(workspace);
4069
- if (existing !== void 0) return existing;
4070
- const created = {
4071
- at: 0,
4072
- units: /* @__PURE__ */ new Map()
4073
- };
4074
- workspaces.set(workspace, created);
4075
- trim(workspaces, 64);
4076
- return created;
4077
- }
4078
- function unitEntryOf(entry, unit) {
4079
- const existing = entry.units.get(unit);
4080
- if (existing !== void 0) return existing;
4081
- const created = {
4082
- at: 0,
4083
- cards: /* @__PURE__ */ new Map()
4084
- };
4085
- entry.units.set(unit, created);
4086
- return created;
4087
- }
4088
- return {
4089
- cards(report) {
4090
- const entry = workspaceEntryOf(report.workspace);
4091
- for (const card of report.cards) {
4092
- const unit = unitEntryOf(entry, card.unit);
4093
- unit.cards.delete(card.route);
4094
- unit.cards.set(card.route, card);
4095
- trim(unit.cards, 12);
4096
- if (card.at > unit.at) unit.at = card.at;
4097
- if (card.at > entry.at) entry.at = card.at;
4098
- }
4099
- },
4100
- crash(report) {
4101
- const entry = workspaceEntryOf(report.workspace);
4102
- const unit = unitEntryOf(entry, report.unit);
4103
- const previous = unit.crash;
4104
- const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
4105
- unit.crash = {
4106
- unit: report.unit,
4107
- reason: report.reason,
4108
- at: report.at,
4109
- count: counted ? previous.count + 1 : 1
4110
- };
4111
- if (report.at > unit.at) unit.at = report.at;
4112
- if (report.at > entry.at) entry.at = report.at;
4113
- },
4114
- snapshot(workspace) {
4115
- if (workspace === null) return {
4116
- workspace: null,
4117
- at: 0,
4118
- units: []
4119
- };
4120
- const entry = workspaces.get(workspace);
4121
- if (entry === void 0) return {
4122
- workspace,
4123
- at: 0,
4124
- units: []
4125
- };
4126
- const units = [...entry.units.entries()].map(([unit, one]) => {
4127
- const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
4128
- const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
4129
- return {
4130
- unit,
4131
- at: one.at,
4132
- okAt,
4133
- cards,
4134
- ...one.crash === void 0 ? {} : { crash: one.crash }
4135
- };
4136
- });
4137
- units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
4138
- return {
4139
- workspace,
4140
- at: entry.at,
4141
- units
4142
- };
4143
- }
4144
- };
4145
- }
4146
- //#endregion
4147
3469
  //#region ../shared/dist/lib/text.js
4148
- /**
4149
- * 把一个值裹成 shell 里的单引号字面量(值里的单引号一并转义),保证元字符按字面量传递。
4150
- * @param value - 任意值;不是字符串的先 `String()`。
4151
- * @returns 可安全拼进 `/bin/sh -c` 的一段文本 —— 含空格 / `$()` / `;` / 通配符的值都不会被当成语法。
4152
- */
4153
- function quoteShellArg(value) {
4154
- return `'${String(value).replace(/'/g, `'\\''`)}'`;
4155
- }
4156
- /**
4157
- * 取一段文本的末尾若干行(如命令输出),顺带去掉首尾空白。
4158
- * @param text - 原文;`null` / `undefined` 当空串。
4159
- * @param lines - 最多留几行,默认 6;0 给全篇、负数从开头砍掉那么多行(都是 `slice` 语义),调用方传正数。
4160
- * @returns 末尾若干行、去首尾空行后的文本;原文行数不够就全给,空输入给空串。
4161
- */
4162
- function tailLines(text, lines = 6) {
4163
- return String(text ?? "").trim().split("\n").slice(-lines).join("\n");
4164
- }
4165
3470
  function candidateStarts(raw) {
4166
3471
  const starts = [];
4167
3472
  for (let index = 0; index < raw.length; index += 1) {
@@ -4215,202 +3520,6 @@ function excerpt(text, limit = 80) {
4215
3520
  return `${flat.slice(0, limit).trimEnd()}…`;
4216
3521
  }
4217
3522
  //#endregion
4218
- //#region ../shared/dist/index.js
4219
- var dist_exports = /* @__PURE__ */ __exportAll({
4220
- ACTIONS_PREFIX: () => ACTIONS_PREFIX,
4221
- API_PREFIX: () => API_PREFIX,
4222
- ActivityAction: () => ActivityAction,
4223
- ActivityBlock: () => ActivityBlock,
4224
- ActivityLine: () => ActivityLine,
4225
- ApprovalDetail: () => ApprovalDetail,
4226
- ApprovalPlan: () => ApprovalPlan,
4227
- CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
4228
- CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
4229
- Card: () => Card,
4230
- CardAnchor: () => CardAnchor,
4231
- CardBoundary: () => CardBoundary,
4232
- CardHead: () => CardHead,
4233
- CenteredState: () => CenteredState,
4234
- ChoiceGroup: () => ChoiceGroup,
4235
- Component: () => Component,
4236
- DEBUG_STALE_MS: () => DEBUG_STALE_MS,
4237
- DECLARATION_KEYS: () => DECLARATION_KEYS,
4238
- DECLARATION_REQUIRED_KEYS: () => DECLARATION_REQUIRED_KEYS,
4239
- DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
4240
- DIY_DEBUG_ACT_PATH: () => DIY_DEBUG_ACT_PATH,
4241
- DIY_DEBUG_PATH: () => DIY_DEBUG_PATH,
4242
- DIY_DEBUG_SERVICE: () => DIY_DEBUG_SERVICE,
4243
- DIY_RECORD_ACT_PATH: () => DIY_RECORD_ACT_PATH,
4244
- DIY_RECORD_PATH: () => DIY_RECORD_PATH,
4245
- DIY_RECORD_SERVICE: () => DIY_RECORD_SERVICE,
4246
- EVENTS_PATH: () => EVENTS_PATH,
4247
- EmptyState: () => EmptyState,
4248
- FACT_SCOPE_SUFFIX: () => "*",
4249
- Field: () => Field,
4250
- Form: () => Form,
4251
- FormActions: () => FormActions,
4252
- FormRow: () => FormRow,
4253
- FormRows: () => FormRows,
4254
- Fragment: () => Fragment,
4255
- GIT_TIMEOUT_MS: () => GIT_TIMEOUT_MS,
4256
- HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
4257
- INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
4258
- IconBrandMark: () => IconBrandMark,
4259
- IconConversation: () => IconConversation,
4260
- IconModuleMark: () => IconModuleMark,
4261
- IconModules: () => IconModules,
4262
- IconNpm: () => IconNpm,
4263
- IconOpencli: () => IconOpencli,
4264
- IconPanelScreen: () => IconPanelScreen,
4265
- LOCALES: () => LOCALES,
4266
- LOCALE_NS: () => LOCALE_NS,
4267
- LONG_TASK_IDLE_MS: () => LONG_TASK_IDLE_MS,
4268
- LONG_TASK_POLL_MS: () => LONG_TASK_POLL_MS,
4269
- LONG_TASK_STOP_ARM_MS: () => LONG_TASK_STOP_ARM_MS,
4270
- Link: () => Link,
4271
- LongTaskRow: () => LongTaskRow,
4272
- MIN_BUSY_MS: () => 500,
4273
- Note: () => Note,
4274
- OPENCLI_MAX_CONCURRENT: () => 4,
4275
- OPENCLI_PIN: () => OPENCLI_PIN,
4276
- OPENCLI_TIMEOUT_MS: () => OPENCLI_TIMEOUT_MS,
4277
- PANELS_SERVICE: () => PANELS_SERVICE,
4278
- PANEL_LIST_LIMIT: () => 50,
4279
- PANEL_POLL_MS: () => PANEL_POLL_MS,
4280
- PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
4281
- PANEL_STATE_MAX_CARDS: () => 12,
4282
- PANEL_STATE_MAX_REPORTS: () => 32,
4283
- PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
4284
- PANEL_STATE_MAX_UNITS: () => 64,
4285
- PANEL_STATE_PATH: () => PANEL_STATE_PATH,
4286
- PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
4287
- PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
4288
- PLUGIN_ID: () => PLUGIN_ID,
4289
- PREFS_PREFIX: () => PREFS_PREFIX,
4290
- PROBE_TTL_MS: () => PROBE_TTL_MS,
4291
- PROVISION_PREFIX: () => PROVISION_PREFIX,
4292
- RECORD_STALE_MS: () => RECORD_STALE_MS,
4293
- RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
4294
- RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
4295
- Row: () => Row,
4296
- Rows: () => Rows,
4297
- SESSION_PROJECTIONS_SERVICE: () => SESSION_PROJECTIONS_SERVICE,
4298
- STORAGE_KEY_PROJECT: () => STORAGE_KEY_PROJECT,
4299
- STORAGE_KEY_RIGHTBAR: () => STORAGE_KEY_RIGHTBAR,
4300
- STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
4301
- STORAGE_KEY_RIGHTBAR_WIDTH: () => STORAGE_KEY_RIGHTBAR_WIDTH,
4302
- SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
4303
- SaveBar: () => SaveBar,
4304
- SelectField: () => SelectField,
4305
- SettingsSection: () => SettingsSection,
4306
- SkeletonRows: () => SkeletonRows,
4307
- Spinner: () => Spinner,
4308
- Stack: () => Stack,
4309
- StateBlock: () => StateBlock,
4310
- TextField: () => TextField,
4311
- UNITS_SERVICE: () => UNITS_SERVICE,
4312
- VERSION_CHECK_TIMEOUT_MS: () => VERSION_CHECK_TIMEOUT_MS,
4313
- VERSION_CHECK_TTL_MS: () => VERSION_CHECK_TTL_MS,
4314
- WARM_TIMEOUT_MS: () => WARM_TIMEOUT_MS,
4315
- WORKBENCH_API_VERSION: () => 1,
4316
- apiGet: () => apiGet,
4317
- apiPost: () => apiPost,
4318
- blockerActionLabel: () => blockerActionLabel,
4319
- blockerOfCapability: () => blockerOfCapability,
4320
- blockerOfError: () => blockerOfError,
4321
- blockerPending: () => blockerPending,
4322
- boardFactOf: () => boardFactOf,
4323
- boardSituation: () => boardSituation,
4324
- buildMarker: () => buildMarker,
4325
- cardIdOf: () => cardIdOf,
4326
- createContext: () => createContext,
4327
- createDebugStore: () => createDebugStore,
4328
- createFactChannel: () => createFactChannel,
4329
- createPanelStateStore: () => createPanelStateStore,
4330
- createRecordStore: () => createRecordStore,
4331
- cx: () => cx,
4332
- debugOwnerText: () => debugOwnerText,
4333
- declarationProblemsOf: () => declarationProblemsOf,
4334
- decodeRef: () => decodeRef,
4335
- defaultSelectFilter: () => defaultSelectFilter,
4336
- dictionaries: () => dictionaries,
4337
- duplicateKeysOf: () => duplicateKeysOf,
4338
- en: () => en,
4339
- encodeRef: () => encodeRef,
4340
- errorReasonOf: () => errorReasonOf,
4341
- excerpt: () => excerpt,
4342
- factOfRoute: () => factOfRoute,
4343
- filterSelectOptions: () => filterSelectOptions,
4344
- firstProblemOf: () => firstProblemOf,
4345
- formActionsOf: () => formActionsOf,
4346
- formFirstProblemOf: () => formFirstProblemOf,
4347
- formProblemsOf: () => formProblemsOf,
4348
- formRowsOf: () => formRowsOf,
4349
- formSubmitOf: () => formSubmitOf,
4350
- formValuesOf: () => formValuesOf,
4351
- gateOf: () => gateOf,
4352
- h: () => h,
4353
- hasEnvSupply: () => hasEnvSupply,
4354
- holdBusy: () => holdBusy,
4355
- insideWorkshop: () => insideWorkshop,
4356
- isFactScope: () => isFactScope,
4357
- longTaskDot: () => longTaskDot,
4358
- longTaskPollMs: () => longTaskPollMs,
4359
- longTaskRunsOf: () => longTaskRunsOf,
4360
- longTaskStopPress: () => longTaskStopPress,
4361
- longTaskStopStage: () => longTaskStopStage,
4362
- markerBody: () => markerBody,
4363
- mergeMessages: () => mergeMessages,
4364
- mergeMessagesSkipping: () => mergeMessagesSkipping,
4365
- parseCardsReport: () => parseCardsReport,
4366
- parseCrashReport: () => parseCrashReport,
4367
- parseDebugIntent: () => parseDebugIntent,
4368
- parseFactFrame: () => parseFactFrame,
4369
- parseJsonLoose: () => parseJsonLoose,
4370
- parseLocalTimestamp: () => parseLocalTimestamp,
4371
- parseMarkers: () => parseMarkers,
4372
- parseRecordIntent: () => parseRecordIntent,
4373
- probeKeyOf: () => probeKeyOf,
4374
- quoteShellArg: () => quoteShellArg,
4375
- readDeclaration: () => readDeclaration,
4376
- readFlag: () => readFlag,
4377
- readText: () => readText,
4378
- recordOwnerText: () => recordOwnerText,
4379
- relativeTime: () => relativeTime,
4380
- relativeTimeAgo: () => relativeTimeAgo,
4381
- relativeTimeBucket: () => relativeTimeBucket,
4382
- relativeTimeCompact: () => relativeTimeCompact,
4383
- reportDuplicateKeys: () => reportDuplicateKeys,
4384
- revealFirstProblem: () => revealFirstProblem,
4385
- runsRouteOf: () => runsRouteOf,
4386
- scopePrefixOf: () => scopePrefixOf,
4387
- searchTextOf: () => searchTextOf,
4388
- selectCursorValue: () => selectCursorValue,
4389
- selectEntries: () => selectEntries,
4390
- selectLoadingNode: () => selectLoadingNode,
4391
- selectTriggerNode: () => selectTriggerNode,
4392
- shortenPath: () => shortenPath,
4393
- splitBlocker: () => splitBlocker,
4394
- stepSelectCursor: () => stepSelectCursor,
4395
- stopRouteOf: () => stopRouteOf,
4396
- tailLines: () => tailLines,
4397
- unitFactScope: () => unitFactScope,
4398
- useCallback: () => useCallback,
4399
- useContext: () => useContext,
4400
- useEffect: () => useEffect,
4401
- useLayoutEffect: () => useLayoutEffect,
4402
- useMemo: () => useMemo,
4403
- useRef: () => useRef,
4404
- useState: () => useState,
4405
- useSyncExternalStore: () => useSyncExternalStore,
4406
- visibleFieldsOf: () => visibleFieldsOf,
4407
- writeFlag: () => writeFlag,
4408
- writeOutcomeOf: () => writeOutcomeOf,
4409
- writeRoute: () => writeRoute,
4410
- writeText: () => writeText,
4411
- zh: () => zh
4412
- });
4413
- //#endregion
4414
3523
  //#region src/shared/components/Tip.tsx
4415
3524
  /**
4416
3525
  * dsh `Tooltip` 的外壳默认值版:说明统一按右栏习惯(`bottom` / `end` / `gap 6` / 挂 body)来,其余 prop 原样转给 `Tooltip`。
@@ -4583,7 +3692,7 @@ function setProbe(next) {
4583
3692
  var CAPABILITY_FACT = "capability";
4584
3693
  var shared = null;
4585
3694
  var current$1 = null;
4586
- var listeners$4 = /* @__PURE__ */ new Set();
3695
+ var listeners$5 = /* @__PURE__ */ new Set();
4587
3696
  /**
4588
3697
  * 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
4589
3698
  */
@@ -4594,9 +3703,9 @@ function capabilityValue() {
4594
3703
  * 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
4595
3704
  */
4596
3705
  function subscribeCapabilities(listener) {
4597
- listeners$4.add(listener);
3706
+ listeners$5.add(listener);
4598
3707
  return () => {
4599
- listeners$4.delete(listener);
3708
+ listeners$5.delete(listener);
4600
3709
  };
4601
3710
  }
4602
3711
  /**
@@ -4610,7 +3719,7 @@ function setCapabilities(next, rechecked = false) {
4610
3719
  });
4611
3720
  if (next === current$1) return;
4612
3721
  current$1 = next;
4613
- for (const listener of [...listeners$4]) listener();
3722
+ for (const listener of [...listeners$5]) listener();
4614
3723
  }
4615
3724
  /**
4616
3725
  * 一次强探开始:点亮“正在探”;已经在探就跳过。
@@ -4782,7 +3891,7 @@ var devSurface = {
4782
3891
  //#endregion
4783
3892
  //#region src/app/layouts/panel-hint.ts
4784
3893
  var hints = /* @__PURE__ */ new Map();
4785
- var listeners$3 = /* @__PURE__ */ new Set();
3894
+ var listeners$4 = /* @__PURE__ */ new Set();
4786
3895
  function sameHint(left, right) {
4787
3896
  if (left === null || right === null) return left === right;
4788
3897
  if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
@@ -4794,15 +3903,15 @@ function publishPanelHint(id, hint) {
4794
3903
  if (sameHint(hints.get(id) ?? null, hint)) return;
4795
3904
  if (hint === null) hints.delete(id);
4796
3905
  else hints.set(id, hint);
4797
- for (const listener of [...listeners$3]) listener();
3906
+ for (const listener of [...listeners$4]) listener();
4798
3907
  }
4799
3908
  function panelHintOf(id) {
4800
3909
  return id === null ? null : hints.get(id) ?? null;
4801
3910
  }
4802
3911
  function subscribePanelHints(listener) {
4803
- listeners$3.add(listener);
3912
+ listeners$4.add(listener);
4804
3913
  return () => {
4805
- listeners$3.delete(listener);
3914
+ listeners$4.delete(listener);
4806
3915
  };
4807
3916
  }
4808
3917
  function usePanelHint(id) {
@@ -5302,23 +4411,31 @@ function isProblem(row) {
5302
4411
  function isRestart(row) {
5303
4412
  return row.state === "inactive" || row.state === "pending-restart";
5304
4413
  }
5305
- function awaitsRestart(input) {
5306
- const loaded = new Set(input.manifests.map((manifest) => manifest.id));
5307
- return (input.installed ?? []).some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
4414
+ function awaitsRestart(manifests, installed) {
4415
+ const loaded = new Set(manifests.map((manifest) => manifest.id));
4416
+ return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
5308
4417
  }
4418
+ /**
4419
+ * 左栏市场入口那枚徽标这一刻该说什么:`problem`(模块异常)> `restart`(重启后生效)> `updates`(有新版本),
4420
+ * 都没有就 `null`。读法与市场页同一份数据、同一套造行函数。
4421
+ * `busy` 里的单元(正被市场自己更新/卸载的那一单元)当它不在名单里:更新是「先卸再装」,
4422
+ * 卸的那一半会让它从名册里消失,不排掉就会在跑的过程中报一次假的「重启后生效」。
4423
+ */
5309
4424
  function marketHintOf(input) {
5310
- const marketable = marketCatalog(input.manifests, input.installable);
4425
+ const busy = input.busy ?? /* @__PURE__ */ new Set();
4426
+ const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
4427
+ const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
5311
4428
  const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
5312
4429
  const listed = new Set(catalog.map((row) => row.id));
5313
4430
  const self = workbenchRow(input.workbench);
5314
4431
  const rows = [
5315
4432
  ...catalog,
5316
- ...installedRows(input.installed ?? [], input.manifests, listed),
4433
+ ...installedRows(installed, input.manifests, listed),
5317
4434
  ...installedPluginRows(input.plugins ?? []),
5318
4435
  ...self === void 0 ? [] : [self]
5319
4436
  ];
5320
4437
  const problem = rows.some(isProblem);
5321
- const restart = rows.some(isRestart) || awaitsRestart(input);
4438
+ const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
5322
4439
  const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
5323
4440
  const more = [];
5324
4441
  if (problem) {
@@ -5345,6 +4462,81 @@ function marketHintOf(input) {
5345
4462
  return null;
5346
4463
  }
5347
4464
  //#endregion
4465
+ //#region src/app/layouts/rightbar/market-busy.ts
4466
+ var listeners$3 = /* @__PURE__ */ new Set();
4467
+ var published = /* @__PURE__ */ new Map();
4468
+ var live$2 = /* @__PURE__ */ new Set();
4469
+ var timer$1;
4470
+ /**
4471
+ * 一条「市场自己正在动它」的事实最多认多久(毫秒):从发布那一刻起算,到点自动撤。
4472
+ * 取的是工作台那一跳同一条窗口 —— 一次替换最长等这么久;正常落地会由发布方先撤掉。
4473
+ */
4474
+ var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
4475
+ /**
4476
+ * 这一刻哪些单元算「正在被动」:发布过、且没到 {@link MARKET_BUSY_MS} 的那些 id。
4477
+ * 给纯函数与判据用;React 里读 {@link useMarketBusy}(同一份,只是走订阅)。
4478
+ */
4479
+ function marketBusyIds() {
4480
+ return live$2;
4481
+ }
4482
+ /**
4483
+ * 发布「哪几个单元正被市场自己动」(每次整体替换):点下去那一刻发,落地/失败后发空数组。
4484
+ * 同一个 id 连续发布不会顺延它的期限;空数组等于全撤。
4485
+ */
4486
+ function publishMarketBusy(ids) {
4487
+ const now = Date.now();
4488
+ const next = /* @__PURE__ */ new Map();
4489
+ for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
4490
+ published = next;
4491
+ refresh(now);
4492
+ }
4493
+ /**
4494
+ * 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
4495
+ */
4496
+ function subscribeMarketBusy(listener) {
4497
+ listeners$3.add(listener);
4498
+ return () => {
4499
+ listeners$3.delete(listener);
4500
+ };
4501
+ }
4502
+ /**
4503
+ * 组件里读「正被市场自己动的单元」:返回的集合在两次通知之间是同一份引用,可以直接进渲染。
4504
+ */
4505
+ function useMarketBusy() {
4506
+ return useSyncExternalStore(subscribeMarketBusy, marketBusyIds);
4507
+ }
4508
+ /**
4509
+ * 把「市场正在动哪个单元」挂到这一拍上:`id` 变了就整体替换发布,`null` 等于撤。
4510
+ * 卸载那一下**不清**(更新还在跑,徽标不该改口);到 {@link MARKET_BUSY_MS} 由自己到期兜底。
4511
+ */
4512
+ function usePublishMarketBusy(id) {
4513
+ useEffect(() => {
4514
+ publishMarketBusy(id === null ? [] : [id]);
4515
+ }, [id]);
4516
+ }
4517
+ function sameSet(left, right) {
4518
+ if (left.size !== right.size) return false;
4519
+ for (const id of left) if (!right.has(id)) return false;
4520
+ return true;
4521
+ }
4522
+ function schedule(now) {
4523
+ if (timer$1 !== void 0) clearTimeout(timer$1);
4524
+ timer$1 = void 0;
4525
+ let soonest = Number.POSITIVE_INFINITY;
4526
+ for (const at of published.values()) soonest = Math.min(soonest, at);
4527
+ if (soonest === Number.POSITIVE_INFINITY) return;
4528
+ timer$1 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
4529
+ }
4530
+ function refresh(now) {
4531
+ for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
4532
+ const next = new Set(published.keys());
4533
+ if (!sameSet(live$2, next)) {
4534
+ live$2 = next;
4535
+ for (const listener of [...listeners$3]) listener();
4536
+ }
4537
+ schedule(now);
4538
+ }
4539
+ //#endregion
5348
4540
  //#region src/shared/hooks/use-host-write.ts
5349
4541
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
5350
4542
  /**
@@ -6279,6 +5471,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
6279
5471
  const removing = removingIdOf(pending, failed);
6280
5472
  const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
6281
5473
  const pinned = pinnedRowOf(pending, steady.held);
5474
+ usePublishMarketBusy(heldIdOf(pending, steady.held));
6282
5475
  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);
6283
5476
  const pendingRow = pendingRowOf({
6284
5477
  pending,
@@ -6362,7 +5555,18 @@ function visiblePendingKind(kind) {
6362
5555
  default: return;
6363
5556
  }
6364
5557
  }
6365
- function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
5558
+ var NO_IDS$1 = /* @__PURE__ */ new Set();
5559
+ /**
5560
+ * 把一条会话读成行上要的那几格。
5561
+ * @param summary 会话摘要。
5562
+ * @param statusById 会话状态表。
5563
+ * @param list 会话快照(子代理花名册在这里)。
5564
+ * @param pinnedIds 置顶的那些。
5565
+ * @param archivedIds 归档的那些。
5566
+ * @param longTaskIds 有长任务在跑的那些会话(外壳那条读口按“这趟是谁起的”算出来的);不给就是都没有。
5567
+ * @returns 行模型;`longTask` 为真表示这条会话起的某趟长任务还在跑(它自己那一轮可能早结束了)。
5568
+ */
5569
+ function sessionNode(summary, statusById, list, pinnedIds, archivedIds, longTaskIds = NO_IDS$1) {
6366
5570
  const status = statusById.get(summary.id);
6367
5571
  const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
6368
5572
  let runningSubagentCount = 0;
@@ -6377,6 +5581,7 @@ function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
6377
5581
  blank: summary.blank,
6378
5582
  running: status?.running ?? summary.running,
6379
5583
  runningSubagentCount,
5584
+ longTask: longTaskIds.has(summary.id),
6380
5585
  completed: status?.completionUnread === true,
6381
5586
  pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
6382
5587
  updatedAt: summary.updatedAt,
@@ -6388,6 +5593,10 @@ function sessionStatuses(node, t) {
6388
5593
  state: "ongoing",
6389
5594
  label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
6390
5595
  } : void 0;
5596
+ const longTask = {
5597
+ state: "ongoing",
5598
+ label: t("status.longTask")
5599
+ };
6391
5600
  let pending;
6392
5601
  switch (node.pendingInteraction) {
6393
5602
  case "approval":
@@ -6419,8 +5628,15 @@ function sessionStatuses(node, t) {
6419
5628
  state: "ongoing",
6420
5629
  label: t("status.running")
6421
5630
  };
6422
- return subagents === void 0 ? [primary] : [primary, subagents];
5631
+ const rest = node.longTask ? [longTask] : [];
5632
+ if (subagents === void 0) return [primary, ...rest];
5633
+ return [
5634
+ primary,
5635
+ ...rest,
5636
+ subagents
5637
+ ];
6423
5638
  }
5639
+ if (node.longTask) return subagents === void 0 ? [longTask] : [longTask, subagents];
6424
5640
  if (subagents !== void 0) return [subagents];
6425
5641
  if (node.completed) return [{
6426
5642
  state: "done",
@@ -6481,6 +5697,24 @@ function scrollEdgesOf(metrics) {
6481
5697
  }
6482
5698
  //#endregion
6483
5699
  //#region src/modules/sessions/model/attention.ts
5700
+ /**
5701
+ * 把外壳那条长任务读口交回的行折成两侧的归属:有会话可归的进 `bySession`(那一行自己亮),
5702
+ * 每一条都按它属于哪个工作区进 `byWorkspace`(没有会话可归的那些只有这一侧看得见)。
5703
+ * @param rows 还在跑的长任务;每行要有它属于哪个工作区,会话那格可以没有。
5704
+ * @returns 两侧的归属;空输入就是两侧都空。
5705
+ */
5706
+ function longTaskPresenceOf(rows) {
5707
+ const bySession = /* @__PURE__ */ new Set();
5708
+ const byWorkspace = /* @__PURE__ */ new Map();
5709
+ for (const row of rows) {
5710
+ if (row.session !== void 0) bySession.add(row.session);
5711
+ byWorkspace.set(row.workspace, (byWorkspace.get(row.workspace) ?? 0) + 1);
5712
+ }
5713
+ return {
5714
+ bySession,
5715
+ byWorkspace
5716
+ };
5717
+ }
6484
5718
  var RANK = {
6485
5719
  warning: 2,
6486
5720
  done: 1,
@@ -6506,10 +5740,10 @@ var WORDS = {
6506
5740
  done: "project.attention.state.done"
6507
5741
  };
6508
5742
  var NO_IDS = /* @__PURE__ */ new Set();
6509
- function attentionOfSession(summary, statusById, sessions) {
6510
- const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS);
5743
+ function attentionOfSession(summary, statusById, sessions, longTaskIds = NO_IDS) {
5744
+ const node = sessionNode(summary, statusById, sessions, NO_IDS, NO_IDS, longTaskIds);
6511
5745
  if (node.pendingInteraction !== void 0) return "warning";
6512
- if (node.running || node.runningSubagentCount > 0) return "ongoing";
5746
+ if (node.running || node.runningSubagentCount > 0 || node.longTask) return "ongoing";
6513
5747
  if (node.completed) return "done";
6514
5748
  }
6515
5749
  function attentionSessionIdOf(input) {
@@ -6518,7 +5752,7 @@ function attentionSessionIdOf(input) {
6518
5752
  let best;
6519
5753
  let bestRank = -1;
6520
5754
  for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
6521
- const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
5755
+ const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
6522
5756
  if (ofSession === void 0) continue;
6523
5757
  const rank = RANK[ofSession];
6524
5758
  if (best === void 0 || rank > bestRank || rank === bestRank && isLater(summary, best)) {
@@ -6542,7 +5776,7 @@ function attentionOf(input) {
6542
5776
  let tagged;
6543
5777
  let taggedCount = 0;
6544
5778
  for (const summary of sessionRows(workspace.sessionIds, input.sessions, input.archivedIds)) {
6545
- const ofSession = attentionOfSession(summary, input.statusById, input.sessions);
5779
+ const ofSession = attentionOfSession(summary, input.statusById, input.sessions, input.longTasks?.bySession);
6546
5780
  if (ofSession === void 0) continue;
6547
5781
  if (severity === void 0 || RANK[ofSession] > RANK[severity]) {
6548
5782
  severity = ofSession;
@@ -6555,6 +5789,15 @@ function attentionOf(input) {
6555
5789
  } else if (ofSession === tagged) taggedCount += 1;
6556
5790
  }
6557
5791
  }
5792
+ const longTasks = input.longTasks?.byWorkspace.get(workspace.path) ?? 0;
5793
+ if (severity === void 0 && longTasks > 0) {
5794
+ byWorkspace.set(workspace.workspaceId, {
5795
+ severity: "ongoing",
5796
+ count: longTasks,
5797
+ longTask: true
5798
+ });
5799
+ continue;
5800
+ }
6558
5801
  if (severity === void 0) continue;
6559
5802
  byWorkspace.set(workspace.workspaceId, {
6560
5803
  severity,
@@ -6583,6 +5826,7 @@ function merge(current, next) {
6583
5826
  };
6584
5827
  }
6585
5828
  function attentionLabel(attention, t) {
5829
+ if (attention.longTask === true) return t(attention.count === 1 ? "project.attention.longTask.one" : "project.attention.longTask.other", { n: attention.count });
6586
5830
  const keys = SENTENCES[attention.severity];
6587
5831
  return t(attention.count === 1 ? keys.one : keys.other, { n: attention.count });
6588
5832
  }
@@ -7340,7 +6584,8 @@ function makeMarketEntryIcon(units) {
7340
6584
  modules,
7341
6585
  installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
7342
6586
  plugins,
7343
- workbench
6587
+ workbench,
6588
+ busy: useMarketBusy()
7344
6589
  });
7345
6590
  useEffect(() => {
7346
6591
  publishPanelHint(MARKET_PANEL_ID, hint);
@@ -7948,14 +7193,17 @@ var RecordFooterAction_module_default = {
7948
7193
  //#endregion
7949
7194
  //#region src/app/layouts/sidebar/RecordFooterAction.tsx
7950
7195
  function recordFooterView(state, t) {
7951
- if (state.phase === "recording") return {
7952
- label: t("record.recording"),
7953
- note: t("record.recording.note"),
7954
- acts: [{
7955
- intent: "halt",
7956
- label: t("record.act.halt")
7957
- }]
7958
- };
7196
+ if (state.phase === "recording") {
7197
+ const taken = state.shots === void 0 ? 0 : state.shots.length;
7198
+ return {
7199
+ label: t("record.recording"),
7200
+ note: taken === 0 ? t("record.recording.note") : `${t("record.recording.note")}${t("record.recording.shots", { n: taken })}`,
7201
+ acts: [{
7202
+ intent: "halt",
7203
+ label: t("record.act.halt")
7204
+ }]
7205
+ };
7206
+ }
7959
7207
  if (state.phase === "finished") return {
7960
7208
  label: t("record.finished"),
7961
7209
  note: t("record.finished.note"),
@@ -8648,16 +7896,21 @@ function stepMark(step) {
8648
7896
  if (step.status === "failed") return "×";
8649
7897
  return "-";
8650
7898
  }
7899
+ /**
7900
+ * 每一拍轮询带什么参数:平时什么都不带(宿主那边跟着正在跑的那一轮,刚跑出 `ready` 的直接回上一次),
7901
+ * 用户按了「重试」之后的那一拍带 `hard=1`(不看新鲜度、一律重来)。首拍不再强探 —— 页面上一次
7902
+ * 刚体检过就不必再跑一轮,两页同时刷新也只有一轮。
7903
+ */
8651
7904
  function createForcePlan() {
8652
- let force = true;
7905
+ let hard = false;
8653
7906
  return {
8654
7907
  next() {
8655
- const current = force;
8656
- force = false;
8657
- return current;
7908
+ const query = hard ? { hard: 1 } : {};
7909
+ hard = false;
7910
+ return query;
8658
7911
  },
8659
7912
  again() {
8660
- force = true;
7913
+ hard = true;
8661
7914
  }
8662
7915
  };
8663
7916
  }
@@ -8859,7 +8112,7 @@ function createBootGate(ctx, options = {}) {
8859
8112
  async function poll() {
8860
8113
  if (cancelled) return;
8861
8114
  if (pinned !== null) return;
8862
- const response = await request("preflight", forcePlan.next() ? { force: 1 } : {}).catch(() => null);
8115
+ const response = await request("preflight", forcePlan.next()).catch(() => null);
8863
8116
  if (cancelled) return;
8864
8117
  if (response === null || !response.ok) {
8865
8118
  close();
@@ -10695,7 +9948,8 @@ function openPickedProject(input) {
10695
9948
  workspace: target,
10696
9949
  sessions: input.sessions,
10697
9950
  statusById: input.statusById,
10698
- archivedIds: input.archivedIds
9951
+ archivedIds: input.archivedIds,
9952
+ longTasks: input.longTasks
10699
9953
  }) ?? firstSessionIdOf(target, input.sessions, input.archivedIds);
10700
9954
  if (picked === null) input.startSession(input.workspaceId);
10701
9955
  else input.openSession(picked);
@@ -10754,6 +10008,24 @@ function WorkspaceSection({ t, wide, onNewSession }) {
10754
10008
  }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: 16 })))));
10755
10009
  }
10756
10010
  //#endregion
10011
+ //#region src/shared/hooks/use-shell-long-tasks.ts
10012
+ /**
10013
+ * 左栏那颗 loading 点读的长任务清单:**全进程还在跑的**那些(不分单元、不分工作区,每行带它属于
10014
+ * 哪个工作区、是哪个会话起的)。起 / 走一步 / 收尾宿主都会推一条事实,收到就当场重读;那个定时器
10015
+ * 只是兜底 —— 有在跑的按快档问,都闲着按慢档。
10016
+ * @returns 还在跑的长任务;读数还没回来时是空数组。
10017
+ */
10018
+ function useShellLongTasks() {
10019
+ const [tick, setTick] = useState(0);
10020
+ const runs = useApiResource("long-tasks", {}, tick).value?.runs ?? [];
10021
+ const every = longTaskPollMs(runs.length > 0);
10022
+ useEffect(() => {
10023
+ const timer = setInterval(() => setTick((count) => count + 1), every);
10024
+ return () => clearInterval(timer);
10025
+ }, [every]);
10026
+ return runs;
10027
+ }
10028
+ //#endregion
10757
10029
  //#region src/app/layouts/sidebar/current-workspace.ts
10758
10030
  function resolveCurrentWorkspace(input) {
10759
10031
  const ofSession = workspaceOfSession(input.items, currentSessionId(input.sessions, input.panelActive));
@@ -10763,7 +10035,7 @@ function resolveCurrentWorkspace(input) {
10763
10035
  //#endregion
10764
10036
  //#region src/app/layouts/sidebar/use-attention.ts
10765
10037
  function useSidebarAttention(input) {
10766
- const { items, sessions, statusById, archived, storedId, panelActive } = input;
10038
+ const { items, sessions, statusById, archived, storedId, panelActive, longTasks } = input;
10767
10039
  const archivedIds = useMemo(() => new Set(archived), [archived]);
10768
10040
  const current = resolveCurrentWorkspace({
10769
10041
  items,
@@ -10779,16 +10051,26 @@ function useSidebarAttention(input) {
10779
10051
  sessions,
10780
10052
  statusById,
10781
10053
  archivedIds,
10782
- currentWorkspaceId: current?.workspaceId ?? null
10054
+ currentWorkspaceId: current?.workspaceId ?? null,
10055
+ longTasks
10783
10056
  }), [
10784
10057
  items,
10785
10058
  sessions,
10786
10059
  statusById,
10787
10060
  archivedIds,
10788
- current
10061
+ current,
10062
+ longTasks
10789
10063
  ])
10790
10064
  };
10791
10065
  }
10066
+ /**
10067
+ * 左栏要的那份长任务归属:外壳那条读口交回「全进程还在跑的长任务」,这里折成会话侧与工作区侧。
10068
+ * @returns 两侧的归属(谁起了 / 哪个工作区里有几趟)。
10069
+ */
10070
+ function useLongTaskPresence() {
10071
+ const runs = useShellLongTasks();
10072
+ return useMemo(() => longTaskPresenceOf(runs), [runs]);
10073
+ }
10792
10074
  //#endregion
10793
10075
  //#region src/app/layouts/sidebar/PanelNav.tsx
10794
10076
  function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntry, t }) {
@@ -11302,7 +10584,7 @@ function useScrollEdges(list, rows) {
11302
10584
  }, [list, rows]);
11303
10585
  return edges;
11304
10586
  }
11305
- function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
10587
+ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
11306
10588
  const list = useSessions((state) => state);
11307
10589
  const statusById = useSessionStatus((state) => state);
11308
10590
  const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);
@@ -11329,7 +10611,7 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions,
11329
10611
  "aria-label": t("session.list.label")
11330
10612
  }, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
11331
10613
  key: row.id,
11332
- node: sessionNode(row, statusById, list, pinned, archivedSet),
10614
+ node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
11333
10615
  active: row.id === currentId,
11334
10616
  onOpen,
11335
10617
  renderSlot,
@@ -11375,13 +10657,15 @@ function Sidebar(props) {
11375
10657
  const [createFailed, setCreateFailed] = useState(false);
11376
10658
  useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
11377
10659
  useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
10660
+ const longTasks = useLongTaskPresence();
11378
10661
  const { current, archivedIds: archivedSet, attention } = useSidebarAttention({
11379
10662
  items,
11380
10663
  sessions,
11381
10664
  statusById,
11382
10665
  archived,
11383
10666
  storedId,
11384
- panelActive: activePanelId !== null
10667
+ panelActive: activePanelId !== null,
10668
+ longTasks
11385
10669
  });
11386
10670
  const pickProject = (workspaceId) => {
11387
10671
  setStoredId(workspaceId);
@@ -11393,6 +10677,7 @@ function Sidebar(props) {
11393
10677
  sessions,
11394
10678
  statusById,
11395
10679
  archivedIds: archivedSet,
10680
+ longTasks,
11396
10681
  openSession,
11397
10682
  startSession
11398
10683
  });
@@ -11471,6 +10756,7 @@ function Sidebar(props) {
11471
10756
  pinnedIds,
11472
10757
  archived,
11473
10758
  panelActive: activePanelId !== null,
10759
+ longTasks,
11474
10760
  useSessions: props.useSessions,
11475
10761
  useSessionStatus: props.useSessionStatus,
11476
10762
  onOpen: props.openSession,
@@ -11554,17 +10840,19 @@ function useLongTask(options) {
11554
10840
  setStopping((current) => current === id ? null : current);
11555
10841
  }
11556
10842
  }, [send]);
11557
- const every = longTaskPollMs(runs.some((run) => longTaskDot(run.status) === "ongoing"), options.pollMs);
10843
+ const every = longTaskPollMs(runs.some((run) => longTaskIsLive(run.status)), options.pollMs);
11558
10844
  useEffect(() => {
11559
10845
  if (!enabled) return void 0;
11560
10846
  const timer = setInterval(() => setTick((count) => count + 1), every);
11561
10847
  return () => clearInterval(timer);
11562
10848
  }, [enabled, every]);
10849
+ const refresh = useCallback(() => setTick((count) => count + 1), []);
11563
10850
  return {
11564
10851
  runs,
11565
10852
  stop,
11566
10853
  stopping,
11567
- stopFailed: write.failed
10854
+ stopFailed: write.failed,
10855
+ refresh
11568
10856
  };
11569
10857
  }
11570
10858
  //#endregion
@@ -11775,23 +11063,80 @@ var kit = {
11775
11063
  },
11776
11064
  components: {
11777
11065
  ...BlockerState_exports,
11778
- ...dist_exports,
11779
- ...dist_exports,
11780
- ...dist_exports,
11781
- ...dist_exports,
11782
- ...dist_exports,
11783
- ...dist_exports,
11784
- ...dist_exports,
11785
- ...dist_exports,
11066
+ ActivityAction,
11067
+ ActivityBlock,
11068
+ ActivityLine,
11069
+ ApprovalDetail,
11070
+ ApprovalPlan,
11071
+ Card,
11072
+ CardAnchor,
11073
+ CardBoundary,
11074
+ CardHead,
11075
+ CenteredState,
11076
+ ChoiceGroup,
11077
+ ConfirmBar,
11078
+ EmptyState,
11079
+ Field,
11080
+ Form,
11081
+ FormActions,
11082
+ FormRow,
11083
+ FormRows,
11084
+ IconBrandMark,
11085
+ IconConversation,
11086
+ IconModuleMark,
11087
+ IconNpm,
11088
+ IconOpencli,
11089
+ IconPanelScreen,
11090
+ Link,
11091
+ LongTaskRow,
11092
+ Note,
11093
+ Row,
11094
+ Rows,
11095
+ SaveBar,
11096
+ SelectField,
11097
+ SettingsSection,
11098
+ SkeletonRows,
11099
+ Spinner,
11100
+ Stack,
11101
+ StateBlock,
11102
+ TextField,
11786
11103
  Tip
11787
11104
  },
11788
11105
  api: {
11789
- ...dist_exports,
11106
+ apiGet,
11107
+ apiPost,
11790
11108
  ...context_chips_exports
11791
11109
  },
11792
11110
  lib: {
11793
- ...dist_exports,
11794
- ...dist_exports
11111
+ longTaskIsLive,
11112
+ MIN_BUSY_MS: 500,
11113
+ blockerOfCapability,
11114
+ blockerOfError,
11115
+ cardIdOf,
11116
+ cx,
11117
+ defaultSelectFilter,
11118
+ duplicateKeysOf,
11119
+ errorReasonOf,
11120
+ excerpt,
11121
+ filterSelectOptions,
11122
+ firstProblemOf,
11123
+ formFirstProblemOf,
11124
+ formValuesOf,
11125
+ holdBusy,
11126
+ parseJsonLoose,
11127
+ parseLocalTimestamp,
11128
+ readText,
11129
+ relativeTime,
11130
+ relativeTimeAgo,
11131
+ relativeTimeBucket,
11132
+ relativeTimeCompact,
11133
+ revealFirstProblem,
11134
+ searchTextOf,
11135
+ selectCursorValue,
11136
+ selectEntries,
11137
+ shortenPath,
11138
+ stepSelectCursor,
11139
+ writeText
11795
11140
  }
11796
11141
  };
11797
11142
  function messagesOf(units) {
@@ -11800,7 +11145,7 @@ function messagesOf(units) {
11800
11145
  ...face.messages === void 0 ? {} : { messages: face.messages }
11801
11146
  }));
11802
11147
  }
11803
- var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
11148
+ 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*/";
11804
11149
  function workbenchCss() {
11805
11150
  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}`;
11806
11151
  }