@hachej/boring-workspace 0.1.30 → 0.1.32

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,16 @@
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
+ }
2888
2920
  .aria-selected\:bg-\[color\:oklch\(from_var\(--accent\)_l_c_h\/0\.10\)\] {
2889
2921
  &[aria-selected="true"] {
2890
2922
  background-color: oklch(from var(--accent) l c h/0.10);
@@ -2976,9 +3008,9 @@
2976
3008
  color: var(--accent);
2977
3009
  }
2978
3010
  }
2979
- .\[\.active-tab_\&\]\:opacity-50 {
3011
+ .\[\.active-tab_\&\]\:opacity-55 {
2980
3012
  .active-tab & {
2981
- opacity: 50%;
3013
+ opacity: 55%;
2982
3014
  }
2983
3015
  }
2984
3016
  .\[\.active-tab_\&\]\:hover\:opacity-100 {
@@ -3003,9 +3035,9 @@
3003
3035
  color: var(--accent);
3004
3036
  }
3005
3037
  }
3006
- .\[\.dv-active-tab_\&\]\:opacity-50 {
3038
+ .\[\.dv-active-tab_\&\]\:opacity-55 {
3007
3039
  .dv-active-tab & {
3008
- opacity: 50%;
3040
+ opacity: 55%;
3009
3041
  }
3010
3042
  }
3011
3043
  .\[\.dv-active-tab_\&\]\:hover\:opacity-100 {
@@ -6437,8 +6469,8 @@
6437
6469
  .dv-shell .tabs-and-actions-container {
6438
6470
  background-color: var(--background) !important;
6439
6471
  border-bottom: 1px solid oklch(from var(--border) l c h / 0.4);
6440
- padding: 8px 6px 0 6px;
6441
- gap: 2px;
6472
+ padding: 6px 8px 0 8px;
6473
+ gap: 4px;
6442
6474
  align-items: flex-end;
6443
6475
  }
6444
6476
 
@@ -6446,6 +6478,9 @@
6446
6478
  .dv-shell .tab-container {
6447
6479
  background-color: transparent !important;
6448
6480
  gap: 4px;
6481
+ align-self: stretch;
6482
+ display: flex;
6483
+ align-items: flex-end;
6449
6484
  }
6450
6485
 
6451
6486
  /* Workbench-specific tab strip height — matches WorkbenchLeftPane header for consistency */
@@ -6463,21 +6498,33 @@
6463
6498
  padding-left: 44px !important;
6464
6499
  }
6465
6500
 
6501
+ /* The workbench renders a "close workspace" control as an absolute overlay on
6502
+ the right edge of the tab strip (see SurfaceShell's WorkbenchCloseAction:
6503
+ a 24px icon button + 4px margins each side = ~32px wide, vertically centred
6504
+ in the 44px bar). Reserve room at the right of the tab strip so dockview's
6505
+ built-in "open tabs" overflow dropdown trigger (the ⌄ chevron at the end of
6506
+ the tab row) sits clearly LEFT of that control with a visible gap, instead of
6507
+ tucking right under it. 32px control + ~8px gap + the chevron's own width. */
6508
+ .workbench-dockview .dv-tabs-and-actions-container,
6509
+ .workbench-dockview .tabs-and-actions-container {
6510
+ padding-right: 44px !important;
6511
+ }
6512
+
6466
6513
  /* Tab base — pill-style, rounded top */
6467
6514
  .dv-shell .dv-tab,
6468
6515
  .dv-shell .tab {
6469
6516
  color: var(--muted-foreground) !important;
6470
6517
  background-color: transparent !important;
6471
6518
  border: 1px solid transparent;
6472
- border-top-left-radius: 7px;
6473
- border-top-right-radius: 7px;
6519
+ border-top-left-radius: 8px;
6520
+ border-top-right-radius: 8px;
6474
6521
  transition: color 0.18s cubic-bezier(0.22, 1, 0.36, 1),
6475
6522
  background-color 0.18s cubic-bezier(0.22, 1, 0.36, 1),
6476
6523
  border-color 0.18s cubic-bezier(0.22, 1, 0.36, 1);
6477
6524
  min-width: 120px;
6478
6525
  max-width: 220px;
6479
6526
  padding: 0;
6480
- height: 32px;
6527
+ height: 34px;
6481
6528
  align-self: end;
6482
6529
  font-size: 12.5px;
6483
6530
  letter-spacing: -0.01em;
@@ -6581,6 +6628,11 @@
6581
6628
  color: var(--muted-foreground);
6582
6629
  display: flex;
6583
6630
  align-items: center;
6631
+ align-self: stretch;
6632
+ /* No bottom padding: the overflow (⌄) trigger lives here and must stay
6633
+ vertically centred in the tab strip so it lines up with the absolutely
6634
+ positioned close-workspace control on the right edge. A bottom pad pushed
6635
+ the chevron up and out of alignment with that control (regression). */
6584
6636
  }
6585
6637
 
6586
6638
  .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 {
@@ -1504,7 +1547,7 @@ export declare interface ToolExecContext {
1504
1547
  sessionId?: string;
1505
1548
  }
1506
1549
 
1507
- declare type ToolReadinessRequirement = 'workspace-fs' | 'sandbox-exec' | 'ui-bridge';
1550
+ declare type ToolReadinessRequirement = 'workspace-fs' | 'sandbox-exec' | 'ui-bridge' | 'runtime-dependencies' | `runtime:${string}`;
1508
1551
 
1509
1552
  export declare interface ToolResult {
1510
1553
  content: Array<{
@@ -1767,7 +1810,14 @@ export declare function useWorkspaceContextOptional(): WorkspaceContextValue | n
1767
1810
 
1768
1811
  export declare function useWorkspaceRequestId(): string | null;
1769
1812
 
1770
- export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, revealFileTreeRequest, onCollapse, className, }: WorkbenchLeftPaneProps): JSX.Element;
1813
+ export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, revealFileTreeRequest, onOpenPanel, onCollapse, className, }: WorkbenchLeftPaneProps): JSX.Element;
1814
+
1815
+ declare interface WorkbenchLeftPaneOpenPanelConfig {
1816
+ id: string;
1817
+ component: string;
1818
+ title?: string;
1819
+ params?: Record<string, unknown>;
1820
+ }
1771
1821
 
1772
1822
  export declare interface WorkbenchLeftPaneProps {
1773
1823
  rootDir?: string;
@@ -1777,6 +1827,7 @@ export declare interface WorkbenchLeftPaneProps {
1777
1827
  path: string;
1778
1828
  seq: number;
1779
1829
  } | null;
1830
+ onOpenPanel?: (config: WorkbenchLeftPaneOpenPanelConfig) => void;
1780
1831
  onCollapse?: () => void;
1781
1832
  className?: string;
1782
1833
  }
@@ -1935,6 +1986,41 @@ declare interface WorkspaceHostEventMap {
1935
1986
  };
1936
1987
  }
1937
1988
 
1989
+ export declare function WorkspaceLink({ to, children, className, title, href, onClick }: WorkspaceLinkProps): ReactElement;
1990
+
1991
+ export declare function workspaceLinkCommand(to: WorkspaceLinkTarget): UiCommand;
1992
+
1993
+ export declare function workspaceLinkHref(to: WorkspaceLinkTarget): string;
1994
+
1995
+ export declare interface WorkspaceLinkProps {
1996
+ to: WorkspaceLinkTarget;
1997
+ children: ReactNode;
1998
+ className?: string;
1999
+ title?: string;
2000
+ href?: string;
2001
+ onClick?: (event: MouseEvent_2<HTMLAnchorElement>) => void;
2002
+ }
2003
+
2004
+ export declare type WorkspaceLinkTarget = {
2005
+ kind: "openFile";
2006
+ path: string;
2007
+ mode?: "view" | "edit" | "diff";
2008
+ } | {
2009
+ kind: "openSurface";
2010
+ surfaceKind: string;
2011
+ target: string;
2012
+ meta?: Record<string, unknown>;
2013
+ } | {
2014
+ kind: "openPanel";
2015
+ id: string;
2016
+ component: string;
2017
+ title?: string;
2018
+ params?: Record<string, unknown>;
2019
+ } | {
2020
+ kind: "expandToFile";
2021
+ path: string;
2022
+ };
2023
+
1938
2024
  export declare function WorkspaceLoadingState({ title, description, status, fullscreen, className, }: WorkspaceLoadingStateProps): JSX.Element;
1939
2025
 
1940
2026
  export declare interface WorkspaceLoadingStateProps {