@pstdio/workbench 0.4.0 → 0.6.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 (34) hide show
  1. package/README.md +66 -72
  2. package/dist/composition-resolver-types-CWykPyEK.js +241 -0
  3. package/dist/composition-resolver-types-CWykPyEK.js.map +1 -0
  4. package/dist/extensions.d.ts +359 -43
  5. package/dist/extensions.js +1595 -1044
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-zpunbE4I.js +432 -0
  8. package/dist/file-renderer-view-zpunbE4I.js.map +1 -0
  9. package/dist/file-section-navigation-CfYqVObc.js +30 -0
  10. package/dist/file-section-navigation-CfYqVObc.js.map +1 -0
  11. package/dist/index.d.ts +287 -19
  12. package/dist/index.js +2323 -2011
  13. package/dist/index.js.map +1 -1
  14. package/dist/layout-types-DMoZz38-.js.map +1 -1
  15. package/dist/react.d.ts +157 -16
  16. package/dist/react.js +2675 -2736
  17. package/dist/react.js.map +1 -1
  18. package/dist/storage.d.ts +96 -2
  19. package/dist/storage.js +173 -115
  20. package/dist/storage.js.map +1 -1
  21. package/dist/testing.d.ts +146 -14
  22. package/dist/webview-runtime.js +1 -1
  23. package/dist/webview-runtime.js.map +1 -1
  24. package/dist/workbench-built-ins-BtgeB274.js +1171 -0
  25. package/dist/workbench-built-ins-BtgeB274.js.map +1 -0
  26. package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
  27. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
  28. package/package.json +3 -3
  29. package/dist/context-key-service-W4QEfVdN.js +0 -1031
  30. package/dist/context-key-service-W4QEfVdN.js.map +0 -1
  31. package/dist/file-renderer-view-DrrhYnb_.js +0 -171
  32. package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
  33. package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
  34. package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { CommandExecuteRequest } from '@pstdio/sdk/api';
2
+ import { CommandExecuteResponse } from '@pstdio/sdk/api';
2
3
  import { ComponentType } from 'react';
3
4
  import { ExtensionCommandPaletteContribution } from '@pstdio/sdk/api';
4
5
  import { ExtensionMenuContribution } from '@pstdio/sdk/api';
@@ -113,9 +114,7 @@ export declare const buildWorkbenchExtensionMenuRegistrations: (input: {
113
114
  export declare const buildWorkbenchExtensionRouteEntries: (input: {
114
115
  metadata: WorkbenchExtensionMetadata | undefined;
115
116
  createResource: (resourceInput: WorkbenchExtensionRouteResourceInput) => ResourceRef;
116
- }) => {
117
- resource: ResourceRef;
118
- }[];
117
+ }) => any;
119
118
 
120
119
  /**
121
120
  * A data-driven list of items, each opening a contributor-supplied editor. The
@@ -205,6 +204,7 @@ declare interface CommandParamDescriptor {
205
204
  declare interface CommandParamOption {
206
205
  label: string;
207
206
  value: string;
207
+ icon?: string;
208
208
  }
209
209
 
210
210
  declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
@@ -225,6 +225,72 @@ declare interface CommandRegistryStoreState {
225
225
  commands: Record<string, RegisteredCommand>;
226
226
  }
227
227
 
228
+ declare interface CompositionDiagnostic {
229
+ code: "extension_resource_kind_missing" | "extension_resource_slot_missing" | "extension_resource_slot_closed" | "extension_panel_missing" | "extension_panel_placement_unresolvable" | "extension_mode_resource_unsupported" | "extension_placement_required_invalid" | "extension_resource_primary_invalid";
230
+ message: string;
231
+ panelId?: string;
232
+ slot?: string;
233
+ }
234
+
235
+ declare interface CompositionModeDefinition {
236
+ id: string;
237
+ extensionId?: string;
238
+ resources?: Record<string, CompositionModeRecipe>;
239
+ modePanels?: Record<string, CompositionPlacementPolicy>;
240
+ }
241
+
242
+ declare interface CompositionModeRecipe {
243
+ slots?: Record<string, CompositionPlacementPolicy>;
244
+ panels?: Record<string, CompositionPlacementPolicy>;
245
+ }
246
+
247
+ declare interface CompositionPanelDefinition {
248
+ id: string;
249
+ extensionId: string;
250
+ title: string;
251
+ icon?: string;
252
+ show?: CompositionPanelPlacement | readonly CompositionPanelPlacement[];
253
+ }
254
+
255
+ declare interface CompositionPanelPlacement extends CompositionPlacementPolicy {
256
+ resourceKind?: string;
257
+ }
258
+
259
+ declare interface CompositionPlacementPolicy {
260
+ region: DockedCompositionRegion;
261
+ allowedRegions?: readonly DockedCompositionRegion[];
262
+ required?: boolean;
263
+ defaultOpen?: boolean;
264
+ pinned?: boolean;
265
+ }
266
+
267
+ declare interface CompositionReconcileContext {
268
+ layout: LayoutModel;
269
+ notifications: NotificationRegistry;
270
+ }
271
+
272
+ export declare const compositionRequiredNotificationId: (modeId: string) => string;
273
+
274
+ declare interface CompositionResourceKindDefinition {
275
+ id: string;
276
+ extensionId: string;
277
+ surface: "primary" | "secondary" | "attached";
278
+ slots: Record<string, CompositionSlotDefinition>;
279
+ }
280
+
281
+ declare interface CompositionResourcePanelEdge {
282
+ id: string;
283
+ extensionId: string;
284
+ resourceKind: string;
285
+ panel: string;
286
+ slot: string;
287
+ }
288
+
289
+ declare interface CompositionSlotDefinition {
290
+ cardinality: "one" | "many";
291
+ external: boolean;
292
+ }
293
+
228
294
  declare interface ContextKeyScope extends Disposable_2 {
229
295
  ownerId: string;
230
296
  set(key: string, value: ContextKeyValue): void;
@@ -367,6 +433,8 @@ declare interface CreateTerminalSessionCapabilityInput {
367
433
  hostEvents: HostEventPublisher;
368
434
  }
369
435
 
436
+ export declare const createWorkbenchCompositionRegistry: () => WorkbenchCompositionRegistry;
437
+
370
438
  export declare const createWorkbenchWebviewHostCapabilities: (input: CreateWorkbenchWebviewHostCapabilitiesInput) => {
371
439
  "terminal.session"?: HostCapability | undefined;
372
440
  "commands.execute": (params: unknown) => Promise<unknown>;
@@ -446,7 +514,7 @@ declare interface DataTableRendererContribution {
446
514
  emptyDescription?: string;
447
515
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
448
516
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
449
- onRowClick?: (row: DataTableRendererRow) => void;
517
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
450
518
  }
451
519
 
452
520
  declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -514,28 +582,28 @@ declare interface DataTableRendererThemeColor {
514
582
 
515
583
  declare type DataTableViewRecord = WorkbenchExtensionMetadata["panels"][number];
516
584
 
585
+ declare interface DeclaredPanelPlacement {
586
+ for?: string;
587
+ region: DockedCompositionRegion;
588
+ allowedRegions?: readonly DockedCompositionRegion[];
589
+ required?: boolean;
590
+ defaultOpen?: boolean;
591
+ pinned?: boolean;
592
+ }
593
+
517
594
  declare interface Disposable_2 {
518
595
  dispose(): void;
519
596
  }
520
597
 
521
- export declare const emptyWorkbenchExtensionMetadata: {
522
- commands: never[];
523
- commandPaletteContributions: never[];
524
- diagnostics: never[];
525
- extensions: never[];
526
- menuContributions: never[];
527
- modes: never[];
528
- navigation: never[];
529
- routes: never[];
530
- kanbanRenderers: never[];
531
- dataTableRenderers: never[];
532
- treeRenderers: never[];
533
- fileRenderers: never[];
534
- settingsPanels: never[];
535
- settingsDefinitions: never[];
536
- treeItems: never[];
537
- panels: never[];
538
- };
598
+ declare type DockedCompositionRegion = (typeof dockedCompositionRegions)[number];
599
+
600
+ declare type DockedCompositionRegion_2 = (typeof dockedCompositionRegions_2)[number];
601
+
602
+ declare const dockedCompositionRegions: readonly ["sidenav", "main", "secondary", "side"];
603
+
604
+ declare const dockedCompositionRegions_2: readonly ["sidenav", "main", "secondary", "side"];
605
+
606
+ export declare const emptyWorkbenchExtensionMetadata: WorkbenchExtensionMetadata;
539
607
 
540
608
  declare interface EnumOption {
541
609
  value: string;
@@ -556,8 +624,19 @@ declare interface EnumOptionsSource {
556
624
  getSnapshot: () => EnumOption[];
557
625
  }
558
626
 
627
+ declare type ExtensionPanelRecord = WorkbenchExtensionMetadata["panels"][number];
628
+
629
+ declare type ExtensionResourcePanels = WorkbenchExtensionMetadata["resourcePanels"];
630
+
559
631
  declare type ExtensionTreeRendererRecord = NonNullable<WorkbenchExtensionMetadata["treeRenderers"]>[number];
560
632
 
633
+ declare interface ExtensionTreeResource {
634
+ type: string;
635
+ id: string;
636
+ label?: string;
637
+ metadata?: Record<string, unknown>;
638
+ }
639
+
561
640
  declare type ExtensionTreeViewRecord = WorkbenchExtensionMetadata["panels"][number] | NonNullable<WorkbenchExtensionMetadata["panels"][number]["panelMenus"]>[number];
562
641
 
563
642
  export declare interface ExtensionWebviewFileCapabilities {
@@ -606,6 +685,8 @@ declare interface FileRendererContent {
606
685
  content?: string;
607
686
  dataUrl?: string;
608
687
  placeholder?: string;
688
+ /** Ordered backing-store revision when one is available. */
689
+ revision?: string;
609
690
  }
610
691
 
611
692
  declare interface FileRendererContribution {
@@ -615,35 +696,55 @@ declare interface FileRendererContribution {
615
696
  /** Resolve the file's content (and identity) for the bound resource. */
616
697
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
617
698
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
618
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
699
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
619
700
  }
620
701
 
621
702
  declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
622
703
  fileRendererId: string;
623
704
  }) => unknown;
624
705
 
625
- declare interface FileRendererRefreshEvent {
706
+ declare interface FileRendererRefreshEnvelope {
707
+ resourceUri?: string;
708
+ origin?: FileRendererRefreshOrigin;
709
+ revision?: string;
710
+ }
711
+
712
+ export declare const fileRendererRefreshEnvelopeFromCommand: (body: CommandExecuteRequest, response: CommandExecuteResponse) => FileRendererRefreshEnvelope | undefined;
713
+
714
+ declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
626
715
  fileRendererId: string;
627
716
  }
628
717
 
629
718
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
630
719
 
720
+ declare interface FileRendererRefreshOrigin {
721
+ rendererId: string;
722
+ instanceId: string;
723
+ operationId: string;
724
+ }
725
+
631
726
  declare interface FileRendererRegistry {
632
727
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
633
728
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
634
729
  setFileRendererImplementation(impl: FileRendererImplementation): void;
635
730
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
636
731
  listFileRenderers(): RegisteredFileRendererContribution[];
637
- refreshFileRenderer(id: string): void;
732
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
638
733
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
639
734
  }
640
735
 
736
+ declare interface FileRendererSaveResult {
737
+ revision?: string;
738
+ }
739
+
641
740
  declare interface FileRendererStoreState {
642
741
  renderers: Record<string, RegisteredFileRendererContribution>;
643
742
  }
644
743
 
645
744
  declare interface HistoryController {
646
745
  store: WorkbenchStore<HistoryStoreState>;
746
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
747
+ createCheckpoint(): () => void;
647
748
  goBack(): HistoryEntry | undefined;
648
749
  goForward(): HistoryEntry | undefined;
649
750
  goPrevious(): HistoryEntry | undefined;
@@ -677,6 +778,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
677
778
  id: string;
678
779
  title: string;
679
780
  resourceKind?: string;
781
+ /** Host-owned scope for persisted display settings. */
782
+ storageScope?: string;
680
783
  /**
681
784
  * Declarative attribute schema. The renderer dispatches filter / group /
682
785
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -704,8 +807,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
704
807
  */
705
808
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
706
809
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
707
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
708
- onRowClick?: (row: TRow) => void;
810
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
811
+ onRowActivate?: (row: TRow) => Promise<void> | void;
709
812
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
710
813
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
711
814
  /**
@@ -799,7 +902,7 @@ declare interface KanbanRendererRow {
799
902
  title: string;
800
903
  /**
801
904
  * Optional navigation handle. When set, the renderer's default click handler
802
- * routes through the contribution's onRowClick (which typically opens the
905
+ * routes through the contribution's onRowActivate (which typically opens the
803
906
  * resource via the workbench).
804
907
  */
805
908
  resource?: unknown;
@@ -906,6 +1009,16 @@ declare interface LayoutModel {
906
1009
  carryRegionState?: readonly WorkbenchRegion[];
907
1010
  }): void;
908
1011
  getPersistenceScope(): LayoutScope | undefined;
1012
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
1013
+ /** Whether anything is stored for the active scope right now. */
1014
+ hasPersistedLayout(): boolean;
1015
+ /**
1016
+ * Whether the active scope was entered with a layout the user already had. Unlike
1017
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
1018
+ */
1019
+ enteredWithPersistedLayout(): boolean;
1020
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
1021
+ reconcilePanelMenus(): void;
909
1022
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
910
1023
  dispose(): void;
911
1024
  };
@@ -916,6 +1029,13 @@ declare interface LayoutModel {
916
1029
 
917
1030
  declare type LayoutScope = string;
918
1031
 
1032
+ export declare const listCompositionAddablePanels: (input: {
1033
+ registry: WorkbenchCompositionRegistry;
1034
+ modeId: string;
1035
+ layout: ReturnType<LayoutModel["getLayout"]>;
1036
+ resourceKind?: string;
1037
+ }) => readonly ResolvedCompositionAddablePanel[];
1038
+
919
1039
  declare type Localizer = (value: unknown, fallback?: string) => string;
920
1040
 
921
1041
  declare const MANUAL_ORDERING = "manual";
@@ -1020,6 +1140,7 @@ declare interface OpenWidgetInput {
1020
1140
  resource?: ResourceRef;
1021
1141
  title?: string;
1022
1142
  region?: WorkbenchRegion;
1143
+ role?: WorkbenchWidgetRole;
1023
1144
  ownerId?: string;
1024
1145
  source?: ContributionSource;
1025
1146
  pinned?: boolean;
@@ -1037,13 +1158,19 @@ declare interface OpenWorkbenchPanelInput {
1037
1158
  resource?: ResourceRef;
1038
1159
  title?: string;
1039
1160
  region?: WorkbenchRegion;
1161
+ role?: WorkbenchWidgetRole;
1040
1162
  pinned?: boolean;
1163
+ closable?: boolean;
1041
1164
  mountStrategy?: WorkbenchPanelMountStrategy;
1042
1165
  hiddenByDefault?: boolean;
1043
1166
  tab?: WorkbenchPanelTab;
1044
1167
  strategy?: WorkbenchPanelOpenStrategy;
1045
1168
  }
1046
1169
 
1170
+ export declare const panelMenuDeclarationOffsets: <T extends {
1171
+ panelMenus?: readonly unknown[];
1172
+ }>(panels: readonly T[]) => number[];
1173
+
1047
1174
  declare interface PlaceholderContribution {
1048
1175
  id: string;
1049
1176
  title: string;
@@ -1088,9 +1215,16 @@ declare interface PreferenceScopeRef {
1088
1215
 
1089
1216
  declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
1090
1217
 
1218
+ export declare const reconcileCompositionLayout: (ctx: CompositionReconcileContext, input: {
1219
+ registry: WorkbenchCompositionRegistry;
1220
+ modeId: string;
1221
+ resourceKind?: string;
1222
+ seeding?: boolean;
1223
+ }) => ResolvedComposition | undefined;
1224
+
1091
1225
  export declare const refreshOpenWorkbenchExtensionWebviews: (workbench: WorkbenchModuleContext, metadata: WorkbenchExtensionMetadata) => void;
1092
1226
 
1093
- export declare const refreshWorkbenchExtensionContributions: (workbench: WorkbenchModuleContext, metadata: WorkbenchExtensionMetadata, commandId: string) => void;
1227
+ export declare const refreshWorkbenchExtensionRenderer: (workbench: WorkbenchModuleContext, target: RendererRefreshTarget, envelope?: FileRendererRefreshEnvelope) => void;
1094
1228
 
1095
1229
  declare interface RegisteredCommand extends RegisteredContributionMetadata {
1096
1230
  command: Command;
@@ -1153,7 +1287,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1153
1287
  ownedPanelMenuIds?: readonly string[];
1154
1288
  singleton: boolean;
1155
1289
  reuse: WidgetReusePolicy;
1156
- role: WorkbenchWidgetRole;
1157
1290
  } & RegisteredContributionMetadata;
1158
1291
 
1159
1292
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1194,9 +1327,9 @@ export declare interface RegisterWorkbenchExtensionContributionsInput {
1194
1327
  workbench: WorkbenchModuleContext;
1195
1328
  }
1196
1329
 
1197
- export declare const registerWorkbenchExtensionControlsRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionControlsRendererRecord[], panels: ControlsViewRecord[], adapter?: WorkbenchExtensionControlsAdapter) => Disposable_2;
1330
+ export declare const registerWorkbenchExtensionControlsRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionControlsRendererRecord[], panels: ControlsViewRecord[], adapter?: WorkbenchExtensionControlsAdapter, resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => Disposable_2;
1198
1331
 
1199
- export declare const registerWorkbenchExtensionDataTableRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionDataTableRendererRecord[], panels: DataTableViewRecord[]) => Disposable_2;
1332
+ export declare const registerWorkbenchExtensionDataTableRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionDataTableRendererRecord[], panels: DataTableViewRecord[], resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => Disposable_2;
1200
1333
 
1201
1334
  export declare const registerWorkbenchExtensionFileRenderers: (input: RegisterWorkbenchExtensionFileRenderersInput) => {
1202
1335
  dispose(): void;
@@ -1209,7 +1342,7 @@ export declare interface RegisterWorkbenchExtensionFileRenderersInput {
1209
1342
  workbench: WorkbenchModuleContext;
1210
1343
  }
1211
1344
 
1212
- export declare const registerWorkbenchExtensionKanbanRenderers: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionKanbanRendererRecord[], adapter?: WorkbenchExtensionKanbanRendererAdapter) => {
1345
+ export declare const registerWorkbenchExtensionKanbanRenderers: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionKanbanRendererRecord[], adapter?: WorkbenchExtensionKanbanRendererAdapter, panels?: WorkbenchExtensionMetadata["panels"], resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => {
1213
1346
  dispose(): void;
1214
1347
  };
1215
1348
 
@@ -1220,6 +1353,14 @@ export declare interface RegisterWorkbenchExtensionPanelInput {
1220
1353
  workbench: WorkbenchModuleContext;
1221
1354
  }
1222
1355
 
1356
+ export declare const registerWorkbenchExtensionRendererRefreshEvents: (input: RegisterWorkbenchExtensionRendererRefreshEventsInput) => Disposable_2;
1357
+
1358
+ export declare interface RegisterWorkbenchExtensionRendererRefreshEventsInput {
1359
+ metadata: WorkbenchExtensionMetadata;
1360
+ subscribe: (listener: (event: WorkbenchExtensionRefreshEvent) => void) => Disposable_2;
1361
+ workbench: WorkbenchModuleContext;
1362
+ }
1363
+
1223
1364
  export declare const registerWorkbenchExtensionTreeRenderers: (input: RegisterWorkbenchExtensionTreeRenderersInput) => {
1224
1365
  dispose(): void;
1225
1366
  };
@@ -1230,6 +1371,13 @@ export declare interface RegisterWorkbenchExtensionTreeRenderersInput {
1230
1371
  getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;
1231
1372
  metadata: WorkbenchExtensionMetadata;
1232
1373
  projectId: string;
1374
+ /**
1375
+ * Host canonicalization for node resources. A host that gives extension
1376
+ * resources its own URIs (layout scopes, history, and hierarchy key on the
1377
+ * URI) must convert tree node resources the same way, or the same resource
1378
+ * gets a second identity when opened from a tree.
1379
+ */
1380
+ resolveNodeResource?: (resource: ExtensionTreeResource) => ResourceRef;
1233
1381
  workbench: WorkbenchModuleContext;
1234
1382
  }
1235
1383
 
@@ -1243,6 +1391,47 @@ export declare const renderBridgeWebviewFrame: (input: {
1243
1391
  webview: BridgeWebviewConfig;
1244
1392
  }) => JSX.Element;
1245
1393
 
1394
+ declare interface RendererRefreshTarget {
1395
+ id: string;
1396
+ kind: WorkbenchExtensionRendererKind;
1397
+ }
1398
+
1399
+ declare interface ResolvedComposition {
1400
+ placements: readonly ResolvedCompositionPlacement[];
1401
+ regionOrder: Partial<Record<DockedCompositionRegion, readonly string[]>>;
1402
+ activePanelIds: Partial<Record<DockedCompositionRegion, string>>;
1403
+ addablePanels: readonly ResolvedCompositionAddablePanel_2[];
1404
+ diagnostics: readonly CompositionDiagnostic[];
1405
+ requiredFallback?: {
1406
+ panelId: string;
1407
+ };
1408
+ }
1409
+
1410
+ declare interface ResolvedCompositionAddablePanel {
1411
+ panelId: string;
1412
+ region: DockedCompositionRegion_2;
1413
+ allowedRegions: readonly DockedCompositionRegion_2[];
1414
+ pinned?: boolean;
1415
+ }
1416
+
1417
+ declare interface ResolvedCompositionAddablePanel_2 {
1418
+ panelId: string;
1419
+ region: DockedCompositionRegion;
1420
+ allowedRegions: readonly DockedCompositionRegion[];
1421
+ pinned?: boolean;
1422
+ }
1423
+
1424
+ declare interface ResolvedCompositionPlacement {
1425
+ panelId: string;
1426
+ region: DockedCompositionRegion;
1427
+ slot?: string;
1428
+ required: boolean;
1429
+ defaultOpen: boolean;
1430
+ pinned?: boolean;
1431
+ allowedRegions: readonly DockedCompositionRegion[];
1432
+ origin: "persisted" | "required" | "default";
1433
+ }
1434
+
1246
1435
  declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1247
1436
 
1248
1437
  declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
@@ -1267,6 +1456,14 @@ declare interface ResourceContextAction {
1267
1456
  separatorBefore?: boolean;
1268
1457
  }
1269
1458
 
1459
+ declare interface ResourceHierarchyCycle {
1460
+ code: typeof resourceHierarchyCycleCode;
1461
+ path: ResourceRef[];
1462
+ repeatedUri: string;
1463
+ }
1464
+
1465
+ declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1466
+
1270
1467
  declare interface ResourceHierarchyProvider {
1271
1468
  id: string;
1272
1469
  priority?: number;
@@ -1339,6 +1536,7 @@ declare interface ResourceRegistry {
1339
1536
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1340
1537
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1341
1538
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1539
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1342
1540
  isOpeningResource(): boolean;
1343
1541
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1344
1542
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1430,10 +1628,6 @@ declare interface SettingsSectionContribution {
1430
1628
  actions?: SettingsAction[];
1431
1629
  }
1432
1630
 
1433
- export declare const shouldRefreshWorkbenchExtensionDataTableRenderers: (metadata: WorkbenchExtensionMetadata, commandId: string) => boolean;
1434
-
1435
- export declare const shouldRefreshWorkbenchExtensionTrees: (metadata: WorkbenchExtensionMetadata, commandId: string) => boolean;
1436
-
1437
1631
  declare type SortDirection = "asc" | "desc";
1438
1632
 
1439
1633
  /**
@@ -1461,6 +1655,17 @@ declare interface ThemeRegistry {
1461
1655
  listThemes(): readonly ThemePreferenceOption[];
1462
1656
  }
1463
1657
 
1658
+ export declare const toPanelPlacements: (show: DeclaredPanelPlacement | readonly DeclaredPanelPlacement[] | undefined) => any[];
1659
+
1660
+ export declare const toWorkbenchCompositionPanelContribution: (input: {
1661
+ panel: ExtensionPanelRecord;
1662
+ rendererId: string;
1663
+ declarationIndex: number;
1664
+ menuDeclarationOffset: number;
1665
+ resourcePanels?: ExtensionResourcePanels;
1666
+ config?: WorkbenchPanelContribution["config"];
1667
+ }) => WorkbenchPanelContribution;
1668
+
1464
1669
  declare interface TreeAction {
1465
1670
  id: string;
1466
1671
  label?: string;
@@ -1607,6 +1812,7 @@ declare interface WidgetContribution {
1607
1812
  mountStrategy?: WidgetMountStrategy;
1608
1813
  closable?: boolean;
1609
1814
  hiddenByDefault?: boolean;
1815
+ subPanelsOnly?: boolean;
1610
1816
  regionSize?: WorkbenchRegionSize;
1611
1817
  regionCollapsible?: boolean;
1612
1818
  headerBorderBottom?: boolean;
@@ -1615,7 +1821,6 @@ declare interface WidgetContribution {
1615
1821
  priority?: number;
1616
1822
  rendererId: string;
1617
1823
  openCommandId?: string;
1618
- role?: WorkbenchWidgetRole;
1619
1824
  eligibleLocations?: WorkbenchLocationEligibility;
1620
1825
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1621
1826
  tab?: WorkbenchWidgetTab;
@@ -1715,6 +1920,35 @@ declare interface WorkbenchCommandParamsRequest {
1715
1920
  context?: WorkbenchCommandExecutionContext;
1716
1921
  }
1717
1922
 
1923
+ declare interface WorkbenchComposition {
1924
+ resourceKinds: readonly CompositionResourceKindDefinition[];
1925
+ panels: readonly CompositionPanelDefinition[];
1926
+ resourcePanels: readonly CompositionResourcePanelEdge[];
1927
+ }
1928
+
1929
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1930
+ contribution: RegisteredWidgetContribution;
1931
+ }
1932
+
1933
+ declare interface WorkbenchCompositionController {
1934
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1935
+ }
1936
+
1937
+ declare interface WorkbenchCompositionRegionPanels {
1938
+ open: readonly WorkbenchWidgetPlacement[];
1939
+ addable: readonly WorkbenchCompositionAddablePanel[];
1940
+ closable: readonly string[];
1941
+ }
1942
+
1943
+ export declare interface WorkbenchCompositionRegistry {
1944
+ registerResourceKind(definition: CompositionResourceKindDefinition): Disposable_2;
1945
+ registerPanelCapability(definition: CompositionPanelDefinition): Disposable_2;
1946
+ registerResourcePanel(edge: CompositionResourcePanelEdge): Disposable_2;
1947
+ registerModeComposition(definition: CompositionModeDefinition): Disposable_2;
1948
+ getComposition(): WorkbenchComposition;
1949
+ getModeComposition(modeId: string): CompositionModeDefinition | undefined;
1950
+ }
1951
+
1718
1952
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1719
1953
  host: WorkbenchHost;
1720
1954
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1726,6 +1960,7 @@ declare interface WorkbenchCoreContributionContext {
1726
1960
  commandPalette: WorkbenchCommandPaletteController;
1727
1961
  commandPaletteResources: CommandPaletteResourceRegistry;
1728
1962
  commands: CommandRegistry;
1963
+ composition: WorkbenchCompositionController;
1729
1964
  context: ContextKeyService;
1730
1965
  focus: WorkbenchFocusController;
1731
1966
  history: HistoryController;
@@ -1734,6 +1969,7 @@ declare interface WorkbenchCoreContributionContext {
1734
1969
  layout: WorkbenchLayoutModel;
1735
1970
  modes: WorkbenchModeRegistry;
1736
1971
  navigation: NavigationRegistry;
1972
+ navigator: WorkbenchNavigator;
1737
1973
  notifications: NotificationRegistry;
1738
1974
  panels: WorkbenchPanelsController;
1739
1975
  preferences: PreferenceRegistry;
@@ -1808,6 +2044,8 @@ export declare interface WorkbenchExtensionKanbanRendererAdapter {
1808
2044
  row: KanbanRendererRow_2;
1809
2045
  resource: ResourceRef | undefined;
1810
2046
  }) => void;
2047
+ /** Translate extension navigation resource targets into host resources. */
2048
+ resolveNavigationResource?: (record: WorkbenchExtensionKanbanRendererRecord, resource: NonNullable<CommandExecuteRequest["resource"]>) => ResourceRef;
1811
2049
  /** Called after a successful renderer-owned create form submission. */
1812
2050
  onAfterCreate?: (input: {
1813
2051
  record: WorkbenchExtensionKanbanRendererRecord;
@@ -1841,6 +2079,12 @@ export declare type WorkbenchExtensionMenuWhenBuilder = (contribution: Extension
1841
2079
 
1842
2080
  export { WorkbenchExtensionMetadata }
1843
2081
 
2082
+ declare interface WorkbenchExtensionRefreshEvent extends FileRendererRefreshEnvelope {
2083
+ id: string;
2084
+ }
2085
+
2086
+ export declare type WorkbenchExtensionRendererKind = "tree" | "file" | "controls" | "dataTable" | "kanban";
2087
+
1844
2088
  export declare type WorkbenchExtensionRoute = WorkbenchExtensionMetadata["routes"][number];
1845
2089
 
1846
2090
  export declare interface WorkbenchExtensionRouteResourceInput {
@@ -1904,7 +2148,7 @@ declare interface WorkbenchLayoutStoreState {
1904
2148
  placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1905
2149
  }
1906
2150
 
1907
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
2151
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1908
2152
 
1909
2153
  declare interface WorkbenchLocationEligibility {
1910
2154
  modeIds?: string[];
@@ -1926,15 +2170,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1926
2170
 
1927
2171
  declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1928
2172
 
2173
+ declare interface WorkbenchModeAddablePanel {
2174
+ panelId: string;
2175
+ region: WorkbenchPanelRegion;
2176
+ allowedRegions?: readonly WorkbenchRegion[];
2177
+ pinned?: boolean;
2178
+ }
2179
+
2180
+ declare interface WorkbenchModeAddablePanelContext {
2181
+ layout: WorkbenchLayout;
2182
+ resource?: ResourceRef;
2183
+ }
2184
+
1929
2185
  declare type WorkbenchModeChangeListener = () => void;
1930
2186
 
1931
2187
  declare interface WorkbenchModeContribution {
1932
2188
  id: string;
1933
2189
  label?: string;
1934
2190
  panels?: readonly WorkbenchPanelRegion[];
2191
+ resourceKinds?: readonly string[];
2192
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
2193
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1935
2194
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1936
2195
  seed?(ctx: WorkbenchModeActivationContext): void;
1937
2196
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
2197
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1938
2198
  }
1939
2199
 
1940
2200
  declare interface WorkbenchModeRegistry {
@@ -1970,6 +2230,14 @@ declare interface WorkbenchModuleContribution {
1970
2230
 
1971
2231
  declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1972
2232
 
2233
+ declare interface WorkbenchNavigationCommit {
2234
+ modeId: string | undefined;
2235
+ resource: ResourceRef | undefined;
2236
+ replaceActive: boolean;
2237
+ }
2238
+
2239
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
2240
+
1973
2241
  declare interface WorkbenchNavigationEntry {
1974
2242
  entryId: string;
1975
2243
  recordedAt: number;
@@ -1984,6 +2252,53 @@ declare interface WorkbenchNavigationEntry {
1984
2252
  closedSubPanel?: WorkbenchClosedSubPanel;
1985
2253
  }
1986
2254
 
2255
+ declare type WorkbenchNavigationResult = {
2256
+ ok: true;
2257
+ modeId: string | undefined;
2258
+ resource: ResourceRef | undefined;
2259
+ } | {
2260
+ ok: false;
2261
+ code: WorkbenchNavigationDiagnosticCode;
2262
+ message: string;
2263
+ };
2264
+
2265
+ declare interface WorkbenchNavigationTarget {
2266
+ modeId?: string;
2267
+ resource?: ResourceRef;
2268
+ replaceActive?: boolean;
2269
+ }
2270
+
2271
+ declare interface WorkbenchNavigator {
2272
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
2273
+ getSelectedResource(): ResourceRef | undefined;
2274
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
2275
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
2276
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
2277
+ forgetResource(uri: string): void;
2278
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
2279
+ dispose(): void;
2280
+ };
2281
+ }
2282
+
2283
+ declare interface WorkbenchNavigatorCommitInput {
2284
+ modeId?: string | null;
2285
+ resource?: ResourceRef | null;
2286
+ replaceActive?: boolean;
2287
+ present?: boolean;
2288
+ }
2289
+
2290
+ declare interface WorkbenchNavigatorHostHooks {
2291
+ getProjectId?(): string | undefined;
2292
+ getSelectedResource?(): ResourceRef | undefined;
2293
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
2294
+ applySelection?(resource: ResourceRef | undefined): void;
2295
+ applyScope?(commit: WorkbenchNavigationCommit): void;
2296
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
2297
+ presentResource?(resource: ResourceRef, input: {
2298
+ replaceActive: boolean;
2299
+ }): Promise<unknown> | unknown;
2300
+ }
2301
+
1987
2302
  declare interface WorkbenchNotification {
1988
2303
  id?: string;
1989
2304
  level: WorkbenchNotificationLevel;
@@ -2025,11 +2340,11 @@ declare interface WorkbenchPanelContribution {
2025
2340
  region: WorkbenchRegion;
2026
2341
  fallbackRegion?: WorkbenchRegion;
2027
2342
  rendererId: string;
2028
- closable: boolean;
2029
2343
  singleton?: boolean;
2030
2344
  reuse?: WorkbenchPanelReusePolicy;
2031
2345
  mountStrategy?: WorkbenchPanelMountStrategy;
2032
2346
  hiddenByDefault?: boolean;
2347
+ subPanelsOnly?: boolean;
2033
2348
  regionSize?: WorkbenchRegionSize;
2034
2349
  regionCollapsible?: boolean;
2035
2350
  headerBorderBottom?: boolean;
@@ -2080,7 +2395,7 @@ declare interface WorkbenchPanelInstance_2 {
2080
2395
  tab?: WorkbenchPanelTab_2;
2081
2396
  }
2082
2397
 
2083
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2398
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2084
2399
  region: WorkbenchPanelMenuRegion;
2085
2400
  fallbackRegion?: WorkbenchPanelMenuRegion;
2086
2401
  };
@@ -2138,13 +2453,14 @@ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
2138
2453
  declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
2139
2454
 
2140
2455
  declare type WorkbenchPanelOpenStrategy = {
2141
- kind: "activate-or-open";
2456
+ kind: "persistent";
2142
2457
  position?: WorkbenchTabPosition;
2143
2458
  } | {
2144
2459
  kind: "replace-active";
2145
2460
  } | {
2146
2461
  kind: "replace-panel";
2147
2462
  instanceId: string;
2463
+ retention?: WorkbenchTabRetention;
2148
2464
  } | {
2149
2465
  kind: "preview";
2150
2466
  position?: WorkbenchTabPosition;
@@ -2285,7 +2601,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
2285
2601
 
2286
2602
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
2287
2603
 
2288
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2604
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2289
2605
  region: WorkbenchPanelRegion;
2290
2606
  fallbackRegion?: WorkbenchPanelRegion;
2291
2607
  } & WorkbenchPanelMenusContribution;