@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
@@ -0,0 +1,30 @@
1
+ const c = "pstdio.fileSectionNavigation", i = (t) => {
2
+ if (!t || typeof t != "object") return !1;
3
+ const e = t, r = e.occurrence === void 0 || typeof e.occurrence == "number" && Number.isInteger(e.occurrence) && e.occurrence >= 0;
4
+ return typeof e.id == "string" && typeof e.heading == "string" && r;
5
+ }, s = (t) => {
6
+ const e = t?.metadata?.[c];
7
+ if (!e || typeof e != "object") return;
8
+ const r = e;
9
+ if (!(typeof r.treeId != "string" || typeof r.targetNodeId != "string") && !(!Array.isArray(r.anchors) || !r.anchors.every(i)))
10
+ return {
11
+ treeId: r.treeId,
12
+ targetNodeId: r.targetNodeId,
13
+ anchors: r.anchors
14
+ };
15
+ }, a = (t, e) => e && t.anchors.some((r) => r.id === e) ? e : t.targetNodeId, d = (t) => {
16
+ const {
17
+ previous: e,
18
+ current: r,
19
+ currentResourceUri: n,
20
+ selectedNodeId: o
21
+ } = t;
22
+ return !e || !o || !e.anchorIds.includes(o) || r?.targetNodeId === o ? !1 : !r || e.treeId !== r.treeId || e.resourceUri !== n;
23
+ };
24
+ export {
25
+ c as F,
26
+ s as g,
27
+ a as r,
28
+ d as s
29
+ };
30
+ //# sourceMappingURL=file-section-navigation-CfYqVObc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-section-navigation-CfYqVObc.js","sources":["../src/core/registries/renderers/file-section-navigation.ts"],"sourcesContent":["import type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const FILE_SECTION_NAVIGATION_METADATA_KEY = \"pstdio.fileSectionNavigation\";\n\nexport interface FileSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface FileSectionNavigation {\n treeId: string;\n targetNodeId: string;\n anchors: FileSectionAnchor[];\n}\n\nconst isAnchor = (value: unknown): value is FileSectionAnchor => {\n if (!value || typeof value !== \"object\") return false;\n const anchor = value as Record<string, unknown>;\n const occurrenceIsValid =\n anchor.occurrence === undefined ||\n (typeof anchor.occurrence === \"number\" && Number.isInteger(anchor.occurrence) && anchor.occurrence >= 0);\n return typeof anchor.id === \"string\" && typeof anchor.heading === \"string\" && occurrenceIsValid;\n};\n\nexport const getFileSectionNavigation = (resource: ResourceRef | undefined): FileSectionNavigation | undefined => {\n const value = resource?.metadata?.[FILE_SECTION_NAVIGATION_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n const navigation = value as Record<string, unknown>;\n if (typeof navigation.treeId !== \"string\" || typeof navigation.targetNodeId !== \"string\") return undefined;\n if (!Array.isArray(navigation.anchors) || !navigation.anchors.every(isAnchor)) return undefined;\n\n return {\n treeId: navigation.treeId,\n targetNodeId: navigation.targetNodeId,\n anchors: navigation.anchors,\n };\n};\n\nexport const resolveFileSectionTargetId = (navigation: FileSectionNavigation, selectedNodeId: string | undefined) => {\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) return selectedNodeId;\n return navigation.targetNodeId;\n};\n\nexport interface PreviousFileSectionNavigation {\n resourceUri?: string;\n treeId: string;\n anchorIds: string[];\n}\n\nexport const shouldClearFileSectionSelection = (input: {\n previous: PreviousFileSectionNavigation | null;\n current: FileSectionNavigation | undefined;\n currentResourceUri?: string;\n selectedNodeId?: string;\n}) => {\n const { previous, current, currentResourceUri, selectedNodeId } = input;\n if (!previous || !selectedNodeId || !previous.anchorIds.includes(selectedNodeId)) return false;\n if (current?.targetNodeId === selectedNodeId) return false;\n\n return !current || previous.treeId !== current.treeId || previous.resourceUri !== currentResourceUri;\n};\n"],"names":["FILE_SECTION_NAVIGATION_METADATA_KEY","isAnchor","value","anchor","occurrenceIsValid","occurrence","undefined","Number","isInteger","id","heading","getFileSectionNavigation","resource","metadata","navigation","treeId","targetNodeId","Array","isArray","anchors","every","resolveFileSectionTargetId","selectedNodeId","some","shouldClearFileSectionSelection","input","previous","current","currentResourceUri","anchorIds","includes","resourceUri"],"mappings":"AAEO,MAAMA,IAAuC,gCAc9CC,IAAWA,CAACC,MAA+C;AAC/D,MAAI,CAACA,KAAS,OAAOA,KAAU,SAAU,QAAO;AAChD,QAAMC,IAASD,GACTE,IACJD,EAAOE,eAAeC,UACrB,OAAOH,EAAOE,cAAe,YAAYE,OAAOC,UAAUL,EAAOE,UAAU,KAAKF,EAAOE,cAAc;AACxG,SAAO,OAAOF,EAAOM,MAAO,YAAY,OAAON,EAAOO,WAAY,YAAYN;AAChF,GAEaO,IAA2BA,CAACC,MAAyE;AAChH,QAAMV,IAAQU,GAAUC,WAAWb,CAAoC;AACvE,MAAI,CAACE,KAAS,OAAOA,KAAU,SAAU;AACzC,QAAMY,IAAaZ;AACnB,MAAI,SAAOY,EAAWC,UAAW,YAAY,OAAOD,EAAWE,gBAAiB,aAC5E,GAACC,MAAMC,QAAQJ,EAAWK,OAAO,KAAK,CAACL,EAAWK,QAAQC,MAAMnB,CAAQ;AAE5E,WAAO;AAAA,MACLc,QAAQD,EAAWC;AAAAA,MACnBC,cAAcF,EAAWE;AAAAA,MACzBG,SAASL,EAAWK;AAAAA,IAAAA;AAExB,GAEaE,IAA6BA,CAACP,GAAmCQ,MACxEA,KAAkBR,EAAWK,QAAQI,KAAMpB,OAAWA,EAAOM,OAAOa,CAAc,IAAUA,IACzFR,EAAWE,cASPQ,IAAkCA,CAACC,MAK1C;AACJ,QAAM;AAAA,IAAEC,UAAAA;AAAAA,IAAUC,SAAAA;AAAAA,IAASC,oBAAAA;AAAAA,IAAoBN,gBAAAA;AAAAA,EAAAA,IAAmBG;AAElE,SADI,CAACC,KAAY,CAACJ,KAAkB,CAACI,EAASG,UAAUC,SAASR,CAAc,KAC3EK,GAASX,iBAAiBM,IAAuB,KAE9C,CAACK,KAAWD,EAASX,WAAWY,EAAQZ,UAAUW,EAASK,gBAAgBH;AACpF;"}
package/dist/index.d.ts CHANGED
@@ -93,6 +93,7 @@ export declare interface Command {
93
93
  }
94
94
 
95
95
  export declare interface CommandHandler<TArgs = unknown, TResult = unknown> {
96
+ prepareArgs?(args: TArgs, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: TArgs) => void): TArgs | Promise<TArgs>;
96
97
  execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;
97
98
  isEnabled?(args: TArgs): boolean;
98
99
  isVisible?(args: TArgs): boolean;
@@ -149,6 +150,8 @@ export declare interface CommandParamDescriptor {
149
150
  options?: CommandParamOption[];
150
151
  templateType?: string;
151
152
  resourceType?: string;
153
+ accept?: string;
154
+ multiple?: boolean;
152
155
  metadata?: Record<string, unknown>;
153
156
  }
154
157
 
@@ -168,6 +171,7 @@ export declare interface CommandRegistry {
168
171
  isCommandEnabled(id: string, args?: unknown): boolean;
169
172
  isCommandVisible(id: string, args?: unknown): boolean;
170
173
  isCommandToggled(id: string, args?: unknown): boolean;
174
+ prepareCommandArgs(id: string, args: unknown, context?: WorkbenchCommandExecutionContext, onArgsChange?: (args: unknown) => void): Promise<unknown>;
171
175
  executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;
172
176
  onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable_2;
173
177
  }
@@ -176,6 +180,70 @@ declare interface CommandRegistryStoreState {
176
180
  commands: Record<string, RegisteredCommand>;
177
181
  }
178
182
 
183
+ export declare interface CompositionDiagnostic {
184
+ 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";
185
+ message: string;
186
+ panelId?: string;
187
+ slot?: string;
188
+ }
189
+
190
+ export declare interface CompositionModeDefinition {
191
+ id: string;
192
+ extensionId?: string;
193
+ resources?: Record<string, CompositionModeRecipe>;
194
+ modePanels?: Record<string, CompositionPlacementPolicy>;
195
+ }
196
+
197
+ export declare interface CompositionModeRecipe {
198
+ slots?: Record<string, CompositionPlacementPolicy>;
199
+ panels?: Record<string, CompositionPlacementPolicy>;
200
+ }
201
+
202
+ export declare interface CompositionPanelDefinition {
203
+ id: string;
204
+ extensionId: string;
205
+ title: string;
206
+ icon?: string;
207
+ show?: CompositionPanelPlacement | readonly CompositionPanelPlacement[];
208
+ }
209
+
210
+ declare interface CompositionPanelPlacement extends CompositionPlacementPolicy {
211
+ resourceKind?: string;
212
+ }
213
+
214
+ export declare interface CompositionPlacementPolicy {
215
+ region: DockedCompositionRegion;
216
+ allowedRegions?: readonly DockedCompositionRegion[];
217
+ required?: boolean;
218
+ defaultOpen?: boolean;
219
+ pinned?: boolean;
220
+ }
221
+
222
+ declare interface CompositionResolutionContext {
223
+ modeId: string;
224
+ resourceKind?: string;
225
+ }
226
+
227
+ export declare interface CompositionResourceKindDefinition {
228
+ id: string;
229
+ extensionId: string;
230
+ surface: "primary" | "secondary" | "attached";
231
+ slots: Record<string, CompositionSlotDefinition>;
232
+ }
233
+
234
+ export declare interface CompositionResourcePanelEdge {
235
+ id: string;
236
+ extensionId: string;
237
+ resourceKind: string;
238
+ panel: string;
239
+ slot: string;
240
+ }
241
+
242
+ export declare interface CompositionSlotDefinition {
243
+ cardinality: "one" | "many";
244
+ external: boolean;
245
+ }
246
+
179
247
  export declare interface ContextKeyScope extends Disposable_2 {
180
248
  ownerId: string;
181
249
  set(key: string, value: ContextKeyValue): void;
@@ -373,7 +441,7 @@ export declare interface DataTableRendererContribution {
373
441
  emptyDescription?: string;
374
442
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
375
443
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
376
- onRowClick?: (row: DataTableRendererRow) => void;
444
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
377
445
  }
378
446
 
379
447
  export declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -444,6 +512,10 @@ declare interface Disposable_2 {
444
512
  }
445
513
  export { Disposable_2 as Disposable }
446
514
 
515
+ export declare type DockedCompositionRegion = (typeof dockedCompositionRegions)[number];
516
+
517
+ export declare const dockedCompositionRegions: readonly ["sidenav", "main", "secondary", "side"];
518
+
447
519
  export declare interface EnumOption {
448
520
  value: string;
449
521
  label: string;
@@ -499,10 +571,23 @@ export declare interface FileIconThemeRegistry {
499
571
 
500
572
  export declare interface FileRendererContent {
501
573
  fileName?: string;
574
+ /** Workspace-relative path shown above the file preview. */
575
+ filePath?: string;
502
576
  mimeType?: string;
503
577
  content?: string;
504
578
  dataUrl?: string;
505
579
  placeholder?: string;
580
+ /** Override contribution-level save support for one loaded file. */
581
+ editable?: boolean;
582
+ /** Request Monaco for text that automatic dispatch would open as markdown. */
583
+ textRenderer?: "automatic" | "monaco";
584
+ /** Represent a deliberate no-file selection without an editable blank document. */
585
+ emptyState?: {
586
+ title: string;
587
+ description?: string;
588
+ };
589
+ /** Ordered backing-store revision when one is available. */
590
+ revision?: string;
506
591
  }
507
592
 
508
593
  export declare interface FileRendererContribution {
@@ -512,35 +597,53 @@ export declare interface FileRendererContribution {
512
597
  /** Resolve the file's content (and identity) for the bound resource. */
513
598
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
514
599
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
515
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
600
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
516
601
  }
517
602
 
518
603
  export declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
519
604
  fileRendererId: string;
520
605
  }) => unknown;
521
606
 
522
- declare interface FileRendererRefreshEvent {
607
+ export declare interface FileRendererRefreshEnvelope {
608
+ resourceUri?: string;
609
+ origin?: FileRendererRefreshOrigin;
610
+ revision?: string;
611
+ }
612
+
613
+ export declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
523
614
  fileRendererId: string;
524
615
  }
525
616
 
526
617
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
527
618
 
619
+ export declare interface FileRendererRefreshOrigin {
620
+ rendererId: string;
621
+ instanceId: string;
622
+ operationId: string;
623
+ }
624
+
528
625
  export declare interface FileRendererRegistry {
529
626
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
530
627
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
531
628
  setFileRendererImplementation(impl: FileRendererImplementation): void;
532
629
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
533
630
  listFileRenderers(): RegisteredFileRendererContribution[];
534
- refreshFileRenderer(id: string): void;
631
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
535
632
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
536
633
  }
537
634
 
635
+ export declare interface FileRendererSaveResult {
636
+ revision?: string;
637
+ }
638
+
538
639
  declare interface FileRendererStoreState {
539
640
  renderers: Record<string, RegisteredFileRendererContribution>;
540
641
  }
541
642
 
542
643
  export declare const getKeybindingSteps: (keybinding: KeybindingSequence) => string[];
543
644
 
645
+ export declare const getSwitchModeNavigationTargetModeId: (target: NavigationTarget) => string | undefined;
646
+
544
647
  export declare const getWorkbenchModePanelForRegion: (region: WorkbenchRegion) => "main" | "secondary" | "side" | undefined;
545
648
 
546
649
  export declare const getWorkbenchSelectionResourceUris: (resource: ResourceRef | undefined) => string[];
@@ -551,6 +654,8 @@ export declare const headerTrailingMenuPath: (region: string) => MenuPath;
551
654
 
552
655
  export declare interface HistoryController {
553
656
  store: WorkbenchStore<HistoryStoreState>;
657
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
658
+ createCheckpoint(): () => void;
554
659
  goBack(): HistoryEntry | undefined;
555
660
  goForward(): HistoryEntry | undefined;
556
661
  goPrevious(): HistoryEntry | undefined;
@@ -578,6 +683,8 @@ export declare interface KanbanRendererContribution<TRow extends KanbanRendererR
578
683
  id: string;
579
684
  title: string;
580
685
  resourceKind?: string;
686
+ /** Host-owned scope for persisted display settings. */
687
+ storageScope?: string;
581
688
  /**
582
689
  * Declarative attribute schema. The renderer dispatches filter / group /
583
690
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -605,8 +712,8 @@ export declare interface KanbanRendererContribution<TRow extends KanbanRendererR
605
712
  */
606
713
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
607
714
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
608
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
609
- onRowClick?: (row: TRow) => void;
715
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
716
+ onRowActivate?: (row: TRow) => Promise<void> | void;
610
717
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
611
718
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
612
719
  /**
@@ -700,7 +807,7 @@ export declare interface KanbanRendererRow {
700
807
  title: string;
701
808
  /**
702
809
  * Optional navigation handle. When set, the renderer's default click handler
703
- * routes through the contribution's onRowClick (which typically opens the
810
+ * routes through the contribution's onRowActivate (which typically opens the
704
811
  * resource via the workbench).
705
812
  */
706
813
  resource?: unknown;
@@ -810,6 +917,16 @@ declare interface LayoutModel {
810
917
  carryRegionState?: readonly WorkbenchRegion[];
811
918
  }): void;
812
919
  getPersistenceScope(): LayoutScope | undefined;
920
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
921
+ /** Whether anything is stored for the active scope right now. */
922
+ hasPersistedLayout(): boolean;
923
+ /**
924
+ * Whether the active scope was entered with a layout the user already had. Unlike
925
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
926
+ */
927
+ enteredWithPersistedLayout(): boolean;
928
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
929
+ reconcilePanelMenus(): void;
813
930
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
814
931
  dispose(): void;
815
932
  };
@@ -946,6 +1063,7 @@ declare interface OpenWidgetInput {
946
1063
  resource?: ResourceRef;
947
1064
  title?: string;
948
1065
  region?: WorkbenchRegion;
1066
+ role?: WorkbenchWidgetRole;
949
1067
  ownerId?: string;
950
1068
  source?: ContributionSource;
951
1069
  pinned?: boolean;
@@ -963,13 +1081,24 @@ export declare interface OpenWorkbenchPanelInput {
963
1081
  resource?: ResourceRef;
964
1082
  title?: string;
965
1083
  region?: WorkbenchRegion;
1084
+ role?: WorkbenchWidgetRole;
966
1085
  pinned?: boolean;
1086
+ closable?: boolean;
967
1087
  mountStrategy?: WorkbenchPanelMountStrategy;
968
1088
  hiddenByDefault?: boolean;
969
1089
  tab?: WorkbenchPanelTab;
970
1090
  strategy?: WorkbenchPanelOpenStrategy;
971
1091
  }
972
1092
 
1093
+ export declare interface PersistedCompositionLayout {
1094
+ regions: Partial<Record<DockedCompositionRegion, PersistedCompositionRegionState>>;
1095
+ }
1096
+
1097
+ declare interface PersistedCompositionRegionState {
1098
+ order: readonly string[];
1099
+ activePanelId?: string;
1100
+ }
1101
+
973
1102
  export declare interface PersistedTreeRendererStates {
974
1103
  statesByTreeId: Record<string, TreeRendererState>;
975
1104
  }
@@ -1092,7 +1221,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1092
1221
  ownedPanelMenuIds?: readonly string[];
1093
1222
  singleton: boolean;
1094
1223
  reuse: WidgetReusePolicy;
1095
- role: WorkbenchWidgetRole;
1096
1224
  } & RegisteredContributionMetadata;
1097
1225
 
1098
1226
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1108,9 +1236,49 @@ declare interface RegisteredWorkbenchNotification extends RegisteredContribution
1108
1236
 
1109
1237
  export declare const resolveAnchorRegion: (anchorId: AnchorId) => "status" | "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" | "overlay";
1110
1238
 
1239
+ export declare const resolveComposition: (input: ResolveCompositionInput) => ResolvedComposition;
1240
+
1241
+ declare interface ResolveCompositionInput {
1242
+ context: CompositionResolutionContext;
1243
+ mode: CompositionModeDefinition;
1244
+ composition: WorkbenchComposition;
1245
+ persisted?: PersistedCompositionLayout;
1246
+ }
1247
+
1248
+ export declare interface ResolvedComposition {
1249
+ placements: readonly ResolvedCompositionPlacement[];
1250
+ regionOrder: Partial<Record<DockedCompositionRegion, readonly string[]>>;
1251
+ activePanelIds: Partial<Record<DockedCompositionRegion, string>>;
1252
+ addablePanels: readonly ResolvedCompositionAddablePanel[];
1253
+ diagnostics: readonly CompositionDiagnostic[];
1254
+ requiredFallback?: {
1255
+ panelId: string;
1256
+ };
1257
+ }
1258
+
1259
+ export declare interface ResolvedCompositionAddablePanel {
1260
+ panelId: string;
1261
+ region: DockedCompositionRegion;
1262
+ allowedRegions: readonly DockedCompositionRegion[];
1263
+ pinned?: boolean;
1264
+ }
1265
+
1266
+ export declare interface ResolvedCompositionPlacement {
1267
+ panelId: string;
1268
+ region: DockedCompositionRegion;
1269
+ slot?: string;
1270
+ required: boolean;
1271
+ defaultOpen: boolean;
1272
+ pinned?: boolean;
1273
+ allowedRegions: readonly DockedCompositionRegion[];
1274
+ origin: "persisted" | "required" | "default";
1275
+ }
1276
+
1111
1277
  declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1112
1278
 
1113
- declare type ResolvedResourcePresenter = Required<ResourcePresenter>;
1279
+ declare type ResolvedResourcePresenter = Omit<ResourcePresenter, "priority"> & {
1280
+ priority: number;
1281
+ };
1114
1282
 
1115
1283
  export declare interface ResourceBrowseEntry {
1116
1284
  resource: ResourceRef;
@@ -1134,6 +1302,14 @@ export declare interface ResourceContextAction {
1134
1302
 
1135
1303
  export declare const resourceContextMenuPath: (resourceKind: string) => MenuPath;
1136
1304
 
1305
+ export declare interface ResourceHierarchyCycle {
1306
+ code: typeof resourceHierarchyCycleCode;
1307
+ path: ResourceRef[];
1308
+ repeatedUri: string;
1309
+ }
1310
+
1311
+ export declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1312
+
1137
1313
  export declare interface ResourceHierarchyProvider {
1138
1314
  id: string;
1139
1315
  priority?: number;
@@ -1166,6 +1342,7 @@ export declare interface ResourcePresenter {
1166
1342
  priority?: number;
1167
1343
  canOpen(resource: ResourceRef): boolean;
1168
1344
  open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;
1345
+ afterOpen?(resource: ResourceRef, instance: WorkbenchPanelInstance, input: OpenResourceInput): void;
1169
1346
  }
1170
1347
 
1171
1348
  export declare interface ResourceProvider {
@@ -1197,6 +1374,7 @@ export declare interface ResourceRegistry {
1197
1374
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1198
1375
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1199
1376
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1377
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1200
1378
  isOpeningResource(): boolean;
1201
1379
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1202
1380
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1356,11 +1534,13 @@ export declare interface TreeNode {
1356
1534
  target?: NavigationTarget;
1357
1535
  /** Visual row variant for non-data rows such as placeholders. */
1358
1536
  rowVariant?: TreeNodeRowVariant;
1537
+ inlineInput?: TreeNodeInlineInput;
1359
1538
  actions?: TreeAction[];
1360
1539
  contextMenuActions?: TreeAction[];
1361
1540
  contextMenuPath?: MenuPath;
1362
1541
  menuPath?: MenuPath;
1363
1542
  menuPlacement?: "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "left-start";
1543
+ showContextMenuTrigger?: boolean;
1364
1544
  collapsible?: boolean;
1365
1545
  disabled?: boolean;
1366
1546
  children?: TreeNode[];
@@ -1371,6 +1551,18 @@ export declare interface TreeNode {
1371
1551
  canHide?: boolean;
1372
1552
  /** When false, the node stays fixed within its Sidenav group. */
1373
1553
  canReorder?: boolean;
1554
+ /** Allow this node to be moved to another tree location. */
1555
+ canDrag?: boolean;
1556
+ /** Allow movable nodes to be dropped on this node. */
1557
+ canDrop?: boolean;
1558
+ }
1559
+
1560
+ export declare interface TreeNodeInlineInput {
1561
+ ariaLabel: string;
1562
+ defaultValue?: string;
1563
+ placeholder?: string;
1564
+ onCommit(value: string): Promise<void> | void;
1565
+ onCancel?(): void;
1374
1566
  }
1375
1567
 
1376
1568
  declare type TreeNodeRowVariant = "empty-state";
@@ -1379,6 +1571,8 @@ export declare interface TreeRendererContribution {
1379
1571
  id: string;
1380
1572
  title: string;
1381
1573
  icon?: string;
1574
+ searchable?: boolean;
1575
+ searchPlaceholder?: string;
1382
1576
  when?: string;
1383
1577
  defaultExpandedSectionIds?: string[];
1384
1578
  defaultExpandedNodeIds?: string[];
@@ -1386,6 +1580,7 @@ export declare interface TreeRendererContribution {
1386
1580
  getHeader?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1387
1581
  getFooter?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1388
1582
  getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];
1583
+ moveNode?(source: TreeNode, target: TreeNode | undefined, ctx: TreeContext): Promise<void> | void;
1389
1584
  }
1390
1585
 
1391
1586
  export declare type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -1483,7 +1678,6 @@ declare interface WidgetContribution {
1483
1678
  priority?: number;
1484
1679
  rendererId: string;
1485
1680
  openCommandId?: string;
1486
- role?: WorkbenchWidgetRole;
1487
1681
  eligibleLocations?: WorkbenchLocationEligibility;
1488
1682
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1489
1683
  tab?: WorkbenchWidgetTab;
@@ -1583,6 +1777,26 @@ declare interface WorkbenchCommandParamsRequest {
1583
1777
  context?: WorkbenchCommandExecutionContext;
1584
1778
  }
1585
1779
 
1780
+ export declare interface WorkbenchComposition {
1781
+ resourceKinds: readonly CompositionResourceKindDefinition[];
1782
+ panels: readonly CompositionPanelDefinition[];
1783
+ resourcePanels: readonly CompositionResourcePanelEdge[];
1784
+ }
1785
+
1786
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1787
+ contribution: RegisteredWidgetContribution;
1788
+ }
1789
+
1790
+ declare interface WorkbenchCompositionController {
1791
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1792
+ }
1793
+
1794
+ declare interface WorkbenchCompositionRegionPanels {
1795
+ open: readonly WorkbenchWidgetPlacement[];
1796
+ addable: readonly WorkbenchCompositionAddablePanel[];
1797
+ closable: readonly string[];
1798
+ }
1799
+
1586
1800
  export declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1587
1801
  host: WorkbenchHost;
1588
1802
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1594,6 +1808,7 @@ declare interface WorkbenchCoreContributionContext {
1594
1808
  commandPalette: WorkbenchCommandPaletteController;
1595
1809
  commandPaletteResources: CommandPaletteResourceRegistry;
1596
1810
  commands: CommandRegistry;
1811
+ composition: WorkbenchCompositionController;
1597
1812
  context: ContextKeyService;
1598
1813
  focus: WorkbenchFocusController;
1599
1814
  history: HistoryController;
@@ -1602,6 +1817,7 @@ declare interface WorkbenchCoreContributionContext {
1602
1817
  layout: WorkbenchLayoutModel;
1603
1818
  modes: WorkbenchModeRegistry;
1604
1819
  navigation: NavigationRegistry;
1820
+ navigator: WorkbenchNavigator;
1605
1821
  notifications: NotificationRegistry;
1606
1822
  panels: WorkbenchPanelsController;
1607
1823
  preferences: PreferenceRegistry;
@@ -1679,7 +1895,7 @@ declare interface WorkbenchLayoutStoreState {
1679
1895
  placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;
1680
1896
  }
1681
1897
 
1682
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1898
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1683
1899
 
1684
1900
  export declare interface WorkbenchLocationEligibility {
1685
1901
  modeIds?: string[];
@@ -1701,15 +1917,31 @@ export declare type WorkbenchModeActivationContext = WorkbenchCoreContributionCo
1701
1917
 
1702
1918
  export declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1703
1919
 
1920
+ export declare interface WorkbenchModeAddablePanel {
1921
+ panelId: string;
1922
+ region: WorkbenchPanelRegion;
1923
+ allowedRegions?: readonly WorkbenchRegion[];
1924
+ pinned?: boolean;
1925
+ }
1926
+
1927
+ export declare interface WorkbenchModeAddablePanelContext {
1928
+ layout: WorkbenchLayout;
1929
+ resource?: ResourceRef;
1930
+ }
1931
+
1704
1932
  declare type WorkbenchModeChangeListener = () => void;
1705
1933
 
1706
1934
  export declare interface WorkbenchModeContribution {
1707
1935
  id: string;
1708
1936
  label?: string;
1709
1937
  panels?: readonly WorkbenchPanelRegion[];
1938
+ resourceKinds?: readonly string[];
1939
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
1940
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1710
1941
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1711
1942
  seed?(ctx: WorkbenchModeActivationContext): void;
1712
1943
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1944
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1713
1945
  }
1714
1946
 
1715
1947
  export declare interface WorkbenchModeRegistry {
@@ -1745,6 +1977,14 @@ export declare interface WorkbenchModuleContribution {
1745
1977
 
1746
1978
  export declare type WorkbenchModuleContributionContext = WorkbenchModuleContext;
1747
1979
 
1980
+ declare interface WorkbenchNavigationCommit {
1981
+ modeId: string | undefined;
1982
+ resource: ResourceRef | undefined;
1983
+ replaceActive: boolean;
1984
+ }
1985
+
1986
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
1987
+
1748
1988
  declare interface WorkbenchNavigationEntry {
1749
1989
  entryId: string;
1750
1990
  recordedAt: number;
@@ -1759,6 +1999,53 @@ declare interface WorkbenchNavigationEntry {
1759
1999
  closedSubPanel?: WorkbenchClosedSubPanel;
1760
2000
  }
1761
2001
 
2002
+ declare type WorkbenchNavigationResult = {
2003
+ ok: true;
2004
+ modeId: string | undefined;
2005
+ resource: ResourceRef | undefined;
2006
+ } | {
2007
+ ok: false;
2008
+ code: WorkbenchNavigationDiagnosticCode;
2009
+ message: string;
2010
+ };
2011
+
2012
+ declare interface WorkbenchNavigationTarget {
2013
+ modeId?: string;
2014
+ resource?: ResourceRef;
2015
+ replaceActive?: boolean;
2016
+ }
2017
+
2018
+ declare interface WorkbenchNavigator {
2019
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
2020
+ getSelectedResource(): ResourceRef | undefined;
2021
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
2022
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
2023
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
2024
+ forgetResource(uri: string): void;
2025
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
2026
+ dispose(): void;
2027
+ };
2028
+ }
2029
+
2030
+ declare interface WorkbenchNavigatorCommitInput {
2031
+ modeId?: string | null;
2032
+ resource?: ResourceRef | null;
2033
+ replaceActive?: boolean;
2034
+ present?: boolean;
2035
+ }
2036
+
2037
+ declare interface WorkbenchNavigatorHostHooks {
2038
+ getProjectId?(): string | undefined;
2039
+ getSelectedResource?(): ResourceRef | undefined;
2040
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
2041
+ applySelection?(resource: ResourceRef | undefined): void;
2042
+ applyScope?(commit: WorkbenchNavigationCommit): void;
2043
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
2044
+ presentResource?(resource: ResourceRef, input: {
2045
+ replaceActive: boolean;
2046
+ }): Promise<unknown> | unknown;
2047
+ }
2048
+
1762
2049
  export declare interface WorkbenchNotification {
1763
2050
  id?: string;
1764
2051
  level: WorkbenchNotificationLevel;
@@ -1800,7 +2087,6 @@ export declare interface WorkbenchPanelContribution {
1800
2087
  region: WorkbenchRegion;
1801
2088
  fallbackRegion?: WorkbenchRegion;
1802
2089
  rendererId: string;
1803
- closable: boolean;
1804
2090
  singleton?: boolean;
1805
2091
  reuse?: WorkbenchPanelReusePolicy;
1806
2092
  mountStrategy?: WorkbenchPanelMountStrategy;
@@ -1839,7 +2125,7 @@ export declare interface WorkbenchPanelInstance {
1839
2125
  tab?: WorkbenchPanelTab;
1840
2126
  }
1841
2127
 
1842
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2128
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
1843
2129
  region: WorkbenchPanelMenuRegion;
1844
2130
  fallbackRegion?: WorkbenchPanelMenuRegion;
1845
2131
  };
@@ -1908,9 +2194,9 @@ export declare type WorkbenchPanelOpenStrategy = {
1908
2194
  position?: WorkbenchTabPosition;
1909
2195
  };
1910
2196
 
1911
- declare type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];
2197
+ export declare type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];
1912
2198
 
1913
- declare const workbenchPanelRegions: readonly ["main", "secondary", "side"];
2199
+ export declare const workbenchPanelRegions: readonly ["main", "secondary", "side"];
1914
2200
 
1915
2201
  export declare interface WorkbenchPanelRenderInput {
1916
2202
  workbench: WorkbenchCore;
@@ -1953,7 +2239,7 @@ export declare interface WorkbenchPersistenceAdapter {
1953
2239
 
1954
2240
  export declare type WorkbenchRegion = (typeof workbenchRegions)[number];
1955
2241
 
1956
- 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"];
2242
+ export 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"];
1957
2243
 
1958
2244
  export declare interface WorkbenchRegionSize {
1959
2245
  defaultPx?: number;
@@ -2070,7 +2356,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
2070
2356
 
2071
2357
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
2072
2358
 
2073
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2359
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2074
2360
  region: WorkbenchPanelRegion;
2075
2361
  fallbackRegion?: WorkbenchPanelRegion;
2076
2362
  } & WorkbenchPanelMenusContribution;
@@ -2081,6 +2367,8 @@ declare interface WorkbenchSubPanelRef {
2081
2367
  instanceKey?: string;
2082
2368
  }
2083
2369
 
2370
+ export declare const workbenchSwitchModeCommandId = "workbench.action.switchMode";
2371
+
2084
2372
  export declare type WorkbenchTabPosition = "start" | "end" | {
2085
2373
  beforeWidgetId: string;
2086
2374
  } | {