@hachej/boring-workspace 0.1.34 → 0.1.36

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.
@@ -1589,15 +1589,15 @@
1589
1589
  .mt-3 {
1590
1590
  margin-top: calc(var(--spacing) * 3);
1591
1591
  }
1592
- .mt-4 {
1593
- margin-top: calc(var(--spacing) * 4);
1594
- }
1595
1592
  .mt-px {
1596
1593
  margin-top: 1px;
1597
1594
  }
1598
1595
  .mr-auto {
1599
1596
  margin-right: auto;
1600
1597
  }
1598
+ .mb-1 {
1599
+ margin-bottom: calc(var(--spacing) * 1);
1600
+ }
1601
1601
  .mb-1\.5 {
1602
1602
  margin-bottom: calc(var(--spacing) * 1.5);
1603
1603
  }
@@ -1763,6 +1763,9 @@
1763
1763
  .w-7 {
1764
1764
  width: calc(var(--spacing) * 7);
1765
1765
  }
1766
+ .w-8 {
1767
+ width: calc(var(--spacing) * 8);
1768
+ }
1766
1769
  .w-9 {
1767
1770
  width: calc(var(--spacing) * 9);
1768
1771
  }
@@ -1820,9 +1823,6 @@
1820
1823
  .flex-\[0_0_0px\] {
1821
1824
  flex: 0 0 0px;
1822
1825
  }
1823
- .flex-none {
1824
- flex: none;
1825
- }
1826
1826
  .shrink-0 {
1827
1827
  flex-shrink: 0;
1828
1828
  }
@@ -1852,6 +1852,9 @@
1852
1852
  .cursor-col-resize {
1853
1853
  cursor: col-resize;
1854
1854
  }
1855
+ .cursor-grab {
1856
+ cursor: grab;
1857
+ }
1855
1858
  .cursor-nwse-resize {
1856
1859
  cursor: nwse-resize;
1857
1860
  }
@@ -1962,9 +1965,6 @@
1962
1965
  .overflow-hidden {
1963
1966
  overflow: hidden;
1964
1967
  }
1965
- .overflow-x-auto {
1966
- overflow-x: auto;
1967
- }
1968
1968
  .overflow-y-auto {
1969
1969
  overflow-y: auto;
1970
1970
  }
@@ -1974,6 +1974,9 @@
1974
1974
  .rounded-2xl {
1975
1975
  border-radius: var(--radius-2xl);
1976
1976
  }
1977
+ .rounded-\[5px\] {
1978
+ border-radius: 5px;
1979
+ }
1977
1980
  .rounded-full {
1978
1981
  border-radius: calc(infinity * 1px);
1979
1982
  }
@@ -1992,6 +1995,10 @@
1992
1995
  .rounded-xl {
1993
1996
  border-radius: var(--boring-radius-xl);
1994
1997
  }
1998
+ .rounded-r-none {
1999
+ border-top-right-radius: 0;
2000
+ border-bottom-right-radius: 0;
2001
+ }
1995
2002
  .border {
1996
2003
  border-style: var(--tw-border-style);
1997
2004
  border-width: 1px;
@@ -2076,6 +2083,9 @@
2076
2083
  .bg-\[color\:oklch\(from_var\(--background\)_calc\(l-0\.01\)_c_h\)\] {
2077
2084
  background-color: oklch(from var(--background) calc(l - 0.01) c h);
2078
2085
  }
2086
+ .bg-\[color\:oklch\(from_var\(--foreground\)_l_c_h\/0\.035\)\] {
2087
+ background-color: oklch(from var(--foreground) l c h/0.035);
2088
+ }
2079
2089
  .bg-\[color\:var\(--accent\)\] {
2080
2090
  background-color: var(--accent);
2081
2091
  }
@@ -2112,6 +2122,15 @@
2112
2122
  background-color: color-mix(in oklab, var(--boring-card) 60%, transparent);
2113
2123
  }
2114
2124
  }
2125
+ .bg-destructive {
2126
+ background-color: var(--boring-destructive);
2127
+ }
2128
+ .bg-destructive\/12 {
2129
+ background-color: var(--boring-destructive);
2130
+ @supports (color: color-mix(in lab, red, red)) {
2131
+ background-color: color-mix(in oklab, var(--boring-destructive) 12%, transparent);
2132
+ }
2133
+ }
2115
2134
  .bg-foreground {
2116
2135
  background-color: var(--boring-foreground);
2117
2136
  }
@@ -2121,18 +2140,42 @@
2121
2140
  background-color: color-mix(in oklab, var(--boring-foreground) 5%, transparent);
2122
2141
  }
2123
2142
  }
2143
+ .bg-foreground\/10 {
2144
+ background-color: var(--boring-foreground);
2145
+ @supports (color: color-mix(in lab, red, red)) {
2146
+ background-color: color-mix(in oklab, var(--boring-foreground) 10%, transparent);
2147
+ }
2148
+ }
2149
+ .bg-foreground\/30 {
2150
+ background-color: var(--boring-foreground);
2151
+ @supports (color: color-mix(in lab, red, red)) {
2152
+ background-color: color-mix(in oklab, var(--boring-foreground) 30%, transparent);
2153
+ }
2154
+ }
2124
2155
  .bg-foreground\/35 {
2125
2156
  background-color: var(--boring-foreground);
2126
2157
  @supports (color: color-mix(in lab, red, red)) {
2127
2158
  background-color: color-mix(in oklab, var(--boring-foreground) 35%, transparent);
2128
2159
  }
2129
2160
  }
2161
+ .bg-foreground\/70 {
2162
+ background-color: var(--boring-foreground);
2163
+ @supports (color: color-mix(in lab, red, red)) {
2164
+ background-color: color-mix(in oklab, var(--boring-foreground) 70%, transparent);
2165
+ }
2166
+ }
2130
2167
  .bg-foreground\/\[0\.06\] {
2131
2168
  background-color: var(--boring-foreground);
2132
2169
  @supports (color: color-mix(in lab, red, red)) {
2133
2170
  background-color: color-mix(in oklab, var(--boring-foreground) 6%, transparent);
2134
2171
  }
2135
2172
  }
2173
+ .bg-foreground\/\[0\.07\] {
2174
+ background-color: var(--boring-foreground);
2175
+ @supports (color: color-mix(in lab, red, red)) {
2176
+ background-color: color-mix(in oklab, var(--boring-foreground) 7.000000000000001%, transparent);
2177
+ }
2178
+ }
2136
2179
  .bg-muted {
2137
2180
  background-color: var(--boring-muted);
2138
2181
  }
@@ -2142,6 +2185,12 @@
2142
2185
  background-color: color-mix(in oklab, var(--boring-muted) 30%, transparent);
2143
2186
  }
2144
2187
  }
2188
+ .bg-muted\/35 {
2189
+ background-color: var(--boring-muted);
2190
+ @supports (color: color-mix(in lab, red, red)) {
2191
+ background-color: color-mix(in oklab, var(--boring-muted) 35%, transparent);
2192
+ }
2193
+ }
2145
2194
  .bg-muted\/40 {
2146
2195
  background-color: var(--boring-muted);
2147
2196
  @supports (color: color-mix(in lab, red, red)) {
@@ -2166,6 +2215,9 @@
2166
2215
  .bg-white {
2167
2216
  background-color: var(--color-white);
2168
2217
  }
2218
+ .fill-current {
2219
+ fill: currentcolor;
2220
+ }
2169
2221
  .object-contain {
2170
2222
  object-fit: contain;
2171
2223
  }
@@ -2220,6 +2272,9 @@
2220
2272
  .px-4 {
2221
2273
  padding-inline: calc(var(--spacing) * 4);
2222
2274
  }
2275
+ .px-5 {
2276
+ padding-inline: calc(var(--spacing) * 5);
2277
+ }
2223
2278
  .px-6 {
2224
2279
  padding-inline: calc(var(--spacing) * 6);
2225
2280
  }
@@ -2289,6 +2344,9 @@
2289
2344
  .text-left {
2290
2345
  text-align: left;
2291
2346
  }
2347
+ .text-right {
2348
+ text-align: right;
2349
+ }
2292
2350
  .align-baseline {
2293
2351
  vertical-align: baseline;
2294
2352
  }
@@ -2325,6 +2383,9 @@
2325
2383
  .text-\[13px\] {
2326
2384
  font-size: 13px;
2327
2385
  }
2386
+ .text-\[14px\] {
2387
+ font-size: 14px;
2388
+ }
2328
2389
  .text-\[15px\] {
2329
2390
  font-size: 15px;
2330
2391
  }
@@ -2429,6 +2490,12 @@
2429
2490
  color: color-mix(in oklab, var(--boring-foreground) 70%, transparent);
2430
2491
  }
2431
2492
  }
2493
+ .text-foreground\/80 {
2494
+ color: var(--boring-foreground);
2495
+ @supports (color: color-mix(in lab, red, red)) {
2496
+ color: color-mix(in oklab, var(--boring-foreground) 80%, transparent);
2497
+ }
2498
+ }
2432
2499
  .text-foreground\/90 {
2433
2500
  color: var(--boring-foreground);
2434
2501
  @supports (color: color-mix(in lab, red, red)) {
@@ -2502,6 +2569,9 @@
2502
2569
  .opacity-0 {
2503
2570
  opacity: 0%;
2504
2571
  }
2572
+ .opacity-60 {
2573
+ opacity: 60%;
2574
+ }
2505
2575
  .opacity-70 {
2506
2576
  opacity: 70%;
2507
2577
  }
@@ -2527,6 +2597,10 @@
2527
2597
  --tw-shadow: 0 1px 2px -1px var(--tw-shadow-color, oklch(0 0 0/0.08)), 0 12px 32px -22px var(--tw-shadow-color, oklch(0 0 0/0.28));
2528
2598
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2529
2599
  }
2600
+ .shadow-\[inset_0_0_0_2px_oklch\(from_var\(--foreground\)_l_c_h\/0\.55\)\] {
2601
+ --tw-shadow: inset 0 0 0 2px var(--tw-shadow-color, oklch(from var(--foreground) l c h/0.55));
2602
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2603
+ }
2530
2604
  .shadow-md {
2531
2605
  --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2532
2606
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2590,6 +2664,11 @@
2590
2664
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2591
2665
  transition-duration: var(--tw-duration, var(--default-transition-duration));
2592
2666
  }
2667
+ .transition-\[background-color\,box-shadow\] {
2668
+ transition-property: background-color,box-shadow;
2669
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2670
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
2671
+ }
2593
2672
  .transition-\[flex-grow\,flex-basis\,width\,min-width\,max-width\] {
2594
2673
  transition-property: flex-grow,flex-basis,width,min-width,max-width;
2595
2674
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -2652,8 +2731,12 @@
2652
2731
  -webkit-user-select: none;
2653
2732
  user-select: none;
2654
2733
  }
2655
- .\[scrollbar-width\:none\] {
2656
- scrollbar-width: none;
2734
+ .group-hover\:text-muted-foreground {
2735
+ &:is(:where(.group):hover *) {
2736
+ @media (hover: hover) {
2737
+ color: var(--boring-muted-foreground);
2738
+ }
2739
+ }
2657
2740
  }
2658
2741
  .group-hover\:opacity-100 {
2659
2742
  &:is(:where(.group):hover *) {
@@ -2680,6 +2763,45 @@
2680
2763
  }
2681
2764
  }
2682
2765
  }
2766
+ .before\:absolute {
2767
+ &::before {
2768
+ content: var(--tw-content);
2769
+ position: absolute;
2770
+ }
2771
+ }
2772
+ .before\:top-0 {
2773
+ &::before {
2774
+ content: var(--tw-content);
2775
+ top: calc(var(--spacing) * 0);
2776
+ }
2777
+ }
2778
+ .before\:-right-1\.5 {
2779
+ &::before {
2780
+ content: var(--tw-content);
2781
+ right: calc(var(--spacing) * -1.5);
2782
+ }
2783
+ }
2784
+ .before\:h-full {
2785
+ &::before {
2786
+ content: var(--tw-content);
2787
+ height: 100%;
2788
+ }
2789
+ }
2790
+ .before\:w-1\.5 {
2791
+ &::before {
2792
+ content: var(--tw-content);
2793
+ width: calc(var(--spacing) * 1.5);
2794
+ }
2795
+ }
2796
+ .before\:bg-muted\/35 {
2797
+ &::before {
2798
+ content: var(--tw-content);
2799
+ background-color: var(--boring-muted);
2800
+ @supports (color: color-mix(in lab, red, red)) {
2801
+ background-color: color-mix(in oklab, var(--boring-muted) 35%, transparent);
2802
+ }
2803
+ }
2804
+ }
2683
2805
  .hover\:-translate-y-0\.5 {
2684
2806
  &:hover {
2685
2807
  @media (hover: hover) {
@@ -2723,6 +2845,16 @@
2723
2845
  }
2724
2846
  }
2725
2847
  }
2848
+ .hover\:bg-background\/70 {
2849
+ &:hover {
2850
+ @media (hover: hover) {
2851
+ background-color: var(--boring-background);
2852
+ @supports (color: color-mix(in lab, red, red)) {
2853
+ background-color: color-mix(in oklab, var(--boring-background) 70%, transparent);
2854
+ }
2855
+ }
2856
+ }
2857
+ }
2726
2858
  .hover\:bg-border\/70 {
2727
2859
  &:hover {
2728
2860
  @media (hover: hover) {
@@ -2760,6 +2892,16 @@
2760
2892
  }
2761
2893
  }
2762
2894
  }
2895
+ .hover\:bg-muted\/35 {
2896
+ &:hover {
2897
+ @media (hover: hover) {
2898
+ background-color: var(--boring-muted);
2899
+ @supports (color: color-mix(in lab, red, red)) {
2900
+ background-color: color-mix(in oklab, var(--boring-muted) 35%, transparent);
2901
+ }
2902
+ }
2903
+ }
2904
+ }
2763
2905
  .hover\:bg-muted\/60 {
2764
2906
  &:hover {
2765
2907
  @media (hover: hover) {
@@ -2818,6 +2960,16 @@
2818
2960
  }
2819
2961
  }
2820
2962
  }
2963
+ .hover\:text-foreground\/80 {
2964
+ &:hover {
2965
+ @media (hover: hover) {
2966
+ color: var(--boring-foreground);
2967
+ @supports (color: color-mix(in lab, red, red)) {
2968
+ color: color-mix(in oklab, var(--boring-foreground) 80%, transparent);
2969
+ }
2970
+ }
2971
+ }
2972
+ }
2821
2973
  .hover\:shadow-\[0_2px_4px_-1px_oklch\(0_0_0\/0\.08\)\,0_4px_12px_-4px_oklch\(0_0_0\/0\.10\)\,inset_0_0_0_1px_oklch\(from_var\(--border\)_l_c_h\/0\.9\)\] {
2822
2974
  &:hover {
2823
2975
  @media (hover: hover) {
@@ -2899,6 +3051,11 @@
2899
3051
  outline-style: none;
2900
3052
  }
2901
3053
  }
3054
+ .active\:cursor-grabbing {
3055
+ &:active {
3056
+ cursor: grabbing;
3057
+ }
3058
+ }
2902
3059
  .active\:bg-muted-foreground\/30 {
2903
3060
  &:active {
2904
3061
  background-color: var(--boring-muted-foreground);
@@ -2932,24 +3089,6 @@
2932
3089
  color: var(--boring-foreground);
2933
3090
  }
2934
3091
  }
2935
- .data-\[state\=active\]\:text-\[color\:var\(--accent\)\] {
2936
- &[data-state="active"] {
2937
- color: var(--accent);
2938
- }
2939
- }
2940
- .data-\[state\=active\]\:text-foreground {
2941
- &[data-state="active"] {
2942
- color: var(--boring-foreground);
2943
- }
2944
- }
2945
- .data-\[state\=active\]\:after\:bg-\[color\:var\(--accent\)\] {
2946
- &[data-state="active"] {
2947
- &::after {
2948
- content: var(--tw-content);
2949
- background-color: var(--accent);
2950
- }
2951
- }
2952
- }
2953
3092
  .dark\:bg-transparent {
2954
3093
  &:is(.dark *) {
2955
3094
  background-color: transparent;
@@ -2960,11 +3099,6 @@
2960
3099
  text-indent: calc(var(--spacing) * 0) !important;
2961
3100
  }
2962
3101
  }
2963
- .\[\&\:\:-webkit-scrollbar\]\:hidden {
2964
- &::-webkit-scrollbar {
2965
- display: none;
2966
- }
2967
- }
2968
3102
  .\[\&\>\[data-slot\=command-input-wrapper\]\]\:h-auto {
2969
3103
  &>[data-slot=command-input-wrapper] {
2970
3104
  height: auto;
@@ -6110,6 +6244,49 @@
6110
6244
  padding: 0 2px;
6111
6245
  border-radius: 2px;
6112
6246
  }
6247
+ .boring-scrollbar-discreet {
6248
+ scrollbar-width: thin;
6249
+ scrollbar-color: oklch(from var(--foreground) l c h / 0.14) transparent;
6250
+ }
6251
+ .boring-scrollbar-discreet::-webkit-scrollbar {
6252
+ width: 8px;
6253
+ height: 8px;
6254
+ }
6255
+ .boring-scrollbar-discreet::-webkit-scrollbar-track {
6256
+ background: transparent;
6257
+ }
6258
+ .boring-scrollbar-discreet::-webkit-scrollbar-thumb {
6259
+ background-color: oklch(from var(--foreground) l c h / 0.12);
6260
+ border-radius: 9999px;
6261
+ border: 2px solid transparent;
6262
+ background-clip: padding-box;
6263
+ }
6264
+ .boring-scrollbar-discreet:hover::-webkit-scrollbar-thumb {
6265
+ background-color: oklch(from var(--foreground) l c h / 0.22);
6266
+ }
6267
+ .boring-scrollbar-discreet::-webkit-scrollbar-thumb:hover {
6268
+ background-color: oklch(from var(--foreground) l c h / 0.34);
6269
+ }
6270
+ [data-boring-workspace] {
6271
+ scrollbar-width: thin;
6272
+ scrollbar-color: oklch(from var(--foreground) l c h / 0.14) transparent;
6273
+ }
6274
+ [data-boring-workspace] ::-webkit-scrollbar {
6275
+ width: 8px;
6276
+ height: 8px;
6277
+ }
6278
+ [data-boring-workspace] ::-webkit-scrollbar-track {
6279
+ background: transparent;
6280
+ }
6281
+ [data-boring-workspace] ::-webkit-scrollbar-thumb {
6282
+ background-color: oklch(from var(--foreground) l c h / 0.12);
6283
+ border-radius: 9999px;
6284
+ border: 2px solid transparent;
6285
+ background-clip: padding-box;
6286
+ }
6287
+ [data-boring-workspace] ::-webkit-scrollbar-thumb:hover {
6288
+ background-color: oklch(from var(--foreground) l c h / 0.3);
6289
+ }
6113
6290
  @property --tw-translate-x {
6114
6291
  syntax: "*";
6115
6292
  inherits: false;
@@ -6654,3 +6831,91 @@
6654
6831
  border-radius: calc(var(--radius) - 2px);
6655
6832
  box-shadow: 0 4px 12px oklch(0 0 0 / 0.15);
6656
6833
  }
6834
+
6835
+
6836
+ /* @hachej/boring-workspace chat pane stage */
6837
+
6838
+ /* Chat pane stage — compact dockview chrome scoped under .dv-chat-stage.
6839
+ Inherits the token mapping from dockview-overrides.css (.dv-shell). */
6840
+
6841
+ .dv-chat-stage {
6842
+ --dv-tabs-and-actions-container-height: 32px;
6843
+ --dv-tabs-and-actions-container-font-size: 0.75rem;
6844
+
6845
+ /* Panes, not tabs: no pill — the header shares the pane background and
6846
+ blends seamlessly into the content (no separating border). */
6847
+ --dv-activegroup-visiblepanel-tab-background-color: transparent;
6848
+ --dv-activegroup-hiddenpanel-tab-background-color: transparent;
6849
+ --dv-inactivegroup-visiblepanel-tab-background-color: transparent;
6850
+ --dv-inactivegroup-hiddenpanel-tab-background-color: transparent;
6851
+ }
6852
+
6853
+ /* Neutralize the workbench pill-tab chrome (.dv-shell .dv-tab in
6854
+ dockview-overrides.css): no rounded corners, no active-tab border or
6855
+ accent, no header underline, no tab sizing caps. The double class on
6856
+ the stage root (.dv-shell.dv-chat-stage) out-specifies the workbench
6857
+ rules; the header must read as part of the pane, not a tab strip. */
6858
+ .dv-shell.dv-chat-stage .dv-tabs-and-actions-container {
6859
+ border-bottom: none;
6860
+ padding: 0;
6861
+ gap: 0;
6862
+ align-items: stretch;
6863
+ }
6864
+
6865
+ /* dockview's fullwidth single-tab rules stop at the scroll wrapper; carry
6866
+ the full width down to the tab itself. */
6867
+ .dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-tabs-container {
6868
+ width: 100%;
6869
+ }
6870
+
6871
+ .dv-shell.dv-chat-stage .dv-tab,
6872
+ .dv-shell.dv-chat-stage .dv-tab.dv-active-tab {
6873
+ width: 100%;
6874
+ height: 100%;
6875
+ min-width: 0;
6876
+ max-width: none;
6877
+ flex: 1 1 auto;
6878
+ align-self: stretch;
6879
+ margin-bottom: 0;
6880
+ padding: 0;
6881
+ border: none;
6882
+ border-radius: 0;
6883
+ background-color: transparent !important;
6884
+ }
6885
+
6886
+ .dv-shell.dv-chat-stage .dv-tab.dv-active-tab::before {
6887
+ content: none;
6888
+ }
6889
+
6890
+ /* The chat stage hides dockview's built-in tab close icon entirely — the
6891
+ custom header renders its own close control with pane semantics. */
6892
+ .dv-chat-stage .dv-default-tab-action {
6893
+ display: none;
6894
+ }
6895
+
6896
+ /* Active-pane focus ring drawn at the GROUP level so it wraps the whole
6897
+ pane — header included. Always present but transparent, so activation
6898
+ fades instead of popping. Only meaningful with 2+ panes; the stage
6899
+ wrapper gates it via data-multi-pane. */
6900
+ .dv-chat-stage .dv-groupview {
6901
+ position: relative;
6902
+ }
6903
+
6904
+ .dv-chat-stage .dv-groupview::after {
6905
+ content: "";
6906
+ position: absolute;
6907
+ inset: 0;
6908
+ z-index: 40;
6909
+ pointer-events: none;
6910
+ background: transparent;
6911
+ transition: background-color 220ms cubic-bezier(0.22, 1, 0.36, 1),
6912
+ box-shadow 220ms cubic-bezier(0.22, 1, 0.36, 1);
6913
+ }
6914
+
6915
+ /* The selected chat stays white; the others recede behind a faint grey
6916
+ wash. No border on the active pane — the background contrast alone marks
6917
+ the selection. */
6918
+ [data-boring-workspace-part="chat-pane-stage"][data-multi-pane="true"]
6919
+ .dv-groupview:not(.dv-active-group)::after {
6920
+ background: oklch(from var(--foreground) l c h / 0.035);
6921
+ }
@@ -100,6 +100,7 @@ declare interface BoringFrontAPI {
100
100
  registerPanelCommand(registration: BoringFrontPanelCommandRegistration): void;
101
101
  registerLeftTab<T = LeftTabParams>(registration: BoringFrontLeftTabRegistration<T>): void;
102
102
  registerSurfaceResolver(registration: BoringFrontSurfaceResolverRegistration): void;
103
+ registerToolRenderer(registration: BoringFrontToolRendererRegistration): void;
103
104
  }
104
105
 
105
106
  declare interface BoringFrontBindingRegistration {
@@ -173,6 +174,13 @@ declare interface BoringFrontSurfaceResolverRegistration {
173
174
  resolve: (request: SurfaceOpenRequest) => SurfacePanelResolution | null | undefined;
174
175
  }
175
176
 
177
+ declare type BoringFrontToolRenderer = (part: unknown) => ReactNode;
178
+
179
+ declare interface BoringFrontToolRendererRegistration {
180
+ id: string;
181
+ render: BoringFrontToolRenderer;
182
+ }
183
+
176
184
  export declare interface BridgeClient {
177
185
  connect(): void;
178
186
  disconnect(): void;
@@ -251,6 +259,7 @@ declare interface CapturedBoringFrontRegistrations {
251
259
  panelCommands: BoringFrontPanelCommandRegistration[];
252
260
  leftTabs: BoringFrontLeftTabRegistration<any>[];
253
261
  surfaceResolvers: BoringFrontSurfaceResolverRegistration[];
262
+ toolRenderers: BoringFrontToolRendererRegistration[];
254
263
  }
255
264
 
256
265
  declare interface CapturedFrontPlugin {
@@ -367,6 +376,13 @@ export declare interface ChatLayoutProps {
367
376
  navParams?: Record<string, unknown>;
368
377
  center?: string;
369
378
  centerParams?: Record<string, unknown>;
379
+ chatPanes?: ChatPaneDescriptor[];
380
+ activeChatPaneId?: string | null;
381
+ onActiveChatPaneChange?: (id: string) => void;
382
+ onCloseChatPane?: (id: string) => void;
383
+ onCreateChatPaneAfter?: (id: string) => void;
384
+ onDropChatSession?: (sessionId: string) => void;
385
+ flashChatPaneId?: string | null;
370
386
  surface?: string | null;
371
387
  surfaceParams?: Record<string, unknown>;
372
388
  surfaceOverlay?: ReactNode;
@@ -380,6 +396,13 @@ export declare interface ChatLayoutProps {
380
396
  className?: string;
381
397
  }
382
398
 
399
+ declare interface ChatPaneDescriptor {
400
+ id: string;
401
+ title?: string | null;
402
+ panel?: string;
403
+ params?: Record<string, unknown>;
404
+ }
405
+
383
406
  export declare const closePanelSchema: z.ZodObject<{
384
407
  id: z.ZodString;
385
408
  }, "strip", z.ZodTypeAny, {
@@ -674,6 +697,7 @@ declare class FetchClient {
674
697
  }>;
675
698
  deleteFile(path: string): Promise<void>;
676
699
  stat(path: string, signal?: AbortSignal): Promise<FileStat>;
700
+ getGitUrlMetadata(path: string, signal?: AbortSignal): Promise<GitUrlMetadata>;
677
701
  search(query: string, limit?: number, signal?: AbortSignal): Promise<string[]>;
678
702
  createDir(path: string): Promise<void>;
679
703
  moveFile(from: string, to: string): Promise<void>;
@@ -920,6 +944,12 @@ export declare type FrontPluginHotReloadMode = "vite" | false;
920
944
 
921
945
  export declare function getFileIcon(filename: string): LucideIcon;
922
946
 
947
+ declare interface GitUrlMetadata {
948
+ enabled: boolean;
949
+ reason?: string;
950
+ url?: string;
951
+ }
952
+
923
953
  export declare interface GroupConfig {
924
954
  id: string;
925
955
  position: "left" | "center" | "right" | "bottom";
@@ -1337,12 +1367,18 @@ export declare interface ResponsiveDockviewShellProps {
1337
1367
 
1338
1368
  export declare type SerializedLayout = Parameters<DockviewApi["fromJSON"]>[0];
1339
1369
 
1340
- export declare function SessionBrowser({ sessions, activeId, onSwitch, onCreate, onDelete, onLoadMore, hasMore, loadingMore, onClose, className, }: SessionBrowserProps): JSX.Element;
1370
+ export declare function SessionBrowser({ sessions, activeId, openIds, pinnedIds, onTogglePin, onSwitch, onOpenAsTab, onCreate, onDelete, onLoadMore, hasMore, loadingMore, onClose, className, }: SessionBrowserProps): JSX.Element;
1341
1371
 
1342
1372
  export declare interface SessionBrowserProps {
1343
1373
  sessions: SessionItem[];
1344
1374
  activeId?: string | null;
1375
+ /** Session ids currently open as chat panes, in pane order. */
1376
+ openIds?: string[];
1377
+ /** Session ids the user pinned; surfaced in a Pinned section on top. */
1378
+ pinnedIds?: string[];
1379
+ onTogglePin?: (id: string) => void;
1345
1380
  onSwitch?: (id: string) => void;
1381
+ onOpenAsTab?: (id: string) => void;
1346
1382
  onCreate?: () => void;
1347
1383
  onDelete?: (id: string) => void;
1348
1384
  onLoadMore?: () => void;
@@ -1955,6 +1991,15 @@ export declare interface WorkspaceEventMap extends WorkspaceHostEventMap, Worksp
1955
1991
  /** Names that share a prefix can be filtered with `startsWith`. */
1956
1992
  export declare type WorkspaceEventName = keyof WorkspaceEventMap;
1957
1993
 
1994
+ export declare const workspaceEvents: {
1995
+ readonly uiCommand: "workspace:ui.command";
1996
+ readonly editorSaveStart: "workspace:editor.save.start";
1997
+ readonly editorSaveEnd: "workspace:editor.save.end";
1998
+ readonly panelUpdate: "workspace:panel.update";
1999
+ readonly panelClose: "workspace:panel.close";
2000
+ readonly agentData: "workspace:agent.data";
2001
+ };
2002
+
1958
2003
  export declare function WorkspaceFilesProvider({ apiBaseUrl, authHeaders, onAuthError, timeout, client: providedClient, children, }: DataProviderProps): JSX.Element;
1959
2004
 
1960
2005
  declare interface WorkspaceHostEventMap {
@@ -2071,7 +2116,7 @@ export declare interface WorkspacePluginEventMap {
2071
2116
  };
2072
2117
  }
2073
2118
 
2074
- export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, defaultTheme, onThemeChange, workspaceId, storageKey, persistenceEnabled, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, }: WorkspaceProviderProps): JSX.Element;
2119
+ export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, defaultTheme, onThemeChange, workspaceId, workspaceLabel, storageKey, persistenceEnabled, manageDocumentTitle, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, }: WorkspaceProviderProps): JSX.Element;
2075
2120
 
2076
2121
  export declare interface WorkspaceProviderProps {
2077
2122
  children: ReactNode;
@@ -2093,8 +2138,10 @@ export declare interface WorkspaceProviderProps {
2093
2138
  defaultTheme?: "light" | "dark" | undefined;
2094
2139
  onThemeChange?: (theme: "light" | "dark") => void;
2095
2140
  workspaceId?: string;
2141
+ workspaceLabel?: string;
2096
2142
  storageKey?: string;
2097
2143
  persistenceEnabled?: boolean;
2144
+ manageDocumentTitle?: boolean;
2098
2145
  bridgeEndpoint?: string | null;
2099
2146
  onAuthError?: (statusCode: number) => void;
2100
2147
  onOpenFile?: (path: string) => void;