@pstdio/workbench 0.5.0 → 0.7.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 (33) 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 +380 -29
  5. package/dist/extensions.js +1366 -883
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-B6_iR4EN.js +496 -0
  8. package/dist/file-renderer-view-B6_iR4EN.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 +305 -17
  12. package/dist/index.js +2343 -2083
  13. package/dist/index.js.map +1 -1
  14. package/dist/layout-types-DMoZz38-.js.map +1 -1
  15. package/dist/react.d.ts +190 -16
  16. package/dist/react.js +2473 -2374
  17. package/dist/react.js.map +1 -1
  18. package/dist/storage.js +132 -155
  19. package/dist/storage.js.map +1 -1
  20. package/dist/testing.d.ts +177 -14
  21. package/dist/webview-runtime.js +1 -1
  22. package/dist/webview-runtime.js.map +1 -1
  23. package/dist/workbench-built-ins-BncLJfQA.js +1175 -0
  24. package/dist/workbench-built-ins-BncLJfQA.js.map +1 -0
  25. package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
  26. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
  27. package/package.json +4 -4
  28. package/dist/context-key-service-B2K9LAec.js +0 -1034
  29. package/dist/context-key-service-B2K9LAec.js.map +0 -1
  30. package/dist/file-renderer-view-DrrhYnb_.js +0 -171
  31. package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
  32. package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
  33. 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';
@@ -141,6 +142,7 @@ declare interface Command {
141
142
  }
142
143
 
143
144
  declare interface CommandHandler<TArgs = unknown, TResult = unknown> {
145
+ prepareArgs?(args: TArgs, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: TArgs) => void): TArgs | Promise<TArgs>;
144
146
  execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;
145
147
  isEnabled?(args: TArgs): boolean;
146
148
  isVisible?(args: TArgs): boolean;
@@ -197,6 +199,8 @@ declare interface CommandParamDescriptor {
197
199
  options?: CommandParamOption[];
198
200
  templateType?: string;
199
201
  resourceType?: string;
202
+ accept?: string;
203
+ multiple?: boolean;
200
204
  metadata?: Record<string, unknown>;
201
205
  }
202
206
 
@@ -216,6 +220,7 @@ declare interface CommandRegistry {
216
220
  isCommandEnabled(id: string, args?: unknown): boolean;
217
221
  isCommandVisible(id: string, args?: unknown): boolean;
218
222
  isCommandToggled(id: string, args?: unknown): boolean;
223
+ prepareCommandArgs(id: string, args: unknown, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: unknown) => void): Promise<unknown>;
219
224
  executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;
220
225
  onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable_2;
221
226
  }
@@ -224,6 +229,72 @@ declare interface CommandRegistryStoreState {
224
229
  commands: Record<string, RegisteredCommand>;
225
230
  }
226
231
 
232
+ declare interface CompositionDiagnostic {
233
+ 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";
234
+ message: string;
235
+ panelId?: string;
236
+ slot?: string;
237
+ }
238
+
239
+ declare interface CompositionModeDefinition {
240
+ id: string;
241
+ extensionId?: string;
242
+ resources?: Record<string, CompositionModeRecipe>;
243
+ modePanels?: Record<string, CompositionPlacementPolicy>;
244
+ }
245
+
246
+ declare interface CompositionModeRecipe {
247
+ slots?: Record<string, CompositionPlacementPolicy>;
248
+ panels?: Record<string, CompositionPlacementPolicy>;
249
+ }
250
+
251
+ declare interface CompositionPanelDefinition {
252
+ id: string;
253
+ extensionId: string;
254
+ title: string;
255
+ icon?: string;
256
+ show?: CompositionPanelPlacement | readonly CompositionPanelPlacement[];
257
+ }
258
+
259
+ declare interface CompositionPanelPlacement extends CompositionPlacementPolicy {
260
+ resourceKind?: string;
261
+ }
262
+
263
+ declare interface CompositionPlacementPolicy {
264
+ region: DockedCompositionRegion;
265
+ allowedRegions?: readonly DockedCompositionRegion[];
266
+ required?: boolean;
267
+ defaultOpen?: boolean;
268
+ pinned?: boolean;
269
+ }
270
+
271
+ declare interface CompositionReconcileContext {
272
+ layout: LayoutModel;
273
+ notifications: NotificationRegistry;
274
+ }
275
+
276
+ export declare const compositionRequiredNotificationId: (modeId: string) => string;
277
+
278
+ declare interface CompositionResourceKindDefinition {
279
+ id: string;
280
+ extensionId: string;
281
+ surface: "primary" | "secondary" | "attached";
282
+ slots: Record<string, CompositionSlotDefinition>;
283
+ }
284
+
285
+ declare interface CompositionResourcePanelEdge {
286
+ id: string;
287
+ extensionId: string;
288
+ resourceKind: string;
289
+ panel: string;
290
+ slot: string;
291
+ }
292
+
293
+ declare interface CompositionSlotDefinition {
294
+ cardinality: "one" | "many";
295
+ external: boolean;
296
+ }
297
+
227
298
  declare interface ContextKeyScope extends Disposable_2 {
228
299
  ownerId: string;
229
300
  set(key: string, value: ContextKeyValue): void;
@@ -366,6 +437,8 @@ declare interface CreateTerminalSessionCapabilityInput {
366
437
  hostEvents: HostEventPublisher;
367
438
  }
368
439
 
440
+ export declare const createWorkbenchCompositionRegistry: () => WorkbenchCompositionRegistry;
441
+
369
442
  export declare const createWorkbenchWebviewHostCapabilities: (input: CreateWorkbenchWebviewHostCapabilitiesInput) => {
370
443
  "terminal.session"?: HostCapability | undefined;
371
444
  "commands.execute": (params: unknown) => Promise<unknown>;
@@ -445,7 +518,7 @@ declare interface DataTableRendererContribution {
445
518
  emptyDescription?: string;
446
519
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
447
520
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
448
- onRowClick?: (row: DataTableRendererRow) => void;
521
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
449
522
  }
450
523
 
451
524
  declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -513,10 +586,27 @@ declare interface DataTableRendererThemeColor {
513
586
 
514
587
  declare type DataTableViewRecord = WorkbenchExtensionMetadata["panels"][number];
515
588
 
589
+ declare interface DeclaredPanelPlacement {
590
+ for?: string;
591
+ region: DockedCompositionRegion;
592
+ allowedRegions?: readonly DockedCompositionRegion[];
593
+ required?: boolean;
594
+ defaultOpen?: boolean;
595
+ pinned?: boolean;
596
+ }
597
+
516
598
  declare interface Disposable_2 {
517
599
  dispose(): void;
518
600
  }
519
601
 
602
+ declare type DockedCompositionRegion = (typeof dockedCompositionRegions)[number];
603
+
604
+ declare type DockedCompositionRegion_2 = (typeof dockedCompositionRegions_2)[number];
605
+
606
+ declare const dockedCompositionRegions: readonly ["sidenav", "main", "secondary", "side"];
607
+
608
+ declare const dockedCompositionRegions_2: readonly ["sidenav", "main", "secondary", "side"];
609
+
520
610
  export declare const emptyWorkbenchExtensionMetadata: WorkbenchExtensionMetadata;
521
611
 
522
612
  declare interface EnumOption {
@@ -538,10 +628,19 @@ declare interface EnumOptionsSource {
538
628
  getSnapshot: () => EnumOption[];
539
629
  }
540
630
 
541
- declare type ExtensionPanelPlacement = NonNullable<WorkbenchExtensionMetadata["panels"][number]["placement"]>;
631
+ declare type ExtensionPanelRecord = WorkbenchExtensionMetadata["panels"][number];
632
+
633
+ declare type ExtensionResourcePanels = WorkbenchExtensionMetadata["resourcePanels"];
542
634
 
543
635
  declare type ExtensionTreeRendererRecord = NonNullable<WorkbenchExtensionMetadata["treeRenderers"]>[number];
544
636
 
637
+ declare interface ExtensionTreeResource {
638
+ type: string;
639
+ id: string;
640
+ label?: string;
641
+ metadata?: Record<string, unknown>;
642
+ }
643
+
545
644
  declare type ExtensionTreeViewRecord = WorkbenchExtensionMetadata["panels"][number] | NonNullable<WorkbenchExtensionMetadata["panels"][number]["panelMenus"]>[number];
546
645
 
547
646
  export declare interface ExtensionWebviewFileCapabilities {
@@ -586,10 +685,23 @@ declare interface FileIconThemeRegistry {
586
685
 
587
686
  declare interface FileRendererContent {
588
687
  fileName?: string;
688
+ /** Workspace-relative path shown above the file preview. */
689
+ filePath?: string;
589
690
  mimeType?: string;
590
691
  content?: string;
591
692
  dataUrl?: string;
592
693
  placeholder?: string;
694
+ /** Override contribution-level save support for one loaded file. */
695
+ editable?: boolean;
696
+ /** Request Monaco for text that automatic dispatch would open as markdown. */
697
+ textRenderer?: "automatic" | "monaco";
698
+ /** Represent a deliberate no-file selection without an editable blank document. */
699
+ emptyState?: {
700
+ title: string;
701
+ description?: string;
702
+ };
703
+ /** Ordered backing-store revision when one is available. */
704
+ revision?: string;
593
705
  }
594
706
 
595
707
  declare interface FileRendererContribution {
@@ -599,35 +711,55 @@ declare interface FileRendererContribution {
599
711
  /** Resolve the file's content (and identity) for the bound resource. */
600
712
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
601
713
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
602
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
714
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
603
715
  }
604
716
 
605
717
  declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
606
718
  fileRendererId: string;
607
719
  }) => unknown;
608
720
 
609
- declare interface FileRendererRefreshEvent {
721
+ declare interface FileRendererRefreshEnvelope {
722
+ resourceUri?: string;
723
+ origin?: FileRendererRefreshOrigin;
724
+ revision?: string;
725
+ }
726
+
727
+ export declare const fileRendererRefreshEnvelopeFromCommand: (body: CommandExecuteRequest, response: CommandExecuteResponse) => FileRendererRefreshEnvelope | undefined;
728
+
729
+ declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
610
730
  fileRendererId: string;
611
731
  }
612
732
 
613
733
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
614
734
 
735
+ declare interface FileRendererRefreshOrigin {
736
+ rendererId: string;
737
+ instanceId: string;
738
+ operationId: string;
739
+ }
740
+
615
741
  declare interface FileRendererRegistry {
616
742
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
617
743
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
618
744
  setFileRendererImplementation(impl: FileRendererImplementation): void;
619
745
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
620
746
  listFileRenderers(): RegisteredFileRendererContribution[];
621
- refreshFileRenderer(id: string): void;
747
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
622
748
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
623
749
  }
624
750
 
751
+ declare interface FileRendererSaveResult {
752
+ revision?: string;
753
+ }
754
+
625
755
  declare interface FileRendererStoreState {
626
756
  renderers: Record<string, RegisteredFileRendererContribution>;
627
757
  }
628
758
 
629
759
  declare interface HistoryController {
630
760
  store: WorkbenchStore<HistoryStoreState>;
761
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
762
+ createCheckpoint(): () => void;
631
763
  goBack(): HistoryEntry | undefined;
632
764
  goForward(): HistoryEntry | undefined;
633
765
  goPrevious(): HistoryEntry | undefined;
@@ -661,6 +793,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
661
793
  id: string;
662
794
  title: string;
663
795
  resourceKind?: string;
796
+ /** Host-owned scope for persisted display settings. */
797
+ storageScope?: string;
664
798
  /**
665
799
  * Declarative attribute schema. The renderer dispatches filter / group /
666
800
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -688,8 +822,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
688
822
  */
689
823
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
690
824
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
691
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
692
- onRowClick?: (row: TRow) => void;
825
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
826
+ onRowActivate?: (row: TRow) => Promise<void> | void;
693
827
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
694
828
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
695
829
  /**
@@ -783,7 +917,7 @@ declare interface KanbanRendererRow {
783
917
  title: string;
784
918
  /**
785
919
  * Optional navigation handle. When set, the renderer's default click handler
786
- * routes through the contribution's onRowClick (which typically opens the
920
+ * routes through the contribution's onRowActivate (which typically opens the
787
921
  * resource via the workbench).
788
922
  */
789
923
  resource?: unknown;
@@ -890,6 +1024,16 @@ declare interface LayoutModel {
890
1024
  carryRegionState?: readonly WorkbenchRegion[];
891
1025
  }): void;
892
1026
  getPersistenceScope(): LayoutScope | undefined;
1027
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
1028
+ /** Whether anything is stored for the active scope right now. */
1029
+ hasPersistedLayout(): boolean;
1030
+ /**
1031
+ * Whether the active scope was entered with a layout the user already had. Unlike
1032
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
1033
+ */
1034
+ enteredWithPersistedLayout(): boolean;
1035
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
1036
+ reconcilePanelMenus(): void;
893
1037
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
894
1038
  dispose(): void;
895
1039
  };
@@ -900,6 +1044,13 @@ declare interface LayoutModel {
900
1044
 
901
1045
  declare type LayoutScope = string;
902
1046
 
1047
+ export declare const listCompositionAddablePanels: (input: {
1048
+ registry: WorkbenchCompositionRegistry;
1049
+ modeId: string;
1050
+ layout: ReturnType<LayoutModel["getLayout"]>;
1051
+ resourceKind?: string;
1052
+ }) => readonly ResolvedCompositionAddablePanel[];
1053
+
903
1054
  declare type Localizer = (value: unknown, fallback?: string) => string;
904
1055
 
905
1056
  declare const MANUAL_ORDERING = "manual";
@@ -1004,6 +1155,7 @@ declare interface OpenWidgetInput {
1004
1155
  resource?: ResourceRef;
1005
1156
  title?: string;
1006
1157
  region?: WorkbenchRegion;
1158
+ role?: WorkbenchWidgetRole;
1007
1159
  ownerId?: string;
1008
1160
  source?: ContributionSource;
1009
1161
  pinned?: boolean;
@@ -1021,7 +1173,9 @@ declare interface OpenWorkbenchPanelInput {
1021
1173
  resource?: ResourceRef;
1022
1174
  title?: string;
1023
1175
  region?: WorkbenchRegion;
1176
+ role?: WorkbenchWidgetRole;
1024
1177
  pinned?: boolean;
1178
+ closable?: boolean;
1025
1179
  mountStrategy?: WorkbenchPanelMountStrategy;
1026
1180
  hiddenByDefault?: boolean;
1027
1181
  tab?: WorkbenchPanelTab;
@@ -1076,9 +1230,16 @@ declare interface PreferenceScopeRef {
1076
1230
 
1077
1231
  declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
1078
1232
 
1233
+ export declare const reconcileCompositionLayout: (ctx: CompositionReconcileContext, input: {
1234
+ registry: WorkbenchCompositionRegistry;
1235
+ modeId: string;
1236
+ resourceKind?: string;
1237
+ seeding?: boolean;
1238
+ }) => ResolvedComposition | undefined;
1239
+
1079
1240
  export declare const refreshOpenWorkbenchExtensionWebviews: (workbench: WorkbenchModuleContext, metadata: WorkbenchExtensionMetadata) => void;
1080
1241
 
1081
- export declare const refreshWorkbenchExtensionContributions: (workbench: WorkbenchModuleContext, metadata: WorkbenchExtensionMetadata, commandId: string) => void;
1242
+ export declare const refreshWorkbenchExtensionRenderer: (workbench: WorkbenchModuleContext, target: RendererRefreshTarget, envelope?: FileRendererRefreshEnvelope) => void;
1082
1243
 
1083
1244
  declare interface RegisteredCommand extends RegisteredContributionMetadata {
1084
1245
  command: Command;
@@ -1141,7 +1302,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1141
1302
  ownedPanelMenuIds?: readonly string[];
1142
1303
  singleton: boolean;
1143
1304
  reuse: WidgetReusePolicy;
1144
- role: WorkbenchWidgetRole;
1145
1305
  } & RegisteredContributionMetadata;
1146
1306
 
1147
1307
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1182,9 +1342,9 @@ export declare interface RegisterWorkbenchExtensionContributionsInput {
1182
1342
  workbench: WorkbenchModuleContext;
1183
1343
  }
1184
1344
 
1185
- export declare const registerWorkbenchExtensionControlsRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionControlsRendererRecord[], panels: ControlsViewRecord[], adapter?: WorkbenchExtensionControlsAdapter) => Disposable_2;
1345
+ export declare const registerWorkbenchExtensionControlsRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionControlsRendererRecord[], panels: ControlsViewRecord[], adapter?: WorkbenchExtensionControlsAdapter, resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => Disposable_2;
1186
1346
 
1187
- export declare const registerWorkbenchExtensionDataTableRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionDataTableRendererRecord[], panels: DataTableViewRecord[]) => Disposable_2;
1347
+ export declare const registerWorkbenchExtensionDataTableRenderers: (context: WorkbenchExtensionCommandContext, records: WorkbenchExtensionDataTableRendererRecord[], panels: DataTableViewRecord[], resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => Disposable_2;
1188
1348
 
1189
1349
  export declare const registerWorkbenchExtensionFileRenderers: (input: RegisterWorkbenchExtensionFileRenderersInput) => {
1190
1350
  dispose(): void;
@@ -1197,7 +1357,7 @@ export declare interface RegisterWorkbenchExtensionFileRenderersInput {
1197
1357
  workbench: WorkbenchModuleContext;
1198
1358
  }
1199
1359
 
1200
- export declare const registerWorkbenchExtensionKanbanRenderers: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionKanbanRendererRecord[], adapter?: WorkbenchExtensionKanbanRendererAdapter) => {
1360
+ export declare const registerWorkbenchExtensionKanbanRenderers: (context: WorkbenchExtensionCommandContext, records: readonly WorkbenchExtensionKanbanRendererRecord[], adapter?: WorkbenchExtensionKanbanRendererAdapter, panels?: WorkbenchExtensionMetadata["panels"], resourcePanels?: WorkbenchExtensionMetadata["resourcePanels"]) => {
1201
1361
  dispose(): void;
1202
1362
  };
1203
1363
 
@@ -1208,6 +1368,14 @@ export declare interface RegisterWorkbenchExtensionPanelInput {
1208
1368
  workbench: WorkbenchModuleContext;
1209
1369
  }
1210
1370
 
1371
+ export declare const registerWorkbenchExtensionRendererRefreshEvents: (input: RegisterWorkbenchExtensionRendererRefreshEventsInput) => Disposable_2;
1372
+
1373
+ export declare interface RegisterWorkbenchExtensionRendererRefreshEventsInput {
1374
+ metadata: WorkbenchExtensionMetadata;
1375
+ subscribe: (listener: (event: WorkbenchExtensionRefreshEvent) => void) => Disposable_2;
1376
+ workbench: WorkbenchModuleContext;
1377
+ }
1378
+
1211
1379
  export declare const registerWorkbenchExtensionTreeRenderers: (input: RegisterWorkbenchExtensionTreeRenderersInput) => {
1212
1380
  dispose(): void;
1213
1381
  };
@@ -1218,6 +1386,13 @@ export declare interface RegisterWorkbenchExtensionTreeRenderersInput {
1218
1386
  getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;
1219
1387
  metadata: WorkbenchExtensionMetadata;
1220
1388
  projectId: string;
1389
+ /**
1390
+ * Host canonicalization for node resources. A host that gives extension
1391
+ * resources its own URIs (layout scopes, history, and hierarchy key on the
1392
+ * URI) must convert tree node resources the same way, or the same resource
1393
+ * gets a second identity when opened from a tree.
1394
+ */
1395
+ resolveNodeResource?: (resource: ExtensionTreeResource) => ResourceRef;
1221
1396
  workbench: WorkbenchModuleContext;
1222
1397
  }
1223
1398
 
@@ -1231,9 +1406,52 @@ export declare const renderBridgeWebviewFrame: (input: {
1231
1406
  webview: BridgeWebviewConfig;
1232
1407
  }) => JSX.Element;
1233
1408
 
1409
+ declare interface RendererRefreshTarget {
1410
+ id: string;
1411
+ kind: WorkbenchExtensionRendererKind;
1412
+ }
1413
+
1414
+ declare interface ResolvedComposition {
1415
+ placements: readonly ResolvedCompositionPlacement[];
1416
+ regionOrder: Partial<Record<DockedCompositionRegion, readonly string[]>>;
1417
+ activePanelIds: Partial<Record<DockedCompositionRegion, string>>;
1418
+ addablePanels: readonly ResolvedCompositionAddablePanel_2[];
1419
+ diagnostics: readonly CompositionDiagnostic[];
1420
+ requiredFallback?: {
1421
+ panelId: string;
1422
+ };
1423
+ }
1424
+
1425
+ declare interface ResolvedCompositionAddablePanel {
1426
+ panelId: string;
1427
+ region: DockedCompositionRegion_2;
1428
+ allowedRegions: readonly DockedCompositionRegion_2[];
1429
+ pinned?: boolean;
1430
+ }
1431
+
1432
+ declare interface ResolvedCompositionAddablePanel_2 {
1433
+ panelId: string;
1434
+ region: DockedCompositionRegion;
1435
+ allowedRegions: readonly DockedCompositionRegion[];
1436
+ pinned?: boolean;
1437
+ }
1438
+
1439
+ declare interface ResolvedCompositionPlacement {
1440
+ panelId: string;
1441
+ region: DockedCompositionRegion;
1442
+ slot?: string;
1443
+ required: boolean;
1444
+ defaultOpen: boolean;
1445
+ pinned?: boolean;
1446
+ allowedRegions: readonly DockedCompositionRegion[];
1447
+ origin: "persisted" | "required" | "default";
1448
+ }
1449
+
1234
1450
  declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1235
1451
 
1236
- declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
1452
+ declare type ResolvedResourcePresenter = Omit<ResourcePresenter, "priority"> & {
1453
+ priority: number;
1454
+ };
1237
1455
 
1238
1456
  declare interface ResourceBrowseEntry {
1239
1457
  resource: ResourceRef;
@@ -1255,6 +1473,14 @@ declare interface ResourceContextAction {
1255
1473
  separatorBefore?: boolean;
1256
1474
  }
1257
1475
 
1476
+ declare interface ResourceHierarchyCycle {
1477
+ code: typeof resourceHierarchyCycleCode;
1478
+ path: ResourceRef[];
1479
+ repeatedUri: string;
1480
+ }
1481
+
1482
+ declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1483
+
1258
1484
  declare interface ResourceHierarchyProvider {
1259
1485
  id: string;
1260
1486
  priority?: number;
@@ -1287,6 +1513,7 @@ declare interface ResourcePresenter {
1287
1513
  priority?: number;
1288
1514
  canOpen(resource: ResourceRef): boolean;
1289
1515
  open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;
1516
+ afterOpen?(resource: ResourceRef, instance: WorkbenchPanelInstance, input: OpenResourceInput): void;
1290
1517
  }
1291
1518
 
1292
1519
  declare interface ResourceProvider {
@@ -1327,6 +1554,7 @@ declare interface ResourceRegistry {
1327
1554
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1328
1555
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1329
1556
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1557
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1330
1558
  isOpeningResource(): boolean;
1331
1559
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1332
1560
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1418,10 +1646,6 @@ declare interface SettingsSectionContribution {
1418
1646
  actions?: SettingsAction[];
1419
1647
  }
1420
1648
 
1421
- export declare const shouldRefreshWorkbenchExtensionDataTableRenderers: (metadata: WorkbenchExtensionMetadata, commandId: string) => boolean;
1422
-
1423
- export declare const shouldRefreshWorkbenchExtensionTrees: (metadata: WorkbenchExtensionMetadata, commandId: string) => boolean;
1424
-
1425
1649
  declare type SortDirection = "asc" | "desc";
1426
1650
 
1427
1651
  /**
@@ -1449,9 +1673,16 @@ declare interface ThemeRegistry {
1449
1673
  listThemes(): readonly ThemePreferenceOption[];
1450
1674
  }
1451
1675
 
1452
- export declare const toWorkbenchExtensionPlacementMetadata: (input: WorkbenchExtensionPlacementInput) => {
1453
- priority: number;
1454
- };
1676
+ export declare const toPanelPlacements: (show: DeclaredPanelPlacement | readonly DeclaredPanelPlacement[] | undefined) => any[];
1677
+
1678
+ export declare const toWorkbenchCompositionPanelContribution: (input: {
1679
+ panel: ExtensionPanelRecord;
1680
+ rendererId: string;
1681
+ declarationIndex: number;
1682
+ menuDeclarationOffset: number;
1683
+ resourcePanels?: ExtensionResourcePanels;
1684
+ config?: WorkbenchPanelContribution["config"];
1685
+ }) => WorkbenchPanelContribution;
1455
1686
 
1456
1687
  declare interface TreeAction {
1457
1688
  id: string;
@@ -1486,11 +1717,13 @@ declare interface TreeNode {
1486
1717
  target?: NavigationTarget;
1487
1718
  /** Visual row variant for non-data rows such as placeholders. */
1488
1719
  rowVariant?: TreeNodeRowVariant;
1720
+ inlineInput?: TreeNodeInlineInput;
1489
1721
  actions?: TreeAction[];
1490
1722
  contextMenuActions?: TreeAction[];
1491
1723
  contextMenuPath?: MenuPath;
1492
1724
  menuPath?: MenuPath;
1493
1725
  menuPlacement?: "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "left-start";
1726
+ showContextMenuTrigger?: boolean;
1494
1727
  collapsible?: boolean;
1495
1728
  disabled?: boolean;
1496
1729
  children?: TreeNode[];
@@ -1501,6 +1734,18 @@ declare interface TreeNode {
1501
1734
  canHide?: boolean;
1502
1735
  /** When false, the node stays fixed within its Sidenav group. */
1503
1736
  canReorder?: boolean;
1737
+ /** Allow this node to be moved to another tree location. */
1738
+ canDrag?: boolean;
1739
+ /** Allow movable nodes to be dropped on this node. */
1740
+ canDrop?: boolean;
1741
+ }
1742
+
1743
+ declare interface TreeNodeInlineInput {
1744
+ ariaLabel: string;
1745
+ defaultValue?: string;
1746
+ placeholder?: string;
1747
+ onCommit(value: string): Promise<void> | void;
1748
+ onCancel?(): void;
1504
1749
  }
1505
1750
 
1506
1751
  declare type TreeNodeRowVariant = "empty-state";
@@ -1509,6 +1754,8 @@ declare interface TreeRendererContribution {
1509
1754
  id: string;
1510
1755
  title: string;
1511
1756
  icon?: string;
1757
+ searchable?: boolean;
1758
+ searchPlaceholder?: string;
1512
1759
  when?: string;
1513
1760
  defaultExpandedSectionIds?: string[];
1514
1761
  defaultExpandedNodeIds?: string[];
@@ -1516,6 +1763,7 @@ declare interface TreeRendererContribution {
1516
1763
  getHeader?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1517
1764
  getFooter?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1518
1765
  getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1766
+ moveNode?(source: TreeNode, target: TreeNode | undefined, ctx: TreeContext): Promise<void> | void;
1519
1767
  }
1520
1768
 
1521
1769
  declare type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -1608,7 +1856,6 @@ declare interface WidgetContribution {
1608
1856
  priority?: number;
1609
1857
  rendererId: string;
1610
1858
  openCommandId?: string;
1611
- role?: WorkbenchWidgetRole;
1612
1859
  eligibleLocations?: WorkbenchLocationEligibility;
1613
1860
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1614
1861
  tab?: WorkbenchWidgetTab;
@@ -1708,6 +1955,35 @@ declare interface WorkbenchCommandParamsRequest {
1708
1955
  context?: WorkbenchCommandExecutionContext;
1709
1956
  }
1710
1957
 
1958
+ declare interface WorkbenchComposition {
1959
+ resourceKinds: readonly CompositionResourceKindDefinition[];
1960
+ panels: readonly CompositionPanelDefinition[];
1961
+ resourcePanels: readonly CompositionResourcePanelEdge[];
1962
+ }
1963
+
1964
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1965
+ contribution: RegisteredWidgetContribution;
1966
+ }
1967
+
1968
+ declare interface WorkbenchCompositionController {
1969
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1970
+ }
1971
+
1972
+ declare interface WorkbenchCompositionRegionPanels {
1973
+ open: readonly WorkbenchWidgetPlacement[];
1974
+ addable: readonly WorkbenchCompositionAddablePanel[];
1975
+ closable: readonly string[];
1976
+ }
1977
+
1978
+ export declare interface WorkbenchCompositionRegistry {
1979
+ registerResourceKind(definition: CompositionResourceKindDefinition): Disposable_2;
1980
+ registerPanelCapability(definition: CompositionPanelDefinition): Disposable_2;
1981
+ registerResourcePanel(edge: CompositionResourcePanelEdge): Disposable_2;
1982
+ registerModeComposition(definition: CompositionModeDefinition): Disposable_2;
1983
+ getComposition(): WorkbenchComposition;
1984
+ getModeComposition(modeId: string): CompositionModeDefinition | undefined;
1985
+ }
1986
+
1711
1987
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1712
1988
  host: WorkbenchHost;
1713
1989
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1719,6 +1995,7 @@ declare interface WorkbenchCoreContributionContext {
1719
1995
  commandPalette: WorkbenchCommandPaletteController;
1720
1996
  commandPaletteResources: CommandPaletteResourceRegistry;
1721
1997
  commands: CommandRegistry;
1998
+ composition: WorkbenchCompositionController;
1722
1999
  context: ContextKeyService;
1723
2000
  focus: WorkbenchFocusController;
1724
2001
  history: HistoryController;
@@ -1727,6 +2004,7 @@ declare interface WorkbenchCoreContributionContext {
1727
2004
  layout: WorkbenchLayoutModel;
1728
2005
  modes: WorkbenchModeRegistry;
1729
2006
  navigation: NavigationRegistry;
2007
+ navigator: WorkbenchNavigator;
1730
2008
  notifications: NotificationRegistry;
1731
2009
  panels: WorkbenchPanelsController;
1732
2010
  preferences: PreferenceRegistry;
@@ -1801,6 +2079,8 @@ export declare interface WorkbenchExtensionKanbanRendererAdapter {
1801
2079
  row: KanbanRendererRow_2;
1802
2080
  resource: ResourceRef | undefined;
1803
2081
  }) => void;
2082
+ /** Translate extension navigation resource targets into host resources. */
2083
+ resolveNavigationResource?: (record: WorkbenchExtensionKanbanRendererRecord, resource: NonNullable<CommandExecuteRequest["resource"]>) => ResourceRef;
1804
2084
  /** Called after a successful renderer-owned create form submission. */
1805
2085
  onAfterCreate?: (input: {
1806
2086
  record: WorkbenchExtensionKanbanRendererRecord;
@@ -1834,11 +2114,12 @@ export declare type WorkbenchExtensionMenuWhenBuilder = (contribution: Extension
1834
2114
 
1835
2115
  export { WorkbenchExtensionMetadata }
1836
2116
 
1837
- declare interface WorkbenchExtensionPlacementInput {
1838
- placement?: ExtensionPanelPlacement;
1839
- declarationIndex?: number;
2117
+ declare interface WorkbenchExtensionRefreshEvent extends FileRendererRefreshEnvelope {
2118
+ id: string;
1840
2119
  }
1841
2120
 
2121
+ export declare type WorkbenchExtensionRendererKind = "tree" | "file" | "controls" | "dataTable" | "kanban";
2122
+
1842
2123
  export declare type WorkbenchExtensionRoute = WorkbenchExtensionMetadata["routes"][number];
1843
2124
 
1844
2125
  export declare interface WorkbenchExtensionRouteResourceInput {
@@ -1902,7 +2183,7 @@ declare interface WorkbenchLayoutStoreState {
1902
2183
  placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1903
2184
  }
1904
2185
 
1905
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
2186
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1906
2187
 
1907
2188
  declare interface WorkbenchLocationEligibility {
1908
2189
  modeIds?: string[];
@@ -1924,15 +2205,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1924
2205
 
1925
2206
  declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1926
2207
 
2208
+ declare interface WorkbenchModeAddablePanel {
2209
+ panelId: string;
2210
+ region: WorkbenchPanelRegion;
2211
+ allowedRegions?: readonly WorkbenchRegion[];
2212
+ pinned?: boolean;
2213
+ }
2214
+
2215
+ declare interface WorkbenchModeAddablePanelContext {
2216
+ layout: WorkbenchLayout;
2217
+ resource?: ResourceRef;
2218
+ }
2219
+
1927
2220
  declare type WorkbenchModeChangeListener = () => void;
1928
2221
 
1929
2222
  declare interface WorkbenchModeContribution {
1930
2223
  id: string;
1931
2224
  label?: string;
1932
2225
  panels?: readonly WorkbenchPanelRegion[];
2226
+ resourceKinds?: readonly string[];
2227
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
2228
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1933
2229
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1934
2230
  seed?(ctx: WorkbenchModeActivationContext): void;
1935
2231
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
2232
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1936
2233
  }
1937
2234
 
1938
2235
  declare interface WorkbenchModeRegistry {
@@ -1968,6 +2265,14 @@ declare interface WorkbenchModuleContribution {
1968
2265
 
1969
2266
  declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1970
2267
 
2268
+ declare interface WorkbenchNavigationCommit {
2269
+ modeId: string | undefined;
2270
+ resource: ResourceRef | undefined;
2271
+ replaceActive: boolean;
2272
+ }
2273
+
2274
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
2275
+
1971
2276
  declare interface WorkbenchNavigationEntry {
1972
2277
  entryId: string;
1973
2278
  recordedAt: number;
@@ -1982,6 +2287,53 @@ declare interface WorkbenchNavigationEntry {
1982
2287
  closedSubPanel?: WorkbenchClosedSubPanel;
1983
2288
  }
1984
2289
 
2290
+ declare type WorkbenchNavigationResult = {
2291
+ ok: true;
2292
+ modeId: string | undefined;
2293
+ resource: ResourceRef | undefined;
2294
+ } | {
2295
+ ok: false;
2296
+ code: WorkbenchNavigationDiagnosticCode;
2297
+ message: string;
2298
+ };
2299
+
2300
+ declare interface WorkbenchNavigationTarget {
2301
+ modeId?: string;
2302
+ resource?: ResourceRef;
2303
+ replaceActive?: boolean;
2304
+ }
2305
+
2306
+ declare interface WorkbenchNavigator {
2307
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
2308
+ getSelectedResource(): ResourceRef | undefined;
2309
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
2310
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
2311
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
2312
+ forgetResource(uri: string): void;
2313
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
2314
+ dispose(): void;
2315
+ };
2316
+ }
2317
+
2318
+ declare interface WorkbenchNavigatorCommitInput {
2319
+ modeId?: string | null;
2320
+ resource?: ResourceRef | null;
2321
+ replaceActive?: boolean;
2322
+ present?: boolean;
2323
+ }
2324
+
2325
+ declare interface WorkbenchNavigatorHostHooks {
2326
+ getProjectId?(): string | undefined;
2327
+ getSelectedResource?(): ResourceRef | undefined;
2328
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
2329
+ applySelection?(resource: ResourceRef | undefined): void;
2330
+ applyScope?(commit: WorkbenchNavigationCommit): void;
2331
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
2332
+ presentResource?(resource: ResourceRef, input: {
2333
+ replaceActive: boolean;
2334
+ }): Promise<unknown> | unknown;
2335
+ }
2336
+
1985
2337
  declare interface WorkbenchNotification {
1986
2338
  id?: string;
1987
2339
  level: WorkbenchNotificationLevel;
@@ -2023,7 +2375,6 @@ declare interface WorkbenchPanelContribution {
2023
2375
  region: WorkbenchRegion;
2024
2376
  fallbackRegion?: WorkbenchRegion;
2025
2377
  rendererId: string;
2026
- closable: boolean;
2027
2378
  singleton?: boolean;
2028
2379
  reuse?: WorkbenchPanelReusePolicy;
2029
2380
  mountStrategy?: WorkbenchPanelMountStrategy;
@@ -2079,7 +2430,7 @@ declare interface WorkbenchPanelInstance_2 {
2079
2430
  tab?: WorkbenchPanelTab_2;
2080
2431
  }
2081
2432
 
2082
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2433
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2083
2434
  region: WorkbenchPanelMenuRegion;
2084
2435
  fallbackRegion?: WorkbenchPanelMenuRegion;
2085
2436
  };
@@ -2285,7 +2636,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
2285
2636
 
2286
2637
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
2287
2638
 
2288
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2639
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2289
2640
  region: WorkbenchPanelRegion;
2290
2641
  fallbackRegion?: WorkbenchPanelRegion;
2291
2642
  } & WorkbenchPanelMenusContribution;