@pstdio/workbench 0.2.1 → 0.4.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 +749 -256
  5. package/dist/extensions.js +900 -694
  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 +756 -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 +745 -231
  14. package/dist/react.js +3494 -2493
  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 +695 -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,123 @@ 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
+ }
294
+
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;
293
303
  }
294
304
 
295
- declare interface DataRendererContribution<TRow extends DataRendererRow = DataRendererRow> {
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
+ selectionMode?: "none" | "multiple";
337
+ selectionActions?: DataTableRendererSelectionAction[];
338
+ rowActions?: DataTableRendererRowAction[];
339
+ initialPageSize?: number;
340
+ pageSizeOptions?: number[];
312
341
  emptyTitle?: string;
313
342
  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[];
343
+ executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
323
344
  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;
345
+ onRowClick?: (row: DataTableRendererRow) => void;
338
346
  }
339
347
 
340
- declare type DataRendererFilterState = Record<string, string[]>;
341
-
342
- declare type DataRendererImplementation = (input: WorkbenchWidgetRenderInput & {
343
- dataRendererId: string;
348
+ declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
349
+ dataTableRendererId: string;
344
350
  }) => unknown;
345
351
 
346
- declare interface DataRendererOrdering {
347
- attributeId: string | typeof MANUAL_ORDERING;
348
- direction: SortDirection;
352
+ declare interface DataTableRendererQueryContext {
353
+ resource?: ResourceRef;
354
+ modeId?: string;
349
355
  }
350
356
 
351
- declare interface DataRendererQueryState {
352
- settings: DataRendererSettings;
353
- filters: DataRendererFilterState;
357
+ declare interface DataTableRendererQueryResult {
358
+ rows: DataTableRendererRow[];
359
+ columns?: DataTableRendererColumn[];
354
360
  }
355
361
 
356
- declare interface DataRendererRefreshEvent {
357
- dataRendererId: string;
362
+ declare interface DataTableRendererRefreshEvent {
363
+ dataTableRendererId: string;
358
364
  }
359
365
 
360
- declare type DataRendererRefreshListener = (event: DataRendererRefreshEvent) => void;
366
+ declare interface DataTableRendererRegistry {
367
+ dataTableStore: WorkbenchStore<DataTableRendererStoreState>;
368
+ registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable_2;
369
+ setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;
370
+ getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;
371
+ listDataTableRenderers(): RegisteredDataTableRendererContribution[];
372
+ refreshDataTableRenderer(id: string): void;
373
+ onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable_2;
374
+ }
361
375
 
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;
376
+ declare interface DataTableRendererRow {
377
+ id: string;
378
+ values: Record<string, unknown>;
379
+ resource?: ResourceRef;
370
380
  }
371
381
 
372
- declare interface DataRendererRow {
382
+ declare interface DataTableRendererRowAction {
373
383
  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>;
384
+ label: string;
385
+ icon?: unknown;
386
+ destructive?: boolean;
387
+ run(row: DataTableRendererRow): Promise<void> | void;
382
388
  }
383
389
 
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[];
390
+ declare interface DataTableRendererSelectionAction {
391
+ id: string;
392
+ label: string;
393
+ icon?: unknown;
394
+ destructive?: boolean;
395
+ run(rows: DataTableRendererRow[]): Promise<void> | void;
396
+ }
397
+
398
+ declare interface DataTableRendererStoreState {
399
+ renderers: Record<string, RegisteredDataTableRendererContribution>;
390
400
  }
391
401
 
392
- declare interface DataRendererStoreState {
393
- renderers: Record<string, RegisteredDataRendererContribution>;
402
+ declare interface DataTableRendererThemeColor {
403
+ light: string;
404
+ dark: string;
405
+ foreground?: {
406
+ light: string;
407
+ dark: string;
408
+ };
394
409
  }
395
410
 
396
411
  export declare const describeResourceRouteContract: (contract: ResourceRouteContract) => void;
@@ -470,7 +485,7 @@ declare interface FileRendererContribution {
470
485
  save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
471
486
  }
472
487
 
473
- declare type FileRendererImplementation = (input: WorkbenchWidgetRenderInput & {
488
+ declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
474
489
  fileRendererId: string;
475
490
  }) => unknown;
476
491
 
@@ -501,24 +516,173 @@ declare interface HistoryController {
501
516
  goPrevious(): HistoryEntry | undefined;
502
517
  recentlyClosed(): readonly HistoryEntry[];
503
518
  reopenLastClosed(): HistoryEntry | undefined;
519
+ setPersistenceScope(scope: string | undefined): void;
520
+ getPersistenceScope(): string | undefined;
521
+ restore(): HistoryEntry | undefined;
522
+ flush(): void;
504
523
  clear(): void;
505
524
  }
506
525
 
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
- }
526
+ declare type HistoryEntry = WorkbenchNavigationEntry;
517
527
 
518
528
  declare interface HistoryStoreState {
519
- entries: readonly HistoryEntry[];
529
+ entries: readonly WorkbenchNavigationEntry[];
520
530
  cursor: number;
521
- recentlyClosed: readonly HistoryEntry[];
531
+ recentlyClosed: readonly WorkbenchNavigationEntry[];
532
+ hydrating: boolean;
533
+ }
534
+
535
+ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow> {
536
+ id: string;
537
+ title: string;
538
+ resourceKind?: string;
539
+ /**
540
+ * Declarative attribute schema. The renderer dispatches filter / group /
541
+ * sort / display / inline-edit behavior on each descriptor's `type.kind`.
542
+ *
543
+ * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a
544
+ * static array to let the contribution mutate its schema at runtime —
545
+ * `WorkbenchKanbanView` subscribes so additions / removals / kind changes
546
+ * propagate live without re-registering the renderer.
547
+ */
548
+ attributes: AttributeDescriptor[] | AttributesSource;
549
+ /** Per-board-column overrides (color, drag/create rules, custom actions). */
550
+ getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;
551
+ hideToolbar?: boolean;
552
+ emptyTitle?: string;
553
+ emptyDescription?: string;
554
+ /** Initial settings/filters applied when the kanban renderer mounts. */
555
+ defaultSettings?: Partial<KanbanRendererSettings>;
556
+ defaultFilters?: KanbanRendererFilterState;
557
+ defaultViews?: KanbanRendererSavedView[];
558
+ defaultActiveViewId?: string;
559
+ /**
560
+ * Data source. Receives the current display state so backends can paginate
561
+ * / filter / sort. The renderer re-applies filter / sort / group locally,
562
+ * so this can return unfiltered rows in simple cases.
563
+ */
564
+ executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
565
+ subscribe?: (listener: () => void) => Disposable_2 | (() => void);
566
+ /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
567
+ onRowClick?: (row: TRow) => void;
568
+ /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
569
+ getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
570
+ /**
571
+ * Fires for inline attribute edits AND for cross-column drag-to-reorder on
572
+ * the board (the renderer passes the grouping attribute id + the target
573
+ * column value).
574
+ */
575
+ onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;
576
+ /** Manual within-column reorder (only fires when ordering is manual). */
577
+ onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;
578
+ createRow?: KanbanRendererCreateRowConfig;
579
+ onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;
580
+ onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;
581
+ }
582
+
583
+ declare interface KanbanRendererCreateField {
584
+ id: string;
585
+ label: string;
586
+ description?: string;
587
+ placeholder?: string;
588
+ type: KanbanRendererCreateFieldType;
589
+ required?: boolean;
590
+ defaultValue?: unknown;
591
+ options?: EnumOption[];
592
+ /** `files` fields only. */
593
+ multiple?: boolean;
594
+ accept?: string;
595
+ }
596
+
597
+ declare type KanbanRendererCreateFieldType = "text" | "longtext" | "markdown" | "number" | "boolean" | "select" | "multi-select" | "files";
598
+
599
+ /** Chrome copy is supplied by the caller so the dialog ships no strings of its own. */
600
+ declare interface KanbanRendererCreateLabels {
601
+ cancel: string;
602
+ properties: string;
603
+ submitError: string;
604
+ removeFile: string;
605
+ }
606
+
607
+ declare interface KanbanRendererCreateRowConfig {
608
+ title: string;
609
+ submitLabel: string;
610
+ fields: KanbanRendererCreateField[];
611
+ labels: KanbanRendererCreateLabels;
612
+ }
613
+
614
+ declare interface KanbanRendererCreateSubmission {
615
+ columnId: string;
616
+ columnAttributeId?: string;
617
+ /** Declared field values, excluding `files` fields — those arrive as `files`. */
618
+ values: Record<string, unknown>;
619
+ /** Every editable attribute the user set, keyed by attribute id. */
620
+ attributeValues: Record<string, unknown>;
621
+ files: File[];
622
+ }
623
+
624
+ declare type KanbanRendererFilterState = Record<string, string[]>;
625
+
626
+ declare type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & {
627
+ kanbanRendererId: string;
628
+ }) => unknown;
629
+
630
+ declare interface KanbanRendererOrdering {
631
+ attributeId: string | typeof MANUAL_ORDERING;
632
+ direction: SortDirection;
633
+ }
634
+
635
+ declare interface KanbanRendererQueryState {
636
+ settings: KanbanRendererSettings;
637
+ filters: KanbanRendererFilterState;
638
+ }
639
+
640
+ declare interface KanbanRendererRefreshEvent {
641
+ kanbanRendererId: string;
642
+ }
643
+
644
+ declare type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;
645
+
646
+ declare interface KanbanRendererRegistry {
647
+ dataStore: WorkbenchStore<KanbanRendererStoreState>;
648
+ registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(contribution: KanbanRendererContribution<TRow>, metadata?: ContributionMetadata): Disposable_2;
649
+ setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;
650
+ getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;
651
+ listKanbanRenderers(): RegisteredKanbanRendererContribution[];
652
+ refreshKanbanRenderer(id: string): void;
653
+ onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable_2;
654
+ }
655
+
656
+ declare interface KanbanRendererRow {
657
+ id: string;
658
+ title: string;
659
+ /**
660
+ * Optional navigation handle. When set, the renderer's default click handler
661
+ * routes through the contribution's onRowClick (which typically opens the
662
+ * resource via the workbench).
663
+ */
664
+ resource?: unknown;
665
+ attributes: Record<string, unknown>;
666
+ }
667
+
668
+ declare interface KanbanRendererSavedView {
669
+ id: string;
670
+ title: string;
671
+ settings: KanbanRendererSettings;
672
+ filters: KanbanRendererFilterState;
673
+ isDefault?: boolean;
674
+ }
675
+
676
+ declare interface KanbanRendererSettings {
677
+ viewMode: ViewMode;
678
+ columnGrouping: string | typeof NO_GROUPING;
679
+ rowGrouping: string | typeof NO_GROUPING;
680
+ ordering: KanbanRendererOrdering;
681
+ displayProperties: string[];
682
+ }
683
+
684
+ declare interface KanbanRendererStoreState {
685
+ renderers: Record<string, RegisteredKanbanRendererContribution>;
522
686
  }
523
687
 
524
688
  declare interface Keybinding {
@@ -546,33 +710,62 @@ declare interface LayoutModel {
546
710
  registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata): {
547
711
  dispose(): void;
548
712
  };
713
+ registerPanel(panel: WorkbenchPanelContribution, metadata?: ContributionMetadata): {
714
+ dispose(): void;
715
+ };
549
716
  registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): {
550
717
  dispose(): void;
551
718
  };
719
+ registerLocation(location: WorkbenchLocationContribution, metadata?: ContributionMetadata): {
720
+ dispose(): void;
721
+ };
722
+ registerSubPanel(subPanel: WorkbenchSubPanelContribution, metadata?: ContributionMetadata): {
723
+ dispose(): void;
724
+ };
725
+ registerPanelMenu(panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata): {
726
+ dispose(): void;
727
+ };
552
728
  unregisterWidget(id: string, options?: {
553
729
  removePlacements?: boolean;
554
730
  persist?: boolean;
555
731
  }): void;
556
- getPlaceholder(areaId: WorkbenchArea): RegisteredPlaceholderContribution | undefined;
732
+ getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;
557
733
  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;
734
+ getPanel(id: string): WorkbenchPanelContribution | undefined;
735
+ getRegionSize(regionId: WorkbenchRegion): WorkbenchRegionSize | undefined;
736
+ getRegionCollapsible(regionId: WorkbenchRegion): boolean;
737
+ getRegionHeaderBorderBottom(regionId: WorkbenchRegion): boolean;
738
+ setRegionVisible(regionId: WorkbenchRegion, visible: boolean): void;
739
+ setRegionSize(regionId: WorkbenchRegion, size: number): void;
563
740
  listPlaceholders(): RegisteredPlaceholderContribution[];
564
741
  listWidgets(): RegisteredWidgetContribution[];
742
+ listPanels(): WorkbenchPanelContribution[];
743
+ listPanelInstances(region?: WorkbenchRegion): WorkbenchPanelInstance[];
744
+ getActivePanel(region?: WorkbenchRegion): WorkbenchPanelInstance | undefined;
565
745
  openWidget(id: string, input?: OpenWidgetInput): WorkbenchWidgetPlacement;
746
+ openPanel(id: string, input?: OpenWorkbenchPanelInput): WorkbenchPanelInstance;
747
+ updatePanel(instanceId: string, input: OpenWorkbenchPanelInput): WorkbenchPanelInstance;
748
+ reorderPanel(instanceId: string, position: WorkbenchTabPosition): void;
749
+ activatePanel(instanceId: string): WorkbenchPanelInstance;
750
+ closePanel(instanceId: string): WorkbenchPanelInstance | undefined;
566
751
  updateWidgetPlacement(widgetId: string, input: OpenWidgetInput): WorkbenchWidgetPlacement;
752
+ reorderWidget(widgetId: string, position: WorkbenchTabPosition): void;
753
+ expirePreviewTabs(ownerResourceUri?: string): void;
567
754
  activateWidget(widgetId: string): WorkbenchWidgetPlacement;
755
+ setRegionActiveWidget(regionId: WorkbenchRegion, widgetId: string | undefined): void;
568
756
  closeWidget(widgetId: string): WorkbenchWidgetPlacement | undefined;
569
757
  removeWidgetPlacement(widgetId: string): WorkbenchWidgetPlacement | undefined;
570
- clearArea(areaId: WorkbenchArea): void;
571
- resetAreas(): void;
758
+ clearRegion(regionId: WorkbenchRegion): void;
759
+ resetRegions(): void;
572
760
  getLayout(): WorkbenchLayout;
573
761
  restoreLayout(layout: WorkbenchLayout): void;
574
- setPersistenceScope(scope: LayoutScope | undefined): void;
762
+ setPersistenceScope(scope: LayoutScope | undefined, input?: {
763
+ carryRegionState?: readonly WorkbenchRegion[];
764
+ }): void;
575
765
  getPersistenceScope(): LayoutScope | undefined;
766
+ onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
767
+ dispose(): void;
768
+ };
576
769
  onDidChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
577
770
  dispose(): void;
578
771
  };
@@ -584,6 +777,7 @@ declare const MANUAL_ORDERING = "manual";
584
777
 
585
778
  declare interface MenuItem {
586
779
  commandId: string;
780
+ sourceCommandId?: string;
587
781
  label?: string;
588
782
  description?: string;
589
783
  icon?: string;
@@ -648,7 +842,13 @@ declare interface NavigationTargetCompound {
648
842
  targets: readonly NavigationTargetItem[];
649
843
  }
650
844
 
651
- declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetView | NavigationTargetCommand;
845
+ declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetPanel | NavigationTargetCommand;
846
+
847
+ declare interface NavigationTargetPanel {
848
+ kind: "panel";
849
+ panelId: string;
850
+ input?: OpenWorkbenchPanelInput;
851
+ }
652
852
 
653
853
  declare interface NavigationTargetResource {
654
854
  kind: "resource";
@@ -656,12 +856,6 @@ declare interface NavigationTargetResource {
656
856
  input?: OpenResourceInput;
657
857
  }
658
858
 
659
- declare interface NavigationTargetView {
660
- kind: "view";
661
- widgetId: string;
662
- input?: OpenWidgetInput;
663
- }
664
-
665
859
  declare const NO_GROUPING = "none";
666
860
 
667
861
  declare interface NotificationRegistry {
@@ -680,23 +874,38 @@ declare interface OpenResourceInput {
680
874
  declare interface OpenWidgetInput {
681
875
  resource?: ResourceRef;
682
876
  title?: string;
683
- area?: WorkbenchArea;
877
+ region?: WorkbenchRegion;
684
878
  ownerId?: string;
685
879
  source?: ContributionSource;
686
880
  pinned?: boolean;
687
881
  closable?: boolean;
688
882
  mountStrategy?: WidgetMountStrategy;
689
883
  hiddenByDefault?: boolean;
884
+ tabRetention?: WorkbenchTabRetention;
885
+ tabPosition?: WorkbenchTabPosition;
886
+ tab?: WorkbenchWidgetTab;
690
887
  replaceActive?: boolean;
888
+ replaceWidgetId?: string;
889
+ }
890
+
891
+ declare interface OpenWorkbenchPanelInput {
892
+ resource?: ResourceRef;
893
+ title?: string;
894
+ region?: WorkbenchRegion;
895
+ pinned?: boolean;
896
+ mountStrategy?: WorkbenchPanelMountStrategy;
897
+ hiddenByDefault?: boolean;
898
+ tab?: WorkbenchPanelTab;
899
+ strategy?: WorkbenchPanelOpenStrategy;
691
900
  }
692
901
 
693
902
  declare interface PlaceholderContribution {
694
903
  id: string;
695
904
  title: string;
696
- area: WorkbenchArea;
905
+ region: WorkbenchRegion;
697
906
  rendererId: string;
698
- areaSize?: WorkbenchAreaSize;
699
- areaCollapsible?: boolean;
907
+ regionSize?: WorkbenchRegionSize;
908
+ regionCollapsible?: boolean;
700
909
  config?: unknown;
701
910
  priority?: number;
702
911
  }
@@ -734,7 +943,7 @@ declare interface PreferenceScopeRef {
734
943
 
735
944
  declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
736
945
 
737
- export declare const primaryPlacements: (workbench: WorkbenchCore) => WorkbenchWidgetPlacement_2[];
946
+ export declare const primaryPlacements: (workbench: WorkbenchCore) => WorkbenchPanelInstance_2[];
738
947
 
739
948
  declare interface RegisteredCommand extends RegisteredContributionMetadata {
740
949
  command: Command;
@@ -750,12 +959,15 @@ declare interface RegisteredContributionMetadata {
750
959
  declare interface RegisteredControlsRendererContribution extends ControlsRendererContribution, RegisteredContributionMetadata {
751
960
  }
752
961
 
753
- declare interface RegisteredDataRendererContribution<TRow extends DataRendererRow = DataRendererRow> extends DataRendererContribution<TRow>, RegisteredContributionMetadata {
962
+ declare interface RegisteredDataTableRendererContribution extends DataTableRendererContribution, RegisteredContributionMetadata {
754
963
  }
755
964
 
756
965
  declare interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {
757
966
  }
758
967
 
968
+ declare interface RegisteredKanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow> extends KanbanRendererContribution<TRow>, RegisteredContributionMetadata {
969
+ }
970
+
759
971
  declare interface RegisteredKeepAliveHost {
760
972
  rendererId: string;
761
973
  host: HTMLElement;
@@ -791,8 +1003,10 @@ declare interface RegisteredTreeRendererContribution extends TreeRendererContrib
791
1003
  }
792
1004
 
793
1005
  declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority" | "singleton" | "reuse"> & {
1006
+ ownedPanelMenuIds?: readonly string[];
794
1007
  singleton: boolean;
795
1008
  reuse: WidgetReusePolicy;
1009
+ role: WorkbenchWidgetRole;
796
1010
  } & RegisteredContributionMetadata;
797
1011
 
798
1012
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -806,7 +1020,9 @@ declare interface RegisteredWorkbenchNotification extends RegisteredContribution
806
1020
  metadata?: Record<string, unknown>;
807
1021
  }
808
1022
 
809
- declare type ResolvedResourceOpener = Required<ResourceOpener>;
1023
+ declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1024
+
1025
+ declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
810
1026
 
811
1027
  declare interface ResourceBrowseEntry {
812
1028
  resource: ResourceRef;
@@ -828,6 +1044,13 @@ declare interface ResourceContextAction {
828
1044
  separatorBefore?: boolean;
829
1045
  }
830
1046
 
1047
+ declare interface ResourceHierarchyProvider {
1048
+ id: string;
1049
+ priority?: number;
1050
+ canResolve(resource: ResourceRef): boolean;
1051
+ getParent(resource: ResourceRef): ResourceRef | undefined;
1052
+ }
1053
+
831
1054
  declare interface ResourceKindContribution {
832
1055
  kind: string;
833
1056
  label: string;
@@ -848,11 +1071,11 @@ declare interface ResourceNavigator<TResult = unknown> {
848
1071
  navigate(resource: ResourceRef): TResult | Promise<TResult>;
849
1072
  }
850
1073
 
851
- declare interface ResourceOpener<TResult = unknown> {
1074
+ declare interface ResourcePresenter {
852
1075
  id: string;
853
1076
  priority?: number;
854
1077
  canOpen(resource: ResourceRef): boolean;
855
- open(resource: ResourceRef, input: OpenResourceInput): TResult | Promise<TResult>;
1078
+ open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;
856
1079
  }
857
1080
 
858
1081
  declare interface ResourceProvider {
@@ -885,19 +1108,24 @@ declare interface ResourceRegistry {
885
1108
  getKind(kind: string): RegisteredResourceKind | undefined;
886
1109
  getSurface(resource: ResourceRef): ResourceSurface | undefined;
887
1110
  listKinds(): RegisteredResourceKind[];
888
- registerOpener(opener: ResourceOpener): Disposable_2;
889
- listOpeners(): ResolvedResourceOpener[];
1111
+ registerPresenter(presenter: ResourcePresenter): Disposable_2;
1112
+ listPresenters(): ResolvedResourcePresenter[];
890
1113
  registerProvider(provider: ResourceProvider): Disposable_2;
891
1114
  listProviders(): ResourceProvider[];
892
1115
  listResources(query: string): readonly ResourceBrowseEntry[];
893
- openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<unknown>;
1116
+ registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1117
+ listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1118
+ walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1119
+ isOpeningResource(): boolean;
1120
+ openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
894
1121
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
895
1122
  }
896
1123
 
897
1124
  declare interface ResourceRegistryStoreState {
898
1125
  kinds: Record<string, RegisteredResourceKind>;
899
- openers: Record<string, ResolvedResourceOpener>;
1126
+ presenters: Record<string, ResolvedResourcePresenter>;
900
1127
  providers: Record<string, ResourceProvider>;
1128
+ hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;
901
1129
  }
902
1130
 
903
1131
  export declare interface ResourceRouteContract {
@@ -906,6 +1134,7 @@ export declare interface ResourceRouteContract {
906
1134
  root: ResourceRef;
907
1135
  detail: ResourceRef;
908
1136
  detailB?: ResourceRef;
1137
+ rootDetailHistory: "retained" | "replaced";
909
1138
  expectedMode?: string;
910
1139
  }
911
1140
 
@@ -982,7 +1211,7 @@ declare interface SettingsRegistryStoreState {
982
1211
  /** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */
983
1212
  declare type SettingsScope = "global" | "project";
984
1213
 
985
- /** An ordered sidebar container. Headerless when `title` is omitted. */
1214
+ /** An ordered sidenav container. Headerless when `title` is omitted. */
986
1215
  declare interface SettingsSectionContribution {
987
1216
  id: string;
988
1217
  title?: string;
@@ -1064,6 +1293,8 @@ declare interface TreeNode {
1064
1293
  hiddenByDefault?: boolean;
1065
1294
  /** When true, the node (e.g. a header/footer row) opts in to the tree's hide/show customization menu. */
1066
1295
  canHide?: boolean;
1296
+ /** When false, the node stays fixed within its Sidenav group. */
1297
+ canReorder?: boolean;
1067
1298
  }
1068
1299
 
1069
1300
  declare type TreeNodeRowVariant = "empty-state";
@@ -1081,7 +1312,7 @@ declare interface TreeRendererContribution {
1081
1312
  getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1082
1313
  }
1083
1314
 
1084
- declare type TreeRendererImplementation = (input: WorkbenchWidgetRenderInput & {
1315
+ declare type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & {
1085
1316
  treeId: string;
1086
1317
  }) => unknown;
1087
1318
 
@@ -1139,13 +1370,15 @@ declare interface TreeViewSection {
1139
1370
  hiddenByDefault?: boolean;
1140
1371
  /** When true, the section (category) opts in to the tree's hide/show customization menu. */
1141
1372
  canHide?: boolean;
1373
+ /** When false, the section stays fixed within the Sidenav main region. */
1374
+ canReorder?: boolean;
1142
1375
  }
1143
1376
 
1144
- export declare const unpinnedPrimaryPlacements: (workbench: WorkbenchCore) => WorkbenchWidgetPlacement_2[];
1377
+ export declare const unpinnedPrimaryPlacements: (workbench: WorkbenchCore) => WorkbenchPanelInstance_2[];
1145
1378
 
1146
1379
  /**
1147
- * Core-owned contracts for data renderer contributions. @pstdio/ui's
1148
- * DataRenderer props are structurally identical; the React layer bridges the
1380
+ * Core-owned contracts for kanban renderer contributions. @pstdio/ui's
1381
+ * KanbanRenderer props are structurally identical; the React layer bridges the
1149
1382
  * two, so drift surfaces as a compile error there instead of coupling core's
1150
1383
  * API shape to UI package ownership.
1151
1384
  */
@@ -1154,19 +1387,26 @@ declare type ViewMode = "board" | "list";
1154
1387
  declare interface WidgetContribution {
1155
1388
  id: string;
1156
1389
  title: string;
1157
- area: WorkbenchArea;
1158
- fallbackArea?: WorkbenchArea;
1390
+ icon?: string;
1391
+ region: WorkbenchRegion;
1392
+ fallbackRegion?: WorkbenchRegion;
1159
1393
  singleton?: boolean;
1160
1394
  reuse?: WidgetReusePolicy;
1161
1395
  mountStrategy?: WidgetMountStrategy;
1162
1396
  closable?: boolean;
1163
1397
  hiddenByDefault?: boolean;
1164
- areaSize?: WorkbenchAreaSize;
1165
- areaCollapsible?: boolean;
1398
+ regionSize?: WorkbenchRegionSize;
1399
+ regionCollapsible?: boolean;
1166
1400
  headerBorderBottom?: boolean;
1401
+ floatingPanels?: WorkbenchFloatingPanelVisibility;
1167
1402
  resourceKinds?: string[];
1168
1403
  priority?: number;
1169
1404
  rendererId: string;
1405
+ openCommandId?: string;
1406
+ role?: WorkbenchWidgetRole;
1407
+ eligibleLocations?: WorkbenchLocationEligibility;
1408
+ panelMenuOwner?: WorkbenchPanelMenuOwner;
1409
+ tab?: WorkbenchWidgetTab;
1170
1410
  config?: unknown;
1171
1411
  canOpen?(resource: ResourceRef): boolean;
1172
1412
  }
@@ -1177,24 +1417,6 @@ declare type WidgetMountStrategy_2 = "active" | "keep-mounted";
1177
1417
 
1178
1418
  declare type WidgetReusePolicy = "resource" | "none";
1179
1419
 
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
1420
  declare type WorkbenchBreadcrumbChangeListener = () => void;
1199
1421
 
1200
1422
  declare interface WorkbenchBreadcrumbController {
@@ -1208,6 +1430,7 @@ declare interface WorkbenchBreadcrumbController {
1208
1430
  declare interface WorkbenchBreadcrumbItem {
1209
1431
  title: unknown;
1210
1432
  icon?: string;
1433
+ indicator?: "session-status";
1211
1434
  url?: string;
1212
1435
  onClick?: () => void;
1213
1436
  resource?: ResourceRef;
@@ -1217,8 +1440,16 @@ declare interface WorkbenchBreadcrumbState {
1217
1440
  items: WorkbenchBreadcrumbItem[] | undefined;
1218
1441
  }
1219
1442
 
1443
+ declare interface WorkbenchClosedSubPanel {
1444
+ region: WorkbenchPanelRegion;
1445
+ reference: WorkbenchSubPanelRef;
1446
+ resource?: ResourceRef;
1447
+ title?: string;
1448
+ }
1449
+
1220
1450
  declare interface WorkbenchCommandExecutionContext {
1221
1451
  resource?: ResourceRef;
1452
+ source?: "panel-add";
1222
1453
  }
1223
1454
 
1224
1455
  declare interface WorkbenchCommandExecutionError {
@@ -1273,6 +1504,7 @@ declare interface WorkbenchCommandParamsRequest {
1273
1504
  }
1274
1505
 
1275
1506
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1507
+ host: WorkbenchHost;
1276
1508
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
1277
1509
  unregisterModule(moduleId: string): void;
1278
1510
  }
@@ -1296,7 +1528,8 @@ declare interface WorkbenchCoreContributionContext {
1296
1528
  renderers: WorkbenchRenderers;
1297
1529
  resources: ResourceRegistry;
1298
1530
  settings: SettingsRegistry;
1299
- sessionPanel: WorkbenchSessionPanelController;
1531
+ shell: WorkbenchShellController;
1532
+ sidePanel: WorkbenchSidePanelController;
1300
1533
  terminal: WorkbenchTerminalController;
1301
1534
  themes: ThemeRegistry;
1302
1535
  fileIconThemes: FileIconThemeRegistry;
@@ -1310,22 +1543,33 @@ declare interface WorkbenchFileIconThemeStoreState {
1310
1543
  themes: readonly FileIconThemePreferenceOption[];
1311
1544
  }
1312
1545
 
1313
- declare type WorkbenchFocusArea = (typeof workbenchFocusAreas)[number];
1314
-
1315
- declare const workbenchFocusAreas: readonly ["activityBar", "sideBar", "main", "panel", "statusBar"];
1546
+ declare type WorkbenchFloatingPanelVisibility = "visible" | "hidden";
1316
1547
 
1317
- declare type WorkbenchFocusChangeListener = (area: WorkbenchFocusArea | undefined) => void;
1548
+ declare type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;
1318
1549
 
1319
1550
  declare interface WorkbenchFocusController {
1320
1551
  store: WorkbenchStore<WorkbenchFocusState>;
1321
- setActiveArea(area: WorkbenchFocusArea): void;
1552
+ setActiveRegion(region: WorkbenchFocusRegionId): void;
1322
1553
  clearFocus(): void;
1323
- getActiveArea(): WorkbenchFocusArea | undefined;
1554
+ getActiveRegion(): WorkbenchFocusRegionId | undefined;
1324
1555
  onDidChange(listener: WorkbenchFocusChangeListener): Disposable_2;
1325
1556
  }
1326
1557
 
1558
+ declare type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];
1559
+
1560
+ declare const workbenchFocusRegions: readonly ["activity", "sidenav", "main", "secondary", "side", "status"];
1561
+
1327
1562
  declare interface WorkbenchFocusState {
1328
- activeArea: WorkbenchFocusArea | undefined;
1563
+ activeRegion: WorkbenchFocusRegionId | undefined;
1564
+ }
1565
+
1566
+ declare interface WorkbenchHost {
1567
+ getSnapshot(): WorkbenchSnapshot;
1568
+ restoreSnapshot(snapshot: WorkbenchSnapshot): void;
1569
+ setPersistenceScope(scope: string | undefined, input?: {
1570
+ carryRegions?: readonly WorkbenchRegion[];
1571
+ }): void;
1572
+ getPersistenceScope(): string | undefined;
1329
1573
  }
1330
1574
 
1331
1575
  declare interface WorkbenchLastResourceController {
@@ -1335,8 +1579,10 @@ declare interface WorkbenchLastResourceController {
1335
1579
  }
1336
1580
 
1337
1581
  declare interface WorkbenchLayout {
1338
- areas: Record<WorkbenchArea, WorkbenchAreaState>;
1582
+ regions: Record<WorkbenchRegion, WorkbenchRegionState>;
1583
+ locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;
1339
1584
  activeWidgetId?: string;
1585
+ activeLocationWidgetId?: string;
1340
1586
  activeResourceUri?: string;
1341
1587
  }
1342
1588
 
@@ -1345,7 +1591,25 @@ declare type WorkbenchLayoutModel = LayoutModel & MenuRegistry;
1345
1591
  declare interface WorkbenchLayoutStoreState {
1346
1592
  layout: WorkbenchLayout;
1347
1593
  widgets: Record<string, RegisteredWidgetContribution>;
1348
- placeholders: Partial<Record<WorkbenchArea, RegisteredPlaceholderContribution>>;
1594
+ placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1595
+ }
1596
+
1597
+ declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1598
+
1599
+ declare interface WorkbenchLocationEligibility {
1600
+ modeIds?: string[];
1601
+ resourceKinds?: string[];
1602
+ resourceIds?: string[];
1603
+ canOpen?(resource: ResourceRef): boolean;
1604
+ }
1605
+
1606
+ declare interface WorkbenchLocationRef {
1607
+ key: string;
1608
+ modeId?: string;
1609
+ resource?: ResourceRef;
1610
+ contributionId?: string;
1611
+ instanceKey?: string;
1612
+ title?: string;
1349
1613
  }
1350
1614
 
1351
1615
  declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
@@ -1357,16 +1621,24 @@ declare type WorkbenchModeChangeListener = () => void;
1357
1621
  declare interface WorkbenchModeContribution {
1358
1622
  id: string;
1359
1623
  label?: string;
1624
+ panels?: readonly WorkbenchPanelRegion[];
1360
1625
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1626
+ seed?(ctx: WorkbenchModeActivationContext): void;
1627
+ enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1361
1628
  }
1362
1629
 
1363
1630
  declare interface WorkbenchModeRegistry {
1364
1631
  store: WorkbenchStore<WorkbenchModeStoreState>;
1632
+ dispose(): void;
1365
1633
  registerMode(mode: WorkbenchModeContribution): Disposable_2;
1366
1634
  getMode(id: string): WorkbenchModeContribution | undefined;
1367
1635
  listModes(): WorkbenchModeContribution[];
1368
1636
  getActiveModeId(): string | undefined;
1369
- setActiveMode(id: string | undefined): void;
1637
+ isTransitioning(): boolean;
1638
+ setActiveMode(id: string | undefined, input?: {
1639
+ deferSeed?: boolean;
1640
+ }): void;
1641
+ seedActiveMode(): void;
1370
1642
  onDidChangeActive(listener: WorkbenchModeChangeListener): Disposable_2;
1371
1643
  }
1372
1644
 
@@ -1377,6 +1649,8 @@ declare interface WorkbenchModeStoreState {
1377
1649
 
1378
1650
  declare type WorkbenchModuleActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1379
1651
 
1652
+ declare type WorkbenchModuleContext = WorkbenchCoreContributionContext;
1653
+
1380
1654
  declare interface WorkbenchModuleContribution {
1381
1655
  id: string;
1382
1656
  source?: ContributionSource;
@@ -1384,7 +1658,21 @@ declare interface WorkbenchModuleContribution {
1384
1658
  activate(ctx: WorkbenchModuleContributionContext): WorkbenchModuleActivationResult;
1385
1659
  }
1386
1660
 
1387
- declare type WorkbenchModuleContributionContext = WorkbenchCoreContributionContext;
1661
+ declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1662
+
1663
+ declare interface WorkbenchNavigationEntry {
1664
+ entryId: string;
1665
+ recordedAt: number;
1666
+ location: WorkbenchLocationRef;
1667
+ selectedSubPanels: Partial<Record<WorkbenchPanelRegion, WorkbenchSubPanelRef>>;
1668
+ kind: "resource" | "widget" | "mode";
1669
+ modeId?: string;
1670
+ resource?: ResourceRef;
1671
+ widgetId?: string;
1672
+ contributionId?: string;
1673
+ title?: string;
1674
+ closedSubPanel?: WorkbenchClosedSubPanel;
1675
+ }
1388
1676
 
1389
1677
  declare interface WorkbenchNotification {
1390
1678
  id?: string;
@@ -1420,18 +1708,187 @@ declare interface WorkbenchNotificationStoreState {
1420
1708
  notifications: Record<string, RegisteredWorkbenchNotification>;
1421
1709
  }
1422
1710
 
1711
+ declare interface WorkbenchPanelContribution {
1712
+ id: string;
1713
+ title: string;
1714
+ icon?: string;
1715
+ region: WorkbenchRegion;
1716
+ fallbackRegion?: WorkbenchRegion;
1717
+ rendererId: string;
1718
+ closable: boolean;
1719
+ singleton?: boolean;
1720
+ reuse?: WorkbenchPanelReusePolicy;
1721
+ mountStrategy?: WorkbenchPanelMountStrategy;
1722
+ hiddenByDefault?: boolean;
1723
+ regionSize?: WorkbenchRegionSize;
1724
+ regionCollapsible?: boolean;
1725
+ headerBorderBottom?: boolean;
1726
+ floatingPanels?: WorkbenchFloatingPanelVisibility;
1727
+ resourceKinds?: string[];
1728
+ eligibleLocations?: WorkbenchLocationEligibility;
1729
+ priority?: number;
1730
+ openCommandId?: string;
1731
+ tab?: WorkbenchPanelTab;
1732
+ config?: unknown;
1733
+ canOpen?(resource: ResourceRef): boolean;
1734
+ ownerId?: string;
1735
+ source?: ContributionSource;
1736
+ panelMenus?: readonly WorkbenchPanelMenuDefinition[];
1737
+ }
1738
+
1739
+ declare interface WorkbenchPanelInstance {
1740
+ instanceId: string;
1741
+ panelId: string;
1742
+ ownerId?: string;
1743
+ source?: ContributionSource;
1744
+ resource?: ResourceRef;
1745
+ resourceUri?: string;
1746
+ ownerResourceUri?: string;
1747
+ title?: string;
1748
+ pinned?: boolean;
1749
+ closable: boolean;
1750
+ mountStrategy?: WorkbenchPanelMountStrategy;
1751
+ hiddenByDefault?: boolean;
1752
+ tabRetention?: WorkbenchTabRetention;
1753
+ tab?: WorkbenchPanelTab;
1754
+ }
1755
+
1756
+ declare interface WorkbenchPanelInstance_2 {
1757
+ instanceId: string;
1758
+ panelId: string;
1759
+ ownerId?: string;
1760
+ source?: ContributionSource_2;
1761
+ resource?: ResourceRef_2;
1762
+ resourceUri?: string;
1763
+ ownerResourceUri?: string;
1764
+ title?: string;
1765
+ pinned?: boolean;
1766
+ closable: boolean;
1767
+ mountStrategy?: WorkbenchPanelMountStrategy_2;
1768
+ hiddenByDefault?: boolean;
1769
+ tabRetention?: WorkbenchTabRetention_2;
1770
+ tab?: WorkbenchPanelTab_2;
1771
+ }
1772
+
1773
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1774
+ region: WorkbenchPanelMenuRegion;
1775
+ fallbackRegion?: WorkbenchPanelMenuRegion;
1776
+ };
1777
+
1778
+ declare interface WorkbenchPanelMenuDefinition {
1779
+ id: string;
1780
+ title: string;
1781
+ icon?: string;
1782
+ side: WorkbenchPanelMenuSide;
1783
+ singleton?: boolean;
1784
+ reuse?: WorkbenchPanelReusePolicy;
1785
+ mountStrategy?: WorkbenchPanelMountStrategy;
1786
+ hiddenByDefault?: boolean;
1787
+ regionSize?: WorkbenchRegionSize;
1788
+ regionCollapsible?: boolean;
1789
+ headerBorderBottom?: boolean;
1790
+ rendererId: string;
1791
+ priority?: number;
1792
+ config?: unknown;
1793
+ }
1794
+
1795
+ declare type WorkbenchPanelMenuOwner = {
1796
+ level: "panel";
1797
+ contributionId?: string;
1798
+ } | {
1799
+ level: "sub-panel";
1800
+ contributionId: string;
1801
+ };
1802
+
1803
+ declare type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];
1804
+
1805
+ declare const workbenchPanelMenuRegions: {
1806
+ readonly main: {
1807
+ readonly left: "main-left-menu";
1808
+ readonly right: "main-right-menu";
1809
+ };
1810
+ readonly secondary: {
1811
+ readonly left: "secondary-left-menu";
1812
+ readonly right: "secondary-right-menu";
1813
+ };
1814
+ readonly side: {
1815
+ readonly left: "side-left-menu";
1816
+ readonly right: "side-right-menu";
1817
+ };
1818
+ };
1819
+
1820
+ declare interface WorkbenchPanelMenusContribution {
1821
+ panelMenus?: readonly WorkbenchPanelMenuDefinition[];
1822
+ }
1823
+
1824
+ declare type WorkbenchPanelMenuSide = "left" | "right";
1825
+
1826
+ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
1827
+
1828
+ declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
1829
+
1830
+ declare type WorkbenchPanelOpenStrategy = {
1831
+ kind: "activate-or-open";
1832
+ position?: WorkbenchTabPosition;
1833
+ } | {
1834
+ kind: "replace-active";
1835
+ } | {
1836
+ kind: "replace-panel";
1837
+ instanceId: string;
1838
+ } | {
1839
+ kind: "preview";
1840
+ position?: WorkbenchTabPosition;
1841
+ };
1842
+
1843
+ declare type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];
1844
+
1845
+ declare const workbenchPanelRegions: readonly ["main", "secondary", "side"];
1846
+
1847
+ declare interface WorkbenchPanelRenderInput {
1848
+ workbench: WorkbenchCore;
1849
+ panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;
1850
+ instance: WorkbenchPanelInstance;
1851
+ refresh: () => void;
1852
+ }
1853
+
1854
+ declare type WorkbenchPanelReusePolicy = WidgetReusePolicy;
1855
+
1423
1856
  declare type WorkbenchPanelsChangeListener = (state: WorkbenchPanelsState) => void;
1424
1857
 
1425
1858
  declare interface WorkbenchPanelsController {
1426
1859
  store: WorkbenchStore<WorkbenchPanelsState>;
1427
- isOpen(areaId: string): boolean;
1428
- setOpen(areaId: string, open: boolean): void;
1429
- toggle(areaId: string): void;
1860
+ isOpen(regionId: string): boolean;
1861
+ setOpen(regionId: string, open: boolean): void;
1862
+ toggle(regionId: string): void;
1863
+ setPersistenceScope(scope: string | undefined): void;
1864
+ getPersistenceScope(): string | undefined;
1430
1865
  onDidChange(listener: WorkbenchPanelsChangeListener): Disposable_2;
1431
1866
  }
1432
1867
 
1433
1868
  declare interface WorkbenchPanelsState {
1434
- openByAreaId: Record<string, boolean>;
1869
+ openByRegionId: Record<string, boolean>;
1870
+ }
1871
+
1872
+ declare type WorkbenchPanelTab = WorkbenchWidgetTab;
1873
+
1874
+ declare type WorkbenchPanelTab_2 = WorkbenchWidgetTab_2;
1875
+
1876
+ declare type WorkbenchRegion = (typeof workbenchRegions)[number];
1877
+
1878
+ 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"];
1879
+
1880
+ declare interface WorkbenchRegionSize {
1881
+ defaultPx?: number;
1882
+ minPx?: number;
1883
+ maxPx?: number;
1884
+ }
1885
+
1886
+ declare interface WorkbenchRegionState {
1887
+ id: WorkbenchRegion;
1888
+ visible: boolean;
1889
+ size?: number;
1890
+ widgets: WorkbenchWidgetPlacement[];
1891
+ activeWidgetId?: string;
1435
1892
  }
1436
1893
 
1437
1894
  declare type WorkbenchRendererChangeListener = () => void;
@@ -1439,7 +1896,7 @@ declare type WorkbenchRendererChangeListener = () => void;
1439
1896
  declare type WorkbenchRendererRegistration = {
1440
1897
  id: string;
1441
1898
  keepAlive?: false;
1442
- render: (input: WorkbenchWidgetRenderInput) => unknown;
1899
+ render: (input: WorkbenchPanelRenderInput) => unknown;
1443
1900
  } | {
1444
1901
  id: string;
1445
1902
  keepAlive: true;
@@ -1452,32 +1909,54 @@ declare interface WorkbenchRendererRegistry {
1452
1909
  getRenderer(id: string): WorkbenchRendererRegistration | undefined;
1453
1910
  listRenderers(): WorkbenchRendererRegistration[];
1454
1911
  onDidChange(listener: WorkbenchRendererChangeListener): Disposable_2;
1455
- claim(rendererId: string, slot: HTMLElement, input: WorkbenchWidgetRenderInput): Disposable_2;
1912
+ claim(rendererId: string, slot: HTMLElement, input: WorkbenchPanelRenderInput): Disposable_2;
1456
1913
  getHost(rendererId: string): HTMLElement | undefined;
1457
- getClaim(rendererId: string): WorkbenchWidgetRenderInput | undefined;
1914
+ getClaim(rendererId: string): WorkbenchPanelRenderInput | undefined;
1458
1915
  }
1459
1916
 
1460
- declare type WorkbenchRenderers = WorkbenchRendererRegistry & TreeRendererRegistry & DataRendererRegistry & FileRendererRegistry & ControlsRendererRegistry;
1917
+ declare type WorkbenchRenderers = WorkbenchRendererRegistry & TreeRendererRegistry & KanbanRendererRegistry & DataTableRendererRegistry & FileRendererRegistry & ControlsRendererRegistry;
1461
1918
 
1462
1919
  declare interface WorkbenchRendererStoreState {
1463
1920
  renderers: Record<string, WorkbenchRendererRegistration>;
1464
1921
  hosts: Record<string, RegisteredKeepAliveHost>;
1465
- claims: Record<string, WorkbenchWidgetRenderInput>;
1922
+ claims: Record<string, WorkbenchPanelRenderInput>;
1466
1923
  }
1467
1924
 
1468
- declare type WorkbenchSessionPanelChangeListener = (mode: WorkbenchSessionPanelMode) => void;
1925
+ declare interface WorkbenchShellController {
1926
+ getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;
1927
+ setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;
1928
+ setRegionSize(region: WorkbenchRegion, size: number): void;
1929
+ getSidePanelPresentation(): WorkbenchSidePanelPresentation;
1930
+ setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;
1931
+ onDidChange(listener: () => void): Disposable_2;
1932
+ }
1933
+
1934
+ declare type WorkbenchShellOpenRegion = "sidenav" | "secondary" | WorkbenchPanelMenuRegion;
1469
1935
 
1470
- declare interface WorkbenchSessionPanelController {
1471
- store: WorkbenchStore<WorkbenchSessionPanelState>;
1472
- getMode(): WorkbenchSessionPanelMode;
1473
- setMode(mode: WorkbenchSessionPanelMode): void;
1474
- onDidChange(listener: WorkbenchSessionPanelChangeListener): Disposable_2;
1936
+ declare interface WorkbenchShellRegionState {
1937
+ open: boolean;
1938
+ size?: number;
1475
1939
  }
1476
1940
 
1477
- declare type WorkbenchSessionPanelMode = "bubble" | "closed" | "attached";
1941
+ declare type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;
1942
+
1943
+ declare interface WorkbenchSidePanelController {
1944
+ store: WorkbenchStore<WorkbenchSidePanelState>;
1945
+ getMode(): WorkbenchSidePanelMode;
1946
+ setMode(mode: WorkbenchSidePanelMode): void;
1947
+ onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable_2;
1948
+ }
1478
1949
 
1479
- declare interface WorkbenchSessionPanelState {
1480
- mode: WorkbenchSessionPanelMode;
1950
+ declare type WorkbenchSidePanelMode = "floating" | "closed" | "attached";
1951
+
1952
+ declare type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;
1953
+
1954
+ declare interface WorkbenchSidePanelState {
1955
+ mode: WorkbenchSidePanelMode;
1956
+ }
1957
+
1958
+ declare interface WorkbenchSnapshot {
1959
+ layout: WorkbenchLayout;
1481
1960
  }
1482
1961
 
1483
1962
  declare interface WorkbenchStore<TState> {
@@ -1496,6 +1975,27 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
1496
1975
 
1497
1976
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
1498
1977
 
1978
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
1979
+ region: WorkbenchPanelRegion;
1980
+ fallbackRegion?: WorkbenchPanelRegion;
1981
+ } & WorkbenchPanelMenusContribution;
1982
+
1983
+ declare interface WorkbenchSubPanelRef {
1984
+ contributionId: string;
1985
+ resourceUri?: string;
1986
+ instanceKey?: string;
1987
+ }
1988
+
1989
+ declare type WorkbenchTabPosition = "start" | "end" | {
1990
+ beforeWidgetId: string;
1991
+ } | {
1992
+ afterWidgetId: string;
1993
+ };
1994
+
1995
+ declare type WorkbenchTabRetention = "preview" | "persistent";
1996
+
1997
+ declare type WorkbenchTabRetention_2 = "preview" | "persistent";
1998
+
1499
1999
  declare interface WorkbenchTerminalController {
1500
2000
  store: WorkbenchStore<WorkbenchTerminalState>;
1501
2001
  /** True once the host injected a session opener. */
@@ -1589,32 +2089,29 @@ declare interface WorkbenchWidgetPlacement {
1589
2089
  source?: ContributionSource;
1590
2090
  resource?: ResourceRef;
1591
2091
  resourceUri?: string;
2092
+ ownerResourceUri?: string;
1592
2093
  title?: string;
1593
2094
  pinned?: boolean;
1594
2095
  closable?: boolean;
1595
2096
  mountStrategy?: WidgetMountStrategy;
1596
2097
  hiddenByDefault?: boolean;
2098
+ tabRetention?: WorkbenchTabRetention;
2099
+ tab?: WorkbenchWidgetTab;
2100
+ role?: WorkbenchWidgetRole;
1597
2101
  }
1598
2102
 
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;
2103
+ declare type WorkbenchWidgetRole = "content" | "location" | "sub-panel" | "panel-menu";
2104
+
2105
+ declare interface WorkbenchWidgetTab {
2106
+ contentRendererId?: string;
2107
+ /** Custom actions shown when the user activates an already-active tab. */
2108
+ customMenuRendererId?: string;
1611
2109
  }
1612
2110
 
1613
- declare interface WorkbenchWidgetRenderInput {
1614
- workbench: WorkbenchCore;
1615
- widget: RegisteredWidgetContribution | RegisteredPlaceholderContribution;
1616
- placement: WorkbenchWidgetPlacement;
1617
- refresh: () => void;
2111
+ declare interface WorkbenchWidgetTab_2 {
2112
+ contentRendererId?: string;
2113
+ /** Custom actions shown when the user activates an already-active tab. */
2114
+ customMenuRendererId?: string;
1618
2115
  }
1619
2116
 
1620
2117
  export { }