@pstdio/workbench 0.7.0 → 0.8.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.
@@ -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 // 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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"}
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 canOpenLocation?(location: { resource?: ResourceRef; viewId?: string }): 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 viewId?: 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 viewId?: 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 viewId?: string | null;\n resource?: ResourceRef | null;\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 /** Set by the view registry. Low-level layout callers should leave this undefined. */\n viewId?: string | null;\n /** `null` explicitly clears an existing singleton placement's resource binding. */\n resource?: ResourceRef | null;\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
@@ -178,6 +178,7 @@ declare interface CommandParamDescriptor {
178
178
  accept?: string;
179
179
  multiple?: boolean;
180
180
  metadata?: Record<string, unknown>;
181
+ resolvedFrom?: "resource";
181
182
  }
182
183
 
183
184
  export declare interface CommandParamEntry extends CommandParamDescriptor {
@@ -271,6 +272,7 @@ declare type ContributionSource = "module" | "extension";
271
272
  declare type ContributionSource_2 = "module" | "extension";
272
273
 
273
274
  declare interface ControllerTerminalBridgeOptions {
275
+ getBindingId?: () => string | undefined;
274
276
  getResource?: () => ResourceRef | undefined;
275
277
  getTitle?: () => string | undefined;
276
278
  }
@@ -670,6 +672,7 @@ declare interface HistoryController {
670
672
  restore(): HistoryEntry | undefined;
671
673
  flush(): void;
672
674
  clear(): void;
675
+ migrateState(transform: (state: HistoryStoreState) => HistoryStoreState): void;
673
676
  }
674
677
 
675
678
  declare type HistoryEntry = WorkbenchNavigationEntry;
@@ -1009,7 +1012,12 @@ declare interface NavigationTargetCompound {
1009
1012
  targets: readonly NavigationTargetItem[];
1010
1013
  }
1011
1014
 
1012
- declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetPanel | NavigationTargetCommand;
1015
+ declare interface NavigationTargetHref {
1016
+ kind: "href";
1017
+ href: string;
1018
+ }
1019
+
1020
+ declare type NavigationTargetItem = NavigationTargetResource | NavigationTargetView | NavigationTargetPanel | NavigationTargetCommand | NavigationTargetHref;
1013
1021
 
1014
1022
  declare interface NavigationTargetPanel {
1015
1023
  kind: "panel";
@@ -1023,6 +1031,12 @@ declare interface NavigationTargetResource {
1023
1031
  input?: OpenResourceInput;
1024
1032
  }
1025
1033
 
1034
+ declare interface NavigationTargetView {
1035
+ kind: "view";
1036
+ viewId: string;
1037
+ input?: OpenWorkbenchViewInput;
1038
+ }
1039
+
1026
1040
  declare const NO_GROUPING = "none";
1027
1041
 
1028
1042
  export declare const normalizeWorkbenchKeybinding: (keybinding: KeybindingSequence) => KeybindingSequence;
@@ -1041,7 +1055,8 @@ declare interface OpenResourceInput {
1041
1055
  }
1042
1056
 
1043
1057
  declare interface OpenWidgetInput {
1044
- resource?: ResourceRef;
1058
+ viewId?: string | null;
1059
+ resource?: ResourceRef | null;
1045
1060
  title?: string;
1046
1061
  region?: WorkbenchRegion_2;
1047
1062
  role?: WorkbenchWidgetRole;
@@ -1059,7 +1074,10 @@ declare interface OpenWidgetInput {
1059
1074
  }
1060
1075
 
1061
1076
  declare interface OpenWorkbenchPanelInput {
1062
- resource?: ResourceRef;
1077
+ /** Set by the view registry. Low-level layout callers should leave this undefined. */
1078
+ viewId?: string | null;
1079
+ /** `null` explicitly clears an existing singleton placement's resource binding. */
1080
+ resource?: ResourceRef | null;
1063
1081
  title?: string;
1064
1082
  region?: WorkbenchRegion_2;
1065
1083
  role?: WorkbenchWidgetRole;
@@ -1079,6 +1097,8 @@ declare type OpenWorkbenchTerminalOptions = OpenWorkbenchTerminalInput & {
1079
1097
  reveal?: boolean;
1080
1098
  };
1081
1099
 
1100
+ declare type OpenWorkbenchViewInput = Omit<OpenWorkbenchPanelInput, "viewId">;
1101
+
1082
1102
  declare type ParamValue_2 = Parameters<NonNullable<ParamEditorProps["onChange"]>>[1];
1083
1103
 
1084
1104
  export declare const paramValueToPreference: (schema: PreferencePropertySchema, value: ParamValue_2) => PreferenceValue;
@@ -1214,6 +1234,10 @@ declare interface RegisteredWorkbenchNotification extends RegisteredContribution
1214
1234
  metadata?: Record<string, unknown>;
1215
1235
  }
1216
1236
 
1237
+ declare type RegisteredWorkbenchStatusSet = WorkbenchStatusSetContribution & RegisteredContributionMetadata;
1238
+
1239
+ declare type RegisteredWorkbenchView = WorkbenchViewContribution & RegisteredContributionMetadata;
1240
+
1217
1241
  declare type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;
1218
1242
 
1219
1243
  declare type ResolvedResourcePresenter = Omit<ResourcePresenter, "priority"> & {
@@ -1242,7 +1266,7 @@ declare interface ResourceContextAction {
1242
1266
 
1243
1267
  declare interface ResourceHierarchyCycle {
1244
1268
  code: typeof resourceHierarchyCycleCode;
1245
- path: ResourceRef[];
1269
+ path: WorkbenchHierarchyNode[];
1246
1270
  repeatedUri: string;
1247
1271
  }
1248
1272
 
@@ -1252,7 +1276,7 @@ declare interface ResourceHierarchyProvider {
1252
1276
  id: string;
1253
1277
  priority?: number;
1254
1278
  canResolve(resource: ResourceRef): boolean;
1255
- getParent(resource: ResourceRef): ResourceRef | undefined;
1279
+ getParent(resource: ResourceRef): WorkbenchHierarchyNode | undefined;
1256
1280
  }
1257
1281
 
1258
1282
  declare interface ResourceKindContribution {
@@ -1320,7 +1344,7 @@ declare interface ResourceRegistry {
1320
1344
  listResources(query: string): readonly ResourceBrowseEntry[];
1321
1345
  registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable_2;
1322
1346
  listHierarchyProviders(): ResolvedResourceHierarchyProvider[];
1323
- walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];
1347
+ walkHierarchy(resource: ResourceRef | undefined): WorkbenchHierarchyNode[];
1324
1348
  onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable_2;
1325
1349
  isOpeningResource(): boolean;
1326
1350
  openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;
@@ -1816,6 +1840,7 @@ declare interface WorkbenchCompositionRegionPanels {
1816
1840
 
1817
1841
  declare interface WorkbenchCore extends WorkbenchCoreContributionContext {
1818
1842
  host: WorkbenchHost;
1843
+ layout: WorkbenchLayoutModel;
1819
1844
  registerModule(module: WorkbenchModuleContribution): Disposable_2;
1820
1845
  unregisterModule(moduleId: string): void;
1821
1846
  }
@@ -1831,7 +1856,7 @@ declare interface WorkbenchCoreContributionContext {
1831
1856
  history: HistoryController;
1832
1857
  keybindings: KeybindingRegistry;
1833
1858
  lastResource: WorkbenchLastResourceController;
1834
- layout: WorkbenchLayoutModel;
1859
+ layout: WorkbenchModuleLayoutModel;
1835
1860
  modes: WorkbenchModeRegistry;
1836
1861
  navigation: NavigationRegistry;
1837
1862
  navigator: WorkbenchNavigator;
@@ -1840,7 +1865,10 @@ declare interface WorkbenchCoreContributionContext {
1840
1865
  preferences: PreferenceRegistry;
1841
1866
  renderers: WorkbenchRenderers;
1842
1867
  resources: ResourceRegistry;
1868
+ views: WorkbenchViewRegistry;
1843
1869
  settings: SettingsRegistry;
1870
+ statusBar: WorkbenchStatusBarRegistry;
1871
+ statuses: WorkbenchStatusRegistry;
1844
1872
  shell: WorkbenchShellController;
1845
1873
  sidePanel: WorkbenchSidePanelController;
1846
1874
  terminal: WorkbenchTerminalController;
@@ -1902,6 +1930,8 @@ declare interface WorkbenchHeaderActionsProps {
1902
1930
  controlSize?: "2xs" | "xs";
1903
1931
  }
1904
1932
 
1933
+ declare type WorkbenchHierarchyNode = ResourceRef | WorkbenchViewHierarchyNode;
1934
+
1905
1935
  declare interface WorkbenchHost {
1906
1936
  getSnapshot(): WorkbenchSnapshot;
1907
1937
  restoreSnapshot(snapshot: WorkbenchSnapshot): void;
@@ -1969,11 +1999,16 @@ declare interface WorkbenchLocationEligibility {
1969
1999
  resourceKinds?: string[];
1970
2000
  resourceIds?: string[];
1971
2001
  canOpen?(resource: ResourceRef): boolean;
2002
+ canOpenLocation?(location: {
2003
+ resource?: ResourceRef;
2004
+ viewId?: string;
2005
+ }): boolean;
1972
2006
  }
1973
2007
 
1974
2008
  declare interface WorkbenchLocationRef {
1975
2009
  key: string;
1976
2010
  modeId?: string;
2011
+ viewId?: string;
1977
2012
  resource?: ResourceRef;
1978
2013
  contributionId?: string;
1979
2014
  instanceKey?: string;
@@ -2074,6 +2109,8 @@ export declare interface WorkbenchModuleHostRegistration {
2074
2109
  disposable: Disposable_2;
2075
2110
  }
2076
2111
 
2112
+ declare type WorkbenchModuleLayoutModel = Omit<WorkbenchLayoutModel, "registerWidget">;
2113
+
2077
2114
  declare interface WorkbenchNavigationCommit {
2078
2115
  modeId: string | undefined;
2079
2116
  resource: ResourceRef | undefined;
@@ -2087,9 +2124,10 @@ declare interface WorkbenchNavigationEntry {
2087
2124
  recordedAt: number;
2088
2125
  location: WorkbenchLocationRef;
2089
2126
  selectedSubPanels: Partial<Record<WorkbenchPanelRegion, WorkbenchSubPanelRef>>;
2090
- kind: "resource" | "widget" | "mode";
2127
+ kind: "resource" | "view" | "widget" | "mode";
2091
2128
  modeId?: string;
2092
2129
  resource?: ResourceRef;
2130
+ viewId?: string;
2093
2131
  widgetId?: string;
2094
2132
  contributionId?: string;
2095
2133
  title?: string;
@@ -2240,6 +2278,7 @@ declare interface WorkbenchPanelContribution {
2240
2278
  declare interface WorkbenchPanelInstance {
2241
2279
  instanceId: string;
2242
2280
  panelId: string;
2281
+ viewId?: string;
2243
2282
  ownerId?: string;
2244
2283
  source?: ContributionSource;
2245
2284
  resource?: ResourceRef;
@@ -2257,6 +2296,7 @@ declare interface WorkbenchPanelInstance {
2257
2296
  declare interface WorkbenchPanelInstance_2 {
2258
2297
  instanceId: string;
2259
2298
  panelId: string;
2299
+ viewId?: string;
2260
2300
  ownerId?: string;
2261
2301
  source?: ContributionSource_2;
2262
2302
  resource?: ResourceRef_2;
@@ -2513,6 +2553,52 @@ declare interface WorkbenchSnapshot {
2513
2553
  layout: WorkbenchLayout;
2514
2554
  }
2515
2555
 
2556
+ declare interface WorkbenchStatusBarItem {
2557
+ id: string;
2558
+ viewId: string;
2559
+ slot: WorkbenchStatusBarSlot;
2560
+ order?: number;
2561
+ isVisible?(): boolean;
2562
+ }
2563
+
2564
+ declare interface WorkbenchStatusBarRegistry {
2565
+ store: WorkbenchStore<WorkbenchStatusBarRegistryState>;
2566
+ registerItem(item: WorkbenchStatusBarItem): Disposable_2;
2567
+ getItem(id: string): WorkbenchStatusBarItem | undefined;
2568
+ listItems(): WorkbenchStatusBarItem[];
2569
+ listVisibleItems(slot?: WorkbenchStatusBarSlot): WorkbenchStatusBarItem[];
2570
+ }
2571
+
2572
+ declare interface WorkbenchStatusBarRegistryState {
2573
+ items: Record<string, WorkbenchStatusBarItem>;
2574
+ }
2575
+
2576
+ declare type WorkbenchStatusBarSlot = "leading" | "trailing";
2577
+
2578
+ declare interface WorkbenchStatusRegistry {
2579
+ store: WorkbenchStore<WorkbenchStatusRegistryState>;
2580
+ registerStatusSet(contribution: WorkbenchStatusSetContribution, metadata?: ContributionMetadata): Disposable_2;
2581
+ getStatusSet(id: string): RegisteredWorkbenchStatusSet | undefined;
2582
+ listStatusSets(): RegisteredWorkbenchStatusSet[];
2583
+ getStatuses(id: string): readonly WorkflowStatus[] | undefined;
2584
+ load(id: string): Promise<readonly WorkflowStatus[]>;
2585
+ query(id: string): Promise<readonly WorkflowStatus[]>;
2586
+ save(id: string, statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]>;
2587
+ }
2588
+
2589
+ declare interface WorkbenchStatusRegistryState {
2590
+ statusSets: Record<string, RegisteredWorkbenchStatusSet>;
2591
+ values: Record<string, readonly WorkflowStatus[]>;
2592
+ }
2593
+
2594
+ declare interface WorkbenchStatusSetContribution {
2595
+ id: string;
2596
+ title: string;
2597
+ actions?: readonly WorkflowStatusAction[];
2598
+ query(): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];
2599
+ save?(statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];
2600
+ }
2601
+
2516
2602
  declare interface WorkbenchStore<TState> {
2517
2603
  getState(): TState;
2518
2604
  getInitialState(): TState;
@@ -2557,6 +2643,7 @@ declare interface WorkbenchTerminalController {
2557
2643
  setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;
2558
2644
  /** Opens a session; the live adapter stays host-side and only the id is returned. */
2559
2645
  open(input: {
2646
+ bindingId?: string;
2560
2647
  request: WorkbenchTerminalSessionRequest;
2561
2648
  title?: string;
2562
2649
  }): Promise<{
@@ -2575,6 +2662,7 @@ declare interface WorkbenchTerminalController {
2575
2662
  sessionId: string;
2576
2663
  signal?: string;
2577
2664
  }): Promise<void>;
2665
+ killBinding(bindingId: string): Promise<void>;
2578
2666
  subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;
2579
2667
  getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;
2580
2668
  listSessions(): WorkbenchTerminalSessionModel[];
@@ -2586,8 +2674,8 @@ declare interface WorkbenchTerminalController {
2586
2674
  * Body of the host-owned terminal panel. Chrome (tab, title, close action,
2587
2675
  * resize) comes from the workbench `secondary` region; this component only mounts
2588
2676
  * the terminal bound to the workbench terminal controller. Collapsing the panel
2589
- * keeps the terminal mounted. Closing its tab unmounts the terminal and kills
2590
- * its session (close = kill).
2677
+ * keeps the terminal mounted. Scope changes keep the session alive; the terminal
2678
+ * module ends it when its tab is explicitly closed.
2591
2679
  */
2592
2680
  export declare const WorkbenchTerminalPanel: (props: WorkbenchTerminalPanelProps) => JSX.Element;
2593
2681
 
@@ -2678,6 +2766,54 @@ declare interface WorkbenchTreeViewProps {
2678
2766
  onSidenavContextActionsChange?: (actions: ResourceContextAction_2[]) => void;
2679
2767
  }
2680
2768
 
2769
+ declare interface WorkbenchViewContribution {
2770
+ id: string;
2771
+ panelId: string;
2772
+ title?: string;
2773
+ icon?: string;
2774
+ path?: string;
2775
+ pathAliases?: readonly string[];
2776
+ aliases?: readonly string[];
2777
+ resource?: ResourceRef;
2778
+ canResolve?(): boolean;
2779
+ resolveInput?(input: OpenWorkbenchViewInput): OpenWorkbenchPanelInput;
2780
+ }
2781
+
2782
+ declare interface WorkbenchViewHierarchyNode {
2783
+ type: "view";
2784
+ viewId: string;
2785
+ label?: string;
2786
+ icon?: string;
2787
+ }
2788
+
2789
+ declare interface WorkbenchViewOpenEvent {
2790
+ viewId: string;
2791
+ input: OpenWorkbenchViewInput;
2792
+ instance: WorkbenchPanelInstance;
2793
+ }
2794
+
2795
+ declare interface WorkbenchViewRegistry {
2796
+ store: WorkbenchStore<WorkbenchViewRegistryStoreState>;
2797
+ registerView(view: WorkbenchViewContribution, metadata?: ContributionMetadata): Disposable_2;
2798
+ getView(viewId: string): RegisteredWorkbenchView | undefined;
2799
+ listViews(): RegisteredWorkbenchView[];
2800
+ resolveViewId(viewId: string): string | undefined;
2801
+ resolvePath(path: string): {
2802
+ kind: "view";
2803
+ viewId: string;
2804
+ } | undefined;
2805
+ canResolveView(viewId: string): boolean;
2806
+ isOpeningView(): boolean;
2807
+ openView(viewId: string, input?: OpenWorkbenchViewInput): Promise<WorkbenchPanelInstance>;
2808
+ onDidOpenView(listener: (event: WorkbenchViewOpenEvent) => void): Disposable_2;
2809
+ }
2810
+
2811
+ declare interface WorkbenchViewRegistryStoreState {
2812
+ views: Record<string, RegisteredWorkbenchView>;
2813
+ aliases: Record<string, string>;
2814
+ paths: Record<string, string>;
2815
+ }
2816
+
2681
2817
  export declare const WorkbenchWidgetHost: (props: WorkbenchWidgetHostProps) => JSX.Element;
2682
2818
 
2683
2819
  declare interface WorkbenchWidgetHostProps {
@@ -2689,6 +2825,7 @@ declare interface WorkbenchWidgetHostProps {
2689
2825
  declare interface WorkbenchWidgetPlacement {
2690
2826
  widgetId: string;
2691
2827
  contributionId: string;
2828
+ viewId?: string;
2692
2829
  ownerId?: string;
2693
2830
  source?: ContributionSource;
2694
2831
  resource?: ResourceRef;
@@ -2718,4 +2855,35 @@ declare interface WorkbenchWidgetTab_2 {
2718
2855
  customMenuRendererId?: string;
2719
2856
  }
2720
2857
 
2858
+ declare interface WorkflowStatus {
2859
+ id: string;
2860
+ label: string;
2861
+ color: string;
2862
+ icon?: string | null;
2863
+ sortOrder: number;
2864
+ isDefault?: boolean;
2865
+ board?: WorkflowStatusBoardRules;
2866
+ }
2867
+
2868
+ declare interface WorkflowStatusAction {
2869
+ id: string;
2870
+ label: string;
2871
+ icon?: string;
2872
+ }
2873
+
2874
+ declare interface WorkflowStatusBoardRules {
2875
+ canCreate?: boolean;
2876
+ canDragIn?: boolean;
2877
+ canDragOut?: boolean;
2878
+ actions?: readonly string[];
2879
+ }
2880
+
2881
+ export declare const WorkflowStatusSettings: (props: WorkflowStatusSettingsProps) => JSX.Element;
2882
+
2883
+ declare interface WorkflowStatusSettingsProps {
2884
+ workbench: {
2885
+ statuses: WorkbenchStatusRegistry;
2886
+ };
2887
+ }
2888
+
2721
2889
  export { }