@growthub/cli 0.10.0 → 0.12.0

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 (28) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/apply/route.js +307 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/query/route.js +372 -0
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/receipts/route.js +47 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +664 -82
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/HelperSidecar.jsx +1371 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +1383 -24
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/page.jsx +7 -21
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/ownership/ownership-panel.jsx +222 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/ownership/page.jsx +19 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/settings-shell.jsx +2 -1
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +116 -24
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +497 -0
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/growthub.config.json +20 -4
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/default-local-intelligence.js +19 -4
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +23 -5
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper-apply.js +473 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper.js +583 -0
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package-lock.json +34 -0
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package.json +3 -1
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/export-training-traces.mjs +144 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/grade-raw-pairs.mjs +279 -0
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/harvest-cursor-traces.mjs +288 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/upload-graded-traces.mjs +128 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +19 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/seeded-configs/alignment-loop.config.json +264 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/workers/custom-workspace-operator/CLAUDE.md +38 -0
  27. package/dist/index.js +1416 -2627
  28. package/package.json +1 -1
@@ -398,12 +398,12 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
398
398
  .workspace-builder {
399
399
  min-height: 100vh;
400
400
  display: grid;
401
- grid-template-columns: 220px minmax(0, 1fr) 320px;
401
+ grid-template-columns: 264px minmax(0, 1fr) 320px;
402
402
  background: #fafafa;
403
403
  color: #252525;
404
404
  }
405
405
  .workspace-settings-page {
406
- grid-template-columns: 220px minmax(0, 1fr);
406
+ grid-template-columns: 264px minmax(0, 1fr);
407
407
  }
408
408
  .workspace-rail,
409
409
  .workspace-widget-panel {
@@ -416,6 +416,15 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
416
416
  gap: 18px;
417
417
  border-right: 1px solid #e8e8e8;
418
418
  padding: 18px 14px;
419
+ /* Lock rail to viewport height so the bottom status pill never
420
+ scrolls off the device fold (long thread lists scroll inside
421
+ .workspace-rail-thread-scroll instead of stretching the rail). */
422
+ height: 100vh;
423
+ max-height: 100vh;
424
+ min-height: 0;
425
+ position: sticky;
426
+ top: 0;
427
+ overflow: hidden;
419
428
  }
420
429
  .workspace-brand {
421
430
  display: flex;
@@ -425,8 +434,8 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
425
434
  font-weight: 650;
426
435
  }
427
436
  .workspace-mark {
428
- width: 26px;
429
- height: 26px;
437
+ width: 28px;
438
+ height: 28px;
430
439
  display: grid;
431
440
  place-items: center;
432
441
  border: 1px solid #dedede;
@@ -435,6 +444,7 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
435
444
  color: #555;
436
445
  font-size: 12px;
437
446
  overflow: hidden;
447
+ flex-shrink: 0;
438
448
  }
439
449
  .workspace-mark img {
440
450
  width: 100%;
@@ -478,7 +488,12 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
478
488
  }
479
489
  .workspace-surface {
480
490
  min-width: 0;
491
+ min-height: 0;
492
+ max-height: 100vh;
481
493
  padding: 16px;
494
+ display: flex;
495
+ flex-direction: column;
496
+ overflow: hidden;
482
497
  }
483
498
  .workspace-toolbar {
484
499
  min-height: 48px;
@@ -508,8 +523,11 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
508
523
  justify-content: flex-end;
509
524
  gap: 8px;
510
525
  }
511
- .workspace-toolbar-actions a,
512
- .workspace-toolbar-actions span {
526
+ /* Direct-child scoping — must NOT cascade into nested popovers/pickers
527
+ rendered inside .workspace-toolbar-actions (e.g. the picker row spans
528
+ would otherwise get treated as 30px pills with their own border). */
529
+ .workspace-toolbar-actions > a,
530
+ .workspace-toolbar-actions > span {
513
531
  min-height: 30px;
514
532
  display: inline-flex;
515
533
  align-items: center;
@@ -527,21 +545,32 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
527
545
  .workspace-add-widget {
528
546
  font: inherit;
529
547
  }
530
- .workspace-toolbar-actions button,
531
- .workspace-tabs button {
548
+ /* Direct-child scoping — the unified toolbar button treatment must NOT
549
+ cascade into nested popovers, dropdowns, or pickers rendered inside
550
+ .workspace-toolbar-actions (those carry their own styling). */
551
+ .workspace-toolbar-actions > button,
552
+ .workspace-tabs > button {
532
553
  min-height: 30px;
533
554
  display: inline-flex;
534
555
  align-items: center;
535
556
  justify-content: center;
536
557
  gap: 6px;
537
- border: 1px solid #dedede;
558
+ border: 1px solid #e5e7eb;
538
559
  border-radius: 6px;
539
560
  background: #ffffff;
540
561
  color: #4f4f4f;
541
562
  padding: 0 10px;
563
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
564
+ transition: background .12s ease, border-color .12s ease, box-shadow .12s ease;
565
+ }
566
+ .workspace-toolbar-actions > button:hover,
567
+ .workspace-tabs > button:hover {
568
+ background: #fafafa;
569
+ border-color: #d1d5db;
570
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.07);
542
571
  }
543
- .workspace-toolbar-actions button svg,
544
- .workspace-tabs button svg {
572
+ .workspace-toolbar-actions > button svg,
573
+ .workspace-tabs > button svg {
545
574
  flex: 0 0 auto;
546
575
  }
547
576
  .workspace-table,
@@ -549,7 +578,14 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
549
578
  border: 1px solid #e7e7e7;
550
579
  border-radius: 8px;
551
580
  background: #ffffff;
552
- overflow: hidden;
581
+ /* Bounded height with internal scroll — the 16-row × 52px grid
582
+ (832px+) was being clipped on most laptop viewports. Reserves
583
+ ~210px above for the workspace toolbar + dashboard tabs + page
584
+ padding so the rail's bottom status pill stays above the fold. */
585
+ max-height: calc(100vh - 210px);
586
+ overflow-y: auto;
587
+ overscroll-behavior: contain;
588
+ scrollbar-gutter: stable;
553
589
  }
554
590
  .workspace-table {
555
591
  margin-bottom: 14px;
@@ -1870,7 +1906,7 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
1870
1906
  }
1871
1907
  .template-mini-widget.kind-chart { background: #dbeafe; }
1872
1908
  .template-mini-widget.kind-view { background: #fef3c7; }
1873
- .template-mini-widget.kind-iframe { background: #ede9fe; }
1909
+ .template-mini-widget.kind-iframe { background: #e0f2fe; }
1874
1910
  .template-mini-widget.kind-rich-text { background: #dcfce7; }
1875
1911
  .template-card-meta {
1876
1912
  display: flex;
@@ -3544,10 +3580,34 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
3544
3580
  box-shadow: inset 0 0 0 1px #38bdf8;
3545
3581
  }
3546
3582
 
3547
- /* Chart config */
3583
+ /* Chart config — condensed grammar to match the helper Setup tab
3584
+ rhythm. Tighter gaps + smaller labels keeps the chart panel from
3585
+ bleeding past the fold while preserving every existing control. */
3548
3586
  .workspace-chart-config {
3549
3587
  display: grid;
3550
- gap: 12px;
3588
+ gap: 8px;
3589
+ }
3590
+ .workspace-chart-config > section,
3591
+ .workspace-chart-config > div { padding: 4px 0; }
3592
+ .workspace-chart-config h3,
3593
+ .workspace-chart-config h4 {
3594
+ margin: 4px 0 4px;
3595
+ font-size: 11px;
3596
+ font-weight: 600;
3597
+ color: #6b7280;
3598
+ text-transform: uppercase;
3599
+ letter-spacing: 0.04em;
3600
+ }
3601
+ .workspace-chart-config label {
3602
+ font-size: 11.5px;
3603
+ color: #4b5563;
3604
+ }
3605
+ .workspace-chart-config select,
3606
+ .workspace-chart-config input[type="text"],
3607
+ .workspace-chart-config input[type="number"] {
3608
+ height: 28px;
3609
+ font-size: 12px;
3610
+ padding: 0 8px;
3551
3611
  }
3552
3612
  .workspace-chart-type-tabs {
3553
3613
  display: grid;
@@ -3960,19 +4020,105 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
3960
4020
 
3961
4021
  /* Detail panel v2 */
3962
4022
  .dm-detail-v2 { display: flex; flex-direction: column; min-width: 0; }
3963
- .dm-detail-v2-head { padding: 14px 18px 10px; border-bottom: 1px solid #efefef; }
4023
+ /* dm-detail-v2-head / dm-detail-v2-title are kept for legacy callers, but the
4024
+ data-model surface no longer renders that band — the picker moved into the
4025
+ workspace toolbar and the dm-db-toolbar is now the top band of the table
4026
+ surface. */
4027
+ .dm-detail-v2-head { padding: 14px 18px 10px; }
3964
4028
  .dm-detail-v2-title { display: flex; align-items: center; gap: 7px; margin-bottom: 4px; }
3965
4029
  .dm-detail-v2-title h2 { margin: 0; font-size: 15px; font-weight: 600; color: #111827; flex: 1; }
3966
4030
  .dm-detail-v2-meta { display: flex; align-items: center; gap: 10px; padding-left: 21px; font-size: 12px; color: #9ca3af; }
3967
4031
  .dm-detail-v2-meta code { font-size: 11px; color: #6b7280; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; }
3968
- .dm-detail-v3 { border: 1px solid #e5e7eb; border-radius: 12px; background: #fff; overflow: visible; }
3969
- .dm-detail-v3-head { padding-bottom: 14px; }
4032
+ .dm-detail-v3 { border: 1px solid #e5e7eb; border-radius: 12px; background: #fff; overflow: hidden; }
3970
4033
  .dm-picker { position: relative; min-width: 280px; }
3971
4034
  .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; }
3972
4035
  .dm-picker.open .dm-picker-trigger { border-color: #94a3b8; box-shadow: 0 0 0 4px rgba(148,163,184,.14); }
3973
4036
  .dm-picker-trigger-copy { display: grid; min-width: 0; flex: 1; }
3974
4037
  .dm-picker-trigger-copy strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 650; color: #111827; }
3975
4038
  .dm-picker-trigger-copy em { font-style: normal; font-size: 11px; color: #94a3b8; }
4039
+
4040
+ /* Workspace-toolbar variant — only the picker TRIGGER is re-skinned to
4041
+ match the other 30px toolbar buttons. The popover and everything
4042
+ inside it keep their default .dm-picker-* styles untouched. */
4043
+ .workspace-toolbar-actions .dm-picker {
4044
+ min-width: 0;
4045
+ }
4046
+ .workspace-toolbar-actions .dm-picker-trigger {
4047
+ width: auto;
4048
+ min-width: 0;
4049
+ min-height: 30px;
4050
+ height: 30px;
4051
+ padding: 0 10px;
4052
+ border-radius: 6px;
4053
+ border-color: #e5e7eb;
4054
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
4055
+ }
4056
+ .workspace-toolbar-actions .dm-picker-trigger:hover {
4057
+ background: #fafafa;
4058
+ border-color: #d1d5db;
4059
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.07);
4060
+ }
4061
+ .workspace-toolbar-actions .dm-picker.open .dm-picker-trigger {
4062
+ border-color: #9ca3af;
4063
+ box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.18);
4064
+ }
4065
+ /* Hide the field/record meta inside the trigger — the workspace toolbar
4066
+ title block already carries that info, so the trigger only needs the
4067
+ object label + chevron. */
4068
+ .workspace-toolbar-actions .dm-picker-trigger-copy em { display: none; }
4069
+ .workspace-toolbar-actions .dm-picker-trigger-copy strong { font-size: 12px; }
4070
+ .workspace-toolbar-actions .dm-picker-popover {
4071
+ left: auto;
4072
+ right: 0;
4073
+ }
4074
+
4075
+ /* Active-object title block in the workspace toolbar — replaces the
4076
+ hardcoded "WORKSPACE / Data Model" eyebrow. The object icon sits in a
4077
+ small white-card chip BEFORE the title (light grey border, slight
4078
+ dropshadow); generous spacing between chip and title; bold object
4079
+ label on top; regular-weight Fields/Records meta below. */
4080
+ .workspace-toolbar-object {
4081
+ display: flex;
4082
+ flex-direction: column;
4083
+ gap: 4px;
4084
+ min-width: 0;
4085
+ }
4086
+ .workspace-toolbar-object-title {
4087
+ display: inline-flex;
4088
+ align-items: center;
4089
+ gap: 12px;
4090
+ min-width: 0;
4091
+ }
4092
+ .workspace-toolbar-object-icon {
4093
+ display: inline-flex;
4094
+ align-items: center;
4095
+ justify-content: center;
4096
+ width: 28px;
4097
+ height: 28px;
4098
+ border: 1px solid #e5e7eb;
4099
+ border-radius: 7px;
4100
+ background: #ffffff;
4101
+ color: #6b7280;
4102
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
4103
+ flex-shrink: 0;
4104
+ }
4105
+ .workspace-toolbar-object-title h1 {
4106
+ margin: 0;
4107
+ font-size: 17px;
4108
+ font-weight: 650;
4109
+ color: #111827;
4110
+ line-height: 1.2;
4111
+ white-space: nowrap;
4112
+ overflow: hidden;
4113
+ text-overflow: ellipsis;
4114
+ }
4115
+ .workspace-toolbar-object-meta {
4116
+ margin: 0;
4117
+ padding-left: 40px; /* 28px icon chip + 12px gap → sits under the title text */
4118
+ font-size: 12px;
4119
+ font-weight: 400;
4120
+ color: #6b7280;
4121
+ }
3976
4122
  .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; }
3977
4123
  .dm-picker-tabs { display: inline-flex; gap: 6px; padding: 4px; border-radius: 999px; background: #f8fafc; }
3978
4124
  .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; }
@@ -4056,28 +4202,79 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
4056
4202
 
4057
4203
  /* Data Model database grid */
4058
4204
  .dm-db-surface { display: flex; flex-direction: column; gap: 10px; padding: 14px; min-height: 0; flex: 1; background: #fff; overflow: visible; }
4059
- .dm-db-toolbar { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; overflow: visible; }
4205
+ /* Top band of the data-model table surface: action buttons (left) and
4206
+ filter chips (right, only when filters are active) live ABOVE the
4207
+ divider line. The divider is the toolbar's own bottom border,
4208
+ separating the action band from the table rows below.
4209
+ The DOM order is (chips, actions); flex `order` swaps them visually
4210
+ so chips sit right-aligned under the picker dropdown (which holds
4211
+ the Views selector) and action buttons run left-aligned. */
4212
+ .dm-db-toolbar {
4213
+ display: flex;
4214
+ align-items: center;
4215
+ justify-content: space-between;
4216
+ gap: 12px;
4217
+ overflow: visible;
4218
+ padding: 12px 16px;
4219
+ border-bottom: 1px solid #efefef;
4220
+ background: #fff;
4221
+ }
4222
+ .dm-db-toolbar + * { padding-top: 4px; }
4223
+ .dm-db-toolbar .dm-records-actions {
4224
+ order: 1;
4225
+ margin-left: 0;
4226
+ margin-right: auto;
4227
+ justify-content: flex-start;
4228
+ }
4229
+ .dm-db-toolbar .dm-filter-chip-row {
4230
+ order: 2;
4231
+ justify-content: flex-end;
4232
+ margin-left: auto;
4233
+ }
4060
4234
  .dm-db-toolbar-title { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
4061
4235
  .dm-db-toolbar-title strong { font-size: 13px; color: #111827; font-weight: 650; }
4062
4236
  .dm-db-toolbar-title span { font-size: 12px; color: #9ca3af; }
4063
4237
  .dm-inline-panel { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px; border: 1px solid #dfe3e8; border-radius: 10px; background: #fbfdff; }
4064
4238
  .dm-inline-panel input { height: 32px; border: 1px solid #cbd5e1; border-radius: 8px; background: #fff; color: #111827; font: inherit; font-size: 12px; padding: 0 10px; }
4065
- .dm-filter-chip-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-height: 32px; }
4239
+ .dm-filter-chip-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-height: 0; }
4066
4240
  .dm-filter-chip { display: inline-flex; align-items: center; gap: 6px; height: 30px; border: 1px solid #c7d2fe; border-radius: 8px; background: #eef2ff; color: #3730a3; font: inherit; font-size: 12px; padding: 0 10px; cursor: pointer; }
4241
+ .dm-selection-count { border-color: #d1d5db; background: #fff; color: #475569; cursor: default; }
4067
4242
  .dm-filter-chip span { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4068
4243
  .dm-filter-popover { position: absolute; z-index: 40; display: grid; gap: 8px; width: 320px; padding: 10px; border: 1px solid #dbe2ea; border-radius: 10px; background: #fff; box-shadow: 0 18px 42px rgba(15,23,42,.18), 0 3px 10px rgba(15,23,42,.08); }
4069
4244
  .dm-filter-popover input { height: 32px; border: 1px solid #cbd5e1; border-radius: 8px; background: #fff; color: #111827; font: inherit; font-size: 12px; padding: 0 10px; }
4070
- .dm-filter-popover-toolbar { top: 48px; right: 0; }
4245
+ .dm-filter-anchor { position: relative; display: inline-flex; }
4246
+ .dm-filter-popover-toolbar { top: calc(100% + 6px); left: 0; right: auto; }
4071
4247
  .dm-filter-popover-column { top: calc(100% + 6px); left: 0; }
4072
4248
  .dm-filter-popover-actions { display: flex; justify-content: flex-end; gap: 8px; }
4073
- .dm-db-grid-wrap { flex: 1; min-height: 420px; overflow: auto; border: 1px solid #dfe3e8; border-radius: 7px; background: #fff; }
4249
+ .dm-db-grid-wrap { display: flex; flex: 1; min-height: 420px; flex-direction: column; overflow: hidden; border: 1px solid #dfe3e8; border-radius: 7px; background: #fff; }
4250
+ .dm-db-grid-wrap > .dm-db-grid-scroll { flex: 1 1 auto; overflow: auto; }
4074
4251
  .dm-db-grid { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 12px; color: #1f2937; }
4075
4252
  .dm-db-grid th { position: sticky; top: 0; z-index: 1; height: 32px; background: #f8fafc; color: #475569; border-bottom: 1px solid #dfe3e8; border-right: 1px solid #edf0f3; padding: 0; text-align: left; font-weight: 650; white-space: nowrap; }
4076
4253
  .dm-db-grid td { height: 32px; max-width: 260px; border-bottom: 1px solid #f1f5f9; border-right: 1px solid #f1f5f9; padding: 0 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
4077
4254
  .dm-db-grid tbody tr:hover td { background: #f8fafc; }
4078
4255
  .dm-db-grid tbody tr.selected td { background: #eef2ff; }
4256
+ .dm-db-grid tbody tr.multi-selected td { background: #f8fafc; }
4079
4257
  .dm-db-head-btn { display: inline-flex; align-items: center; justify-content: flex-start; width: 100%; height: 32px; gap: 6px; border: 0; background: transparent; color: inherit; font: inherit; font-size: 12px; font-weight: inherit; padding: 0 10px; cursor: pointer; }
4080
4258
  .dm-db-rownum { width: 42px; min-width: 42px; text-align: center !important; color: #94a3b8 !important; background: #f8fafc; font-variant-numeric: tabular-nums; }
4259
+ .dm-row-select { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 32px; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; }
4260
+ .dm-row-select-box { position: relative; display: none; width: 16px; height: 16px; border: 1px solid #d1d5db; border-radius: 5px; background: #fff; box-sizing: border-box; }
4261
+ .dm-row-select:hover .dm-row-select-box, .dm-row-select[aria-pressed="true"] .dm-row-select-box { border-color: #cbd5e1; background: #fff; box-shadow: 0 1px 3px rgba(15,23,42,.14); }
4262
+ .dm-row-select[aria-pressed="true"] .dm-row-select-box { display: inline-flex; }
4263
+ .dm-row-select[aria-pressed="true"] .dm-row-select-box::after { content: ""; position: absolute; left: 5px; top: 3px; width: 4px; height: 7px; border: solid #334155; border-width: 0 1.5px 1.5px 0; transform: rotate(45deg); }
4264
+ .dm-db-grid tbody tr:hover .dm-row-select-box { display: inline-flex; }
4265
+ .dm-row-select[aria-pressed="true"] .dm-row-number, .dm-db-grid tbody tr:hover .dm-row-select .dm-row-number { display: none; }
4266
+ .dm-db-rownum-head { position: sticky; overflow: visible; z-index: 4 !important; }
4267
+ .dm-row-select-head-wrap { position: relative; display: flex; align-items: center; justify-content: center; height: 32px; }
4268
+ .dm-row-select-all { width: 26px; flex: 0 0 26px; }
4269
+ .dm-row-select-menu-btn { display: none; }
4270
+ .dm-db-rownum-head:hover .dm-row-select-menu-btn, .dm-row-select-menu-btn[aria-expanded="true"] { display: none; }
4271
+ .dm-row-select-menu-btn:hover { background: #eef2f7; color: #475569; }
4272
+ .dm-db-rownum-head:hover .dm-row-select-all .dm-row-select-box, .dm-row-select-all[aria-pressed="true"] .dm-row-select-box { display: inline-flex; }
4273
+ .dm-db-rownum-head:hover .dm-row-select-all .dm-row-number, .dm-row-select-all[aria-pressed="true"] .dm-row-number { display: none; }
4274
+ .dm-row-select-menu { position: absolute; top: calc(100% + 6px); left: 6px; z-index: 50; display: grid; gap: 3px; min-width: 150px; padding: 6px; border: 1px solid #dbe2ea; border-radius: 8px; background: #fff; box-shadow: 0 14px 34px rgba(15,23,42,.16), 0 2px 8px rgba(15,23,42,.08); }
4275
+ .dm-row-select-menu button { display: flex; align-items: center; height: 28px; border: 0; border-radius: 6px; background: transparent; color: #334155; font: inherit; font-size: 12px; padding: 0 8px; text-align: left; cursor: pointer; }
4276
+ .dm-row-select-menu button:hover { background: #f1f5f9; }
4277
+ .dm-row-select-menu button:disabled { opacity: .45; cursor: not-allowed; }
4081
4278
  .dm-db-field-type { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; margin-right: 5px; border-radius: 4px; color: #64748b; background: #eef2f7; vertical-align: middle; }
4082
4279
  .dm-db-add-field { position: relative; min-width: 118px; }
4083
4280
  .dm-db-add-field button { display: inline-flex; align-items: center; gap: 4px; border: 0; background: transparent; color: #64748b; font: inherit; font-size: 12px; cursor: pointer; }
@@ -4094,6 +4291,15 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
4094
4291
  .dm-field-creator-actions { display: flex; justify-content: flex-end; gap: 8px; }
4095
4292
  .dm-db-empty-cell { background: #fbfdff; }
4096
4293
  .dm-db-new-row td { color: #64748b; background: #fbfdff; font-weight: 600; }
4294
+ .dm-pagination-bar { display: flex; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: 12px; min-height: 36px; padding: 8px 14px; background: #fff; color: #64748b; font-size: 12px; border-top: 1px solid #edf0f3; }
4295
+ .dm-pagination-summary { white-space: nowrap; }
4296
+ .dm-pagination-controls { display: inline-flex; align-items: center; gap: 8px; }
4297
+ .dm-page-size-control { display: inline-flex; align-items: center; gap: 6px; color: #64748b; }
4298
+ .dm-page-size-control select { height: 28px; border: 1px solid #dbe2ea; border-radius: 6px; background: #fff; color: #334155; font: inherit; font-size: 12px; padding: 0 22px 0 8px; }
4299
+ .dm-pagination-btn { height: 28px; border: 1px solid #dbe2ea; border-radius: 6px; background: #fff; color: #334155; font: inherit; font-size: 12px; padding: 0 10px; cursor: pointer; }
4300
+ .dm-pagination-btn:hover:not(:disabled) { background: #f8fafc; border-color: #cbd5e1; }
4301
+ .dm-pagination-btn:disabled { opacity: .45; cursor: not-allowed; }
4302
+ .dm-pagination-page { min-width: 44px; text-align: center; color: #64748b; }
4097
4303
  .dm-db-status { display: inline-flex; align-items: center; gap: 5px; height: 20px; border: 1px solid #e2e8f0; border-radius: 999px; padding: 0 8px; background: #f8fafc; color: #64748b; font-size: 11px; font-weight: 650; }
4098
4304
  .dm-db-status span { width: 6px; height: 6px; border-radius: 50%; background: #94a3b8; }
4099
4305
  .dm-db-status.ok { border-color: #bbf7d0; background: #f0fdf4; color: #166534; }
@@ -4291,6 +4497,1159 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
4291
4497
  .dm-resolver-no-targets { display: flex; align-items: center; gap: 7px; padding: 8px 10px; background: #fffbeb; border: 1px solid #fde68a; border-radius: 6px; font-size: 12px; color: #92400e; }
4292
4498
  .dm-detail-icon { color: #6b7280; }
4293
4499
 
4500
+
4501
+ /* ─── Workspace Helper Sidecar ─────────────────────────────────────────────── */
4502
+ .dm-sidecar-backdrop { position: fixed; inset: 0; z-index: 79; }
4503
+ .dm-helper-sidecar { position: fixed; top: 0; right: 0; bottom: 0; z-index: 80; background: #fff; border-left: 1px solid #e5e7eb; box-shadow: -8px 0 40px rgba(15,23,42,.13); display: flex; flex-direction: column; min-width: 320px; max-width: 80vw; }
4504
+ .dm-sidecar-drag-handle { position: absolute; left: 0; top: 0; bottom: 0; width: 6px; cursor: ew-resize; z-index: 2; background: transparent; }
4505
+ .dm-sidecar-drag-handle:hover { background: rgba(63,104,255,.12); }
4506
+ .dm-sidecar-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 14px 18px; border-bottom: 1px solid #e5e7eb; flex-shrink: 0; }
4507
+ .dm-sidecar-header-left { display: flex; align-items: center; gap: 8px; }
4508
+ .dm-sidecar-icon { color: #3f68ff; }
4509
+ .dm-sidecar-title { font-size: 14px; font-weight: 600; color: #111827; }
4510
+ /* Header-right action cluster — single source for gear (Setup toggle) and
4511
+ close (X), replaces the old full-width Assistant/Setup tab strip. */
4512
+ .dm-sidecar-header-right {
4513
+ display: inline-flex;
4514
+ align-items: center;
4515
+ gap: 2px;
4516
+ }
4517
+ .dm-sidecar-icon-btn {
4518
+ display: inline-flex;
4519
+ align-items: center;
4520
+ justify-content: center;
4521
+ width: 28px;
4522
+ height: 28px;
4523
+ border: 1px solid #e5e7eb;
4524
+ border-radius: 6px;
4525
+ background: #ffffff;
4526
+ color: #6b7280;
4527
+ cursor: pointer;
4528
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
4529
+ transition: background .12s ease, color .12s ease, border-color .12s ease, box-shadow .12s ease;
4530
+ }
4531
+ .dm-sidecar-icon-btn:hover {
4532
+ background: #fafafa;
4533
+ border-color: #d1d5db;
4534
+ color: #111827;
4535
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.07);
4536
+ }
4537
+ /* No persistent active state — the icon itself swaps to ArrowLeft when
4538
+ the Setup surface is open, which is the user's cue. */
4539
+ .dm-sidecar-icon-btn:focus-visible {
4540
+ outline: 2px solid #bfdbfe;
4541
+ outline-offset: 1px;
4542
+ }
4543
+ /* Legacy `.dm-sidecar-tabs` / `.dm-sidecar-tab` / `.dm-sidecar-close`
4544
+ rules retired — the header cluster above owns both affordances now. */
4545
+ .dm-sidecar-body { flex: 1; overflow-y: auto; padding: 16px; display: grid; gap: 12px; align-content: start; }
4546
+
4547
+ /* Streaming surface */
4548
+ .dm-helper-stream { padding: 12px 14px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; font-size: 13px; color: #374151; line-height: 1.6; white-space: pre-wrap; word-break: break-word; }
4549
+ @keyframes blink { 0%,100% { opacity: 1; } 50% { opacity: 0; } }
4550
+ .dm-stream-cursor { display: inline-block; width: 2px; height: 1em; background: #3f68ff; vertical-align: text-bottom; margin-left: 1px; animation: blink 1s step-end infinite; }
4551
+
4552
+ /* Proposals */
4553
+ .dm-helper-result { display: grid; gap: 10px; }
4554
+ .dm-helper-summary { display: flex; align-items: flex-start; gap: 8px; padding: 10px 12px; background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px; font-size: 13px; color: #1e40af; }
4555
+ .dm-helper-warnings { display: grid; gap: 4px; }
4556
+ .dm-helper-warning { display: flex; align-items: flex-start; gap: 6px; padding: 7px 10px; background: #fffbeb; border: 1px solid #fde68a; border-radius: 6px; font-size: 12px; color: #92400e; }
4557
+ .dm-helper-error { display: flex; align-items: flex-start; gap: 6px; padding: 9px 12px; background: #fef2f2; border: 1px solid #fecaca; border-radius: 7px; font-size: 13px; color: #dc2626; margin-top: 4px; }
4558
+ .dm-helper-proposals-header { display: flex; align-items: center; justify-content: space-between; }
4559
+ .dm-helper-proposals { display: grid; gap: 6px; }
4560
+ .dm-helper-proposal { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; cursor: pointer; transition: border-color .1s, background .1s; }
4561
+ .dm-helper-proposal:hover { background: #f9fafb; border-color: #d1d5db; }
4562
+ .dm-helper-proposal.accepted { border-color: #3f68ff; background: #eff6ff; }
4563
+ .dm-helper-proposal input[type=checkbox] { margin-top: 2px; flex-shrink: 0; accent-color: #3f68ff; }
4564
+ .dm-helper-proposal-body { display: grid; gap: 2px; }
4565
+ .dm-helper-proposal-type { font-size: 12px; font-weight: 600; color: #111827; font-family: monospace; }
4566
+ .dm-helper-proposal-field { font-size: 11px; color: #6b7280; }
4567
+ .dm-helper-proposal-rationale { margin: 0; font-size: 12px; color: #4b5563; line-height: 1.4; }
4568
+ .dm-helper-apply-result { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border: 1px solid #d1fae5; background: #ecfdf5; border-radius: 8px; font-size: 13px; color: #065f46; }
4569
+ .dm-helper-apply-result.is-error { border-color: #fecaca; background: #fef2f2; color: #b91c1c; }
4570
+ .dm-helper-empty-hint { padding: 12px 14px; border: 1px dashed #e5e7eb; border-radius: 8px; background: #fafafa; color: #6b7280; font-size: 12px; line-height: 1.5; }
4571
+ .dm-helper-empty-hint p { margin: 0; }
4572
+ .dm-helper-proposal-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
4573
+ .dm-helper-proposal-payload { margin: 0; font-size: 11px; color: #374151; background: #f3f4f6; border-radius: 5px; padding: 3px 7px; display: inline-block; font-family: monospace; line-height: 1.4; word-break: break-all; }
4574
+ .dm-helper-proposal-confidence { display: inline-flex; align-items: center; height: 18px; padding: 0 6px; border-radius: 99px; background: #eff6ff; border: 1px solid #bfdbfe; font-size: 11px; font-weight: 600; color: #1e40af; }
4575
+ .dm-helper-skipped { display: grid; gap: 4px; padding: 10px 12px; border: 1px solid #fde68a; background: #fffbeb; border-radius: 8px; }
4576
+ .dm-helper-skipped-row { display: flex; align-items: baseline; gap: 6px; font-size: 11px; color: #92400e; }
4577
+ .dm-helper-skipped-reason { color: #b45309; }
4578
+ .dm-thread-open-link { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 500; color: #3f68ff; background: transparent; border: 0; padding: 0; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; }
4579
+ .dm-thread-open-link:hover { color: #1e40af; }
4580
+ .dm-thread-open-link:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 2px; border-radius: 3px; }
4581
+
4582
+ /* Helper sidecar — intent pills (4 primary + More dropdown). Visible only
4583
+ on a brand-new thread, before the user has sent any messages. */
4584
+ .dm-helper-intent-pills { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
4585
+ .dm-helper-pill { display: inline-flex; align-items: center; gap: 4px; height: 26px; padding: 0 10px; border-radius: 99px; border: 1px solid #e5e7eb; background: #fff; color: #374151; font-size: 12px; font-weight: 500; cursor: pointer; transition: background .1s, border-color .1s, color .1s; }
4586
+ .dm-helper-pill:hover:not(:disabled) { background: #f9fafb; border-color: #d1d5db; }
4587
+ .dm-helper-pill.active { background: #eff6ff; border-color: #bfdbfe; color: #1e40af; }
4588
+ .dm-helper-pill:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
4589
+ .dm-helper-pill:disabled { opacity: .55; cursor: not-allowed; }
4590
+ .dm-helper-pill-more-wrap { position: relative; display: inline-flex; }
4591
+ .dm-helper-pill-more { padding-right: 6px; }
4592
+ .dm-helper-pill-menu { position: absolute; top: calc(100% + 4px); left: 0; min-width: 180px; background: #fff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 8px 24px rgba(15, 23, 42, 0.10); padding: 4px; display: flex; flex-direction: column; gap: 1px; z-index: 90; }
4593
+ .dm-helper-pill-menu-item { display: flex; align-items: center; height: 28px; padding: 0 10px; font-size: 12px; color: #374151; background: transparent; border: 0; border-radius: 5px; cursor: pointer; text-align: left; }
4594
+ .dm-helper-pill-menu-item:hover { background: #f9fafb; color: #111827; }
4595
+ .dm-helper-pill-menu-item.active { background: #eff6ff; color: #1e40af; }
4596
+
4597
+ /* Active-mode indicator — shown after the thread has activated, replaces
4598
+ the pill row. Compact, non-cluttering. */
4599
+ .dm-helper-mode-row { display: inline-flex; align-items: center; gap: 6px; padding: 3px 9px; border-radius: 99px; background: #f3f4f6; border: 1px solid #e5e7eb; align-self: flex-start; }
4600
+ .dm-helper-mode-label { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: #6b7280; }
4601
+ .dm-helper-mode-value { font-size: 12px; font-weight: 600; color: #111827; }
4602
+
4603
+ /* Conversation list inside the sidecar. User turns right-aligned, assistant
4604
+ turns left-aligned. Pending assistant turn uses the existing blink cursor. */
4605
+ /* Multi-turn conversation — ChatGPT-grade simple. User bubble on the
4606
+ right (grey rounded chip, fits-content); assistant bubble on the left
4607
+ as a transparent full-width markdown block. Subtle horizontal divider
4608
+ between consecutive turns keeps the rhythm. */
4609
+ .dm-helper-messages { display: flex; flex-direction: column; gap: 0; }
4610
+ .dm-helper-turn {
4611
+ display: flex;
4612
+ flex-direction: column;
4613
+ padding: 12px 2px;
4614
+ border-bottom: 1px solid #f3f4f6;
4615
+ }
4616
+ .dm-helper-turn:last-child { border-bottom: 0; }
4617
+ .dm-helper-turn.role-user { align-items: flex-end; }
4618
+ .dm-helper-turn.role-assistant { align-items: stretch; }
4619
+ .dm-helper-turn.role-system { align-items: stretch; }
4620
+
4621
+ .dm-helper-bubble-user {
4622
+ max-width: 88%;
4623
+ padding: 7px 12px;
4624
+ border-radius: 14px;
4625
+ background: #f1f1f1;
4626
+ color: #2c2c2c;
4627
+ font-size: 13px;
4628
+ line-height: 1.5;
4629
+ white-space: pre-wrap;
4630
+ word-break: break-word;
4631
+ }
4632
+
4633
+ .dm-helper-bubble-assistant {
4634
+ width: 100%;
4635
+ color: #1f2937;
4636
+ font-size: 13.5px;
4637
+ line-height: 1.55;
4638
+ word-break: break-word;
4639
+ }
4640
+ .dm-helper-bubble-assistant > *:first-child { margin-top: 0; }
4641
+ .dm-helper-bubble-assistant > *:last-child { margin-bottom: 0; }
4642
+ .dm-helper-bubble-assistant p { margin: 0 0 8px; }
4643
+ .dm-helper-bubble-assistant h1,
4644
+ .dm-helper-bubble-assistant h2,
4645
+ .dm-helper-bubble-assistant h3,
4646
+ .dm-helper-bubble-assistant h4 {
4647
+ margin: 14px 0 6px;
4648
+ font-weight: 650;
4649
+ color: #111827;
4650
+ line-height: 1.3;
4651
+ }
4652
+ .dm-helper-bubble-assistant h1 { font-size: 16px; }
4653
+ .dm-helper-bubble-assistant h2 { font-size: 15px; }
4654
+ .dm-helper-bubble-assistant h3 { font-size: 14px; }
4655
+ .dm-helper-bubble-assistant h4 { font-size: 13px; }
4656
+ .dm-helper-bubble-assistant ul,
4657
+ .dm-helper-bubble-assistant ol { margin: 4px 0 8px; padding-left: 20px; }
4658
+ .dm-helper-bubble-assistant li { margin: 2px 0; }
4659
+ .dm-helper-bubble-assistant strong { font-weight: 650; color: #111827; }
4660
+ .dm-helper-bubble-assistant em { font-style: italic; }
4661
+ .dm-helper-bubble-assistant a { color: #1e40af; text-decoration: underline; text-underline-offset: 2px; }
4662
+ .dm-helper-bubble-assistant a:hover { color: #1e3a8a; }
4663
+ .dm-helper-bubble-assistant code {
4664
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
4665
+ font-size: 12.5px;
4666
+ padding: 1px 5px;
4667
+ border-radius: 4px;
4668
+ background: #f3f4f6;
4669
+ color: #111827;
4670
+ }
4671
+ .dm-helper-bubble-assistant pre {
4672
+ margin: 6px 0 10px;
4673
+ padding: 10px 12px;
4674
+ background: #0b1220;
4675
+ color: #e5e7eb;
4676
+ border-radius: 8px;
4677
+ overflow-x: auto;
4678
+ font-size: 12.5px;
4679
+ line-height: 1.55;
4680
+ }
4681
+ .dm-helper-bubble-assistant pre code {
4682
+ background: transparent;
4683
+ color: inherit;
4684
+ padding: 0;
4685
+ }
4686
+ .dm-helper-bubble-assistant blockquote {
4687
+ margin: 6px 0 10px;
4688
+ padding: 4px 12px;
4689
+ border-left: 3px solid #d1d5db;
4690
+ color: #4b5563;
4691
+ font-style: normal;
4692
+ }
4693
+ .dm-helper-bubble-assistant hr {
4694
+ margin: 10px 0;
4695
+ border: 0;
4696
+ border-top: 1px solid #e5e7eb;
4697
+ }
4698
+ .dm-helper-bubble-assistant table {
4699
+ border-collapse: collapse;
4700
+ width: 100%;
4701
+ margin: 6px 0 10px;
4702
+ font-size: 12.5px;
4703
+ }
4704
+ .dm-helper-bubble-assistant th,
4705
+ .dm-helper-bubble-assistant td {
4706
+ padding: 6px 8px;
4707
+ border: 1px solid #e5e7eb;
4708
+ text-align: left;
4709
+ vertical-align: top;
4710
+ }
4711
+ .dm-helper-bubble-assistant th { background: #f9fafb; font-weight: 600; color: #111827; }
4712
+
4713
+ .dm-helper-bubble-pending { color: #6b7280; font-style: normal; min-height: 24px; display: inline-flex; align-items: center; }
4714
+
4715
+ /* Three-dot typing indicator used while the assistant is streaming. */
4716
+ /* Tool-call card — one per applied proposal. Thin agnostic component:
4717
+ icon + dynamic title + chevron-accordion JSON + Open navigation.
4718
+ Closes the no-code success loop in the user's mental model. */
4719
+ .dm-helper-toolcall-stack {
4720
+ display: flex;
4721
+ flex-direction: column;
4722
+ gap: 6px;
4723
+ margin-top: 6px;
4724
+ }
4725
+ .dm-helper-toolcall {
4726
+ width: 100%;
4727
+ border: 1px solid #e5e7eb;
4728
+ border-radius: 5px;
4729
+ background: #ffffff;
4730
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
4731
+ overflow: hidden;
4732
+ }
4733
+ .dm-helper-toolcall-row {
4734
+ width: 100%;
4735
+ min-height: 36px;
4736
+ display: grid;
4737
+ grid-template-columns: 20px 1fr auto;
4738
+ align-items: center;
4739
+ gap: 8px;
4740
+ padding: 8px 12px;
4741
+ background: transparent;
4742
+ border: 0;
4743
+ cursor: pointer;
4744
+ font: inherit;
4745
+ text-align: left;
4746
+ color: #111827;
4747
+ transition: background .12s ease;
4748
+ }
4749
+ .dm-helper-toolcall-row:hover { background: #fafafa; }
4750
+ .dm-helper-toolcall-icon { color: #9ca3af; flex-shrink: 0; }
4751
+ .dm-helper-toolcall-title {
4752
+ font-size: 13px;
4753
+ font-weight: 500;
4754
+ color: #2c2c2c;
4755
+ white-space: nowrap;
4756
+ overflow: hidden;
4757
+ text-overflow: ellipsis;
4758
+ }
4759
+ .dm-helper-toolcall-chevron {
4760
+ color: #9ca3af;
4761
+ transition: transform .15s ease;
4762
+ flex-shrink: 0;
4763
+ }
4764
+ .dm-helper-toolcall-chevron.is-open { transform: rotate(180deg); }
4765
+ .dm-helper-toolcall-body {
4766
+ background: #f9fafb;
4767
+ border-top: 1px solid #e5e7eb;
4768
+ padding: 8px 10px;
4769
+ box-shadow: inset 0 1px 2px rgba(15, 23, 42, 0.04);
4770
+ }
4771
+ .dm-helper-toolcall-content {
4772
+ margin: 0 0 8px;
4773
+ padding: 6px 8px;
4774
+ background: #ffffff;
4775
+ border: 1px solid #e5e7eb;
4776
+ border-radius: 4px;
4777
+ font-size: 12px;
4778
+ line-height: 1.5;
4779
+ color: #4b5563;
4780
+ white-space: pre-wrap;
4781
+ word-break: break-word;
4782
+ max-height: 140px;
4783
+ overflow-y: auto;
4784
+ }
4785
+ .dm-helper-toolcall-json {
4786
+ margin: 0;
4787
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
4788
+ font-size: 11.5px;
4789
+ line-height: 1.5;
4790
+ color: #374151;
4791
+ white-space: pre-wrap;
4792
+ word-break: break-word;
4793
+ max-height: 240px;
4794
+ overflow-y: auto;
4795
+ }
4796
+ .dm-helper-toolcall-open {
4797
+ display: inline-flex;
4798
+ align-items: center;
4799
+ gap: 4px;
4800
+ height: 24px;
4801
+ padding: 0 9px;
4802
+ margin: 6px 10px 8px;
4803
+ border: 1px solid #d1d5db;
4804
+ border-radius: 5px;
4805
+ background: #ffffff;
4806
+ color: #2c2c2c;
4807
+ font: inherit;
4808
+ font-size: 11.5px;
4809
+ font-weight: 500;
4810
+ cursor: pointer;
4811
+ transition: background .12s ease, border-color .12s ease;
4812
+ }
4813
+ .dm-helper-toolcall-open:hover {
4814
+ background: #f5f5f5;
4815
+ border-color: #9ca3af;
4816
+ }
4817
+
4818
+ .dm-helper-typing {
4819
+ display: inline-flex;
4820
+ align-items: center;
4821
+ gap: 4px;
4822
+ padding: 2px 0;
4823
+ }
4824
+ .dm-helper-typing-dot {
4825
+ width: 6px;
4826
+ height: 6px;
4827
+ border-radius: 50%;
4828
+ background: #9ca3af;
4829
+ animation: dm-helper-typing-bounce 1.1s infinite ease-in-out both;
4830
+ }
4831
+ .dm-helper-typing-dot:nth-child(1) { animation-delay: -0.32s; }
4832
+ .dm-helper-typing-dot:nth-child(2) { animation-delay: -0.16s; }
4833
+ .dm-helper-typing-dot:nth-child(3) { animation-delay: 0s; }
4834
+ @keyframes dm-helper-typing-bounce {
4835
+ 0%, 80%, 100% { transform: scale(0.72); opacity: 0.55; }
4836
+ 40% { transform: scale(1); opacity: 1; }
4837
+ }
4838
+
4839
+ .dm-helper-bubble-system {
4840
+ display: inline-block;
4841
+ padding: 4px 10px;
4842
+ border-radius: 99px;
4843
+ background: #f3f4f6;
4844
+ color: #6b7280;
4845
+ border: 1px solid #e5e7eb;
4846
+ font-size: 11.5px;
4847
+ font-weight: 500;
4848
+ }
4849
+
4850
+ /* ─── HelperSidecar — Setup tab (state-driven, editable, ChatGPT-clean) ── */
4851
+ .dm-helper-setup-body {
4852
+ display: flex;
4853
+ flex-direction: column;
4854
+ gap: 14px;
4855
+ padding: 16px;
4856
+ overflow-y: auto;
4857
+ }
4858
+ .dm-helper-setup-intro {
4859
+ margin: 0;
4860
+ font-size: 12.5px;
4861
+ color: #6b7280;
4862
+ line-height: 1.5;
4863
+ }
4864
+
4865
+ .dm-helper-setup-status {
4866
+ display: flex;
4867
+ flex-direction: column;
4868
+ gap: 4px;
4869
+ padding: 12px 14px;
4870
+ border: 1px solid #e5e7eb;
4871
+ border-radius: 10px;
4872
+ background: #fafafa;
4873
+ transition: background .12s ease, border-color .12s ease;
4874
+ }
4875
+ .dm-helper-setup-status.state-connected { background: #f0fdf4; border-color: #bbf7d0; }
4876
+ .dm-helper-setup-status.state-unreachable { background: #fffbeb; border-color: #fde68a; }
4877
+ .dm-helper-setup-status.state-unconfigured { background: #f5f3ff; border-color: #ddd6fe; }
4878
+ .dm-helper-setup-status.state-checking { background: #f9fafb; border-color: #e5e7eb; }
4879
+
4880
+ .dm-helper-setup-status-row {
4881
+ display: flex;
4882
+ align-items: center;
4883
+ gap: 8px;
4884
+ }
4885
+ .dm-helper-setup-status-label {
4886
+ flex: 1;
4887
+ font-size: 13px;
4888
+ font-weight: 600;
4889
+ color: #111827;
4890
+ }
4891
+ .dm-helper-setup-status-meta {
4892
+ font-size: 12px;
4893
+ color: #4b5563;
4894
+ line-height: 1.5;
4895
+ padding-left: 16px;
4896
+ }
4897
+ .dm-helper-setup-status.state-connected .dm-helper-setup-status-meta {
4898
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
4899
+ font-size: 11.5px;
4900
+ color: #15803d;
4901
+ }
4902
+
4903
+ .dm-helper-setup-recheck {
4904
+ height: 26px;
4905
+ padding: 0 10px;
4906
+ border: 1px solid #d1d5db;
4907
+ border-radius: 6px;
4908
+ background: #fff;
4909
+ color: #2c2c2c;
4910
+ font: inherit;
4911
+ font-size: 12px;
4912
+ cursor: pointer;
4913
+ transition: background .12s ease, border-color .12s ease;
4914
+ }
4915
+ .dm-helper-setup-recheck:hover:not(:disabled) {
4916
+ background: #f9fafb;
4917
+ border-color: #9ca3af;
4918
+ }
4919
+ .dm-helper-setup-recheck:disabled { opacity: .55; cursor: not-allowed; }
4920
+
4921
+ .dm-helper-setup-section {
4922
+ display: flex;
4923
+ flex-direction: column;
4924
+ gap: 6px;
4925
+ }
4926
+ .dm-helper-setup-label {
4927
+ margin: 0;
4928
+ font-size: 12px;
4929
+ font-weight: 600;
4930
+ color: #374151;
4931
+ }
4932
+ .dm-helper-setup-input,
4933
+ .dm-helper-setup-select {
4934
+ width: 100%;
4935
+ height: 34px;
4936
+ padding: 0 10px;
4937
+ border: 1px solid #d1d5db;
4938
+ border-radius: 7px;
4939
+ background: #ffffff;
4940
+ color: #111827;
4941
+ font: inherit;
4942
+ font-size: 13px;
4943
+ box-sizing: border-box;
4944
+ transition: border-color .12s ease, box-shadow .12s ease;
4945
+ }
4946
+ .dm-helper-setup-input::placeholder { color: #9ca3af; }
4947
+ .dm-helper-setup-input:focus,
4948
+ .dm-helper-setup-select:focus {
4949
+ outline: none;
4950
+ border-color: #6b7280;
4951
+ box-shadow: 0 0 0 3px rgba(0,0,0,.06);
4952
+ }
4953
+ .dm-helper-setup-input:disabled,
4954
+ .dm-helper-setup-select:disabled {
4955
+ background: #f9fafb;
4956
+ color: #6b7280;
4957
+ cursor: not-allowed;
4958
+ }
4959
+ .dm-helper-setup-select {
4960
+ appearance: none;
4961
+ -webkit-appearance: none;
4962
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
4963
+ background-repeat: no-repeat;
4964
+ background-position: right 10px center;
4965
+ padding-right: 32px;
4966
+ }
4967
+
4968
+ .dm-helper-setup-quick-row {
4969
+ display: flex;
4970
+ flex-wrap: wrap;
4971
+ align-items: center;
4972
+ gap: 4px;
4973
+ margin-top: 2px;
4974
+ }
4975
+ .dm-helper-setup-quick-label {
4976
+ font-size: 11px;
4977
+ color: #6b7280;
4978
+ margin-right: 4px;
4979
+ }
4980
+ .dm-helper-setup-quick-pill {
4981
+ height: 22px;
4982
+ padding: 0 8px;
4983
+ border: 1px solid #e5e7eb;
4984
+ border-radius: 99px;
4985
+ background: #fff;
4986
+ color: #4b5563;
4987
+ font: inherit;
4988
+ font-size: 11px;
4989
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
4990
+ cursor: pointer;
4991
+ transition: background .12s ease, border-color .12s ease, color .12s ease;
4992
+ }
4993
+ .dm-helper-setup-quick-pill:hover {
4994
+ background: #f9fafb;
4995
+ border-color: #d1d5db;
4996
+ color: #111827;
4997
+ }
4998
+ .dm-helper-setup-quick-pill.active {
4999
+ background: #eef2ff;
5000
+ border-color: #c7d2fe;
5001
+ color: #1e3a8a;
5002
+ }
5003
+
5004
+ .dm-helper-setup-helper-text {
5005
+ font-size: 11.5px;
5006
+ color: #6b7280;
5007
+ }
5008
+ .dm-helper-setup-helper-text strong { color: #111827; font-weight: 600; }
5009
+
5010
+ .dm-helper-setup-actions {
5011
+ display: flex;
5012
+ align-items: center;
5013
+ gap: 10px;
5014
+ flex-wrap: wrap;
5015
+ padding-top: 2px;
5016
+ }
5017
+ .dm-helper-setup-save {
5018
+ height: 34px;
5019
+ padding: 0 14px;
5020
+ border: 0;
5021
+ border-radius: 7px;
5022
+ background: #111827;
5023
+ color: #fff;
5024
+ font: inherit;
5025
+ font-size: 13px;
5026
+ font-weight: 500;
5027
+ cursor: pointer;
5028
+ transition: background .12s ease, opacity .12s ease;
5029
+ }
5030
+ .dm-helper-setup-save:hover:not(:disabled) { background: #000; }
5031
+ .dm-helper-setup-save:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 2px; }
5032
+ .dm-helper-setup-save:disabled {
5033
+ background: #d1d5db;
5034
+ color: #fff;
5035
+ cursor: not-allowed;
5036
+ }
5037
+ .dm-helper-setup-save-ok {
5038
+ font-size: 12px;
5039
+ color: #15803d;
5040
+ font-weight: 500;
5041
+ }
5042
+ .dm-helper-setup-save-error {
5043
+ font-size: 12px;
5044
+ color: #b91c1c;
5045
+ }
5046
+
5047
+ .dm-helper-setup-guide {
5048
+ display: flex;
5049
+ flex-direction: column;
5050
+ gap: 6px;
5051
+ margin-top: 4px;
5052
+ padding-top: 12px;
5053
+ border-top: 1px solid #f3f4f6;
5054
+ }
5055
+ .dm-helper-setup-command {
5056
+ margin: 0;
5057
+ padding: 10px 12px;
5058
+ background: #0b1220;
5059
+ color: #e5e7eb;
5060
+ border-radius: 7px;
5061
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
5062
+ font-size: 12.5px;
5063
+ overflow-x: auto;
5064
+ white-space: pre;
5065
+ }
5066
+ .dm-helper-setup-copy {
5067
+ align-self: flex-start;
5068
+ height: 28px;
5069
+ padding: 0 12px;
5070
+ border: 1px solid #d1d5db;
5071
+ border-radius: 6px;
5072
+ background: #fff;
5073
+ color: #2c2c2c;
5074
+ font: inherit;
5075
+ font-size: 12px;
5076
+ cursor: pointer;
5077
+ transition: background .12s ease, border-color .12s ease;
5078
+ }
5079
+ .dm-helper-setup-copy:hover {
5080
+ background: #f9fafb;
5081
+ border-color: #9ca3af;
5082
+ }
5083
+
5084
+ /* Setup tab */
5085
+ .dm-helper-setup-section { display: grid; gap: 4px; padding: 10px 0; border-bottom: 1px solid #f3f4f6; }
5086
+ .dm-helper-setup-section:last-child { border-bottom: none; }
5087
+ .dm-helper-setup-value { display: block; font-size: 12px; color: #374151; background: #f3f4f6; border-radius: 5px; padding: 6px 10px; word-break: break-all; font-family: monospace; }
5088
+ .dm-helper-setup-badge { display: inline-flex; align-items: center; height: 22px; padding: 0 10px; border-radius: 99px; background: #f3f4f6; color: #374151; font-size: 12px; font-weight: 600; }
5089
+ .dm-helper-setup-command { margin: 0; padding: 10px 12px; background: #1e293b; color: #e2e8f0; border-radius: 8px; font-size: 13px; font-family: monospace; white-space: pre; }
5090
+ .dm-helper-connection-row { display: flex; align-items: center; gap: 8px; }
5091
+ .dm-helper-connection-label { font-size: 13px; color: #374151; flex: 1; }
5092
+ .dm-helper-recheck { font-size: 12px !important; padding: 3px 8px !important; height: 26px !important; }
5093
+ .dm-connection-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
5094
+ .dm-connection-ok { background: #22c55e; }
5095
+ .dm-connection-amber { background: #f59e0b; }
5096
+ .dm-connection-checking { background: #d1d5db; animation: blink 1s step-end infinite; }
5097
+
5098
+ /* NavRail helper toggle */
5099
+ /* Legacy rail-helper-toggle classes removed in the rail unification:
5100
+ the Ask helper trigger now lives in the tab row as a pill that mirrors
5101
+ Twenty's "+ New chat" pill. See `app/workspace-rail.jsx`. */
5102
+
5103
+ /* ─── Workspace rail — top row (brand + utility actions) ─────────────── */
5104
+ .workspace-rail-topbar {
5105
+ display: flex;
5106
+ align-items: center;
5107
+ justify-content: space-between;
5108
+ gap: 8px;
5109
+ min-height: 32px;
5110
+ }
5111
+ .workspace-rail-brand-button {
5112
+ display: inline-flex;
5113
+ align-items: center;
5114
+ gap: 8px;
5115
+ padding: 4px 6px;
5116
+ margin-left: -4px;
5117
+ border: 1px solid transparent;
5118
+ border-radius: 6px;
5119
+ background: transparent;
5120
+ color: inherit;
5121
+ font: inherit;
5122
+ font-size: 14px;
5123
+ font-weight: 650;
5124
+ cursor: pointer;
5125
+ min-width: 0;
5126
+ }
5127
+ .workspace-rail-brand-button:hover { background: #f3f4f6; }
5128
+ .workspace-rail-brand-button .workspace-brand-label {
5129
+ white-space: nowrap;
5130
+ overflow: hidden;
5131
+ text-overflow: ellipsis;
5132
+ max-width: 130px;
5133
+ }
5134
+ .workspace-brand-caret { color: #9ca3af; flex-shrink: 0; }
5135
+ .workspace-rail-topbar-actions { display: inline-flex; gap: 2px; flex-shrink: 0; }
5136
+ .workspace-rail-icon-btn {
5137
+ width: 26px;
5138
+ height: 26px;
5139
+ display: grid;
5140
+ place-items: center;
5141
+ border: 1px solid transparent;
5142
+ border-radius: 6px;
5143
+ background: transparent;
5144
+ color: #6b7280;
5145
+ cursor: pointer;
5146
+ transition: background .12s ease, color .12s ease, border-color .12s ease;
5147
+ }
5148
+ .workspace-rail-icon-btn:hover { background: #f3f4f6; color: #111827; }
5149
+ .workspace-rail-icon-btn:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
5150
+
5151
+ /* ─── Workspace rail — tab row (Home/Chat tabs + Ask helper pill) ────── */
5152
+ .workspace-rail-tabbar {
5153
+ display: flex;
5154
+ align-items: center;
5155
+ justify-content: space-between;
5156
+ gap: 8px;
5157
+ margin-top: -4px;
5158
+ }
5159
+ .workspace-rail-tabs {
5160
+ display: inline-flex;
5161
+ align-items: center;
5162
+ gap: 2px;
5163
+ padding: 2px;
5164
+ border-radius: 8px;
5165
+ background: transparent;
5166
+ }
5167
+ .workspace-rail-tab {
5168
+ width: 28px;
5169
+ height: 28px;
5170
+ display: grid;
5171
+ place-items: center;
5172
+ border: 1px solid transparent;
5173
+ border-radius: 6px;
5174
+ background: transparent;
5175
+ color: #9ca3af;
5176
+ cursor: pointer;
5177
+ transition: background .12s ease, color .12s ease;
5178
+ }
5179
+ .workspace-rail-tab:hover { background: #f3f4f6; color: #374151; }
5180
+ .workspace-rail-tab.active {
5181
+ background: #f1f1f1;
5182
+ color: #111827;
5183
+ }
5184
+ .workspace-rail-tab:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
5185
+
5186
+ .workspace-rail-helper-pill {
5187
+ display: inline-flex;
5188
+ align-items: center;
5189
+ gap: 6px;
5190
+ height: 28px;
5191
+ padding: 0 12px;
5192
+ border: 1px solid #e5e7eb;
5193
+ border-radius: 5px;
5194
+ background: #fff;
5195
+ color: #111827;
5196
+ font: inherit;
5197
+ font-size: 12px;
5198
+ font-weight: 500;
5199
+ cursor: pointer;
5200
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
5201
+ transition: background .12s ease, border-color .12s ease, box-shadow .12s ease;
5202
+ flex-shrink: 0;
5203
+ }
5204
+ .workspace-rail-helper-pill:hover {
5205
+ background: #fafafa;
5206
+ border-color: #d1d5db;
5207
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06);
5208
+ }
5209
+ .workspace-rail-helper-pill.active {
5210
+ background: #f3f4f6;
5211
+ border-color: #d1d5db;
5212
+ }
5213
+ .workspace-rail-helper-pill:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
5214
+ .workspace-rail-helper-pill svg { color: #6b7280; }
5215
+
5216
+ /* ─── Workspace rail — chat tab body (Latest + thread list) ──────────── */
5217
+ .workspace-rail-chat {
5218
+ display: flex;
5219
+ flex-direction: column;
5220
+ gap: 4px;
5221
+ min-height: 0;
5222
+ flex: 1;
5223
+ }
5224
+
5225
+ /* Chat search bar — sits above the Latest label. Light, compact, inline */
5226
+ .workspace-rail-chat-search {
5227
+ display: flex;
5228
+ align-items: center;
5229
+ gap: 6px;
5230
+ height: 28px;
5231
+ padding: 0 8px;
5232
+ border: 1px solid #e5e7eb;
5233
+ border-radius: 7px;
5234
+ background: #fafafa;
5235
+ color: #6b7280;
5236
+ margin: 2px 0 4px;
5237
+ }
5238
+ .workspace-rail-chat-search:focus-within {
5239
+ background: #ffffff;
5240
+ border-color: #9ca3af;
5241
+ box-shadow: 0 0 0 3px rgba(0,0,0,.04);
5242
+ }
5243
+ .workspace-rail-chat-search-input {
5244
+ flex: 1;
5245
+ min-width: 0;
5246
+ height: 22px;
5247
+ padding: 0;
5248
+ border: 0;
5249
+ background: transparent;
5250
+ outline: none;
5251
+ color: #111827;
5252
+ font: inherit;
5253
+ font-size: 12.5px;
5254
+ }
5255
+ .workspace-rail-chat-search-input::placeholder { color: #9ca3af; }
5256
+ .workspace-rail-chat-search-clear {
5257
+ width: 18px;
5258
+ height: 18px;
5259
+ display: grid;
5260
+ place-items: center;
5261
+ border: 0;
5262
+ border-radius: 4px;
5263
+ background: transparent;
5264
+ color: #9ca3af;
5265
+ cursor: pointer;
5266
+ }
5267
+ .workspace-rail-chat-search-clear:hover { background: #ececec; color: #4b5563; }
5268
+
5269
+ /* Truncated state: hug the 10 visible rows, no fade-mask, no scroll —
5270
+ the "Show N more" pill is the affordance. Expanded state: bounded
5271
+ height + auto scroll so the list never bleeds past the fold. */
5272
+ .workspace-rail-thread-scroll {
5273
+ position: relative;
5274
+ flex: 1 1 auto;
5275
+ min-height: 0;
5276
+ max-height: calc(100vh - 260px);
5277
+ overflow-y: auto;
5278
+ scrollbar-gutter: stable;
5279
+ }
5280
+ .workspace-rail-thread-scroll.is-truncated {
5281
+ flex: 0 0 auto;
5282
+ max-height: none;
5283
+ overflow: visible;
5284
+ -webkit-mask-image: none;
5285
+ mask-image: none;
5286
+ }
5287
+ .workspace-rail-chat-show-more {
5288
+ align-self: center;
5289
+ height: 22px;
5290
+ padding: 0 12px;
5291
+ border: 1px solid #e5e7eb;
5292
+ border-radius: 99px;
5293
+ background: #fff;
5294
+ color: #4b5563;
5295
+ font: inherit;
5296
+ font-size: 11.5px;
5297
+ cursor: pointer;
5298
+ margin-top: 0;
5299
+ }
5300
+ .workspace-rail-chat-show-more:hover {
5301
+ background: #fafafa;
5302
+ border-color: #d1d5db;
5303
+ color: #111827;
5304
+ }
5305
+ .workspace-rail-section-label {
5306
+ font-size: 11px;
5307
+ font-weight: 600;
5308
+ letter-spacing: 0.02em;
5309
+ color: #9ca3af;
5310
+ text-transform: none;
5311
+ padding: 4px 8px 2px;
5312
+ }
5313
+ .workspace-rail-chat-empty {
5314
+ margin: 0;
5315
+ padding: 12px 10px;
5316
+ font-size: 12px;
5317
+ color: #6b7280;
5318
+ line-height: 1.45;
5319
+ }
5320
+ .workspace-rail-thread-list {
5321
+ list-style: none;
5322
+ margin: 0;
5323
+ padding: 0;
5324
+ display: flex;
5325
+ flex-direction: column;
5326
+ gap: 1px;
5327
+ overflow-y: auto;
5328
+ }
5329
+ .workspace-rail-thread-row {
5330
+ position: relative;
5331
+ display: flex;
5332
+ align-items: center;
5333
+ border-radius: 6px;
5334
+ transition: background .12s ease;
5335
+ }
5336
+ .workspace-rail-thread-row:hover { background: #f5f5f5; }
5337
+ .workspace-rail-thread-row:hover .workspace-rail-thread-menu-btn { opacity: 1; pointer-events: auto; }
5338
+ .workspace-rail-thread-row.is-active { background: #ececec; }
5339
+
5340
+ .workspace-rail-thread-main {
5341
+ flex: 1;
5342
+ display: grid;
5343
+ grid-template-columns: auto 1fr auto;
5344
+ align-items: center;
5345
+ gap: 8px;
5346
+ padding: 7px 8px 7px 9px;
5347
+ background: transparent;
5348
+ border: 0;
5349
+ cursor: pointer;
5350
+ color: inherit;
5351
+ font: inherit;
5352
+ text-align: left;
5353
+ min-width: 0;
5354
+ border-radius: 6px;
5355
+ }
5356
+ .workspace-rail-thread-icon { color: #6b7280; flex-shrink: 0; }
5357
+ .workspace-rail-thread-title {
5358
+ font-size: 13px;
5359
+ font-weight: 500;
5360
+ color: #2c2c2c;
5361
+ white-space: nowrap;
5362
+ overflow: hidden;
5363
+ text-overflow: ellipsis;
5364
+ min-width: 0;
5365
+ }
5366
+ .workspace-rail-thread-time {
5367
+ font-size: 11px;
5368
+ color: #9ca3af;
5369
+ flex-shrink: 0;
5370
+ margin-right: 2px;
5371
+ }
5372
+ .workspace-rail-thread-rename {
5373
+ flex: 1;
5374
+ min-width: 0;
5375
+ height: 22px;
5376
+ padding: 0 6px;
5377
+ border: 1px solid #d1d5db;
5378
+ border-radius: 5px;
5379
+ background: #fff;
5380
+ color: #111827;
5381
+ font: inherit;
5382
+ font-size: 13px;
5383
+ outline: none;
5384
+ }
5385
+ .workspace-rail-thread-rename:focus { border-color: #9ca3af; box-shadow: 0 0 0 3px rgba(0,0,0,.06); }
5386
+
5387
+ .workspace-rail-thread-menu-wrap {
5388
+ position: relative;
5389
+ display: inline-flex;
5390
+ align-items: center;
5391
+ padding-right: 4px;
5392
+ }
5393
+ .workspace-rail-thread-menu-btn {
5394
+ width: 24px;
5395
+ height: 24px;
5396
+ display: grid;
5397
+ place-items: center;
5398
+ border: 0;
5399
+ border-radius: 5px;
5400
+ background: transparent;
5401
+ color: #6b7280;
5402
+ cursor: pointer;
5403
+ opacity: 0;
5404
+ pointer-events: none;
5405
+ transition: opacity .12s ease, background .12s ease;
5406
+ }
5407
+ .workspace-rail-thread-menu-btn:hover { background: #e5e7eb; color: #111827; }
5408
+ .workspace-rail-thread-menu-btn:focus-visible { opacity: 1; pointer-events: auto; outline: 2px solid #bfdbfe; outline-offset: 1px; }
5409
+
5410
+ .workspace-rail-thread-menu {
5411
+ position: absolute;
5412
+ top: calc(100% + 4px);
5413
+ right: 0;
5414
+ min-width: 160px;
5415
+ background: #fff;
5416
+ border: 1px solid #e5e7eb;
5417
+ border-radius: 8px;
5418
+ box-shadow: 0 8px 28px rgba(15, 23, 42, 0.12);
5419
+ padding: 4px;
5420
+ display: flex;
5421
+ flex-direction: column;
5422
+ gap: 1px;
5423
+ z-index: 90;
5424
+ }
5425
+ .workspace-rail-thread-menu-item {
5426
+ display: inline-flex;
5427
+ align-items: center;
5428
+ gap: 8px;
5429
+ height: 30px;
5430
+ padding: 0 10px;
5431
+ font-size: 13px;
5432
+ color: #2c2c2c;
5433
+ background: transparent;
5434
+ border: 0;
5435
+ border-radius: 5px;
5436
+ cursor: pointer;
5437
+ text-align: left;
5438
+ }
5439
+ .workspace-rail-thread-menu-item:hover { background: #f5f5f5; }
5440
+ .workspace-rail-thread-menu-item.is-destructive { color: #b91c1c; }
5441
+ .workspace-rail-thread-menu-item.is-destructive:hover { background: #fef2f2; }
5442
+
5443
+ /* ─── HelperSidecar — clean light textarea (fix the dark-UA fallback) ─── */
5444
+ .dm-field-textarea {
5445
+ width: 100%;
5446
+ min-height: 72px;
5447
+ padding: 8px 10px;
5448
+ border: 1px solid #d1d5db;
5449
+ border-radius: 7px;
5450
+ background: #ffffff;
5451
+ color: #111827;
5452
+ font: inherit;
5453
+ font-size: 13px;
5454
+ line-height: 1.5;
5455
+ resize: vertical;
5456
+ box-sizing: border-box;
5457
+ transition: border-color .12s ease, box-shadow .12s ease;
5458
+ }
5459
+ .dm-field-textarea::placeholder { color: #9ca3af; }
5460
+ .dm-field-textarea:focus {
5461
+ outline: none;
5462
+ border-color: #6b7280;
5463
+ box-shadow: 0 0 0 3px rgba(0,0,0,.06);
5464
+ }
5465
+ .dm-field-textarea:disabled {
5466
+ background: #f9fafb;
5467
+ color: #6b7280;
5468
+ cursor: not-allowed;
5469
+ }
5470
+
5471
+ /* ─── HelperSidecar — composer-at-bottom layout (Twenty Ask AI parity) ── */
5472
+ .dm-helper-body {
5473
+ display: flex;
5474
+ flex-direction: column;
5475
+ gap: 0;
5476
+ padding: 0;
5477
+ min-height: 0;
5478
+ height: 100%;
5479
+ overflow: hidden; /* let the conversation scroll, not the body */
5480
+ }
5481
+ .dm-helper-conversation {
5482
+ flex: 1 1 auto;
5483
+ display: flex;
5484
+ flex-direction: column;
5485
+ gap: 10px;
5486
+ padding: 14px 16px;
5487
+ min-height: 0; /* unlocks flex children to scroll */
5488
+ overflow-y: auto; /* the canonical scroller for long threads */
5489
+ overscroll-behavior: contain;
5490
+ scrollbar-gutter: stable;
5491
+ }
5492
+ .dm-helper-conversation:empty { padding: 0; }
5493
+
5494
+ .dm-helper-composer {
5495
+ display: flex;
5496
+ flex-direction: column;
5497
+ gap: 8px;
5498
+ padding: 12px 14px 14px;
5499
+ border-top: 1px solid #eaeaea;
5500
+ background: #fcfcfc;
5501
+ flex-shrink: 0;
5502
+ }
5503
+ .dm-helper-composer-prompt {
5504
+ margin: 0;
5505
+ font-size: 13px;
5506
+ font-weight: 600;
5507
+ color: #111827;
5508
+ }
5509
+
5510
+ /* Empty-state chip stack — one chip per row, Twenty "Create a dashboard"
5511
+ grammar (icon-left, plain label, full-width, light hover). */
5512
+ .dm-helper-chip-stack {
5513
+ display: flex;
5514
+ flex-direction: column;
5515
+ gap: 2px;
5516
+ margin-bottom: 4px;
5517
+ }
5518
+ .dm-helper-chip {
5519
+ display: inline-flex;
5520
+ align-items: center;
5521
+ gap: 10px;
5522
+ width: 100%;
5523
+ height: 34px;
5524
+ padding: 0 10px;
5525
+ border: 1px solid transparent;
5526
+ border-radius: 7px;
5527
+ background: transparent;
5528
+ color: #2c2c2c;
5529
+ font: inherit;
5530
+ font-size: 13px;
5531
+ font-weight: 500;
5532
+ cursor: pointer;
5533
+ text-align: left;
5534
+ transition: background .12s ease, border-color .12s ease;
5535
+ }
5536
+ .dm-helper-chip:hover:not(:disabled) { background: #f3f4f6; }
5537
+ .dm-helper-chip.active { background: #eef2ff; border-color: #c7d2fe; color: #1e3a8a; }
5538
+ .dm-helper-chip:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
5539
+ .dm-helper-chip:disabled { opacity: .55; cursor: not-allowed; }
5540
+ .dm-helper-chip svg { color: #6b7280; flex-shrink: 0; }
5541
+ .dm-helper-chip.active svg { color: #1e40af; }
5542
+
5543
+ .dm-helper-chip-more-wrap { position: relative; display: block; }
5544
+ .dm-helper-chip-more {
5545
+ justify-content: space-between;
5546
+ }
5547
+
5548
+ /* Composer input — textarea + bottom action row in one rounded container. */
5549
+ .dm-helper-composer-input {
5550
+ display: flex;
5551
+ flex-direction: column;
5552
+ gap: 0;
5553
+ border: 1px solid #d1d5db;
5554
+ border-radius: 10px;
5555
+ background: #ffffff;
5556
+ transition: border-color .12s ease, box-shadow .12s ease;
5557
+ }
5558
+ .dm-helper-composer-input:focus-within {
5559
+ border-color: #9ca3af;
5560
+ box-shadow: 0 0 0 3px rgba(0,0,0,.06);
5561
+ }
5562
+ .dm-helper-composer-textarea {
5563
+ width: 100%;
5564
+ min-height: 56px;
5565
+ padding: 10px 12px 6px;
5566
+ border: 0;
5567
+ border-radius: 10px 10px 0 0;
5568
+ background: transparent;
5569
+ color: #111827;
5570
+ font: inherit;
5571
+ font-size: 13px;
5572
+ line-height: 1.5;
5573
+ resize: none;
5574
+ outline: none;
5575
+ box-sizing: border-box;
5576
+ }
5577
+ .dm-helper-composer-textarea::placeholder { color: #9ca3af; }
5578
+ .dm-helper-composer-textarea:disabled { color: #6b7280; cursor: not-allowed; }
5579
+
5580
+ .dm-helper-composer-actions {
5581
+ display: flex;
5582
+ align-items: center;
5583
+ justify-content: space-between;
5584
+ gap: 6px;
5585
+ padding: 6px 8px 8px;
5586
+ }
5587
+ .dm-helper-composer-actions-right {
5588
+ display: inline-flex;
5589
+ align-items: center;
5590
+ gap: 6px;
5591
+ }
5592
+ .dm-helper-composer-attach {
5593
+ width: 26px;
5594
+ height: 26px;
5595
+ display: grid;
5596
+ place-items: center;
5597
+ border: 0;
5598
+ border-radius: 5px;
5599
+ background: transparent;
5600
+ color: #6b7280;
5601
+ cursor: pointer;
5602
+ transition: background .12s ease, color .12s ease;
5603
+ }
5604
+ .dm-helper-composer-attach:hover:not(:disabled) { background: #f3f4f6; color: #111827; }
5605
+ .dm-helper-composer-attach:disabled { opacity: .45; cursor: not-allowed; }
5606
+
5607
+ .dm-helper-composer-mode-pill {
5608
+ display: inline-flex;
5609
+ align-items: center;
5610
+ gap: 4px;
5611
+ height: 22px;
5612
+ padding: 0 8px;
5613
+ border: 1px solid #e5e7eb;
5614
+ border-radius: 99px;
5615
+ background: #f9fafb;
5616
+ color: #4b5563;
5617
+ font-size: 11px;
5618
+ font-weight: 500;
5619
+ }
5620
+
5621
+ .dm-helper-composer-send {
5622
+ width: 26px;
5623
+ height: 26px;
5624
+ display: grid;
5625
+ place-items: center;
5626
+ border: 0;
5627
+ border-radius: 6px;
5628
+ background: #111827;
5629
+ color: #ffffff;
5630
+ cursor: pointer;
5631
+ transition: background .12s ease, opacity .12s ease;
5632
+ }
5633
+ .dm-helper-composer-send:hover:not(:disabled) { background: #000000; }
5634
+ .dm-helper-composer-send:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 1px; }
5635
+ .dm-helper-composer-send:disabled {
5636
+ background: #d1d5db;
5637
+ color: #ffffff;
5638
+ cursor: not-allowed;
5639
+ }
5640
+
5641
+ .dm-helper-composer-hint {
5642
+ margin: 0;
5643
+ font-size: 11px;
5644
+ color: #6b7280;
5645
+ line-height: 1.45;
5646
+ }
5647
+
5648
+ /* data-helper-trigger button inside table header */
5649
+ .dm-detail-helper-trigger { display: flex; align-items: center; padding: 0 8px; }
5650
+ .dm-helper-row-btn { display: flex; align-items: center; gap: 5px; font-size: 12px !important; padding: 4px 10px !important; height: 28px !important; }
5651
+ .dm-page-empty-actions { display: flex; gap: 8px; align-items: center; justify-content: center; margin-top: 4px; }
5652
+
4294
5653
  @media (max-width: 900px) {
4295
5654
  .dm-layout-v2 { grid-template-columns: 1fr; }
4296
5655
  .dm-obj-col { border-right: 0; border-bottom: 1px solid #e5e7eb; }
@@ -4314,7 +5673,7 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
4314
5673
  .source-dropdown-item .source-dropdown-item-live { color: #555; }
4315
5674
  .source-dropdown-integration-badge { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; font-size: 10px; font-weight: 700; background: #f1f5f9; border: 1px solid #e2e8f0; border-radius: 4px; color: #374151; flex-shrink: 0; margin-left: auto; cursor: default; }
4316
5675
  .source-dropdown-empty { padding: 12px 8px 4px; font-size: 12px; color: #9ca3af; display: grid; gap: 4px; }
4317
- .source-dropdown-hint { font-size: 11px; color: #c4b5fd; }
5676
+ .source-dropdown-hint { font-size: 11px; color: #9ca3af; }
4318
5677
  .source-dropdown-footer { display: flex; align-items: center; gap: 4px; padding: 8px 8px 6px; border-top: 1px solid #f1f5f9; margin-top: 4px; font-size: 11px; color: #9ca3af; }
4319
5678
  .source-dropdown-footer strong { color: #333; }
4320
5679
 
@@ -4324,7 +5683,7 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
4324
5683
  .workspace-source-search-wrap:focus-within { border-color: #555; }
4325
5684
  .workspace-source-object-list { display: grid; gap: 2px; }
4326
5685
  .workspace-source-object-row { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px; background: #fff; border: 1px solid #e5e7eb; border-radius: 7px; cursor: pointer; text-align: left; font: inherit; }
4327
- .workspace-source-object-row:hover { background: #f9fafb; border-color: #a5b4fc; }
5686
+ .workspace-source-object-row:hover { background: #f9fafb; border-color: #bfdbfe; }
4328
5687
  .workspace-source-object-row.active { background: #f0f0f0; border-color: #aaa; }
4329
5688
  .workspace-source-object-icon { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 6px; background: #f3f4f6; color: #374151; flex-shrink: 0; }
4330
5689
  .workspace-source-object-row.active .workspace-source-object-icon { background: #e0e0e0; color: #222; }