@dsh-workbench/core 0.1.2 → 0.1.4

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 (50) hide show
  1. package/README.md +2 -2
  2. package/client.js +2266 -730
  3. package/dist/client/client.body.js +2265 -729
  4. package/dist/client/index.js +2258 -722
  5. package/dist/host/index.js +790 -2064
  6. package/dist/types/app/client.d.ts +776 -69
  7. package/dist/types/app/layouts/market/AddModuleDialog.d.ts +8 -0
  8. package/dist/types/app/layouts/market/AddModuleForm.d.ts +6 -0
  9. package/dist/types/app/layouts/market/AddModuleRegistry.d.ts +6 -0
  10. package/dist/types/app/layouts/market/AddModuleStages.d.ts +14 -0
  11. package/dist/types/app/layouts/market/SafetyNote.d.ts +4 -0
  12. package/dist/types/app/layouts/market/__tests__/add-module-mock.test.d.ts +1 -0
  13. package/dist/types/app/layouts/market/__tests__/add-module-text.test.d.ts +1 -0
  14. package/dist/types/app/layouts/market/add-module-mock.d.ts +14 -0
  15. package/dist/types/app/layouts/market/add-module-text.d.ts +31 -0
  16. package/dist/types/app/layouts/market/panel.d.ts +2 -2
  17. package/dist/types/app/layouts/market/use-add-module.d.ts +48 -0
  18. package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -1
  19. package/dist/types/app/layouts/rightbar/__tests__/market-installed.test.d.ts +1 -0
  20. package/dist/types/app/layouts/rightbar/market-mock.d.ts +11 -4
  21. package/dist/types/app/layouts/rightbar/market-rows.d.ts +25 -5
  22. package/dist/types/app/units/__tests__/fixture-unit-mock.test.d.ts +1 -0
  23. package/dist/types/app/units/fixture-unit-mock.d.ts +5 -0
  24. package/dist/types/app/units/registry.d.ts +2 -1
  25. package/dist/types/modules/panels/__tests__/market-bundle.test.d.ts +1 -0
  26. package/dist/types/modules/panels/__tests__/market-dispatch.test.d.ts +1 -0
  27. package/dist/types/modules/panels/model/handoff.d.ts +1 -1
  28. package/dist/types/modules/panels/model/market-dependency.d.ts +2 -1
  29. package/dist/types/modules/panels/model/market-dispatch.d.ts +19 -1
  30. package/dist/types/modules/panels/model/market.d.ts +39 -0
  31. package/dist/types/shared/api/bundle-install.d.ts +97 -0
  32. package/dist/types/shared/api/dsh-plugins.d.ts +11 -0
  33. package/dist/types/shared/api/dsh-plugins.test.d.ts +1 -0
  34. package/dist/types/shared/api/host/bundle-manager.d.ts +10 -0
  35. package/dist/types/shared/api/host/bundle-manager.test.d.ts +1 -0
  36. package/dist/types/shared/api/host/bundle-routes.d.ts +5 -0
  37. package/dist/types/shared/api/host/bundle-routes.test.d.ts +1 -0
  38. package/dist/types/shared/api/host/context-inject.d.ts +1 -1
  39. package/dist/types/shared/api/host/dsh-plugins.d.ts +5 -0
  40. package/dist/types/shared/api/host/dsh-plugins.test.d.ts +1 -0
  41. package/dist/types/shared/api/host/installed-module.d.ts +24 -0
  42. package/dist/types/shared/api/host/installed-module.test.d.ts +1 -0
  43. package/dist/types/shared/api/host/mount-units.d.ts +1 -1
  44. package/dist/types/shared/api/host/probe-libs.d.ts +1 -1
  45. package/dist/types/shared/components/PanelFoot.d.ts +7 -0
  46. package/dist/types/shared/components/Tip.d.ts +4 -0
  47. package/dist/types/shared/hooks/bundle-queries.d.ts +5 -0
  48. package/docs/OPERATIONS.md +10 -2
  49. package/package.json +4 -3
  50. package/dist/types/app/layouts/rightbar/MarketFreshLines.d.ts +0 -5
@@ -11,6 +11,7 @@ var __exportAll = (all, no_symbols) => {
11
11
  return target;
12
12
  };
13
13
  //#endregion
14
+ let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
14
15
  //#region ../shared/dist/lib/ui.js
15
16
  function cx(...parts) {
16
17
  return parts.filter(Boolean).join(" ");
@@ -349,10 +350,12 @@ function writeOutcomeOf(response, networkText) {
349
350
  const own = typeof box.error?.message === "string" && box.error.message !== "" ? box.error.message : void 0;
350
351
  const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
351
352
  const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
353
+ const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
352
354
  return {
353
355
  ok: false,
354
356
  message: own ?? fallback,
355
- ...detail === void 0 ? {} : { detail }
357
+ ...detail === void 0 ? {} : { detail },
358
+ ...helpUrl === void 0 ? {} : { helpUrl }
356
359
  };
357
360
  }
358
361
  return {
@@ -518,235 +521,43 @@ function ApprovalDetail(props) {
518
521
  input,
519
522
  t
520
523
  });
521
- return command === "" ? null : h("code", { className: "wb-approvalCommand" }, command);
522
- }
523
- //#endregion
524
- //#region ../shared/dist/components/icons.js
525
- function Shell({ size, strokeWidth = 1, viewBox = "0 0 16 16", children }) {
526
- return h("svg", {
527
- width: size,
528
- height: size,
529
- viewBox,
530
- fill: "none",
531
- xmlns: "http://www.w3.org/2000/svg",
532
- "aria-hidden": "true",
533
- strokeWidth,
534
- style: { display: "block" }
535
- }, children);
536
- }
537
- function IconPanelLeft({ size = 16 }) {
538
- return h(Shell, { size }, h("path", {
539
- d: "M13.5 1.5H2.5C1.94772 1.5 1.5 1.94772 1.5 2.5V13.5C1.5 14.0523 1.94772 14.5 2.5 14.5H13.5C14.0523 14.5 14.5 14.0523 14.5 13.5V2.5C14.5 1.94772 14.0523 1.5 13.5 1.5Z",
540
- stroke: "currentColor"
541
- }), h("path", {
542
- d: "M5.5 1.5V14.5",
543
- stroke: "currentColor"
544
- }));
545
- }
546
- function IconFolder({ size = 16 }) {
547
- return h(Shell, { size }, h("path", {
548
- d: "M1.50439 3.11059C1.50439 2.55831 1.95211 2.1106 2.50439 2.1106H5.43389C5.67773 2.1106 5.91318 2.19969 6.09593 2.36113L7.71649 3.79265C7.89924 3.95409 8.1347 4.04319 8.3785 4.04319H13.4958C14.0481 4.04319 14.4958 4.4909 14.4958 5.04319V12.8894C14.4958 13.4417 14.0481 13.8894 13.4958 13.8894H2.50439C1.95211 13.8894 1.50439 13.4417 1.50439 12.8894V4.04319V3.11059Z",
549
- stroke: "currentColor"
550
- }), h("path", {
551
- d: "M3.63501 7.66614H12.3647",
552
- stroke: "currentColor"
553
- }));
554
- }
555
- function IconFolderOpen({ size = 16 }) {
556
- return h(Shell, { size }, h("path", {
557
- d: "M2.55912 7.93683C2.67584 7.49906 3.0723 7.19446 3.52536 7.19446H13.6491C14.3061 7.19446 14.7846 7.81725 14.6153 8.45209L13.4411 12.856C13.3244 13.2938 12.9279 13.5984 12.4748 13.5984H2.35113C1.69411 13.5984 1.21562 12.9756 1.38489 12.3407L2.55912 7.93683Z",
558
- fill: "currentColor",
559
- opacity: .16
560
- }), h("path", {
561
- d: "M13.6491 6.69446C14.6346 6.69453 15.3522 7.62895 15.0983 8.58118L13.9245 12.9845C13.7494 13.6412 13.1539 14.0988 12.4743 14.0988H2.35126C1.36574 14.0988 0.648153 13.1643 0.902044 12.212L2.07587 7.80774C2.25102 7.15128 2.84567 6.69455 3.52509 6.69446H13.6491ZM3.52509 7.69446C3.29865 7.69455 3.10004 7.84674 3.04169 8.06555L1.86786 12.4698C1.78345 12.7872 2.02285 13.0988 2.35126 13.0988H12.4743C12.7007 13.0988 12.8992 12.9463 12.9577 12.7277L14.1325 8.32336C14.2171 8.00598 13.9776 7.69453 13.6491 7.69446H3.52509Z",
562
- fill: "currentColor"
563
- }), h("path", {
564
- d: "M4.7666 1.90137C5.13227 1.90144 5.48571 2.03525 5.75977 2.27734L7.27246 3.61328C7.36379 3.69382 7.48174 3.73828 7.60352 3.73828H12.3994C13.2276 3.73841 13.8993 4.41005 13.8994 5.23828V6.7168C13.8183 6.70327 13.735 6.69436 13.6494 6.69434H12.8994V5.23828C12.8993 4.96233 12.6754 4.73841 12.3994 4.73828H7.60352C7.23781 4.73828 6.88446 4.60438 6.61035 4.3623L5.09766 3.02637C5.00636 2.94576 4.88838 2.90144 4.7666 2.90137H2.0498C1.77366 2.90137 1.5498 3.12523 1.5498 3.40137V9.78223L0.902344 12.2119C0.648452 13.1642 1.36604 14.0986 2.35156 14.0986H2.0498C1.2214 14.0986 0.549838 13.427 0.549805 12.5986V3.40137C0.549805 2.57294 1.22138 1.90137 2.0498 1.90137H4.7666Z",
565
- fill: "currentColor"
566
- }));
567
- }
568
- function IconChevronDown({ size = 14 }) {
569
- return h(Shell, { size }, h("path", {
570
- d: "M4 6L7.29289 9.29289C7.68342 9.68342 8.31658 9.68342 8.70711 9.29289L12 6",
571
- stroke: "currentColor"
572
- }));
573
- }
574
- function IconPlus({ size = 16 }) {
575
- return h(Shell, { size }, h("path", {
576
- d: "M8 2V14",
577
- stroke: "currentColor"
578
- }), h("path", {
579
- d: "M2 8H14",
580
- stroke: "currentColor"
581
- }));
582
- }
583
- function IconEllipsis({ size = 16 }) {
584
- return h(Shell, { size }, h("path", {
585
- d: "M3 9C3.55228 9 4 8.55228 4 8C4 7.44772 3.55228 7 3 7C2.44772 7 2 7.44772 2 8C2 8.55228 2.44772 9 3 9Z",
586
- fill: "currentColor"
587
- }), h("path", {
588
- d: "M8 9C8.55228 9 9 8.55228 9 8C9 7.44772 8.55228 7 8 7C7.44772 7 7 7.44772 7 8C7 8.55228 7.44772 9 8 9Z",
589
- fill: "currentColor"
590
- }), h("path", {
591
- d: "M13 9C13.5523 9 14 8.55228 14 8C14 7.44772 13.5523 7 13 7C12.4477 7 12 7.44772 12 8C12 8.55228 12.4477 9 13 9Z",
592
- fill: "currentColor"
593
- }));
594
- }
595
- function IconSettings({ size = 16 }) {
596
- return h(Shell, { size }, h("path", {
597
- d: "M8 9.75012C8.9665 9.75012 9.75 8.96662 9.75 8.00012C9.75 7.03362 8.9665 6.25012 8 6.25012C7.0335 6.25012 6.25 7.03362 6.25 8.00012C6.25 8.96662 7.0335 9.75012 8 9.75012Z",
598
- stroke: "currentColor"
599
- }), h("path", {
600
- d: "M13.0107 7.79377C12.9505 7.89401 12.9205 7.94413 12.9205 7.99951C12.9205 8.0549 12.9505 8.10502 13.0106 8.20528L13.9849 9.83006C14.045 9.93029 14.0751 9.9804 14.0751 10.0358C14.0751 10.0911 14.045 10.1413 13.9849 10.2415L13.0037 11.8777C12.9468 11.9726 12.9184 12.0201 12.8725 12.0461C12.8267 12.072 12.7713 12.072 12.6607 12.072H10.6704C10.5598 12.072 10.5045 12.072 10.4586 12.098C10.4128 12.1239 10.3843 12.1714 10.3274 12.2662L9.33825 13.9142C9.28133 14.009 9.25287 14.0564 9.20703 14.0823C9.16118 14.1083 9.10588 14.1083 8.99529 14.1083H7.00486C6.89426 14.1083 6.83896 14.1083 6.79312 14.0823C6.74727 14.0564 6.71881 14.009 6.6619 13.9142L5.67273 12.2662C5.61581 12.1714 5.58735 12.1239 5.54151 12.098C5.49566 12.072 5.44036 12.072 5.32977 12.072H3.33945C3.2288 12.072 3.17347 12.072 3.12761 12.0461C3.08176 12.0201 3.0533 11.9726 2.9964 11.8777L2.0152 10.2415C1.9551 10.1413 1.92505 10.0911 1.92505 10.0358C1.92505 9.9804 1.9551 9.93029 2.0152 9.83006L2.98951 8.20528C3.04963 8.10502 3.07969 8.0549 3.07969 7.99951C3.07968 7.94413 3.04961 7.89401 2.98946 7.79377L2.01529 6.17011C1.95514 6.06987 1.92507 6.01975 1.92507 5.96437C1.92506 5.90899 1.95512 5.85886 2.01524 5.7586L2.9964 4.1224C3.0533 4.0275 3.08176 3.98005 3.12761 3.95408C3.17347 3.92811 3.2288 3.92811 3.33945 3.92811H5.32977C5.44036 3.92811 5.49566 3.92811 5.54151 3.90216C5.58735 3.87621 5.61581 3.82879 5.67273 3.73397L6.6619 2.08599C6.71881 1.99116 6.74727 1.94375 6.79312 1.9178C6.83896 1.89185 6.89426 1.89185 7.00486 1.89185H8.99529C9.10588 1.89185 9.16118 1.89185 9.20703 1.9178C9.25287 1.94375 9.28133 1.99116 9.33825 2.08599L10.3274 3.73397C10.3843 3.82879 10.4128 3.87621 10.4586 3.90216C10.5045 3.92811 10.5598 3.92811 10.6704 3.92811H12.6607C12.7713 3.92811 12.8267 3.92811 12.8725 3.95408C12.9184 3.98005 12.9468 4.0275 13.0037 4.1224L13.9849 5.7586C14.045 5.85886 14.0751 5.90899 14.0751 5.96437C14.0751 6.01975 14.045 6.06987 13.9849 6.17011L13.0107 7.79377Z",
601
- stroke: "currentColor",
602
- strokeMiterlimit: 10
603
- }));
604
- }
605
- function IconPin({ size = 16 }) {
606
- return h(Shell, { size }, h("path", {
607
- d: "M9.96976 1.70572L13.1554 3.93629L10.9019 8.12317L11.5158 11.605L10.7192 12.7427L2.52767 7.00693L3.3243 5.86922L6.80612 5.25528L9.96976 1.70572Z",
608
- fill: "currentColor",
609
- stroke: "currentColor",
610
- strokeLinejoin: "round"
611
- }), h("path", {
612
- d: "M6.05285 9.47511C6.27284 9.16094 6.70586 9.08458 7.02003 9.30457C7.3342 9.52455 7.41055 9.95757 7.19057 10.2717L3.98587 14.4708L3.21223 13.9291L6.05285 9.47511Z",
613
- fill: "currentColor"
614
- }));
615
- }
616
- function IconCheck({ size = 16 }) {
617
- return h(Shell, { size }, h("path", {
618
- d: "M2.25 8.5L5.49732 11.7473C5.90519 12.1552 6.57263 12.1344 6.95426 11.7018L13.75 4",
619
- stroke: "currentColor"
620
- }));
621
- }
622
- function IconNewChat({ size = 14 }) {
623
- return h(Shell, {
624
- size,
625
- strokeWidth: 1.3
626
- }, h("path", {
627
- d: "M2.37091 11.2501C1.58745 9.89288 1.32067 8.29835 1.61969 6.76006C1.91872 5.22177 2.76342 3.8433 3.99826 2.87846C5.2331 1.91362 6.77494 1.42737 8.33988 1.50925C9.90482 1.59113 11.3875 2.23562 12.5149 3.32406C13.6425 4.41269 14.3387 5.87206 14.4754 7.4334C14.612 8.99474 14.18 10.5529 13.2587 11.8209C12.3375 13.0888 10.9891 13.9813 9.46194 14.3337C8.18691 14.628 6.85895 14.5294 5.64989 14.0605C5.1712 13.8748 4.76962 13.4932 4.26534 13.3967C3.67413 13.2835 2.95257 13.5598 2.03794 14.3337",
628
- stroke: "currentColor"
629
- }), h("path", {
630
- d: "M8 5V11",
631
- stroke: "currentColor"
632
- }), h("path", {
633
- d: "M5 8H11",
634
- stroke: "currentColor"
635
- }));
636
- }
637
- function IconRefresh({ size = 16 }) {
638
- return h(Shell, { size }, h("path", {
639
- d: "M14.5001 8C14.5 9.28552 14.1188 10.5422 13.4045 11.611C12.6903 12.6799 11.6752 13.5129 10.4875 14.0049C9.29982 14.4968 7.99295 14.6255 6.73212 14.3747C5.4713 14.124 4.31314 13.505 3.4041 12.596C2.49514 11.687 1.87614 10.5288 1.62537 9.26798C1.37459 8.00716 1.50331 6.70028 1.99525 5.51261C2.48719 4.32494 3.32025 3.30981 4.3891 2.59557C5.45795 1.88134 6.71458 1.50008 8.0001 1.5C9.9001 1.5 11.7001 2.3 13.0001 3.6L14.5001 5.1",
640
- stroke: "currentColor"
641
- }), h("path", {
642
- d: "M14.4999 1.5V5.1H10.8999",
643
- stroke: "currentColor"
644
- }));
645
- }
646
- function IconRightUp({ size = 14 }) {
647
- return h(Shell, { size }, h("path", {
648
- d: "M11.7256 2.77441C12.5538 2.77469 13.2256 3.44616 13.2256 4.27441V10.1416H12.2256V4.27441C12.2256 3.99844 12.0015 3.77469 11.7256 3.77441H5.7207V2.77441H11.7256Z",
649
- fill: "currentColor"
650
- }), h("path", {
651
- d: "M2.77441 13.2255L12.3756 3.62427",
652
- stroke: "currentColor"
653
- }));
654
- }
655
- function IconConversation({ size = 16 }) {
656
- return h(Shell, {
657
- size,
658
- strokeWidth: 1.3
659
- }, h("path", {
660
- d: "M2.5 7.2c0-2.3 2.1-4.2 4.8-4.2h1.4c2.7 0 4.8 1.9 4.8 4.2s-2.1 4.2-4.8 4.2H7.5l-3.2 2v-2.3c-1.1-.8-1.8-2-1.8-3.9Z",
661
- stroke: "currentColor",
662
- strokeLinejoin: "round"
663
- }));
664
- }
665
- function IconBrandMark({ size = 24 }) {
666
- return h(Shell, {
667
- size,
668
- strokeWidth: 1.6,
669
- viewBox: "0 0 24 24"
670
- }, h("rect", {
671
- x: 3,
672
- y: 3,
673
- width: 18,
674
- height: 18,
675
- rx: 5,
676
- stroke: "currentColor"
677
- }), h("path", {
678
- d: "M8 9.5h8M8 12.5h8M8 15.5h5",
679
- stroke: "currentColor",
680
- strokeLinecap: "round"
681
- }));
682
- }
683
- function IconModules({ size = 16 }) {
684
- return h("svg", {
685
- width: size,
686
- height: size,
687
- viewBox: "0 0 16 16",
688
- fill: "none",
689
- "aria-hidden": "true"
690
- }, h("rect", {
691
- x: "2.5",
692
- y: "2.5",
693
- width: "4.6",
694
- height: "4.6",
695
- rx: "1.2",
696
- stroke: "currentColor",
697
- strokeWidth: "1.2"
698
- }), h("rect", {
699
- x: "8.9",
700
- y: "2.5",
701
- width: "4.6",
702
- height: "4.6",
703
- rx: "1.2",
704
- stroke: "currentColor",
705
- strokeWidth: "1.2"
706
- }), h("rect", {
707
- x: "2.5",
708
- y: "8.9",
709
- width: "4.6",
710
- height: "4.6",
711
- rx: "1.2",
712
- stroke: "currentColor",
713
- strokeWidth: "1.2"
714
- }), h("rect", {
715
- x: "8.9",
716
- y: "8.9",
717
- width: "4.6",
718
- height: "4.6",
719
- rx: "1.2",
720
- stroke: "currentColor",
721
- strokeWidth: "1.2"
722
- }));
524
+ if (command === "") return null;
525
+ return h(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
526
+ code: command,
527
+ className: "wb-approvalCommand",
528
+ copyLabel: t("blocker.copy"),
529
+ copiedLabel: t("env.copied")
530
+ });
723
531
  }
724
532
  //#endregion
725
533
  //#region ../shared/dist/components/CardHead.js
726
534
  function CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onToggleGear, platformHref, platform, platformTitle }) {
727
535
  const refreshLabel = refreshing ? t("rightbar.refreshing") : t("rightbar.refresh");
728
- return h("header", { className: "wb-cardHead" }, h("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 || platform === void 0 ? null : h("a", {
536
+ return h("header", { className: "wb-cardHead" }, h("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 || platform === void 0 ? null : h(_deepseek_ai_dsh_client_ui_primitives.Tooltip, { label: platformTitle ?? platform }, h("a", {
729
537
  className: "wb-iconButton wb-cardOpen",
730
538
  href: platformHref,
731
539
  target: "_blank",
732
540
  rel: "noreferrer noopener",
733
- title: platformTitle ?? platform,
734
541
  "aria-label": platform
735
- }, h(IconRightUp, { size: 14 })), h("button", {
542
+ }, h(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 14 }))), h(_deepseek_ai_dsh_client_ui_primitives.Tooltip, { label: refreshLabel }, h(_deepseek_ai_dsh_client_ui_primitives.Button, {
736
543
  type: "button",
737
- className: `wb-iconButton wb-cardRefresh${refreshing ? " wb-spinning" : ""}`,
544
+ size: "sm",
545
+ variant: "ghost",
546
+ className: `wb-cardRefresh${refreshing ? " wb-spinning" : ""}`,
738
547
  "aria-label": refreshLabel,
739
- title: refreshLabel,
740
548
  disabled: refreshing,
549
+ icon: h(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
741
550
  onClick: onRefresh
742
- }, h(IconRefresh, { size: 14 })), gear === void 0 || onToggleGear === void 0 ? null : h("button", {
551
+ })), gear === void 0 || onToggleGear === void 0 ? null : h(_deepseek_ai_dsh_client_ui_primitives.Tooltip, { label: gear }, h(_deepseek_ai_dsh_client_ui_primitives.Button, {
743
552
  type: "button",
744
- className: `wb-iconButton wb-cardGear${gearOpen === true ? " wb-iconButtonActive" : ""}`,
553
+ size: "sm",
554
+ variant: "ghost",
555
+ className: `wb-cardGear${gearOpen === true ? " wb-iconButtonActive" : ""}`,
745
556
  "aria-label": gear,
746
557
  "aria-expanded": gearOpen === true,
747
- title: gear,
558
+ icon: h(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutlineRegular, { size: 15 }),
748
559
  onClick: onToggleGear
749
- }, h(IconSettings, { size: 15 })));
560
+ })));
750
561
  }
751
562
  //#endregion
752
563
  //#region ../shared/dist/components/ChoiceGroup.js
@@ -765,59 +576,60 @@ function ChoiceGroup({ label, name, value, options, disabled, onChange }) {
765
576
  }), h("span", { className: "wb-choiceLabel" }, option.label)))));
766
577
  }
767
578
  //#endregion
768
- //#region ../shared/dist/components/StateDot.js
769
- function StateDot({ state, size }) {
770
- if (state === "ongoing") return h("svg", {
771
- className: "wb-loading",
772
- viewBox: "0 0 24 24",
773
- width: size,
774
- height: size,
775
- "aria-hidden": "true",
776
- style: { display: "block" }
777
- }, h("g", { className: "wb-loadingMotion" }, h("circle", {
778
- className: "wb-loadingTrack",
779
- cx: 12,
780
- cy: 12,
781
- r: 9.5
782
- }), h("circle", {
783
- className: "wb-loadingArc",
784
- cx: 12,
785
- cy: 12,
786
- r: 9.5
787
- })));
788
- return h("span", {
789
- className: "wb-stateDot",
790
- "data-state": state,
791
- style: {
792
- width: size,
793
- height: size
794
- },
795
- "aria-hidden": "true"
796
- });
797
- }
798
- //#endregion
799
579
  //#region ../shared/dist/components/LongTaskRow.js
800
580
  function RowLink({ href, text }) {
801
581
  return h("a", {
802
- className: "wb-linkButton wb-longTaskLink",
582
+ className: "wb-longTaskLink",
803
583
  href,
804
584
  target: "_blank",
805
585
  rel: "noreferrer noopener"
806
- }, text, h(IconRightUp, { size: 12 }));
586
+ }, text, h(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 12 }));
807
587
  }
808
588
  function LongTaskRow(props) {
589
+ const [stepsOpen, setStepsOpen] = useState(false);
590
+ const [rawOpen, setRawOpen] = useState(false);
809
591
  const failed = props.status === "failed";
810
592
  const problem = props.problem ?? "";
811
593
  const raw = (props.raw ?? "").trim();
812
594
  const steps = props.steps ?? [];
813
- return h("div", { className: "wb-longTask" }, h("p", { className: "wb-longTaskHead" }, h(StateDot, {
595
+ return h("div", { className: "wb-longTask" }, h("p", { className: "wb-longTaskHead" }, h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
814
596
  state: longTaskDot(props.status),
815
597
  size: 10
816
598
  }), h("span", { className: "wb-longTaskHeadline" }, props.headline), (props.links ?? []).map((link) => h(RowLink, {
817
599
  href: link.href,
818
600
  key: `${link.text}@${link.href}`,
819
601
  text: link.text
820
- }))), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h("details", { className: "wb-longTaskDump" }, h("summary", null, props.stepsTitle), h("pre", null, steps.join("\n"))), raw === "" || props.rawTitle === void 0 ? null : h("details", { className: "wb-longTaskDump" }, h("summary", null, props.rawTitle), h("pre", null, raw))));
602
+ }))), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
603
+ className: "wb-longTaskDump",
604
+ icon: h(_deepseek_ai_dsh_client_ui_primitives.IconFlatListOutlineRegular, { size: 14 }),
605
+ title: props.stepsTitle,
606
+ open: stepsOpen,
607
+ expandable: true,
608
+ expandOnRowClick: true,
609
+ previewChevron: true,
610
+ onToggle: () => setStepsOpen(!stepsOpen)
611
+ }, h(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
612
+ code: steps.join("\n"),
613
+ className: "wb-longTaskDump",
614
+ showHeader: props.copyLabel !== void 0,
615
+ copyLabel: props.copyLabel ?? "",
616
+ copiedLabel: props.copiedLabel ?? ""
617
+ })), raw === "" || props.rawTitle === void 0 ? null : h(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
618
+ className: "wb-longTaskDump",
619
+ icon: h(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
620
+ title: props.rawTitle,
621
+ open: rawOpen,
622
+ expandable: true,
623
+ expandOnRowClick: true,
624
+ previewChevron: true,
625
+ onToggle: () => setRawOpen(!rawOpen)
626
+ }, h(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
627
+ code: raw,
628
+ className: "wb-longTaskDump",
629
+ showHeader: props.copyLabel !== void 0,
630
+ copyLabel: props.copyLabel ?? "",
631
+ copiedLabel: props.copiedLabel ?? ""
632
+ }))));
821
633
  }
822
634
  //#endregion
823
635
  //#region ../shared/dist/components/MockStrip.js
@@ -863,19 +675,113 @@ function EmptyState({ text, icon = null, compact = false }) {
863
675
  //#endregion
864
676
  //#region ../shared/dist/components/SaveBar.js
865
677
  function SaveBar({ busy, disabled, labels, onCancel, onSave }) {
866
- return h("div", { className: "wb-formActions" }, h("button", {
678
+ return h("div", { className: "wb-formActions" }, h(_deepseek_ai_dsh_client_ui_primitives.Button, {
867
679
  type: "button",
868
- className: "wb-linkButton",
680
+ size: "sm",
681
+ variant: "ghost",
869
682
  onClick: onCancel,
870
683
  disabled: busy
871
- }, labels.cancel), h("button", {
684
+ }, labels.cancel), h(_deepseek_ai_dsh_client_ui_primitives.Button, {
872
685
  type: "button",
873
- className: "wb-primaryButton",
686
+ size: "sm",
687
+ variant: "primary",
874
688
  onClick: onSave,
875
689
  disabled: busy || disabled === true
876
690
  }, busy ? labels.saving : labels.save));
877
691
  }
878
692
  //#endregion
693
+ //#region ../shared/dist/components/TextField.js
694
+ function TextField({ invalid = false, className, ...rest }) {
695
+ return h("input", {
696
+ ...rest,
697
+ className: className === void 0 ? "wb-textField" : `wb-textField ${className}`,
698
+ "aria-invalid": invalid || void 0
699
+ });
700
+ }
701
+ //#endregion
702
+ //#region ../shared/dist/components/icons.js
703
+ function Shell({ size, strokeWidth = 1, viewBox = "0 0 16 16", children }) {
704
+ return h("svg", {
705
+ width: size,
706
+ height: size,
707
+ viewBox,
708
+ fill: "none",
709
+ xmlns: "http://www.w3.org/2000/svg",
710
+ "aria-hidden": "true",
711
+ strokeWidth,
712
+ style: { display: "block" }
713
+ }, children);
714
+ }
715
+ function IconConversation({ size = 16 }) {
716
+ return h(Shell, {
717
+ size,
718
+ strokeWidth: 1.3
719
+ }, h("path", {
720
+ d: "M2.5 7.2c0-2.3 2.1-4.2 4.8-4.2h1.4c2.7 0 4.8 1.9 4.8 4.2s-2.1 4.2-4.8 4.2H7.5l-3.2 2v-2.3c-1.1-.8-1.8-2-1.8-3.9Z",
721
+ stroke: "currentColor",
722
+ strokeLinejoin: "round"
723
+ }));
724
+ }
725
+ function IconBrandMark({ size = 24 }) {
726
+ return h(Shell, {
727
+ size,
728
+ strokeWidth: 1.6,
729
+ viewBox: "0 0 24 24"
730
+ }, h("rect", {
731
+ x: 3,
732
+ y: 3,
733
+ width: 18,
734
+ height: 18,
735
+ rx: 5,
736
+ stroke: "currentColor"
737
+ }), h("path", {
738
+ d: "M8 9.5h8M8 12.5h8M8 15.5h5",
739
+ stroke: "currentColor",
740
+ strokeLinecap: "round"
741
+ }));
742
+ }
743
+ function IconModules({ size = 16 }) {
744
+ return h("svg", {
745
+ width: size,
746
+ height: size,
747
+ viewBox: "0 0 16 16",
748
+ fill: "none",
749
+ "aria-hidden": "true"
750
+ }, h("rect", {
751
+ x: "2.5",
752
+ y: "2.5",
753
+ width: "4.6",
754
+ height: "4.6",
755
+ rx: "1.2",
756
+ stroke: "currentColor",
757
+ strokeWidth: "1.2"
758
+ }), h("rect", {
759
+ x: "8.9",
760
+ y: "2.5",
761
+ width: "4.6",
762
+ height: "4.6",
763
+ rx: "1.2",
764
+ stroke: "currentColor",
765
+ strokeWidth: "1.2"
766
+ }), h("rect", {
767
+ x: "2.5",
768
+ y: "8.9",
769
+ width: "4.6",
770
+ height: "4.6",
771
+ rx: "1.2",
772
+ stroke: "currentColor",
773
+ strokeWidth: "1.2"
774
+ }), h("rect", {
775
+ x: "8.9",
776
+ y: "8.9",
777
+ width: "4.6",
778
+ height: "4.6",
779
+ rx: "1.2",
780
+ stroke: "currentColor",
781
+ strokeWidth: "1.2"
782
+ }));
783
+ }
784
+ //#endregion
879
785
  //#region ../shared/dist/config/storage.js
880
786
  function readText(key) {
881
787
  try {
@@ -965,11 +871,13 @@ var en = {
965
871
  "panels.market.install": "Install",
966
872
  "panels.market.update": "Update",
967
873
  "panels.market.uninstall": "Uninstall",
874
+ "panels.market.uninstallLabel": "Uninstall {name}",
968
875
  "panels.market.installing": "Installing…",
969
876
  "panels.market.updating": "Updating…",
970
877
  "panels.market.uninstalling": "Uninstalling…",
971
- "panels.market.confirmUninstall": "Uninstall?",
878
+ "panels.market.confirmUninstallTitle": "Uninstall \"{name}\"?",
972
879
  "panels.market.confirmUninstallDetail": "It will be gone from this machine, and removed from every project panel (bindings and settings are kept).",
880
+ "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
973
881
  "panels.market.confirmYes": "Uninstall",
974
882
  "panels.market.confirmNo": "Cancel",
975
883
  "panels.market.failed": "Failed: {reason}",
@@ -977,6 +885,10 @@ var en = {
977
885
  "panels.market.noSource": "This module declares no install method — install it yourself",
978
886
  "panels.market.badSource": "The install method is incomplete — install it yourself",
979
887
  "panels.market.empty": "No modules available",
888
+ "panels.market.installedSection": "Installed",
889
+ "panels.market.moduleOutdated": "update available",
890
+ "panels.market.moduleRestartHint": "it may need a restart after installing",
891
+ "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
980
892
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
981
893
  "panels.market.recheck": "Check for updates",
982
894
  "panels.market.checkUpdates": "Check for updates",
@@ -984,6 +896,125 @@ var en = {
984
896
  "panels.market.justNow": "just now",
985
897
  "panels.market.minutesAgo": "{n} min ago",
986
898
  "panels.market.hoursAgo": "{n} h ago",
899
+ "panels.market.add.description": "Enter a package name, a Git URL, or a path to a local directory.",
900
+ "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
901
+ "panels.market.add.guideToggle": "Install guide and examples",
902
+ "panels.market.add.guideHide": "Hide guide",
903
+ "panels.market.add.guideIdTitle": "Package name",
904
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
905
+ "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.",
906
+ "panels.market.add.guideGitTitle": "Git URL",
907
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
908
+ "panels.market.add.guideGitHint": "The public repository of the module on GitHub; other Git hosts work too.",
909
+ "panels.market.add.guidePathTitle": "Local module directory",
910
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
911
+ "panels.market.add.guidePathHint": "Absolute path to the module directory on this machine, for modules you develop or have already downloaded.",
912
+ "panels.market.add.guideExampleLabel": "Example:",
913
+ "panels.market.add.guideFill": "Fill in",
914
+ "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.",
915
+ "panels.market.add.registryLegend": "Which npm registry to download from",
916
+ "panels.market.add.registryOfficial": "npm registry",
917
+ "panels.market.add.registryMirror": "China mirror",
918
+ "panels.market.add.registryWithHost": "{name} ({host})",
919
+ "panels.market.add.registryToggle": "Source",
920
+ "panels.market.add.installVersion": "Version {version}",
921
+ "panels.market.add.registryDefault": "Default source",
922
+ "panels.market.add.registryCustom": "Custom address",
923
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
924
+ "panels.market.add.registryCustomHint": "A corporate or private npm registry; for one that needs auth, put the credentials in ~/.npmrc on this machine",
925
+ "panels.market.add.registryCustomInvalid": "Enter an address starting with http:// or https://",
926
+ "panels.market.add.run": "Install",
927
+ "panels.market.add.edit": "Edit",
928
+ "panels.market.add.changeRegistry": "Change source",
929
+ "panels.market.add.installingTitle": "Installing the module…",
930
+ "panels.market.add.installedTitle": "Installed",
931
+ "panels.market.add.failedTitle": "Module install failed",
932
+ "panels.market.add.cancelledTitle": "Cancelled",
933
+ "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.",
934
+ "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
935
+ "panels.market.add.problemInstalled": "This module is already installed",
936
+ "panels.market.add.problemNotFound": "No such module found",
937
+ "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
938
+ "panels.market.add.problemNotBundle": "This package declares no bundle, so it cannot be installed as a module: {reason}",
939
+ "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
940
+ "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
941
+ "panels.market.add.failureNetwork": "The network connection failed",
942
+ "panels.market.add.failureNotFound": "No such module found",
943
+ "panels.market.add.failureNoMatchingVersion": "No matching version",
944
+ "panels.market.add.failureDiskFull": "Out of disk space, install stopped",
945
+ "panels.market.add.failurePermission": "No write permission, cannot install",
946
+ "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
947
+ "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
948
+ "panels.market.add.failureTimeout": "The install timed out",
949
+ "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
950
+ "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
951
+ "panels.market.add.approveTitle": "Your approval is needed for install scripts",
952
+ "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
953
+ "panels.market.add.approveRun": "Allow and continue installing",
954
+ "panels.market.add.restart": "Installed — restart once to pick it up.",
955
+ "panels.market.add.tookEffect": "Live.",
956
+ "panels.market.add.details": "Install details",
957
+ "panels.market.add.open": "Add module",
958
+ "panels.market.add.title": "Add module",
959
+ "panels.market.add.intro": "Install a workbench module by package name. It goes on this machine, shared by every project.",
960
+ "panels.market.add.specLabel": "Package",
961
+ "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.",
962
+ "panels.market.add.exampleTitle": "Examples",
963
+ "panels.market.add.exampleFill": "Fill in an example",
964
+ "panels.market.add.registryLabel": "Source",
965
+ "panels.market.add.registryProfile": "This profile's registry",
966
+ "panels.market.add.registryPnpm": "pnpm's own registry",
967
+ "panels.market.add.check": "Check",
968
+ "panels.market.add.checking": "Checking…",
969
+ "panels.market.add.change": "Edit",
970
+ "panels.market.add.previewTitle": "About to install",
971
+ "panels.market.add.fieldName": "Package",
972
+ "panels.market.add.fieldVersion": "Version",
973
+ "panels.market.add.fieldDescription": "Description",
974
+ "panels.market.add.fieldSource": "Source",
975
+ "panels.market.add.install": "Install",
976
+ "panels.market.add.installing": "Installing…",
977
+ "panels.market.add.cancel": "Cancel install",
978
+ "panels.market.add.close": "Close",
979
+ "panels.market.add.retry": "Retry",
980
+ "panels.market.add.changeSource": "Change source",
981
+ "panels.market.add.approveBuilds": "Allow these scripts and retry",
982
+ "panels.market.add.approveHint": "These packages want to run install scripts: {packages}",
983
+ "panels.market.add.doneApplied": "Installed and live.",
984
+ "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
985
+ "panels.market.add.cancelled": "Cancelled.",
986
+ "panels.market.add.failed": "Didn't work: {reason}",
987
+ "panels.market.add.removed": "It has been removed.",
988
+ "panels.market.add.supplyPending": "Its plugins install after you restart.",
989
+ "panels.market.add.supplyFailed": "Its plugins didn't install: {reason}",
990
+ "panels.market.add.notModule": "This is not a workbench module (no dsh.workbench declaration), so it will not show up on the board.",
991
+ "panels.market.add.removedRestart": "Removed — restart once to finish.",
992
+ "panels.market.add.remove": "Remove it",
993
+ "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
994
+ "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
995
+ "panels.market.add.problem.notFound": "No such package on that source.",
996
+ "panels.market.add.problem.notAPackage": "There is no package at that location.",
997
+ "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
998
+ "panels.market.add.problem.network": "The source is unreachable.",
999
+ "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
1000
+ "panels.market.add.reason.invalidSpec": "the spec is not accepted",
1001
+ "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
1002
+ "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
1003
+ "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
1004
+ "panels.market.add.reason.bundleInUse": "something is still using it",
1005
+ "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
1006
+ "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
1007
+ "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
1008
+ "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
1009
+ "panels.market.add.reason.pnpmMissing": "pnpm is not on this machine",
1010
+ "panels.market.add.reason.noMatchingVersion": "no version matching that range on the source",
1011
+ "panels.market.add.reason.diskFull": "the disk is full",
1012
+ "panels.market.add.reason.permission": "no permission to write",
1013
+ "panels.market.add.reason.integrity": "the download failed its integrity check",
1014
+ "panels.market.add.reason.timeout": "no output for too long, so it was stopped",
1015
+ "panels.market.add.reason.network": "the network is unreachable",
1016
+ "panels.market.add.reason.notFound": "no such package on the source",
1017
+ "panels.market.add.reason.unknown": "It failed without saying why (see the install output)",
987
1018
  "blocker.fix.install": "Install for me",
988
1019
  "blocker.fix.update": "Upgrade for me",
989
1020
  "blocker.fix.running": "Running…",
@@ -1129,18 +1160,24 @@ var zh = {
1129
1160
  "panels.market.install": "安装",
1130
1161
  "panels.market.update": "更新",
1131
1162
  "panels.market.uninstall": "卸载",
1163
+ "panels.market.uninstallLabel": "卸载 {name}",
1132
1164
  "panels.market.installing": "正在安装…",
1133
1165
  "panels.market.updating": "正在更新…",
1134
1166
  "panels.market.uninstalling": "正在卸载…",
1135
- "panels.market.confirmUninstall": "要卸载吗?",
1136
- "panels.market.confirmUninstallDetail": "卸载后这台机器上就没有它了,所有项目的面板也会把它一起拿掉(绑定与设置不会丢)。",
1137
- "panels.market.confirmYes": "确定卸载",
1167
+ "panels.market.confirmUninstallTitle": "卸载「{name}」?",
1168
+ "panels.market.confirmUninstallDetail": "卸载后它提供的功能会消失。",
1169
+ "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
1170
+ "panels.market.confirmYes": "卸载",
1138
1171
  "panels.market.confirmNo": "取消",
1139
1172
  "panels.market.failed": "没成功:{reason}",
1140
1173
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
1141
1174
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1142
1175
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1143
1176
  "panels.market.empty": "暂无可用模块",
1177
+ "panels.market.installedSection": "已装",
1178
+ "panels.market.moduleOutdated": "有新版",
1179
+ "panels.market.moduleRestartHint": "安装完成后可能需要重启才生效",
1180
+ "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1144
1181
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1145
1182
  "panels.market.recheck": "重新检查更新",
1146
1183
  "panels.market.checkUpdates": "检查更新",
@@ -1148,6 +1185,125 @@ var zh = {
1148
1185
  "panels.market.justNow": "刚刚",
1149
1186
  "panels.market.minutesAgo": "{n} 分钟前",
1150
1187
  "panels.market.hoursAgo": "{n} 小时前",
1188
+ "panels.market.add.description": "输入模块的包名、Git 仓库地址或本地目录路径。",
1189
+ "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
1190
+ "panels.market.add.guideToggle": "模块安装引导和示例",
1191
+ "panels.market.add.guideHide": "收起引导",
1192
+ "panels.market.add.guideIdTitle": "包名",
1193
+ "panels.market.add.guideIdExample": "@dsh-workbench/module-hello",
1194
+ "panels.market.add.guideIdHint": "模块包名即 npm 包名(如 dsh-workbench-module-xxx 或 @作者/模块名),社区模块的 README 安装命令中 dsh plugin add 或 pnpm add 之后的部分。",
1195
+ "panels.market.add.guideGitTitle": "Git 仓库地址",
1196
+ "panels.market.add.guideGitExample": "https://github.com/author/dsh-workbench-module-x",
1197
+ "panels.market.add.guideGitHint": "模块在 GitHub 上的开源仓库地址,也支持其他 Git 仓库。",
1198
+ "panels.market.add.guidePathTitle": "本地模块目录",
1199
+ "panels.market.add.guidePathExample": "/Users/name/my-workbench-module",
1200
+ "panels.market.add.guidePathHint": "本机上模块目录的绝对路径,适用于自行开发或已下载的模块。",
1201
+ "panels.market.add.guideExampleLabel": "示例:",
1202
+ "panels.market.add.guideFill": "填入示例",
1203
+ "panels.market.add.guideSafety": "请确认模块来源可信。模块在本机以你的权限运行,来源不明的模块可能损坏工作台,或读取和泄露你的数据。",
1204
+ "panels.market.add.registryLegend": "从哪个 npm 源下载模块",
1205
+ "panels.market.add.registryOfficial": "npm 官方源",
1206
+ "panels.market.add.registryMirror": "中国大陆镜像源",
1207
+ "panels.market.add.registryWithHost": "{name}({host})",
1208
+ "panels.market.add.registryToggle": "安装源",
1209
+ "panels.market.add.installVersion": "版本 {version}",
1210
+ "panels.market.add.registryDefault": "默认安装源",
1211
+ "panels.market.add.registryCustom": "自定义地址",
1212
+ "panels.market.add.registryCustomPlaceholder": "https://npm.example.com/",
1213
+ "panels.market.add.registryCustomHint": "公司内网或私有 npm 源;需要登录的源,把凭据放在本机的 ~/.npmrc 里",
1214
+ "panels.market.add.registryCustomInvalid": "请输入以 http:// 或 https:// 开头的地址",
1215
+ "panels.market.add.run": "安装",
1216
+ "panels.market.add.edit": "编辑",
1217
+ "panels.market.add.changeRegistry": "更换安装源",
1218
+ "panels.market.add.installingTitle": "模块安装中…",
1219
+ "panels.market.add.installedTitle": "已安装",
1220
+ "panels.market.add.failedTitle": "模块安装失败",
1221
+ "panels.market.add.cancelledTitle": "已取消",
1222
+ "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
1223
+ "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
1224
+ "panels.market.add.problemInstalled": "该模块已安装",
1225
+ "panels.market.add.problemNotFound": "未找到相关模块",
1226
+ "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
1227
+ "panels.market.add.problemNotBundle": "这个包没有声明组合包,无法作为模块安装:{reason}",
1228
+ "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
1229
+ "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
1230
+ "panels.market.add.failureNetwork": "网络连接失败",
1231
+ "panels.market.add.failureNotFound": "未找到相关模块",
1232
+ "panels.market.add.failureNoMatchingVersion": "没有匹配的版本",
1233
+ "panels.market.add.failureDiskFull": "磁盘空间不足,安装已停止",
1234
+ "panels.market.add.failurePermission": "没有写入权限,无法安装",
1235
+ "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
1236
+ "panels.market.add.failureIntegrity": "下载的安装包校验失败",
1237
+ "panels.market.add.failureTimeout": "安装超时",
1238
+ "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
1239
+ "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
1240
+ "panels.market.add.approveTitle": "需要你允许安装脚本",
1241
+ "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
1242
+ "panels.market.add.approveRun": "允许并继续安装",
1243
+ "panels.market.add.restart": "装好了,重启一次才生效。",
1244
+ "panels.market.add.tookEffect": "已生效。",
1245
+ "panels.market.add.details": "安装详情",
1246
+ "panels.market.add.open": "添加模块",
1247
+ "panels.market.add.title": "添加模块",
1248
+ "panels.market.add.intro": "按包名装工作台模块。装在这台机器上,所有项目共用。",
1249
+ "panels.market.add.specLabel": "包名",
1250
+ "panels.market.add.specHint": "就是命令里 `dsh plugin add` 后面那一段:包名(可带 @版本)、git 地址、压缩包或本地绝对路径。",
1251
+ "panels.market.add.exampleTitle": "示例",
1252
+ "panels.market.add.exampleFill": "填入示例",
1253
+ "panels.market.add.registryLabel": "安装源",
1254
+ "panels.market.add.registryProfile": "这个 profile 配的源",
1255
+ "panels.market.add.registryPnpm": "pnpm 自己配的源",
1256
+ "panels.market.add.check": "预检",
1257
+ "panels.market.add.checking": "正在预检…",
1258
+ "panels.market.add.change": "改一下",
1259
+ "panels.market.add.previewTitle": "将要安装",
1260
+ "panels.market.add.fieldName": "包名",
1261
+ "panels.market.add.fieldVersion": "版本",
1262
+ "panels.market.add.fieldDescription": "简介",
1263
+ "panels.market.add.fieldSource": "来源",
1264
+ "panels.market.add.install": "安装",
1265
+ "panels.market.add.installing": "正在安装…",
1266
+ "panels.market.add.cancel": "取消安装",
1267
+ "panels.market.add.close": "关闭",
1268
+ "panels.market.add.retry": "重试",
1269
+ "panels.market.add.changeSource": "换源",
1270
+ "panels.market.add.approveBuilds": "允许这些脚本并重试",
1271
+ "panels.market.add.approveHint": "这几个包要跑安装脚本:{packages}",
1272
+ "panels.market.add.doneApplied": "装好了,已经生效。",
1273
+ "panels.market.add.doneRestart": "装好了,重启一次才生效。",
1274
+ "panels.market.add.cancelled": "已取消。",
1275
+ "panels.market.add.failed": "没成功:{reason}",
1276
+ "panels.market.add.removed": "已经移除了。",
1277
+ "panels.market.add.supplyPending": "它要的插件重启后再装。",
1278
+ "panels.market.add.supplyFailed": "它要的插件没装上:{reason}",
1279
+ "panels.market.add.notModule": "这不是工作台模块(没有 dsh.workbench 声明),不会出现在面板上。",
1280
+ "panels.market.add.removedRestart": "卸掉了,重启一次才彻底生效。",
1281
+ "panels.market.add.remove": "移除它",
1282
+ "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
1283
+ "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
1284
+ "panels.market.add.problem.notFound": "源上没有这个包。",
1285
+ "panels.market.add.problem.notAPackage": "这个位置没有包。",
1286
+ "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
1287
+ "panels.market.add.problem.network": "源连不上。",
1288
+ "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
1289
+ "panels.market.add.reason.invalidSpec": "写法不认",
1290
+ "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
1291
+ "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
1292
+ "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
1293
+ "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
1294
+ "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
1295
+ "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
1296
+ "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
1297
+ "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
1298
+ "panels.market.add.reason.pnpmMissing": "这台机器上没有 pnpm",
1299
+ "panels.market.add.reason.noMatchingVersion": "源上没有符合这个版本范围的版本",
1300
+ "panels.market.add.reason.diskFull": "磁盘满了",
1301
+ "panels.market.add.reason.permission": "没有写权限",
1302
+ "panels.market.add.reason.integrity": "下载内容校验不过",
1303
+ "panels.market.add.reason.timeout": "太久没有输出,被中断了",
1304
+ "panels.market.add.reason.network": "网络不通",
1305
+ "panels.market.add.reason.notFound": "源上没有这个包",
1306
+ "panels.market.add.reason.unknown": "没成功,但它没说是为什么(详情见安装输出的那一行)",
1151
1307
  "blocker.fix.install": "帮我安装",
1152
1308
  "blocker.fix.update": "帮我升级",
1153
1309
  "blocker.fix.running": "正在执行…",
@@ -1344,20 +1500,8 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1344
1500
  HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
1345
1501
  INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
1346
1502
  IconBrandMark: () => IconBrandMark,
1347
- IconCheck: () => IconCheck,
1348
- IconChevronDown: () => IconChevronDown,
1349
1503
  IconConversation: () => IconConversation,
1350
- IconEllipsis: () => IconEllipsis,
1351
- IconFolder: () => IconFolder,
1352
- IconFolderOpen: () => IconFolderOpen,
1353
1504
  IconModules: () => IconModules,
1354
- IconNewChat: () => IconNewChat,
1355
- IconPanelLeft: () => IconPanelLeft,
1356
- IconPin: () => IconPin,
1357
- IconPlus: () => IconPlus,
1358
- IconRefresh: () => IconRefresh,
1359
- IconRightUp: () => IconRightUp,
1360
- IconSettings: () => IconSettings,
1361
1505
  LINK_BUTTON_STYLE: () => LINK_BUTTON_STYLE,
1362
1506
  LOCALES: () => LOCALES,
1363
1507
  LOCALE_NS: () => LOCALE_NS,
@@ -1380,7 +1524,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1380
1524
  STORAGE_KEY_RIGHTBAR: () => STORAGE_KEY_RIGHTBAR,
1381
1525
  SaveBar: () => SaveBar,
1382
1526
  SkeletonRows: () => SkeletonRows,
1383
- StateDot: () => StateDot,
1527
+ TextField: () => TextField,
1384
1528
  UNITS_SERVICE: () => UNITS_SERVICE,
1385
1529
  VERSION_CHECK_TIMEOUT_MS: () => VERSION_CHECK_TIMEOUT_MS,
1386
1530
  VERSION_CHECK_TTL_MS: () => VERSION_CHECK_TTL_MS,
@@ -1437,6 +1581,17 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1437
1581
  zh: () => zh
1438
1582
  });
1439
1583
  //#endregion
1584
+ //#region src/shared/components/Tip.tsx
1585
+ function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }) {
1586
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1587
+ side,
1588
+ align,
1589
+ gap,
1590
+ portal,
1591
+ ...rest
1592
+ });
1593
+ }
1594
+ //#endregion
1440
1595
  //#region src/shared/hooks/fact-transports.ts
1441
1596
  function sseTransport(options) {
1442
1597
  return { start({ onFrame, cursor }) {
@@ -1743,13 +1898,6 @@ function panelRowName(label, hint, t) {
1743
1898
  //#endregion
1744
1899
  //#region src/app/layouts/rightbar/market-freshness.ts
1745
1900
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
1746
- function checkedAgoText(at, now, t) {
1747
- const seconds = Math.max(0, Math.floor((now - at) / 1e3));
1748
- if (seconds < 60) return t("panels.market.justNow");
1749
- const minutes = Math.floor(seconds / 60);
1750
- if (minutes < 60) return t("panels.market.minutesAgo", { n: String(minutes) });
1751
- return t("panels.market.hoursAgo", { n: String(Math.floor(minutes / 60)) });
1752
- }
1753
1901
  function shouldProbeOnEnter(input) {
1754
1902
  if (input.checkedAt === null) return true;
1755
1903
  return input.now - input.checkedAt >= input.staleMs;
@@ -1869,17 +2017,38 @@ function buildMarketMocks(roster) {
1869
2017
  }
1870
2018
  },
1871
2019
  {
1872
- id: "outdated-release",
1873
- label: "源上有新版(模块行不变,共用依赖行给「更新」)",
2020
+ id: "module-update",
2021
+ label: "模块包有新版(行上给「更新」,装了要重启)",
1874
2022
  manifests: [mine],
1875
2023
  capabilities: probe$1(id, "ok", { plugins: [{
1876
2024
  name: "fixture",
1877
- status: "outdated",
1878
- missing: [],
1879
- release: {
1880
- installed: "1.0.16",
1881
- latest: "1.0.17"
1882
- }
2025
+ status: "ok",
2026
+ missing: []
2027
+ }] }),
2028
+ updates: { [id]: {
2029
+ installed: "0.1.2",
2030
+ latest: "0.2.0"
2031
+ } },
2032
+ expect: {
2033
+ rows: 1,
2034
+ state: "outdated",
2035
+ actions: ["update-bundle", "uninstall"],
2036
+ shared: 1,
2037
+ sharedActions: []
2038
+ }
2039
+ },
2040
+ {
2041
+ id: "outdated-release",
2042
+ label: "源上有新版(模块行不变,共用依赖行给「更新」)",
2043
+ manifests: [mine],
2044
+ capabilities: probe$1(id, "ok", { plugins: [{
2045
+ name: "fixture",
2046
+ status: "outdated",
2047
+ missing: [],
2048
+ release: {
2049
+ installed: "1.0.16",
2050
+ latest: "1.0.17"
2051
+ }
1883
2052
  }] }),
1884
2053
  expect: {
1885
2054
  rows: 1,
@@ -2090,6 +2259,65 @@ function buildMarketMocks(roster) {
2090
2259
  actions: ["uninstall"]
2091
2260
  }
2092
2261
  },
2262
+ {
2263
+ id: "installed-half",
2264
+ label: "本机装了模块,但它没有环境依赖(供给那半没有它)",
2265
+ manifests: [found],
2266
+ capabilities: {},
2267
+ installed: [{
2268
+ unit: id,
2269
+ pkg: "@dsh-workbench/module-one",
2270
+ installed: "0.1.2"
2271
+ }],
2272
+ expect: {
2273
+ rows: 0,
2274
+ installed: 1,
2275
+ installedActions: ["remove-bundle"]
2276
+ }
2277
+ },
2278
+ {
2279
+ id: "installed-half-update",
2280
+ label: "本机装了模块 + 源上有新版(给「更新」,装完要重启)",
2281
+ manifests: [found],
2282
+ capabilities: {},
2283
+ installed: [{
2284
+ unit: id,
2285
+ pkg: "@dsh-workbench/module-one",
2286
+ installed: "0.1.0",
2287
+ latest: "0.1.2"
2288
+ }],
2289
+ expect: {
2290
+ rows: 0,
2291
+ installed: 1,
2292
+ installedActions: ["update-bundle", "remove-bundle"]
2293
+ }
2294
+ },
2295
+ {
2296
+ id: "installed-confirm",
2297
+ label: "卸载本机模块(Modal 确认,标题带模块名)",
2298
+ manifests: [found],
2299
+ capabilities: {},
2300
+ installed: [{
2301
+ unit: id,
2302
+ pkg: "@dsh-workbench/module-one",
2303
+ installed: "0.1.2"
2304
+ }],
2305
+ confirming: id,
2306
+ expect: {
2307
+ rows: 0,
2308
+ installed: 1,
2309
+ installedActions: ["remove-bundle"]
2310
+ }
2311
+ },
2312
+ {
2313
+ id: "first-paint",
2314
+ label: "刚进页面(检测中:能力与本机清单都还没结论)",
2315
+ manifests: [found],
2316
+ capabilities: null,
2317
+ installedRead: false,
2318
+ loaded: false,
2319
+ expect: { rows: 0 }
2320
+ },
2093
2321
  {
2094
2322
  id: "shared-many",
2095
2323
  label: "三个模块(同一份安装)",
@@ -2125,6 +2353,178 @@ function buildMarketMocks(roster) {
2125
2353
  ];
2126
2354
  }
2127
2355
  //#endregion
2356
+ //#region src/app/layouts/rightbar/registry.ts
2357
+ function createBoardRegistry() {
2358
+ const modules = [];
2359
+ const listeners = /* @__PURE__ */ new Set();
2360
+ let revision = 0;
2361
+ let sorted = [];
2362
+ let index = /* @__PURE__ */ new Map();
2363
+ let steps = /* @__PURE__ */ new Map();
2364
+ function rebuild() {
2365
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
2366
+ index = new Map(sorted.map((module) => [module.id, module]));
2367
+ const table = /* @__PURE__ */ new Map();
2368
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
2369
+ const owner = table.get(kind);
2370
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
2371
+ table.set(kind, module);
2372
+ }
2373
+ steps = table;
2374
+ }
2375
+ function notify() {
2376
+ revision += 1;
2377
+ for (const listener of listeners) listener();
2378
+ }
2379
+ return {
2380
+ register(module) {
2381
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
2382
+ modules.push(module);
2383
+ try {
2384
+ rebuild();
2385
+ } catch (error) {
2386
+ modules.pop();
2387
+ rebuild();
2388
+ throw error;
2389
+ }
2390
+ notify();
2391
+ return () => {
2392
+ const at = modules.indexOf(module);
2393
+ if (at < 0) return;
2394
+ modules.splice(at, 1);
2395
+ rebuild();
2396
+ notify();
2397
+ };
2398
+ },
2399
+ all: () => sorted,
2400
+ visible: () => sorted.filter((module) => module.enabledByDefault),
2401
+ byId: (id) => index.get(id),
2402
+ stepOwner: (kind) => steps.get(kind),
2403
+ subscribe(listener) {
2404
+ listeners.add(listener);
2405
+ return () => listeners.delete(listener);
2406
+ },
2407
+ version: () => revision
2408
+ };
2409
+ }
2410
+ //#endregion
2411
+ //#region src/app/units/registry.ts
2412
+ function toBoardModule(face) {
2413
+ return {
2414
+ id: face.manifest.id,
2415
+ titleKey: face.manifest.card?.titleKey ?? face.manifest.id,
2416
+ order: face.manifest.card?.order ?? 100,
2417
+ enabledByDefault: face.manifest.card?.enabledByDefault ?? false,
2418
+ View: face.card,
2419
+ ...face.steps === void 0 ? {} : { steps: face.steps }
2420
+ };
2421
+ }
2422
+ function createClientUnitRegistry() {
2423
+ const faces = [];
2424
+ const listeners = /* @__PURE__ */ new Set();
2425
+ const board = createBoardRegistry();
2426
+ let revision = 0;
2427
+ let manifestsCache;
2428
+ function notify() {
2429
+ revision += 1;
2430
+ for (const listener of listeners) listener();
2431
+ }
2432
+ return {
2433
+ register(face) {
2434
+ const id = face.manifest.id;
2435
+ if (faces.some((item) => item.manifest.id === id)) throw new Error(`套件 id 重复:${id}(id 会进持久化配置,不能撞)`);
2436
+ const unregisterBoard = board.register(toBoardModule(face));
2437
+ faces.push(face);
2438
+ manifestsCache = void 0;
2439
+ notify();
2440
+ return () => {
2441
+ const at = faces.findIndex((item) => item.manifest.id === id);
2442
+ if (at < 0) return;
2443
+ faces.splice(at, 1);
2444
+ manifestsCache = void 0;
2445
+ unregisterBoard();
2446
+ notify();
2447
+ };
2448
+ },
2449
+ all: () => faces,
2450
+ manifests: () => {
2451
+ manifestsCache ??= faces.map((face) => face.manifest);
2452
+ return manifestsCache;
2453
+ },
2454
+ board,
2455
+ subscribe(listener) {
2456
+ listeners.add(listener);
2457
+ return () => listeners.delete(listener);
2458
+ },
2459
+ version: () => revision
2460
+ };
2461
+ }
2462
+ //#endregion
2463
+ //#region src/app/units/fixture-unit-mock.tsx
2464
+ var FIXTURE_UNIT_ID = "wb-fixture";
2465
+ var KEY = {
2466
+ cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
2467
+ cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
2468
+ rowKey: `${FIXTURE_UNIT_ID}.rowKey`,
2469
+ rowValue: `${FIXTURE_UNIT_ID}.rowValue`
2470
+ };
2471
+ var messages = {
2472
+ zh: {
2473
+ [KEY.cardTitle]: "示例模块",
2474
+ [KEY.cardMeta]: "夹具",
2475
+ [KEY.rowKey]: "示例",
2476
+ [KEY.rowValue]: "第 {n} 行"
2477
+ },
2478
+ en: {
2479
+ [KEY.cardTitle]: "Sample module",
2480
+ [KEY.cardMeta]: "Fixture",
2481
+ [KEY.rowKey]: "Sample",
2482
+ [KEY.rowValue]: "Row {n}"
2483
+ }
2484
+ };
2485
+ var manifest = {
2486
+ id: FIXTURE_UNIT_ID,
2487
+ kind: "board",
2488
+ card: {
2489
+ titleKey: KEY.cardTitle,
2490
+ order: 900,
2491
+ enabledByDefault: true
2492
+ },
2493
+ tools: [],
2494
+ host: { inject: [] }
2495
+ };
2496
+ function FixtureCard({ t, onRefresh }) {
2497
+ return /* @__PURE__ */ h("section", { className: "wb-card" }, /* @__PURE__ */ h(CardHead, {
2498
+ t,
2499
+ title: t(KEY.cardTitle),
2500
+ meta: t(KEY.cardMeta),
2501
+ refreshing: false,
2502
+ onRefresh
2503
+ }), /* @__PURE__ */ h("div", { className: "wb-cardBody" }, /* @__PURE__ */ h("div", { className: "wb-rows" }, [
2504
+ 1,
2505
+ 2,
2506
+ 3
2507
+ ].map((n) => /* @__PURE__ */ h("div", {
2508
+ className: "wb-row",
2509
+ key: String(n)
2510
+ }, /* @__PURE__ */ h("span", { className: "wb-rowKey" }, t(KEY.rowKey)), /* @__PURE__ */ h("span", { className: "wb-rowValue" }, t(KEY.rowValue, { n: String(n) })))))));
2511
+ }
2512
+ var FIXTURE_FACE = {
2513
+ manifest,
2514
+ messages,
2515
+ card: FixtureCard
2516
+ };
2517
+ var SAMPLE_ROSTER = [manifest];
2518
+ function hasCard(roster) {
2519
+ return roster.some((item) => item.card !== null);
2520
+ }
2521
+ function fixtureRoster(roster) {
2522
+ return hasCard(roster) ? roster : SAMPLE_ROSTER;
2523
+ }
2524
+ function fixtureSeed(roster, all) {
2525
+ return hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE)];
2526
+ }
2527
+ //#endregion
2128
2528
  //#region src/app/layouts/rightbar/market-rows.ts
2129
2529
  var MARKET_STATE_KEY = {
2130
2530
  checking: "panels.market.checking",
@@ -2142,11 +2542,38 @@ var MARKET_DOT = {
2142
2542
  unchecked: "idle",
2143
2543
  unknown: "idle"
2144
2544
  };
2145
- function marketActions(row) {
2545
+ function installedRows(modules, manifests, listed) {
2546
+ const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.card?.titleKey]));
2547
+ const rows = [];
2548
+ for (const module of modules) {
2549
+ if (listed.has(module.unit)) continue;
2550
+ const latest = module.latest;
2551
+ const outdated = latest !== void 0 && latest !== module.installed;
2552
+ rows.push({
2553
+ id: module.unit,
2554
+ titleKey: titles.get(module.unit) ?? module.pkg,
2555
+ state: outdated ? "outdated" : "installed",
2556
+ pkg: module.pkg,
2557
+ canInstall: false,
2558
+ canUpdate: outdated,
2559
+ canUninstall: true,
2560
+ version: {
2561
+ installed: module.installed,
2562
+ ...latest === void 0 ? {} : { latest }
2563
+ },
2564
+ ...outdated ? { moduleUpdate: {
2565
+ installed: module.installed,
2566
+ latest
2567
+ } } : {}
2568
+ });
2569
+ }
2570
+ return rows;
2571
+ }
2572
+ function marketActions$1(row) {
2146
2573
  return [
2147
2574
  ...row.canInstall ? ["install"] : [],
2148
- ...row.canUpdate ? ["update"] : [],
2149
- ...row.canUninstall ? ["uninstall"] : []
2575
+ ...row.moduleUpdate === void 0 ? row.canUpdate ? ["update"] : [] : ["update-bundle"],
2576
+ ...row.canUninstall ? [row.pkg === void 0 ? "uninstall" : "remove-bundle"] : []
2150
2577
  ];
2151
2578
  }
2152
2579
  function stateOf(capability) {
@@ -2185,7 +2612,7 @@ function isOnMachine(state) {
2185
2612
  return state === "installed" || state === "outdated";
2186
2613
  }
2187
2614
  function marketHasUpdates(rows, shared = []) {
2188
- return rows.some((row) => row.state === "outdated") || shared.some((row) => row.state === "outdated" || row.state === "unsatisfied");
2615
+ return rows.some((row) => row.state === "outdated" || row.moduleUpdate !== void 0) || shared.some((row) => row.state === "outdated" || row.state === "unsatisfied");
2189
2616
  }
2190
2617
  function marketSections(rows) {
2191
2618
  const installed = rows.filter((row) => isOnMachine(row.state));
@@ -2200,7 +2627,7 @@ function marketSections(rows) {
2200
2627
  rows: rest
2201
2628
  }]];
2202
2629
  }
2203
- function marketRows(manifests, capabilities) {
2630
+ function marketRows(manifests, capabilities, updates = {}) {
2204
2631
  const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
2205
2632
  const rows = [];
2206
2633
  for (const manifest of catalog) {
@@ -2210,14 +2637,25 @@ function marketRows(manifests, capabilities) {
2210
2637
  const note = noteOf(state, install, manifest);
2211
2638
  const onMachine = isOnMachine(state);
2212
2639
  const reAdopt = capability?.released === true && install === void 0;
2640
+ const entry = updates[manifest.id];
2641
+ const moduleUpdate = entry === void 0 || entry.latest === void 0 || entry.latest === entry.installed ? void 0 : {
2642
+ installed: entry.installed,
2643
+ latest: entry.latest
2644
+ };
2213
2645
  rows.push({
2214
2646
  id: manifest.id,
2215
2647
  titleKey: manifest.card?.titleKey ?? manifest.id,
2216
- state,
2648
+ state: moduleUpdate === void 0 ? state : "outdated",
2217
2649
  canInstall: state !== "installed" && (install === "ready" || reAdopt),
2218
2650
  canUpdate: onMachine && isOutdated(capability),
2219
2651
  canUninstall: onMachine,
2220
- ...note === void 0 ? {} : { note }
2652
+ ...moduleUpdate === void 0 ? {} : { hint: "panels.market.moduleRestartHint" },
2653
+ ...entry === void 0 ? {} : { version: {
2654
+ installed: entry.installed,
2655
+ ...entry.latest === void 0 ? {} : { latest: entry.latest }
2656
+ } },
2657
+ ...moduleUpdate === void 0 ? {} : { moduleUpdate },
2658
+ ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {}
2221
2659
  });
2222
2660
  }
2223
2661
  return rows;
@@ -2367,69 +2805,104 @@ function useHostWrite(options) {
2367
2805
  clear
2368
2806
  };
2369
2807
  }
2808
+ var PanelFoot_module_default = {
2809
+ foot: "_foot_1us83_1",
2810
+ footText: "_footText_1us83_12",
2811
+ footTextMd: "_footTextMd_1us83_17"
2812
+ };
2370
2813
  //#endregion
2371
- //#region src/app/layouts/rightbar/MarketFreshLines.tsx
2372
- function MarketCheckedAt({ t, at }) {
2373
- const [now, setNow] = useState(() => Date.now());
2374
- useEffect(() => {
2375
- const timer = setInterval(() => setNow(Date.now()), 3e4);
2376
- return () => clearInterval(timer);
2377
- }, []);
2378
- if (at === null) return null;
2379
- return /* @__PURE__ */ h("span", { className: "wb-marketChecked" }, t("panels.market.checkedAt", { time: checkedAgoText(at, now, t) }));
2380
- }
2814
+ //#region src/shared/components/PanelFoot.tsx
2815
+ function PanelFoot({ text, size = "sm", children }) {
2816
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
2817
+ }
2818
+ var MarketPage_module_default = {
2819
+ marketList: "_marketList_7yq35_1",
2820
+ marketRow: "_marketRow_7yq35_12",
2821
+ marketIcon: "_marketIcon_7yq35_22",
2822
+ marketMain: "_marketMain_7yq35_34",
2823
+ marketName: "_marketName_7yq35_41",
2824
+ marketDesc: "_marketDesc_7yq35_50",
2825
+ marketUsedBy: "_marketUsedBy_7yq35_61",
2826
+ marketVersion: "_marketVersion_7yq35_75",
2827
+ marketEnd: "_marketEnd_7yq35_97",
2828
+ marketActions: "_marketActions_7yq35_104",
2829
+ marketSection: "_marketSection_7yq35_110",
2830
+ marketSectionHead: "_marketSectionHead_7yq35_117",
2831
+ marketSectionTitle: "_marketSectionTitle_7yq35_123",
2832
+ marketSectionCount: "_marketSectionCount_7yq35_129",
2833
+ marketProgress: "_marketProgress_7yq35_135",
2834
+ marketNote: "_marketNote_7yq35_145",
2835
+ marketFailure: "_marketFailure_7yq35_152",
2836
+ marketEmpty: "_marketEmpty_7yq35_159",
2837
+ marketPage: "_marketPage_7yq35_164",
2838
+ marketPageHead: "_marketPageHead_7yq35_181",
2839
+ marketPageTitle: "_marketPageTitle_7yq35_189",
2840
+ marketPageIntro: "_marketPageIntro_7yq35_194",
2841
+ marketPageTools: "_marketPageTools_7yq35_200",
2842
+ marketIconButton: "_marketIconButton_7yq35_209",
2843
+ marketIconWrap: "_marketIconWrap_7yq35_234",
2844
+ marketIconButtonSpinning: "_marketIconButtonSpinning_7yq35_238",
2845
+ "wb-spin": "_wb-spin_7yq35_1",
2846
+ marketAddButton: "_marketAddButton_7yq35_242",
2847
+ marketChecking: "_marketChecking_7yq35_259",
2848
+ marketEmptyTitle: "_marketEmptyTitle_7yq35_267"
2849
+ };
2381
2850
  //#endregion
2382
2851
  //#region src/app/layouts/rightbar/MarketView.tsx
2383
2852
  var PROGRESS_KEY = {
2384
2853
  install: "panels.market.installing",
2385
2854
  update: "panels.market.updating",
2855
+ "update-bundle": "panels.market.updating",
2856
+ "remove-bundle": "panels.market.uninstalling",
2386
2857
  uninstall: "panels.market.uninstalling",
2387
2858
  "update-dependency": "panels.market.updating"
2388
2859
  };
2389
2860
  var ACTION_LABEL_KEY = {
2390
2861
  install: "panels.market.install",
2391
2862
  update: "panels.market.update",
2863
+ "update-bundle": "panels.market.update",
2864
+ "remove-bundle": "panels.market.uninstall",
2392
2865
  uninstall: "panels.market.uninstall",
2393
2866
  "update-dependency": "panels.market.update"
2394
2867
  };
2395
- function MarketLine({ t, row, pending, confirming, failure, onAct, onConfirm, onCancel }) {
2868
+ function MarketLine({ t, row, pending, failure, onAct }) {
2396
2869
  const running = pending !== null && pending.id === row.id ? pending : null;
2397
2870
  const locked = pending !== null;
2398
- const actions = marketActions(row);
2399
- const stateText = t(MARKET_STATE_KEY[row.state]);
2400
- return /* @__PURE__ */ h("li", { className: "wb-marketRow" }, /* @__PURE__ */ h("span", {
2401
- className: "wb-marketIcon",
2871
+ const actions = marketActions$1(row);
2872
+ const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
2873
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
2874
+ className: MarketPage_module_default.marketIcon,
2402
2875
  "aria-hidden": "true"
2403
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: "wb-marketMain" }, /* @__PURE__ */ h("span", { className: "wb-marketName" }, t(row.titleKey)), /* @__PURE__ */ h("span", {
2404
- className: "wb-marketDesc",
2876
+ }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, t(row.titleKey), row.version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
2877
+ from: row.version.installed,
2878
+ to: row.version.latest
2879
+ }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
2880
+ className: MarketPage_module_default.marketDesc,
2405
2881
  role: "img",
2406
- "aria-label": stateText,
2407
- title: stateText
2408
- }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
2882
+ "aria-label": stateText
2883
+ }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2409
2884
  state: "ongoing",
2410
2885
  size: 14
2411
- }) : /* @__PURE__ */ h(StateDot, {
2886
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2412
2887
  state: MARKET_DOT[row.state],
2413
2888
  size: 9
2414
- }), stateText)), /* @__PURE__ */ h("div", { className: "wb-marketEnd" }, running !== null ? /* @__PURE__ */ h("span", { className: "wb-marketProgress" }, /* @__PURE__ */ h(StateDot, {
2889
+ }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint))))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2415
2890
  state: "ongoing",
2416
2891
  size: 14
2417
- }), t(PROGRESS_KEY[running.action])) : confirming || actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: "wb-marketActions" }, actions.map((action) => /* @__PURE__ */ h("button", {
2418
- key: action,
2419
- type: "button",
2420
- className: `wb-marketAction${action === "install" ? " wb-marketActionPrimary" : ""}`,
2421
- disabled: locked,
2422
- onClick: () => onAct(action)
2423
- }, t(ACTION_LABEL_KEY[action]))))), confirming ? /* @__PURE__ */ h("div", { className: "wb-marketConfirm" }, /* @__PURE__ */ h("span", { className: "wb-marketConfirmText" }, /* @__PURE__ */ h("span", { className: "wb-marketConfirmTitle" }, t("panels.market.confirmUninstall")), /* @__PURE__ */ h("span", { className: "wb-marketConfirmDetail" }, t("panels.market.confirmUninstallDetail"))), /* @__PURE__ */ h("button", {
2424
- type: "button",
2425
- className: "wb-marketAction wb-marketActionDanger",
2426
- disabled: locked,
2427
- onClick: onConfirm
2428
- }, t("panels.market.confirmYes")), /* @__PURE__ */ h("button", {
2429
- type: "button",
2430
- className: "wb-marketAction",
2431
- onClick: onCancel
2432
- }, t("panels.market.confirmNo"))) : null, row.note === void 0 ? null : /* @__PURE__ */ h("div", { className: "wb-marketNote" }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: "wb-marketFailure" }, failure));
2892
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
2893
+ const danger = action === "uninstall" || action === "remove-bundle";
2894
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
2895
+ key: action,
2896
+ type: "button",
2897
+ size: "sm",
2898
+ variant: action === "install" ? "primary" : "outline",
2899
+ className: danger ? "wb-dangerAction" : void 0,
2900
+ icon: danger ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 13 }) : void 0,
2901
+ "aria-label": danger ? t("panels.market.uninstallLabel", { name: t(row.titleKey) }) : void 0,
2902
+ disabled: locked,
2903
+ onClick: () => onAct(action)
2904
+ }, t(ACTION_LABEL_KEY[action]));
2905
+ }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
2433
2906
  }
2434
2907
  function SharedLine({ t, row, pending, failure, onAct }) {
2435
2908
  const running = pending !== null && pending.id === row.id ? pending : null;
@@ -2437,98 +2910,1117 @@ function SharedLine({ t, row, pending, failure, onAct }) {
2437
2910
  const actions = sharedActions(row);
2438
2911
  const stateText = t(SHARED_STATE_KEY[row.state]);
2439
2912
  const version = row.version;
2440
- return /* @__PURE__ */ h("li", { className: "wb-marketRow" }, /* @__PURE__ */ h("span", {
2441
- className: "wb-marketIcon",
2913
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
2914
+ className: MarketPage_module_default.marketIcon,
2442
2915
  "aria-hidden": "true"
2443
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: "wb-marketMain" }, /* @__PURE__ */ h("span", {
2444
- className: "wb-marketName",
2445
- title: row.detail
2446
- }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: "wb-marketVersion" }, version.installed !== void 0 && version.latest !== void 0 && row.state === "outdated" ? t("panels.market.versionArrow", {
2916
+ }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h(Tip, { label: row.detail ?? "" }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
2447
2917
  from: version.installed,
2448
2918
  to: version.latest
2449
- }) : version.installed ?? version.latest ?? "")), /* @__PURE__ */ h("span", {
2450
- className: "wb-marketDesc",
2919
+ }) : version.installed ?? version.latest ?? ""))), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
2920
+ className: MarketPage_module_default.marketDesc,
2451
2921
  role: "img",
2452
- "aria-label": stateText,
2453
- title: stateText
2454
- }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
2922
+ "aria-label": stateText
2923
+ }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2455
2924
  state: "ongoing",
2456
2925
  size: 14
2457
- }) : /* @__PURE__ */ h(StateDot, {
2926
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2458
2927
  state: SHARED_DOT[row.state],
2459
2928
  size: 9
2460
- }), stateText, /* @__PURE__ */ h("span", { className: "wb-marketUsedBy" }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: "wb-marketEnd" }, running !== null ? /* @__PURE__ */ h("span", { className: "wb-marketProgress" }, /* @__PURE__ */ h(StateDot, {
2929
+ }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) }))))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
2461
2930
  state: "ongoing",
2462
2931
  size: 14
2463
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: "wb-marketActions" }, actions.map((action) => /* @__PURE__ */ h("button", {
2932
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
2464
2933
  key: action,
2465
2934
  type: "button",
2466
- className: "wb-marketAction",
2935
+ size: "sm",
2936
+ variant: "outline",
2467
2937
  disabled: locked,
2468
2938
  onClick: () => onAct(action)
2469
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: "wb-marketFailure" }, failure));
2939
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
2940
+ }
2941
+ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
2942
+ const [acknowledged, setAcknowledged] = useState(false);
2943
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
2944
+ open: name !== null,
2945
+ title: t("panels.market.confirmUninstallTitle", { name: name ?? "" }),
2946
+ description: t("panels.market.confirmUninstallDetail"),
2947
+ acknowledgeLabel: t("panels.market.confirmUninstallAck"),
2948
+ cancelLabel: t("panels.market.confirmNo"),
2949
+ closeLabel: t("panels.market.confirmNo"),
2950
+ confirmLabel: t("panels.market.confirmYes"),
2951
+ acknowledged,
2952
+ onAcknowledgedChange: setAcknowledged,
2953
+ onCancel,
2954
+ onConfirm
2955
+ });
2470
2956
  }
2471
- function MarketView({ t, manifests, capabilities, freshness, onChanged, mock }) {
2957
+ function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmAction, onConfirming }) {
2958
+ if (rows.length === 0) return null;
2959
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
2960
+ key: row.id,
2961
+ t,
2962
+ row,
2963
+ pending,
2964
+ failure: failureOf(row.id),
2965
+ onAct: (action) => action === confirmAction ? onConfirming(row.id) : void act(row.id, action)
2966
+ }))));
2967
+ }
2968
+ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, mock }) {
2472
2969
  const source = mock?.manifests ?? manifests;
2473
2970
  const effective = mock === void 0 ? capabilities : mock.capabilities;
2474
- const rows = marketRows(source, effective);
2971
+ const rows = marketRows(source, effective, mock?.updates ?? updates ?? {});
2475
2972
  const shared = sharedRows(source, effective);
2973
+ const installedList = installedRows(mock?.installed ?? installed ?? [], source, new Set(rows.map((row) => row.id)));
2974
+ const rowById = new Map([...rows, ...installedList].map((row) => [row.id, row]));
2476
2975
  const [pending, setPending] = useState(mock?.pending ?? null);
2477
2976
  const provision = useHostWrite({
2478
2977
  channel: "provision",
2479
- networkText: t("panels.failed")
2978
+ networkText: t("panels.failed")
2979
+ });
2980
+ const [confirming, setConfirming] = useState(mock?.confirming ?? null);
2981
+ const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
2982
+ const [failed, setFailed] = useState(mock?.failure ?? null);
2983
+ const [restartNeeded, setRestartNeeded] = useState(false);
2984
+ const act = async (id, action) => {
2985
+ if (mock !== void 0) return;
2986
+ setPending({
2987
+ id,
2988
+ action
2989
+ });
2990
+ setConfirming(null);
2991
+ setFailed(null);
2992
+ setRestartNeeded(false);
2993
+ const dependency = action === "update-dependency";
2994
+ const outcome = await provision.send(dependency ? {
2995
+ action,
2996
+ id
2997
+ } : action === "remove-bundle" ? {
2998
+ action,
2999
+ name: rowById.get(id)?.pkg ?? ""
3000
+ } : {
3001
+ action,
3002
+ unit: id
3003
+ });
3004
+ setPending(null);
3005
+ if (!outcome.ok) {
3006
+ setFailed({
3007
+ id,
3008
+ message: t("panels.market.failed", { reason: outcome.message })
3009
+ });
3010
+ return;
3011
+ }
3012
+ const value = outcome.value;
3013
+ setRestartNeeded(value?.change?.application === "restart-required");
3014
+ onChanged();
3015
+ };
3016
+ if (!(freshness.loaded && installedRead !== false)) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3017
+ state: "ongoing",
3018
+ size: 14
3019
+ }), t("panels.market.checking")));
3020
+ if (rows.length === 0 && installedList.length === 0) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3021
+ return /* @__PURE__ */ h(Fragment, null, marketSections(rows).map((section) => /* @__PURE__ */ h(MarketSection, {
3022
+ key: section.id,
3023
+ t,
3024
+ titleKey: section.titleKey,
3025
+ rows: section.rows,
3026
+ pending,
3027
+ failureOf: (id) => failed?.id === id ? failed.message : null,
3028
+ act,
3029
+ confirmAction: "uninstall",
3030
+ onConfirming: setConfirming
3031
+ })), /* @__PURE__ */ h(MarketSection, {
3032
+ t,
3033
+ titleKey: "panels.market.installedSection",
3034
+ rows: installedList,
3035
+ pending,
3036
+ failureOf: (id) => failed?.id === id ? failed.message : null,
3037
+ act,
3038
+ confirmAction: "remove-bundle",
3039
+ onConfirming: setConfirming
3040
+ }), restartNeeded ? /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, t("panels.market.restartNeeded")) : null, /* @__PURE__ */ h(PanelFoot, {
3041
+ size: "md",
3042
+ text: t("panels.market.foot")
3043
+ }), shared.length === 0 ? null : /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, shared.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, shared.map((row) => /* @__PURE__ */ h(SharedLine, {
3044
+ key: row.id,
3045
+ t,
3046
+ row,
3047
+ pending,
3048
+ failure: failed?.id === row.id ? failed.message : null,
3049
+ onAct: (action) => void act(row.id, action)
3050
+ })))), /* @__PURE__ */ h(ConfirmUninstall, {
3051
+ key: confirming ?? "",
3052
+ t,
3053
+ name: confirmingRow === void 0 ? null : t(confirmingRow.titleKey),
3054
+ onCancel: () => setConfirming(null),
3055
+ onConfirm: () => {
3056
+ const id = confirming;
3057
+ setConfirming(null);
3058
+ if (id === null) return;
3059
+ act(id, rowById.get(id)?.pkg === void 0 ? "uninstall" : "remove-bundle");
3060
+ }
3061
+ }));
3062
+ }
3063
+ //#endregion
3064
+ //#region src/shared/api/bundle-install.ts
3065
+ var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
3066
+ var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
3067
+ var MODULE_VERSIONS_ROUTE = "module-versions";
3068
+ //#endregion
3069
+ //#region src/shared/hooks/bundle-queries.ts
3070
+ function readBundleRegistries() {
3071
+ return apiGet(BUNDLE_REGISTRIES_ROUTE);
3072
+ }
3073
+ function readBundleInspection(spec, registry) {
3074
+ return apiGet(BUNDLE_INSPECT_ROUTE, {
3075
+ spec,
3076
+ ...registry === void 0 || registry === "" ? {} : { registry }
3077
+ });
3078
+ }
3079
+ function readModuleVersions(force = false) {
3080
+ return apiGet(MODULE_VERSIONS_ROUTE, force ? { force: "1" } : void 0);
3081
+ }
3082
+ var AddModule_module_default = {
3083
+ wide: "_wide_1coeb_1",
3084
+ dialog: "_dialog_1coeb_8",
3085
+ content: "_content_1coeb_13",
3086
+ stack: "_stack_1coeb_18",
3087
+ body: "_body_1coeb_25",
3088
+ field: "_field_1coeb_32",
3089
+ input: "_input_1coeb_39",
3090
+ registryField: "_registryField_1coeb_45",
3091
+ options: "_options_1coeb_51",
3092
+ guideToggle: "_guideToggle_1coeb_59",
3093
+ registryToggle: "_registryToggle_1coeb_78",
3094
+ registryWrap: "_registryWrap_1coeb_87",
3095
+ registryChosen: "_registryChosen_1coeb_121",
3096
+ registry: "_registry_1coeb_45",
3097
+ registryOption: "_registryOption_1coeb_143",
3098
+ registryPick: "_registryPick_1coeb_159",
3099
+ registryTitle: "_registryTitle_1coeb_179",
3100
+ registryHint: "_registryHint_1coeb_189",
3101
+ inputError: "_inputError_1coeb_197",
3102
+ guide: "_guide_1coeb_59",
3103
+ guideList: "_guideList_1coeb_214",
3104
+ guideItem: "_guideItem_1coeb_223",
3105
+ guideIndex: "_guideIndex_1coeb_230",
3106
+ guideMain: "_guideMain_1coeb_244",
3107
+ guideTitle: "_guideTitle_1coeb_252",
3108
+ guideHint: "_guideHint_1coeb_258",
3109
+ guideExample: "_guideExample_1coeb_264",
3110
+ guideExampleLabel: "_guideExampleLabel_1coeb_274",
3111
+ footer: "_footer_1coeb_278",
3112
+ hero: "_hero_1coeb_285",
3113
+ heroIcon: "_heroIcon_1coeb_294",
3114
+ pendingTitle: "_pendingTitle_1coeb_311",
3115
+ wizardTitle: "_wizardTitle_1coeb_319",
3116
+ subject: "_subject_1coeb_326",
3117
+ subjectName: "_subjectName_1coeb_337",
3118
+ subjectMeta: "_subjectMeta_1coeb_343",
3119
+ subjectDesc: "_subjectDesc_1coeb_344",
3120
+ result: "_result_1coeb_351",
3121
+ resultWarn: "_resultWarn_1coeb_352",
3122
+ approval: "_approval_1coeb_365",
3123
+ approvalTitle: "_approvalTitle_1coeb_375",
3124
+ approvalText: "_approvalText_1coeb_382",
3125
+ approvalCaution: "_approvalCaution_1coeb_388",
3126
+ note: "_note_1coeb_395",
3127
+ noteWarn: "_noteWarn_1coeb_402",
3128
+ noteError: "_noteError_1coeb_406",
3129
+ problem: "_problem_1coeb_410",
3130
+ detailLabel: "_detailLabel_1coeb_417",
3131
+ detail: "_detail_1coeb_417"
3132
+ };
3133
+ //#endregion
3134
+ //#region src/app/layouts/market/add-module-text.ts
3135
+ var GUIDE_ITEMS = [
3136
+ {
3137
+ titleKey: "panels.market.add.guideIdTitle",
3138
+ exampleKey: "panels.market.add.guideIdExample",
3139
+ hintKey: "panels.market.add.guideIdHint"
3140
+ },
3141
+ {
3142
+ titleKey: "panels.market.add.guideGitTitle",
3143
+ exampleKey: "panels.market.add.guideGitExample",
3144
+ hintKey: "panels.market.add.guideGitHint"
3145
+ },
3146
+ {
3147
+ titleKey: "panels.market.add.guidePathTitle",
3148
+ exampleKey: "panels.market.add.guidePathExample",
3149
+ hintKey: "panels.market.add.guidePathHint"
3150
+ }
3151
+ ];
3152
+ function hostOf(url) {
3153
+ try {
3154
+ return new URL(url).host;
3155
+ } catch {
3156
+ return url;
3157
+ }
3158
+ }
3159
+ var OFFICIAL_NPM_HOST = "registry.npmjs.org";
3160
+ var KNOWN_HOSTS = {
3161
+ [OFFICIAL_NPM_HOST]: "panels.market.add.registryOfficial",
3162
+ "registry.npmmirror.com": "panels.market.add.registryMirror"
3163
+ };
3164
+ function registryNameKey(host) {
3165
+ return KNOWN_HOSTS[host];
3166
+ }
3167
+ function normalizeRegistry(url) {
3168
+ const parsed = new URL(url);
3169
+ if (!parsed.pathname.endsWith("/")) parsed.pathname += "/";
3170
+ return parsed.href;
3171
+ }
3172
+ function registryKey(url, resolved) {
3173
+ const target = url ?? resolved;
3174
+ if (target === null) return "";
3175
+ try {
3176
+ return normalizeRegistry(target);
3177
+ } catch {
3178
+ return target;
3179
+ }
3180
+ }
3181
+ function registryOptions(registries) {
3182
+ const resolved = registries === null ? null : registries.resolved;
3183
+ const entries = [
3184
+ registries === null ? null : registries.registry,
3185
+ ...registries === null ? [] : registries.fallbackRegistries,
3186
+ null
3187
+ ];
3188
+ const offered = [];
3189
+ const keys = /* @__PURE__ */ new Set();
3190
+ for (const entry of entries) {
3191
+ const key = registryKey(entry, resolved);
3192
+ if (keys.has(key)) continue;
3193
+ keys.add(key);
3194
+ const url = entry ?? resolved;
3195
+ if (url === null) {
3196
+ offered.push({
3197
+ choice: {
3198
+ kind: "default",
3199
+ value: ""
3200
+ },
3201
+ host: OFFICIAL_NPM_HOST,
3202
+ nameKey: "panels.market.add.registryDefault"
3203
+ });
3204
+ continue;
3205
+ }
3206
+ const host = hostOf(url);
3207
+ const nameKey = registryNameKey(host);
3208
+ offered.push({
3209
+ choice: entry === null ? {
3210
+ kind: "default",
3211
+ value: ""
3212
+ } : {
3213
+ kind: "url",
3214
+ value: entry
3215
+ },
3216
+ host,
3217
+ ...nameKey === void 0 ? {} : { nameKey }
3218
+ });
3219
+ }
3220
+ offered.push({ choice: {
3221
+ kind: "custom",
3222
+ value: ""
3223
+ } });
3224
+ return offered;
3225
+ }
3226
+ function customRegistryAllowed(value) {
3227
+ return /^https?:\/\//.test(value.trim());
3228
+ }
3229
+ function registryOf(choice, custom) {
3230
+ if (choice.kind === "custom") return customRegistryAllowed(custom) ? custom.trim() : void 0;
3231
+ return choice.value === "" ? void 0 : choice.value;
3232
+ }
3233
+ function registryName(option, t) {
3234
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3235
+ if (option.nameKey !== void 0) return t(option.nameKey);
3236
+ return option.host ?? t("panels.market.add.registryDefault");
3237
+ }
3238
+ function optionLabel(option, t) {
3239
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3240
+ if (option.host === void 0) return t("panels.market.add.registryDefault");
3241
+ return option.nameKey === void 0 ? option.host : t("panels.market.add.registryWithHost", {
3242
+ name: t(option.nameKey),
3243
+ host: option.host
3244
+ });
3245
+ }
3246
+ var PROBLEM_KEYS = {
3247
+ "invalid-spec": "panels.market.add.problemInvalid",
3248
+ "already-installed": "panels.market.add.problemInstalled",
3249
+ "not-found": "panels.market.add.problemNotFound",
3250
+ "not-a-package": "panels.market.add.problemNotPackage",
3251
+ "not-a-bundle": "panels.market.add.problemNotBundle",
3252
+ network: "panels.market.add.problemNetwork",
3253
+ unknown: "panels.market.add.problemUnknown"
3254
+ };
3255
+ function problemKey(problem) {
3256
+ return PROBLEM_KEYS[problem] ?? PROBLEM_KEYS.unknown;
3257
+ }
3258
+ var FAILURE_KEYS = {
3259
+ network: "panels.market.add.failureNetwork",
3260
+ "spec-host": "panels.market.add.failureNetworkHost",
3261
+ "not-found": "panels.market.add.failureNotFound",
3262
+ "no-matching-version": "panels.market.add.failureNoMatchingVersion",
3263
+ "disk-full": "panels.market.add.failureDiskFull",
3264
+ permission: "panels.market.add.failurePermission",
3265
+ "build-blocked": "panels.market.add.failureBuildBlocked",
3266
+ integrity: "panels.market.add.failureIntegrity",
3267
+ timeout: "panels.market.add.failureTimeout",
3268
+ "pnpm-missing": "panels.market.add.failurePnpmMissing",
3269
+ "operation-error": "panels.market.add.failureGeneric",
3270
+ "incompatible-version": "panels.market.add.failureGeneric",
3271
+ "not-bundle": "panels.market.add.failureGeneric",
3272
+ "invalid-spec": "panels.market.add.failureGeneric",
3273
+ "bundle-in-use": "panels.market.add.failureGeneric",
3274
+ "not-removable": "panels.market.add.failureGeneric",
3275
+ "stop-profile": "panels.market.add.failureGeneric",
3276
+ "stale-approval": "panels.market.add.failureGeneric"
3277
+ };
3278
+ function failureCode(change) {
3279
+ if (change.failedAt === "spec-host") return "spec-host";
3280
+ return change.errorCode ?? change.packageResult?.kind ?? change.application;
3281
+ }
3282
+ function failureReasonKey(code) {
3283
+ return FAILURE_KEYS[code];
3284
+ }
3285
+ function failureReason(code, application, t) {
3286
+ const key = failureReasonKey(code);
3287
+ if (key !== void 0) return t(key);
3288
+ if (code === application) return t("panels.market.add.reason.unknown");
3289
+ return code;
3290
+ }
3291
+ var SUPPLY_KEYS = {
3292
+ "pending-restart": "panels.market.add.supplyPending",
3293
+ failed: "panels.market.add.supplyFailed",
3294
+ "not-a-module": "panels.market.add.notModule",
3295
+ "no-needs": void 0
3296
+ };
3297
+ function supplyKey(state) {
3298
+ return SUPPLY_KEYS[state];
3299
+ }
3300
+ //#endregion
3301
+ //#region src/app/layouts/market/AddModuleRegistry.tsx
3302
+ var REGISTRY_ID = "wb-add-module-registry";
3303
+ function AddModuleRegistry({ t, state }) {
3304
+ const chosen = state.choices.find((option) => option.choice.kind === state.choice.kind && option.choice.value === state.choice.value);
3305
+ const customBad = state.choice.kind === "custom" && state.custom.trim() !== "" && !customRegistryAllowed(state.custom);
3306
+ const registryRoot = useRef(null);
3307
+ const registryAnchor = useRef(null);
3308
+ const registryPanel = useRef(null);
3309
+ const registryPosition = (0, _deepseek_ai_dsh_client_ui_primitives.useAnchoredPosition)({
3310
+ open: state.registryOpen,
3311
+ anchorRef: registryAnchor,
3312
+ panelRef: registryPanel,
3313
+ align: "end",
3314
+ gap: 6,
3315
+ margin: 12
3316
+ });
3317
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(registryRoot, state.registryOpen, (next) => {
3318
+ if (!next) state.closeRegistry();
3319
+ });
3320
+ return /* @__PURE__ */ h("div", {
3321
+ className: AddModule_module_default.registryWrap,
3322
+ ref: registryRoot,
3323
+ onKeyDown: (event) => {
3324
+ if (event.key !== "Escape" || !state.registryOpen) return;
3325
+ event.stopPropagation();
3326
+ state.closeRegistry();
3327
+ }
3328
+ }, /* @__PURE__ */ h("button", {
3329
+ type: "button",
3330
+ ref: registryAnchor,
3331
+ className: AddModule_module_default.registryToggle,
3332
+ "aria-expanded": state.registryOpen,
3333
+ "aria-haspopup": "dialog",
3334
+ "aria-controls": REGISTRY_ID,
3335
+ disabled: state.phase === "inspecting",
3336
+ onClick: state.toggleRegistry
3337
+ }, /* @__PURE__ */ h("span", null, t("panels.market.add.registryToggle")), " ", /* @__PURE__ */ h("span", { className: AddModule_module_default.registryChosen }, chosen === void 0 ? t("panels.market.add.registryDefault") : registryName(chosen, t)), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })), state.registryOpen ? /* @__PURE__ */ h("div", {
3338
+ id: REGISTRY_ID,
3339
+ className: AddModule_module_default.registry,
3340
+ ref: registryPanel,
3341
+ role: "dialog",
3342
+ "aria-label": t("panels.market.add.registryLegend"),
3343
+ style: registryPosition ?? void 0
3344
+ }, state.choices.map((option) => {
3345
+ const active = option.choice.kind === state.choice.kind && option.choice.value === state.choice.value;
3346
+ if (!(option.choice.kind === "custom")) return /* @__PURE__ */ h("label", {
3347
+ key: `${option.choice.kind}|${option.choice.value}`,
3348
+ className: AddModule_module_default.registryOption,
3349
+ "data-checked": active
3350
+ }, /* @__PURE__ */ h("input", {
3351
+ type: "radio",
3352
+ name: REGISTRY_ID,
3353
+ checked: active,
3354
+ onChange: () => state.setChoice(option.choice)
3355
+ }), /* @__PURE__ */ h("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ h("span", null, optionLabel(option, t))));
3356
+ return /* @__PURE__ */ h("div", {
3357
+ key: `${option.choice.kind}|${option.choice.value}`,
3358
+ className: AddModule_module_default.registryOption,
3359
+ "data-checked": active
3360
+ }, /* @__PURE__ */ h("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ h("input", {
3361
+ type: "radio",
3362
+ name: REGISTRY_ID,
3363
+ checked: active,
3364
+ onChange: () => state.setChoice(option.choice)
3365
+ }), /* @__PURE__ */ h("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ h("span", null, t("panels.market.add.registryCustom")))), /* @__PURE__ */ h(TextField, {
3366
+ type: "text",
3367
+ className: AddModule_module_default.registryField,
3368
+ "aria-label": t("panels.market.add.registryCustom"),
3369
+ placeholder: t("panels.market.add.registryCustomPlaceholder"),
3370
+ value: state.custom,
3371
+ disabled: !active,
3372
+ invalid: customBad,
3373
+ onChange: (event) => state.setCustom(event.target.value)
3374
+ }), customBad ? /* @__PURE__ */ h("span", {
3375
+ className: AddModule_module_default.inputError,
3376
+ role: "alert"
3377
+ }, t("panels.market.add.registryCustomInvalid")) : null, /* @__PURE__ */ h("span", { className: AddModule_module_default.registryHint }, t("panels.market.add.registryCustomHint")));
3378
+ })) : null);
3379
+ }
3380
+ //#endregion
3381
+ //#region src/app/layouts/market/AddModuleForm.tsx
3382
+ function AddModuleForm({ t, state }) {
3383
+ return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.field }, /* @__PURE__ */ h(TextField, {
3384
+ type: "text",
3385
+ className: AddModule_module_default.input,
3386
+ value: state.spec,
3387
+ placeholder: t("panels.market.add.specPlaceholder"),
3388
+ spellCheck: false,
3389
+ autoComplete: "off",
3390
+ "aria-label": t("panels.market.add.specLabel"),
3391
+ invalid: state.problem !== null,
3392
+ onChange: (event) => state.setSpec(event.target.value),
3393
+ onKeyDown: (event) => {
3394
+ if (event.key === "Enter" && state.spec.trim() !== "") state.check();
3395
+ }
3396
+ })), state.problem === null ? null : /* @__PURE__ */ h("p", {
3397
+ className: AddModule_module_default.problem,
3398
+ role: "alert"
3399
+ }, t(problemKey(state.problem.problem), { reason: state.problem.reason })), state.failure === null ? null : /* @__PURE__ */ h("p", {
3400
+ className: AddModule_module_default.problem,
3401
+ role: "alert"
3402
+ }, state.failure), /* @__PURE__ */ h("div", { className: AddModule_module_default.options }, /* @__PURE__ */ h("button", {
3403
+ type: "button",
3404
+ className: AddModule_module_default.guideToggle,
3405
+ "aria-expanded": state.guideOpen,
3406
+ onClick: state.toggleGuide
3407
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 }), /* @__PURE__ */ h("span", null, t(state.guideOpen ? "panels.market.add.guideHide" : "panels.market.add.guideToggle"))), /* @__PURE__ */ h(AddModuleRegistry, {
3408
+ t,
3409
+ state
3410
+ })), state.guideOpen ? /* @__PURE__ */ h("div", { className: AddModule_module_default.guide }, /* @__PURE__ */ h("ol", { className: AddModule_module_default.guideList }, GUIDE_ITEMS.map((item, index) => /* @__PURE__ */ h("li", {
3411
+ className: AddModule_module_default.guideItem,
3412
+ key: item.exampleKey
3413
+ }, /* @__PURE__ */ h("span", {
3414
+ className: AddModule_module_default.guideIndex,
3415
+ "aria-hidden": "true"
3416
+ }, index + 1), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideMain }, /* @__PURE__ */ h("span", { className: AddModule_module_default.guideTitle }, t(item.titleKey)), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideHint }, t(item.hintKey)), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideExample }, /* @__PURE__ */ h("span", { className: AddModule_module_default.guideExampleLabel }, t("panels.market.add.guideExampleLabel")), /* @__PURE__ */ h("code", null, t(item.exampleKey)))), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3417
+ type: "button",
3418
+ size: "sm",
3419
+ variant: "outline",
3420
+ "aria-label": t("panels.market.add.guideFill"),
3421
+ onClick: () => state.setSpec(t(item.exampleKey))
3422
+ }, t("panels.market.add.guideFill")))))) : null);
3423
+ }
3424
+ var SafetyNote_module_default = { note: "_note_1enlz_1" };
3425
+ //#endregion
3426
+ //#region src/app/layouts/market/SafetyNote.tsx
3427
+ function SafetyNote({ t }) {
3428
+ return /* @__PURE__ */ h("p", {
3429
+ className: SafetyNote_module_default.note,
3430
+ role: "note"
3431
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {
3432
+ size: 14,
3433
+ "aria-hidden": "true"
3434
+ }), /* @__PURE__ */ h("span", null, t("panels.market.add.guideSafety")));
3435
+ }
3436
+ //#endregion
3437
+ //#region src/app/layouts/market/AddModuleStages.tsx
3438
+ var SUPPLY_TONES = {
3439
+ "pending-restart": `${AddModule_module_default.note} ${AddModule_module_default.noteWarn}`,
3440
+ "not-a-module": `${AddModule_module_default.note} ${AddModule_module_default.noteWarn}`,
3441
+ failed: `${AddModule_module_default.note} ${AddModule_module_default.noteError}`
3442
+ };
3443
+ function supplyTone(state) {
3444
+ return SUPPLY_TONES[state] ?? AddModule_module_default.note;
3445
+ }
3446
+ function AddModulePending({ t, kind }) {
3447
+ return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
3448
+ className: AddModule_module_default.heroIcon,
3449
+ "data-state": "ongoing",
3450
+ "aria-hidden": "true"
3451
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3452
+ state: "ongoing",
3453
+ size: 28
3454
+ })), /* @__PURE__ */ h("h2", {
3455
+ className: AddModule_module_default.pendingTitle,
3456
+ role: "status"
3457
+ }, kind === "inspecting" ? t("panels.market.add.checking") : t("panels.market.add.installingTitle"))));
3458
+ }
3459
+ function AddModulePreview({ t, state }) {
3460
+ const preview = state.preview;
3461
+ if (preview === null) return null;
3462
+ const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
3463
+ return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), preview.description === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, source)));
3464
+ }
3465
+ function AddModuleResult({ t, state }) {
3466
+ const outcome = state.outcome;
3467
+ if (outcome === null) return null;
3468
+ const reason = failureReason(failureCode(outcome.change), outcome.change.application, t);
3469
+ const supply = supplyKey(outcome.supply.state);
3470
+ const builds = state.builds;
3471
+ const failed = outcome.change.application === "failed";
3472
+ const restart = outcome.change.application === "restart-required";
3473
+ const cancelled = outcome.change.application === "cancelled";
3474
+ const notModule = outcome.supply.state === "not-a-module";
3475
+ const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
3476
+ return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
3477
+ className: AddModule_module_default.heroIcon,
3478
+ "data-state": failed ? "error" : cancelled ? "idle" : "done",
3479
+ "aria-hidden": "true"
3480
+ }, failed ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, { size: 28 }) : cancelled ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3481
+ state: "idle",
3482
+ size: 28
3483
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ h("h2", {
3484
+ className: AddModule_module_default.wizardTitle,
3485
+ role: failed ? "alert" : "status"
3486
+ }, failed ? t("panels.market.add.failedTitle") : cancelled ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), failed ? /* @__PURE__ */ h("p", {
3487
+ className: AddModule_module_default.resultWarn,
3488
+ role: "alert"
3489
+ }, t("panels.market.add.failed", { reason })) : restart ? /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")) : cancelled || notModule ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ h("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (failed || cancelled) ? null : /* @__PURE__ */ h("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ h("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
3490
+ }
3491
+ //#endregion
3492
+ //#region src/app/layouts/market/add-module-mock.ts
3493
+ function change(over) {
3494
+ return {
3495
+ application: "applied",
3496
+ stage: "install",
3497
+ changed: true,
3498
+ target: "@dsh-workbench/module-hello",
3499
+ ...over
3500
+ };
3501
+ }
3502
+ function outcome(over, supply = { state: "installed" }) {
3503
+ return {
3504
+ change: change(over),
3505
+ module: {
3506
+ kind: "module",
3507
+ pkg: "@dsh-workbench/module-hello",
3508
+ unit: "hello",
3509
+ version: "0.1.2"
3510
+ },
3511
+ supply
3512
+ };
3513
+ }
3514
+ function refused(problem, reason = "") {
3515
+ return {
3516
+ id: `refused-${problem}`,
3517
+ label: `预检拒:${problem}`,
3518
+ phase: "idle",
3519
+ spec: "@dsh-workbench/module-nope",
3520
+ problem: {
3521
+ problem,
3522
+ reason
3523
+ }
3524
+ };
3525
+ }
3526
+ var ADD_MODULE_MOCKS = [
3527
+ {
3528
+ id: "empty",
3529
+ label: "刚打开",
3530
+ phase: "idle",
3531
+ spec: ""
3532
+ },
3533
+ {
3534
+ id: "typed",
3535
+ label: "填了包名",
3536
+ phase: "idle",
3537
+ spec: "@dsh-workbench/module-hello"
3538
+ },
3539
+ {
3540
+ id: "guide",
3541
+ label: "展开了示例",
3542
+ phase: "idle",
3543
+ spec: "",
3544
+ guideOpen: true
3545
+ },
3546
+ {
3547
+ id: "inspecting",
3548
+ label: "正在预检",
3549
+ phase: "inspecting",
3550
+ spec: "@dsh-workbench/module-hello"
3551
+ },
3552
+ refused("invalid-spec"),
3553
+ refused("already-installed", "已经在 profile 里:@dsh-workbench/module-hello@0.1.2"),
3554
+ refused("not-found"),
3555
+ refused("not-a-package"),
3556
+ refused("not-a-bundle"),
3557
+ refused("network", "getaddrinfo ENOTFOUND registry.example.com"),
3558
+ refused("unknown", "pnpm 的返回码是 1"),
3559
+ {
3560
+ id: "preview",
3561
+ label: "预览(可装)",
3562
+ phase: "preview",
3563
+ spec: "@dsh-workbench/module-hello",
3564
+ preview: {
3565
+ name: "@dsh-workbench/module-hello",
3566
+ version: "0.1.2",
3567
+ description: "最小样本模块:一枚「你好」卡片",
3568
+ registry: "registry.npmmirror.com"
3569
+ }
3570
+ },
3571
+ {
3572
+ id: "preview-no-source",
3573
+ label: "预览(问不出源)",
3574
+ phase: "preview",
3575
+ spec: "@dsh-workbench/module-hello",
3576
+ preview: {
3577
+ name: "@dsh-workbench/module-hello",
3578
+ version: "",
3579
+ description: "",
3580
+ registry: ""
3581
+ }
3582
+ },
3583
+ {
3584
+ id: "installing",
3585
+ label: "正在安装(可取消)",
3586
+ phase: "installing",
3587
+ spec: "@dsh-workbench/module-hello"
3588
+ },
3589
+ {
3590
+ id: "needs-approval",
3591
+ label: "安装脚本待批",
3592
+ phase: "result",
3593
+ spec: "@dsh-workbench/module-hello",
3594
+ outcome: {
3595
+ ...outcome({
3596
+ application: "failed",
3597
+ stage: "install",
3598
+ errorCode: "build-blocked",
3599
+ pendingBuilds: ["esbuild", "sharp"]
3600
+ }),
3601
+ supply: {
3602
+ state: "failed",
3603
+ reason: "装上之前得先允许安装脚本"
3604
+ }
3605
+ }
3606
+ },
3607
+ {
3608
+ id: "failed-registry",
3609
+ label: "失败:源上没有",
3610
+ phase: "result",
3611
+ spec: "@dsh-workbench/module-nope",
3612
+ outcome: outcome({
3613
+ application: "failed",
3614
+ stage: "install",
3615
+ failedAt: "registry",
3616
+ errorCode: "not-found"
3617
+ })
3618
+ },
3619
+ {
3620
+ id: "failed-pnpm",
3621
+ label: "失败:pnpm 执行出错",
3622
+ phase: "result",
3623
+ spec: "@dsh-workbench/module-hello",
3624
+ outcome: outcome({
3625
+ application: "failed",
3626
+ stage: "install",
3627
+ errorCode: "operation-error",
3628
+ errorDetail: "ERR_PNPM_FETCH_404 GET https://registry.example.com/@dsh-workbench%2Fmodule-hello: Not Found"
3629
+ })
3630
+ },
3631
+ {
3632
+ id: "done-applied",
3633
+ label: "装好了(已生效)",
3634
+ phase: "result",
3635
+ spec: "@dsh-workbench/module-hello",
3636
+ outcome: outcome({})
3637
+ },
3638
+ {
3639
+ id: "done-restart",
3640
+ label: "装好了(要重启)",
3641
+ phase: "result",
3642
+ spec: "@dsh-workbench/module-hello",
3643
+ outcome: outcome({ application: "restart-required" }, { state: "pending-restart" })
3644
+ },
3645
+ {
3646
+ id: "not-a-module",
3647
+ label: "装进来的不是模块",
3648
+ phase: "result",
3649
+ spec: "some-random-package",
3650
+ outcome: {
3651
+ change: change({ target: "some-random-package" }),
3652
+ module: {
3653
+ kind: "not-module",
3654
+ pkg: "some-random-package"
3655
+ },
3656
+ supply: { state: "not-a-module" }
3657
+ }
3658
+ },
3659
+ {
3660
+ id: "cancelled",
3661
+ label: "已取消",
3662
+ phase: "result",
3663
+ spec: "@dsh-workbench/module-hello",
3664
+ outcome: outcome({
3665
+ application: "cancelled",
3666
+ changed: false
3667
+ }, { state: "no-needs" })
3668
+ },
3669
+ {
3670
+ id: "done-no-needs",
3671
+ label: "装好了(不要额外供给)",
3672
+ phase: "result",
3673
+ spec: "@dsh-workbench/module-plain",
3674
+ outcome: {
3675
+ change: change({ target: "@dsh-workbench/module-plain" }),
3676
+ module: {
3677
+ kind: "module",
3678
+ pkg: "@dsh-workbench/module-plain",
3679
+ unit: "plain",
3680
+ version: "1.0.0"
3681
+ },
3682
+ supply: { state: "no-needs" }
3683
+ }
3684
+ },
3685
+ {
3686
+ id: "removed",
3687
+ label: "移除掉了",
3688
+ phase: "result",
3689
+ spec: "some-random-package",
3690
+ outcome: {
3691
+ change: change({
3692
+ stage: "remove",
3693
+ target: "some-random-package"
3694
+ }),
3695
+ module: {
3696
+ kind: "not-module",
3697
+ pkg: "some-random-package"
3698
+ },
3699
+ supply: { state: "not-a-module" }
3700
+ }
3701
+ }
3702
+ ];
3703
+ var frozen = () => {};
3704
+ function stateOfMock(base, mock) {
3705
+ return {
3706
+ ...base,
3707
+ spec: mock.spec,
3708
+ guideOpen: mock.guideOpen ?? false,
3709
+ phase: mock.phase,
3710
+ choices: base.choices,
3711
+ custom: "",
3712
+ registryOpen: false,
3713
+ problem: mock.problem ?? null,
3714
+ preview: mock.preview ?? null,
3715
+ outcome: mock.outcome ?? null,
3716
+ failure: mock.failure ?? null,
3717
+ builds: mock.outcome?.change.pendingBuilds ?? [],
3718
+ setSpec: frozen,
3719
+ setChoice: frozen,
3720
+ setCustom: frozen,
3721
+ toggleRegistry: frozen,
3722
+ closeRegistry: frozen,
3723
+ toggleGuide: frozen,
3724
+ check: frozen,
3725
+ edit: frozen,
3726
+ install: frozen,
3727
+ cancelInstall: frozen,
3728
+ removeIt: frozen
3729
+ };
3730
+ }
3731
+ //#endregion
3732
+ //#region src/app/layouts/market/use-add-module.ts
3733
+ function newRequestId() {
3734
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
3735
+ }
3736
+ function useAddModule(options) {
3737
+ const { open, onInstalled, failedText } = options;
3738
+ const [spec, setSpec] = useState("");
3739
+ const [choice, setChoice] = useState({
3740
+ kind: "default",
3741
+ value: ""
3742
+ });
3743
+ const [custom, setCustom] = useState("");
3744
+ const [registryOpen, setRegistryOpen] = useState(false);
3745
+ const [guideOpen, setGuideOpen] = useState(false);
3746
+ const [phase, setPhase] = useState("idle");
3747
+ const [choices, setChoices] = useState(() => registryOptions(null));
3748
+ const [problem, setProblem] = useState(null);
3749
+ const [preview, setPreview] = useState(null);
3750
+ const [outcome, setOutcome] = useState(null);
3751
+ const [failure, setFailure] = useState(null);
3752
+ const generationRef = useRef(0);
3753
+ const requestIdRef = useRef("");
3754
+ const write = useHostWrite({
3755
+ channel: "provision",
3756
+ networkText: failedText
2480
3757
  });
2481
- const [confirming, setConfirming] = useState(mock?.confirming ?? null);
2482
- const [failed, setFailed] = useState(mock?.failure ?? null);
2483
- const act = async (id, action) => {
2484
- if (mock !== void 0) return;
2485
- setPending({
2486
- id,
2487
- action
3758
+ const cancel = useHostWrite({
3759
+ channel: "provision",
3760
+ networkText: failedText
3761
+ });
3762
+ const remove = useHostWrite({
3763
+ channel: "provision",
3764
+ networkText: failedText
3765
+ });
3766
+ useEffect(() => {
3767
+ if (!open) return void 0;
3768
+ let alive = true;
3769
+ readBundleRegistries().then((response) => {
3770
+ if (!alive) return;
3771
+ setChoices(registryOptions(response.ok ? response.registries : null));
2488
3772
  });
2489
- setConfirming(null);
2490
- setFailed(null);
2491
- const dependency = action === "update-dependency";
2492
- const outcome = await provision.send(dependency ? {
2493
- action,
2494
- id
2495
- } : {
2496
- action,
2497
- unit: id
3773
+ return () => {
3774
+ alive = false;
3775
+ };
3776
+ }, [open]);
3777
+ const registry = registryOf(choice, custom);
3778
+ useEffect(() => {
3779
+ if (open) return;
3780
+ generationRef.current += 1;
3781
+ setGuideOpen(false);
3782
+ setRegistryOpen(false);
3783
+ setProblem(null);
3784
+ setPreview(null);
3785
+ setOutcome(null);
3786
+ setFailure(null);
3787
+ setPhase("idle");
3788
+ }, [open]);
3789
+ const check = useCallback(() => {
3790
+ const wanted = spec.trim();
3791
+ if (wanted === "") return;
3792
+ const mine = generationRef.current + 1;
3793
+ generationRef.current = mine;
3794
+ setProblem(null);
3795
+ setFailure(null);
3796
+ setPreview(null);
3797
+ setOutcome(null);
3798
+ setRegistryOpen(false);
3799
+ setPhase("inspecting");
3800
+ readBundleInspection(wanted, registry).then((response) => {
3801
+ if (generationRef.current !== mine) return;
3802
+ if (!response.ok) {
3803
+ setFailure(response.error.message);
3804
+ setPhase("idle");
3805
+ return;
3806
+ }
3807
+ const inspection = response.inspection;
3808
+ if (inspection.status === "refused") {
3809
+ setProblem({
3810
+ problem: inspection.problem,
3811
+ reason: inspection.reason
3812
+ });
3813
+ setPhase("idle");
3814
+ return;
3815
+ }
3816
+ setPreview({
3817
+ name: inspection.name ?? wanted,
3818
+ version: inspection.version ?? "",
3819
+ description: inspection.description ?? "",
3820
+ registry: inspection.registry ?? ""
3821
+ });
3822
+ setPhase("preview");
2498
3823
  });
2499
- setPending(null);
2500
- if (!outcome.ok) setFailed({
2501
- id,
2502
- message: t("panels.market.failed", { reason: outcome.message })
3824
+ }, [spec, registry]);
3825
+ const install = useCallback((approvedBuilds = []) => {
3826
+ const wanted = spec.trim();
3827
+ if (wanted === "") return;
3828
+ const mine = generationRef.current + 1;
3829
+ generationRef.current = mine;
3830
+ const id = newRequestId();
3831
+ requestIdRef.current = id;
3832
+ setFailure(null);
3833
+ setPhase("installing");
3834
+ write.send({
3835
+ action: "install-bundle",
3836
+ spec: wanted,
3837
+ ...registry === void 0 ? {} : { registry },
3838
+ requestId: id,
3839
+ ...approvedBuilds.length === 0 ? {} : { approvedBuilds: [...approvedBuilds] }
3840
+ }).then((response) => {
3841
+ if (generationRef.current !== mine) return;
3842
+ if (!response.ok) {
3843
+ setFailure(response.message);
3844
+ setPhase("result");
3845
+ return;
3846
+ }
3847
+ const value = response.value;
3848
+ setOutcome({
3849
+ change: value.change,
3850
+ module: value.module,
3851
+ supply: value.supply
3852
+ });
3853
+ setPhase("result");
3854
+ if (value.change.application === "applied" || value.change.application === "restart-required") onInstalled();
3855
+ });
3856
+ }, [
3857
+ spec,
3858
+ registry,
3859
+ write,
3860
+ onInstalled
3861
+ ]);
3862
+ const cancelInstall = useCallback(() => {
3863
+ cancel.send({
3864
+ action: "cancel-install",
3865
+ requestId: requestIdRef.current
2503
3866
  });
2504
- else onChanged();
3867
+ }, [cancel]);
3868
+ const removeIt = useCallback(() => {
3869
+ const pkg = outcome?.module.pkg;
3870
+ if (pkg === void 0) return;
3871
+ remove.send({
3872
+ action: "remove-bundle",
3873
+ name: pkg
3874
+ }).then((result) => {
3875
+ if (!result.ok) return;
3876
+ onInstalled();
3877
+ });
3878
+ }, [
3879
+ outcome,
3880
+ remove,
3881
+ onInstalled
3882
+ ]);
3883
+ const edit = useCallback(() => {
3884
+ generationRef.current += 1;
3885
+ setProblem(null);
3886
+ setFailure(null);
3887
+ setPreview(null);
3888
+ setPhase("idle");
3889
+ }, []);
3890
+ return {
3891
+ spec,
3892
+ choice,
3893
+ custom,
3894
+ registryOpen,
3895
+ guideOpen,
3896
+ phase,
3897
+ choices,
3898
+ problem,
3899
+ preview,
3900
+ outcome,
3901
+ failure,
3902
+ builds: outcome?.change.pendingBuilds ?? [],
3903
+ setSpec,
3904
+ setChoice: useCallback((next) => {
3905
+ setChoice(next);
3906
+ }, []),
3907
+ setCustom,
3908
+ toggleRegistry: useCallback(() => setRegistryOpen((value) => !value), []),
3909
+ closeRegistry: useCallback(() => setRegistryOpen(false), []),
3910
+ toggleGuide: useCallback(() => setGuideOpen((value) => !value), []),
3911
+ check,
3912
+ edit,
3913
+ install,
3914
+ cancelInstall,
3915
+ removeIt
2505
3916
  };
2506
- if (!freshness.loaded) return null;
2507
- if (rows.length === 0) return /* @__PURE__ */ h("div", { className: "wb-marketEmpty" }, /* @__PURE__ */ h("div", { className: "wb-marketEmptyTitle" }, t("panels.market.empty")));
2508
- return /* @__PURE__ */ h(Fragment, null, marketSections(rows).map((section) => /* @__PURE__ */ h("section", {
2509
- className: "wb-marketSection",
2510
- key: section.id
2511
- }, /* @__PURE__ */ h("div", { className: "wb-marketSectionHead" }, /* @__PURE__ */ h("h2", { className: "wb-marketSectionTitle" }, t(section.titleKey)), /* @__PURE__ */ h("span", { className: "wb-marketSectionCount" }, section.rows.length)), /* @__PURE__ */ h("ul", { className: "wb-marketList" }, section.rows.map((row) => /* @__PURE__ */ h(MarketLine, {
2512
- key: row.id,
3917
+ }
3918
+ //#endregion
3919
+ //#region src/app/layouts/market/AddModuleDialog.tsx
3920
+ function AddModuleDialog({ t, open, onClose, onInstalled }) {
3921
+ const real = useAddModule({
3922
+ open,
3923
+ onInstalled,
3924
+ failedText: t("panels.failed")
3925
+ });
3926
+ const pick = useFixturePick({
3927
+ fixtures: ADD_MODULE_MOCKS,
3928
+ initial: ADD_MODULE_MOCKS[0]?.id ?? null
3929
+ });
3930
+ const mock = pick.enabled ? pick.current : void 0;
3931
+ const state = mock === void 0 ? real : stateOfMock(real, mock);
3932
+ if (!open) return null;
3933
+ const installing = state.phase === "installing";
3934
+ const checking = state.phase === "inspecting";
3935
+ const empty = state.spec.trim() === "";
3936
+ const failed = state.outcome?.change.application === "failed";
3937
+ const builds = state.builds;
3938
+ const notModule = state.outcome?.supply.state === "not-a-module";
3939
+ const footer = /* @__PURE__ */ h(Fragment, null, state.phase === "idle" ? /* @__PURE__ */ h("div", { className: AddModule_module_default.footer }, /* @__PURE__ */ h(SafetyNote, { t }), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3940
+ type: "button",
3941
+ variant: "primary",
3942
+ size: "md",
3943
+ className: AddModule_module_default.wide,
3944
+ disabled: empty || checking,
3945
+ "aria-busy": checking,
3946
+ onClick: state.check
3947
+ }, checking ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3948
+ state: "ongoing",
3949
+ size: 12
3950
+ }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3951
+ type: "button",
3952
+ variant: "outline",
3953
+ size: "md",
3954
+ onClick: state.edit
3955
+ }, t("panels.market.add.edit")), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3956
+ type: "button",
3957
+ variant: "primary",
3958
+ size: "md",
3959
+ onClick: () => state.install()
3960
+ }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3961
+ type: "button",
3962
+ variant: "outline",
3963
+ size: "sm",
3964
+ onClick: state.cancelInstall
3965
+ }, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ h(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3966
+ type: "button",
3967
+ variant: "outline",
3968
+ size: "md",
3969
+ onClick: state.edit
3970
+ }, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3971
+ type: "button",
3972
+ variant: "outline",
3973
+ size: "md",
3974
+ className: "wb-dangerAction",
3975
+ onClick: state.removeIt
3976
+ }, t("panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3977
+ type: "button",
3978
+ variant: "outline",
3979
+ size: "md",
3980
+ onClick: onClose
3981
+ }, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3982
+ type: "button",
3983
+ variant: "primary",
3984
+ size: "md",
3985
+ onClick: () => state.install(builds)
3986
+ }, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3987
+ type: "button",
3988
+ variant: "primary",
3989
+ size: "md",
3990
+ onClick: () => state.install()
3991
+ }, t("panels.market.add.retry")) : null) : null);
3992
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Modal, {
3993
+ open,
3994
+ onClose: () => {
3995
+ if (!installing) onClose();
3996
+ },
3997
+ title: t("panels.market.add.title"),
3998
+ description: t("panels.market.add.description"),
3999
+ closeLabel: t("panels.market.add.close"),
4000
+ className: AddModule_module_default.dialog,
4001
+ contentClassName: AddModule_module_default.content,
4002
+ footer
4003
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, pick.enabled ? /* @__PURE__ */ h(MockStrip, {
4004
+ mocks: ADD_MODULE_MOCKS,
4005
+ index: pick.index,
4006
+ note: "夹具:只切状态,不发请求",
4007
+ onPick: (at) => pick.pick(ADD_MODULE_MOCKS[at]?.id ?? null)
4008
+ }) : null, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
2513
4009
  t,
2514
- row,
2515
- pending,
2516
- confirming: confirming === row.id,
2517
- failure: failed?.id === row.id ? failed.message : null,
2518
- onAct: (action) => action === "uninstall" ? setConfirming(row.id) : void act(row.id, action),
2519
- onConfirm: () => void act(row.id, "uninstall"),
2520
- onCancel: () => setConfirming(null)
2521
- }))))), /* @__PURE__ */ h("footer", { className: "wb-modulesFoot" }, /* @__PURE__ */ h("span", { className: "wb-modulesFootText" }, t("panels.market.foot"))), shared.length === 0 ? null : /* @__PURE__ */ h("section", { className: "wb-marketSection" }, /* @__PURE__ */ h("div", { className: "wb-marketSectionHead" }, /* @__PURE__ */ h("h2", { className: "wb-marketSectionTitle" }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: "wb-marketSectionCount" }, shared.length), /* @__PURE__ */ h(MarketCheckedAt, {
4010
+ state
4011
+ }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
2522
4012
  t,
2523
- at: freshness.checkedAt
2524
- })), /* @__PURE__ */ h("ul", { className: "wb-marketList" }, shared.map((row) => /* @__PURE__ */ h(SharedLine, {
2525
- key: row.id,
4013
+ kind: "inspecting"
4014
+ }) : null, state.phase === "preview" ? /* @__PURE__ */ h(AddModulePreview, {
2526
4015
  t,
2527
- row,
2528
- pending,
2529
- failure: failed?.id === row.id ? failed.message : null,
2530
- onAct: (action) => void act(row.id, action)
2531
- })))));
4016
+ state
4017
+ }) : null, state.phase === "installing" ? /* @__PURE__ */ h(AddModulePending, {
4018
+ t,
4019
+ kind: "installing"
4020
+ }) : null, state.phase === "result" ? /* @__PURE__ */ h(AddModuleResult, {
4021
+ t,
4022
+ state
4023
+ }) : null));
2532
4024
  }
2533
4025
  //#endregion
2534
4026
  //#region src/app/layouts/market/panel.tsx
@@ -2538,8 +4030,13 @@ var MOCK_FRESHNESS = {
2538
4030
  checking: false,
2539
4031
  checkedAt: null
2540
4032
  };
2541
- function makeMarketEntryIcon(manifests) {
4033
+ function useLiveManifests(units) {
4034
+ useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
4035
+ return units.manifests();
4036
+ }
4037
+ function makeMarketEntryIcon(units) {
2542
4038
  return function MarketEntryIcon({ size = 16 }) {
4039
+ const manifests = useLiveManifests(units);
2543
4040
  const { capabilities } = useCapabilityMap(0);
2544
4041
  const hasUpdates = marketHasUpdates(marketRows(manifests, capabilities), sharedRows(manifests, capabilities));
2545
4042
  useEffect(() => {
@@ -2549,12 +4046,35 @@ function makeMarketEntryIcon(manifests) {
2549
4046
  return /* @__PURE__ */ h(IconModules, { size });
2550
4047
  };
2551
4048
  }
2552
- function MarketPanel({ t, manifests }) {
2553
- const { capabilities, checkedAt, checking, forceProbe, reload } = useCapabilityMap(0);
4049
+ function MarketPanel({ t, units }) {
4050
+ const manifests = useLiveManifests(units);
4051
+ const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
2554
4052
  const [decided, setDecided] = useState(false);
4053
+ const [adding, setAdding] = useState(false);
4054
+ const [updates, setUpdates] = useState({});
4055
+ const [installed, setInstalled] = useState([]);
4056
+ const [installedRead, setInstalledRead] = useState(false);
4057
+ const loadUpdates = useCallback((force = false) => {
4058
+ readModuleVersions(force).then((response) => {
4059
+ setInstalledRead(true);
4060
+ if (!response.ok) return;
4061
+ setInstalled(response.modules);
4062
+ const next = {};
4063
+ for (const module of response.modules) next[module.unit] = {
4064
+ installed: module.installed,
4065
+ ...module.latest === void 0 ? {} : { latest: module.latest }
4066
+ };
4067
+ setUpdates(next);
4068
+ });
4069
+ }, []);
4070
+ const reload = useCallback(() => {
4071
+ reloadCapability();
4072
+ loadUpdates();
4073
+ }, [loadUpdates, reloadCapability]);
2555
4074
  useEffect(() => {
2556
4075
  if (decided) return;
2557
4076
  setDecided(true);
4077
+ loadUpdates();
2558
4078
  if (!shouldProbeOnEnter({
2559
4079
  checkedAt,
2560
4080
  now: Date.now(),
@@ -2565,27 +4085,45 @@ function MarketPanel({ t, manifests }) {
2565
4085
  }, [
2566
4086
  decided,
2567
4087
  checkedAt,
2568
- forceProbe
4088
+ forceProbe,
4089
+ loadUpdates
2569
4090
  ]);
2570
4091
  const freshness = {
2571
4092
  loaded: capabilities !== null,
2572
4093
  checking,
2573
4094
  checkedAt
2574
4095
  };
2575
- const marketMocks = useMemo(() => buildMarketMocks(manifests), [manifests]);
4096
+ const pendingFreshness = {
4097
+ loaded: false,
4098
+ checking: true,
4099
+ checkedAt: null
4100
+ };
4101
+ const marketMocks = useMemo(() => buildMarketMocks(fixtureRoster(manifests)), [manifests]);
2576
4102
  const fixturePick = useFixturePick({
2577
4103
  fixtures: marketMocks,
2578
4104
  initial: marketMocks[0]?.id ?? null
2579
4105
  });
2580
4106
  const mock = fixturePick.enabled ? fixturePick.current : void 0;
2581
4107
  const mockNonce = fixturePick.nonce;
2582
- return /* @__PURE__ */ h("div", { className: "wb-marketPage" }, /* @__PURE__ */ h("header", { className: "wb-marketPageHead" }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: "wb-marketPageTitle" }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: "wb-marketPageIntro" }, t("panels.market.lead"))), /* @__PURE__ */ h("button", {
4108
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
2583
4109
  type: "button",
2584
- className: `wb-outlineButton wb-marketRefresh${checking ? " wb-spinning" : ""}`,
2585
- title: t("panels.market.recheck"),
4110
+ className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
4111
+ "aria-label": t("panels.market.checkUpdates"),
2586
4112
  disabled: checking,
2587
- onClick: forceProbe
2588
- }, /* @__PURE__ */ h(IconRefresh, { size: 14 }), /* @__PURE__ */ h("span", null, t("panels.market.checkUpdates")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
4113
+ onClick: () => {
4114
+ forceProbe();
4115
+ loadUpdates(true);
4116
+ }
4117
+ }, /* @__PURE__ */ h("span", {
4118
+ className: MarketPage_module_default.marketIconWrap,
4119
+ "aria-hidden": "true"
4120
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, null)))), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4121
+ variant: "primary",
4122
+ size: "sm",
4123
+ className: MarketPage_module_default.marketAddButton,
4124
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
4125
+ onClick: () => setAdding(true)
4126
+ }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
2589
4127
  mocks: marketMocks,
2590
4128
  index: fixturePick.index,
2591
4129
  onPick: (at) => fixturePick.pick(marketMocks[at]?.id ?? null)
@@ -2594,12 +4132,20 @@ function MarketPanel({ t, manifests }) {
2594
4132
  t,
2595
4133
  manifests,
2596
4134
  capabilities,
2597
- freshness: mock === void 0 ? freshness : MOCK_FRESHNESS,
4135
+ freshness: mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS,
2598
4136
  onChanged: reload,
4137
+ updates,
4138
+ installed,
4139
+ installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
2599
4140
  mock
4141
+ }), /* @__PURE__ */ h(AddModuleDialog, {
4142
+ t,
4143
+ open: adding,
4144
+ onClose: () => setAdding(false),
4145
+ onInstalled: reload
2600
4146
  }));
2601
4147
  }
2602
- function registerMarketPanel(ctx, manifests) {
4148
+ function registerMarketPanel(ctx, units) {
2603
4149
  const t = ctx.locale.bind(LOCALE_NS);
2604
4150
  ctx.slots.inject("sidebar.panellist", () => ctx.slots.register({
2605
4151
  name: "sidebar.panellist",
@@ -2607,12 +4153,12 @@ function registerMarketPanel(ctx, manifests) {
2607
4153
  order: 30,
2608
4154
  locale: LOCALE_NS,
2609
4155
  label: () => t("panels.tab.market")
2610
- }, makeMarketEntryIcon(manifests)));
4156
+ }, makeMarketEntryIcon(units)));
2611
4157
  ctx.slots.inject("main", () => ctx.slots.register({
2612
4158
  name: "main",
2613
4159
  key: MARKET_PANEL_ID,
2614
4160
  locale: LOCALE_NS,
2615
- inject: () => ({ manifests })
4161
+ inject: () => ({ units })
2616
4162
  }, MarketPanel));
2617
4163
  }
2618
4164
  //#endregion
@@ -2621,107 +4167,40 @@ var CLIENT_UNITS = [];
2621
4167
  function assembleClientUnits(registry) {
2622
4168
  for (const face of CLIENT_UNITS) registry.register(face);
2623
4169
  }
2624
- //#endregion
2625
- //#region src/app/layouts/rightbar/registry.ts
2626
- function createBoardRegistry() {
2627
- const modules = [];
2628
- const listeners = /* @__PURE__ */ new Set();
2629
- let revision = 0;
2630
- let sorted = [];
2631
- let index = /* @__PURE__ */ new Map();
2632
- let steps = /* @__PURE__ */ new Map();
2633
- function rebuild() {
2634
- sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
2635
- index = new Map(sorted.map((module) => [module.id, module]));
2636
- const table = /* @__PURE__ */ new Map();
2637
- for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
2638
- const owner = table.get(kind);
2639
- if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
2640
- table.set(kind, module);
2641
- }
2642
- steps = table;
2643
- }
2644
- function notify() {
2645
- revision += 1;
2646
- for (const listener of listeners) listener();
2647
- }
2648
- return {
2649
- register(module) {
2650
- if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
2651
- modules.push(module);
2652
- try {
2653
- rebuild();
2654
- } catch (error) {
2655
- modules.pop();
2656
- rebuild();
2657
- throw error;
2658
- }
2659
- notify();
2660
- return () => {
2661
- const at = modules.indexOf(module);
2662
- if (at < 0) return;
2663
- modules.splice(at, 1);
2664
- rebuild();
2665
- notify();
2666
- };
2667
- },
2668
- all: () => sorted,
2669
- visible: () => sorted.filter((module) => module.enabledByDefault),
2670
- byId: (id) => index.get(id),
2671
- stepOwner: (kind) => steps.get(kind),
2672
- subscribe(listener) {
2673
- listeners.add(listener);
2674
- return () => listeners.delete(listener);
2675
- },
2676
- version: () => revision
2677
- };
2678
- }
2679
- //#endregion
2680
- //#region src/app/units/registry.ts
2681
- function toBoardModule(face) {
2682
- return {
2683
- id: face.manifest.id,
2684
- titleKey: face.manifest.card?.titleKey ?? face.manifest.id,
2685
- order: face.manifest.card?.order ?? 100,
2686
- enabledByDefault: face.manifest.card?.enabledByDefault ?? false,
2687
- View: face.card,
2688
- ...face.steps === void 0 ? {} : { steps: face.steps }
2689
- };
2690
- }
2691
- function createClientUnitRegistry() {
2692
- const faces = [];
2693
- const listeners = /* @__PURE__ */ new Set();
2694
- const board = createBoardRegistry();
2695
- let revision = 0;
2696
- function notify() {
2697
- revision += 1;
2698
- for (const listener of listeners) listener();
2699
- }
2700
- return {
2701
- register(face) {
2702
- const id = face.manifest.id;
2703
- if (faces.some((item) => item.manifest.id === id)) throw new Error(`套件 id 重复:${id}(id 会进持久化配置,不能撞)`);
2704
- const unregisterBoard = board.register(toBoardModule(face));
2705
- faces.push(face);
2706
- notify();
2707
- return () => {
2708
- const at = faces.findIndex((item) => item.manifest.id === id);
2709
- if (at < 0) return;
2710
- faces.splice(at, 1);
2711
- unregisterBoard();
2712
- notify();
2713
- };
2714
- },
2715
- all: () => faces,
2716
- manifests: () => faces.map((face) => face.manifest),
2717
- board,
2718
- subscribe(listener) {
2719
- listeners.add(listener);
2720
- return () => listeners.delete(listener);
2721
- },
2722
- version: () => revision
2723
- };
2724
- }
4170
+ var BootGate_module_default = {
4171
+ actions: "_actions_jlw8j_1",
4172
+ progress: "_progress_jlw8j_2",
4173
+ commandRow: "_commandRow_jlw8j_3",
4174
+ bridge: "_bridge_jlw8j_4",
4175
+ raw: "_raw_jlw8j_5",
4176
+ gate: "_gate_jlw8j_9",
4177
+ card: "_card_jlw8j_20",
4178
+ title: "_title_jlw8j_35",
4179
+ hint: "_hint_jlw8j_43",
4180
+ steps: "_steps_jlw8j_50",
4181
+ step: "_step_jlw8j_50",
4182
+ mark: "_mark_jlw8j_77",
4183
+ label: "_label_jlw8j_102",
4184
+ detail: "_detail_jlw8j_106",
4185
+ elapsed: "_elapsed_jlw8j_124",
4186
+ error: "_error_jlw8j_132",
4187
+ copy: "_copy_jlw8j_158",
4188
+ command: "_command_jlw8j_3",
4189
+ buttons: "_buttons_jlw8j_191",
4190
+ mockSlot: "_mockSlot_jlw8j_198",
4191
+ button: "_button_jlw8j_191",
4192
+ fixTitle: "_fixTitle_jlw8j_249",
4193
+ rawSummary: "_rawSummary_jlw8j_282",
4194
+ bridgeLines: "_bridgeLines_jlw8j_292",
4195
+ bridgeLine: "_bridgeLine_jlw8j_292",
4196
+ link: "_link_jlw8j_309",
4197
+ loading: "_loading_jlw8j_323",
4198
+ loadingMotion: "_loadingMotion_jlw8j_332",
4199
+ "wb-spin": "_wb-spin_jlw8j_1",
4200
+ loadingTrack: "_loadingTrack_jlw8j_337",
4201
+ loadingArc: "_loadingArc_jlw8j_338",
4202
+ "wb-dash": "_wb-dash_jlw8j_1"
4203
+ };
2725
4204
  //#endregion
2726
4205
  //#region src/app/layouts/env-gate/gate-text.ts
2727
4206
  function failedStepText(guidance, t) {
@@ -2795,10 +4274,10 @@ function spinnerIcon(size = 14) {
2795
4274
  svg.setAttribute("height", String(size));
2796
4275
  svg.setAttribute("viewBox", "0 0 24 24");
2797
4276
  svg.setAttribute("aria-hidden", "true");
2798
- svg.setAttribute("class", "wb-loading");
4277
+ svg.setAttribute("class", BootGate_module_default.loading);
2799
4278
  const group = document.createElementNS(SVG_NS, "g");
2800
- group.setAttribute("class", "wb-loadingMotion");
2801
- for (const name of ["wb-loadingTrack", "wb-loadingArc"]) {
4279
+ group.setAttribute("class", BootGate_module_default.loadingMotion);
4280
+ for (const name of [BootGate_module_default.loadingTrack, BootGate_module_default.loadingArc]) {
2802
4281
  const circle = document.createElementNS(SVG_NS, "circle");
2803
4282
  circle.setAttribute("cx", "12");
2804
4283
  circle.setAttribute("cy", "12");
@@ -3054,7 +4533,7 @@ function el(tag, className, text) {
3054
4533
  return node;
3055
4534
  }
3056
4535
  function mountGateMockStrip(options) {
3057
- const strip = el("div", "wb-mockStrip");
4536
+ const strip = el("div", `wb-mockStrip ${BootGate_module_default.mockSlot}`);
3058
4537
  const note = el("span", "wb-mockNote");
3059
4538
  const chips = [];
3060
4539
  const paint = (active) => {
@@ -3114,9 +4593,9 @@ function createForcePlan() {
3114
4593
  };
3115
4594
  }
3116
4595
  function commandRow(t) {
3117
- const row = el$1("div", "wb-gateCommandRow");
3118
- const code = el$1("code", "wb-gateCommand");
3119
- const copy = el$1("button", "wb-gateCopy");
4596
+ const row = el$1("div", BootGate_module_default.commandRow);
4597
+ const code = el$1("code", BootGate_module_default.command);
4598
+ const copy = el$1("button", BootGate_module_default.copy);
3120
4599
  copy.setAttribute("type", "button");
3121
4600
  copy.setAttribute("aria-label", t("env.copyCommand"));
3122
4601
  copy.title = t("env.copyCommand");
@@ -3125,14 +4604,15 @@ function commandRow(t) {
3125
4604
  let text;
3126
4605
  copy.addEventListener("click", () => {
3127
4606
  if (text === void 0) return;
3128
- navigator.clipboard?.writeText(text).then(() => {
4607
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(text).then((ok) => {
4608
+ if (!ok) return;
3129
4609
  copy.replaceChildren(svgIcon("check"));
3130
4610
  copy.title = t("env.copied");
3131
4611
  setTimeout(() => {
3132
4612
  copy.replaceChildren(svgIcon("copy"));
3133
4613
  copy.title = t("env.copyCommand");
3134
4614
  }, 1500);
3135
- }, () => {});
4615
+ });
3136
4616
  });
3137
4617
  return {
3138
4618
  row,
@@ -3148,47 +4628,47 @@ function createBootGate(ctx, options = {}) {
3148
4628
  const request = options.request ?? apiGet;
3149
4629
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
3150
4630
  const root = document.getElementById("root");
3151
- const overlay = el$1("div", "wb-gate");
4631
+ const overlay = el$1("div", BootGate_module_default.gate);
3152
4632
  overlay.setAttribute("role", "dialog");
3153
4633
  overlay.setAttribute("aria-modal", "true");
3154
4634
  overlay.setAttribute("aria-label", t("env.title"));
3155
- const card = el$1("div", "wb-gateCard");
3156
- const title = el$1("h1", "wb-gateTitle", t("env.title"));
3157
- const hint = el$1("p", "wb-gateHint", t("env.checking"));
3158
- const list = el$1("ul", "wb-gateSteps");
3159
- const progressRow = el$1("div", "wb-gateProgress");
4635
+ const card = el$1("div", BootGate_module_default.card);
4636
+ const title = el$1("h1", BootGate_module_default.title, t("env.title"));
4637
+ const hint = el$1("p", BootGate_module_default.hint, t("env.checking"));
4638
+ const list = el$1("ul", BootGate_module_default.steps);
4639
+ const progressRow = el$1("div", BootGate_module_default.progress);
3160
4640
  progressRow.hidden = true;
3161
- const elapsed = el$1("span", "wb-gateElapsed");
4641
+ const elapsed = el$1("span", BootGate_module_default.elapsed);
3162
4642
  progressRow.append(elapsed);
3163
- const actions = el$1("div", "wb-gateActions");
4643
+ const actions = el$1("div", BootGate_module_default.actions);
3164
4644
  actions.hidden = true;
3165
- const fixTitle = el$1("h2", "wb-gateFixTitle", t("env.fix.title"));
3166
- const fixWhy = el$1("p", "wb-gateHint");
3167
- const fixStep = el$1("p", "wb-gateHint");
3168
- const fixAdvice = el$1("p", "wb-gateHint");
3169
- const raw = el$1("details", "wb-gateRaw");
3170
- const rawSummary = el$1("summary", "wb-gateRawSummary", t("env.fix.details"));
3171
- const errorBox = el$1("pre", "wb-gateError");
4645
+ const fixTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
4646
+ const fixWhy = el$1("p", BootGate_module_default.hint);
4647
+ const fixStep = el$1("p", BootGate_module_default.hint);
4648
+ const fixAdvice = el$1("p", BootGate_module_default.hint);
4649
+ const raw = el$1("details", BootGate_module_default.raw);
4650
+ const rawSummary = el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
4651
+ const errorBox = el$1("pre", BootGate_module_default.error);
3172
4652
  raw.append(rawSummary, errorBox);
3173
- const buttons = el$1("div", "wb-gateButtons");
3174
- const retry = el$1("button", "wb-outlineButton", t("env.retry"));
4653
+ const buttons = el$1("div", BootGate_module_default.buttons);
4654
+ const retry = el$1("button", BootGate_module_default.button, t("env.retry"));
3175
4655
  retry.setAttribute("type", "button");
3176
4656
  const fixCommand = commandRow(t);
3177
4657
  buttons.append(retry);
3178
4658
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
3179
- const bridge = el$1("div", "wb-gateBridge");
4659
+ const bridge = el$1("div", BootGate_module_default.bridge);
3180
4660
  bridge.hidden = true;
3181
- const bridgeTitle = el$1("h2", "wb-gateFixTitle", t("env.fix.title"));
3182
- const bridgeWhy = el$1("p", "wb-gateHint", t("env.bridge.why"));
3183
- const bridgeLines = el$1("ul", "wb-gateBridgeLines");
4661
+ const bridgeTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
4662
+ const bridgeWhy = el$1("p", BootGate_module_default.hint, t("env.bridge.why"));
4663
+ const bridgeLines = el$1("ul", BootGate_module_default.bridgeLines);
3184
4664
  const bridgeCommand = commandRow(t);
3185
- const bridgeRetry = el$1("button", "wb-outlineButton", t("env.retry"));
4665
+ const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
3186
4666
  bridgeRetry.setAttribute("type", "button");
3187
- const bridgeButtons = el$1("div", "wb-gateButtons");
4667
+ const bridgeButtons = el$1("div", BootGate_module_default.buttons);
3188
4668
  bridgeButtons.append(bridgeRetry);
3189
- const bridgeRaw = el$1("details", "wb-gateRaw");
3190
- const bridgeRawText = el$1("pre", "wb-gateError");
3191
- bridgeRaw.append(el$1("summary", "wb-gateRawSummary", t("env.fix.details")), bridgeRawText);
4669
+ const bridgeRaw = el$1("details", BootGate_module_default.raw);
4670
+ const bridgeRawText = el$1("pre", BootGate_module_default.error);
4671
+ bridgeRaw.append(el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
3192
4672
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
3193
4673
  card.append(title, hint, list, progressRow, actions, bridge);
3194
4674
  overlay.append(card);
@@ -3233,16 +4713,16 @@ function createBootGate(ctx, options = {}) {
3233
4713
  function ensureRow(step) {
3234
4714
  const existing = rows.get(step.id);
3235
4715
  if (existing !== void 0) return existing;
3236
- const item = el$1("li", "wb-gateStep");
3237
- const mark = el$1("span", "wb-gateMark");
4716
+ const item = el$1("li", BootGate_module_default.step);
4717
+ const mark = el$1("span", BootGate_module_default.mark);
3238
4718
  mark.setAttribute("aria-hidden", "true");
3239
4719
  const row = {
3240
4720
  item,
3241
4721
  mark,
3242
- detail: el$1("span", "wb-gateDetail"),
4722
+ detail: el$1("span", BootGate_module_default.detail),
3243
4723
  status: ""
3244
4724
  };
3245
- item.append(mark, el$1("span", "wb-gateLabel", stepLabel$1(step.id, t)), row.detail);
4725
+ item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
3246
4726
  rows.set(step.id, row);
3247
4727
  return row;
3248
4728
  }
@@ -3289,10 +4769,10 @@ function createBootGate(ctx, options = {}) {
3289
4769
  if (bridgeBroken && bridgeStep !== void 0) {
3290
4770
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
3291
4771
  const advice = bridgeAdvice(issue);
3292
- const item = el$1("li", "wb-gateBridgeLine", t(advice.textKey));
4772
+ const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
3293
4773
  if (advice.link !== void 0) {
3294
4774
  const link = document.createElement("a");
3295
- link.className = "wb-gateLink";
4775
+ link.className = BootGate_module_default.link;
3296
4776
  link.textContent = t(advice.link.labelKey);
3297
4777
  link.href = advice.link.href;
3298
4778
  link.target = "_blank";
@@ -3356,18 +4836,32 @@ function createBootGate(ctx, options = {}) {
3356
4836
  poll();
3357
4837
  return { close };
3358
4838
  }
4839
+ var ExpandButton_module_default = {
4840
+ button: "_button_ssnyt_1",
4841
+ icon: "_icon_ssnyt_13"
4842
+ };
3359
4843
  //#endregion
3360
4844
  //#region src/app/layouts/rightbar/ExpandButton.tsx
3361
4845
  function ExpandButton({ useRightbar, toggleRightbar, t }) {
3362
4846
  if (useRightbar((state) => state.expanded)) return null;
3363
- return /* @__PURE__ */ h("button", {
4847
+ return /* @__PURE__ */ h(Tip, { label: t("rightbar.expand") }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3364
4848
  type: "button",
3365
- className: "wb-expandButton",
4849
+ size: "sm",
4850
+ variant: "ghost",
4851
+ className: ExpandButton_module_default.button,
3366
4852
  "aria-label": t("rightbar.expand"),
3367
- title: t("rightbar.expand"),
4853
+ icon: /* @__PURE__ */ h("span", { className: ExpandButton_module_default.icon }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutlineRegular, { size: 15 })),
3368
4854
  onClick: toggleRightbar
3369
- }, /* @__PURE__ */ h("span", { className: "wb-expandIcon" }, /* @__PURE__ */ h(IconPanelLeft, { size: 15 })));
4855
+ }));
3370
4856
  }
4857
+ var Breadcrumbs_module_default = {
4858
+ stripTabs: "_stripTabs_1dqp4_1",
4859
+ tab: "_tab_1dqp4_9",
4860
+ tabActive: "_tabActive_1dqp4_25",
4861
+ tabQuiet: "_tabQuiet_1dqp4_29",
4862
+ tabTitle: "_tabTitle_1dqp4_39",
4863
+ sep: "_sep_1dqp4_49"
4864
+ };
3371
4865
  //#endregion
3372
4866
  //#region src/app/layouts/rightbar/Breadcrumbs.tsx
3373
4867
  function stepLabel(step, titleKeyOf, t) {
@@ -3377,23 +4871,21 @@ function stepLabel(step, titleKeyOf, t) {
3377
4871
  }
3378
4872
  function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
3379
4873
  return /* @__PURE__ */ h("div", {
3380
- className: "wb-stripTabs",
4874
+ className: Breadcrumbs_module_default.stripTabs,
3381
4875
  role: "presentation"
3382
4876
  }, trail.map((step, index) => {
3383
4877
  const current = index === trail.length - 1;
3384
4878
  return /* @__PURE__ */ h(Fragment, { key: `${step.kind}-${index}` }, index > 0 ? /* @__PURE__ */ h("span", {
3385
- className: "wb-crumbSep",
4879
+ className: Breadcrumbs_module_default.sep,
3386
4880
  "aria-hidden": "true"
3387
4881
  }, "›") : null, current ? /* @__PURE__ */ h("div", {
3388
- className: "wb-tab wb-tabActive",
3389
- role: "tab",
3390
- "aria-selected": "true",
3391
- tabIndex: -1
3392
- }, /* @__PURE__ */ h("span", { className: "wb-tabTitle" }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ h("button", {
4882
+ className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabActive}`,
4883
+ "aria-current": "page"
4884
+ }, /* @__PURE__ */ h("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ h("button", {
3393
4885
  type: "button",
3394
- className: "wb-tab wb-tabQuiet",
4886
+ className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabQuiet}`,
3395
4887
  onClick: () => onGoTo(index)
3396
- }, /* @__PURE__ */ h("span", { className: "wb-tabTitle" }, stepLabel(step, titleKeyOf, t))));
4888
+ }, /* @__PURE__ */ h("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
3397
4889
  }));
3398
4890
  }
3399
4891
  //#endregion
@@ -3403,13 +4895,15 @@ function BoardEmpty({ t, onOpenModules, onOpenMarket }) {
3403
4895
  icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
3404
4896
  title: t("panels.empty"),
3405
4897
  hint: t("panels.emptyHint"),
3406
- action: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("button", {
4898
+ action: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3407
4899
  type: "button",
3408
- className: "wb-outlineButton",
4900
+ size: "sm",
4901
+ variant: "primary",
3409
4902
  onClick: onOpenModules
3410
- }, t("panels.choose")), /* @__PURE__ */ h("button", {
4903
+ }, t("panels.choose")), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3411
4904
  type: "button",
3412
- className: "wb-outlineButton",
4905
+ size: "sm",
4906
+ variant: "toolbar",
3413
4907
  onClick: onOpenMarket
3414
4908
  }, t("panels.browseMarket")))
3415
4909
  });
@@ -3426,6 +4920,22 @@ function BoardMockStrip({ fixtures, show }) {
3426
4920
  onPick: fixtures.pick
3427
4921
  });
3428
4922
  }
4923
+ var ModulesPage_module_default = {
4924
+ trigger: "_trigger_1weg4_1",
4925
+ pop: "_pop_1weg4_7",
4926
+ head: "_head_1weg4_21",
4927
+ title: "_title_1weg4_29",
4928
+ reset: "_reset_1weg4_37",
4929
+ list: "_list_1weg4_59",
4930
+ row: "_row_1weg4_68",
4931
+ rowOver: "_rowOver_1weg4_83",
4932
+ ghost: "_ghost_1weg4_93",
4933
+ grip: "_grip_1weg4_108",
4934
+ label: "_label_1weg4_116",
4935
+ name: "_name_1weg4_123",
4936
+ error: "_error_1weg4_134",
4937
+ dep: "_dep_1weg4_142"
4938
+ };
3429
4939
  //#endregion
3430
4940
  //#region src/app/layouts/rightbar/panel-mock.ts
3431
4941
  function row(id, titleKey, shown) {
@@ -3669,7 +5179,7 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
3669
5179
  };
3670
5180
  const dragging = drag === null ? void 0 : rows[drag.from];
3671
5181
  return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragging === void 0 ? null : /* @__PURE__ */ h("div", {
3672
- className: "wb-modulesGhost",
5182
+ className: ModulesPage_module_default.ghost,
3673
5183
  style: {
3674
5184
  left: `${drag.at.x + 12}px`,
3675
5185
  top: `${drag.at.y - 12}px`
@@ -3679,16 +5189,17 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
3679
5189
  icon: null,
3680
5190
  title: t("panels.noneInstalled"),
3681
5191
  hint: t("panels.noneInstalledHint"),
3682
- action: /* @__PURE__ */ h("button", {
5192
+ action: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3683
5193
  type: "button",
3684
- className: "wb-outlineButton",
5194
+ size: "sm",
5195
+ variant: "outline",
3685
5196
  onClick: onOpenMarket
3686
5197
  }, t("panels.browseMarket"))
3687
- }) : /* @__PURE__ */ h("ul", { className: "wb-modulesList" }, rows.map((unit, index) => {
5198
+ }) : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, rows.map((unit, index) => {
3688
5199
  const badge = panelBadgeKey(capabilities?.[unit.id]);
3689
5200
  const dep = badge === void 0 ? void 0 : t(badge);
3690
5201
  return /* @__PURE__ */ h("li", {
3691
- className: `wb-modulesRow${drag?.over === index ? " wb-modulesRowOver" : ""}`,
5202
+ className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
3692
5203
  key: unit.id,
3693
5204
  draggable: true,
3694
5205
  onDragStart: (event) => {
@@ -3720,28 +5231,24 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
3720
5231
  event.preventDefault();
3721
5232
  drop();
3722
5233
  }
3723
- }, /* @__PURE__ */ h("span", {
3724
- className: "wb-modulesGrip",
3725
- title: t("panels.dragHint"),
5234
+ }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
5235
+ className: ModulesPage_module_default.grip,
3726
5236
  "aria-hidden": "true"
3727
- }, "⠿"), /* @__PURE__ */ h("span", { className: "wb-modulesLabel" }, /* @__PURE__ */ h("span", { className: "wb-modulesName" }, t(unit.titleKey)), dep === void 0 ? null : /* @__PURE__ */ h("span", { className: "wb-modulesDep" }, dep)), /* @__PURE__ */ h("button", {
3728
- type: "button",
3729
- role: "switch",
3730
- "aria-checked": unit.shown,
3731
- "aria-label": `${t(unit.titleKey)} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
3732
- className: "wb-switch",
5237
+ }, "⠿")), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, t(unit.titleKey)), dep === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, dep)), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
5238
+ checked: unit.shown,
5239
+ label: `${t(unit.titleKey)} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
3733
5240
  disabled: busy,
3734
- onClick: () => void write({
3735
- action: unit.shown ? "hide" : "show",
5241
+ onChange: (next) => void write({
5242
+ action: next ? "show" : "hide",
3736
5243
  id: unit.id
3737
5244
  })
3738
- }, /* @__PURE__ */ h("span", { className: "wb-switchKnob" })));
3739
- })), /* @__PURE__ */ h("footer", { className: "wb-modulesFoot" }, /* @__PURE__ */ h("span", { className: "wb-modulesFootText" }, t("panels.hintEffect")), /* @__PURE__ */ h("button", {
5245
+ }));
5246
+ })), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, /* @__PURE__ */ h("button", {
3740
5247
  type: "button",
3741
- className: "wb-modulesReset",
5248
+ className: ModulesPage_module_default.reset,
3742
5249
  disabled: busy,
3743
5250
  onClick: () => void write({ action: "reset" })
3744
- }, t("panels.reset"))), failed ? /* @__PURE__ */ h("p", { className: "wb-modulesError" }, t("panels.failed")) : null);
5251
+ }, t("panels.reset"))), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
3745
5252
  }
3746
5253
  //#endregion
3747
5254
  //#region src/app/layouts/rightbar/PanelModules.tsx
@@ -3765,37 +5272,32 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
3765
5272
  forceProbe
3766
5273
  ]);
3767
5274
  const root = useRef(null);
3768
- const panelMocks = useMemo(() => buildPanelMocks(manifests), [manifests]);
5275
+ const panelMocks = useMemo(() => buildPanelMocks(fixtureRoster(manifests)), [manifests]);
3769
5276
  const fixturePick = useFixturePick({
3770
5277
  fixtures: panelMocks,
3771
5278
  initial: panelMocks[0]?.id ?? null
3772
5279
  });
3773
5280
  const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
3774
5281
  const mockNonce = fixturePick.nonce;
3775
- useEffect(() => {
3776
- if (!open) return void 0;
3777
- const onDown = (event) => {
3778
- if (root.current !== null && !root.current.contains(event.target)) onOpenChange(false);
3779
- };
3780
- document.addEventListener("mousedown", onDown);
3781
- return () => document.removeEventListener("mousedown", onDown);
3782
- }, [open, onOpenChange]);
5282
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, onOpenChange);
3783
5283
  const units = enabledUnits ?? [];
3784
5284
  return /* @__PURE__ */ h("div", {
3785
- className: "wb-modules",
5285
+ className: ModulesPage_module_default.trigger,
3786
5286
  ref: root
3787
- }, /* @__PURE__ */ h("button", {
5287
+ }, /* @__PURE__ */ h(Tip, { label: t("panels.title") }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3788
5288
  type: "button",
3789
- className: `wb-iconButton${open ? " wb-iconButtonActive" : ""}`,
5289
+ size: "sm",
5290
+ variant: "ghost",
5291
+ className: `wb-stripButton${open ? " wb-stripButtonActive" : ""}`,
3790
5292
  "aria-label": t("panels.title"),
3791
5293
  "aria-expanded": open,
3792
- title: t("panels.title"),
5294
+ icon: /* @__PURE__ */ h(IconModules, { size: 16 }),
3793
5295
  onClick: () => onOpenChange(!open)
3794
- }, /* @__PURE__ */ h(IconModules, { size: 16 })), open ? /* @__PURE__ */ h("div", {
3795
- className: "wb-modulesPop",
5296
+ })), open ? /* @__PURE__ */ h("div", {
5297
+ className: ModulesPage_module_default.pop,
3796
5298
  role: "dialog",
3797
5299
  "aria-label": t("panels.title")
3798
- }, /* @__PURE__ */ h("header", { className: "wb-modulesHead" }, /* @__PURE__ */ h("span", { className: "wb-modulesTitle" }, t("panels.tab.modules"))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5300
+ }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
3799
5301
  mocks: panelMocks,
3800
5302
  index: fixturePick.index,
3801
5303
  onPick: (at) => fixturePick.pick(panelMocks[at]?.id ?? null)
@@ -4135,22 +5637,21 @@ function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...re
4135
5637
  });
4136
5638
  }
4137
5639
  function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnabled, onRefresh, modulesOpen, onModulesOpenChange, enabledUnits, manifests, workspace, refreshToken, onOpenMarket, onCollapse }) {
4138
- return /* @__PURE__ */ h("header", { className: "wb-panelHeader" }, /* @__PURE__ */ h("div", {
4139
- className: "wb-tabStrip",
4140
- role: "tablist"
4141
- }, /* @__PURE__ */ h(Breadcrumbs, {
5640
+ return /* @__PURE__ */ h("header", { className: "wb-panelHeader" }, /* @__PURE__ */ h("div", { className: "wb-tabStrip" }, /* @__PURE__ */ h(Breadcrumbs, {
4142
5641
  trail,
4143
5642
  onGoTo,
4144
5643
  titleKeyOf,
4145
5644
  t
4146
- }), /* @__PURE__ */ h("span", { className: "wb-stripFill" }), /* @__PURE__ */ h("div", { className: "wb-stripChrome" }, /* @__PURE__ */ h("button", {
5645
+ }), /* @__PURE__ */ h("span", { className: "wb-stripFill" }), /* @__PURE__ */ h("div", { className: "wb-stripChrome" }, /* @__PURE__ */ h(Tip, { label: refreshing ? t("rightbar.refreshing") : at === null ? t("rightbar.refresh") : `${t("rightbar.refresh")} · ${t("rightbar.updatedAt", { time: new Date(at).toLocaleTimeString().slice(0, 5) })}` }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4147
5646
  type: "button",
4148
- className: `wb-iconButton wb-refreshButton${refreshing ? " wb-spinning" : ""}`,
5647
+ size: "sm",
5648
+ variant: "ghost",
5649
+ className: `wb-stripButton${refreshing ? " wb-spinning" : ""}`,
4149
5650
  "aria-label": refreshing ? t("rightbar.refreshing") : t("rightbar.refresh"),
4150
5651
  disabled: refreshing || !refreshEnabled,
4151
- title: refreshing ? t("rightbar.refreshing") : at === null ? t("rightbar.refresh") : `${t("rightbar.refresh")} · ${t("rightbar.updatedAt", { time: new Date(at).toLocaleTimeString().slice(0, 5) })}`,
5652
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 16 }),
4152
5653
  onClick: onRefresh
4153
- }, /* @__PURE__ */ h(IconRefresh, { size: 16 })), /* @__PURE__ */ h(PanelModules, {
5654
+ })), /* @__PURE__ */ h(PanelModules, {
4154
5655
  t,
4155
5656
  open: modulesOpen,
4156
5657
  onOpenChange: onModulesOpenChange,
@@ -4159,13 +5660,15 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
4159
5660
  refreshToken,
4160
5661
  manifests,
4161
5662
  onOpenMarket
4162
- }), /* @__PURE__ */ h("button", {
5663
+ }), /* @__PURE__ */ h(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4163
5664
  type: "button",
4164
- className: "wb-iconButton wb-collapseButton",
5665
+ size: "sm",
5666
+ variant: "ghost",
5667
+ className: "wb-stripButton",
4165
5668
  "aria-label": t("rightbar.collapse"),
4166
- title: t("rightbar.collapse"),
5669
+ icon: /* @__PURE__ */ h("span", { className: "wb-stripIconFlip" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutlineRegular, { size: 16 })),
4167
5670
  onClick: onCollapse
4168
- }, /* @__PURE__ */ h(IconPanelLeft, { size: 16 })))));
5671
+ })))));
4169
5672
  }
4170
5673
  function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, t }) {
4171
5674
  if (top.kind !== "board") {
@@ -4189,7 +5692,7 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
4189
5692
  }
4190
5693
  return /* @__PURE__ */ h(Fragment, null, plan.reading ? /* @__PURE__ */ h(CenteredState, {
4191
5694
  icon: null,
4192
- title: t("panels.reading")
5695
+ title: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, t("panels.reading"))
4193
5696
  }) : null, plan.empty ? /* @__PURE__ */ h(BoardEmpty, {
4194
5697
  t,
4195
5698
  onOpenModules,
@@ -4222,12 +5725,12 @@ function Rightbar(props) {
4222
5725
  const boardWorkspace = board.path;
4223
5726
  const enabledUnits = useEnabledUnits(panelToken, boardWorkspace);
4224
5727
  const [modulesOpen, setModulesOpen] = useState(false);
4225
- const fixtures = useBoardMock(manifests);
5728
+ const fixtures = useBoardMock(fixtureRoster(manifests));
4226
5729
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
4227
5730
  const plan = planBoard(fixtures.shape, {
4228
5731
  modules: visibleModules,
4229
5732
  configRead: enabledUnits !== null
4230
- }, modules.all());
5733
+ }, fixtureSeed(manifests, modules.all()));
4231
5734
  const world = createSuiteWorld({
4232
5735
  workspaces,
4233
5736
  sessions,
@@ -4264,8 +5767,8 @@ function Rightbar(props) {
4264
5767
  onGoTo: props.goToPanel,
4265
5768
  titleKeyOf,
4266
5769
  refreshing: summary.refreshing,
4267
- at: summary.at,
4268
5770
  refreshEnabled: feedEnabled,
5771
+ at: summary.at,
4269
5772
  onRefresh: refreshPanel,
4270
5773
  modulesOpen,
4271
5774
  onModulesOpenChange: setModulesOpen,
@@ -4478,13 +5981,12 @@ function openNewSession(input) {
4478
5981
  //#endregion
4479
5982
  //#region src/app/layouts/sidebar/WorkspaceSection.tsx
4480
5983
  function WorkspaceSection({ t, wide, onNewSession }) {
4481
- return /* @__PURE__ */ h("div", { className: "wb-wsSection" }, /* @__PURE__ */ h("div", { className: "wb-sectionHeader" }, wide ? /* @__PURE__ */ h("span", { className: "wb-sectionLabel" }, t("workspace.section")) : null, /* @__PURE__ */ h("button", {
5984
+ return /* @__PURE__ */ h("div", { className: "wb-wsSection" }, /* @__PURE__ */ h("div", { className: "wb-sectionHeader" }, wide ? /* @__PURE__ */ h("span", { className: "wb-sectionLabel" }, t("workspace.section")) : null, /* @__PURE__ */ h(Tip, { label: t("session.new.label") }, /* @__PURE__ */ h("button", {
4482
5985
  type: "button",
4483
5986
  className: "wb-iconButton wb-wsNew",
4484
- title: t("session.new.label"),
4485
5987
  "aria-label": t("session.new"),
4486
5988
  onClick: onNewSession
4487
- }, /* @__PURE__ */ h(IconNewChat, { size: 16 }))));
5989
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconNewChatOutlineRegular, { size: 16 })))));
4488
5990
  }
4489
5991
  //#endregion
4490
5992
  //#region src/app/layouts/sidebar/PanelNav.tsx
@@ -4492,50 +5994,34 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
4492
5994
  const glyph = fallbackGlyph ?? (id !== null && renderEntry !== void 0 ? renderEntry(id, active, wide) : null);
4493
5995
  const hint = usePanelHint(id);
4494
5996
  const name = panelRowName(label, hint, t);
4495
- return /* @__PURE__ */ h("button", {
5997
+ return /* @__PURE__ */ h(Tip, {
5998
+ label: name,
5999
+ disabled: !(hint !== null || !wide)
6000
+ }, /* @__PURE__ */ h("button", {
4496
6001
  type: "button",
4497
6002
  className: cx("wb-panelRow", active && "wb-panelActive"),
4498
6003
  "aria-current": active ? "page" : void 0,
4499
6004
  "aria-label": name,
4500
- title: hint !== null || !wide ? name : void 0,
4501
6005
  onClick: () => onSelect(id)
4502
6006
  }, /* @__PURE__ */ h("span", {
4503
6007
  className: "wb-panelGlyph",
4504
6008
  "aria-hidden": "true"
4505
- }, glyph, hint !== null && !wide ? /* @__PURE__ */ h("span", { className: "wb-panelDot" }, /* @__PURE__ */ h(StateDot, {
6009
+ }, glyph, hint !== null && !wide ? /* @__PURE__ */ h("span", { className: "wb-panelDot" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4506
6010
  state: "warning",
4507
6011
  size: 9
4508
- })) : null), wide ? /* @__PURE__ */ h("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ h("span", {
4509
- className: "wb-panelTag",
4510
- "aria-hidden": "true"
4511
- }, t(hint.labelKey)));
6012
+ })) : null), wide ? /* @__PURE__ */ h("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Tag, {
6013
+ tone: "warning",
6014
+ className: "wb-panelTag"
6015
+ }, t(hint.labelKey))));
4512
6016
  }
4513
6017
  //#endregion
4514
6018
  //#region src/app/layouts/sidebar/ProjectSwitcher.tsx
6019
+ var ADD_WORKSPACE_ID = "__wb-add-workspace__";
4515
6020
  function ProjectSwitcher({ items, current, workspaceTitle, onPick, onAdd, t }) {
4516
6021
  const [open, setOpen] = useState(false);
4517
- const root = useRef(null);
4518
- useEffect(() => {
4519
- if (!open) return void 0;
4520
- const onDown = (event) => {
4521
- if (root.current !== null && !root.current.contains(event.target)) setOpen(false);
4522
- };
4523
- const onKey = (event) => {
4524
- if (event.key === "Escape") setOpen(false);
4525
- };
4526
- document.addEventListener("mousedown", onDown);
4527
- document.addEventListener("keydown", onKey);
4528
- return () => {
4529
- document.removeEventListener("mousedown", onDown);
4530
- document.removeEventListener("keydown", onKey);
4531
- };
4532
- }, [open]);
4533
6022
  const title = current ? workspaceTitle(current.title) : t("project.none");
4534
6023
  const currentId = current?.workspaceId ?? null;
4535
- return /* @__PURE__ */ h("div", {
4536
- className: "wb-project",
4537
- ref: root
4538
- }, /* @__PURE__ */ h("button", {
6024
+ const trigger = /* @__PURE__ */ h("button", {
4539
6025
  type: "button",
4540
6026
  className: "wb-projectButton",
4541
6027
  "aria-haspopup": "listbox",
@@ -4543,31 +6029,40 @@ function ProjectSwitcher({ items, current, workspaceTitle, onPick, onAdd, t }) {
4543
6029
  "aria-label": t("project.label"),
4544
6030
  title: current ? current.path : title,
4545
6031
  onClick: () => setOpen((value) => !value)
4546
- }, /* @__PURE__ */ h("span", { className: "wb-projectGlyph wb-projectGlyphActive" }, open ? /* @__PURE__ */ h(IconFolderOpen, { size: 16 }) : /* @__PURE__ */ h(IconFolder, { size: 16 })), /* @__PURE__ */ h("span", { className: "wb-projectName" }, title), /* @__PURE__ */ h("span", { className: cx("wb-projectChevron", open && "wb-projectChevronOpen") }, /* @__PURE__ */ h(IconChevronDown, { size: 14 }))), open ? /* @__PURE__ */ h("div", {
4547
- className: "wb-popover",
4548
- role: "listbox",
4549
- "aria-label": t("project.label")
4550
- }, items.length === 0 ? /* @__PURE__ */ h("div", { className: "wb-popoverEmpty" }, t("project.empty")) : items.map((workspace) => {
4551
- const selected = workspace.workspaceId === currentId;
4552
- return /* @__PURE__ */ h("button", {
4553
- key: workspace.workspaceId,
4554
- type: "button",
4555
- role: "option",
4556
- "aria-selected": selected,
4557
- className: cx("wb-popoverItem", selected && "wb-popoverItemActive"),
4558
- onClick: () => {
4559
- setOpen(false);
4560
- onPick(workspace.workspaceId);
4561
- }
4562
- }, /* @__PURE__ */ h("span", { className: cx("wb-popoverItemIcon", selected && "wb-projectGlyphActive") }, /* @__PURE__ */ h(IconFolder, { size: 16 })), /* @__PURE__ */ h("span", { className: "wb-popoverItemTitle" }, workspaceTitle(workspace.title)), selected ? /* @__PURE__ */ h("span", { className: "wb-popoverCheck" }, /* @__PURE__ */ h(IconCheck, { size: 14 })) : null);
4563
- }), /* @__PURE__ */ h("div", { className: "wb-popoverSep" }), /* @__PURE__ */ h("button", {
4564
- type: "button",
4565
- className: "wb-popoverAdd",
4566
- onClick: () => {
6032
+ }, /* @__PURE__ */ h("span", { className: "wb-projectGlyph wb-projectGlyphActive" }, open ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: "wb-projectName" }, title), /* @__PURE__ */ h("span", { className: cx("wb-projectChevron", open && "wb-projectChevronOpen") }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })));
6033
+ return /* @__PURE__ */ h("div", { className: "wb-project" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
6034
+ open,
6035
+ portal: true,
6036
+ className: "wb-projectAnchor",
6037
+ anchor: trigger,
6038
+ align: "start",
6039
+ side: "bottom",
6040
+ selection: "check",
6041
+ selectedId: currentId ?? void 0,
6042
+ items: [...items.length === 0 ? [{
6043
+ type: "label",
6044
+ id: "empty",
6045
+ text: t("project.empty")
6046
+ }] : [], ...items.map((workspace) => ({
6047
+ id: workspace.workspaceId,
6048
+ label: workspaceTitle(workspace.title),
6049
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })
6050
+ }))],
6051
+ footer: [{
6052
+ id: ADD_WORKSPACE_ID,
6053
+ label: t("project.add"),
6054
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
6055
+ }],
6056
+ onSelect: (id) => {
4567
6057
  setOpen(false);
4568
- onAdd();
4569
- }
4570
- }, /* @__PURE__ */ h(IconPlus, { size: 14 }), /* @__PURE__ */ h("span", null, t("project.add")))) : null);
6058
+ if (id === ADD_WORKSPACE_ID) {
6059
+ onAdd();
6060
+ return;
6061
+ }
6062
+ onPick(id);
6063
+ },
6064
+ onClose: () => setOpen(false)
6065
+ }));
4571
6066
  }
4572
6067
  //#endregion
4573
6068
  //#region src/app/layouts/sidebar/SessionList.tsx
@@ -4575,7 +6070,7 @@ function SessionLeading({ node, statuses, renderSlot }) {
4575
6070
  if (node.blank) return null;
4576
6071
  const primary = statuses[0];
4577
6072
  if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
4578
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(StateDot, {
6073
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4579
6074
  state: primary.state,
4580
6075
  size: 10
4581
6076
  }), statuses.map((status) => /* @__PURE__ */ h("span", {
@@ -4586,24 +6081,8 @@ function SessionLeading({ node, statuses, renderSlot }) {
4586
6081
  function SessionRow({ node, active, onOpen, renderSlot, t }) {
4587
6082
  const [menuOpen, setMenuOpen] = useState(false);
4588
6083
  const menuState = useMemo(() => [menuOpen, setMenuOpen], [menuOpen]);
4589
- const root = useRef(null);
4590
6084
  const statuses = sessionStatuses(node, t);
4591
6085
  const label = node.blank ? t("session.new") : node.title;
4592
- useEffect(() => {
4593
- if (!menuOpen) return void 0;
4594
- const onDown = (event) => {
4595
- if (root.current !== null && !root.current.contains(event.target)) setMenuOpen(false);
4596
- };
4597
- const onKey = (event) => {
4598
- if (event.key === "Escape") setMenuOpen(false);
4599
- };
4600
- document.addEventListener("mousedown", onDown);
4601
- document.addEventListener("keydown", onKey);
4602
- return () => {
4603
- document.removeEventListener("mousedown", onDown);
4604
- document.removeEventListener("keydown", onKey);
4605
- };
4606
- }, [menuOpen]);
4607
6086
  const owner = {
4608
6087
  sessionId: node.id,
4609
6088
  displayTitle: label
@@ -4611,31 +6090,31 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
4611
6090
  return /* @__PURE__ */ h("div", {
4612
6091
  className: cx("wb-sessionRow", active && "wb-selected", menuOpen && "wb-menuOpen"),
4613
6092
  "aria-current": active ? "true" : void 0,
4614
- ref: root,
4615
6093
  onClick: () => onOpen(node.id)
4616
6094
  }, /* @__PURE__ */ h("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ h(SessionLeading, {
4617
6095
  node,
4618
6096
  statuses,
4619
6097
  renderSlot
4620
- })), /* @__PURE__ */ h("span", { className: "wb-sessionTitle" }, label), node.pinned ? /* @__PURE__ */ h("span", {
6098
+ })), /* @__PURE__ */ h("span", { className: "wb-sessionTitle" }, label), node.pinned ? /* @__PURE__ */ h(Tip, { label: t("session.pinned") }, /* @__PURE__ */ h("span", {
4621
6099
  className: "wb-sessionPin",
4622
6100
  role: "img",
4623
- "aria-label": t("session.pinned"),
4624
- title: t("session.pinned")
4625
- }, /* @__PURE__ */ h(IconPin, { size: 14 })) : null, /* @__PURE__ */ h("span", { className: "wb-sessionTime" }, relativeTime(node.updatedAt, t)), /* @__PURE__ */ h("span", { className: "wb-rowActions" }, /* @__PURE__ */ h("button", {
4626
- type: "button",
4627
- className: "wb-iconButton",
4628
- "aria-haspopup": "menu",
4629
- "aria-expanded": menuOpen,
4630
- "aria-label": t("session.actions", { name: label }),
4631
- onClick: (event) => {
4632
- event.stopPropagation();
4633
- setMenuOpen((value) => !value);
4634
- }
4635
- }, /* @__PURE__ */ h(IconEllipsis, { size: 16 })), renderSlot("sidebar.workspaces.session.row.action", owner)), menuOpen ? /* @__PURE__ */ h("div", {
4636
- className: "wb-popover wb-rowMenu",
4637
- role: "menu"
4638
- }, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })) : null);
6101
+ "aria-label": t("session.pinned")
6102
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPinOutlineRegular, { size: 14 }))) : null, /* @__PURE__ */ h("span", { className: "wb-sessionTime" }, relativeTime(node.updatedAt, t)), /* @__PURE__ */ h("span", { className: "wb-rowActions" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
6103
+ open: menuOpen,
6104
+ portal: true,
6105
+ anchor: /* @__PURE__ */ h("button", {
6106
+ type: "button",
6107
+ className: "wb-iconButton",
6108
+ "aria-haspopup": "menu",
6109
+ "aria-expanded": menuOpen,
6110
+ "aria-label": t("session.actions", { name: label }),
6111
+ onClick: (event) => {
6112
+ event.stopPropagation();
6113
+ setMenuOpen((value) => !value);
6114
+ }
6115
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconEllipsisOutlineRegular, { size: 16 })),
6116
+ onClose: () => setMenuOpen(false)
6117
+ }, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })), renderSlot("sidebar.workspaces.session.row.action", owner)));
4639
6118
  }
4640
6119
  function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions, useSessionStatus, onOpen, renderSlot, t }) {
4641
6120
  const list = useSessions((state) => state);
@@ -4702,12 +6181,11 @@ function Sidebar(props) {
4702
6181
  });
4703
6182
  };
4704
6183
  const wide = !collapsed;
4705
- return /* @__PURE__ */ h("div", { className: cx("wb-root", collapsed && "wb-collapsed") }, /* @__PURE__ */ h("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ h("button", {
6184
+ return /* @__PURE__ */ h("div", { className: cx("wb-root", collapsed && "wb-collapsed") }, /* @__PURE__ */ h("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ h(Tip, { label: t("panel.conversation") }, /* @__PURE__ */ h("button", {
4706
6185
  type: "button",
4707
6186
  className: "wb-brand",
4708
- title: t("panel.conversation"),
4709
6187
  onClick: () => props.selectPanel(null)
4710
- }, /* @__PURE__ */ h("span", { className: "wb-brandIdentity" }, /* @__PURE__ */ h("span", { className: "wb-brandMark" }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })), /* @__PURE__ */ h("span", { className: "wb-brandName" }, renderSlot("sidebar.brand.name", {}, { fallback: t("brand.name") })))) : null, /* @__PURE__ */ h("button", {
6188
+ }, /* @__PURE__ */ h("span", { className: "wb-brandIdentity" }, /* @__PURE__ */ h("span", { className: "wb-brandMark" }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })), /* @__PURE__ */ h("span", { className: "wb-brandName" }, renderSlot("sidebar.brand.name", {}, { fallback: t("brand.name") }))))) : null, /* @__PURE__ */ h("button", {
4711
6189
  type: "button",
4712
6190
  className: "wb-iconButton wb-toggle",
4713
6191
  "aria-label": t(collapsed ? "toggle.open" : "toggle.collapse"),
@@ -4715,7 +6193,7 @@ function Sidebar(props) {
4715
6193
  }, !wide ? /* @__PURE__ */ h("span", {
4716
6194
  className: "wb-railMark",
4717
6195
  "aria-hidden": "true"
4718
- }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })) : null, /* @__PURE__ */ h("span", { className: "wb-panelIcon" }, /* @__PURE__ */ h(IconPanelLeft, { size: wide ? 16 : 18 })), !wide ? renderSlot("sidebar.toggle.badge", {}) : null)), /* @__PURE__ */ h("nav", {
6196
+ }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })) : null, /* @__PURE__ */ h("span", { className: "wb-panelIcon" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutlineRegular, { size: wide ? 16 : 18 })), !wide ? renderSlot("sidebar.toggle.badge", {}) : null)), /* @__PURE__ */ h("nav", {
4719
6197
  className: "wb-panelList",
4720
6198
  "aria-label": t("panels.label")
4721
6199
  }, panelEntries.map((entry) => /* @__PURE__ */ h(PanelRow, {
@@ -4764,16 +6242,28 @@ function Sidebar(props) {
4764
6242
  }
4765
6243
  //#endregion
4766
6244
  //#region src/shared/styles/rightbar.css?raw
4767
- var rightbar_default = ".wb-rightbar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--dsw-alias-bg-base);\n border-left: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-panelHeader {\n flex: none;\n height: 38px;\n}\n\n.wb-tabStrip {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 4px;\n height: 38px;\n padding: 10px 6px 0 10px;\n}\n\n.wb-stripTabs {\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n overflow: hidden;\n}\n\n.wb-stripFill {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.wb-stripChrome {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: none;\n margin-left: 4px;\n}\n\n.wb-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n height: 28px;\n padding: 0 10px;\n border: 0;\n border-radius: 8px;\n background: none;\n font: inherit;\n font-size: 13px;\n line-height: 16px;\n max-width: 100%;\n}\n\n.wb-tabActive {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-tabQuiet {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n.wb-tabQuiet:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-tabTitle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-crumbSep {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-stripChrome .wb-iconButton {\n width: 28px;\n height: 28px;\n padding: 6px;\n border-radius: 8px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-stripChrome .wb-iconButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-stripChrome .wb-iconButton:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-stripChrome .wb-spinning svg {\n animation: wb-spin 0.9s linear infinite;\n}\n\n@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.wb-collapseButton svg {\n transform: scaleX(-1);\n}\n\n.wb-expandButton {\n width: 28px;\n flex: none;\n padding: 0;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-expandButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-expandButton svg {\n width: 15px;\n height: 15px;\n}\n\n.wb-expandIcon {\n display: block;\n transform: scaleX(-1);\n}\n\n.wb-panelBody {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.wb-view {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n}\n\n.wb-view > .wb-issueList {\n margin: 0 -8px;\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: 20px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: 8px;\n padding: 20px 16px;\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: 4px;\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n padding: 8px 10px 8px 20px;\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: 12px;\n line-height: 18px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: 11px;\n line-height: 16px;\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: 6px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen.wb-iconButton {\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: 22px;\n height: 22px;\n padding: 4px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh.wb-iconButton {\n margin-left: 0;\n}\n\n.wb-cardOpen.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-cardRefresh.wb-iconButton,\n.wb-envRefresh.wb-iconButton {\n flex: none;\n width: 22px;\n height: 22px;\n padding: 4px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh.wb-iconButton {\n margin-left: auto;\n}\n\n.wb-cardRefresh.wb-iconButton:hover:not(:disabled),\n.wb-envRefresh.wb-iconButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-cardRefresh.wb-iconButton:disabled,\n.wb-envRefresh.wb-iconButton:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardRefresh.wb-spinning svg,\n.wb-envRefresh.wb-spinning svg {\n animation: wb-spin 0.9s linear infinite;\n}\n\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n}\n\n.wb-cardBody > :not(.wb-issueList) {\n padding-left: 8px;\n padding-right: 8px;\n}\n\n.wb-cardMore {\n box-sizing: border-box;\n border: 0;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n text-align: left;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n border-radius: 12px;\n padding-top: 6px;\n padding-bottom: 6px;\n}\n\n.wb-cardMore:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-prio {\n box-sizing: border-box;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 5px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-state-error-primary);\n background: var(--dsw-alias-bg-mask-1);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='2'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='3'] {\n color: var(--dsw-alias-state-business-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='4'] {\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-typeDot {\n flex: none;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n corner-shape: round;\n background: var(--dsw-alias-label-tertiary);\n}\n\n.wb-typeDot[data-type='PROCESSING'] {\n background: var(--dsw-alias-state-business-primary);\n}\n\n.wb-typeDot[data-type='COMPLETED'] {\n background: var(--dsw-alias-state-success-primary);\n}\n\n.wb-typeDot[data-type='unknown'] {\n background: var(--dsw-alias-label-tertiary);\n}\n\n.wb-issueList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.wb-issueRow {\n box-sizing: border-box;\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n width: 100%;\n text-align: left;\n border: 0;\n border-radius: 12px;\n background: none;\n padding: 8px;\n font: inherit;\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n font-size: 13px;\n}\n\n.wb-issueList > .wb-issueRow + .wb-issueRow::before {\n content: '';\n position: absolute;\n top: -1.5px;\n left: 8px;\n right: 8px;\n height: 0.5px;\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-issueRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-issueLink {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.wb-issueToChat {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n opacity: 0.65;\n}\n\n.wb-issueRow:hover .wb-issueToChat {\n opacity: 1;\n}\n\n.wb-issueToChat:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-issueToChatFailed,\n.wb-issueToChatFailed:hover {\n color: var(--dsw-alias-label-danger, #e5646b);\n opacity: 1;\n}\n\n.wb-issueRow: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}\n\n.wb-issueMain {\n display: flex;\n flex-direction: column;\n gap: 5px;\n flex: 1;\n min-width: 0;\n}\n\n.wb-issueLine {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n min-width: 0;\n font-size: 12px;\n line-height: 16px;\n}\n\n.wb-issueCode {\n flex: none;\n min-width: 3.4em;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.wb-issueTitle {\n display: block;\n flex: 1;\n min-width: 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary);\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-issueMeta {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n}\n\n.wb-issueStatus {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-issueIteration {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-issuePreview {\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-issueOpen {\n flex: none;\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-issueRow:hover .wb-issueOpen {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-issueMetaItem {\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n\n.wb-metaDot {\n flex: none;\n font-size: inherit;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-issueTime {\n flex: none;\n font-variant-numeric: tabular-nums;\n}\n\n.wb-releaseState {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.wb-releaseStateTitle {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-releaseStateHint {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-releaseActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 2px;\n}\n\n.wb-releaseResolving {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-releaseGear {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-envSkeletonBlock {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-top: 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-envSkeletonTitle {\n width: 96px;\n}\n.wb-envSkeletonLine {\n width: 72%;\n height: 10px;\n}\n\n.wb-envListSkeleton {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 1px 0;\n}\n\n.wb-envListSkeleton > :nth-child(2n) {\n width: 58%;\n}\n\n.wb-envBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-top: 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-envBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.wb-envBlockActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.wb-envBlockTitle {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 100%;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n font: inherit;\n font-size: 13px;\n font-weight: 500;\n line-height: 20px;\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-envBlockTitle:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-envChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform 0.15s var(--ds-ease-in-out);\n}\n\n.wb-envChevronOpen {\n transform: rotate(180deg);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wb-envChevron {\n transition: none;\n }\n}\n\n.wb-envList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.wb-envListTitle {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-envLine {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-envLineText {\n flex: none;\n min-width: 0;\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: 72px;\n overflow-y: auto;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\n}\n\n.wb-choiceOption {\n display: flex;\n align-items: center;\n gap: 6px;\n min-height: 30px;\n padding: 6px 8px;\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: 12px;\n height: 12px;\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 0.12s ease,\n border-color 0.12s 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 opacity: 0.5;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-envLineAt {\n flex: none;\n margin-left: auto;\n font-size: 10px;\n line-height: 16px;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-envLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.wb-envChatFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-envListEmpty {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-releasePublishPick {\n position: relative;\n display: inline-flex;\n}\n\n.wb-releasePublishRow {\n display: flex;\n justify-content: flex-end;\n padding-top: 12px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-releasePublish {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.wb-releaseConfirm {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 8px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-releaseConfirmTitle {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-releaseConfirmRow {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.wb-releaseConfirmKey {\n flex: none;\n width: 52px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-releaseConfirmValue {\n display: inline-flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n min-width: 0;\n overflow-wrap: anywhere;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-releaseConfirmSep {\n margin: 0 6px;\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-cmdbField > .wb-cmdbFieldLabel:empty {\n display: none;\n}\n\n.wb-releaseConfirmValue .wb-cmdbField {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n width: auto;\n}\n\n.wb-releaseConfirmValue .wb-cmdbFieldInput {\n flex: none;\n min-width: 0;\n max-width: 240px;\n min-height: 0;\n padding: 1px 6px;\n font-size: 11px;\n line-height: 16px;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-releaseConfirmValue .wb-menu {\n min-width: 220px;\n right: auto;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-layer-2));\n}\n\n.wb-releaseConfirmActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 2px;\n}\n\n.wb-cardGear.wb-iconButton {\n flex: none;\n width: 22px;\n height: 22px;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear.wb-iconButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-lineEllipsis {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-rowDot {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.wb-row:has(> .wb-rowDot) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n\n.wb-chips {\n display: flex;\n gap: var(--wb-gap-xs);\n flex-wrap: wrap;\n}\n\n.wb-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 26px;\n padding: 0 10px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: 13px;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-chipActive {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l4);\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.wb-chipCount {\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\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: 8px;\n padding: 8px;\n border-radius: 12px;\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: 0.5px;\n margin: 0 8px -0.5px;\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: 13px;\n border-radius: 4px;\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse 1.4s var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: 10px;\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@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\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: 14px;\n flex: 1;\n min-height: 240px;\n padding: 0 24px 24px;\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: 16px;\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: 300px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: 320px;\n font-family: var(--ds-font-family-code, monospace);\n font-size: 11px;\n line-height: 16px;\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: 8px;\n margin-top: 2px;\n}\n\n.wb-primaryButton {\n height: 28px;\n padding: 0 14px;\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-brand-primary);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary-foreground);\n cursor: pointer;\n}\n\n.wb-primaryButton:hover:not(:disabled) {\n background: var(--dsw-alias-button-primary-hover);\n}\n\n.wb-linkButton {\n padding: 2px 6px;\n border: none;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-linkButton:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-outlineButton {\n height: 28px;\n padding: 0 14px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-button-elevated-fill);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n.wb-outlineButton:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-linkButton:disabled,\n.wb-primaryButton:disabled,\n.wb-outlineButton:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.wb-approvalHint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: 0;\n}\n\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: 8px;\n}\n\n.wb-approvalLabel {\n flex: none;\n width: 56px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-approvalValue {\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalBody {\n max-height: 132px;\n overflow-y: auto;\n white-space: pre-wrap;\n font-weight: 400;\n}\n\n.wb-approvalHosts,\n.wb-approvalWarn {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-approvalCommand {\n font-family: var(--ds-font-family-code);\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-detailHead {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.wb-detailTitle {\n margin: 0;\n font-size: 15px;\n line-height: 24px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-detailStatus {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-detailType {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-detailMeta {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.wb-detailMetaRow {\n display: flex;\n gap: 8px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.wb-detailMetaRow dt {\n flex: none;\n width: 62px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-detailMetaRow dd {\n margin: 0;\n color: var(--dsw-alias-label-secondary);\n word-break: break-all;\n}\n\n.wb-detailBody {\n font-size: 13px;\n line-height: 22px;\n color: var(--dsw-alias-label-primary);\n white-space: pre-wrap;\n word-break: break-word;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n padding-top: 10px;\n}\n\n.wb-detailEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-imageChip {\n align-self: flex-start;\n font-size: 11px;\n line-height: 16px;\n padding: 1px 6px;\n border-radius: 4px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-intentBar {\n position: sticky;\n bottom: 0;\n margin-top: auto;\n padding-top: 10px;\n background: var(--dsw-alias-bg-base);\n}\n\n.wb-intentButton {\n width: 100%;\n height: 30px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-button-elevated-fill);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n.wb-intentButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-panelBody {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.wb-rightbar :is(button, [role='tab']):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}\n\n.wb-rightbar {\n container-type: inline-size;\n}\n\n@container (max-width: 340px) {\n .wb-panelBody {\n padding: 8px;\n }\n\n .wb-issueTime {\n display: none;\n }\n}\n\n.wb-refreshButton:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-gateActions[hidden],\n.wb-gateProgress[hidden],\n.wb-gateCommandRow[hidden],\n.wb-gateBridge[hidden],\n.wb-gateRaw[hidden] {\n display: none;\n}\n\n.wb-gate {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: var(--dsw-alias-bg-base);\n}\n\n.wb-gateCard {\n width: 100%;\n max-width: 420px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n text-align: center;\n}\n\n.wb-gateCard:has(.wb-gateActions:not([hidden])),\n.wb-gateCard:has(.wb-gateBridge:not([hidden])) {\n max-width: 520px;\n}\n\n.wb-gateBrand {\n display: flex;\n margin-bottom: 6px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-gateTitle {\n margin: 0;\n font-size: 16px;\n line-height: 24px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-gateHint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-gateSteps {\n list-style: none;\n margin: 6px 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: left;\n}\n\n.wb-gateStep {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.wb-gateStep[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-gateMark {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.wb-gateStep[data-status='ok'] .wb-gateMark {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.wb-gateStep[data-status='warn'] .wb-gateMark {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.wb-gateStep[data-status='failed'] .wb-gateMark {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-gateLabel {\n flex: none;\n}\n\n.wb-gateDetail {\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.wb-loading {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-loading[hidden] {\n display: none;\n}\n\n.wb-loadingMotion {\n transform-origin: center;\n animation: wb-spin 1.5s linear infinite;\n}\n\n.wb-loadingTrack,\n.wb-loadingArc {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n.wb-loadingTrack {\n opacity: 0.25;\n}\n\n.wb-loadingArc {\n stroke-dasharray: 12 150;\n animation: wb-dash 1.5s ease-in-out infinite;\n}\n\n@keyframes wb-dash {\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 .wb-loadingMotion,\n .wb-loadingArc {\n animation: none;\n }\n}\n\n.wb-gateProgress {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n max-width: 100%;\n}\n\n.wb-gateElapsed {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.wb-gateError {\n margin: 0;\n padding: 8px 10px;\n max-height: 120px;\n overflow: auto;\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-gateCommandRow {\n display: flex;\n align-items: center;\n gap: 4px;\n margin: 0 0 8px;\n padding-right: 4px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-gateCopy {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n.wb-gateCopy:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-gateCommand {\n flex: 1;\n min-width: 0;\n padding: 8px 10px;\n border-radius: 8px;\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: 11px;\n line-height: 16px;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-gateButtons {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n}\n\n.wb-modules {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.wb-iconButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-modulesPop {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n z-index: 30;\n width: 360px;\n max-width: calc(100vw - 48px);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: 14px;\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.36);\n overflow: hidden;\n}\n\n.wb-modulesHead {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px 9px 14px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-modulesTitle {\n flex: 1;\n font-size: 13px;\n line-height: 20px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-modulesReset {\n flex: none;\n padding: 3px 8px;\n border: none;\n border-radius: 6px;\n background: transparent;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n.wb-modulesReset:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-modulesReset:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-modulesList {\n list-style: none;\n margin: 0;\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.wb-modulesRow {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: 8px;\n padding: 7px 8px;\n border-radius: 8px;\n cursor: grab;\n}\n\n.wb-modulesRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-modulesRowOver::before {\n content: '';\n position: absolute;\n top: -3px;\n left: 8px;\n right: 8px;\n height: 2px;\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-modulesGhost {\n position: fixed;\n z-index: 40;\n pointer-events: none;\n padding: 4px 10px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n.wb-modulesGrip {\n font-size: 11px;\n line-height: 16px;\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n}\n\n.wb-modulesLabel {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n\n.wb-modulesName {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-modulesFoot {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-modulesFootText {\n flex: 1;\n min-width: 0;\n}\n\n.wb-modulesError {\n margin: 0;\n padding: 0 14px 10px;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-panelBody.wb-fixtureMany .wb-mockStrip {\n display: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: 10px;\n line-height: 14px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: 2px 7px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n corner-shape: round;\n background: transparent;\n font-size: 10px;\n line-height: 14px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\n}\n\n.wb-gate > .wb-mockStrip {\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.wb-marketList {\n list-style: none;\n margin: 0;\n padding: 6px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 320px;\n overflow-y: auto;\n}\n\n.wb-marketRow {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: 14px;\n row-gap: 4px;\n padding: 8px;\n border-radius: var(--dsw-radius-lg);\n}\n\n.wb-marketIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\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.wb-marketMain {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.wb-marketName {\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.wb-marketDesc {\n display: inline-flex;\n align-items: center;\n gap: 6px;\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.wb-marketUsedBy {\n margin-left: 8px;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n.wb-marketUsedBy::before {\n content: '·';\n margin-right: 6px;\n opacity: 0.8;\n}\n\n.wb-marketName .wb-marketVersion {\n margin-left: 6px;\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n}\n\n.wb-marketVersion {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-marketVersion::before {\n content: '';\n display: inline-block;\n width: 1px;\n height: 10px;\n margin: 0 8px 0 2px;\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-marketEnd {\n flex: none;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.wb-marketActions {\n flex: none;\n display: flex;\n gap: 6px;\n}\n\n.wb-marketSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n.wb-marketSectionHead {\n display: flex;\n align-items: baseline;\n gap: 8px;\n}\n\n.wb-marketSectionTitle {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-marketSectionCount {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-marketAction {\n flex: none;\n min-height: 32px;\n padding: 6px 14px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-marketAction:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-marketAction:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-marketActionPrimary {\n border-color: transparent;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-marketActionDanger {\n border-color: transparent;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-marketProgress {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 32px;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-marketConfirm {\n grid-column: 2 / -1;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.wb-marketConfirmText {\n flex: 1;\n min-width: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-marketNote {\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.wb-marketFailure {\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.wb-marketEmpty {\n padding: 18px 16px;\n text-align: center;\n}\n\n.wb-marketPage {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 32px;\n padding: 0 clamp(24px, 4vw, 48px) 48px;\n overflow: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-marketPage > * {\n width: 100%;\n max-width: 960px;\n}\n\n.wb-marketPageHead {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding-top: 28px;\n}\n\n.wb-marketPageTitle {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n.wb-marketPageIntro {\n margin: 4px 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-marketPageHead .wb-marketRefresh {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.wb-marketPageHead .wb-marketRefresh:disabled {\n cursor: default;\n}\n\n.wb-marketRefresh.wb-spinning svg {\n animation: wb-spin 0.9s linear infinite;\n}\n\n.wb-marketChecked {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-marketPage .wb-marketList {\n padding: 0;\n max-height: none;\n overflow: visible;\n}\n\n.wb-marketPage .wb-marketRow {\n margin: 0 -8px;\n}\n\n.wb-marketPage .wb-modulesFoot {\n padding: 0;\n border-top: none;\n}\n\n.wb-switch {\n flex: none;\n box-sizing: border-box;\n position: relative;\n width: 36px;\n height: 20px;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n corner-shape: round;\n background: var(--dsw-alias-border-l3);\n cursor: pointer;\n transition: background 0.12s ease;\n}\n\n.wb-switch[aria-checked='true'] {\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-switch:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-switch:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-switchKnob {\n display: block;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n corner-shape: round;\n background: var(--dsw-alias-label-primary-foreground);\n transition: transform 0.12s ease;\n}\n\n.wb-switch[aria-checked='true'] .wb-switchKnob {\n transform: translateX(16px);\n}\n\n.wb-gateActions,\n.wb-gateBridge {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 10px;\n margin-top: 4px;\n padding: 14px 16px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: 14px;\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n.wb-gateFixTitle {\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-gateActions .wb-gateHint,\n.wb-gateBridge .wb-gateHint {\n margin: 0;\n font-size: 12px;\n line-height: 19px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-gateActions .wb-gateCommandRow,\n.wb-gateBridge .wb-gateCommandRow {\n margin: 0;\n}\n\n.wb-gateActions .wb-gateButtons,\n.wb-gateBridge .wb-gateButtons {\n justify-content: flex-start;\n}\n\n.wb-gateRaw {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-gateRawSummary {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-gateActions .wb-gateError,\n.wb-gateBridge .wb-gateError {\n margin-top: 6px;\n}\n\n.wb-gateBridgeLines {\n margin: 0;\n padding-left: 18px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n font-size: 12px;\n line-height: 19px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-gateBridgeLine a {\n display: block;\n margin-top: 4px;\n width: fit-content;\n}\n\n.wb-gateLink {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n.wb-gateLink::after {\n content: '↗';\n margin-left: 2px;\n}\n\n.wb-gateLink:hover {\n text-decoration: underline;\n}\n\n.wb-blocker {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 20px 16px;\n text-align: center;\n}\n\n.wb-blockerIcon {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-blockerTitle {\n margin: 2px 0 0;\n font-size: 14px;\n line-height: 22px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-blockerHint {\n margin: 0;\n max-width: 42em;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n.wb-blocker.wb-blockerInline {\n align-items: flex-start;\n gap: 6px;\n padding: 4px 0 2px;\n text-align: left;\n}\n\n.wb-blocker.wb-blockerInline .wb-blockerTitle {\n font-size: 13px;\n line-height: 20px;\n}\n\n.wb-blocker.wb-blockerInline .wb-blockerHint {\n max-width: 100%;\n}\n\n.wb-blocker.wb-blockerInline .wb-blockerActions {\n margin-top: 8px;\n}\n\n.wb-blocker.wb-blockerInline .wb-blockerRaw {\n margin-top: 4px;\n max-width: 100%;\n}\n\n.wb-blockerActions {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 6px;\n}\n\n.wb-blockerRaw {\n margin-top: 10px;\n width: 100%;\n max-width: 360px;\n text-align: left;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-blockerRaw summary {\n cursor: pointer;\n}\n\n.wb-blockerRaw .wb-gateError {\n margin: 6px 0 0;\n}\n\n.wb-blockerNotice {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: 10px;\n margin: 0 0 10px;\n padding: 10px 12px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.wb-blockerNotice.wb-flat {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n.wb-blockerNoticeText {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.wb-blockerNoticeTitle {\n font-size: 12.5px;\n line-height: 18px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-blockerNoticeHint {\n font-size: 11.5px;\n line-height: 17px;\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-blockerNoticeActions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: -2px;\n}\n\n.wb-modulesDep {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n.wb-blockerFailure {\n margin: 8px 0 0;\n font-size: 11.5px;\n line-height: 17px;\n color: var(--dsw-alias-label-danger, #e5646b);\n overflow-wrap: anywhere;\n}\n\n.wb-blockerFailureDetail {\n display: block;\n margin-top: 2px;\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n.wb-blockerInlineLink {\n margin-left: 2px;\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n vertical-align: baseline;\n}\n\n.wb-blockerInlineLink:hover {\n text-decoration: underline;\n}\n\n.wb-blockerInlineLink:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.wb-marketPage .wb-modulesFootText {\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-marketConfirm {\n grid-column: 1 / -1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 4px;\n padding: 10px 0 2px;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.wb-marketConfirmText {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wb-marketConfirmTitle {\n font: var(--dsw-font-s-strong-14);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-marketConfirmDetail {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-marketConfirm .wb-marketAction {\n padding: 6px 14px;\n}\n\n.wb-marketActionDanger {\n border-color: var(--dsw-alias-state-error-primary);\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-marketActionDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-marketEmpty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 64px 16px;\n text-align: center;\n}\n\n.wb-marketEmptyTitle {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.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: 12px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbPublishTo {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-cmdbForm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.wb-cmdbField {\n display: flex;\n align-items: center;\n gap: 8px;\n position: relative;\n}\n\n.wb-menu {\n box-sizing: border-box;\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 100;\n padding: 4px;\n display: flex;\n flex-direction: column;\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-menu-surface-fill, var(--dsw-alias-bg-layer-2));\n box-shadow: var(--dsw-elevation-prominent);\n backdrop-filter: var(--dsw-menu-backdrop-filter);\n max-height: 240px;\n overflow-y: auto;\n}\n\n.wb-menuTop {\n top: auto;\n bottom: calc(100% + 4px);\n}\n\n.wb-menuItem {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n min-height: 30px;\n padding: 6px 8px;\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n cursor: pointer;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary);\n text-align: left;\n}\n\n.wb-menuItem:hover,\n.wb-menuItem:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n outline: none;\n}\n\n.wb-menuItemLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-menuItemMark {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-menuItemCheck {\n flex: none;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbFieldTrigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n text-align: left;\n cursor: pointer;\n}\n\n.wb-cmdbFieldInput {\n box-sizing: border-box;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 28px;\n padding: 4px 8px;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbFieldInput:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-border-l1);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\nselect.wb-cmdbFieldInput {\n cursor: pointer;\n}\n\n.wb-cmdbFieldLabel {\n flex: none;\n width: 72px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cmdbFieldInput {\n flex: 1 1 auto;\n min-width: 0;\n height: 26px;\n padding: 0 8px;\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-base);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbFieldInput:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color);\n outline-offset: 1px;\n}\n\n.wb-cmdbEnvs {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n}\n\n.wb-cmdbEnvs > .wb-cmdbFieldLabel {\n width: auto;\n margin-bottom: 2px;\n}\n\n.wb-cmdbEnvGroup {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wb-cmdbEnvGroupLabel {\n margin: 0;\n padding: 6px 8px 2px;\n font-size: 11px;\n line-height: 15px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cmdbEnvs > .wb-cmdbEnvGroup + .wb-cmdbEnvGroup {\n margin-top: 2px;\n padding-top: 8px;\n border-top: 0.5px solid var(--dsw-alias-border-l1);\n}\n\n.wb-cmdbEnvs .wb-cmdbEnvGroupLabel {\n padding-left: 0;\n padding-bottom: 4px;\n}\n\n.wb-cmdbFieldNote {\n flex: none;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n.wb-note {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cmdbLoading {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cmdbFieldWaiting {\n display: flex;\n align-items: center;\n color: var(--dsw-alias-label-tertiary);\n cursor: default;\n}\n\n.wb-problems {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wb-problem {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n\n.wb-row {\n display: grid;\n grid-template-columns: 56px minmax(0, 1fr);\n align-items: baseline;\n gap: 8px;\n padding: 4px 0;\n}\n\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-rowKey {\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-rowValue {\n min-width: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rowSub {\n display: block;\n margin-top: 2px;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.wb-cmdbConfirm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 0.5px solid var(--dsw-alias-state-error-primary);\n border-radius: var(--dsw-radius-sm);\n}\n\n.wb-cmdbConfirmText {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cmdbDone {\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.wb-cmdbAsk {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding-top: 8px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-cmdbAskText {\n flex: 1 1 auto;\n min-width: 0;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-cmdbAsk > .wb-linkButton {\n flex: none;\n white-space: nowrap;\n}\n\n.wb-longTask {\n padding-top: 12px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n text-decoration: none;\n white-space: nowrap;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\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: 11px;\n line-height: 16px;\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: 2px 0 0;\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump > summary {\n cursor: pointer;\n font-size: 11px;\n}\n\n.wb-longTaskDump > pre {\n margin: 4px 0 0;\n max-height: 220px;\n overflow: auto;\n font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n";
6245
+ var rightbar_default = ".wb-rightbar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--dsw-alias-bg-base);\n border-left: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-panelHeader {\n flex: none;\n height: var(--wb-len-38);\n}\n\n.wb-tabStrip {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-38);\n padding: var(--wb-len-10) var(--wb-len-6) 0 var(--wb-len-10);\n}\n\n.wb-stripFill {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.wb-rightbar :is(button, [role='tab']):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}\n\n.wb-rightbar {\n container-type: inline-size;\n}\n\n.wb-dangerAction {\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-stripChrome {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n flex: none;\n margin-left: var(--wb-len-4);\n}\n\n.wb-panelBody {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding: var(--wb-len-12);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n.wb-panelBody {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}";
4768
6246
  //#endregion
4769
6247
  //#region src/shared/styles/tokens.css?raw
4770
6248
  var tokens_default = ".wb-root,\n.wb-rightbar {\n --wb-bar-height: 36px;\n --wb-gap-xs: 6px;\n --wb-font-row: 14px;\n}\n";
4771
6249
  //#endregion
6250
+ //#region src/shared/styles/tokens/palette.css?raw
6251
+ var palette_default = ":root {\n --wb-static-titlebar-fill: #ffffff8c;\n --wb-static-titlebar-fill-hover: #ffffff4d;\n --wb-static-titlebar-fill-dark: #ffffff26;\n --wb-static-titlebar-fill-dark-hover: #fff3;\n --wb-static-mask-opaque: #000;\n --wb-static-shadow-ghost: 0 8px 20px rgba(0, 0, 0, 0.4);\n}\n";
6252
+ //#endregion
6253
+ //#region src/shared/styles/tokens/scale.css?raw
6254
+ var scale_default = ":root {\n --wb-dur-0-12: 0.12s;\n --wb-dur-0-15: 0.15s;\n --wb-dur-0-9: 0.9s;\n --wb-dur-1-4: 1.4s;\n --wb-dur-1-5: 1.5s;\n --wb-font-10: 10px;\n --wb-font-11-5: 11.5px;\n --wb-font-12-5: 12.5px;\n --wb-font-15: 15px;\n --wb-font-17: 17px;\n --wb-font-18: 18px;\n --wb-font-6: 6px;\n --wb-len-0-5: 0.5px;\n --wb-len-1: 1px;\n --wb-len-10: 10px;\n --wb-len-12: 12px;\n --wb-len-120: 120px;\n --wb-len-13: 13px;\n --wb-len-132: 132px;\n --wb-len-14: 14px;\n --wb-len-144: 144px;\n --wb-len-15: 15px;\n --wb-len-16: 16px;\n --wb-len-18: 18px;\n --wb-len-2: 2px;\n --wb-len-20: 20px;\n --wb-len-200: 200px;\n --wb-len-22: 22px;\n --wb-len-220: 220px;\n --wb-len-24: 24px;\n --wb-len-240: 240px;\n --wb-len-26: 26px;\n --wb-len-260: 260px;\n --wb-len-28: 28px;\n --wb-len-3: 3px;\n --wb-len-3-4em: 3.4em;\n --wb-len-30: 30px;\n --wb-len-300: 300px;\n --wb-len-32: 32px;\n --wb-len-320: 320px;\n --wb-len-34: 34px;\n --wb-len-36: 36px;\n --wb-len-360: 360px;\n --wb-len-38: 38px;\n --wb-len-4: 4px;\n --wb-len-440: 440px;\n --wb-len-40: 40px;\n --wb-len-420: 420px;\n --wb-len-42em: 42em;\n --wb-len-44: 44px;\n --wb-len-48: 48px;\n --wb-len-5: 5px;\n --wb-len-52: 52px;\n --wb-len-520: 520px;\n --wb-len-56: 56px;\n --wb-len-560: 560px;\n --wb-len-6: 6px;\n --wb-len-60: 60px;\n --wb-len-62: 62px;\n --wb-len-64: 64px;\n --wb-len-7: 7px;\n --wb-len-72: 72px;\n --wb-len-8: 8px;\n --wb-len-800: 800px;\n --wb-len-9: 9px;\n --wb-len-96: 96px;\n --wb-len-960: 960px;\n --wb-len-neg-0-5: -0.5px;\n --wb-len-neg-1-5: -1.5px;\n --wb-len-neg-12: -12px;\n --wb-len-neg-2: -2px;\n --wb-len-neg-3: -3px;\n --wb-len-neg-4: -4px;\n --wb-len-neg-6: -6px;\n --wb-len-neg-8: -8px;\n --wb-line-10: 10px;\n --wb-line-13: 13px;\n --wb-line-14: 14px;\n --wb-line-15: 15px;\n --wb-line-16: 16px;\n --wb-line-17: 17px;\n --wb-line-18: 18px;\n --wb-line-19: 19px;\n --wb-line-20: 20px;\n --wb-line-22: 22px;\n --wb-line-24: 24px;\n --wb-radius-13: 13px;\n --wb-radius-14: 14px;\n --wb-radius-2: 2px;\n --wb-radius-6: 6px;\n --wb-radius-pill: 999px;\n --wb-track-brand: .04em;\n --wb-z-100: 100;\n --wb-z-1100: 1100;\n --wb-z-30: 30;\n --wb-z-40: 40;\n --wb-z-top: 2147483000;\n}\n";
6255
+ //#endregion
4772
6256
  //#region src/shared/styles/sidebar-app.css?raw
4773
- var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) 4px 0;\n padding-right: calc(\n var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) -\n var(--dsh-session-list-scrollbar-offset)\n );\n}\n.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: 4px;\n height: 36px;\n flex: none;\n margin-bottom: 4px;\n padding-left: 8px;\n padding-right: 2px;\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}\n.wb-wsNew {\n margin-left: auto;\n}\n.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: 20px;\n}\n.wb-collapsed .wb-wsSection {\n margin: 0 0 12px;\n padding-right: 0;\n}\n.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}\n.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}\n\n.wb-project {\n position: relative;\n flex: none;\n margin: 0 2px 4px;\n}\n.wb-projectButton {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: 34px;\n padding: 0 8px;\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n.wb-projectButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-projectButton: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}\n.wb-collapsed .wb-projectButton {\n justify-content: center;\n width: var(--wb-bar-height);\n height: var(--wb-bar-height);\n padding: 0;\n}\n.wb-collapsed .wb-projectName,\n.wb-collapsed .wb-projectChevron {\n display: none;\n}\n.wb-projectGlyph {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 20px;\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-projectGlyphActive {\n color: var(--dsw-alias-state-business-primary);\n}\n.wb-projectName {\n flex: 1;\n min-width: 0;\n font-size: var(--wb-font-row);\n line-height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wb-projectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform 0.15s var(--ds-ease-in-out);\n}\n.wb-projectChevronOpen {\n transform: rotate(180deg);\n}\n\n.wb-popover {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: auto;\n min-width: 100%;\n max-width: 360px;\n z-index: 100;\n box-sizing: border-box;\n padding: 4px;\n display: flex;\n flex-direction: column;\n max-height: 320px;\n overflow-y: auto;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-menu-surface-fill);\n backdrop-filter: var(--dsw-menu-backdrop-filter);\n box-shadow: var(--dsw-elevation-prominent);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n.wb-popoverItem {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n min-height: 34px;\n padding: 6px 8px;\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n cursor: pointer;\n}\n.wb-popoverItem:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-popoverItemActive {\n background: transparent;\n}\n.wb-popoverItem:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n outline: none;\n}\n.wb-popoverItemIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-menu-icon);\n}\n.wb-popoverItemIcon svg {\n width: 14px;\n height: 14px;\n}\n.wb-popoverItemTitle {\n flex: 1;\n min-width: 0;\n font-size: 13px;\n line-height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wb-popoverCheck {\n flex: none;\n display: inline-flex;\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-primary);\n}\n.wb-popoverSep {\n height: 0.5px;\n margin: 3px 2px;\n background: var(--dsw-alias-border-l2);\n}\n.wb-popoverAdd {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n min-height: 34px;\n padding: 6px 8px;\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n cursor: pointer;\n}\n.wb-popoverAdd:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n.wb-popoverAdd svg {\n color: var(--dsw-alias-menu-icon);\n}\n.wb-popoverEmpty {\n padding: 6px 8px;\n font-size: 11px;\n line-height: 15px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: -4px;\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: 4px;\n padding-right: calc(\n var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) -\n var(--dsh-session-list-scrollbar-offset)\n );\n padding-bottom: 16px;\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.wb-sessions > * + * {\n margin-top: 2px;\n}\n\n.wb-sessionLeading {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 20px;\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-sessionPin {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 20px;\n margin-left: 6px;\n color: var(--dsw-alias-label-caption);\n}\n.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: 10px;\n}\n.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}\n.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}\n.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-iconButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: var(--dsw-radius-xs);\n background: none;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n.wb-iconButton: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}\n.wb-rowMenu {\n left: auto;\n right: 0;\n min-width: 144px;\n max-width: 260px;\n}\n\n.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: 32px;\n padding: 0 8px;\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-sessionRow: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}\n.wb-stateDot {\n position: relative;\n display: inline-block;\n flex: none;\n}\n.wb-stateDot::after {\n content: '';\n position: absolute;\n inset: 20%;\n border-radius: 50%;\n corner-shape: round;\n background: currentColor;\n}\n.wb-stateDot[data-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n.wb-stateDot[data-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n.wb-stateDot[data-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n.wb-stateDot[data-state='idle'] {\n color: var(--dsw-alias-state-idle-primary);\n}\n.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: 1px;\n height: 1px;\n position: absolute;\n overflow: hidden;\n}\n.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 6px 0 4px;\n font-size: var(--wb-font-row);\n line-height: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wb-sessionTime {\n flex: none;\n font-size: 10px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-empty {\n padding: 16px 12px;\n font-size: 13px;\n color: var(--dsw-alias-label-tertiary);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wb-projectChevron {\n transition: none;\n }\n}\n\n.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-panelTag {\n flex: none;\n margin-left: auto;\n white-space: nowrap;\n padding: 1px 8px;\n border-radius: 999px;\n corner-shape: round;\n color: var(--dsw-alias-state-warn-primary);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: 11px;\n font-weight: 500;\n line-height: 17px;\n}\n.wb-panelGlyph {\n position: relative;\n}\n.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: -3px;\n right: -3px;\n}\n\nbutton.pXSMma_workspace {\n display: none;\n}\n";
6257
+ var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) var(--wb-len-4) 0;\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n}\n.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-36);\n flex: none;\n margin-bottom: var(--wb-len-4);\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-2);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}\n.wb-wsNew {\n margin-left: auto;\n}\n.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: var(--wb-line-20);\n}\n.wb-collapsed .wb-wsSection {\n margin: 0 0 var(--wb-len-12);\n padding-right: 0;\n}\n.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}\n.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}\n\n.wb-project {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n.wb-projectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-projectButton {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n.wb-projectButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-projectButton: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}\n.wb-collapsed .wb-projectButton {\n justify-content: center;\n width: var(--wb-bar-height);\n height: var(--wb-bar-height);\n padding: 0;\n}\n.wb-collapsed .wb-projectName,\n.wb-collapsed .wb-projectChevron {\n display: none;\n}\n.wb-projectGlyph {\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.wb-projectGlyphActive {\n color: var(--dsw-alias-state-business-primary);\n}\n.wb-projectName {\n flex: 1;\n min-width: 0;\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wb-projectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform var(--wb-dur-0-15) var(--ds-ease-in-out);\n}\n.wb-projectChevronOpen {\n transform: rotate(180deg);\n}.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: var(--wb-len-neg-4);\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: var(--wb-len-4);\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n padding-bottom: var(--wb-len-16);\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.wb-sessions > * + * {\n margin-top: var(--wb-len-2);\n}\n\n.wb-sessionLeading {\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.wb-sessionPin {\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 margin-left: var(--wb-len-6);\n color: var(--dsw-alias-label-caption);\n}\n.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n.wb-rowActions .wb-iconButton {\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n}\n.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}\n.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}\n.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n.wb-iconButton: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}\n.wb-rowMenu {\n left: auto;\n right: 0;\n min-width: var(--wb-len-144);\n max-width: var(--wb-len-260);\n}\n\n.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-sessionRow: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}\n.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: var(--wb-len-1);\n height: var(--wb-len-1);\n position: absolute;\n overflow: hidden;\n}\n.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 var(--wb-len-6) 0 var(--wb-len-4);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wb-sessionTime {\n flex: none;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-empty {\n padding: var(--wb-len-16) var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wb-projectChevron {\n transition: none;\n }\n}\n\n.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-panelTag {\n flex: none;\n margin-left: auto;\n}\n.wb-panelGlyph {\n position: relative;\n}\n.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: var(--wb-len-neg-3);\n right: var(--wb-len-neg-3);\n}\n\nbutton.pXSMma_workspace {\n display: none;\n}\n";
4774
6258
  //#endregion
4775
6259
  //#region src/shared/styles/sidebar.css?raw
4776
- var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:18px 10px 6px}[data-windows-titlebar] .wb-root .wb-logoRow{height:40px;margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;position:fixed;left:12px}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:4px}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-newSession{margin-top:8px;margin-left:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-newSession{top:calc((var(--dsh-windows-titlebar-height) - 28px) / 2);z-index:30;-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:48px}[data-windows-titlebar] .wb-railIn .wb-iconButton,[data-windows-titlebar] .wb-railIn .wb-newSession{animation:none}[data-windows-titlebar] .wb-collapsed .wb-toggle,[data-windows-titlebar] .wb-collapsed .wb-newSession{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline}.wb-root.wb-quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.wb-fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.wb-wide{animation:wb-wide-in .2s var(--ds-ease-in-out)}@keyframes wb-wide-in{0%{opacity:0}}.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-regionArea{animation:wb-rail-in .15s var(--ds-ease-in-out) backwards}.wb-railIn .wb-footArea{animation:wb-rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes wb-rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes wb-rail-fade-in{0%{opacity:0}}.wb-topStrip{box-sizing:border-box;height:52px;margin:-6px calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 12px 2px;display:flex}[data-fullscreen] .wb-topStrip{justify-content:flex-start}.wb-topStrip+.wb-logoRow{margin-top:-12px}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:60px;margin-bottom:4px;padding:8px 0 8px 4px;display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:8px;min-width:0;height:24px;display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:.04em;align-items:center;gap:6px;min-width:0;height:24px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.wb-fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:17px}.wb-localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:1px;height:24px;display:inline-flex}.wb-localBuildTitle{letter-spacing:0;font-size:12px;line-height:13px}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:36px;height:36px}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-buildVersion{height:10px;color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:2px;flex:none;align-items:center;padding:0 3px;font-size:6px;font-weight:500;line-height:10px;display:inline-flex}.wb-newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;flex:none;justify-content:center;align-items:center;gap:0;margin:0 2px 12px;padding:8px 12px;font-size:14px;font-weight:500;line-height:22px;display:flex;position:relative;overflow:hidden;container-type:inline-size}.wb-newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .wb-newSession{background:#ffffff8c}[data-platform=darwin] .wb-newSession:hover{background:#ffffff4d}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession{background:#ffffff26}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession:hover{background:#fff3}.wb-collapsed .wb-newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.wb-collapsed .wb-newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.wb-collapsed .wb-newSessionLabel{max-width:0}.wb-newSessionLabelMask{flex:1;min-width:0}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionLabelMask:has(+.wb-newSessionShortcut){overflow:hidden;mask-image:linear-gradient(90deg,#000 calc(100% - 16px),#0000)}.wb-newSessionContent{justify-content:center;align-items:center;gap:6px;width:100cqw;display:flex}.wb-newSessionContent>svg{flex:none}.wb-newSessionShortcut{opacity:0;pointer-events:none;flex:none;font-weight:400;display:inline-flex}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionShortcut{opacity:1}.wb-panelList{flex-direction:column;flex:none;gap:4px;margin-bottom:8px;display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:36px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;margin:0 2px;padding:7px 8px;line-height:22px;display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:12px;margin-bottom:12px}.wb-collapsed .wb-panelRow{width:36px;height:36px;color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.wb-wide,.wb-fading>*,.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-footArea,.wb-railIn .wb-regionArea{transition:none;animation:none}}\n";
6260
+ var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:var(--wb-len-6) var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:var(--dsw-font-s-14-font-size);display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:var(--wb-len-18) var(--wb-len-10) var(--wb-len-6)}[data-windows-titlebar] .wb-root .wb-logoRow{height:var(--wb-len-40);margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;position:fixed;left:var(--wb-len-12)}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:var(--wb-len-4)}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-newSession{margin-top:var(--wb-len-8);margin-left:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-newSession{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:var(--wb-len-48)}[data-windows-titlebar] .wb-railIn .wb-iconButton,[data-windows-titlebar] .wb-railIn .wb-newSession{animation:none}[data-windows-titlebar] .wb-collapsed .wb-toggle,[data-windows-titlebar] .wb-collapsed .wb-newSession{corner-shape:round;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline}.wb-root.wb-quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.wb-fading>*{opacity:0;transition:opacity var(--wb-dur-0-15) var(--ds-ease-in-out)}.wb-wide{animation:wb-wide-in var(--ds-transition-duration) var(--ds-ease-in-out)}@keyframes wb-wide-in{0%{opacity:0}}.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-regionArea{animation:wb-rail-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}.wb-railIn .wb-footArea{animation:wb-rail-fade-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}@keyframes wb-rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes wb-rail-fade-in{0%{opacity:0}}.wb-topStrip{box-sizing:border-box;height:var(--wb-len-52);margin:var(--wb-len-neg-6) calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 var(--wb-len-12) var(--wb-len-2);display:flex}[data-fullscreen] .wb-topStrip{justify-content:flex-start}.wb-topStrip+.wb-logoRow{margin-top:var(--wb-len-neg-12)}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:var(--wb-len-8);height:var(--wb-len-60);margin-bottom:var(--wb-len-4);padding:var(--wb-len-8) 0 var(--wb-len-8) var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:var(--wb-len-36);margin-bottom:var(--wb-len-12);padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:var(--wb-len-8);min-width:0;height:var(--wb-len-24);display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:var(--wb-track-brand);align-items:center;gap:var(--wb-len-6);min-width:0;height:var(--wb-len-24);font-size:var(--wb-font-18);font-weight:600;line-height:var(--wb-line-24);display:inline-flex}.wb-fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:var(--wb-font-17)}.wb-localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:var(--wb-len-1);height:var(--wb-len-24);display:inline-flex}.wb-localBuildTitle{letter-spacing:0;font-size:var(--dsw-font-xxs-12-font-size);line-height:var(--wb-line-13)}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:var(--wb-len-36);height:var(--wb-len-36)}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-buildVersion{height:var(--wb-len-10);color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:var(--wb-radius-2);flex:none;align-items:center;padding:0 var(--wb-len-3);font-size:var(--wb-font-6);font-weight:500;line-height:var(--wb-line-10);display:inline-flex}.wb-newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-button-elevated-fill);height:var(--wb-len-38);color:var(--dsw-alias-label-primary);cursor:pointer;flex:none;justify-content:center;align-items:center;gap:0;margin:0 var(--wb-len-2) var(--wb-len-12);padding:var(--wb-len-8) var(--wb-len-12);font-size:var(--dsw-font-s-14-font-size);font-weight:500;line-height:var(--wb-line-22);display:flex;position:relative;overflow:hidden;container-type:inline-size}.wb-newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .wb-newSession{background:var(--wb-static-titlebar-fill)}[data-platform=darwin] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-hover)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession{background:var(--wb-static-titlebar-fill-dark)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-dark-hover)}.wb-collapsed .wb-newSession{background:0 0;border-color:transparent;align-self:flex-start;gap:0;width:var(--wb-len-36);height:var(--wb-len-36);margin:0 0 var(--wb-len-12);padding:0}.wb-collapsed .wb-newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-newSessionLabel{white-space:nowrap;max-width:var(--wb-len-200);overflow:hidden}.wb-collapsed .wb-newSessionLabel{max-width:0}.wb-newSessionLabelMask{flex:1;min-width:0}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionLabelMask:has(+.wb-newSessionShortcut){overflow:hidden;mask-image:linear-gradient(90deg,var(--wb-static-mask-opaque) calc(100% - var(--wb-len-16)),transparent)}.wb-newSessionContent{justify-content:center;align-items:center;gap:var(--wb-len-6);width:100cqw;display:flex}.wb-newSessionContent>svg{flex:none}.wb-newSessionShortcut{opacity:0;pointer-events:none;flex:none;font-weight:400;display:inline-flex}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionShortcut{opacity:1}.wb-panelList{flex-direction:column;flex:none;gap:var(--wb-len-4);margin-bottom:var(--wb-len-8);display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:var(--wb-len-36);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:var(--wb-len-8);margin:0 var(--wb-len-2);padding:var(--wb-len-7) var(--wb-len-8);line-height:var(--wb-line-22);display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:var(--wb-len-12);margin-bottom:var(--wb-len-12)}.wb-collapsed .wb-panelRow{width:var(--wb-len-36);height:var(--wb-len-36);color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:var(--wb-len-neg-4);margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.wb-wide,.wb-fading>*,.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-footArea,.wb-railIn .wb-regionArea{transition:none;animation:none}}\n";
6261
+ //#endregion
6262
+ //#region src/shared/styles/chrome.css?raw
6263
+ var chrome_default = ".wb-stripButton {\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.wb-stripIconFlip {\n display: block;\n transform: scaleX(-1);\n}\n\n.wb-stripButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stripButton:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-stripButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stripButton.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n\n.wb-panelBody.wb-fixtureMany .wb-mockStrip {\n display: none;\n}\n\n@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n";
6264
+ //#endregion
6265
+ //#region src/shared/styles/board.css?raw
6266
+ var board_default = ".wb-view {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-view > .wb-issueList {\n margin: 0 var(--wb-len-neg-8);\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\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12);\n}\n\n.wb-cardBody > :not(.wb-issueList) {\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-8);\n}\n\n.wb-cardMore {\n align-self: flex-start;\n color: var(--dsw-alias-label-secondary);\n padding-top: var(--wb-len-6);\n padding-bottom: var(--wb-len-6);\n}\n\n.wb-cardMore:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-prio {\n box-sizing: border-box;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--wb-len-22);\n height: var(--wb-len-18);\n padding: 0 var(--wb-len-5);\n border-radius: var(--wb-radius-6);\n font-size: var(--dsw-font-xxxs-11-font-size);\n font-weight: 600;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-state-error-primary);\n background: var(--dsw-alias-bg-mask-1);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='2'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='3'] {\n color: var(--dsw-alias-state-business-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent);\n}\n\n.wb-prio[data-level='4'] {\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-typeDot {\n flex: none;\n width: var(--wb-len-5);\n height: var(--wb-len-5);\n border-radius: 50%;\n corner-shape: round;\n background: var(--dsw-alias-label-tertiary);\n}\n\n.wb-typeDot[data-type='PROCESSING'] {\n background: var(--dsw-alias-state-business-primary);\n}\n\n.wb-typeDot[data-type='COMPLETED'] {\n background: var(--dsw-alias-state-success-primary);\n}\n\n.wb-typeDot[data-type='unknown'] {\n background: var(--dsw-alias-label-tertiary);\n}\n\n.wb-issueList {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-issueRow {\n box-sizing: border-box;\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n text-align: left;\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: none;\n padding: var(--wb-len-8);\n font: inherit;\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-issueList > .wb-issueRow + .wb-issueRow::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-1-5);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-issueRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-issueLink {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--wb-len-8);\n flex: 1;\n min-width: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.wb-issueToChat {\n flex: none;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.65;\n}\n\n.wb-issueRow:hover .wb-issueToChat {\n opacity: 1;\n}\n\n.wb-issueToChat:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-issueToChatFailed,\n.wb-issueToChatFailed:hover {\n color: var(--dsw-alias-state-error-primary);\n opacity: 1;\n}\n\n.wb-issueRow: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}\n\n.wb-issueMain {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-5);\n flex: 1;\n min-width: 0;\n}\n\n.wb-issueLine {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-16);\n}\n\n.wb-issueCode {\n flex: none;\n min-width: var(--wb-len-3-4em);\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.wb-issueTitle {\n display: block;\n flex: 1;\n min-width: 0;\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 white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-issueMeta {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\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}\n\n.wb-issueStatus {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-issueIteration {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-issuePreview {\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 overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-issueOpen {\n flex: none;\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-issueRow:hover .wb-issueOpen {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-issueMetaItem {\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n\n.wb-metaDot {\n flex: none;\n font-size: inherit;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-issueTime {\n flex: none;\n font-variant-numeric: tabular-nums;\n}\n\n.wb-releaseState {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n.wb-releaseStateTitle {\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-primary);\n}\n\n.wb-releaseStateHint {\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.wb-releaseActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n\n.wb-releaseResolving {\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\n.wb-releaseGear {\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.wb-envSkeletonBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-envSkeletonTitle {\n width: var(--wb-len-96);\n}\n.wb-envSkeletonLine {\n width: 72%;\n height: var(--wb-len-10);\n}\n\n.wb-envListSkeleton {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-1) 0;\n}\n\n.wb-envListSkeleton > :nth-child(2n) {\n width: 58%;\n}\n\n.wb-envBlock {\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-envBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-envBlockActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n.wb-envBlockTitle {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n width: 100%;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n font-weight: 500;\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-envBlockTitle:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-envChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform var(--wb-dur-0-15) var(--ds-ease-in-out);\n}\n\n.wb-envChevronOpen {\n transform: rotate(180deg);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wb-envChevron {\n transition: none;\n }\n}\n\n.wb-envList {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-envListTitle {\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.wb-envLine {\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-envLineText {\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-envLineAt {\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-envLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-envChatFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-envListEmpty {\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.wb-releasePublishPick {\n position: relative;\n display: inline-flex;\n}\n\n.wb-releasePublishRow {\n display: flex;\n justify-content: flex-end;\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-releasePublish {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n}\n\n.wb-releaseConfirm {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-10) var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-releaseConfirmTitle {\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-primary);\n}\n\n.wb-releaseConfirmRow {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n}\n\n.wb-releaseConfirmKey {\n flex: none;\n width: var(--wb-len-52);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-releaseConfirmValue {\n display: inline-flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow-wrap: anywhere;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-releaseConfirmSep {\n margin: 0 var(--wb-len-6);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-cmdbField > .wb-cmdbFieldLabel:empty {\n display: none;\n}\n\n.wb-releaseConfirmValue .wb-cmdbField {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: auto;\n}\n\n.wb-releaseConfirmValue .wb-cmdbFieldInput {\n flex: none;\n min-width: 0;\n max-width: var(--wb-len-240);\n min-height: 0;\n padding: var(--wb-len-1) var(--wb-len-6);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-releaseConfirmValue .wb-menu {\n min-width: var(--wb-len-220);\n right: auto;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-layer-2));\n}\n\n.wb-releaseConfirmActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n\n.wb-lineEllipsis {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-rowDot {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-row:has(> .wb-rowDot) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n\n.wb-chips {\n display: flex;\n gap: var(--wb-gap-xs);\n flex-wrap: wrap;\n}\n\n.wb-chip {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-13);\n background: none;\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-secondary);\n cursor: pointer;\n}\n\n.wb-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-chipActive {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-border-l4);\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.wb-chipCount {\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }\n}\n\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\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\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\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\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\n.wb-approvalBody {\n max-height: var(--wb-len-132);\n overflow-y: auto;\n white-space: pre-wrap;\n font-weight: 400;\n}\n\n.wb-approvalHosts,\n.wb-approvalWarn {\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 overflow-wrap: anywhere;\n}\n\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-detailHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n.wb-detailTitle {\n margin: 0;\n font-size: var(--wb-font-15);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-detailStatus {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\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-detailType {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-detailMeta {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-detailMetaRow {\n display: flex;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n}\n\n.wb-detailMetaRow dt {\n flex: none;\n width: var(--wb-len-62);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-detailMetaRow dd {\n margin: 0;\n color: var(--dsw-alias-label-secondary);\n word-break: break-all;\n}\n\n.wb-detailBody {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n white-space: pre-wrap;\n word-break: break-word;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n padding-top: var(--wb-len-10);\n}\n\n.wb-detailEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-imageChip {\n align-self: flex-start;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n padding: var(--wb-len-1) var(--wb-len-6);\n border-radius: var(--dsw-radius-xs);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-intentBar {\n position: sticky;\n bottom: 0;\n margin-top: auto;\n padding-top: var(--wb-len-10);\n background: var(--dsw-alias-bg-base);\n}\n\n.wb-intentButton {\n width: 100%;\n height: var(--wb-len-30);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-button-elevated-fill);\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.wb-intentButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n@container (max-width: 340px) {\n .wb-panelBody {\n padding: var(--wb-len-8);\n }\n\n .wb-issueTime {\n display: none;\n }\n}\n\n@keyframes wb-dash {\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.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n.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-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbPublishTo {\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-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-cmdbForm {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n.wb-cmdbField {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n position: relative;\n}\n\n.wb-menu {\n box-sizing: border-box;\n position: absolute;\n top: calc(100% + var(--wb-len-4));\n left: 0;\n right: 0;\n z-index: var(--wb-z-100);\n padding: var(--wb-len-4);\n display: flex;\n flex-direction: column;\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-menu-surface-fill, var(--dsw-alias-bg-layer-2));\n box-shadow: var(--dsw-elevation-prominent);\n backdrop-filter: var(--dsw-menu-backdrop-filter);\n max-height: var(--wb-len-240);\n overflow-y: auto;\n}\n\n.wb-menuTop {\n top: auto;\n bottom: calc(100% + var(--wb-len-4));\n}\n\n.wb-menuItem {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-height: var(--wb-len-30);\n padding: var(--wb-len-6) var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\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 text-align: left;\n}\n\n.wb-menuItem:hover,\n.wb-menuItem:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n outline: none;\n}\n\n.wb-menuItemLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-menuItemMark {\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}\n\n.wb-formActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n.wb-menuItemCheck {\n flex: none;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cmdbFieldTrigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-6);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-cmdbFieldInput {\n box-sizing: border-box;\n flex: 1 1 auto;\n min-width: 0;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\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.wb-cmdbFieldInput:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-border-l1);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\nselect.wb-cmdbFieldInput {\n cursor: pointer;\n}\n\n.wb-cmdbFieldLabel {\n flex: none;\n width: var(--wb-len-72);\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-cmdbFieldInput {\n flex: 1 1 auto;\n min-width: 0;\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-base);\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}\n\n.wb-cmdbFieldInput:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color);\n outline-offset: 1px;\n}\n\n.wb-cmdbEnvs {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n}\n\n.wb-cmdbEnvs > .wb-cmdbFieldLabel {\n width: auto;\n margin-bottom: var(--wb-len-2);\n}\n\n.wb-cmdbEnvGroup {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n min-width: 0;\n}\n\n.wb-cmdbEnvGroupLabel {\n margin: 0;\n padding: var(--wb-len-6) var(--wb-len-8) var(--wb-len-2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-15);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cmdbEnvs > .wb-cmdbEnvGroup + .wb-cmdbEnvGroup {\n margin-top: var(--wb-len-2);\n padding-top: var(--wb-len-8);\n border-top: 0.5px solid var(--dsw-alias-border-l1);\n}\n\n.wb-cmdbEnvs .wb-cmdbEnvGroupLabel {\n padding-left: 0;\n padding-bottom: var(--wb-len-4);\n}\n\n.wb-cmdbFieldNote {\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.wb-note {\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.wb-cmdbLoading {\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-cmdbFieldWaiting {\n display: flex;\n align-items: center;\n color: var(--dsw-alias-label-tertiary);\n cursor: default;\n}\n\n.wb-problems {\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.wb-problem {\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-rows {\n display: flex;\n flex-direction: column;\n}\n\n.wb-row {\n display: grid;\n grid-template-columns: 56px minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-rowKey {\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.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-rowSub {\n display: block;\n margin-top: var(--wb-len-2);\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.wb-cmdbConfirm {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-state-error-primary);\n border-radius: var(--dsw-radius-sm);\n}\n\n.wb-cmdbConfirmText {\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-cmdbDone {\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-success-primary);\n}\n\n.wb-cmdbAsk {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n padding-top: var(--wb-len-8);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-cmdbAsk > button {\n flex: none;\n white-space: nowrap;\n}\n\n.wb-cmdbAskText {\n flex: 1 1 auto;\n min-width: 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 overflow-wrap: anywhere;\n}\n\n.wb-anchorButton {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-4);\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 text-decoration: none;\n cursor: pointer;\n}\n\n.wb-anchorButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.wb-envRefresh.wb-iconButton {\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-envRefresh.wb-iconButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-envRefresh.wb-iconButton:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-envRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}";
4777
6267
  //#endregion
4778
6268
  //#region src/shared/hooks/use-api-resource.ts
4779
6269
  var use_api_resource_exports = /* @__PURE__ */ __exportAll({
@@ -5041,10 +6531,11 @@ function useBlockerActions(onRetry, onOpenMarket) {
5041
6531
  return;
5042
6532
  }
5043
6533
  if (action.kind === "copy") {
5044
- navigator.clipboard?.writeText(action.text).then(() => {
6534
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(action.text).then((ok) => {
6535
+ if (!ok) return;
5045
6536
  setCopied(action.text);
5046
6537
  setTimeout(() => setCopied(null), 1500);
5047
- }, () => {});
6538
+ });
5048
6539
  return;
5049
6540
  }
5050
6541
  window.open(action.url, "_blank", "noopener");
@@ -5054,18 +6545,39 @@ function useBlockerActions(onRetry, onOpenMarket) {
5054
6545
  failure
5055
6546
  };
5056
6547
  }
6548
+ var BlockerState_module_default = {
6549
+ blocker: "_blocker_cfaak_1",
6550
+ icon: "_icon_cfaak_10",
6551
+ title: "_title_cfaak_15",
6552
+ hint: "_hint_cfaak_23",
6553
+ blockerInline: "_blockerInline_cfaak_32",
6554
+ actions: "_actions_cfaak_48",
6555
+ raw: "_raw_cfaak_52",
6556
+ notice: "_notice_cfaak_71",
6557
+ noticeFlat: "_noticeFlat_cfaak_84",
6558
+ noticeText: "_noticeText_cfaak_91",
6559
+ noticeTitle: "_noticeTitle_cfaak_98",
6560
+ noticeHint: "_noticeHint_cfaak_105",
6561
+ noticeActions: "_noticeActions_cfaak_112",
6562
+ failure: "_failure_cfaak_119",
6563
+ failureDetail: "_failureDetail_cfaak_127",
6564
+ inlineLink: "_inlineLink_cfaak_134",
6565
+ rawText: "_rawText_cfaak_156"
6566
+ };
5057
6567
  //#endregion
5058
6568
  //#region src/shared/components/BlockerState.tsx
5059
6569
  var BlockerState_exports = /* @__PURE__ */ __exportAll({ BlockerState: () => BlockerState });
5060
6570
  function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpenMarket }) {
5061
6571
  const { run, copied, running, failure } = useBlockerActions(onRetry, onOpenMarket);
6572
+ const [rawOpen, setRawOpen] = useState(false);
5062
6573
  const pending = blockerPending(busy, running);
5063
6574
  const inlineActions = blocker.actions.filter((action) => action.kind === "open-url" && action.inline === true);
5064
6575
  const buttonActions = blocker.actions.filter((action) => !(action.kind === "open-url" && action.inline === true) || blocker.hint === void 0);
5065
- const buttons = buttonActions.map((action, index) => /* @__PURE__ */ h("button", {
6576
+ const buttons = buttonActions.map((action, index) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5066
6577
  key: `${action.kind}:${action.label}`,
5067
6578
  type: "button",
5068
- className: index === 0 ? "wb-primaryButton" : "wb-linkButton",
6579
+ size: "sm",
6580
+ variant: index === 0 ? "primary" : "ghost",
5069
6581
  disabled: pending,
5070
6582
  onClick: () => run(action)
5071
6583
  }, blockerActionLabel(action, {
@@ -5073,26 +6585,40 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
5073
6585
  running,
5074
6586
  copied
5075
6587
  }, t)));
5076
- const failureBlock = failure === null ? null : /* @__PURE__ */ h("p", { className: "wb-blockerFailure" }, t("blocker.fix.failed"), failure.message, failure.detail === void 0 ? null : /* @__PURE__ */ h("span", { className: "wb-blockerFailureDetail" }, failure.detail));
6588
+ const failureBlock = failure === null ? null : /* @__PURE__ */ h("p", { className: BlockerState_module_default.failure }, t("blocker.fix.failed"), failure.message, failure.detail === void 0 ? null : /* @__PURE__ */ h("span", { className: BlockerState_module_default.failureDetail }, failure.detail));
5077
6589
  if (blocker.severity === "notice") return /* @__PURE__ */ h("div", {
5078
- className: `wb-blockerNotice${flush ? " wb-flat" : ""}`,
6590
+ className: `${BlockerState_module_default.notice}${flush ? ` ${BlockerState_module_default.noticeFlat}` : ""}`,
5079
6591
  role: "status",
5080
6592
  "aria-busy": pending
5081
- }, /* @__PURE__ */ h("span", { className: "wb-blockerNoticeText" }, /* @__PURE__ */ h("span", { className: "wb-blockerNoticeTitle" }, blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: "wb-blockerNoticeHint" }, blocker.hint)), /* @__PURE__ */ h("span", { className: "wb-blockerNoticeActions" }, buttons), failureBlock);
6593
+ }, /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeText }, /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeTitle }, blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeHint }, blocker.hint)), /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeActions }, buttons), failureBlock);
5082
6594
  return /* @__PURE__ */ h("div", {
5083
- className: `wb-blocker${flush ? " wb-blockerInline" : ""}`,
6595
+ className: `${BlockerState_module_default.blocker}${flush ? ` ${BlockerState_module_default.blockerInline}` : ""}`,
5084
6596
  role: "status",
5085
6597
  "aria-busy": pending
5086
6598
  }, flush ? null : /* @__PURE__ */ h("span", {
5087
- className: "wb-blockerIcon",
6599
+ className: BlockerState_module_default.icon,
5088
6600
  "aria-hidden": "true"
5089
- }, /* @__PURE__ */ h(IconBrandMark, { size: 32 })), /* @__PURE__ */ h("p", { className: "wb-blockerTitle" }, blocker.title), blocker.hint === void 0 && inlineActions.length === 0 ? null : /* @__PURE__ */ h("p", { className: "wb-blockerHint" }, blocker.hint, inlineActions.map((action) => /* @__PURE__ */ h("button", {
6601
+ }, /* @__PURE__ */ h(IconBrandMark, { size: 32 })), /* @__PURE__ */ h("p", { className: BlockerState_module_default.title }, blocker.title), blocker.hint === void 0 && inlineActions.length === 0 ? null : /* @__PURE__ */ h("p", { className: BlockerState_module_default.hint }, blocker.hint, inlineActions.map((action) => /* @__PURE__ */ h("button", {
5090
6602
  key: `inline:${action.kind}:${action.label}`,
5091
6603
  type: "button",
5092
- className: "wb-blockerInlineLink",
6604
+ className: BlockerState_module_default.inlineLink,
5093
6605
  disabled: pending,
5094
6606
  onClick: () => run(action)
5095
- }, action.label, /* @__PURE__ */ h(IconRightUp, { size: 12 })))), buttonActions.length === 0 ? null : /* @__PURE__ */ h("div", { className: "wb-blockerActions" }, buttons), failureBlock, blocker.detail === void 0 ? null : /* @__PURE__ */ h("details", { className: "wb-blockerRaw" }, /* @__PURE__ */ h("summary", null, t("env.fix.details")), /* @__PURE__ */ h("pre", { className: "wb-gateError" }, blocker.detail)));
6607
+ }, action.label, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 12 })))), buttonActions.length === 0 ? null : /* @__PURE__ */ h("div", { className: BlockerState_module_default.actions }, buttons), failureBlock, blocker.detail === void 0 ? null : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
6608
+ className: BlockerState_module_default.raw,
6609
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconInfoOutlineRegular, { size: 14 }),
6610
+ title: t("env.fix.details"),
6611
+ open: rawOpen,
6612
+ expandable: true,
6613
+ expandOnRowClick: true,
6614
+ previewChevron: true,
6615
+ onToggle: () => setRawOpen(!rawOpen)
6616
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
6617
+ code: blocker.detail,
6618
+ className: BlockerState_module_default.rawText,
6619
+ copyLabel: t("blocker.copy"),
6620
+ copiedLabel: t("env.copied")
6621
+ })));
5096
6622
  }
5097
6623
  //#endregion
5098
6624
  //#region src/app/client.tsx
@@ -5119,7 +6645,9 @@ var kit = {
5119
6645
  ...dist_exports,
5120
6646
  ...dist_exports,
5121
6647
  ...dist_exports,
5122
- ...dist_exports
6648
+ ...dist_exports,
6649
+ ...dist_exports,
6650
+ Tip
5123
6651
  },
5124
6652
  api: {
5125
6653
  ...dist_exports,
@@ -5136,10 +6664,11 @@ function messagesOf(units) {
5136
6664
  ...face.messages === void 0 ? {} : { messages: face.messages }
5137
6665
  })));
5138
6666
  }
6667
+ var COMPONENT_CSS_MARKER = "\n.wb-approvalCommand {\n max-width: 100%;\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-len-20);\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-cardRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\n}\n\n.wb-choiceOption {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-30);\n padding: var(--wb-len-6) 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-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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 opacity: 0.5;\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}\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 display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n text-decoration: none;\n white-space: nowrap;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-12);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: var(--wb-len-2) var(--wb-len-7);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: transparent;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\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.wb-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\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[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._foot_1us83_1 {\n display: flex;\n align-items: center;\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_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_7yq35_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 max-height: var(--wb-len-320);\n overflow-y: auto;\n}\n\n._marketRow_7yq35_12 {\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_7yq35_22 {\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_7yq35_34 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_7yq35_41 {\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_7yq35_50 {\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_7yq35_61 {\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_7yq35_61::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_7yq35_41 ._marketVersion_7yq35_75 {\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_7yq35_75 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_7yq35_75::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._marketEnd_7yq35_97 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_7yq35_104 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_7yq35_110 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_7yq35_117 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_7yq35_123 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_7yq35_129 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_7yq35_135 {\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_7yq35_145 {\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._marketFailure_7yq35_152 {\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_7yq35_159 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_7yq35_164 {\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: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_7yq35_164 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_7yq35_181 {\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_7yq35_189 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_7yq35_194 {\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_7yq35_200 {\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_7yq35_209 {\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_7yq35_209:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_7yq35_209:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_7yq35_234 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_7yq35_238 svg {\n animation: _wb-spin_7yq35_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_7yq35_242 {\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_7yq35_159 {\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_7yq35_259 {\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_7yq35_267 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_7yq35_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._wide_1coeb_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_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_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_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_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_1coeb_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_1coeb_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_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_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_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_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_1coeb_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_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_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_1coeb_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_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_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_1coeb_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_1coeb_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_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_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_1coeb_351,\n._resultWarn_1coeb_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_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\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_1coeb_375 {\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_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\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_1coeb_395 {\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_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\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_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\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._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._button_ssnyt_1 {\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_ssnyt_1:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._icon_ssnyt_13 {\n display: block;\n transform: scaleX(-1);\n}\n\n._icon_ssnyt_13 svg {\n width: var(--wb-len-15);\n height: var(--wb-len-15);\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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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: grab;\n}\n\n._row_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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}\n\n._label_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._blocker_cfaak_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_cfaak_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_cfaak_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_cfaak_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_cfaak_1._blockerInline_cfaak_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_cfaak_1._blockerInline_cfaak_32 ._title_cfaak_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._hint_cfaak_23 {\n max-width: 100%;\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._actions_cfaak_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._raw_cfaak_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_cfaak_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_cfaak_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_cfaak_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_cfaak_71._noticeFlat_cfaak_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_cfaak_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_cfaak_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_cfaak_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_cfaak_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_cfaak_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_cfaak_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._inlineLink_cfaak_134 {\n margin-left: var(--wb-len-2);\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n vertical-align: baseline;\n}\n\n._inlineLink_cfaak_134:hover {\n text-decoration: underline;\n}\n\n._inlineLink_cfaak_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n._rawText_cfaak_156 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
5139
6668
  function installStyles() {
5140
6669
  const style = document.createElement("style");
5141
6670
  style.setAttribute(STYLE_MARKER, "");
5142
- style.textContent = `${tokens_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}`;
6671
+ style.textContent = `${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${COMPONENT_CSS_MARKER}`;
5143
6672
  document.head.appendChild(style);
5144
6673
  return () => style.remove();
5145
6674
  }
@@ -5181,7 +6710,6 @@ function mount(ctx) {
5181
6710
  manifests: () => units.manifests()
5182
6711
  });
5183
6712
  assembleClientUnits(units);
5184
- const manifests = units.manifests();
5185
6713
  const store = rightbarStore;
5186
6714
  const observable = {
5187
6715
  getSnapshot: () => store.getSnapshot(),
@@ -5213,7 +6741,15 @@ function mount(ctx) {
5213
6741
  ctx.layout.openRightbar(track, fullscreen);
5214
6742
  } else ctx.layout.closeRightbar();
5215
6743
  },
5216
- toggleRightbar: () => store.toggleExpanded(),
6744
+ toggleRightbar: () => {
6745
+ store.toggleExpanded();
6746
+ if (!store.getSnapshot().expanded) {
6747
+ ctx.layout.closeRightbar();
6748
+ return;
6749
+ }
6750
+ seedRightbarWidth(ctx);
6751
+ ctx.layout.openRightbar(true, false);
6752
+ },
5217
6753
  openPanel: (step) => store.open(step),
5218
6754
  goToPanel: (index) => store.goTo(index)
5219
6755
  };
@@ -5248,7 +6784,7 @@ function mount(ctx) {
5248
6784
  units
5249
6785
  })
5250
6786
  }, Rightbar));
5251
- registerMarketPanel(ctx, manifests);
6787
+ registerMarketPanel(ctx, units);
5252
6788
  const gate = createBootGate(ctx);
5253
6789
  ctx.effect(() => () => gate.close(), "dsh-workbench: env gate");
5254
6790
  ctx.slots.inject("conversation.approval.detail", () => ctx.slots.register({