@growthub/cli 0.13.6 → 0.13.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/query/route.js +98 -34
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/metadata-graph/route.js +1 -0
  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 +189 -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/HelperSidecar.jsx +37 -2
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/NangoConnectionPanel.jsx +37 -2
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +437 -26
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +44 -0
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +592 -41
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-lens/page.jsx +76 -0
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +148 -4
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +1559 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +3 -3
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper-apply.js +24 -8
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-store.js +82 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +8 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/seeded-configs/project-management.config.json +4 -4
  22. package/dist/index.js +5224 -5225
  23. package/package.json +1 -1
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
- import { CheckCircle, ExternalLink, Loader2, RefreshCw, ShieldCheck, XCircle } from "lucide-react";
4
+ import Link from "next/link";
5
+ import { ArrowRight, CheckCircle, ExternalLink, Loader2, RefreshCw, ShieldCheck, XCircle } from "lucide-react";
5
6
 
6
7
  /**
7
8
  * NangoConnectionPanel — interactive sidecar for an api-registry row whose
@@ -114,7 +115,7 @@ function StatusBadge({ status, label }) {
114
115
  );
115
116
  }
116
117
 
117
- export function NangoConnectionPanel({ row, disabled, onUpdateRow }) {
118
+ export function NangoConnectionPanel({ row, disabled, onUpdateRow, templateContext }) {
118
119
  const initialProviderConfigKey = useMemo(() => deriveProviderConfigKey(row), [row]);
119
120
  const initialConnectionId = useMemo(() => deriveDefaultConnectionId(row), [row]);
120
121
  const initialStatus = useMemo(() => deriveInitialStatus(row), [row]);
@@ -491,6 +492,40 @@ export function NangoConnectionPanel({ row, disabled, onUpdateRow }) {
491
492
  </button>
492
493
  ) : null}
493
494
  </div>
495
+
496
+ {/*
497
+ * Template-aware affordances. When this row was scaffolded as part
498
+ * of a workspace template (project-management today), surface a
499
+ * "next step" hint linking back to the activation checklist or the
500
+ * seeded workflow. Other rows render no template context at all.
501
+ */}
502
+ {templateContext && (templateContext.nextHref || templateContext.backHref) ? (
503
+ <div
504
+ className={
505
+ "workspace-template-context-banner"
506
+ + ((statusKind === "connected" || persistedStatus === "connected") ? "" : " is-warn")
507
+ }
508
+ role="note"
509
+ >
510
+ <span>
511
+ {(statusKind === "connected" || persistedStatus === "connected")
512
+ ? (templateContext.nextLabel || "Next: run the seeded workflow.")
513
+ : (templateContext.pendingLabel || "Finish OAuth above, then continue setup.")}
514
+ </span>
515
+ {templateContext.backHref ? (
516
+ <Link href={templateContext.backHref} className="workspace-template-context-link">
517
+ <span>Back to setup checklist</span>
518
+ <ArrowRight size={12} aria-hidden="true" />
519
+ </Link>
520
+ ) : null}
521
+ {templateContext.nextHref ? (
522
+ <Link href={templateContext.nextHref} className="workspace-template-context-link">
523
+ <span>{templateContext.nextCta || "Open workflow"}</span>
524
+ <ArrowRight size={12} aria-hidden="true" />
525
+ </Link>
526
+ ) : null}
527
+ </div>
528
+ ) : null}
494
529
  </section>
495
530
  );
496
531
  }
@@ -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;
@@ -559,7 +585,10 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
559
585
  padding: 16px;
560
586
  display: flex;
561
587
  flex-direction: column;
562
- overflow: hidden;
588
+ overflow-y: auto;
589
+ overflow-x: hidden;
590
+ scrollbar-gutter: stable;
591
+ overscroll-behavior: contain;
563
592
  }
564
593
  .workspace-toolbar {
565
594
  min-height: 48px;
@@ -639,6 +668,54 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
639
668
  .workspace-tabs > button svg {
640
669
  flex: 0 0 auto;
641
670
  }
671
+ .workspace-toolbar-actions > .workspace-finish-setup-control {
672
+ gap: 0;
673
+ padding: 0;
674
+ overflow: hidden;
675
+ }
676
+ .workspace-finish-setup-trigger,
677
+ .workspace-finish-setup-dismiss {
678
+ min-height: 28px;
679
+ border: 0;
680
+ background: transparent;
681
+ color: inherit;
682
+ display: inline-flex;
683
+ align-items: center;
684
+ justify-content: center;
685
+ gap: 6px;
686
+ padding: 0 10px;
687
+ cursor: pointer;
688
+ }
689
+ .workspace-finish-setup-trigger:hover,
690
+ .workspace-finish-setup-dismiss:hover {
691
+ background: #fafafa;
692
+ }
693
+ .workspace-finish-setup-control.is-complete {
694
+ border-color: #bbf7d0;
695
+ color: #047857;
696
+ background: #f0fdf4;
697
+ }
698
+ .workspace-finish-setup-control.is-complete .workspace-finish-setup-trigger:hover,
699
+ .workspace-finish-setup-control.is-complete .workspace-finish-setup-dismiss:hover {
700
+ background: #dcfce7;
701
+ }
702
+ .workspace-finish-setup-dismiss {
703
+ width: 30px;
704
+ padding: 0;
705
+ border-left: 1px solid #bbf7d0;
706
+ }
707
+ .workspace-finish-setup-dismiss-x {
708
+ display: none;
709
+ }
710
+ .workspace-finish-setup-dismiss:hover {
711
+ color: #b91c1c;
712
+ }
713
+ .workspace-finish-setup-dismiss:hover .workspace-finish-setup-dismiss-check {
714
+ display: none;
715
+ }
716
+ .workspace-finish-setup-dismiss:hover .workspace-finish-setup-dismiss-x {
717
+ display: block;
718
+ }
642
719
  .workspace-table,
643
720
  .workspace-canvas {
644
721
  border: 1px solid #e7e7e7;
@@ -4120,6 +4197,68 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
4120
4197
  .workspace-chart-type-tabs button.active em {
4121
4198
  color: #075985;
4122
4199
  }
4200
+ .workspace-table-view-tabs {
4201
+ grid-template-columns: repeat(4, 1fr);
4202
+ }
4203
+ .workspace-table-transform-preview {
4204
+ display: grid;
4205
+ gap: 8px;
4206
+ min-height: 88px;
4207
+ margin-top: 10px;
4208
+ color: #4b5563;
4209
+ font-size: 11px;
4210
+ }
4211
+ .workspace-table-transform-preview.is-board,
4212
+ .workspace-table-transform-preview.is-calendar {
4213
+ grid-template-columns: repeat(3, minmax(0, 1fr));
4214
+ }
4215
+ .workspace-table-transform-preview.is-calendar {
4216
+ grid-template-columns: repeat(5, minmax(0, 1fr));
4217
+ }
4218
+ .workspace-table-transform-preview section {
4219
+ min-width: 0;
4220
+ border: 1px solid #eeeeee;
4221
+ border-radius: 5px;
4222
+ background: #fafafa;
4223
+ padding: 6px;
4224
+ }
4225
+ .workspace-table-transform-preview strong,
4226
+ .workspace-table-transform-preview span,
4227
+ .workspace-table-transform-preview em {
4228
+ display: block;
4229
+ min-width: 0;
4230
+ overflow: hidden;
4231
+ text-overflow: ellipsis;
4232
+ white-space: nowrap;
4233
+ }
4234
+ .workspace-table-transform-preview strong {
4235
+ color: #111827;
4236
+ font-size: 11px;
4237
+ }
4238
+ .workspace-table-transform-preview span {
4239
+ margin-top: 5px;
4240
+ border-radius: 4px;
4241
+ background: #fff;
4242
+ padding: 5px 6px;
4243
+ }
4244
+ .workspace-table-transform-preview div {
4245
+ display: grid;
4246
+ grid-template-columns: minmax(64px, 1fr) 2fr minmax(32px, auto);
4247
+ align-items: center;
4248
+ gap: 8px;
4249
+ }
4250
+ .workspace-table-transform-preview i {
4251
+ display: block;
4252
+ width: var(--width, 42%);
4253
+ height: 9px;
4254
+ margin-left: var(--offset, 0);
4255
+ border-radius: 999px;
4256
+ background: #93c5fd;
4257
+ }
4258
+ .workspace-table-transform-preview em {
4259
+ color: #9ca3af;
4260
+ font-style: normal;
4261
+ }
4123
4262
  .workspace-axis-range {
4124
4263
  display: grid;
4125
4264
  grid-template-columns: 1fr 1fr;
@@ -8501,3 +8640,275 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
8501
8640
  .dm-swarm-phase { border: 1px solid #edf0f3; border-radius: 4px; padding: 6px 8px; font-size: 11px; }
8502
8641
  .dm-swarm-phase summary { cursor: pointer; color: #6b7280; font-weight: 500; }
8503
8642
  .dm-swarm-phase pre { margin: 6px 0 0; font-size: 11px; white-space: pre-wrap; color: #111827; max-height: 240px; overflow: auto; }
8643
+
8644
+ /* Customer Activation Layer V1 — workspace activation panel */
8645
+ .workspace-activation-panel { border: 1px solid #e5e7eb; border-radius: 10px; background: #ffffff; padding: 18px 20px; margin: 0 0 20px; display: flex; flex-direction: column; gap: 16px; }
8646
+ .workspace-activation-panel.is-complete { background: linear-gradient(180deg, #f0fdf4 0%, #ffffff 80%); border-color: #bbf7d0; }
8647
+ .workspace-activation-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
8648
+ .workspace-activation-head-text { display: flex; flex-direction: column; gap: 4px; flex: 1 1 320px; min-width: 0; }
8649
+ .workspace-activation-eyebrow { margin: 0; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280; font-weight: 600; }
8650
+ .workspace-activation-headline { margin: 0; font-size: 18px; font-weight: 600; color: #111827; line-height: 1.3; }
8651
+ .workspace-activation-subheadline { margin: 0; font-size: 13px; color: #4b5563; }
8652
+ .workspace-activation-progress { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; min-width: 120px; }
8653
+ .workspace-activation-progress-value { font-size: 11px; font-weight: 600; color: #475569; }
8654
+ .workspace-activation-progress-bar { display: block; width: 120px; height: 6px; background: #f1f5f9; border-radius: 999px; overflow: hidden; }
8655
+ .workspace-activation-progress-fill { display: block; height: 100%; background: #3b82f6; transition: width 200ms ease; }
8656
+ .workspace-activation-panel.is-complete .workspace-activation-progress-fill { background: #16a34a; }
8657
+ .workspace-activation-steps { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }
8658
+ .workspace-activation-step { display: flex; align-items: flex-start; gap: 12px; padding: 12px 14px; border: 1px solid #edf0f3; border-radius: 8px; background: #fbfcfd; transition: border-color 120ms ease, background 120ms ease; }
8659
+ .workspace-activation-step.is-next { border-color: #3b82f6; background: #eff6ff; }
8660
+ .workspace-activation-step.is-complete { background: #f0fdf4; border-color: #bbf7d0; }
8661
+ .workspace-activation-step.is-blocked { background: #fffbeb; border-color: #fde68a; }
8662
+ .workspace-activation-step.is-optional { opacity: 0.85; }
8663
+ .workspace-activation-step-status { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 999px; background: #ffffff; border: 1px solid #cbd5f5; color: #3b82f6; flex-shrink: 0; }
8664
+ .workspace-activation-step.is-complete .workspace-activation-step-status { background: #16a34a; border-color: #16a34a; color: #ffffff; }
8665
+ .workspace-activation-step.is-blocked .workspace-activation-step-status { background: #fef3c7; border-color: #f59e0b; color: #b45309; }
8666
+ .workspace-activation-step.is-optional .workspace-activation-step-status { background: #f5f3ff; border-color: #c4b5fd; color: #7c3aed; }
8667
+ .workspace-activation-step-body { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; }
8668
+ .workspace-activation-step-titlebar { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
8669
+ .workspace-activation-step-title { margin: 0; font-size: 13px; font-weight: 600; color: #111827; }
8670
+ .workspace-activation-step-badge { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; padding: 1px 6px; border-radius: 999px; background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
8671
+ .workspace-activation-step-badge.is-complete { background: #ecfdf5; color: #047857; border-color: #a7f3d0; }
8672
+ .workspace-activation-step-badge.is-blocked { background: #fef3c7; color: #b45309; border-color: #fde68a; }
8673
+ .workspace-activation-step-badge.is-optional { background: #f5f3ff; color: #6d28d9; border-color: #ddd6fe; }
8674
+ .workspace-activation-step-description { margin: 0; font-size: 12px; color: #475569; line-height: 1.5; }
8675
+ .workspace-activation-step-hint { display: inline-flex; align-items: flex-start; gap: 6px; margin: 0; font-size: 11px; color: #6b7280; line-height: 1.45; }
8676
+ .workspace-activation-step-hint > svg { margin-top: 2px; flex-shrink: 0; }
8677
+ .workspace-activation-step-cta { display: inline-flex; align-items: center; gap: 4px; align-self: flex-start; font-size: 12px; color: #1d4ed8; text-decoration: none; padding: 4px 0; }
8678
+ .workspace-activation-step-cta:hover { text-decoration: underline; }
8679
+ .workspace-activation-step-cta.is-primary { background: #3b82f6; color: #ffffff; border-radius: 6px; padding: 4px 10px; }
8680
+ .workspace-activation-step-cta.is-primary:hover { background: #2563eb; text-decoration: none; }
8681
+ .workspace-activation-helper-cta { display: flex; justify-content: flex-end; }
8682
+ .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; }
8683
+ .workspace-activation-helper-btn:hover { background: #eef2ff; }
8684
+
8685
+ /* Activation → Workspace Lens handoff teaser (shown once setup completes). */
8686
+ .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; }
8687
+ .workspace-activation-lens-teaser-text { font-size: 12px; color: #4b5563; line-height: 1.45; }
8688
+ .workspace-activation-lens-teaser-link { font-size: 12px; font-weight: 600; color: #374151; text-decoration: none; white-space: nowrap; }
8689
+ .workspace-activation-lens-teaser-link:hover { text-decoration: underline; }
8690
+
8691
+ /* Locked rail nav affordance (Workspace Lens before setup completes). */
8692
+ .workspace-nav-button.is-locked { opacity: 0.45; cursor: default; }
8693
+
8694
+ /* ── Workspace Lens — post-activation operating surface ─────────────────────
8695
+ Neutral, calm, aggregate-first. No semantic color overload, no icon spam. */
8696
+ body.workspace-rail-collapsed .workspace-builder.workspace-lens-page,
8697
+ .workspace-builder.workspace-lens-page { grid-template-columns: var(--workspace-rail-width) minmax(0, 1fr); height: 100vh; overflow: hidden; }
8698
+ .workspace-lens-surface { width: 100%; padding: 0; background: #f7f7f8; overflow-y: auto; overflow-x: hidden; }
8699
+ .workspace-lens-shell { width: 100%; max-width: none; margin: 0; padding: 24px 28px 32px; }
8700
+ .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; }
8701
+ .workspace-lens-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
8702
+ .workspace-lens-title { font-size: 18px; font-weight: 600; color: #111827; margin: 0; }
8703
+ .workspace-lens-subtitle { font-size: 13px; color: #6b7280; margin: 4px 0 0; }
8704
+ .workspace-lens-score { font-size: 12px; color: #4b5563; font-variant-numeric: tabular-nums; margin: 2px 0 0; }
8705
+ .workspace-lens-controls.workspace-builder-filterbar { margin: 0 0 14px; border: 1px solid #e8edf3; border-radius: 8px; background: #fff; }
8706
+ .workspace-lens-filters.workspace-builder-filterbar__segments { max-width: 100%; overflow-x: auto; }
8707
+ .workspace-lens-filter { white-space: nowrap; }
8708
+ .workspace-lens-filter.is-active { background: #fff; color: #111827; box-shadow: 0 1px 2px rgba(15, 23, 42, .08); }
8709
+ .workspace-lens-search-wrap { flex-shrink: 0; }
8710
+ .workspace-lens-search { width: 100%; min-width: 0; border: 0; outline: 0; background: transparent; color: #111827; font: inherit; font-size: 12px; padding: 0; }
8711
+ .workspace-lens-control-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin: 0 0 22px; }
8712
+ .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; }
8713
+ .workspace-lens-control-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
8714
+ .workspace-lens-control-card-head h2 { margin: 0; color: #111827; font-size: 13px; font-weight: 600; line-height: 1.3; }
8715
+ .workspace-lens-control-card-head span { color: #6b7280; font-size: 12px; }
8716
+ .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; }
8717
+ .workspace-lens-icon-btn:hover { border-color: #e5e7eb; background: #f9fafb; color: #111827; }
8718
+ .workspace-lens-checklist { display: flex; flex-direction: column; gap: 6px; }
8719
+ .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; }
8720
+ .workspace-lens-check-item:hover { background: #e5e7eb; }
8721
+ .workspace-lens-check-item.is-complete { background: #dcfce7; color: #15803d; text-decoration: line-through; box-shadow: inset 3px 0 0 #22c55e; }
8722
+ .workspace-lens-check-item.is-complete svg { color: #16a34a; }
8723
+ .workspace-lens-stat-list { display: flex; flex-direction: column; gap: 0; margin-top: 14px; }
8724
+ .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; }
8725
+ .workspace-lens-stat-row:last-child { border-bottom: 0; }
8726
+ .workspace-lens-stat-row strong { color: #111827; font-size: 13px; font-weight: 500; text-align: left; font-variant-numeric: tabular-nums; }
8727
+ .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; }
8728
+ .workspace-lens-helper-card-body svg { color: #111827; }
8729
+ .workspace-lens-helper-card-body strong { color: #111827; font-size: 13px; }
8730
+ .workspace-lens-helper-card-body p { margin: 0; color: #6b7280; font-size: 12px; line-height: 1.45; max-width: 260px; }
8731
+ .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; }
8732
+ .workspace-lens-helper-card-body button:hover { background: #f9fafb; }
8733
+ .workspace-lens-branches { margin: 24px 0 32px; }
8734
+ .workspace-lens-branches-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 12px; }
8735
+ .workspace-lens-branches-head h2 { margin: 0; color: #111827; font-size: 18px; font-weight: 600; }
8736
+ .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; }
8737
+ .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); }
8738
+ .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; }
8739
+ .workspace-lens-branch-row:last-child { border-bottom: 0; }
8740
+ .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); }
8741
+ .workspace-lens-branch-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8742
+ .workspace-lens-branch-name svg { color: #4b5563; flex-shrink: 0; }
8743
+ .workspace-lens-branch-actions { position: relative; display: inline-flex; align-items: center; justify-content: flex-end; gap: 8px; min-width: 0; }
8744
+ .workspace-lens-preview-pill,
8745
+ .workspace-lens-progress-pill,
8746
+ .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; }
8747
+ .workspace-lens-preview-pill:hover { background: #f9fafb; color: #111827; }
8748
+ .workspace-lens-owner-pill { border-color: transparent; color: #4b5563; }
8749
+ .workspace-lens-branch-summary,
8750
+ .workspace-lens-branch-next { display: none; grid-column: 1 / -1; margin: -6px 0 10px 22px; color: #6b7280; font-size: 12px; line-height: 1.4; }
8751
+ .workspace-lens-branch-next { margin-top: -8px; color: #374151; font-weight: 500; }
8752
+ .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; }
8753
+ .workspace-lens-action-menu button,
8754
+ .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; }
8755
+ .workspace-lens-action-menu button:hover,
8756
+ .workspace-lens-action-menu a:hover { background: #f3f4f6; }
8757
+ @media (max-width: 1100px) {
8758
+ .workspace-lens-control-grid { grid-template-columns: 1fr; }
8759
+ .workspace-lens-branch-row { grid-template-columns: 1fr; align-items: flex-start; padding: 10px 12px; gap: 8px; }
8760
+ .workspace-lens-branch-actions { justify-content: flex-start; flex-wrap: wrap; }
8761
+ .workspace-lens-branch-summary,
8762
+ .workspace-lens-branch-next { margin-left: 22px; }
8763
+ }
8764
+ .workspace-lens-stream { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
8765
+ .workspace-lens-card { border: 1px solid #e8edf3; border-radius: 10px; background: #fff; padding: 12px 14px; }
8766
+ .workspace-lens-card.is-ready { opacity: 0.7; }
8767
+ .workspace-lens-card-head { display: flex; align-items: center; gap: 10px; width: 100%; background: none; border: none; padding: 0; cursor: pointer; text-align: left; }
8768
+ .workspace-lens-card-title { font-size: 13px; font-weight: 600; color: #111827; flex: 1; }
8769
+ .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; }
8770
+ .workspace-lens-chip.is-blocked { color: #374151; border-color: #d1d5db; background: #f3f4f6; }
8771
+ .workspace-lens-card-progress { font-size: 11px; color: #6b7280; font-variant-numeric: tabular-nums; }
8772
+ .workspace-lens-caret { color: #9ca3af; transition: transform 120ms ease; }
8773
+ .workspace-lens-caret.is-open { transform: rotate(180deg); }
8774
+ .workspace-lens-card-headline { font-size: 12px; color: #4b5563; line-height: 1.45; margin: 8px 0 0; }
8775
+ .workspace-lens-card-next { display: flex; align-items: baseline; gap: 6px; margin-top: 8px; font-size: 12px; }
8776
+ .workspace-lens-next-label { color: #9ca3af; }
8777
+ .workspace-lens-next-link { color: #374151; font-weight: 600; text-decoration: none; }
8778
+ .workspace-lens-next-link:hover { text-decoration: underline; }
8779
+ .workspace-lens-card-detail { margin-top: 12px; border-top: 1px solid #f1f5f9; padding-top: 10px; display: flex; flex-direction: column; gap: 10px; }
8780
+ .workspace-lens-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
8781
+ .workspace-lens-step { display: flex; align-items: baseline; gap: 8px; font-size: 12px; color: #4b5563; }
8782
+ .workspace-lens-step-label { flex: 1; }
8783
+ .workspace-lens-step-status { font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: #9ca3af; }
8784
+ .workspace-lens-step.is-blocked .workspace-lens-step-status { color: #6b7280; font-weight: 600; }
8785
+ .workspace-lens-step-hint { flex-basis: 100%; font-size: 11px; color: #9ca3af; }
8786
+ .workspace-lens-blocked { font-size: 12px; color: #374151; margin: 0; }
8787
+ .workspace-lens-agent { border: 1px solid #f1f5f9; border-radius: 8px; background: #fafbfc; padding: 10px; }
8788
+ .workspace-lens-agent-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: #6b7280; margin: 0 0 6px; }
8789
+ .workspace-lens-agent-row { display: flex; gap: 8px; font-size: 12px; color: #4b5563; margin: 2px 0; }
8790
+ .workspace-lens-agent-row > span { color: #9ca3af; min-width: 84px; }
8791
+ .workspace-lens-empty { font-size: 12px; color: #9ca3af; padding: 16px; text-align: center; }
8792
+
8793
+ /* Workspace contribution graph — neutral chrome, GitHub green cell scale. */
8794
+ .workspace-contrib { border: 1px solid #e8edf3; border-radius: 10px; background: #fff; padding: 14px 16px; margin-bottom: 16px; }
8795
+ .workspace-contrib-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 10px; flex-wrap: wrap; }
8796
+ .workspace-contrib-total { font-size: 12px; color: #4b5563; }
8797
+ .workspace-contrib-legend { display: inline-flex; align-items: center; gap: 3px; font-size: 11px; color: #9ca3af; }
8798
+ .workspace-contrib-grid-wrap { width: 100%; overflow: visible; }
8799
+ .workspace-contrib-months { display: grid; grid-template-columns: repeat(53, minmax(0, 1fr)); gap: 3px; margin-left: 38px; margin-bottom: 4px; }
8800
+ .workspace-contrib-month { font-size: 9px; color: #9ca3af; white-space: nowrap; }
8801
+ .workspace-contrib-body { display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 8px; align-items: stretch; }
8802
+ .workspace-contrib-weekdays { display: grid; grid-template-rows: repeat(7, minmax(0, 1fr)); gap: 3px; width: 30px; }
8803
+ .workspace-contrib-weekdays span { font-size: 9px; color: #9ca3af; line-height: 1; display: flex; align-items: center; }
8804
+ .workspace-contrib-weeks { display: grid; grid-template-columns: repeat(53, minmax(0, 1fr)); gap: 3px; min-width: 0; }
8805
+ .workspace-contrib-week { display: grid; grid-template-rows: repeat(7, minmax(0, 1fr)); gap: 3px; min-width: 0; }
8806
+ .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; }
8807
+ .workspace-contrib-cell:disabled { cursor: default; }
8808
+ .workspace-contrib-cell.lvl-0 { background: #ebedf0; }
8809
+ .workspace-contrib-cell.lvl-1 { background: #9be9a8; }
8810
+ .workspace-contrib-cell.lvl-2 { background: #40c463; }
8811
+ .workspace-contrib-cell.lvl-3 { background: #30a14e; }
8812
+ .workspace-contrib-cell.lvl-4 { background: #216e39; }
8813
+ .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); }
8814
+ .workspace-contrib-cell.has-count:hover { outline: 2px solid rgba(17, 24, 39, 0.75); outline-offset: 1px; }
8815
+ .workspace-contrib-cell.lvl-future { background: transparent; border-color: transparent; }
8816
+ .workspace-contrib-legend .workspace-contrib-cell { cursor: default; }
8817
+ .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; }
8818
+ .workspace-contrib-tooltip-count { font-size: 11px; font-weight: 600; }
8819
+ .workspace-contrib-tooltip-date { font-size: 10px; color: #cbd5e1; }
8820
+ .workspace-contrib-tooltip-link { font-size: 10px; color: #9be9a8; text-decoration: none; margin-top: 2px; }
8821
+ .workspace-contrib-tooltip-link:hover { text-decoration: underline; }
8822
+
8823
+ /* Workspace Lens one-time walkthrough — calm white popover. */
8824
+ .workspace-rail-lens-nav { position: relative; }
8825
+ .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; }
8826
+ .workspace-lens-walkthrough.is-anchored,
8827
+ .workspace-lens-walkthrough.is-rail-reveal { position: fixed; z-index: 1200; }
8828
+ .workspace-lens-walkthrough.is-anchored::before,
8829
+ .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); }
8830
+ @media (max-width: 760px) {
8831
+ .workspace-lens-walkthrough.is-anchored,
8832
+ .workspace-lens-walkthrough.is-rail-reveal { right: 16px; width: auto; }
8833
+ .workspace-lens-walkthrough.is-anchored::before,
8834
+ .workspace-lens-walkthrough.is-rail-reveal::before { display: none; }
8835
+ }
8836
+ .workspace-lens-walkthrough.is-panel { width: 100%; max-width: 520px; margin: 0 0 16px; }
8837
+ .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; }
8838
+ .workspace-lens-walkthrough-x:hover { background: #f3f4f6; color: #4b5563; }
8839
+ .workspace-lens-walkthrough-eyebrow { margin: 0 0 4px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: #9ca3af; }
8840
+ .workspace-lens-walkthrough-title { margin: 0 0 5px; font-size: 13px; font-weight: 600; color: #111827; padding-right: 18px; }
8841
+ .workspace-lens-walkthrough-body { margin: 0 0 12px; font-size: 12px; line-height: 1.5; color: #4b5563; }
8842
+ .workspace-lens-walkthrough-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
8843
+ .workspace-lens-walkthrough-steps { font-size: 11px; color: #9ca3af; font-variant-numeric: tabular-nums; }
8844
+ .workspace-lens-walkthrough-next { font-size: 12px; font-weight: 600; color: #ffffff; background: #111827; border: none; border-radius: 6px; padding: 6px 12px; cursor: pointer; }
8845
+ .workspace-lens-walkthrough-next:hover { background: #1f2937; }
8846
+
8847
+ /* Helper handoff — one callout, one helper widget, one sandbox config. */
8848
+ .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; }
8849
+ .workspace-lens-helper-callout-text { min-width: 0; }
8850
+ .workspace-lens-helper-callout-title { margin: 0 0 3px; font-size: 13px; font-weight: 600; color: #111827; }
8851
+ .workspace-lens-helper-callout-body { margin: 0; font-size: 12px; line-height: 1.5; color: #6b7280; max-width: 560px; }
8852
+ .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; }
8853
+ .workspace-lens-helper-callout-btn:hover:not(:disabled) { background: #f3f4f6; }
8854
+ .workspace-lens-helper-callout-btn:disabled { opacity: 0.6; cursor: default; }
8855
+ .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); }
8856
+ .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; }
8857
+ .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; }
8858
+ .workspace-helper-setup-modal-close:hover { background: #f9fafb; color: #111827; }
8859
+ .workspace-helper-setup-breadcrumbs { display: flex; gap: 8px; flex-wrap: wrap; padding-right: 36px; margin-bottom: 16px; font-size: 12px; color: #9ca3af; }
8860
+ .workspace-helper-setup-breadcrumbs span { border: 1px solid #e5e7eb; border-radius: 999px; padding: 4px 9px; background: #f9fafb; }
8861
+ .workspace-helper-setup-breadcrumbs span.active { color: #111827; border-color: #111827; background: #fff; font-weight: 600; }
8862
+ .workspace-helper-setup-step { display: flex; flex-direction: column; gap: 12px; }
8863
+ .workspace-helper-setup-step h2 { margin: 0; font-size: 18px; line-height: 1.25; color: #111827; }
8864
+ .workspace-helper-setup-step p { margin: 0; font-size: 13px; line-height: 1.55; color: #4b5563; }
8865
+ .workspace-helper-setup-eyebrow { font-size: 11px !important; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280 !important; }
8866
+ .workspace-helper-setup-target { border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; display: grid; gap: 4px; background: #fafafa; }
8867
+ .workspace-helper-setup-target span, .workspace-helper-setup-target small { font-size: 12px; color: #6b7280; }
8868
+ .workspace-helper-setup-target strong { font-size: 14px; color: #111827; }
8869
+ .workspace-helper-setup-card-grid { display: grid; gap: 8px; }
8870
+ .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; }
8871
+ .workspace-helper-setup-toggle:hover { background: #f9fafb; }
8872
+ .workspace-helper-setup-toggle input { width: 16px !important; height: 16px; margin: 2px 0 0; padding: 0 !important; accent-color: #111827; flex-shrink: 0; }
8873
+ .workspace-helper-setup-toggle span { display: grid; gap: 3px; min-width: 0; }
8874
+ .workspace-helper-setup-toggle strong { color: #111827; font-size: 13px; }
8875
+ .workspace-helper-setup-toggle small { color: #6b7280; font-size: 12px; line-height: 1.35; }
8876
+ .workspace-helper-setup-radio-group { border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; display: grid; gap: 8px; background: #fafafa; }
8877
+ .workspace-helper-setup-radio-group > span { font-size: 12px; font-weight: 700; color: #374151; }
8878
+ .workspace-helper-setup-radio-group label { display: flex !important; align-items: center; gap: 8px; font-size: 13px; color: #111827; font-weight: 600; }
8879
+ .workspace-helper-setup-radio-group input { width: 15px !important; height: 15px; margin: 0; padding: 0 !important; accent-color: #111827; }
8880
+ .workspace-helper-setup-radio-group small { color: #9ca3af; font-size: 12px; line-height: 1.4; }
8881
+ .workspace-helper-setup-field-stack { display: grid; gap: 10px; }
8882
+ .workspace-helper-agent-options { display: grid; gap: 8px; }
8883
+ .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; }
8884
+ .workspace-helper-agent-options button:hover { background: #f9fafb; }
8885
+ .workspace-helper-agent-options button.active { border-color: #111827; box-shadow: inset 3px 0 0 #111827; }
8886
+ .workspace-helper-agent-options strong { font-size: 13px; color: #111827; }
8887
+ .workspace-helper-agent-options span { font-size: 12px; line-height: 1.4; color: #6b7280; }
8888
+ .workspace-helper-setup-two-col { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
8889
+ .workspace-helper-setup-step label { display: grid; gap: 6px; font-size: 12px; font-weight: 600; color: #374151; }
8890
+ .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; }
8891
+ .workspace-helper-setup-review { display: grid; gap: 8px; margin: 0; }
8892
+ .workspace-helper-setup-review div { display: grid; grid-template-columns: 120px 1fr; gap: 12px; border-bottom: 1px solid #f3f4f6; padding-bottom: 8px; }
8893
+ .workspace-helper-setup-review dt { font-size: 12px; color: #6b7280; }
8894
+ .workspace-helper-setup-review dd { margin: 0; min-width: 0; overflow-wrap: anywhere; font-size: 12px; color: #111827; }
8895
+ .workspace-helper-setup-error { color: #b91c1c !important; }
8896
+ .workspace-helper-setup-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; }
8897
+ .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; }
8898
+ .workspace-helper-setup-actions button.primary { background: #111827; border-color: #111827; color: #fff; }
8899
+ .workspace-helper-setup-actions button:disabled { opacity: 0.55; cursor: default; }
8900
+
8901
+ /* Compact rail variant — slim activation chip in WorkspaceRail Home */
8902
+ .workspace-activation-panel.is-compact { padding: 12px 14px; margin: 0 0 12px; gap: 10px; border-radius: 8px; }
8903
+ .workspace-activation-panel.is-compact .workspace-activation-head { gap: 8px; }
8904
+ .workspace-activation-panel.is-compact .workspace-activation-headline { font-size: 13px; }
8905
+ .workspace-activation-panel.is-compact .workspace-activation-subheadline { font-size: 11px; }
8906
+ .workspace-activation-panel.is-compact .workspace-activation-step { padding: 8px 10px; gap: 8px; }
8907
+ .workspace-activation-panel.is-compact .workspace-activation-step-title { font-size: 12px; }
8908
+ .workspace-activation-panel.is-compact .workspace-activation-step-description { font-size: 11px; }
8909
+ .workspace-activation-panel.is-compact .workspace-activation-progress-bar { width: 80px; }
8910
+
8911
+ /* Template-aware context banner — workflow + nango affordance */
8912
+ .workspace-template-context-banner { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 6px; background: #eff6ff; border: 1px solid #bfdbfe; color: #1e40af; font-size: 12px; margin: 0 0 12px; }
8913
+ .workspace-template-context-banner.is-warn { background: #fffbeb; border-color: #fde68a; color: #92400e; }
8914
+ .workspace-template-context-banner .workspace-template-context-link { color: inherit; text-decoration: underline; font-weight: 600; margin-left: auto; }
@@ -51,6 +51,7 @@ import { AgentSwarmPanel } from "../data-model/components/AgentSwarmPanel.jsx";
51
51
  import { RunSetupPanel } from "./RunSetupPanel.jsx";
52
52
  import { describeRunInputMetadataItems, discoverRunInputSchema } from "@/lib/orchestration-run-inputs";
53
53
  import { selectWorkflowNodeInputSchema } from "@/lib/workspace-metadata-selectors";
54
+ import { deriveProvenance, hasConnectionId } from "@/lib/workspace-activation";
54
55
 
55
56
  // Workspace Metadata Graph V1 — read-only dependency metadata for workflow
56
57
  // sidecars. The runtime path (sandbox-run, publish, draft/live) is
@@ -387,6 +388,33 @@ export default function WorkflowSurface() {
387
388
  [workspaceConfig, sandboxRow]
388
389
  );
389
390
 
391
+ // Template-aware activation banner. When the active workflow belongs to
392
+ // a seeded template (project-management today) and its provider row
393
+ // doesn't have a connectionId yet, surface a back-link to the API
394
+ // Registry / Nango panel so the user can finish setup without hunting
395
+ // through Data Model surfaces.
396
+ const templateBanner = useMemo(() => {
397
+ if (!workspaceConfig) return null;
398
+ const provenance = deriveProvenance(workspaceConfig);
399
+ if (provenance.template !== "project-management") return null;
400
+ if (!registryRow) return null;
401
+ const ready = hasConnectionId(registryRow);
402
+ const apiRegistryObjectId = String(
403
+ (Array.isArray(workspaceConfig?.dataModel?.objects)
404
+ ? workspaceConfig.dataModel.objects.find((o) => o?.objectType === "api-registry")?.id
405
+ : "") || ""
406
+ );
407
+ const apiRegistryRowId = String(registryRow.integrationId || "").trim();
408
+ const backHref = apiRegistryObjectId && apiRegistryRowId
409
+ ? `/data-model?object=${encodeURIComponent(apiRegistryObjectId)}&row=${encodeURIComponent(apiRegistryRowId)}`
410
+ : "/data-model";
411
+ return {
412
+ ready,
413
+ backHref,
414
+ providerConfigKey: String(registryRow.providerConfigKey || registryRow.integrationId || "").trim(),
415
+ };
416
+ }, [workspaceConfig, registryRow]);
417
+
390
418
  useEffect(() => {
391
419
  setSidecarMode(runId ? "trace" : "graph");
392
420
  }, [runId]);
@@ -876,6 +904,22 @@ export default function WorkflowSurface() {
876
904
  </div>
877
905
  </header>
878
906
 
907
+ {templateBanner ? (
908
+ <div
909
+ className={"workspace-template-context-banner" + (templateBanner.ready ? "" : " is-warn")}
910
+ role="note"
911
+ >
912
+ <span>
913
+ {templateBanner.ready
914
+ ? `Provider connected via Nango${templateBanner.providerConfigKey ? ` (${templateBanner.providerConfigKey})` : ""}. Ready to run.`
915
+ : "Connect your provider through Nango before running this workflow."}
916
+ </span>
917
+ <Link href={templateBanner.backHref} className="workspace-template-context-link">
918
+ <span>{templateBanner.ready ? "Manage connection" : "Open Nango panel"}</span>
919
+ </Link>
920
+ </div>
921
+ ) : null}
922
+
879
923
  {loading ? (
880
924
  <p className="dm-workflow-empty">Loading workflow…</p>
881
925
  ) : error ? (