@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 +1 @@
1
- {"version":3,"file":"layout-types-DMoZz38-.js","sources":["../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-types.ts"],"sourcesContent":["export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","import type { ContributionSource, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav-header\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n\nexport interface WorkbenchRegionSize {\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport type WidgetReusePolicy = \"resource\" | \"none\";\n\nexport type WidgetMountStrategy = \"active\" | \"keep-mounted\";\n\nexport type WorkbenchPanelReusePolicy = WidgetReusePolicy;\n\nexport type WorkbenchPanelMountStrategy = WidgetMountStrategy;\n\nexport type WorkbenchFloatingPanelVisibility = \"visible\" | \"hidden\";\n\nexport type WorkbenchWidgetRole = \"content\" | \"location\" | \"sub-panel\" | \"panel-menu\";\n\nexport type WorkbenchTabRetention = \"preview\" | \"persistent\";\n\nexport type WorkbenchTabPosition = \"start\" | \"end\" | { beforeWidgetId: string } | { afterWidgetId: string };\n\nexport interface WorkbenchLocationEligibility {\n modeIds?: string[];\n resourceKinds?: string[];\n resourceIds?: string[];\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport type WorkbenchPanelMenuOwner =\n | { level: \"panel\"; contributionId?: string }\n | { level: \"sub-panel\"; contributionId: string };\n\nexport interface WorkbenchWidgetTab {\n contentRendererId?: string;\n /** Custom actions shown when the user activates an already-active tab. */\n customMenuRendererId?: string;\n}\n\nexport type WorkbenchPanelTab = WorkbenchWidgetTab;\n\nexport interface WidgetContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n singleton?: boolean;\n reuse?: WidgetReusePolicy;\n mountStrategy?: WidgetMountStrategy;\n closable?: boolean;\n // Non-closeable widgets opt into the tab visibility menu; closeable widgets\n // ignore this and use the X button for dismissal.\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n priority?: number;\n rendererId: string;\n openCommandId?: string;\n role?: WorkbenchWidgetRole;\n eligibleLocations?: WorkbenchLocationEligibility;\n panelMenuOwner?: WorkbenchPanelMenuOwner;\n tab?: WorkbenchWidgetTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport interface WorkbenchPanelMenuDefinition {\n id: string;\n title: string;\n icon?: string;\n side: WorkbenchPanelMenuSide;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n rendererId: string;\n priority?: number;\n config?: unknown;\n}\n\ninterface WorkbenchPanelMenusContribution {\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport interface WorkbenchPanelContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n rendererId: string;\n closable: boolean;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n eligibleLocations?: WorkbenchLocationEligibility;\n priority?: number;\n openCommandId?: string;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n ownerId?: string;\n source?: ContributionSource;\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport type WorkbenchLocationContribution = Omit<WidgetContribution, \"role\"> & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchSubPanelContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\" | \"role\"> & {\n region: WorkbenchPanelRegion;\n fallbackRegion?: WorkbenchPanelRegion;\n} & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchPanelMenuContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\" | \"role\"> & {\n region: WorkbenchPanelMenuRegion;\n fallbackRegion?: WorkbenchPanelMenuRegion;\n};\n\nexport type RegisteredWidgetContribution = Omit<WidgetContribution, \"priority\" | \"singleton\" | \"reuse\"> & {\n ownedPanelMenuIds?: readonly string[];\n singleton: boolean;\n reuse: WidgetReusePolicy;\n role: WorkbenchWidgetRole;\n} & RegisteredContributionMetadata;\n\nexport interface PlaceholderContribution {\n id: string;\n title: string;\n region: WorkbenchRegion;\n rendererId: string;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n priority?: number;\n}\n\nexport type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, \"priority\"> &\n RegisteredContributionMetadata;\n\nexport interface WorkbenchWidgetPlacement {\n widgetId: string;\n contributionId: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchWidgetTab;\n role?: WorkbenchWidgetRole;\n}\n\nexport interface WorkbenchPanelInstance {\n instanceId: string;\n panelId: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchPanelTab;\n}\n\nexport interface WorkbenchRegionState {\n id: WorkbenchRegion;\n visible: boolean;\n size?: number;\n widgets: WorkbenchWidgetPlacement[];\n activeWidgetId?: string;\n}\n\nexport interface WorkbenchLayout {\n regions: Record<WorkbenchRegion, WorkbenchRegionState>;\n locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;\n activeWidgetId?: string;\n activeLocationWidgetId?: string;\n activeResourceUri?: string;\n}\n\nexport interface WorkbenchLayoutStoreState {\n layout: WorkbenchLayout;\n widgets: Record<string, RegisteredWidgetContribution>;\n placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;\n}\n\nexport interface OpenWidgetInput {\n resource?: ResourceRef;\n title?: string;\n region?: WorkbenchRegion;\n ownerId?: string;\n source?: ContributionSource;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tabPosition?: WorkbenchTabPosition;\n tab?: WorkbenchWidgetTab;\n replaceActive?: boolean;\n replaceWidgetId?: string;\n}\n\nexport type WorkbenchPanelOpenStrategy =\n | { kind: \"activate-or-open\"; position?: WorkbenchTabPosition }\n | { kind: \"replace-active\" }\n | { kind: \"replace-panel\"; instanceId: string }\n | { kind: \"preview\"; position?: WorkbenchTabPosition };\n\nexport interface OpenWorkbenchPanelInput {\n resource?: ResourceRef;\n title?: string;\n region?: WorkbenchRegion;\n pinned?: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tab?: WorkbenchPanelTab;\n strategy?: WorkbenchPanelOpenStrategy;\n}\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n \"sidenav-header\": createRegion(\"sidenav-header\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceUri = layout.activeResourceUri;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceUri = widgets[activeIndex]?.resourceUri;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceUri };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persisted.regions },\n });\n};\n"],"names":["resolveUniqueWidgetId","widgetIds","contributionId","preferredId","has","suffix","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","main","left","right","secondary","side","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","createRegion","regions","nav","activity","sidenav","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","Set","activeWidgetId","activeResourceUri","Object","entries","originalActiveWidgetId","activeIndex","map","placement","add","normalizedActiveWidgetId","resourceUri","mergeWithDefaultRegions","persisted","defaults"],"mappings":"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"}
1
+ {"version":3,"file":"layout-types-DMoZz38-.js","sources":["../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-types.ts"],"sourcesContent":["export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","import type { ContributionSource, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav-header\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n\nexport interface WorkbenchRegionSize {\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport type WidgetReusePolicy = \"resource\" | \"none\";\n\nexport type WidgetMountStrategy = \"active\" | \"keep-mounted\";\n\nexport type WorkbenchPanelReusePolicy = WidgetReusePolicy;\n\nexport type WorkbenchPanelMountStrategy = WidgetMountStrategy;\n\nexport type WorkbenchFloatingPanelVisibility = \"visible\" | \"hidden\";\n\nexport type WorkbenchWidgetRole = \"content\" | \"location\" | \"sub-panel\" | \"panel-menu\";\n\nexport type WorkbenchTabRetention = \"preview\" | \"persistent\";\n\nexport type WorkbenchTabPosition = \"start\" | \"end\" | { beforeWidgetId: string } | { afterWidgetId: string };\n\nexport interface WorkbenchLocationEligibility {\n modeIds?: string[];\n resourceKinds?: string[];\n resourceIds?: string[];\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport type WorkbenchPanelMenuOwner =\n | { level: \"panel\"; contributionId?: string }\n | { level: \"sub-panel\"; contributionId: string };\n\nexport interface WorkbenchWidgetTab {\n contentRendererId?: string;\n /** Custom actions shown when the user activates an already-active tab. */\n customMenuRendererId?: string;\n}\n\nexport type WorkbenchPanelTab = WorkbenchWidgetTab;\n\nexport interface WidgetContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n singleton?: boolean;\n reuse?: WidgetReusePolicy;\n mountStrategy?: WidgetMountStrategy;\n closable?: boolean;\n // Non-closeable widgets opt into the tab visibility menu; closeable widgets\n // ignore this and use the X button for dismissal.\n hiddenByDefault?: boolean;\n // A Location that presents only its Sub Panels: it renders no tab and no\n // content of its own — establishing it activates its first Sub Panel.\n subPanelsOnly?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n priority?: number;\n rendererId: string;\n openCommandId?: string;\n eligibleLocations?: WorkbenchLocationEligibility;\n panelMenuOwner?: WorkbenchPanelMenuOwner;\n tab?: WorkbenchWidgetTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport interface WorkbenchPanelMenuDefinition {\n id: string;\n title: string;\n icon?: string;\n side: WorkbenchPanelMenuSide;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n rendererId: string;\n priority?: number;\n config?: unknown;\n}\n\ninterface WorkbenchPanelMenusContribution {\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport interface WorkbenchPanelContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n rendererId: string;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n subPanelsOnly?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n eligibleLocations?: WorkbenchLocationEligibility;\n priority?: number;\n openCommandId?: string;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n ownerId?: string;\n source?: ContributionSource;\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchSubPanelContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\"> & {\n region: WorkbenchPanelRegion;\n fallbackRegion?: WorkbenchPanelRegion;\n} & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchPanelMenuContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\"> & {\n region: WorkbenchPanelMenuRegion;\n fallbackRegion?: WorkbenchPanelMenuRegion;\n};\n\nexport type RegisteredWidgetContribution = Omit<WidgetContribution, \"priority\" | \"singleton\" | \"reuse\"> & {\n ownedPanelMenuIds?: readonly string[];\n singleton: boolean;\n reuse: WidgetReusePolicy;\n} & RegisteredContributionMetadata;\n\nexport interface PlaceholderContribution {\n id: string;\n title: string;\n region: WorkbenchRegion;\n rendererId: string;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n priority?: number;\n}\n\nexport type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, \"priority\"> &\n RegisteredContributionMetadata;\n\nexport interface WorkbenchWidgetPlacement {\n widgetId: string;\n contributionId: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchWidgetTab;\n role?: WorkbenchWidgetRole;\n}\n\nexport interface WorkbenchPanelInstance {\n instanceId: string;\n panelId: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchPanelTab;\n}\n\nexport interface WorkbenchRegionState {\n id: WorkbenchRegion;\n visible: boolean;\n size?: number;\n widgets: WorkbenchWidgetPlacement[];\n activeWidgetId?: string;\n}\n\nexport interface WorkbenchLayout {\n regions: Record<WorkbenchRegion, WorkbenchRegionState>;\n locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;\n activeWidgetId?: string;\n activeLocationWidgetId?: string;\n activeResourceUri?: string;\n}\n\nexport interface WorkbenchLayoutStoreState {\n layout: WorkbenchLayout;\n widgets: Record<string, RegisteredWidgetContribution>;\n placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;\n}\n\nexport interface OpenWidgetInput {\n resource?: ResourceRef;\n title?: string;\n region?: WorkbenchRegion;\n // The role this placement takes, when the caller knows it better than the widget\n // does. A panel is a Location in main and a Sub Panel elsewhere, so a placement made\n // by the composition resolver carries the role its region implies.\n role?: WorkbenchWidgetRole;\n ownerId?: string;\n source?: ContributionSource;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tabPosition?: WorkbenchTabPosition;\n tab?: WorkbenchWidgetTab;\n replaceActive?: boolean;\n replaceWidgetId?: string;\n}\n\nexport type WorkbenchPanelOpenStrategy =\n | { kind: \"persistent\"; position?: WorkbenchTabPosition }\n | { kind: \"replace-active\" }\n | { kind: \"replace-panel\"; instanceId: string; retention?: WorkbenchTabRetention }\n | { kind: \"preview\"; position?: WorkbenchTabPosition };\n\nexport interface OpenWorkbenchPanelInput {\n resource?: ResourceRef;\n title?: string;\n region?: WorkbenchRegion;\n role?: WorkbenchWidgetRole;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tab?: WorkbenchPanelTab;\n strategy?: WorkbenchPanelOpenStrategy;\n}\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n \"sidenav-header\": createRegion(\"sidenav-header\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceUri = layout.activeResourceUri;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceUri = widgets[activeIndex]?.resourceUri;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceUri };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persisted.regions },\n });\n};\n"],"names":["resolveUniqueWidgetId","widgetIds","contributionId","preferredId","has","suffix","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","main","left","right","secondary","side","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","createRegion","regions","nav","activity","sidenav","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","Set","activeWidgetId","activeResourceUri","Object","entries","originalActiveWidgetId","activeIndex","map","placement","add","normalizedActiveWidgetId","resourceUri","mergeWithDefaultRegions","persisted","defaults"],"mappings":"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"}
package/dist/react.d.ts CHANGED
@@ -8,6 +8,7 @@ import { JSXElementConstructor } from 'react';
8
8
  import { ListRowActionMenuItem } from '@pstdio/ui';
9
9
  import { Param } from '@pstdio/ui';
10
10
  import { ParamEditorProps } from '@pstdio/ui';
11
+ import { ParamValue } from '@pstdio/ui';
11
12
  import { ReactElement } from 'react';
12
13
  import { ReactNode } from 'react';
13
14
  import { ReactPortal } from 'react';
@@ -185,9 +186,13 @@ export declare interface CommandParamFieldProps {
185
186
 
186
187
  export declare type CommandParamFieldRenderer = (props: CommandParamFieldProps) => ReactNode;
187
188
 
189
+ /** Required params carry the marker in their name — the editor has no required state. */
190
+ export declare const commandParamName: (entry: CommandParamEntry) => string;
191
+
188
192
  declare interface CommandParamOption {
189
193
  label: string;
190
194
  value: string;
195
+ icon?: string;
191
196
  }
192
197
 
193
198
  declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
@@ -443,7 +448,7 @@ declare interface DataTableRendererContribution {
443
448
  emptyDescription?: string;
444
449
  executeQuery(context: DataTableRendererQueryContext): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;
445
450
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
446
- onRowClick?: (row: DataTableRendererRow) => void;
451
+ onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;
447
452
  }
448
453
 
449
454
  declare type DataTableRendererImplementation = (input: WorkbenchPanelRenderInput & {
@@ -574,6 +579,8 @@ declare interface FileRendererContent {
574
579
  content?: string;
575
580
  dataUrl?: string;
576
581
  placeholder?: string;
582
+ /** Ordered backing-store revision when one is available. */
583
+ revision?: string;
577
584
  }
578
585
 
579
586
  declare interface FileRendererContribution {
@@ -583,35 +590,53 @@ declare interface FileRendererContribution {
583
590
  /** Resolve the file's content (and identity) for the bound resource. */
584
591
  load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;
585
592
  /** Persist edited text. Absent ⇒ read-only. Never called for images. */
586
- save?(resource: ResourceRef | undefined, content: string): Promise<void> | void;
593
+ save?(resource: ResourceRef | undefined, content: string, origin?: FileRendererRefreshOrigin): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;
587
594
  }
588
595
 
589
596
  declare type FileRendererImplementation = (input: WorkbenchPanelRenderInput & {
590
597
  fileRendererId: string;
591
598
  }) => unknown;
592
599
 
593
- declare interface FileRendererRefreshEvent {
600
+ declare interface FileRendererRefreshEnvelope {
601
+ resourceUri?: string;
602
+ origin?: FileRendererRefreshOrigin;
603
+ revision?: string;
604
+ }
605
+
606
+ declare interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {
594
607
  fileRendererId: string;
595
608
  }
596
609
 
597
610
  declare type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;
598
611
 
612
+ declare interface FileRendererRefreshOrigin {
613
+ rendererId: string;
614
+ instanceId: string;
615
+ operationId: string;
616
+ }
617
+
599
618
  declare interface FileRendererRegistry {
600
619
  fileRendererStore: WorkbenchStore<FileRendererStoreState>;
601
620
  registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable_2;
602
621
  setFileRendererImplementation(impl: FileRendererImplementation): void;
603
622
  getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;
604
623
  listFileRenderers(): RegisteredFileRendererContribution[];
605
- refreshFileRenderer(id: string): void;
624
+ refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;
606
625
  onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable_2;
607
626
  }
608
627
 
628
+ declare interface FileRendererSaveResult {
629
+ revision?: string;
630
+ }
631
+
609
632
  declare interface FileRendererStoreState {
610
633
  renderers: Record<string, RegisteredFileRendererContribution>;
611
634
  }
612
635
 
613
636
  declare interface HistoryController {
614
637
  store: WorkbenchStore<HistoryStoreState>;
638
+ /** Snapshot the history for a compound navigation; the returned function restores it. */
639
+ createCheckpoint(): () => void;
615
640
  goBack(): HistoryEntry | undefined;
616
641
  goForward(): HistoryEntry | undefined;
617
642
  goPrevious(): HistoryEntry | undefined;
@@ -639,6 +664,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
639
664
  id: string;
640
665
  title: string;
641
666
  resourceKind?: string;
667
+ /** Host-owned scope for persisted display settings. */
668
+ storageScope?: string;
642
669
  /**
643
670
  * Declarative attribute schema. The renderer dispatches filter / group /
644
671
  * sort / display / inline-edit behavior on each descriptor's `type.kind`.
@@ -666,8 +693,8 @@ declare interface KanbanRendererContribution<TRow extends KanbanRendererRow = Ka
666
693
  */
667
694
  executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];
668
695
  subscribe?: (listener: () => void) => Disposable_2 | (() => void);
669
- /** Row interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */
670
- onRowClick?: (row: TRow) => void;
696
+ /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */
697
+ onRowActivate?: (row: TRow) => Promise<void> | void;
671
698
  /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */
672
699
  getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];
673
700
  /**
@@ -761,7 +788,7 @@ declare interface KanbanRendererRow {
761
788
  title: string;
762
789
  /**
763
790
  * Optional navigation handle. When set, the renderer's default click handler
764
- * routes through the contribution's onRowClick (which typically opens the
791
+ * routes through the contribution's onRowActivate (which typically opens the
765
792
  * resource via the workbench).
766
793
  */
767
794
  resource?: unknown;
@@ -866,6 +893,16 @@ declare interface LayoutModel {
866
893
  carryRegionState?: readonly WorkbenchRegion_2[];
867
894
  }): void;
868
895
  getPersistenceScope(): LayoutScope | undefined;
896
+ /** True when the current persistence scope already stores a layout. A new scope returns false. */
897
+ /** Whether anything is stored for the active scope right now. */
898
+ hasPersistedLayout(): boolean;
899
+ /**
900
+ * Whether the active scope was entered with a layout the user already had. Unlike
901
+ * `hasPersistedLayout`, writes made while entering a mode do not change the answer.
902
+ */
903
+ enteredWithPersistedLayout(): boolean;
904
+ /** Moves owned panel menus beside their owner's current region and removes orphan menus. */
905
+ reconcilePanelMenus(): void;
869
906
  onWillChangePersistenceScope(listener: (scope: LayoutScope | undefined) => void): {
870
907
  dispose(): void;
871
908
  };
@@ -982,6 +1019,7 @@ declare interface OpenWidgetInput {
982
1019
  resource?: ResourceRef;
983
1020
  title?: string;
984
1021
  region?: WorkbenchRegion_2;
1022
+ role?: WorkbenchWidgetRole;
985
1023
  ownerId?: string;
986
1024
  source?: ContributionSource;
987
1025
  pinned?: boolean;
@@ -999,7 +1037,9 @@ declare interface OpenWorkbenchPanelInput {
999
1037
  resource?: ResourceRef;
1000
1038
  title?: string;
1001
1039
  region?: WorkbenchRegion_2;
1040
+ role?: WorkbenchWidgetRole;
1002
1041
  pinned?: boolean;
1042
+ closable?: boolean;
1003
1043
  mountStrategy?: WorkbenchPanelMountStrategy;
1004
1044
  hiddenByDefault?: boolean;
1005
1045
  tab?: WorkbenchPanelTab;
@@ -1014,9 +1054,9 @@ declare type OpenWorkbenchTerminalOptions = OpenWorkbenchTerminalInput & {
1014
1054
  reveal?: boolean;
1015
1055
  };
1016
1056
 
1017
- declare type ParamValue = Parameters<NonNullable<ParamEditorProps["onChange"]>>[1];
1057
+ declare type ParamValue_2 = Parameters<NonNullable<ParamEditorProps["onChange"]>>[1];
1018
1058
 
1019
- export declare const paramValueToPreference: (schema: PreferencePropertySchema, value: ParamValue) => PreferenceValue;
1059
+ export declare const paramValueToPreference: (schema: PreferencePropertySchema, value: ParamValue_2) => PreferenceValue;
1020
1060
 
1021
1061
  declare interface PlaceholderContribution {
1022
1062
  id: string;
@@ -1072,6 +1112,9 @@ declare interface PreferenceScopeRef {
1072
1112
 
1073
1113
  declare type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;
1074
1114
 
1115
+ /** Narrows an editor value back to what a command param can carry. */
1116
+ export declare const readCommandParamValue: (value: ParamValue) => CommandParamValue;
1117
+
1075
1118
  declare interface RegisteredCommand extends RegisteredContributionMetadata {
1076
1119
  command: Command;
1077
1120
  handler: CommandHandler;
@@ -1133,7 +1176,6 @@ declare type RegisteredWidgetContribution = Omit<WidgetContribution, "priority"
1133
1176
  ownedPanelMenuIds?: readonly string[];
1134
1177
  singleton: boolean;
1135
1178
  reuse: WidgetReusePolicy;
1136
- role: WorkbenchWidgetRole;
1137
1179
  } & RegisteredContributionMetadata;
1138
1180
 
1139
1181
  declare interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {
@@ -1171,6 +1213,14 @@ declare interface ResourceContextAction {
1171
1213
  separatorBefore?: boolean;
1172
1214
  }
1173
1215
 
1216
+ declare interface ResourceHierarchyCycle {
1217
+ code: typeof resourceHierarchyCycleCode;
1218
+ path: ResourceRef[];
1219
+ repeatedUri: string;
1220
+ }
1221
+
1222
+ declare const resourceHierarchyCycleCode = "resource_hierarchy_cycle";
1223
+
1174
1224
  declare interface ResourceHierarchyProvider {
1175
1225
  id: string;
1176
1226
  priority?: number;
@@ -1243,6 +1293,7 @@ declare interface ResourceRegistry {
1243
1293
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1244
1294
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1245
1295
  walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1296
+ onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1246
1297
  isOpeningResource(): boolean;
1247
1298
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
1248
1299
  onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable_2;
@@ -1559,6 +1610,7 @@ declare interface WidgetContribution {
1559
1610
  mountStrategy?: WidgetMountStrategy;
1560
1611
  closable?: boolean;
1561
1612
  hiddenByDefault?: boolean;
1613
+ subPanelsOnly?: boolean;
1562
1614
  regionSize?: WorkbenchRegionSize;
1563
1615
  regionCollapsible?: boolean;
1564
1616
  headerBorderBottom?: boolean;
@@ -1567,7 +1619,6 @@ declare interface WidgetContribution {
1567
1619
  priority?: number;
1568
1620
  rendererId: string;
1569
1621
  openCommandId?: string;
1570
- role?: WorkbenchWidgetRole;
1571
1622
  eligibleLocations?: WorkbenchLocationEligibility;
1572
1623
  panelMenuOwner?: WorkbenchPanelMenuOwner;
1573
1624
  tab?: WorkbenchWidgetTab;
@@ -1704,6 +1755,20 @@ declare interface WorkbenchCommandParamsRequest {
1704
1755
  context?: WorkbenchCommandExecutionContext;
1705
1756
  }
1706
1757
 
1758
+ declare interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {
1759
+ contribution: RegisteredWidgetContribution;
1760
+ }
1761
+
1762
+ declare interface WorkbenchCompositionController {
1763
+ panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;
1764
+ }
1765
+
1766
+ declare interface WorkbenchCompositionRegionPanels {
1767
+ open: readonly WorkbenchWidgetPlacement[];
1768
+ addable: readonly WorkbenchCompositionAddablePanel[];
1769
+ closable: readonly string[];
1770
+ }
1771
+
1707
1772
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1708
1773
  host: WorkbenchHost;
1709
1774
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
@@ -1715,6 +1780,7 @@ declare interface WorkbenchCoreContributionContext {
1715
1780
  commandPalette: WorkbenchCommandPaletteController;
1716
1781
  commandPaletteResources: CommandPaletteResourceRegistry;
1717
1782
  commands: CommandRegistry;
1783
+ composition: WorkbenchCompositionController;
1718
1784
  context: ContextKeyService;
1719
1785
  focus: WorkbenchFocusController;
1720
1786
  history: HistoryController;
@@ -1723,6 +1789,7 @@ declare interface WorkbenchCoreContributionContext {
1723
1789
  layout: WorkbenchLayoutModel;
1724
1790
  modes: WorkbenchModeRegistry;
1725
1791
  navigation: NavigationRegistry;
1792
+ navigator: WorkbenchNavigator;
1726
1793
  notifications: NotificationRegistry;
1727
1794
  panels: WorkbenchPanelsController;
1728
1795
  preferences: PreferenceRegistry;
@@ -1850,7 +1917,7 @@ declare interface WorkbenchLayoutStoreState {
1850
1917
  placeholders: Partial<Record<WorkbenchRegion_2, RegisteredPlaceholderContribution>>;
1851
1918
  }
1852
1919
 
1853
- declare type WorkbenchLocationContribution = Omit<WidgetContribution, "role"> & WorkbenchPanelMenusContribution;
1920
+ declare type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;
1854
1921
 
1855
1922
  declare interface WorkbenchLocationEligibility {
1856
1923
  modeIds?: string[];
@@ -1891,15 +1958,31 @@ declare type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;
1891
1958
 
1892
1959
  declare type WorkbenchModeActivationResult = Disposable_2 | readonly Disposable_2[] | undefined;
1893
1960
 
1961
+ declare interface WorkbenchModeAddablePanel {
1962
+ panelId: string;
1963
+ region: WorkbenchPanelRegion;
1964
+ allowedRegions?: readonly WorkbenchRegion_2[];
1965
+ pinned?: boolean;
1966
+ }
1967
+
1968
+ declare interface WorkbenchModeAddablePanelContext {
1969
+ layout: WorkbenchLayout;
1970
+ resource?: ResourceRef;
1971
+ }
1972
+
1894
1973
  declare type WorkbenchModeChangeListener = () => void;
1895
1974
 
1896
1975
  declare interface WorkbenchModeContribution {
1897
1976
  id: string;
1898
1977
  label?: string;
1899
1978
  panels?: readonly WorkbenchPanelRegion[];
1979
+ resourceKinds?: readonly string[];
1980
+ defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);
1981
+ listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];
1900
1982
  activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1901
1983
  seed?(ctx: WorkbenchModeActivationContext): void;
1902
1984
  enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;
1985
+ reconcile?(ctx: WorkbenchModeActivationContext): void;
1903
1986
  }
1904
1987
 
1905
1988
  declare interface WorkbenchModeRegistry {
@@ -1946,6 +2029,14 @@ export declare interface WorkbenchModuleHostRegistration {
1946
2029
  disposable: Disposable_2;
1947
2030
  }
1948
2031
 
2032
+ declare interface WorkbenchNavigationCommit {
2033
+ modeId: string | undefined;
2034
+ resource: ResourceRef | undefined;
2035
+ replaceActive: boolean;
2036
+ }
2037
+
2038
+ declare type WorkbenchNavigationDiagnosticCode = "navigation_mode_missing" | "navigation_resource_missing" | "navigation_resource_incompatible" | "navigation_default_missing" | "navigation_target_stale";
2039
+
1949
2040
  declare interface WorkbenchNavigationEntry {
1950
2041
  entryId: string;
1951
2042
  recordedAt: number;
@@ -1960,6 +2051,53 @@ declare interface WorkbenchNavigationEntry {
1960
2051
  closedSubPanel?: WorkbenchClosedSubPanel;
1961
2052
  }
1962
2053
 
2054
+ declare type WorkbenchNavigationResult = {
2055
+ ok: true;
2056
+ modeId: string | undefined;
2057
+ resource: ResourceRef | undefined;
2058
+ } | {
2059
+ ok: false;
2060
+ code: WorkbenchNavigationDiagnosticCode;
2061
+ message: string;
2062
+ };
2063
+
2064
+ declare interface WorkbenchNavigationTarget {
2065
+ modeId?: string;
2066
+ resource?: ResourceRef;
2067
+ replaceActive?: boolean;
2068
+ }
2069
+
2070
+ declare interface WorkbenchNavigator {
2071
+ configure(hooks: WorkbenchNavigatorHostHooks): void;
2072
+ getSelectedResource(): ResourceRef | undefined;
2073
+ open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;
2074
+ commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;
2075
+ getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;
2076
+ forgetResource(uri: string): void;
2077
+ onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): {
2078
+ dispose(): void;
2079
+ };
2080
+ }
2081
+
2082
+ declare interface WorkbenchNavigatorCommitInput {
2083
+ modeId?: string | null;
2084
+ resource?: ResourceRef | null;
2085
+ replaceActive?: boolean;
2086
+ present?: boolean;
2087
+ }
2088
+
2089
+ declare interface WorkbenchNavigatorHostHooks {
2090
+ getProjectId?(): string | undefined;
2091
+ getSelectedResource?(): ResourceRef | undefined;
2092
+ interpretSelection?(resource: ResourceRef): ResourceRef | undefined;
2093
+ applySelection?(resource: ResourceRef | undefined): void;
2094
+ applyScope?(commit: WorkbenchNavigationCommit): void;
2095
+ applyBreadcrumb?(resource: ResourceRef | undefined): void;
2096
+ presentResource?(resource: ResourceRef, input: {
2097
+ replaceActive: boolean;
2098
+ }): Promise<unknown> | unknown;
2099
+ }
2100
+
1963
2101
  declare interface WorkbenchNotification {
1964
2102
  id?: string;
1965
2103
  level: WorkbenchNotificationLevel;
@@ -2020,6 +2158,8 @@ export declare interface WorkbenchOverlayWidgetConfig {
2020
2158
  contentHeight?: string;
2021
2159
  contentMaxHeight?: string;
2022
2160
  contentMinHeight?: string;
2161
+ contentWidth?: string;
2162
+ contentMaxWidth?: string;
2023
2163
  closeTriggerTop?: string;
2024
2164
  }
2025
2165
 
@@ -2030,11 +2170,11 @@ declare interface WorkbenchPanelContribution {
2030
2170
  region: WorkbenchRegion_2;
2031
2171
  fallbackRegion?: WorkbenchRegion_2;
2032
2172
  rendererId: string;
2033
- closable: boolean;
2034
2173
  singleton?: boolean;
2035
2174
  reuse?: WorkbenchPanelReusePolicy;
2036
2175
  mountStrategy?: WorkbenchPanelMountStrategy;
2037
2176
  hiddenByDefault?: boolean;
2177
+ subPanelsOnly?: boolean;
2038
2178
  regionSize?: WorkbenchRegionSize;
2039
2179
  regionCollapsible?: boolean;
2040
2180
  headerBorderBottom?: boolean;
@@ -2085,7 +2225,7 @@ declare interface WorkbenchPanelInstance_2 {
2085
2225
  tab?: WorkbenchPanelTab_2;
2086
2226
  }
2087
2227
 
2088
- declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2228
+ declare type WorkbenchPanelMenuContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2089
2229
  region: WorkbenchPanelMenuRegion;
2090
2230
  fallbackRegion?: WorkbenchPanelMenuRegion;
2091
2231
  };
@@ -2143,13 +2283,14 @@ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
2143
2283
  declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
2144
2284
 
2145
2285
  declare type WorkbenchPanelOpenStrategy = {
2146
- kind: "activate-or-open";
2286
+ kind: "persistent";
2147
2287
  position?: WorkbenchTabPosition;
2148
2288
  } | {
2149
2289
  kind: "replace-active";
2150
2290
  } | {
2151
2291
  kind: "replace-panel";
2152
2292
  instanceId: string;
2293
+ retention?: WorkbenchTabRetention;
2153
2294
  } | {
2154
2295
  kind: "preview";
2155
2296
  position?: WorkbenchTabPosition;
@@ -2342,7 +2483,7 @@ declare type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;
2342
2483
 
2343
2484
  declare type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;
2344
2485
 
2345
- declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion" | "role"> & {
2486
+ declare type WorkbenchSubPanelContribution = Omit<WidgetContribution, "region" | "fallbackRegion"> & {
2346
2487
  region: WorkbenchPanelRegion;
2347
2488
  fallbackRegion?: WorkbenchPanelRegion;
2348
2489
  } & WorkbenchPanelMenusContribution;