@dsh-workbench/core 0.3.6 → 0.3.7

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