@growthub/cli 0.13.7 → 0.13.9

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 (25) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/codex-sites/route.js +13 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/query/route.js +98 -34
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/swarm-condition/route.js +106 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceActivationPanel.jsx +17 -0
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceContributionGraph.jsx +119 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceHelperSetupModal.jsx +357 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceLensPanel.jsx +488 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceLensWalkthrough.jsx +69 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +105 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/HelperSidecar.jsx +37 -2
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +382 -32
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apps/codex-sites-data-model-card.jsx +81 -0
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apps/page.jsx +31 -14
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apps/settings-accordion-section.jsx +50 -0
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +192 -7
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-lens/page.jsx +76 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +140 -4
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/codex-sites-local-state.js +139 -0
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/codex-sites-workspace-adapter.js +156 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +1025 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +2 -3
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper-apply.js +24 -8
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +5 -0
  24. package/dist/index.js +5224 -5225
  25. package/package.json +1 -1
@@ -445,46 +445,53 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
445
445
  .workspace-rail.is-collapsed {
446
446
  padding: 18px 10px;
447
447
  align-items: center;
448
- gap: 10px;
448
+ gap: 8px;
449
449
  }
450
+ /* Collapsed rail = a single clean icon column. Every primary action stays
451
+ tracked as an icon (toggle, home, search, chat, builder, lens, management,
452
+ settings); only labels, folders, chat list, brand, helper pill, activation
453
+ panel, and the duplicate top-bar gear are hidden. Native title attributes
454
+ provide the hover tooltip of each item's name. */
450
455
  .workspace-rail.is-collapsed .workspace-rail-brand-button,
451
456
  .workspace-rail.is-collapsed .workspace-rail-folders,
452
- .workspace-rail.is-collapsed .workspace-nav,
453
457
  .workspace-rail.is-collapsed .workspace-rail-chat,
454
458
  .workspace-rail.is-collapsed .workspace-rail-status,
455
- .workspace-rail.is-collapsed .workspace-rail-helper-pill {
459
+ .workspace-rail.is-collapsed .workspace-rail-helper-pill,
460
+ .workspace-rail.is-collapsed .workspace-rail-activation-slot,
461
+ .workspace-rail.is-collapsed .workspace-rail-icon-btn[aria-label="Workspace settings"],
462
+ .workspace-rail.is-collapsed .workspace-nav-label {
456
463
  display: none;
457
464
  }
458
- .workspace-rail.is-collapsed .workspace-rail-topbar {
459
- justify-content: center;
460
- width: 100%;
461
- display: contents;
462
- }
463
- .workspace-rail.is-collapsed .workspace-rail-topbar-actions {
465
+ .workspace-rail.is-collapsed .workspace-rail-topbar,
466
+ .workspace-rail.is-collapsed .workspace-rail-topbar-actions,
467
+ .workspace-rail.is-collapsed .workspace-rail-tabbar,
468
+ .workspace-rail.is-collapsed .workspace-rail-tabs {
464
469
  display: contents;
465
470
  }
466
- .workspace-rail.is-collapsed .workspace-rail-icon-btn[aria-pressed="true"] {
467
- order: 1;
468
- }
469
- .workspace-rail.is-collapsed .workspace-rail-icon-btn[data-rail-search] {
470
- order: 3;
471
- }
472
- .workspace-rail.is-collapsed .workspace-rail-icon-btn[aria-label="Workspace settings"] {
473
- order: 4;
474
- }
471
+ /* Vertical order: toggle · home · search · chat · [nav: builder, lens,
472
+ management, settings]. */
473
+ .workspace-rail.is-collapsed .workspace-rail-icon-btn[aria-pressed="true"] { order: 1; }
474
+ .workspace-rail.is-collapsed .workspace-rail-tab[aria-label="Home"] { order: 2; }
475
+ .workspace-rail.is-collapsed .workspace-rail-icon-btn[data-rail-search] { order: 3; }
476
+ .workspace-rail.is-collapsed .workspace-rail-tab[aria-label="Helper conversations"] { order: 4; }
477
+ .workspace-rail.is-collapsed .workspace-nav { order: 5; }
475
478
  .workspace-rail.is-collapsed .workspace-rail-icon-btn[aria-pressed="true"] svg {
476
479
  transform: rotate(180deg);
477
480
  }
478
- .workspace-rail.is-collapsed .workspace-rail-tabbar {
481
+ .workspace-rail.is-collapsed .workspace-nav {
479
482
  display: flex;
480
- justify-content: center;
481
- width: 100%;
482
- order: 2;
483
- }
484
- .workspace-rail.is-collapsed .workspace-rail-tabs {
485
483
  flex-direction: column;
484
+ align-items: center;
486
485
  gap: 8px;
486
+ width: 100%;
487
+ }
488
+ .workspace-rail.is-collapsed .workspace-nav a,
489
+ .workspace-rail.is-collapsed .workspace-nav .workspace-nav-button {
490
+ justify-content: center;
491
+ gap: 0;
487
492
  padding: 0;
493
+ width: 34px;
494
+ height: 34px;
488
495
  }
489
496
  .workspace-rail.is-collapsed .workspace-rail-tab,
490
497
  .workspace-rail.is-collapsed .workspace-rail-icon-btn {
@@ -525,12 +532,31 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
525
532
  margin-top: 2px;
526
533
  }
527
534
  .workspace-nav a,
528
- .workspace-nav-static {
535
+ .workspace-nav-static,
536
+ .workspace-nav .workspace-nav-button {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 10px;
529
540
  border-radius: 6px;
530
541
  color: #686868;
531
542
  font-size: 13px;
532
543
  padding: 8px 9px;
533
544
  text-decoration: none;
545
+ width: 100%;
546
+ }
547
+ .workspace-nav a > svg,
548
+ .workspace-nav .workspace-nav-button > svg {
549
+ flex-shrink: 0;
550
+ color: #9a9a9a;
551
+ }
552
+ .workspace-nav a.active > svg,
553
+ .workspace-nav .workspace-nav-button.active > svg {
554
+ color: #2c2c2c;
555
+ }
556
+ .workspace-nav-label {
557
+ white-space: nowrap;
558
+ overflow: hidden;
559
+ text-overflow: ellipsis;
534
560
  }
535
561
  .workspace-nav-static {
536
562
  cursor: default;
@@ -831,7 +857,8 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
831
857
  .workspace-dashboard-title {
832
858
  min-width: 0;
833
859
  }
834
- .workspace-dashboard-title button {
860
+ .workspace-dashboard-title button,
861
+ .workspace-dashboard-title a {
835
862
  min-width: 0;
836
863
  display: inline-flex;
837
864
  align-items: center;
@@ -844,6 +871,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
844
871
  overflow: hidden;
845
872
  padding: 0;
846
873
  text-align: left;
874
+ text-decoration: none;
847
875
  text-overflow: ellipsis;
848
876
  white-space: nowrap;
849
877
  }
@@ -927,17 +955,24 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
927
955
  background: #ffffff;
928
956
  box-shadow: 0 12px 30px rgba(15, 23, 42, .16);
929
957
  }
930
- .workspace-row-action-menu button {
958
+ .workspace-row-action-menu button,
959
+ .workspace-row-action-menu a {
931
960
  width: 100%;
932
961
  min-height: 30px;
962
+ display: inline-flex;
963
+ align-items: center;
933
964
  justify-content: flex-start;
934
965
  border: 0;
935
966
  border-radius: 6px;
936
967
  background: transparent;
937
968
  color: #344054;
969
+ font: inherit;
970
+ font-size: 12px;
938
971
  padding: 0 9px;
972
+ text-decoration: none;
939
973
  }
940
- .workspace-row-action-menu button:hover {
974
+ .workspace-row-action-menu button:hover,
975
+ .workspace-row-action-menu a:hover {
941
976
  background: #f5f5f5;
942
977
  border-color: transparent;
943
978
  }
@@ -3053,6 +3088,55 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
3053
3088
  border-top: 1px solid #eeeeec;
3054
3089
  padding: 20px 0;
3055
3090
  }
3091
+ .workspace-settings-accordion {
3092
+ gap: 12px;
3093
+ }
3094
+ .workspace-settings-accordion-trigger {
3095
+ width: 100%;
3096
+ min-height: 34px;
3097
+ display: flex;
3098
+ align-items: center;
3099
+ justify-content: space-between;
3100
+ gap: 14px;
3101
+ border: 0;
3102
+ background: transparent;
3103
+ color: inherit;
3104
+ cursor: pointer;
3105
+ font: inherit;
3106
+ padding: 0;
3107
+ text-align: left;
3108
+ }
3109
+ .workspace-settings-accordion-trigger > span {
3110
+ min-width: 0;
3111
+ display: grid;
3112
+ gap: 3px;
3113
+ }
3114
+ .workspace-settings-accordion-trigger h3 {
3115
+ margin: 0;
3116
+ }
3117
+ .workspace-settings-accordion-trigger em {
3118
+ min-width: 0;
3119
+ display: block;
3120
+ color: #888;
3121
+ font-size: 12px;
3122
+ font-style: normal;
3123
+ overflow: hidden;
3124
+ text-overflow: ellipsis;
3125
+ white-space: nowrap;
3126
+ }
3127
+ .workspace-settings-accordion-trigger svg {
3128
+ flex: 0 0 auto;
3129
+ color: #777;
3130
+ transition: transform .16s ease;
3131
+ }
3132
+ .workspace-settings-accordion.is-open .workspace-settings-accordion-trigger svg {
3133
+ transform: rotate(180deg);
3134
+ }
3135
+ .workspace-settings-accordion-body {
3136
+ min-height: 0;
3137
+ display: grid;
3138
+ gap: 12px;
3139
+ }
3056
3140
  .workspace-apps-linkage-section {
3057
3141
  flex: 0 0 auto;
3058
3142
  padding-bottom: 16px;
@@ -3063,6 +3147,9 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
3063
3147
  grid-template-rows: auto minmax(0, 1fr);
3064
3148
  padding-bottom: 0;
3065
3149
  }
3150
+ .workspace-apps-list-section .workspace-settings-accordion-body {
3151
+ min-height: 0;
3152
+ }
3066
3153
  .workspace-settings-section:first-of-type {
3067
3154
  border-top: 0;
3068
3155
  padding-top: 0;
@@ -3551,6 +3638,52 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
3551
3638
  font-size: 12px;
3552
3639
  line-height: 1.4;
3553
3640
  }
3641
+ .workspace-settings-action {
3642
+ min-height: 32px;
3643
+ display: inline-flex;
3644
+ align-items: center;
3645
+ gap: 6px;
3646
+ border: 1px solid #dedede;
3647
+ border-radius: 6px;
3648
+ background: #fff;
3649
+ color: #333;
3650
+ font: inherit;
3651
+ font-size: 12px;
3652
+ padding: 0 10px;
3653
+ }
3654
+ .workspace-settings-codex-sites-list {
3655
+ display: grid;
3656
+ gap: 6px;
3657
+ padding: 0 14px 0;
3658
+ }
3659
+ .workspace-settings-codex-sites-list a,
3660
+ .workspace-settings-codex-sites-list button {
3661
+ min-height: 34px;
3662
+ display: grid;
3663
+ grid-template-columns: minmax(0, 1fr) minmax(0, .8fr) auto;
3664
+ gap: 10px;
3665
+ align-items: center;
3666
+ border: 1px solid #ececea;
3667
+ border-radius: 6px;
3668
+ background: #fff;
3669
+ color: #333;
3670
+ font: inherit;
3671
+ font-size: 12px;
3672
+ text-align: left;
3673
+ text-decoration: none;
3674
+ padding: 0 10px;
3675
+ }
3676
+ .workspace-settings-codex-sites-list span,
3677
+ .workspace-settings-codex-sites-list em {
3678
+ min-width: 0;
3679
+ overflow: hidden;
3680
+ text-overflow: ellipsis;
3681
+ white-space: nowrap;
3682
+ }
3683
+ .workspace-settings-codex-sites-list em {
3684
+ color: #777;
3685
+ font-style: normal;
3686
+ }
3554
3687
 
3555
3688
  /* Source picker */
3556
3689
  .workspace-source-list {
@@ -4613,7 +4746,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
4613
4746
  .dm-detail-v2-title h2 { margin: 0; font-size: 15px; font-weight: 600; color: #111827; flex: 1; }
4614
4747
  .dm-detail-v2-meta { display: flex; align-items: center; gap: 10px; padding-left: 21px; font-size: 12px; color: #9ca3af; }
4615
4748
  .dm-detail-v2-meta code { font-size: 11px; color: #6b7280; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; }
4616
- .dm-detail-v3 { border: 1px solid #e5e7eb; border-radius: 12px; background: #fff; overflow: hidden; }
4749
+ .dm-detail-v3 { border: 1px solid #e5e7eb; border-radius: 12px; background: #fff; overflow: visible; }
4617
4750
  .dm-picker { position: relative; min-width: 280px; }
4618
4751
  .dm-picker-trigger { width: min(420px, 100%); display: inline-flex; align-items: center; gap: 10px; min-height: 40px; border: 1px solid #dbe2ea; border-radius: 10px; background: #fff; color: #0f172a; box-shadow: 0 1px 2px rgba(15,23,42,.05); font: inherit; padding: 0 12px; cursor: pointer; text-align: left; }
4619
4752
  .dm-picker.open .dm-picker-trigger { border-color: #94a3b8; box-shadow: 0 0 0 4px rgba(148,163,184,.14); }
@@ -4654,6 +4787,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
4654
4787
  .workspace-toolbar-actions .dm-picker-popover {
4655
4788
  left: auto;
4656
4789
  right: 0;
4790
+ z-index: 220;
4657
4791
  }
4658
4792
 
4659
4793
  /* Active-object title block in the workspace toolbar — replaces the
@@ -4703,13 +4837,13 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
4703
4837
  font-weight: 400;
4704
4838
  color: #6b7280;
4705
4839
  }
4706
- .dm-picker-popover { position: absolute; top: calc(100% + 8px); left: 0; z-index: 50; width: 360px; display: grid; gap: 10px; padding: 12px; border: 1px solid #dbe2ea; border-radius: 14px; background: #fff; box-shadow: 0 28px 80px rgba(15,23,42,.24); overflow: visible; }
4840
+ .dm-picker-popover { position: absolute; top: calc(100% + 8px); left: 0; z-index: 220; width: min(360px, calc(100vw - 32px)); max-height: min(520px, calc(100vh - 120px)); display: grid; gap: 10px; padding: 12px; border: 1px solid #dbe2ea; border-radius: 14px; background: #fff; box-shadow: 0 28px 80px rgba(15,23,42,.24); overflow-y: auto; overflow-x: visible; }
4707
4841
  .dm-picker-tabs { display: inline-flex; gap: 6px; padding: 4px; border-radius: 999px; background: #f8fafc; }
4708
4842
  .dm-picker-tabs button { height: 28px; border: 0; border-radius: 999px; background: transparent; color: #64748b; font: inherit; font-size: 12px; padding: 0 10px; cursor: pointer; }
4709
4843
  .dm-picker-tabs button.active { background: #fff; color: #111827; box-shadow: 0 1px 2px rgba(15,23,42,.08); }
4710
4844
  .dm-picker-section { display: grid; gap: 8px; }
4711
4845
  .dm-picker-section > p { margin: 0; font-size: 11px; font-weight: 700; color: #94a3b8; text-transform: uppercase; letter-spacing: .06em; }
4712
- .dm-picker-scroll { display: grid; gap: 4px; max-height: 220px; overflow-y: auto; padding-right: 10px; scrollbar-gutter: stable; }
4846
+ .dm-picker-scroll { display: grid; gap: 4px; max-height: none; overflow: visible; padding-right: 10px; scrollbar-gutter: stable; }
4713
4847
  .dm-picker-item { position: relative; display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 8px; align-items: center; }
4714
4848
  .dm-picker-row { width: 100%; display: inline-flex; align-items: center; gap: 8px; min-width: 0; min-height: 34px; border: 0; border-radius: 9px; background: transparent; color: #334155; font: inherit; font-size: 12px; font-weight: 500; padding: 0 10px; cursor: pointer; text-align: left; }
4715
4849
  .dm-picker-row:hover, .dm-picker-item.active .dm-picker-row { background: #f1f5f9; color: #111827; }
@@ -4720,7 +4854,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
4720
4854
  .dm-picker-icon-btn:hover { color: #111827; border-color: #cbd5e1; }
4721
4855
  .dm-picker-icon-btn.danger:hover { color: #b91c1c; border-color: #fecaca; background: #fef2f2; }
4722
4856
  .dm-picker-lock { margin-left: auto; color: #94a3b8; }
4723
- .dm-picker-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 55; display: grid; gap: 4px; min-width: 156px; padding: 8px; border: 1px solid #dbe2ea; border-radius: 10px; background: #fff; box-shadow: 0 20px 44px rgba(15,23,42,.2), 0 4px 12px rgba(15,23,42,.08); }
4857
+ .dm-picker-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 240; display: grid; gap: 4px; min-width: 156px; padding: 8px; border: 1px solid #dbe2ea; border-radius: 10px; background: #fff; box-shadow: 0 20px 44px rgba(15,23,42,.2), 0 4px 12px rgba(15,23,42,.08); }
4724
4858
  .dm-picker-menu button { display: inline-flex; align-items: center; gap: 8px; height: 30px; border: 0; border-radius: 7px; background: transparent; color: #334155; font: inherit; font-size: 12px; padding: 0 10px; cursor: pointer; text-align: left; }
4725
4859
  .dm-picker-menu button:hover { background: #f1f5f9; color: #111827; }
4726
4860
  .dm-picker-menu button.danger:hover { background: #fef2f2; color: #b91c1c; }
@@ -8656,6 +8790,222 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
8656
8790
  .workspace-activation-helper-btn { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: 1px dashed #c7d2fe; color: #4338ca; font-size: 12px; padding: 6px 10px; border-radius: 6px; cursor: pointer; }
8657
8791
  .workspace-activation-helper-btn:hover { background: #eef2ff; }
8658
8792
 
8793
+ /* Activation → Workspace Lens handoff teaser (shown once setup completes). */
8794
+ .workspace-activation-lens-teaser { margin-top: 14px; border-top: 1px solid #eef0f2; padding-top: 12px; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
8795
+ .workspace-activation-lens-teaser-text { font-size: 12px; color: #4b5563; line-height: 1.45; }
8796
+ .workspace-activation-lens-teaser-link { font-size: 12px; font-weight: 600; color: #374151; text-decoration: none; white-space: nowrap; }
8797
+ .workspace-activation-lens-teaser-link:hover { text-decoration: underline; }
8798
+
8799
+ /* Locked rail nav affordance (Workspace Lens before setup completes). */
8800
+ .workspace-nav-button.is-locked { opacity: 0.45; cursor: default; }
8801
+
8802
+ /* ── Workspace Lens — post-activation operating surface ─────────────────────
8803
+ Neutral, calm, aggregate-first. No semantic color overload, no icon spam. */
8804
+ body.workspace-rail-collapsed .workspace-builder.workspace-lens-page,
8805
+ .workspace-builder.workspace-lens-page { grid-template-columns: var(--workspace-rail-width) minmax(0, 1fr); height: 100vh; overflow: hidden; }
8806
+ .workspace-lens-surface { width: 100%; padding: 0; background: #f7f7f8; overflow-y: auto; overflow-x: hidden; }
8807
+ .workspace-lens-shell { width: 100%; max-width: none; margin: 0; padding: 24px 28px 32px; }
8808
+ .workspace-lens-locked { border: 1px solid #e5e7eb; border-radius: 10px; background: #fff; padding: 28px; max-width: 560px; margin: 48px auto; display: flex; flex-direction: column; gap: 8px; }
8809
+ .workspace-lens-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
8810
+ .workspace-lens-title { font-size: 18px; font-weight: 600; color: #111827; margin: 0; }
8811
+ .workspace-lens-subtitle { font-size: 13px; color: #6b7280; margin: 4px 0 0; }
8812
+ .workspace-lens-score { font-size: 12px; color: #4b5563; font-variant-numeric: tabular-nums; margin: 2px 0 0; }
8813
+ .workspace-lens-controls.workspace-builder-filterbar { margin: 0 0 14px; border: 1px solid #e8edf3; border-radius: 8px; background: #fff; }
8814
+ .workspace-lens-filters.workspace-builder-filterbar__segments { max-width: 100%; overflow-x: auto; }
8815
+ .workspace-lens-filter { white-space: nowrap; }
8816
+ .workspace-lens-filter.is-active { background: #fff; color: #111827; box-shadow: 0 1px 2px rgba(15, 23, 42, .08); }
8817
+ .workspace-lens-search-wrap { flex-shrink: 0; }
8818
+ .workspace-lens-search { width: 100%; min-width: 0; border: 0; outline: 0; background: transparent; color: #111827; font: inherit; font-size: 12px; padding: 0; }
8819
+ .workspace-lens-control-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin: 0 0 22px; }
8820
+ .workspace-lens-control-card { border: 1px solid #e5e7eb; border-radius: 8px; background: #ffffff; min-height: 184px; padding: 14px; box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); display: flex; flex-direction: column; gap: 12px; }
8821
+ .workspace-lens-control-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
8822
+ .workspace-lens-control-card-head h2 { margin: 0; color: #111827; font-size: 13px; font-weight: 600; line-height: 1.3; }
8823
+ .workspace-lens-control-card-head span { color: #6b7280; font-size: 12px; }
8824
+ .workspace-lens-icon-btn { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid transparent; border-radius: 6px; background: transparent; color: #6b7280; cursor: pointer; }
8825
+ .workspace-lens-icon-btn:hover { border-color: #e5e7eb; background: #f9fafb; color: #111827; }
8826
+ .workspace-lens-checklist { display: flex; flex-direction: column; gap: 6px; }
8827
+ .workspace-lens-check-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 32px; border-radius: 6px; background: #f3f4f6; color: #374151; padding: 0 10px; text-decoration: none; font-size: 12px; }
8828
+ .workspace-lens-check-item:hover { background: #e5e7eb; }
8829
+ .workspace-lens-check-item.is-complete { background: #dcfce7; color: #15803d; text-decoration: line-through; box-shadow: inset 3px 0 0 #22c55e; }
8830
+ .workspace-lens-check-item.is-complete svg { color: #16a34a; }
8831
+ .workspace-lens-stat-list { display: flex; flex-direction: column; gap: 0; margin-top: 14px; }
8832
+ .workspace-lens-stat-row { display: grid; grid-template-columns: minmax(0, 1fr) 64px; align-items: center; gap: 12px; min-height: 31px; border-bottom: 1px solid #eef0f2; color: #6b7280; font-size: 12px; }
8833
+ .workspace-lens-stat-row:last-child { border-bottom: 0; }
8834
+ .workspace-lens-stat-row strong { color: #111827; font-size: 13px; font-weight: 500; text-align: left; font-variant-numeric: tabular-nums; }
8835
+ .workspace-lens-helper-card-body { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; text-align: center; color: #4b5563; }
8836
+ .workspace-lens-helper-card-body svg { color: #111827; }
8837
+ .workspace-lens-helper-card-body strong { color: #111827; font-size: 13px; }
8838
+ .workspace-lens-helper-card-body p { margin: 0; color: #6b7280; font-size: 12px; line-height: 1.45; max-width: 260px; }
8839
+ .workspace-lens-helper-card-body button { margin-top: 4px; border: 1px solid #d1d5db; border-radius: 6px; background: #fff; color: #111827; font-size: 12px; font-weight: 500; padding: 7px 12px; cursor: pointer; }
8840
+ .workspace-lens-helper-card-body button:hover { background: #f9fafb; }
8841
+ .workspace-lens-branches { margin: 24px 0 32px; }
8842
+ .workspace-lens-branches-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 12px; }
8843
+ .workspace-lens-branches-head h2 { margin: 0; color: #111827; font-size: 18px; font-weight: 600; }
8844
+ .workspace-lens-branches-head span { display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; background: #e5e7eb; color: #374151; padding: 2px 8px; font-size: 11px; font-weight: 600; }
8845
+ .workspace-lens-branches-table { border: 1px solid #e5e7eb; border-radius: 8px; background: #ffffff; overflow: visible; box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); }
8846
+ .workspace-lens-branch-row { position: relative; display: grid; grid-template-columns: minmax(240px, 1fr) auto; align-items: center; gap: 16px; min-height: 46px; border-bottom: 1px solid #eef0f2; padding: 0 16px; }
8847
+ .workspace-lens-branch-row:last-child { border-bottom: 0; }
8848
+ .workspace-lens-branch-name { display: inline-flex; align-items: center; gap: 8px; min-width: 0; color: #111827; font-size: 13px; font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace); }
8849
+ .workspace-lens-branch-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8850
+ .workspace-lens-branch-name svg { color: #4b5563; flex-shrink: 0; }
8851
+ .workspace-lens-branch-actions { position: relative; display: inline-flex; align-items: center; justify-content: flex-end; gap: 8px; min-width: 0; }
8852
+ .workspace-lens-preview-pill,
8853
+ .workspace-lens-progress-pill,
8854
+ .workspace-lens-owner-pill { display: inline-flex; align-items: center; gap: 5px; min-height: 24px; border: 1px solid #e5e7eb; border-radius: 999px; background: #ffffff; color: #4b5563; padding: 0 9px; text-decoration: none; font-size: 11px; white-space: nowrap; }
8855
+ .workspace-lens-preview-pill:hover { background: #f9fafb; color: #111827; }
8856
+ .workspace-lens-owner-pill { border-color: transparent; color: #4b5563; }
8857
+ .workspace-lens-branch-summary,
8858
+ .workspace-lens-branch-next { display: none; grid-column: 1 / -1; margin: -6px 0 10px 22px; color: #6b7280; font-size: 12px; line-height: 1.4; }
8859
+ .workspace-lens-branch-next { margin-top: -8px; color: #374151; font-weight: 500; }
8860
+ .workspace-lens-action-menu { position: absolute; z-index: 80; top: 34px; right: 0; width: 190px; border: 1px solid #e5e7eb; border-radius: 8px; background: #ffffff; box-shadow: 0 12px 28px rgba(15, 23, 42, 0.16); padding: 6px; display: flex; flex-direction: column; gap: 2px; }
8861
+ .workspace-lens-action-menu button,
8862
+ .workspace-lens-action-menu a { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; border: 0; border-radius: 6px; background: transparent; color: #111827; padding: 9px 8px; text-align: left; text-decoration: none; font-size: 12px; cursor: pointer; }
8863
+ .workspace-lens-action-menu button:hover,
8864
+ .workspace-lens-action-menu a:hover { background: #f3f4f6; }
8865
+ @media (max-width: 1100px) {
8866
+ .workspace-lens-control-grid { grid-template-columns: 1fr; }
8867
+ .workspace-lens-branch-row { grid-template-columns: 1fr; align-items: flex-start; padding: 10px 12px; gap: 8px; }
8868
+ .workspace-lens-branch-actions { justify-content: flex-start; flex-wrap: wrap; }
8869
+ .workspace-lens-branch-summary,
8870
+ .workspace-lens-branch-next { margin-left: 22px; }
8871
+ }
8872
+ .workspace-lens-stream { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
8873
+ .workspace-lens-card { border: 1px solid #e8edf3; border-radius: 10px; background: #fff; padding: 12px 14px; }
8874
+ .workspace-lens-card.is-ready { opacity: 0.7; }
8875
+ .workspace-lens-card-head { display: flex; align-items: center; gap: 10px; width: 100%; background: none; border: none; padding: 0; cursor: pointer; text-align: left; }
8876
+ .workspace-lens-card-title { font-size: 13px; font-weight: 600; color: #111827; flex: 1; }
8877
+ .workspace-lens-chip { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: #6b7280; border: 1px solid #e5e7eb; border-radius: 999px; padding: 1px 8px; }
8878
+ .workspace-lens-chip.is-blocked { color: #374151; border-color: #d1d5db; background: #f3f4f6; }
8879
+ .workspace-lens-card-progress { font-size: 11px; color: #6b7280; font-variant-numeric: tabular-nums; }
8880
+ .workspace-lens-caret { color: #9ca3af; transition: transform 120ms ease; }
8881
+ .workspace-lens-caret.is-open { transform: rotate(180deg); }
8882
+ .workspace-lens-card-headline { font-size: 12px; color: #4b5563; line-height: 1.45; margin: 8px 0 0; }
8883
+ .workspace-lens-card-next { display: flex; align-items: baseline; gap: 6px; margin-top: 8px; font-size: 12px; }
8884
+ .workspace-lens-next-label { color: #9ca3af; }
8885
+ .workspace-lens-next-link { color: #374151; font-weight: 600; text-decoration: none; }
8886
+ .workspace-lens-next-link:hover { text-decoration: underline; }
8887
+ .workspace-lens-card-detail { margin-top: 12px; border-top: 1px solid #f1f5f9; padding-top: 10px; display: flex; flex-direction: column; gap: 10px; }
8888
+ .workspace-lens-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
8889
+ .workspace-lens-step { display: flex; align-items: baseline; gap: 8px; font-size: 12px; color: #4b5563; }
8890
+ .workspace-lens-step-label { flex: 1; }
8891
+ .workspace-lens-step-status { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: #9ca3af; }
8892
+ .workspace-lens-step.is-blocked .workspace-lens-step-status { color: #6b7280; font-weight: 600; }
8893
+ .workspace-lens-step-hint { flex-basis: 100%; font-size: 11px; color: #9ca3af; }
8894
+ .workspace-lens-blocked { font-size: 12px; color: #374151; margin: 0; }
8895
+ .workspace-lens-agent { border: 1px solid #f1f5f9; border-radius: 8px; background: #fafbfc; padding: 10px; }
8896
+ .workspace-lens-agent-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: #6b7280; margin: 0 0 6px; }
8897
+ .workspace-lens-agent-row { display: flex; gap: 8px; font-size: 12px; color: #4b5563; margin: 2px 0; }
8898
+ .workspace-lens-agent-row > span { color: #9ca3af; min-width: 84px; }
8899
+ .workspace-lens-empty { font-size: 12px; color: #9ca3af; padding: 16px; text-align: center; }
8900
+
8901
+ /* Workspace contribution graph — neutral chrome, GitHub green cell scale. */
8902
+ .workspace-contrib { border: 1px solid #e8edf3; border-radius: 10px; background: #fff; padding: 14px 16px; margin-bottom: 16px; }
8903
+ .workspace-contrib-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 10px; flex-wrap: wrap; }
8904
+ .workspace-contrib-total { font-size: 12px; color: #4b5563; }
8905
+ .workspace-contrib-legend { display: inline-flex; align-items: center; gap: 3px; font-size: 11px; color: #9ca3af; }
8906
+ .workspace-contrib-grid-wrap { width: 100%; overflow: visible; }
8907
+ .workspace-contrib-months { display: grid; grid-template-columns: repeat(53, minmax(0, 1fr)); gap: 3px; margin-left: 38px; margin-bottom: 4px; }
8908
+ .workspace-contrib-month { font-size: 9px; color: #9ca3af; white-space: nowrap; }
8909
+ .workspace-contrib-body { display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 8px; align-items: stretch; }
8910
+ .workspace-contrib-weekdays { display: grid; grid-template-rows: repeat(7, minmax(0, 1fr)); gap: 3px; width: 30px; }
8911
+ .workspace-contrib-weekdays span { font-size: 9px; color: #9ca3af; line-height: 1; display: flex; align-items: center; }
8912
+ .workspace-contrib-weeks { display: grid; grid-template-columns: repeat(53, minmax(0, 1fr)); gap: 3px; min-width: 0; }
8913
+ .workspace-contrib-week { display: grid; grid-template-rows: repeat(7, minmax(0, 1fr)); gap: 3px; min-width: 0; }
8914
+ .workspace-contrib-cell { width: 100%; aspect-ratio: 1; min-height: 10px; max-height: 18px; border-radius: 3px; padding: 0; border: 1px solid rgba(27, 31, 35, 0.06); background: #ebedf0; cursor: pointer; }
8915
+ .workspace-contrib-cell:disabled { cursor: default; }
8916
+ .workspace-contrib-cell.lvl-0 { background: #ebedf0; }
8917
+ .workspace-contrib-cell.lvl-1 { background: #9be9a8; }
8918
+ .workspace-contrib-cell.lvl-2 { background: #40c463; }
8919
+ .workspace-contrib-cell.lvl-3 { background: #30a14e; }
8920
+ .workspace-contrib-cell.lvl-4 { background: #216e39; }
8921
+ .workspace-contrib-cell.has-count { border-color: rgba(27, 31, 35, 0.18); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.18), 0 0 0 1px rgba(34,197,94,0.18); }
8922
+ .workspace-contrib-cell.has-count:hover { outline: 2px solid rgba(17, 24, 39, 0.75); outline-offset: 1px; }
8923
+ .workspace-contrib-cell.lvl-future { background: transparent; border-color: transparent; }
8924
+ .workspace-contrib-legend .workspace-contrib-cell { cursor: default; }
8925
+ .workspace-contrib-tooltip { position: fixed; transform: translate(-50%, calc(-100% - 8px)); z-index: 50; background: #111827; color: #fff; border-radius: 6px; padding: 6px 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.18); display: flex; flex-direction: column; gap: 2px; pointer-events: auto; }
8926
+ .workspace-contrib-tooltip-count { font-size: 11px; font-weight: 600; }
8927
+ .workspace-contrib-tooltip-date { font-size: 10px; color: #cbd5e1; }
8928
+ .workspace-contrib-tooltip-link { font-size: 10px; color: #9be9a8; text-decoration: none; margin-top: 2px; }
8929
+ .workspace-contrib-tooltip-link:hover { text-decoration: underline; }
8930
+
8931
+ /* Workspace Lens one-time walkthrough — calm white popover. */
8932
+ .workspace-rail-lens-nav { position: relative; }
8933
+ .workspace-lens-walkthrough { position: relative; width: 264px; background: #ffffff; border: 1px solid #d1d5db; border-radius: 5px; box-shadow: 0 6px 18px rgba(17, 24, 39, 0.12); padding: 12px 13px; }
8934
+ .workspace-lens-walkthrough.is-anchored,
8935
+ .workspace-lens-walkthrough.is-rail-reveal { position: fixed; z-index: 1200; }
8936
+ .workspace-lens-walkthrough.is-anchored::before,
8937
+ .workspace-lens-walkthrough.is-rail-reveal::before { content: ""; position: absolute; left: -6px; top: 16px; width: 10px; height: 10px; background: #ffffff; border-left: 1px solid #d1d5db; border-bottom: 1px solid #d1d5db; transform: rotate(45deg); }
8938
+ @media (max-width: 760px) {
8939
+ .workspace-lens-walkthrough.is-anchored,
8940
+ .workspace-lens-walkthrough.is-rail-reveal { right: 16px; width: auto; }
8941
+ .workspace-lens-walkthrough.is-anchored::before,
8942
+ .workspace-lens-walkthrough.is-rail-reveal::before { display: none; }
8943
+ }
8944
+ .workspace-lens-walkthrough.is-panel { width: 100%; max-width: 520px; margin: 0 0 16px; }
8945
+ .workspace-lens-walkthrough-x { position: absolute; top: 8px; right: 8px; display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border: none; background: transparent; color: #9ca3af; border-radius: 5px; cursor: pointer; }
8946
+ .workspace-lens-walkthrough-x:hover { background: #f3f4f6; color: #4b5563; }
8947
+ .workspace-lens-walkthrough-eyebrow { margin: 0 0 4px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: #9ca3af; }
8948
+ .workspace-lens-walkthrough-title { margin: 0 0 5px; font-size: 13px; font-weight: 600; color: #111827; padding-right: 18px; }
8949
+ .workspace-lens-walkthrough-body { margin: 0 0 12px; font-size: 12px; line-height: 1.5; color: #4b5563; }
8950
+ .workspace-lens-walkthrough-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
8951
+ .workspace-lens-walkthrough-steps { font-size: 11px; color: #9ca3af; font-variant-numeric: tabular-nums; }
8952
+ .workspace-lens-walkthrough-next { font-size: 12px; font-weight: 600; color: #ffffff; background: #111827; border: none; border-radius: 6px; padding: 6px 12px; cursor: pointer; }
8953
+ .workspace-lens-walkthrough-next:hover { background: #1f2937; }
8954
+
8955
+ /* Helper handoff — one callout, one helper widget, one sandbox config. */
8956
+ .workspace-lens-helper-callout { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; border: 1px solid #e5e7eb; border-radius: 8px; background: #fafbfc; padding: 12px 14px; margin: 0 0 16px; }
8957
+ .workspace-lens-helper-callout-text { min-width: 0; }
8958
+ .workspace-lens-helper-callout-title { margin: 0 0 3px; font-size: 13px; font-weight: 600; color: #111827; }
8959
+ .workspace-lens-helper-callout-body { margin: 0; font-size: 12px; line-height: 1.5; color: #6b7280; max-width: 560px; }
8960
+ .workspace-lens-helper-callout-btn { flex-shrink: 0; font-size: 12px; font-weight: 600; color: #111827; background: #ffffff; border: 1px solid #d1d5db; border-radius: 6px; padding: 7px 12px; cursor: pointer; }
8961
+ .workspace-lens-helper-callout-btn:hover:not(:disabled) { background: #f3f4f6; }
8962
+ .workspace-lens-helper-callout-btn:disabled { opacity: 0.6; cursor: default; }
8963
+ .workspace-helper-setup-modal-backdrop { position: fixed; inset: 0; z-index: 1400; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(17, 24, 39, 0.42); backdrop-filter: blur(3px); }
8964
+ .workspace-helper-setup-modal { position: relative; width: min(620px, 100%); max-height: min(720px, calc(100vh - 48px)); overflow: auto; background: #ffffff; border: 1px solid #d1d5db; border-radius: 8px; box-shadow: 0 24px 70px rgba(17, 24, 39, 0.28); padding: 18px; }
8965
+ .workspace-helper-setup-modal-close { position: absolute; top: 12px; right: 12px; width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid #e5e7eb; border-radius: 6px; background: #fff; color: #6b7280; cursor: pointer; }
8966
+ .workspace-helper-setup-modal-close:hover { background: #f9fafb; color: #111827; }
8967
+ .workspace-helper-setup-breadcrumbs { display: flex; gap: 8px; flex-wrap: wrap; padding-right: 36px; margin-bottom: 16px; font-size: 12px; color: #9ca3af; }
8968
+ .workspace-helper-setup-breadcrumbs span { border: 1px solid #e5e7eb; border-radius: 999px; padding: 4px 9px; background: #f9fafb; }
8969
+ .workspace-helper-setup-breadcrumbs span.active { color: #111827; border-color: #111827; background: #fff; font-weight: 600; }
8970
+ .workspace-helper-setup-step { display: flex; flex-direction: column; gap: 12px; }
8971
+ .workspace-helper-setup-step h2 { margin: 0; font-size: 18px; line-height: 1.25; color: #111827; }
8972
+ .workspace-helper-setup-step p { margin: 0; font-size: 13px; line-height: 1.55; color: #4b5563; }
8973
+ .workspace-helper-setup-eyebrow { font-size: 11px !important; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280 !important; }
8974
+ .workspace-helper-setup-target { border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; display: grid; gap: 4px; background: #fafafa; }
8975
+ .workspace-helper-setup-target span, .workspace-helper-setup-target small { font-size: 12px; color: #6b7280; }
8976
+ .workspace-helper-setup-target strong { font-size: 14px; color: #111827; }
8977
+ .workspace-helper-setup-card-grid { display: grid; gap: 8px; }
8978
+ .workspace-helper-setup-toggle { display: flex !important; align-items: flex-start; gap: 10px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; padding: 11px 12px; cursor: pointer; }
8979
+ .workspace-helper-setup-toggle:hover { background: #f9fafb; }
8980
+ .workspace-helper-setup-toggle input { width: 16px !important; height: 16px; margin: 2px 0 0; padding: 0 !important; accent-color: #111827; flex-shrink: 0; }
8981
+ .workspace-helper-setup-toggle span { display: grid; gap: 3px; min-width: 0; }
8982
+ .workspace-helper-setup-toggle strong { color: #111827; font-size: 13px; }
8983
+ .workspace-helper-setup-toggle small { color: #6b7280; font-size: 12px; line-height: 1.35; }
8984
+ .workspace-helper-setup-radio-group { border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; display: grid; gap: 8px; background: #fafafa; }
8985
+ .workspace-helper-setup-radio-group > span { font-size: 12px; font-weight: 700; color: #374151; }
8986
+ .workspace-helper-setup-radio-group label { display: flex !important; align-items: center; gap: 8px; font-size: 13px; color: #111827; font-weight: 600; }
8987
+ .workspace-helper-setup-radio-group input { width: 15px !important; height: 15px; margin: 0; padding: 0 !important; accent-color: #111827; }
8988
+ .workspace-helper-setup-radio-group small { color: #9ca3af; font-size: 12px; line-height: 1.4; }
8989
+ .workspace-helper-setup-field-stack { display: grid; gap: 10px; }
8990
+ .workspace-helper-agent-options { display: grid; gap: 8px; }
8991
+ .workspace-helper-agent-options button { display: grid; gap: 3px; text-align: left; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; padding: 10px 12px; cursor: pointer; }
8992
+ .workspace-helper-agent-options button:hover { background: #f9fafb; }
8993
+ .workspace-helper-agent-options button.active { border-color: #111827; box-shadow: inset 3px 0 0 #111827; }
8994
+ .workspace-helper-agent-options strong { font-size: 13px; color: #111827; }
8995
+ .workspace-helper-agent-options span { font-size: 12px; line-height: 1.4; color: #6b7280; }
8996
+ .workspace-helper-setup-two-col { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
8997
+ .workspace-helper-setup-step label { display: grid; gap: 6px; font-size: 12px; font-weight: 600; color: #374151; }
8998
+ .workspace-helper-setup-step input, .workspace-helper-setup-step select { width: 100%; border: 1px solid #d1d5db; border-radius: 7px; padding: 9px 10px; font-size: 13px; color: #111827; background: #fff; }
8999
+ .workspace-helper-setup-review { display: grid; gap: 8px; margin: 0; }
9000
+ .workspace-helper-setup-review div { display: grid; grid-template-columns: 120px 1fr; gap: 12px; border-bottom: 1px solid #f3f4f6; padding-bottom: 8px; }
9001
+ .workspace-helper-setup-review dt { font-size: 12px; color: #6b7280; }
9002
+ .workspace-helper-setup-review dd { margin: 0; min-width: 0; overflow-wrap: anywhere; font-size: 12px; color: #111827; }
9003
+ .workspace-helper-setup-error { color: #b91c1c !important; }
9004
+ .workspace-helper-setup-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
9005
+ .workspace-helper-setup-actions button { border: 1px solid #d1d5db; border-radius: 7px; background: #fff; color: #111827; padding: 8px 12px; font-size: 13px; font-weight: 600; cursor: pointer; }
9006
+ .workspace-helper-setup-actions button.primary { background: #111827; border-color: #111827; color: #fff; }
9007
+ .workspace-helper-setup-actions button:disabled { opacity: 0.55; cursor: default; }
9008
+
8659
9009
  /* Compact rail variant — slim activation chip in WorkspaceRail Home */
8660
9010
  .workspace-activation-panel.is-compact { padding: 12px 14px; margin: 0 0 12px; gap: 10px; border-radius: 8px; }
8661
9011
  .workspace-activation-panel.is-compact .workspace-activation-head { gap: 8px; }
@@ -0,0 +1,81 @@
1
+ "use client";
2
+
3
+ import { ExternalLink, Rocket } from "lucide-react";
4
+ import {
5
+ CODEX_SITES_OBJECT_ID,
6
+ ensureCodexSitesDataModel,
7
+ isCodexSiteUrl
8
+ } from "@/lib/codex-sites-workspace-adapter";
9
+ import { SettingsAccordionSection } from "./settings-accordion-section.jsx";
10
+
11
+ function CodexSitesDataModelCard({ apps, dataModel }) {
12
+ const objects = Array.isArray(dataModel?.objects) ? dataModel.objects : [];
13
+ const object = objects.find((item) => item?.id === CODEX_SITES_OBJECT_ID) || null;
14
+ const rows = Array.isArray(object?.rows) ? object.rows : [];
15
+ const liveRows = rows.filter((row) => {
16
+ const status = String(row?.status || "").toLowerCase();
17
+ return isCodexSiteUrl(row?.url) && (status === "live" || status === "active");
18
+ });
19
+ const liveCount = liveRows.length;
20
+ const appCount = new Set(rows.map((row) => row?.app).filter(Boolean)).size;
21
+
22
+ async function openDataModel() {
23
+ if (!object) {
24
+ const nextDataModel = ensureCodexSitesDataModel(dataModel, apps);
25
+ const response = await fetch("/api/workspace", {
26
+ method: "PATCH",
27
+ headers: { "content-type": "application/json" },
28
+ body: JSON.stringify({ dataModel: nextDataModel })
29
+ });
30
+ if (!response.ok) {
31
+ const payload = await response.json().catch(() => ({}));
32
+ window.alert(payload.error || "Failed to create Codex Sites object.");
33
+ return;
34
+ }
35
+ }
36
+ window.location.href = `/data-model?object=${encodeURIComponent(CODEX_SITES_OBJECT_ID)}`;
37
+ }
38
+
39
+ return <SettingsAccordionSection
40
+ id="codex-sites"
41
+ title="Codex Sites"
42
+ summary={`${rows.length} site${rows.length === 1 ? "" : "s"} · ${liveCount} live · ${appCount || apps?.length || 0} app${(appCount || apps?.length || 0) === 1 ? "" : "s"}`}
43
+ className="workspace-apps-linkage-section workspace-codex-sites-section"
44
+ >
45
+ <div className="workspace-app-row">
46
+ <span className="workspace-provider-mark"><Rocket size={15} /></span>
47
+ <div>
48
+ <strong>Codex Sites</strong>
49
+ <p>Manage Codex-hosted site URLs as a governed custom Data Model object attached to workspace apps and clients.</p>
50
+ <div className="workspace-integration-meta">
51
+ <span>{object ? "configured" : "not configured"}</span>
52
+ <span>{rows.length} site{rows.length === 1 ? "" : "s"}</span>
53
+ <span>{liveCount} live</span>
54
+ <span>{appCount || apps?.length || 0} app{(appCount || apps?.length || 0) === 1 ? "" : "s"}</span>
55
+ </div>
56
+ </div>
57
+ <button type="button" className="workspace-settings-action" onClick={openDataModel}>
58
+ <ExternalLink size={14} />{object ? "Manage" : "Set up"}
59
+ </button>
60
+ </div>
61
+ {rows.length ? <div className="workspace-settings-codex-sites-list">
62
+ {rows.slice(0, 4).map((row, index) => isCodexSiteUrl(row?.url) ? (
63
+ <a key={row.id || row.Name || index} href={row.url} target="_blank" rel="noreferrer">
64
+ <span>{row.Name || `Site ${index + 1}`}</span>
65
+ <em>{row.client || "Workspace"} · {row.app || "apps/workspace"}</em>
66
+ <ExternalLink size={13} />
67
+ </a>
68
+ ) : (
69
+ <button key={row.id || row.Name || index} type="button" onClick={openDataModel}>
70
+ <span>{row.Name || `Site ${index + 1}`}</span>
71
+ <em>{row.client || "Workspace"} · {row.status || "draft"}</em>
72
+ </button>
73
+ ))}
74
+ </div> : null}
75
+ </SettingsAccordionSection>;
76
+ }
77
+
78
+ export {
79
+ CODEX_SITES_OBJECT_ID,
80
+ CodexSitesDataModelCard
81
+ };