@hachej/boring-workspace 0.1.31 → 0.1.33

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.
@@ -1481,6 +1481,9 @@
1481
1481
  .end {
1482
1482
  inset-inline-end: var(--spacing);
1483
1483
  }
1484
+ .-top-1\.5 {
1485
+ top: calc(var(--spacing) * -1.5);
1486
+ }
1484
1487
  .top-0 {
1485
1488
  top: calc(var(--spacing) * 0);
1486
1489
  }
@@ -1499,9 +1502,6 @@
1499
1502
  .right-0 {
1500
1503
  right: calc(var(--spacing) * 0);
1501
1504
  }
1502
- .right-1 {
1503
- right: calc(var(--spacing) * 1);
1504
- }
1505
1505
  .right-2 {
1506
1506
  right: calc(var(--spacing) * 2);
1507
1507
  }
@@ -1595,9 +1595,6 @@
1595
1595
  .mt-px {
1596
1596
  margin-top: 1px;
1597
1597
  }
1598
- .mr-1 {
1599
- margin-right: calc(var(--spacing) * 1);
1600
- }
1601
1598
  .mr-auto {
1602
1599
  margin-right: auto;
1603
1600
  }
@@ -1668,6 +1665,10 @@
1668
1665
  width: calc(var(--spacing) * 4);
1669
1666
  height: calc(var(--spacing) * 4);
1670
1667
  }
1668
+ .size-7 {
1669
+ width: calc(var(--spacing) * 7);
1670
+ height: calc(var(--spacing) * 7);
1671
+ }
1671
1672
  .size-\[22px\] {
1672
1673
  width: 22px;
1673
1674
  height: 22px;
@@ -1675,6 +1676,9 @@
1675
1676
  .h-1\.5 {
1676
1677
  height: calc(var(--spacing) * 1.5);
1677
1678
  }
1679
+ .h-2 {
1680
+ height: calc(var(--spacing) * 2);
1681
+ }
1678
1682
  .h-3 {
1679
1683
  height: calc(var(--spacing) * 3);
1680
1684
  }
@@ -1702,6 +1706,9 @@
1702
1706
  .h-12 {
1703
1707
  height: calc(var(--spacing) * 12);
1704
1708
  }
1709
+ .h-\[15px\] {
1710
+ height: 15px;
1711
+ }
1705
1712
  .h-auto {
1706
1713
  height: auto;
1707
1714
  }
@@ -1738,6 +1745,9 @@
1738
1745
  .w-1\.5 {
1739
1746
  width: calc(var(--spacing) * 1.5);
1740
1747
  }
1748
+ .w-2 {
1749
+ width: calc(var(--spacing) * 2);
1750
+ }
1741
1751
  .w-3 {
1742
1752
  width: calc(var(--spacing) * 3);
1743
1753
  }
@@ -1762,6 +1772,9 @@
1762
1772
  .w-11 {
1763
1773
  width: calc(var(--spacing) * 11);
1764
1774
  }
1775
+ .w-\[15px\] {
1776
+ width: 15px;
1777
+ }
1765
1778
  .w-\[85vw\] {
1766
1779
  width: 85vw;
1767
1780
  }
@@ -1804,20 +1817,22 @@
1804
1817
  .flex-1 {
1805
1818
  flex: 1;
1806
1819
  }
1820
+ .flex-\[0_0_0px\] {
1821
+ flex: 0 0 0px;
1822
+ }
1807
1823
  .flex-none {
1808
1824
  flex: none;
1809
1825
  }
1810
1826
  .shrink-0 {
1811
1827
  flex-shrink: 0;
1812
1828
  }
1829
+ .flex-grow {
1830
+ flex-grow: 1;
1831
+ }
1813
1832
  .translate-x-1\/2 {
1814
1833
  --tw-translate-x: calc(1 / 2 * 100%);
1815
1834
  translate: var(--tw-translate-x) var(--tw-translate-y);
1816
1835
  }
1817
- .-translate-y-1\/2 {
1818
- --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
1819
- translate: var(--tw-translate-x) var(--tw-translate-y);
1820
- }
1821
1836
  .translate-y-1\/2 {
1822
1837
  --tw-translate-y: calc(1 / 2 * 100%);
1823
1838
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -2250,18 +2265,12 @@
2250
2265
  .pt-12 {
2251
2266
  padding-top: calc(var(--spacing) * 12);
2252
2267
  }
2253
- .pr-7 {
2254
- padding-right: calc(var(--spacing) * 7);
2255
- }
2256
2268
  .pb-2 {
2257
2269
  padding-bottom: calc(var(--spacing) * 2);
2258
2270
  }
2259
2271
  .pb-10 {
2260
2272
  padding-bottom: calc(var(--spacing) * 10);
2261
2273
  }
2262
- .pl-2\.5 {
2263
- padding-left: calc(var(--spacing) * 2.5);
2264
- }
2265
2274
  .pl-3 {
2266
2275
  padding-left: calc(var(--spacing) * 3);
2267
2276
  }
@@ -2271,6 +2280,9 @@
2271
2280
  .pl-10 {
2272
2281
  padding-left: calc(var(--spacing) * 10);
2273
2282
  }
2283
+ .pl-14 {
2284
+ padding-left: calc(var(--spacing) * 14);
2285
+ }
2274
2286
  .text-center {
2275
2287
  text-align: center;
2276
2288
  }
@@ -2578,6 +2590,16 @@
2578
2590
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2579
2591
  transition-duration: var(--tw-duration, var(--default-transition-duration));
2580
2592
  }
2593
+ .transition-\[flex-grow\,flex-basis\,width\,min-width\,max-width\] {
2594
+ transition-property: flex-grow,flex-basis,width,min-width,max-width;
2595
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2596
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
2597
+ }
2598
+ .transition-\[opacity\,padding\] {
2599
+ transition-property: opacity,padding;
2600
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2601
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
2602
+ }
2581
2603
  .transition-\[width\,min-width\,max-width\] {
2582
2604
  transition-property: width,min-width,max-width;
2583
2605
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -2666,10 +2688,10 @@
2666
2688
  }
2667
2689
  }
2668
2690
  }
2669
- .hover\:-translate-y-\[calc\(50\%\+1px\)\] {
2691
+ .hover\:-translate-y-\[1px\] {
2670
2692
  &:hover {
2671
2693
  @media (hover: hover) {
2672
- --tw-translate-y: calc(calc(50% + 1px) * -1);
2694
+ --tw-translate-y: calc(1px * -1);
2673
2695
  translate: var(--tw-translate-x) var(--tw-translate-y);
2674
2696
  }
2675
2697
  }
@@ -2885,6 +2907,21 @@
2885
2907
  }
2886
2908
  }
2887
2909
  }
2910
+ .disabled\:pointer-events-none {
2911
+ &:disabled {
2912
+ pointer-events: none;
2913
+ }
2914
+ }
2915
+ .disabled\:opacity-50 {
2916
+ &:disabled {
2917
+ opacity: 50%;
2918
+ }
2919
+ }
2920
+ .disabled\:opacity-60 {
2921
+ &:disabled {
2922
+ opacity: 60%;
2923
+ }
2924
+ }
2888
2925
  .aria-selected\:bg-\[color\:oklch\(from_var\(--accent\)_l_c_h\/0\.10\)\] {
2889
2926
  &[aria-selected="true"] {
2890
2927
  background-color: oklch(from var(--accent) l c h/0.10);
@@ -2976,9 +3013,9 @@
2976
3013
  color: var(--accent);
2977
3014
  }
2978
3015
  }
2979
- .\[\.active-tab_\&\]\:opacity-50 {
3016
+ .\[\.active-tab_\&\]\:opacity-55 {
2980
3017
  .active-tab & {
2981
- opacity: 50%;
3018
+ opacity: 55%;
2982
3019
  }
2983
3020
  }
2984
3021
  .\[\.active-tab_\&\]\:hover\:opacity-100 {
@@ -3003,9 +3040,9 @@
3003
3040
  color: var(--accent);
3004
3041
  }
3005
3042
  }
3006
- .\[\.dv-active-tab_\&\]\:opacity-50 {
3043
+ .\[\.dv-active-tab_\&\]\:opacity-55 {
3007
3044
  .dv-active-tab & {
3008
- opacity: 50%;
3045
+ opacity: 55%;
3009
3046
  }
3010
3047
  }
3011
3048
  .\[\.dv-active-tab_\&\]\:hover\:opacity-100 {
@@ -6437,8 +6474,8 @@
6437
6474
  .dv-shell .tabs-and-actions-container {
6438
6475
  background-color: var(--background) !important;
6439
6476
  border-bottom: 1px solid oklch(from var(--border) l c h / 0.4);
6440
- padding: 8px 6px 0 6px;
6441
- gap: 2px;
6477
+ padding: 6px 8px 0 8px;
6478
+ gap: 4px;
6442
6479
  align-items: flex-end;
6443
6480
  }
6444
6481
 
@@ -6446,6 +6483,9 @@
6446
6483
  .dv-shell .tab-container {
6447
6484
  background-color: transparent !important;
6448
6485
  gap: 4px;
6486
+ align-self: stretch;
6487
+ display: flex;
6488
+ align-items: flex-end;
6449
6489
  }
6450
6490
 
6451
6491
  /* Workbench-specific tab strip height — matches WorkbenchLeftPane header for consistency */
@@ -6463,21 +6503,33 @@
6463
6503
  padding-left: 44px !important;
6464
6504
  }
6465
6505
 
6506
+ /* The workbench renders a "close workspace" control as an absolute overlay on
6507
+ the right edge of the tab strip (see SurfaceShell's WorkbenchCloseAction:
6508
+ a 24px icon button + 4px margins each side = ~32px wide, vertically centred
6509
+ in the 44px bar). Reserve room at the right of the tab strip so dockview's
6510
+ built-in "open tabs" overflow dropdown trigger (the ⌄ chevron at the end of
6511
+ the tab row) sits clearly LEFT of that control with a visible gap, instead of
6512
+ tucking right under it. 32px control + ~8px gap + the chevron's own width. */
6513
+ .workbench-dockview .dv-tabs-and-actions-container,
6514
+ .workbench-dockview .tabs-and-actions-container {
6515
+ padding-right: 44px !important;
6516
+ }
6517
+
6466
6518
  /* Tab base — pill-style, rounded top */
6467
6519
  .dv-shell .dv-tab,
6468
6520
  .dv-shell .tab {
6469
6521
  color: var(--muted-foreground) !important;
6470
6522
  background-color: transparent !important;
6471
6523
  border: 1px solid transparent;
6472
- border-top-left-radius: 7px;
6473
- border-top-right-radius: 7px;
6524
+ border-top-left-radius: 8px;
6525
+ border-top-right-radius: 8px;
6474
6526
  transition: color 0.18s cubic-bezier(0.22, 1, 0.36, 1),
6475
6527
  background-color 0.18s cubic-bezier(0.22, 1, 0.36, 1),
6476
6528
  border-color 0.18s cubic-bezier(0.22, 1, 0.36, 1);
6477
6529
  min-width: 120px;
6478
6530
  max-width: 220px;
6479
6531
  padding: 0;
6480
- height: 32px;
6532
+ height: 34px;
6481
6533
  align-self: end;
6482
6534
  font-size: 12.5px;
6483
6535
  letter-spacing: -0.01em;
@@ -6581,6 +6633,11 @@
6581
6633
  color: var(--muted-foreground);
6582
6634
  display: flex;
6583
6635
  align-items: center;
6636
+ align-self: stretch;
6637
+ /* No bottom padding: the overflow (⌄) trigger lives here and must stay
6638
+ vertically centred in the tab strip so it lines up with the absolutely
6639
+ positioned close-workspace control on the right edge. A bottom pad pushed
6640
+ the chevron up and out of alignment with that control (regression). */
6584
6641
  }
6585
6642
 
6586
6643
  .dv-shell .right-actions-container:hover,
@@ -10,6 +10,7 @@ import { Extension } from '@codemirror/state';
10
10
  import { JSX } from 'react/jsx-runtime';
11
11
  import { JSXElementConstructor } from 'react';
12
12
  import { LucideIcon } from 'lucide-react';
13
+ import { MouseEvent as MouseEvent_2 } from 'react';
13
14
  import { PersistOptions } from 'zustand/middleware';
14
15
  import { ReactElement } from 'react';
15
16
  import { ReactNode } from 'react';
@@ -726,6 +727,31 @@ declare interface FileEntry {
726
727
  path: string;
727
728
  }
728
729
 
730
+ export declare type FileRecordsFormat = "json-array" | "ndjson" | "csv";
731
+
732
+ export declare interface FileRecordsResult {
733
+ source: FileRecordsSource;
734
+ path: string;
735
+ format: FileRecordsFormat;
736
+ columns: {
737
+ name: string;
738
+ type: string;
739
+ }[];
740
+ rows: Record<string, unknown>[];
741
+ total: number;
742
+ hasMore: boolean;
743
+ offset: number;
744
+ limit: number;
745
+ mtimeMs?: number;
746
+ }
747
+
748
+ export declare interface FileRecordsSource {
749
+ kind: "file";
750
+ path: string;
751
+ format: FileRecordsFormat;
752
+ recordSet?: string;
753
+ }
754
+
729
755
  declare interface FileStat {
730
756
  size: number;
731
757
  mtimeMs: number;
@@ -1093,6 +1119,8 @@ export declare interface PanelConfig<T = any> {
1093
1119
  /** Source: "builtin" | "app" */
1094
1120
  source?: string;
1095
1121
  pluginId?: string;
1122
+ /** Revision emitted by the runtime plugin asset manager for hot-loaded panels. */
1123
+ pluginRevision?: number;
1096
1124
  /**
1097
1125
  * Whether to wrap the component with React.lazy + Suspense. Omit to let
1098
1126
  * the registry auto-detect: zero-arg functions (factories) are treated as
@@ -1268,6 +1296,21 @@ declare interface Props {
1268
1296
  contributionKind: "panel" | "catalog-row" | "chat-suggestion";
1269
1297
  contributionId?: string;
1270
1298
  children?: ReactNode;
1299
+ onError?: (error: Error, info: ErrorInfo) => void;
1300
+ }
1301
+
1302
+ export declare function readFileRecords(options: ReadFileRecordsOptions): Promise<FileRecordsResult>;
1303
+
1304
+ export declare interface ReadFileRecordsOptions {
1305
+ path: string;
1306
+ recordSet?: string;
1307
+ offset?: number;
1308
+ limit?: number;
1309
+ q?: string;
1310
+ apiBaseUrl?: string;
1311
+ headers?: Record<string, string>;
1312
+ workspaceId?: string;
1313
+ signal?: AbortSignal;
1271
1314
  }
1272
1315
 
1273
1316
  declare interface RegisteredPluginMeta {
@@ -1294,7 +1337,7 @@ export declare interface ResponsiveDockviewShellProps {
1294
1337
 
1295
1338
  export declare type SerializedLayout = Parameters<DockviewApi["fromJSON"]>[0];
1296
1339
 
1297
- export declare function SessionBrowser({ sessions, activeId, onSwitch, onCreate, onDelete, onClose, className, }: SessionBrowserProps): JSX.Element;
1340
+ export declare function SessionBrowser({ sessions, activeId, onSwitch, onCreate, onDelete, onLoadMore, hasMore, loadingMore, onClose, className, }: SessionBrowserProps): JSX.Element;
1298
1341
 
1299
1342
  export declare interface SessionBrowserProps {
1300
1343
  sessions: SessionItem[];
@@ -1302,6 +1345,9 @@ export declare interface SessionBrowserProps {
1302
1345
  onSwitch?: (id: string) => void;
1303
1346
  onCreate?: () => void;
1304
1347
  onDelete?: (id: string) => void;
1348
+ onLoadMore?: () => void;
1349
+ hasMore?: boolean;
1350
+ loadingMore?: boolean;
1305
1351
  onClose?: () => void;
1306
1352
  className?: string;
1307
1353
  }
@@ -1504,7 +1550,7 @@ export declare interface ToolExecContext {
1504
1550
  sessionId?: string;
1505
1551
  }
1506
1552
 
1507
- declare type ToolReadinessRequirement = 'workspace-fs' | 'sandbox-exec' | 'ui-bridge';
1553
+ declare type ToolReadinessRequirement = 'workspace-fs' | 'sandbox-exec' | 'ui-bridge' | 'runtime-dependencies' | `runtime:${string}`;
1508
1554
 
1509
1555
  export declare interface ToolResult {
1510
1556
  content: Array<{
@@ -1767,7 +1813,14 @@ export declare function useWorkspaceContextOptional(): WorkspaceContextValue | n
1767
1813
 
1768
1814
  export declare function useWorkspaceRequestId(): string | null;
1769
1815
 
1770
- export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, revealFileTreeRequest, onCollapse, className, }: WorkbenchLeftPaneProps): JSX.Element;
1816
+ export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, revealFileTreeRequest, onOpenPanel, onCollapse, className, }: WorkbenchLeftPaneProps): JSX.Element;
1817
+
1818
+ declare interface WorkbenchLeftPaneOpenPanelConfig {
1819
+ id: string;
1820
+ component: string;
1821
+ title?: string;
1822
+ params?: Record<string, unknown>;
1823
+ }
1771
1824
 
1772
1825
  export declare interface WorkbenchLeftPaneProps {
1773
1826
  rootDir?: string;
@@ -1777,6 +1830,7 @@ export declare interface WorkbenchLeftPaneProps {
1777
1830
  path: string;
1778
1831
  seq: number;
1779
1832
  } | null;
1833
+ onOpenPanel?: (config: WorkbenchLeftPaneOpenPanelConfig) => void;
1780
1834
  onCollapse?: () => void;
1781
1835
  className?: string;
1782
1836
  }
@@ -1935,6 +1989,41 @@ declare interface WorkspaceHostEventMap {
1935
1989
  };
1936
1990
  }
1937
1991
 
1992
+ export declare function WorkspaceLink({ to, children, className, title, href, onClick }: WorkspaceLinkProps): ReactElement;
1993
+
1994
+ export declare function workspaceLinkCommand(to: WorkspaceLinkTarget): UiCommand;
1995
+
1996
+ export declare function workspaceLinkHref(to: WorkspaceLinkTarget): string;
1997
+
1998
+ export declare interface WorkspaceLinkProps {
1999
+ to: WorkspaceLinkTarget;
2000
+ children: ReactNode;
2001
+ className?: string;
2002
+ title?: string;
2003
+ href?: string;
2004
+ onClick?: (event: MouseEvent_2<HTMLAnchorElement>) => void;
2005
+ }
2006
+
2007
+ export declare type WorkspaceLinkTarget = {
2008
+ kind: "openFile";
2009
+ path: string;
2010
+ mode?: "view" | "edit" | "diff";
2011
+ } | {
2012
+ kind: "openSurface";
2013
+ surfaceKind: string;
2014
+ target: string;
2015
+ meta?: Record<string, unknown>;
2016
+ } | {
2017
+ kind: "openPanel";
2018
+ id: string;
2019
+ component: string;
2020
+ title?: string;
2021
+ params?: Record<string, unknown>;
2022
+ } | {
2023
+ kind: "expandToFile";
2024
+ path: string;
2025
+ };
2026
+
1938
2027
  export declare function WorkspaceLoadingState({ title, description, status, fullscreen, className, }: WorkspaceLoadingStateProps): JSX.Element;
1939
2028
 
1940
2029
  export declare interface WorkspaceLoadingStateProps {