@pstdio/workbench 0.2.0 → 0.3.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 (39) hide show
  1. package/README.md +100 -88
  2. package/dist/context-key-service-W4QEfVdN.js +1031 -0
  3. package/dist/context-key-service-W4QEfVdN.js.map +1 -0
  4. package/dist/extensions.d.ts +737 -255
  5. package/dist/extensions.js +891 -699
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-DrrhYnb_.js.map +1 -1
  8. package/dist/index.d.ts +746 -448
  9. package/dist/index.js +2974 -60
  10. package/dist/index.js.map +1 -1
  11. package/dist/layout-types-DMoZz38-.js +100 -0
  12. package/dist/layout-types-DMoZz38-.js.map +1 -0
  13. package/dist/react.d.ts +735 -231
  14. package/dist/react.js +3562 -2584
  15. package/dist/react.js.map +1 -1
  16. package/dist/storage.d.ts +109 -14
  17. package/dist/storage.js +142 -47
  18. package/dist/storage.js.map +1 -1
  19. package/dist/surface-map-C1pOTUmF.js +52 -0
  20. package/dist/surface-map-C1pOTUmF.js.map +1 -0
  21. package/dist/testing.d.ts +685 -198
  22. package/dist/testing.js +46 -34
  23. package/dist/testing.js.map +1 -1
  24. package/dist/webview-runtime.js +5 -1
  25. package/dist/webview-runtime.js.map +1 -1
  26. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  27. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  28. package/package.json +6 -7
  29. package/dist/context-key-service-C--cHa0B.js +0 -447
  30. package/dist/context-key-service-C--cHa0B.js.map +0 -1
  31. package/dist/core.d.ts +0 -1885
  32. package/dist/core.js +0 -64
  33. package/dist/core.js.map +0 -1
  34. package/dist/surface-reconcile-DkRf01ro.js +0 -260
  35. package/dist/surface-reconcile-DkRf01ro.js.map +0 -1
  36. package/dist/workbench-core-DFpwi8Lo.js +0 -2264
  37. package/dist/workbench-core-DFpwi8Lo.js.map +0 -1
  38. package/dist/workbench-menu-paths-CQVH6z4_.js +0 -11
  39. package/dist/workbench-menu-paths-CQVH6z4_.js.map +0 -1
package/dist/testing.d.ts CHANGED
@@ -13,7 +13,7 @@ declare interface AttributeDescriptor {
13
13
  displayable?: boolean;
14
14
  editable?: boolean;
15
15
  display?: AttributeDisplayDescriptor;
16
- render?: (value: unknown, row: DataRendererRow) => ReactNode;
16
+ render?: (value: unknown, row: KanbanRendererRow) => ReactNode;
17
17
  compare?: (a: unknown, b: unknown) => number;
18
18
  }
19
19
 
@@ -76,7 +76,7 @@ declare interface CollectionSettingsPanel<TItem = unknown> extends SettingsPanel
76
76
  itemLabel(item: TItem): string;
77
77
  itemIcon?(item: TItem): string | undefined;
78
78
  groupBy?: SettingsCollectionGroupBy<TItem>;
79
- renderItem(item: TItem, input: WorkbenchWidgetRenderInput): unknown;
79
+ renderItem(item: TItem, input: WorkbenchPanelRenderInput): unknown;
80
80
  actions?: SettingsAction[];
81
81
  }
82
82
 
@@ -219,8 +219,6 @@ declare interface ControlsQueryResult {
219
219
  readOnly?: boolean;
220
220
  }
221
221
 
222
- declare type ControlsRendererArea = "main-right" | "secondary" | "overlay";
223
-
224
222
  declare interface ControlsRendererContribution {
225
223
  id: string;
226
224
  title: string;
@@ -240,12 +238,12 @@ declare interface ControlsRendererContribution {
240
238
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
241
239
  }
242
240
 
243
- declare type ControlsRendererImplementation = (input: WorkbenchWidgetRenderInput & {
241
+ declare type ControlsRendererImplementation = (input: WorkbenchPanelRenderInput & {
244
242
  controlsRendererId: string;
245
243
  }) => unknown;
246
244
 
247
245
  declare interface ControlsRendererLayout {
248
- area?: ControlsRendererArea;
246
+ region?: ControlsRendererRegion;
249
247
  defaultPx?: number;
250
248
  minPx?: number;
251
249
  maxPx?: number;
@@ -257,6 +255,8 @@ declare interface ControlsRendererRefreshEvent {
257
255
 
258
256
  declare type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;
259
257
 
258
+ declare type ControlsRendererRegion = "main-right-menu" | "secondary" | "overlay";
259
+
260
260
  declare interface ControlsRendererRegistry {
261
261
  controlsStore: WorkbenchStore<ControlsRendererStoreState>;
262
262
  registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable_2;
@@ -289,108 +289,113 @@ declare interface ControlsUpdateValueInput {
289
289
  */
290
290
  declare interface CustomSettingsPanel extends SettingsPanelBase {
291
291
  kind: "custom";
292
- render(input: WorkbenchWidgetRenderInput): unknown;
292
+ render(input: WorkbenchPanelRenderInput): unknown;
293
293
  }
294
294
 
295
- declare interface DataRendererContribution<TRow extends DataRendererRow = DataRendererRow> {
295
+ declare interface DataTableRendererColumn {
296
+ id: string;
297
+ label?: string;
298
+ description?: string;
299
+ icon?: unknown;
300
+ hidden?: boolean;
301
+ stat?: DataTableRendererColumnStat;
302
+ renderer?: DataTableRendererColumnRenderer;
303
+ }
304
+
305
+ declare type DataTableRendererColumnRenderer = {
306
+ type: "json";
307
+ } | {
308
+ type: "color-scale";
309
+ stops: Array<{
310
+ value: number;
311
+ color: DataTableRendererThemeColor;
312
+ }>;
313
+ } | {
314
+ type: "categorical-color";
315
+ categories: Array<{
316
+ value: string | number | boolean | null;
317
+ color: DataTableRendererThemeColor;
318
+ }>;
319
+ };
320
+
321
+ declare type DataTableRendererColumnStat = {
322
+ type: "unique";
323
+ } | {
324
+ type: "histogram";
325
+ bins?: number;
326
+ } | {
327
+ type: "top-values";
328
+ limit?: number;
329
+ };
330
+
331
+ declare interface DataTableRendererContribution {
296
332
  id: string;
297
333
  title: string;
298
334
  resourceKind?: string;
299
- /**
300
- * Declarative attribute schema. The renderer dispatches filter / group /
301
- * sort / display / inline-edit behavior on each descriptor's `type.kind`.
302
- *
303
- * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a
304
- * static array to let the contribution mutate its schema at runtime —
305
- * `WorkbenchDataView` subscribes so additions / removals / kind changes
306
- * propagate live without re-registering the renderer.
307
- */
308
- attributes: AttributeDescriptor[] | AttributesSource;
309
- /** Per-board-column overrides (color, drag/create rules, custom actions). */
310
- getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;
311
- hideToolbar?: boolean;
335
+ columns?: DataTableRendererColumn[];
336
+ rowActions?: DataTableRendererRowAction[];
337
+ initialPageSize?: number;
338
+ pageSizeOptions?: number[];
312
339
  emptyTitle?: string;
313
340
  emptyDescription?: string;
314
- /** Initial settings/filters applied when the data renderer mounts. */
315
- defaultSettings?: Partial<DataRendererSettings>;
316
- defaultFilters?: DataRendererFilterState;
317
- /**
318
- * Data source. Receives the current display state so backends can paginate
319
- * / filter / sort. The renderer re-applies filter / sort / group locally,
320
- * so this can return unfiltered rows in simple cases.
321
- */
322
- executeQuery(state: DataRendererQueryState): Promise<TRow[]> | TRow[];
341
+ executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
323
342
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
324
- /** Row interactions surfaced by the renderer (mirrored from <DataRenderer>). */
325
- onRowClick?: (row: TRow) => void;
326
- /** Per-row right-click context menu actions (mirrored from <DataRenderer>). */
327
- getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
328
- /**
329
- * Fires for inline attribute edits AND for cross-column drag-to-reorder on
330
- * the board (the renderer passes the grouping attribute id + the target
331
- * column value).
332
- */
333
- onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;
334
- /** Manual within-column reorder (only fires when ordering is manual). */
335
- onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;
336
- onCreateRow?: (columnId: string) => void;
337
- onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
343
+ onRowClick?: (row: DataTableRendererRow) => void;
338
344
  }
339
345
 
340
- declare type DataRendererFilterState = Record<string, string[]>;
341
-
342
- declare type DataRendererImplementation = (input: WorkbenchWidgetRenderInput & {
343
- dataRendererId: string;
346
+ declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
347
+ dataTableRendererId: string;
344
348
  }) => unknown;
345
349
 
346
- declare interface DataRendererOrdering {
347
- attributeId: string | typeof MANUAL_ORDERING;
348
- direction: SortDirection;
350
+ declare interface DataTableRendererQueryContext {
351
+ resource?: ResourceRef;
352
+ modeId?: string;
349
353
  }
350
354
 
351
- declare interface DataRendererQueryState {
352
- settings: DataRendererSettings;
353
- filters: DataRendererFilterState;
355
+ declare interface DataTableRendererQueryResult {
356
+ rows: DataTableRendererRow[];
357
+ columns?: DataTableRendererColumn[];
354
358
  }
355
359
 
356
- declare interface DataRendererRefreshEvent {
357
- dataRendererId: string;
360
+ declare interface DataTableRendererRefreshEvent {
361
+ dataTableRendererId: string;
358
362
  }
359
363
 
360
- declare type DataRendererRefreshListener = (event: DataRendererRefreshEvent) => void;
364
+ declare interface DataTableRendererRegistry {
365
+ dataTableStore: WorkbenchStore<DataTableRendererStoreState>;
366
+ registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable_2;
367
+ setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;
368
+ getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;
369
+ listDataTableRenderers(): RegisteredDataTableRendererContribution[];
370
+ refreshDataTableRenderer(id: string): void;
371
+ onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable_2;
372
+ }
361
373
 
362
- declare interface DataRendererRegistry {
363
- dataStore: WorkbenchStore<DataRendererStoreState>;
364
- registerDataRenderer<TRow extends DataRendererRow = DataRendererRow>(contribution: DataRendererContribution<TRow>, metadata?: ContributionMetadata): Disposable_2;
365
- setDataRendererImplementation(impl: DataRendererImplementation): void;
366
- getDataRenderer(id: string): RegisteredDataRendererContribution | undefined;
367
- listDataRenderers(): RegisteredDataRendererContribution[];
368
- refreshDataRenderer(id: string): void;
369
- onDidRefreshDataRenderer(listener: DataRendererRefreshListener): Disposable_2;
374
+ declare interface DataTableRendererRow {
375
+ id: string;
376
+ values: Record<string, unknown>;
377
+ resource?: ResourceRef;
370
378
  }
371
379
 
372
- declare interface DataRendererRow {
380
+ declare interface DataTableRendererRowAction {
373
381
  id: string;
374
- title: string;
375
- /**
376
- * Optional navigation handle. When set, the renderer's default click handler
377
- * routes through the contribution's onRowClick (which typically opens the
378
- * resource via the workbench).
379
- */
380
- resource?: unknown;
381
- attributes: Record<string, unknown>;
382
+ label: string;
383
+ icon?: unknown;
384
+ destructive?: boolean;
385
+ run(row: DataTableRendererRow): Promise<void> | void;
382
386
  }
383
387
 
384
- declare interface DataRendererSettings {
385
- viewMode: ViewMode;
386
- columnGrouping: string | typeof NO_GROUPING;
387
- rowGrouping: string | typeof NO_GROUPING;
388
- ordering: DataRendererOrdering;
389
- displayProperties: string[];
388
+ declare interface DataTableRendererStoreState {
389
+ renderers: Record<string, RegisteredDataTableRendererContribution>;
390
390
  }
391
391
 
392
- declare interface DataRendererStoreState {
393
- renderers: Record<string, RegisteredDataRendererContribution>;
392
+ declare interface DataTableRendererThemeColor {
393
+ light: string;
394
+ dark: string;
395
+ foreground?: {
396
+ light: string;
397
+ dark: string;
398
+ };
394
399
  }
395
400
 
396
401
  export declare const describeResourceRouteContract: (contract: ResourceRouteContract) => void;
@@ -470,7 +475,7 @@ declare interface FileRendererContribution {
470
475
  save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
471
476
  }
472
477
 
473
- declare type FileRendererImplementation = (input: WorkbenchWidgetRenderInput & {
478
+ declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
474
479
  fileRendererId: string;
475
480
  }) => unknown;
476
481
 
@@ -501,24 +506,173 @@ declare interface HistoryController {
501
506
  goPrevious(): HistoryEntry | undefined;
502
507
  recentlyClosed(): readonly HistoryEntry[];
503
508
  reopenLastClosed(): HistoryEntry | undefined;
509
+ setPersistenceScope(scope: string | undefined): void;
510
+ getPersistenceScope(): string | undefined;
511
+ restore(): HistoryEntry | undefined;
512
+ flush(): void;
504
513
  clear(): void;
505
514
  }
506
515
 
507
- declare interface HistoryEntry {
508
- entryId: string;
509
- recordedAt: number;
510
- kind: "resource" | "widget" | "mode";
511
- modeId?: string;
512
- resource?: ResourceRef;
513
- widgetId?: string;
514
- contributionId?: string;
515
- title?: string;
516
- }
516
+ declare type HistoryEntry = WorkbenchNavigationEntry;
517
517
 
518
518
  declare interface HistoryStoreState {
519
- entries: readonly HistoryEntry[];
519
+ entries: readonly WorkbenchNavigationEntry[];
520
520
  cursor: number;
521
- recentlyClosed: readonly HistoryEntry[];
521
+ recentlyClosed: readonly WorkbenchNavigationEntry[];
522
+ hydrating: boolean;
523
+ }
524
+
525
+ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow> {
526
+ id: string;
527
+ title: string;
528
+ resourceKind?: string;
529
+ /**
530
+ * Declarative attribute schema. The renderer dispatches filter / group /
531
+ * sort / display / inline-edit behavior on each descriptor's `type.kind`.
532
+ *
533
+ * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a
534
+ * static array to let the contribution mutate its schema at runtime —
535
+ * `WorkbenchKanbanView` subscribes so additions / removals / kind changes
536
+ * propagate live without re-registering the renderer.
537
+ */
538
+ attributes: AttributeDescriptor[] | AttributesSource;
539
+ /** Per-board-column overrides (color, drag/create rules, custom actions). */
540
+ getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;
541
+ hideToolbar?: boolean;
542
+ emptyTitle?: string;
543
+ emptyDescription?: string;
544
+ /** Initial settings/filters applied when the kanban renderer mounts. */
545
+ defaultSettings?: Partial<KanbanRendererSettings>;
546
+ defaultFilters?: KanbanRendererFilterState;
547
+ defaultViews?: KanbanRendererSavedView[];
548
+ defaultActiveViewId?: string;
549
+ /**
550
+ * Data source. Receives the current display state so backends can paginate
551
+ * / filter / sort. The renderer re-applies filter / sort / group locally,
552
+ * so this can return unfiltered rows in simple cases.
553
+ */
554
+ executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
555
+ subscribe?: (listener: () => void) => Disposable_2 | (() => void);
556
+ /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
557
+ onRowClick?: (row: TRow) => void;
558
+ /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
559
+ getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
560
+ /**
561
+ * Fires for inline attribute edits AND for cross-column drag-to-reorder on
562
+ * the board (the renderer passes the grouping attribute id + the target
563
+ * column value).
564
+ */
565
+ onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;
566
+ /** Manual within-column reorder (only fires when ordering is manual). */
567
+ onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;
568
+ createRow?: KanbanRendererCreateRowConfig;
569
+ onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;
570
+ onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
571
+ }
572
+
573
+ declare interface KanbanRendererCreateField {
574
+ id: string;
575
+ label: string;
576
+ description?: string;
577
+ placeholder?: string;
578
+ type: KanbanRendererCreateFieldType;
579
+ required?: boolean;
580
+ defaultValue?: unknown;
581
+ options?: EnumOption[];
582
+ /** `files` fields only. */
583
+ multiple?: boolean;
584
+ accept?: string;
585
+ }
586
+
587
+ declare type KanbanRendererCreateFieldType = "text" | "longtext" | "markdown" | "number" | "boolean" | "select" | "multi-select" | "files";
588
+
589
+ /** Chrome copy is supplied by the caller so the dialog ships no strings of its own. */
590
+ declare interface KanbanRendererCreateLabels {
591
+ cancel: string;
592
+ properties: string;
593
+ submitError: string;
594
+ removeFile: string;
595
+ }
596
+
597
+ declare interface KanbanRendererCreateRowConfig {
598
+ title: string;
599
+ submitLabel: string;
600
+ fields: KanbanRendererCreateField[];
601
+ labels: KanbanRendererCreateLabels;
602
+ }
603
+
604
+ declare interface KanbanRendererCreateSubmission {
605
+ columnId: string;
606
+ columnAttributeId?: string;
607
+ /** Declared field values, excluding `files` fields — those arrive as `files`. */
608
+ values: Record<string, unknown>;
609
+ /** Every editable attribute the user set, keyed by attribute id. */
610
+ attributeValues: Record<string, unknown>;
611
+ files: File[];
612
+ }
613
+
614
+ declare type KanbanRendererFilterState = Record<string, string[]>;
615
+
616
+ declare type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & {
617
+ kanbanRendererId: string;
618
+ }) => unknown;
619
+
620
+ declare interface KanbanRendererOrdering {
621
+ attributeId: string | typeof MANUAL_ORDERING;
622
+ direction: SortDirection;
623
+ }
624
+
625
+ declare interface KanbanRendererQueryState {
626
+ settings: KanbanRendererSettings;
627
+ filters: KanbanRendererFilterState;
628
+ }
629
+
630
+ declare interface KanbanRendererRefreshEvent {
631
+ kanbanRendererId: string;
632
+ }
633
+
634
+ declare type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;
635
+
636
+ declare interface KanbanRendererRegistry {
637
+ dataStore: WorkbenchStore<KanbanRendererStoreState>;
638
+ registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(contribution: KanbanRendererContribution<TRow>, metadata?: ContributionMetadata): Disposable_2;
639
+ setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;
640
+ getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;
641
+ listKanbanRenderers(): RegisteredKanbanRendererContribution[];
642
+ refreshKanbanRenderer(id: string): void;
643
+ onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable_2;
644
+ }
645
+
646
+ declare interface KanbanRendererRow {
647
+ id: string;
648
+ title: string;
649
+ /**
650
+ * Optional navigation handle. When set, the renderer's default click handler
651
+ * routes through the contribution's onRowClick (which typically opens the
652
+ * resource via the workbench).
653
+ */
654
+ resource?: unknown;
655
+ attributes: Record<string, unknown>;
656
+ }
657
+
658
+ declare interface KanbanRendererSavedView {
659
+ id: string;
660
+ title: string;
661
+ settings: KanbanRendererSettings;
662
+ filters: KanbanRendererFilterState;
663
+ isDefault?: boolean;
664
+ }
665
+
666
+ declare interface KanbanRendererSettings {
667
+ viewMode: ViewMode;
668
+ columnGrouping: string | typeof NO_GROUPING;
669
+ rowGrouping: string | typeof NO_GROUPING;
670
+ ordering: KanbanRendererOrdering;
671
+ displayProperties: string[];
672
+ }
673
+
674
+ declare interface KanbanRendererStoreState {
675
+ renderers: Record<string, RegisteredKanbanRendererContribution>;
522
676
  }
523
677
 
524
678
  declare interface Keybinding {
@@ -546,33 +700,62 @@ declare interface LayoutModel {
546
700
  registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata): {
547
701
  dispose(): void;
548
702
  };
703
+ registerPanel(panel: WorkbenchPanelContribution, metadata?: ContributionMetadata): {
704
+ dispose(): void;
705
+ };
549
706
  registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): {
550
707
  dispose(): void;
551
708
  };
709
+ registerLocation(location: WorkbenchLocationContribution, metadata?: ContributionMetadata): {
710
+ dispose(): void;
711
+ };
712
+ registerSubPanel(subPanel: WorkbenchSubPanelContribution, metadata?: ContributionMetadata): {
713
+ dispose(): void;
714
+ };
715
+ registerPanelMenu(panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata): {
716
+ dispose(): void;
717
+ };
552
718
  unregisterWidget(id: string, options?: {
553
719
  removePlacements?: boolean;
554
720
  persist?: boolean;
555
721
  }): void;
556
- getPlaceholder(areaId: WorkbenchArea): RegisteredPlaceholderContribution | undefined;
722
+ getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;
557
723
  getWidget(id: string): RegisteredWidgetContribution | undefined;
558
- getAreaSize(areaId: WorkbenchArea): WorkbenchAreaSize | undefined;
559
- getAreaCollapsible(areaId: WorkbenchArea): boolean;
560
- getAreaHeaderBorderBottom(areaId: WorkbenchArea): boolean;
561
- setAreaVisible(areaId: WorkbenchArea, visible: boolean): void;
562
- setAreaSize(areaId: WorkbenchArea, size: number): void;
724
+ getPanel(id: string): WorkbenchPanelContribution | undefined;
725
+ getRegionSize(regionId: WorkbenchRegion): WorkbenchRegionSize | undefined;
726
+ getRegionCollapsible(regionId: WorkbenchRegion): boolean;
727
+ getRegionHeaderBorderBottom(regionId: WorkbenchRegion): boolean;
728
+ setRegionVisible(regionId: WorkbenchRegion, visible: boolean): void;
729
+ setRegionSize(regionId: WorkbenchRegion, size: number): void;
563
730
  listPlaceholders(): RegisteredPlaceholderContribution[];
564
731
  listWidgets(): RegisteredWidgetContribution[];
732
+ listPanels(): WorkbenchPanelContribution[];
733
+ listPanelInstances(region?: WorkbenchRegion): WorkbenchPanelInstance[];
734
+ getActivePanel(region?: WorkbenchRegion): WorkbenchPanelInstance | undefined;
565
735
  openWidget(id: string, input?: OpenWidgetInput): WorkbenchWidgetPlacement;
736
+ openPanel(id: string, input?: OpenWorkbenchPanelInput): WorkbenchPanelInstance;
737
+ updatePanel(instanceId: string, input: OpenWorkbenchPanelInput): WorkbenchPanelInstance;
738
+ reorderPanel(instanceId: string, position: WorkbenchTabPosition): void;
739
+ activatePanel(instanceId: string): WorkbenchPanelInstance;
740
+ closePanel(instanceId: string): WorkbenchPanelInstance | undefined;
566
741
  updateWidgetPlacement(widgetId: string, input: OpenWidgetInput): WorkbenchWidgetPlacement;
742
+ reorderWidget(widgetId: string, position: WorkbenchTabPosition): void;
743
+ expirePreviewTabs(ownerResourceUri?: string): void;
567
744
  activateWidget(widgetId: string): WorkbenchWidgetPlacement;
745
+ setRegionActiveWidget(regionId: WorkbenchRegion, widgetId: string | undefined): void;
568
746
  closeWidget(widgetId: string): WorkbenchWidgetPlacement | undefined;
569
747
  removeWidgetPlacement(widgetId: string): WorkbenchWidgetPlacement | undefined;
570
- clearArea(areaId: WorkbenchArea): void;
571
- resetAreas(): void;
748
+ clearRegion(regionId: WorkbenchRegion): void;
749
+ resetRegions(): void;
572
750
  getLayout(): WorkbenchLayout;
573
751
  restoreLayout(layout: WorkbenchLayout): void;
574
- setPersistenceScope(scope: LayoutScope | undefined): void;
752
+ setPersistenceScope(scope: LayoutScope | undefined, input?: {
753
+ carryRegionState?: readonly WorkbenchRegion[];
754
+ }): void;
575
755
  getPersistenceScope(): LayoutScope | undefined;
756
+ onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
757
+ dispose(): void;
758
+ };
576
759
  onDidChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
577
760
  dispose(): void;
578
761
  };
@@ -584,6 +767,7 @@ declare const MANUAL_ORDERING = "manual";
584
767
 
585
768
  declare interface MenuItem {
586
769
  commandId: string;
770
+ sourceCommandId?: string;
587
771
  label?: string;
588
772
  description?: string;
589
773
  icon?: string;
@@ -648,7 +832,13 @@ declare interface NavigationTargetCompound {
648
832
  targets: readonly NavigationTargetItem[];
649
833
  }
650
834
 
651
- declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetView | NavigationTargetCommand;
835
+ declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetPanel | NavigationTargetCommand;
836
+
837
+ declare interface NavigationTargetPanel {
838
+ kind: "panel";
839
+ panelId: string;
840
+ input?: OpenWorkbenchPanelInput;
841
+ }
652
842
 
653
843
  declare interface NavigationTargetResource {
654
844
  kind: "resource";
@@ -656,12 +846,6 @@ declare interface NavigationTargetResource {
656
846
  input?: OpenResourceInput;
657
847
  }
658
848
 
659
- declare interface NavigationTargetView {
660
- kind: "view";
661
- widgetId: string;
662
- input?: OpenWidgetInput;
663
- }
664
-
665
849
  declare const NO_GROUPING = "none";
666
850
 
667
851
  declare interface NotificationRegistry {
@@ -680,23 +864,38 @@ declare interface OpenResourceInput {
680
864
  declare interface OpenWidgetInput {
681
865
  resource?: ResourceRef;
682
866
  title?: string;
683
- area?: WorkbenchArea;
867
+ region?: WorkbenchRegion;
684
868
  ownerId?: string;
685
869
  source?: ContributionSource;
686
870
  pinned?: boolean;
687
871
  closable?: boolean;
688
872
  mountStrategy?: WidgetMountStrategy;
689
873
  hiddenByDefault?: boolean;
874
+ tabRetention?: WorkbenchTabRetention;
875
+ tabPosition?: WorkbenchTabPosition;
876
+ tab?: WorkbenchWidgetTab;
690
877
  replaceActive?: boolean;
878
+ replaceWidgetId?: string;
879
+ }
880
+
881
+ declare interface OpenWorkbenchPanelInput {
882
+ resource?: ResourceRef;
883
+ title?: string;
884
+ region?: WorkbenchRegion;
885
+ pinned?: boolean;
886
+ mountStrategy?: WorkbenchPanelMountStrategy;
887
+ hiddenByDefault?: boolean;
888
+ tab?: WorkbenchPanelTab;
889
+ strategy?: WorkbenchPanelOpenStrategy;
691
890
  }
692
891
 
693
892
  declare interface PlaceholderContribution {
694
893
  id: string;
695
894
  title: string;
696
- area: WorkbenchArea;
895
+ region: WorkbenchRegion;
697
896
  rendererId: string;
698
- areaSize?: WorkbenchAreaSize;
699
- areaCollapsible?: boolean;
897
+ regionSize?: WorkbenchRegionSize;
898
+ regionCollapsible?: boolean;
700
899
  config?: unknown;
701
900
  priority?: number;
702
901
  }
@@ -734,7 +933,7 @@ declare interface PreferenceScopeRef {
734
933
 
735
934
  declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
736
935
 
737
- export declare const primaryPlacements: (workbench: WorkbenchCore) => WorkbenchWidgetPlacement_2[];
936
+ export declare const primaryPlacements: (workbench: WorkbenchCore) => WorkbenchPanelInstance_2[];
738
937
 
739
938
  declare interface RegisteredCommand extends RegisteredContributionMetadata {
740
939
  command: Command;
@@ -750,12 +949,15 @@ declare interface RegisteredContributionMetadata {
750
949
  declare interface RegisteredControlsRendererContribution extends ControlsRendererContribution, RegisteredContributionMetadata {
751
950
  }
752
951
 
753
- declare interface RegisteredDataRendererContribution<TRow extends DataRendererRow = DataRendererRow> extends DataRendererContribution<TRow>, RegisteredContributionMetadata {
952
+ declare interface RegisteredDataTableRendererContribution extends DataTableRendererContribution, RegisteredContributionMetadata {
754
953
  }
755
954
 
756
955
  declare interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {
757
956
  }
758
957
 
958
+ declare interface RegisteredKanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow> extends KanbanRendererContribution<TRow>, RegisteredContributionMetadata {
959
+ }
960
+
759
961
  declare interface RegisteredKeepAliveHost {
760
962
  rendererId: string;
761
963
  host: HTMLElement;
@@ -791,8 +993,10 @@ declare interface RegisteredTreeRendererContribution extends TreeRendererContrib
791
993
  }
792
994
 
793
995
  declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority" | "singleton" | "reuse"> & {
996
+ ownedPanelMenuIds?: readonly string[];
794
997
  singleton: boolean;
795
998
  reuse: WidgetReusePolicy;
999
+ role: WorkbenchWidgetRole;
796
1000
  } & RegisteredContributionMetadata;
797
1001
 
798
1002
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -806,7 +1010,9 @@ declare interface RegisteredWorkbenchNotification extends RegisteredContribution
806
1010
  metadata?: Record<string, unknown>;
807
1011
  }
808
1012
 
809
- declare type ResolvedResourceOpener = Required<ResourceOpener>;
1013
+ declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1014
+
1015
+ declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
810
1016
 
811
1017
  declare interface ResourceBrowseEntry {
812
1018
  resource: ResourceRef;
@@ -828,6 +1034,13 @@ declare interface ResourceContextAction {
828
1034
  separatorBefore?: boolean;
829
1035
  }
830
1036
 
1037
+ declare interface ResourceHierarchyProvider {
1038
+ id: string;
1039
+ priority?: number;
1040
+ canResolve(resource: ResourceRef): boolean;
1041
+ getParent(resource: ResourceRef): ResourceRef | undefined;
1042
+ }
1043
+
831
1044
  declare interface ResourceKindContribution {
832
1045
  kind: string;
833
1046
  label: string;
@@ -848,11 +1061,11 @@ declare interface ResourceNavigator<TResult = unknown> {
848
1061
  navigate(resource: ResourceRef): TResult | Promise<TResult>;
849
1062
  }
850
1063
 
851
- declare interface ResourceOpener<TResult = unknown> {
1064
+ declare interface ResourcePresenter {
852
1065
  id: string;
853
1066
  priority?: number;
854
1067
  canOpen(resource: ResourceRef): boolean;
855
- open(resource: ResourceRef, input: OpenResourceInput): TResult | Promise<TResult>;
1068
+ open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;
856
1069
  }
857
1070
 
858
1071
  declare interface ResourceProvider {
@@ -885,19 +1098,24 @@ declare interface ResourceRegistry {
885
1098
  getKind(kind: string): RegisteredResourceKind | undefined;
886
1099
  getSurface(resource: ResourceRef): ResourceSurface | undefined;
887
1100
  listKinds(): RegisteredResourceKind[];
888
- registerOpener(opener: ResourceOpener): Disposable_2;
889
- listOpeners(): ResolvedResourceOpener[];
1101
+ registerPresenter(presenter: ResourcePresenter): Disposable_2;
1102
+ listPresenters(): ResolvedResourcePresenter[];
890
1103
  registerProvider(provider: ResourceProvider): Disposable_2;
891
1104
  listProviders(): ResourceProvider[];
892
1105
  listResources(query: string): readonly ResourceBrowseEntry[];
893
- openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<unknown>;
1106
+ registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1107
+ listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1108
+ walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1109
+ isOpeningResource(): boolean;
1110
+ openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
894
1111
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
895
1112
  }
896
1113
 
897
1114
  declare interface ResourceRegistryStoreState {
898
1115
  kinds: Record<string, RegisteredResourceKind>;
899
- openers: Record<string, ResolvedResourceOpener>;
1116
+ presenters: Record<string, ResolvedResourcePresenter>;
900
1117
  providers: Record<string, ResourceProvider>;
1118
+ hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;
901
1119
  }
902
1120
 
903
1121
  export declare interface ResourceRouteContract {
@@ -906,6 +1124,7 @@ export declare interface ResourceRouteContract {
906
1124
  root: ResourceRef;
907
1125
  detail: ResourceRef;
908
1126
  detailB?: ResourceRef;
1127
+ rootDetailHistory: "retained" | "replaced";
909
1128
  expectedMode?: string;
910
1129
  }
911
1130
 
@@ -982,7 +1201,7 @@ declare interface SettingsRegistryStoreState {
982
1201
  /** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */
983
1202
  declare type SettingsScope = "global" | "project";
984
1203
 
985
- /** An ordered sidebar container. Headerless when `title` is omitted. */
1204
+ /** An ordered sidenav container. Headerless when `title` is omitted. */
986
1205
  declare interface SettingsSectionContribution {
987
1206
  id: string;
988
1207
  title?: string;
@@ -1064,6 +1283,8 @@ declare interface TreeNode {
1064
1283
  hiddenByDefault?: boolean;
1065
1284
  /** When true, the node (e.g. a header/footer row) opts in to the tree's hide/show customization menu. */
1066
1285
  canHide?: boolean;
1286
+ /** When false, the node stays fixed within its Sidenav group. */
1287
+ canReorder?: boolean;
1067
1288
  }
1068
1289
 
1069
1290
  declare type TreeNodeRowVariant = "empty-state";
@@ -1081,7 +1302,7 @@ declare interface TreeRendererContribution {
1081
1302
  getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1082
1303
  }
1083
1304
 
1084
- declare type TreeRendererImplementation = (input: WorkbenchWidgetRenderInput & {
1305
+ declare type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & {
1085
1306
  treeId: string;
1086
1307
  }) => unknown;
1087
1308
 
@@ -1139,13 +1360,15 @@ declare interface TreeViewSection {
1139
1360
  hiddenByDefault?: boolean;
1140
1361
  /** When true, the section (category) opts in to the tree's hide/show customization menu. */
1141
1362
  canHide?: boolean;
1363
+ /** When false, the section stays fixed within the Sidenav main region. */
1364
+ canReorder?: boolean;
1142
1365
  }
1143
1366
 
1144
- export declare const unpinnedPrimaryPlacements: (workbench: WorkbenchCore) => WorkbenchWidgetPlacement_2[];
1367
+ export declare const unpinnedPrimaryPlacements: (workbench: WorkbenchCore) => WorkbenchPanelInstance_2[];
1145
1368
 
1146
1369
  /**
1147
- * Core-owned contracts for data renderer contributions. @pstdio/ui's
1148
- * DataRenderer props are structurally identical; the React layer bridges the
1370
+ * Core-owned contracts for kanban renderer contributions. @pstdio/ui's
1371
+ * KanbanRenderer props are structurally identical; the React layer bridges the
1149
1372
  * two, so drift surfaces as a compile error there instead of coupling core's
1150
1373
  * API shape to UI package ownership.
1151
1374
  */
@@ -1154,19 +1377,26 @@ declare type ViewMode = "board" | "list";
1154
1377
  declare interface WidgetContribution {
1155
1378
  id: string;
1156
1379
  title: string;
1157
- area: WorkbenchArea;
1158
- fallbackArea?: WorkbenchArea;
1380
+ icon?: string;
1381
+ region: WorkbenchRegion;
1382
+ fallbackRegion?: WorkbenchRegion;
1159
1383
  singleton?: boolean;
1160
1384
  reuse?: WidgetReusePolicy;
1161
1385
  mountStrategy?: WidgetMountStrategy;
1162
1386
  closable?: boolean;
1163
1387
  hiddenByDefault?: boolean;
1164
- areaSize?: WorkbenchAreaSize;
1165
- areaCollapsible?: boolean;
1388
+ regionSize?: WorkbenchRegionSize;
1389
+ regionCollapsible?: boolean;
1166
1390
  headerBorderBottom?: boolean;
1391
+ floatingPanels?: WorkbenchFloatingPanelVisibility;
1167
1392
  resourceKinds?: string[];
1168
1393
  priority?: number;
1169
1394
  rendererId: string;
1395
+ openCommandId?: string;
1396
+ role?: WorkbenchWidgetRole;
1397
+ eligibleLocations?: WorkbenchLocationEligibility;
1398
+ panelMenuOwner?: WorkbenchPanelMenuOwner;
1399
+ tab?: WorkbenchWidgetTab;
1170
1400
  config?: unknown;
1171
1401
  canOpen?(resource: ResourceRef): boolean;
1172
1402
  }
@@ -1177,24 +1407,6 @@ declare type WidgetMountStrategy_2 = "active" | "keep-mounted";
1177
1407
 
1178
1408
  declare type WidgetReusePolicy = "resource" | "none";
1179
1409
 
1180
- declare type WorkbenchArea = (typeof workbenchAreas)[number];
1181
-
1182
- declare const workbenchAreas: readonly ["nav", "activity", "left-header", "left", "main-header", "main-left", "main", "main-right", "secondary-header", "secondary", "status", "overlay", "floating-header", "floating"];
1183
-
1184
- declare interface WorkbenchAreaSize {
1185
- defaultPx?: number;
1186
- minPx?: number;
1187
- maxPx?: number;
1188
- }
1189
-
1190
- declare interface WorkbenchAreaState {
1191
- id: WorkbenchArea;
1192
- visible: boolean;
1193
- size?: number;
1194
- widgets: WorkbenchWidgetPlacement[];
1195
- activeWidgetId?: string;
1196
- }
1197
-
1198
1410
  declare type WorkbenchBreadcrumbChangeListener = () => void;
1199
1411
 
1200
1412
  declare interface WorkbenchBreadcrumbController {
@@ -1208,6 +1420,7 @@ declare interface WorkbenchBreadcrumbController {
1208
1420
  declare interface WorkbenchBreadcrumbItem {
1209
1421
  title: unknown;
1210
1422
  icon?: string;
1423
+ indicator?: "session-status";
1211
1424
  url?: string;
1212
1425
  onClick?: () => void;
1213
1426
  resource?: ResourceRef;
@@ -1217,8 +1430,16 @@ declare interface WorkbenchBreadcrumbState {
1217
1430
  items: WorkbenchBreadcrumbItem[] | undefined;
1218
1431
  }
1219
1432
 
1433
+ declare interface WorkbenchClosedSubPanel {
1434
+ region: WorkbenchPanelRegion;
1435
+ reference: WorkbenchSubPanelRef;
1436
+ resource?: ResourceRef;
1437
+ title?: string;
1438
+ }
1439
+
1220
1440
  declare interface WorkbenchCommandExecutionContext {
1221
1441
  resource?: ResourceRef;
1442
+ source?: "panel-add";
1222
1443
  }
1223
1444
 
1224
1445
  declare interface WorkbenchCommandExecutionError {
@@ -1273,6 +1494,7 @@ declare interface WorkbenchCommandParamsRequest {
1273
1494
  }
1274
1495
 
1275
1496
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1497
+ host: WorkbenchHost;
1276
1498
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
1277
1499
  unregisterModule(moduleId: string): void;
1278
1500
  }
@@ -1296,7 +1518,8 @@ declare interface WorkbenchCoreContributionContext {
1296
1518
  renderers: WorkbenchRenderers;
1297
1519
  resources: ResourceRegistry;
1298
1520
  settings: SettingsRegistry;
1299
- sessionPanel: WorkbenchSessionPanelController;
1521
+ shell: WorkbenchShellController;
1522
+ sidePanel: WorkbenchSidePanelController;
1300
1523
  terminal: WorkbenchTerminalController;
1301
1524
  themes: ThemeRegistry;
1302
1525
  fileIconThemes: FileIconThemeRegistry;
@@ -1310,22 +1533,33 @@ declare interface WorkbenchFileIconThemeStoreState {
1310
1533
  themes: readonly FileIconThemePreferenceOption[];
1311
1534
  }
1312
1535
 
1313
- declare type WorkbenchFocusArea = (typeof workbenchFocusAreas)[number];
1314
-
1315
- declare const workbenchFocusAreas: readonly ["activityBar", "sideBar", "main", "panel", "statusBar"];
1536
+ declare type WorkbenchFloatingPanelVisibility = "visible" | "hidden";
1316
1537
 
1317
- declare type WorkbenchFocusChangeListener = (area: WorkbenchFocusArea | undefined) => void;
1538
+ declare type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;
1318
1539
 
1319
1540
  declare interface WorkbenchFocusController {
1320
1541
  store: WorkbenchStore<WorkbenchFocusState>;
1321
- setActiveArea(area: WorkbenchFocusArea): void;
1542
+ setActiveRegion(region: WorkbenchFocusRegionId): void;
1322
1543
  clearFocus(): void;
1323
- getActiveArea(): WorkbenchFocusArea | undefined;
1544
+ getActiveRegion(): WorkbenchFocusRegionId | undefined;
1324
1545
  onDidChange(listener: WorkbenchFocusChangeListener): Disposable_2;
1325
1546
  }
1326
1547
 
1548
+ declare type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];
1549
+
1550
+ declare const workbenchFocusRegions: readonly ["activity", "sidenav", "main", "secondary", "side", "status"];
1551
+
1327
1552
  declare interface WorkbenchFocusState {
1328
- activeArea: WorkbenchFocusArea | undefined;
1553
+ activeRegion: WorkbenchFocusRegionId | undefined;
1554
+ }
1555
+
1556
+ declare interface WorkbenchHost {
1557
+ getSnapshot(): WorkbenchSnapshot;
1558
+ restoreSnapshot(snapshot: WorkbenchSnapshot): void;
1559
+ setPersistenceScope(scope: string | undefined, input?: {
1560
+ carryRegions?: readonly WorkbenchRegion[];
1561
+ }): void;
1562
+ getPersistenceScope(): string | undefined;
1329
1563
  }
1330
1564
 
1331
1565
  declare interface WorkbenchLastResourceController {
@@ -1335,8 +1569,10 @@ declare interface WorkbenchLastResourceController {
1335
1569
  }
1336
1570
 
1337
1571
  declare interface WorkbenchLayout {
1338
- areas: Record<WorkbenchArea, WorkbenchAreaState>;
1572
+ regions: Record<WorkbenchRegion, WorkbenchRegionState>;
1573
+ locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;
1339
1574
  activeWidgetId?: string;
1575
+ activeLocationWidgetId?: string;
1340
1576
  activeResourceUri?: string;
1341
1577
  }
1342
1578
 
@@ -1345,7 +1581,25 @@ declare type WorkbenchLayoutModel = LayoutModel & MenuRegistry;
1345
1581
  declare interface WorkbenchLayoutStoreState {
1346
1582
  layout: WorkbenchLayout;
1347
1583
  widgets: Record<string, RegisteredWidgetContribution>;
1348
- placeholders: Partial<Record<WorkbenchArea, RegisteredPlaceholderContribution>>;
1584
+ placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1585
+ }
1586
+
1587
+ declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1588
+
1589
+ declare interface WorkbenchLocationEligibility {
1590
+ modeIds?: string[];
1591
+ resourceKinds?: string[];
1592
+ resourceIds?: string[];
1593
+ canOpen?(resource: ResourceRef): boolean;
1594
+ }
1595
+
1596
+ declare interface WorkbenchLocationRef {
1597
+ key: string;
1598
+ modeId?: string;
1599
+ resource?: ResourceRef;
1600
+ contributionId?: string;
1601
+ instanceKey?: string;
1602
+ title?: string;
1349
1603
  }
1350
1604
 
1351
1605
  declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
@@ -1357,16 +1611,24 @@ declare type WorkbenchModeChangeListener = () => void;
1357
1611
  declare interface WorkbenchModeContribution {
1358
1612
  id: string;
1359
1613
  label?: string;
1614
+ panels?: readonly WorkbenchPanelRegion[];
1360
1615
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1616
+ seed?(ctx: WorkbenchModeActivationContext): void;
1617
+ enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1361
1618
  }
1362
1619
 
1363
1620
  declare interface WorkbenchModeRegistry {
1364
1621
  store: WorkbenchStore<WorkbenchModeStoreState>;
1622
+ dispose(): void;
1365
1623
  registerMode(mode: WorkbenchModeContribution): Disposable_2;
1366
1624
  getMode(id: string): WorkbenchModeContribution | undefined;
1367
1625
  listModes(): WorkbenchModeContribution[];
1368
1626
  getActiveModeId(): string | undefined;
1369
- setActiveMode(id: string | undefined): void;
1627
+ isTransitioning(): boolean;
1628
+ setActiveMode(id: string | undefined, input?: {
1629
+ deferSeed?: boolean;
1630
+ }): void;
1631
+ seedActiveMode(): void;
1370
1632
  onDidChangeActive(listener: WorkbenchModeChangeListener): Disposable_2;
1371
1633
  }
1372
1634
 
@@ -1377,6 +1639,8 @@ declare interface WorkbenchModeStoreState {
1377
1639
 
1378
1640
  declare type WorkbenchModuleActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1379
1641
 
1642
+ declare type WorkbenchModuleContext = WorkbenchCoreContributionContext;
1643
+
1380
1644
  declare interface WorkbenchModuleContribution {
1381
1645
  id: string;
1382
1646
  source?: ContributionSource;
@@ -1384,7 +1648,21 @@ declare interface WorkbenchModuleContribution {
1384
1648
  activate(ctx: WorkbenchModuleContributionContext): WorkbenchModuleActivationResult;
1385
1649
  }
1386
1650
 
1387
- declare type WorkbenchModuleContributionContext = WorkbenchCoreContributionContext;
1651
+ declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1652
+
1653
+ declare interface WorkbenchNavigationEntry {
1654
+ entryId: string;
1655
+ recordedAt: number;
1656
+ location: WorkbenchLocationRef;
1657
+ selectedSubPanels: Partial<Record<WorkbenchPanelRegion, WorkbenchSubPanelRef>>;
1658
+ kind: "resource" | "widget" | "mode";
1659
+ modeId?: string;
1660
+ resource?: ResourceRef;
1661
+ widgetId?: string;
1662
+ contributionId?: string;
1663
+ title?: string;
1664
+ closedSubPanel?: WorkbenchClosedSubPanel;
1665
+ }
1388
1666
 
1389
1667
  declare interface WorkbenchNotification {
1390
1668
  id?: string;
@@ -1420,18 +1698,187 @@ declare interface WorkbenchNotificationStoreState {
1420
1698
  notifications: Record<string, RegisteredWorkbenchNotification>;
1421
1699
  }
1422
1700
 
1701
+ declare interface WorkbenchPanelContribution {
1702
+ id: string;
1703
+ title: string;
1704
+ icon?: string;
1705
+ region: WorkbenchRegion;
1706
+ fallbackRegion?: WorkbenchRegion;
1707
+ rendererId: string;
1708
+ closable: boolean;
1709
+ singleton?: boolean;
1710
+ reuse?: WorkbenchPanelReusePolicy;
1711
+ mountStrategy?: WorkbenchPanelMountStrategy;
1712
+ hiddenByDefault?: boolean;
1713
+ regionSize?: WorkbenchRegionSize;
1714
+ regionCollapsible?: boolean;
1715
+ headerBorderBottom?: boolean;
1716
+ floatingPanels?: WorkbenchFloatingPanelVisibility;
1717
+ resourceKinds?: string[];
1718
+ eligibleLocations?: WorkbenchLocationEligibility;
1719
+ priority?: number;
1720
+ openCommandId?: string;
1721
+ tab?: WorkbenchPanelTab;
1722
+ config?: unknown;
1723
+ canOpen?(resource: ResourceRef): boolean;
1724
+ ownerId?: string;
1725
+ source?: ContributionSource;
1726
+ panelMenus?: readonly WorkbenchPanelMenuDefinition[];
1727
+ }
1728
+
1729
+ declare interface WorkbenchPanelInstance {
1730
+ instanceId: string;
1731
+ panelId: string;
1732
+ ownerId?: string;
1733
+ source?: ContributionSource;
1734
+ resource?: ResourceRef;
1735
+ resourceUri?: string;
1736
+ ownerResourceUri?: string;
1737
+ title?: string;
1738
+ pinned?: boolean;
1739
+ closable: boolean;
1740
+ mountStrategy?: WorkbenchPanelMountStrategy;
1741
+ hiddenByDefault?: boolean;
1742
+ tabRetention?: WorkbenchTabRetention;
1743
+ tab?: WorkbenchPanelTab;
1744
+ }
1745
+
1746
+ declare interface WorkbenchPanelInstance_2 {
1747
+ instanceId: string;
1748
+ panelId: string;
1749
+ ownerId?: string;
1750
+ source?: ContributionSource_2;
1751
+ resource?: ResourceRef_2;
1752
+ resourceUri?: string;
1753
+ ownerResourceUri?: string;
1754
+ title?: string;
1755
+ pinned?: boolean;
1756
+ closable: boolean;
1757
+ mountStrategy?: WorkbenchPanelMountStrategy_2;
1758
+ hiddenByDefault?: boolean;
1759
+ tabRetention?: WorkbenchTabRetention_2;
1760
+ tab?: WorkbenchPanelTab_2;
1761
+ }
1762
+
1763
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1764
+ region: WorkbenchPanelMenuRegion;
1765
+ fallbackRegion?: WorkbenchPanelMenuRegion;
1766
+ };
1767
+
1768
+ declare interface WorkbenchPanelMenuDefinition {
1769
+ id: string;
1770
+ title: string;
1771
+ icon?: string;
1772
+ side: WorkbenchPanelMenuSide;
1773
+ singleton?: boolean;
1774
+ reuse?: WorkbenchPanelReusePolicy;
1775
+ mountStrategy?: WorkbenchPanelMountStrategy;
1776
+ hiddenByDefault?: boolean;
1777
+ regionSize?: WorkbenchRegionSize;
1778
+ regionCollapsible?: boolean;
1779
+ headerBorderBottom?: boolean;
1780
+ rendererId: string;
1781
+ priority?: number;
1782
+ config?: unknown;
1783
+ }
1784
+
1785
+ declare type WorkbenchPanelMenuOwner = {
1786
+ level: "panel";
1787
+ contributionId?: string;
1788
+ } | {
1789
+ level: "sub-panel";
1790
+ contributionId: string;
1791
+ };
1792
+
1793
+ declare type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];
1794
+
1795
+ declare const workbenchPanelMenuRegions: {
1796
+ readonly main: {
1797
+ readonly left: "main-left-menu";
1798
+ readonly right: "main-right-menu";
1799
+ };
1800
+ readonly secondary: {
1801
+ readonly left: "secondary-left-menu";
1802
+ readonly right: "secondary-right-menu";
1803
+ };
1804
+ readonly side: {
1805
+ readonly left: "side-left-menu";
1806
+ readonly right: "side-right-menu";
1807
+ };
1808
+ };
1809
+
1810
+ declare interface WorkbenchPanelMenusContribution {
1811
+ panelMenus?: readonly WorkbenchPanelMenuDefinition[];
1812
+ }
1813
+
1814
+ declare type WorkbenchPanelMenuSide = "left" | "right";
1815
+
1816
+ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
1817
+
1818
+ declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
1819
+
1820
+ declare type WorkbenchPanelOpenStrategy = {
1821
+ kind: "activate-or-open";
1822
+ position?: WorkbenchTabPosition;
1823
+ } | {
1824
+ kind: "replace-active";
1825
+ } | {
1826
+ kind: "replace-panel";
1827
+ instanceId: string;
1828
+ } | {
1829
+ kind: "preview";
1830
+ position?: WorkbenchTabPosition;
1831
+ };
1832
+
1833
+ declare type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];
1834
+
1835
+ declare const workbenchPanelRegions: readonly ["main", "secondary", "side"];
1836
+
1837
+ declare interface WorkbenchPanelRenderInput {
1838
+ workbench: WorkbenchCore;
1839
+ panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;
1840
+ instance: WorkbenchPanelInstance;
1841
+ refresh: () => void;
1842
+ }
1843
+
1844
+ declare type WorkbenchPanelReusePolicy = WidgetReusePolicy;
1845
+
1423
1846
  declare type WorkbenchPanelsChangeListener = (state: WorkbenchPanelsState) => void;
1424
1847
 
1425
1848
  declare interface WorkbenchPanelsController {
1426
1849
  store: WorkbenchStore<WorkbenchPanelsState>;
1427
- isOpen(areaId: string): boolean;
1428
- setOpen(areaId: string, open: boolean): void;
1429
- toggle(areaId: string): void;
1850
+ isOpen(regionId: string): boolean;
1851
+ setOpen(regionId: string, open: boolean): void;
1852
+ toggle(regionId: string): void;
1853
+ setPersistenceScope(scope: string | undefined): void;
1854
+ getPersistenceScope(): string | undefined;
1430
1855
  onDidChange(listener: WorkbenchPanelsChangeListener): Disposable_2;
1431
1856
  }
1432
1857
 
1433
1858
  declare interface WorkbenchPanelsState {
1434
- openByAreaId: Record<string, boolean>;
1859
+ openByRegionId: Record<string, boolean>;
1860
+ }
1861
+
1862
+ declare type WorkbenchPanelTab = WorkbenchWidgetTab;
1863
+
1864
+ declare type WorkbenchPanelTab_2 = WorkbenchWidgetTab_2;
1865
+
1866
+ declare type WorkbenchRegion = (typeof workbenchRegions)[number];
1867
+
1868
+ declare const workbenchRegions: readonly ["nav", "activity", "sidenav-header", "sidenav", "main-header", "main-left-menu", "main", "main-right-menu", "secondary-header", "secondary-left-menu", "secondary", "secondary-right-menu", "side-header", "side-left-menu", "side", "side-right-menu", "status", "overlay"];
1869
+
1870
+ declare interface WorkbenchRegionSize {
1871
+ defaultPx?: number;
1872
+ minPx?: number;
1873
+ maxPx?: number;
1874
+ }
1875
+
1876
+ declare interface WorkbenchRegionState {
1877
+ id: WorkbenchRegion;
1878
+ visible: boolean;
1879
+ size?: number;
1880
+ widgets: WorkbenchWidgetPlacement[];
1881
+ activeWidgetId?: string;
1435
1882
  }
1436
1883
 
1437
1884
  declare type WorkbenchRendererChangeListener = () => void;
@@ -1439,7 +1886,7 @@ declare type WorkbenchRendererChangeListener = () => void;
1439
1886
  declare type WorkbenchRendererRegistration = {
1440
1887
  id: string;
1441
1888
  keepAlive?: false;
1442
- render: (input: WorkbenchWidgetRenderInput) => unknown;
1889
+ render: (input: WorkbenchPanelRenderInput) => unknown;
1443
1890
  } | {
1444
1891
  id: string;
1445
1892
  keepAlive: true;
@@ -1452,32 +1899,54 @@ declare interface WorkbenchRendererRegistry {
1452
1899
  getRenderer(id: string): WorkbenchRendererRegistration | undefined;
1453
1900
  listRenderers(): WorkbenchRendererRegistration[];
1454
1901
  onDidChange(listener: WorkbenchRendererChangeListener): Disposable_2;
1455
- claim(rendererId: string, slot: HTMLElement, input: WorkbenchWidgetRenderInput): Disposable_2;
1902
+ claim(rendererId: string, slot: HTMLElement, input: WorkbenchPanelRenderInput): Disposable_2;
1456
1903
  getHost(rendererId: string): HTMLElement | undefined;
1457
- getClaim(rendererId: string): WorkbenchWidgetRenderInput | undefined;
1904
+ getClaim(rendererId: string): WorkbenchPanelRenderInput | undefined;
1458
1905
  }
1459
1906
 
1460
- declare type WorkbenchRenderers = WorkbenchRendererRegistry & TreeRendererRegistry & DataRendererRegistry & FileRendererRegistry & ControlsRendererRegistry;
1907
+ declare type WorkbenchRenderers = WorkbenchRendererRegistry & TreeRendererRegistry & KanbanRendererRegistry & DataTableRendererRegistry & FileRendererRegistry & ControlsRendererRegistry;
1461
1908
 
1462
1909
  declare interface WorkbenchRendererStoreState {
1463
1910
  renderers: Record<string, WorkbenchRendererRegistration>;
1464
1911
  hosts: Record<string, RegisteredKeepAliveHost>;
1465
- claims: Record<string, WorkbenchWidgetRenderInput>;
1912
+ claims: Record<string, WorkbenchPanelRenderInput>;
1466
1913
  }
1467
1914
 
1468
- declare type WorkbenchSessionPanelChangeListener = (mode: WorkbenchSessionPanelMode) => void;
1915
+ declare interface WorkbenchShellController {
1916
+ getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;
1917
+ setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;
1918
+ setRegionSize(region: WorkbenchRegion, size: number): void;
1919
+ getSidePanelPresentation(): WorkbenchSidePanelPresentation;
1920
+ setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;
1921
+ onDidChange(listener: () => void): Disposable_2;
1922
+ }
1923
+
1924
+ declare type WorkbenchShellOpenRegion = "sidenav" | "secondary" | WorkbenchPanelMenuRegion;
1469
1925
 
1470
- declare interface WorkbenchSessionPanelController {
1471
- store: WorkbenchStore<WorkbenchSessionPanelState>;
1472
- getMode(): WorkbenchSessionPanelMode;
1473
- setMode(mode: WorkbenchSessionPanelMode): void;
1474
- onDidChange(listener: WorkbenchSessionPanelChangeListener): Disposable_2;
1926
+ declare interface WorkbenchShellRegionState {
1927
+ open: boolean;
1928
+ size?: number;
1475
1929
  }
1476
1930
 
1477
- declare type WorkbenchSessionPanelMode = "bubble" | "closed" | "attached";
1931
+ declare type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;
1932
+
1933
+ declare interface WorkbenchSidePanelController {
1934
+ store: WorkbenchStore<WorkbenchSidePanelState>;
1935
+ getMode(): WorkbenchSidePanelMode;
1936
+ setMode(mode: WorkbenchSidePanelMode): void;
1937
+ onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable_2;
1938
+ }
1478
1939
 
1479
- declare interface WorkbenchSessionPanelState {
1480
- mode: WorkbenchSessionPanelMode;
1940
+ declare type WorkbenchSidePanelMode = "floating" | "closed" | "attached";
1941
+
1942
+ declare type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;
1943
+
1944
+ declare interface WorkbenchSidePanelState {
1945
+ mode: WorkbenchSidePanelMode;
1946
+ }
1947
+
1948
+ declare interface WorkbenchSnapshot {
1949
+ layout: WorkbenchLayout;
1481
1950
  }
1482
1951
 
1483
1952
  declare interface WorkbenchStore<TState> {
@@ -1496,6 +1965,27 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
1496
1965
 
1497
1966
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
1498
1967
 
1968
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1969
+ region: WorkbenchPanelRegion;
1970
+ fallbackRegion?: WorkbenchPanelRegion;
1971
+ } & WorkbenchPanelMenusContribution;
1972
+
1973
+ declare interface WorkbenchSubPanelRef {
1974
+ contributionId: string;
1975
+ resourceUri?: string;
1976
+ instanceKey?: string;
1977
+ }
1978
+
1979
+ declare type WorkbenchTabPosition = "start" | "end" | {
1980
+ beforeWidgetId: string;
1981
+ } | {
1982
+ afterWidgetId: string;
1983
+ };
1984
+
1985
+ declare type WorkbenchTabRetention = "preview" | "persistent";
1986
+
1987
+ declare type WorkbenchTabRetention_2 = "preview" | "persistent";
1988
+
1499
1989
  declare interface WorkbenchTerminalController {
1500
1990
  store: WorkbenchStore<WorkbenchTerminalState>;
1501
1991
  /** True once the host injected a session opener. */
@@ -1589,32 +2079,29 @@ declare interface WorkbenchWidgetPlacement {
1589
2079
  source?: ContributionSource;
1590
2080
  resource?: ResourceRef;
1591
2081
  resourceUri?: string;
2082
+ ownerResourceUri?: string;
1592
2083
  title?: string;
1593
2084
  pinned?: boolean;
1594
2085
  closable?: boolean;
1595
2086
  mountStrategy?: WidgetMountStrategy;
1596
2087
  hiddenByDefault?: boolean;
2088
+ tabRetention?: WorkbenchTabRetention;
2089
+ tab?: WorkbenchWidgetTab;
2090
+ role?: WorkbenchWidgetRole;
1597
2091
  }
1598
2092
 
1599
- declare interface WorkbenchWidgetPlacement_2 {
1600
- widgetId: string;
1601
- contributionId: string;
1602
- ownerId?: string;
1603
- source?: ContributionSource_2;
1604
- resource?: ResourceRef_2;
1605
- resourceUri?: string;
1606
- title?: string;
1607
- pinned?: boolean;
1608
- closable?: boolean;
1609
- mountStrategy?: WidgetMountStrategy_2;
1610
- hiddenByDefault?: boolean;
2093
+ declare type WorkbenchWidgetRole = "content" | "location" | "sub-panel" | "panel-menu";
2094
+
2095
+ declare interface WorkbenchWidgetTab {
2096
+ contentRendererId?: string;
2097
+ /** Custom actions shown when the user activates an already-active tab. */
2098
+ customMenuRendererId?: string;
1611
2099
  }
1612
2100
 
1613
- declare interface WorkbenchWidgetRenderInput {
1614
- workbench: WorkbenchCore;
1615
- widget: RegisteredWidgetContribution | RegisteredPlaceholderContribution;
1616
- placement: WorkbenchWidgetPlacement;
1617
- refresh: () => void;
2101
+ declare interface WorkbenchWidgetTab_2 {
2102
+ contentRendererId?: string;
2103
+ /** Custom actions shown when the user activates an already-active tab. */
2104
+ customMenuRendererId?: string;
1618
2105
  }
1619
2106
 
1620
2107
  export { }