@pstdio/workbench 0.3.0 → 0.5.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-key-service-B2K9LAec.js","sources":["../src/core/shared/disposable.ts","../src/core/shared/store/workbench-store.ts","../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/panel-widget-eligibility.ts","../src/core/shared/contributions/metadata.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/layout/panel-api.ts","../src/core/registries/layout/surface-reconcile.ts","../src/core/registries/modes/mode-registry.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/resources/resource-registry.ts","../src/core/shared/context/context-key-service.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","import { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return api.subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe: api.subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","import type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionState,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { workbenchPanelRegions } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceUri: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceUri === resourceUri,\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const createUniqueWidgetId = (layout: WorkbenchLayout, contributionId: string) => {\n const widgetIds = new Set(\n Object.values(layout.regions).flatMap((region) => region.widgets.map((placement) => placement.widgetId)),\n );\n return resolveUniqueWidgetId(widgetIds, contributionId);\n};\n\nexport const getActivePlacement = (region: WorkbenchRegionState) =>\n region.widgets.find((placement) => placement.widgetId === region.activeWidgetId) ?? region.widgets[0];\n\nconst isLocationPlacement = (placement: WorkbenchWidgetPlacement) => placement.role === \"location\";\n\nexport const locationWorkspaceKey = (placement: WorkbenchWidgetPlacement) =>\n placement.resourceUri ?? `${placement.contributionId}:${placement.widgetId}`;\n\nexport const setLocationSubPanelSelection = (\n layout: WorkbenchLayout,\n location: WorkbenchWidgetPlacement | undefined,\n region: WorkbenchPanelRegion,\n widgetId: string | undefined,\n) => {\n if (!location) return layout;\n const key = locationWorkspaceKey(location);\n const current = layout.locationSubPanelSelections?.[key] ?? {};\n const next = { ...current };\n if (widgetId) next[region] = widgetId;\n else delete next[region];\n return {\n ...layout,\n locationSubPanelSelections: {\n ...layout.locationSubPanelSelections,\n [key]: next,\n },\n };\n};\n\nexport const removeLocationSubPanelSelection = (layout: WorkbenchLayout, widgetId: string) => {\n if (!layout.locationSubPanelSelections) return layout;\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections).map(([key, selections]) => [\n key,\n Object.fromEntries(Object.entries(selections).filter(([, selectedId]) => selectedId !== widgetId)),\n ]),\n ) as WorkbenchLayout[\"locationSubPanelSelections\"];\n return { ...layout, locationSubPanelSelections };\n};\n\nexport const getActiveLocationPlacement = (layout: WorkbenchLayout) => {\n const locations = layout.regions.main.widgets.filter(isLocationPlacement);\n return locations.find((placement) => placement.widgetId === layout.activeLocationWidgetId) ?? locations.at(-1);\n};\n\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.resource) {\n next.resource = update.resource;\n next.resourceUri = update.resource.uri;\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.tabRetention !== undefined) next.tabRetention = update.tabRetention;\n if (update.tab !== undefined) next.tab = update.tab;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n return next;\n};\n\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource,\n resourceUri: spec.resource?.uri,\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n tabRetention: spec.tabRetention,\n tab: spec.tab ?? widget.tab,\n role: widget.role,\n});\n\ninterface ReplaceRegionWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\n\nexport const replaceRegionWidgets = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceRegionWidgetsOptions = {},\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n const widgets = update(region.widgets);\n const activeWidgetId =\n options.activeWidgetId !== undefined\n ? options.activeWidgetId\n : options.clearActiveWidget\n ? undefined\n : region.activeWidgetId;\n\n return {\n ...layout,\n activeLocationWidgetId:\n regionId === \"main\" && !widgets.some((placement) => placement.widgetId === layout.activeLocationWidgetId)\n ? widgets.filter(isLocationPlacement).at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, widgets, activeWidgetId },\n },\n };\n};\n\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter((placement) => placement.contributionId === contributionId);\n const filtered = region.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === region.widgets.length) continue;\n const activeWidgetId =\n region.activeWidgetId && !filtered.some((placement) => placement.widgetId === region.activeWidgetId)\n ? undefined\n : region.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n regions: {\n ...nextLayout.regions,\n [region.id]: { ...region, widgets: filtered, activeWidgetId },\n },\n };\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const hasActiveWidget = Object.values(nextLayout.regions).some((region) =>\n region.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceUri: undefined };\n }\n\n if (\n nextLayout.activeLocationWidgetId &&\n !nextLayout.regions.main.widgets.some((placement) => placement.widgetId === nextLayout.activeLocationWidgetId)\n ) {\n nextLayout = {\n ...nextLayout,\n activeLocationWidgetId: nextLayout.regions.main.widgets.filter(isLocationPlacement).at(-1)?.widgetId,\n };\n }\n\n return nextLayout;\n};\n\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n\n const region = layout.regions[found.regionId];\n const widgets = region.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = region.activeWidgetId === widgetId || (!region.activeWidgetId && found.index === 0);\n const fallbackSubPanel =\n found.placement.role === \"sub-panel\"\n ? widgets.find(\n (placement) =>\n placement.role === \"sub-panel\" && placement.ownerResourceUri === found.placement.ownerResourceUri,\n )\n : undefined;\n const nextActivePlacement =\n fallbackSubPanel ??\n (found.placement.role === \"sub-panel\" && found.regionId === \"main\"\n ? getActiveLocationPlacement(layout)\n : (widgets[found.index] ?? widgets[found.index - 1]));\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : region.activeWidgetId;\n const nextRegion = { ...region, widgets, activeWidgetId };\n let nextLayout: WorkbenchLayout = removeLocationSubPanelSelection(\n {\n ...layout,\n activeLocationWidgetId:\n layout.activeLocationWidgetId === widgetId\n ? layout.regions.main.widgets\n .filter((placement) => placement.widgetId !== widgetId && isLocationPlacement(placement))\n .at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [region.id]: nextRegion,\n },\n },\n widgetId,\n );\n\n if (\n closingEffectiveActive &&\n found.regionId !== \"side\" &&\n workbenchPanelRegions.includes(found.regionId as WorkbenchPanelRegion)\n ) {\n nextLayout = setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n found.regionId as WorkbenchPanelRegion,\n nextActivePlacement?.role === \"sub-panel\" ? nextActivePlacement.widgetId : undefined,\n );\n }\n\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceUri: nextActivePlacement?.resourceUri,\n };\n }\n\n return {\n regionId: found.regionId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextRegion),\n layout: nextLayout,\n };\n};\n\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n if (regionId === \"main\" && isLocationPlacement(placement)) {\n const selections = layout.locationSubPanelSelections?.[locationWorkspaceKey(placement)] ?? {};\n const regions = { ...layout.regions };\n for (const panelRegion of workbenchPanelRegions) {\n const panel = regions[panelRegion];\n const selectedId = selections[panelRegion];\n const selected = panel.widgets.find(\n (candidate) =>\n candidate.widgetId === selectedId &&\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceUri || candidate.ownerResourceUri === placement.resourceUri),\n );\n regions[panelRegion] = {\n ...panel,\n activeWidgetId:\n panelRegion === \"side\"\n ? panel.activeWidgetId\n : (selected?.widgetId ?? (panelRegion === \"main\" ? placement.widgetId : undefined)),\n };\n }\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: placement.widgetId,\n activeResourceUri: placement.resourceUri,\n regions,\n };\n }\n\n const withSelection =\n placement.role === \"sub-panel\" &&\n regionId !== \"side\" &&\n workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n layout,\n getActiveLocationPlacement(layout),\n regionId as WorkbenchPanelRegion,\n placement.widgetId,\n )\n : layout;\n return {\n ...withSelection,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: layout.activeLocationWidgetId,\n activeResourceUri: placement.resourceUri,\n regions: {\n ...withSelection.regions,\n [regionId]: { ...region, activeWidgetId: placement.widgetId },\n },\n };\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActiveLocationPlacement } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\ninterface PanelWidgetEligibilityInput {\n widget: RegisteredWidgetContribution;\n layout: WorkbenchLayout;\n region: WorkbenchPanelRegion;\n resource?: ResourceRef;\n modeId?: string;\n}\n\ninterface ListEligiblePanelWidgetsInput {\n widgets: RegisteredWidgetContribution[];\n layout: WorkbenchLayout;\n region: WorkbenchPanelRegion;\n resource?: ResourceRef;\n modeId?: string;\n}\n\nconst supportsPanelRegion = (widget: RegisteredWidgetContribution, region: WorkbenchPanelRegion) =>\n widget.region === region || widget.fallbackRegion === region;\n\nconst supportsResource = (widget: RegisteredWidgetContribution, resource: ResourceRef | undefined) => {\n if (widget.resourceKinds?.length && (!resource || !widget.resourceKinds.includes(resource.kind))) return false;\n if (widget.canOpen && (!resource || !widget.canOpen(resource))) return false;\n return true;\n};\n\nexport const getActiveWorkbenchSubPanel = (\n layout: WorkbenchLayout,\n region: WorkbenchPanelRegion,\n resource: ResourceRef | undefined,\n options: { ignoreOwnerResourceUri?: boolean } = {},\n) => {\n const panel = layout.regions[region];\n return panel.widgets.find(\n (placement) =>\n placement.widgetId === panel.activeWidgetId &&\n placement.role === \"sub-panel\" &&\n (options.ignoreOwnerResourceUri || !placement.ownerResourceUri || placement.ownerResourceUri === resource?.uri),\n );\n};\n\nexport const getActiveWorkbenchLocationPanel = (layout: WorkbenchLayout) => getActiveLocationPlacement(layout);\n\nexport const matchesWorkbenchLocationEligibility = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n) => {\n const eligibleLocations = widget.eligibleLocations;\n if (!matchesWorkbenchModeEligibility(widget, modeId)) return false;\n if (\n eligibleLocations?.resourceKinds?.length &&\n (!resource || !eligibleLocations.resourceKinds.includes(resource.kind))\n ) {\n return false;\n }\n if (\n eligibleLocations?.resourceIds?.length &&\n (!resource?.id || !eligibleLocations.resourceIds.includes(resource.id))\n ) {\n return false;\n }\n if (eligibleLocations?.canOpen && (!resource || !eligibleLocations.canOpen(resource))) return false;\n if (placement?.ownerResourceUri && placement.ownerResourceUri !== resource?.uri) return false;\n return true;\n};\n\nexport const matchesWorkbenchModeEligibility = (widget: RegisteredWidgetContribution, modeId: string | undefined) => {\n const eligibleModeIds = widget.eligibleLocations?.modeIds;\n return !eligibleModeIds?.length || (modeId !== undefined && eligibleModeIds.includes(modeId));\n};\n\nexport const matchesWorkbenchPanelPlacementLocation = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement: WorkbenchWidgetPlacement,\n options: { ignoreResourceLocation?: boolean } = {},\n) => {\n if (!supportsResource(widget, placement.resource ?? resource)) return false;\n if (options.ignoreResourceLocation) return matchesWorkbenchModeEligibility(widget, modeId);\n return matchesWorkbenchLocationEligibility(widget, resource, modeId, placement);\n};\n\nexport const allowsWorkbenchFloatingPanels = (\n layout: WorkbenchLayout,\n widgets: readonly RegisteredWidgetContribution[],\n) => {\n const activeMainPanel =\n layout.regions.main.widgets.find((placement) => placement.widgetId === layout.regions.main.activeWidgetId) ??\n getActiveLocationPlacement(layout);\n if (!activeMainPanel) return true;\n\n return widgets.find((widget) => widget.id === activeMainPanel.contributionId)?.floatingPanels !== \"hidden\";\n};\n\nexport const matchesWorkbenchPanelMenuOwner = (\n widget: RegisteredWidgetContribution,\n context: {\n locationPanel?: WorkbenchWidgetPlacement;\n subPanel?: WorkbenchWidgetPlacement;\n },\n) => {\n const owner = widget.panelMenuOwner ?? { level: \"panel\" };\n if (context.subPanel) {\n return owner.level === \"sub-panel\" && context.subPanel.contributionId === owner.contributionId;\n }\n if (owner.level === \"panel\") {\n return !owner.contributionId || context.locationPanel?.contributionId === owner.contributionId;\n }\n return false;\n};\n\nconst hasOpenSingleton = (\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n resource: ResourceRef | undefined,\n) =>\n widget.singleton &&\n Object.values(layout.regions).some((region) =>\n region.widgets.some(\n (placement) => placement.contributionId === widget.id && placement.ownerResourceUri === resource?.uri,\n ),\n );\n\nexport const isSubPanelEligible = (input: PanelWidgetEligibilityInput) =>\n input.widget.role === \"sub-panel\" &&\n supportsPanelRegion(input.widget, input.region) &&\n supportsResource(input.widget, input.resource) &&\n matchesWorkbenchLocationEligibility(input.widget, input.resource, input.modeId) &&\n !hasOpenSingleton(input.widget, input.layout, input.resource);\n\nexport const listEligibleSubPanels = (input: ListEligiblePanelWidgetsInput) =>\n input.widgets.filter((widget) => isSubPanelEligible({ ...input, widget }));\n","export type ContributionSource = \"module\" | \"extension\";\n\nexport interface ContributionMetadata {\n source?: ContributionSource;\n ownerId?: string;\n priority?: number;\n}\n\nexport interface RegisteredContributionMetadata {\n source: ContributionSource;\n ownerId: string;\n priority: number;\n}\n\nconst defaultContributionOwnerId = \"workbench.core\";\n\nexport const normalizeContributionMetadata = (metadata: ContributionMetadata = {}) => ({\n source: metadata.source ?? \"module\",\n ownerId: metadata.ownerId ?? defaultContributionOwnerId,\n priority: metadata.priority ?? 0,\n});\n\nexport const byContributionPriority = (left: RegisteredContributionMetadata, right: RegisteredContributionMetadata) =>\n right.priority - left.priority || left.ownerId.localeCompare(right.ownerId);\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\n\nexport interface Keybinding {\n commandId: string;\n keybinding: KeybindingSequence;\n when?: string;\n args?: unknown;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (!deps.commands.getCommand(keybinding.commandId))\n throw new Error(`Keybinding command not registered: ${keybinding.commandId}`);\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n };\n};\n","import type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n RegisteredWidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchTabRetention,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\n// Without a `defaultTabRetention` the retention of an existing placement is left alone,\n// so updating a panel's title never promotes a preview tab.\nexport const toOpenWidgetInput = (\n input: OpenWorkbenchPanelInput = {},\n defaultTabRetention?: WorkbenchTabRetention,\n): OpenWidgetInput => {\n const { strategy, ...shared } = input;\n if (!strategy) return { ...shared, tabRetention: defaultTabRetention };\n if (strategy.kind === \"persistent\") {\n return { ...shared, tabPosition: strategy.position, tabRetention: \"persistent\" };\n }\n if (strategy.kind === \"replace-active\") return { ...shared, replaceActive: true };\n if (strategy.kind === \"replace-panel\") {\n return { ...shared, replaceWidgetId: strategy.instanceId, tabRetention: strategy.retention };\n }\n return { ...shared, tabRetention: \"preview\", tabPosition: strategy.position };\n};\n\nexport const toPanelInstance = (placement: WorkbenchWidgetPlacement): WorkbenchPanelInstance => ({\n instanceId: placement.widgetId,\n panelId: placement.contributionId,\n ownerId: placement.ownerId,\n source: placement.source,\n resource: placement.resource,\n resourceUri: placement.resourceUri,\n ownerResourceUri: placement.ownerResourceUri,\n title: placement.title,\n pinned: placement.pinned,\n closable: placement.closable === true,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n tabRetention: placement.tabRetention,\n tab: placement.tab,\n});\n\nexport const toPanelContribution = (widget: RegisteredWidgetContribution): WorkbenchPanelContribution => {\n const { ownedPanelMenuIds: _ownedPanelMenuIds, role: _role, ...panel } = widget;\n return { ...panel, closable: panel.closable === true };\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActivePlacement } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\nimport { type AnchorId, getSurface, listAnchorRegions, resolveAnchorRegion } from \"./surface-map\";\n\n// The resource an anchor currently hosts, read from its region's active placement. This\n// is the primary-scoped signal the coordinator keys off — `getAnchorResource(layout,\n// \"primary\")` is the main resource, free of the global active-resource pollution that\n// any side-region activation otherwise introduces.\nexport const getAnchorResource = (layout: WorkbenchLayout, anchorId: AnchorId) =>\n getActivePlacement(layout.regions[resolveAnchorRegion(anchorId)])?.resource;\n\n// What the coordinator should do with a secondary anchor when the primary resource\n// changes. Projections re-render off their anchor (a render concern), so the reconciler\n// only decides the lifecycle of the derived/detached anchor placements.\nexport type AnchorReconcileAction = { region: WorkbenchRegion; action: \"keep\" | \"clear\" };\n\nexport interface ReconcileAnchorsInput {\n layout: WorkbenchLayout;\n primary: ResourceRef | undefined;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scoped candidates. Backed by scoped resource providers once wired.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// On a primary change: derived anchors re-scope (clear, then repopulate from the new\n// scope); detached anchors stay while their resource is still in scope, else disconnect\n// (scope wins). The primary anchor is the subject and is never reconciled.\nexport const reconcileAnchors = ({ layout, primary, isInScope }: ReconcileAnchorsInput): AnchorReconcileAction[] => {\n const actions: AnchorReconcileAction[] = [];\n\n for (const region of listAnchorRegions()) {\n const surface = getSurface(region);\n if (surface.role !== \"anchor\" || surface.persistence === \"primary\") continue;\n\n // Only resource-bearing anchor placements are scoped content. A plain (resourceless)\n // widget parked in a side anchor is not a scoped resource and is left untouched.\n const placement = getActivePlacement(layout.regions[region]);\n if (!placement?.resource) continue;\n\n // Sub Panels are subordinate to their Location workspace. A Location switch\n // changes which placement is selected and rendered; it must not delete the\n // placements retained for the Location that is leaving the foreground.\n if (placement.role === \"sub-panel\" && placement.ownerResourceUri) {\n actions.push({ region, action: \"keep\" });\n continue;\n }\n\n if (surface.persistence === \"derived\") {\n actions.push({ region, action: \"clear\" });\n continue;\n }\n\n actions.push({ region, action: isInScope(placement.resource, primary) ? \"keep\" : \"clear\" });\n }\n\n return actions;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCoreContributionContext } from \"../../workbench-core\";\nimport {\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\n\nexport type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;\n\nexport type WorkbenchModeActivationResult = Disposable | readonly Disposable[] | undefined;\n\nexport interface WorkbenchModeContribution {\n id: string;\n label?: string;\n panels?: readonly WorkbenchPanelRegion[];\n // Registers the mode's contributions once for the lifetime of the mode.\n activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n // Seeds defaults once for each layout persistence scope.\n seed?(ctx: WorkbenchModeActivationContext): void;\n // Activates non-layout behavior while the mode is current.\n enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n}\n\nexport type WorkbenchModeChangeListener = () => void;\n\nexport interface WorkbenchModeStoreState {\n modes: Record<string, WorkbenchModeContribution>;\n activeModeId: string | undefined;\n}\n\nexport interface WorkbenchModeRegistry {\n store: WorkbenchStore<WorkbenchModeStoreState>;\n dispose(): void;\n registerMode(mode: WorkbenchModeContribution): Disposable;\n getMode(id: string): WorkbenchModeContribution | undefined;\n listModes(): WorkbenchModeContribution[];\n getActiveModeId(): string | undefined;\n isTransitioning(): boolean;\n setActiveMode(id: string | undefined, input?: { deferSeed?: boolean }): void;\n seedActiveMode(): void;\n onDidChangeActive(listener: WorkbenchModeChangeListener): Disposable;\n}\n\nconst toDisposables = (result: WorkbenchModeActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nconst modePanelRegions = {\n main: [\"main-header\", \"main-left-menu\", \"main\", \"main-right-menu\"],\n secondary: [\"secondary-header\", \"secondary-left-menu\", \"secondary\", \"secondary-right-menu\"],\n side: [\"side-header\", \"side-left-menu\", \"side\", \"side-right-menu\"],\n} as const satisfies Record<WorkbenchPanelRegion, readonly WorkbenchRegion[]>;\n\nconst allModeRegions = Object.values(modePanelRegions).flat();\nconst panelsForMode = (mode: WorkbenchModeContribution) => mode.panels ?? workbenchPanelRegions;\n\nexport const getWorkbenchModePanelForRegion = (region: WorkbenchRegion) =>\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).find((panel) =>\n modePanelRegions[panel].some((candidate) => candidate === region),\n );\n\nexport const isWorkbenchModePanelAvailable = (\n mode: WorkbenchModeContribution | undefined,\n panel: WorkbenchPanelRegion,\n) => !mode || panelsForMode(mode).includes(panel);\n\nconst placementById = (layout: WorkbenchLayout, widgetId: string | undefined) => {\n if (!widgetId) return undefined;\n return Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === widgetId);\n};\n\nconst withActivePlacement = (\n layout: WorkbenchLayout,\n candidates: readonly (WorkbenchWidgetPlacement | undefined)[],\n) => {\n const active = candidates.find((placement) => placement && placementById(layout, placement.widgetId));\n return {\n ...layout,\n activeWidgetId: active?.widgetId,\n activeResourceUri: active?.resourceUri,\n };\n};\n\nconst clearRegions = (layout: WorkbenchLayout, regionIds: readonly WorkbenchRegion[]) => {\n if (regionIds.length === 0) return layout;\n const clearedPanels = new Set(\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).filter((panel) =>\n modePanelRegions[panel].some((region) => regionIds.includes(region)),\n ),\n );\n const regionsNeedClearing = regionIds.some((regionId) => {\n const region = layout.regions[regionId];\n return region.widgets.length > 0 || region.activeWidgetId !== undefined || region.visible;\n });\n const selectionsNeedClearing = Object.values(layout.locationSubPanelSelections ?? {}).some((selections) =>\n Object.keys(selections).some((panel) => clearedPanels.has(panel as WorkbenchPanelRegion)),\n );\n if (!regionsNeedClearing && !selectionsNeedClearing) return layout;\n\n const regions = { ...layout.regions };\n for (const regionId of regionIds) {\n regions[regionId] = { ...regions[regionId], widgets: [], activeWidgetId: undefined, visible: false };\n }\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections ?? {}).map(([resourceUri, selections]) => [\n resourceUri,\n Object.fromEntries(\n Object.entries(selections).filter(([panel]) => !clearedPanels.has(panel as WorkbenchPanelRegion)),\n ),\n ]),\n );\n const next = { ...layout, regions };\n return {\n ...withActivePlacement(next, [placementById(next, layout.activeWidgetId)]),\n activeLocationWidgetId: placementById(next, layout.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections,\n };\n};\n\nconst applyModePanelAvailability = (layout: WorkbenchLayout, panels: readonly WorkbenchPanelRegion[]) => {\n const available = new Set(panels);\n const unavailableRegions = (Object.keys(modePanelRegions) as WorkbenchPanelRegion[])\n .filter((panel) => !available.has(panel))\n .flatMap((panel) => modePanelRegions[panel]);\n return clearRegions(layout, unavailableRegions);\n};\n\nconst restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n) => {\n if (!saved) {\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) {\n const region = regions[regionId];\n const widgets = region.widgets.filter((placement) => placement.role !== \"content\");\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n const withoutModeContent = { ...current, regions };\n return applyModePanelAvailability(\n {\n ...withActivePlacement(withoutModeContent, [placementById(withoutModeContent, current.activeWidgetId)]),\n activeLocationWidgetId: placementById(withoutModeContent, current.activeLocationWidgetId)?.widgetId,\n },\n panels,\n );\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, regions }, panels);\n const savedActive = placementById(merged, saved.activeWidgetId);\n const currentActive = placementById(merged, current.activeWidgetId);\n return {\n ...withActivePlacement(merged, [savedActive, currentActive]),\n activeLocationWidgetId:\n placementById(merged, saved.activeLocationWidgetId)?.widgetId ??\n placementById(merged, current.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections: saved.locationSubPanelSelections,\n };\n};\n\nconst disposeReverse = (disposables: readonly Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n disposables[index]?.dispose();\n }\n};\n\nconst restoreModeLayout = (context: WorkbenchModeActivationContext, layout: WorkbenchLayout) => {\n if (layout !== context.layout.getLayout()) context.layout.restoreLayout(layout);\n for (const panel of workbenchPanelRegions) context.panels.setOpen(panel, layout.regions[panel].visible);\n};\n\nexport interface CreateWorkbenchModeRegistryInput {\n establishLocation?(instanceId: string): void;\n resolveContext(): WorkbenchModeActivationContext;\n}\n\nexport const createWorkbenchModeRegistry = (input: CreateWorkbenchModeRegistryInput): WorkbenchModeRegistry => {\n const store = createWorkbenchStore<WorkbenchModeStoreState>({\n name: \"workbench.modes\",\n initialState: { modes: {}, activeModeId: undefined },\n });\n\n const initializedModes = new Map<string, Disposable[]>();\n const seededScopes = new Set<string>();\n const unscopedLayouts = new Map<string, WorkbenchLayout>();\n let activeDisposables: Disposable[] = [];\n let activeModeContext: Disposable | undefined;\n let deferredSeedModeId: string | undefined;\n let transitioning = false;\n\n const initializeMode = (mode: WorkbenchModeContribution) => {\n if (initializedModes.has(mode.id)) return;\n const disposables = toDisposables(mode.activate(input.resolveContext()));\n initializedModes.set(mode.id, disposables);\n };\n\n const seedScope = (mode: WorkbenchModeContribution) => {\n const context = input.resolveContext();\n const scopeKey = `${mode.id}\\0${context.layout.getPersistenceScope() ?? \"unscoped\"}`;\n const currentLayout = context.layout.getLayout();\n const availableLayout = applyModePanelAvailability(currentLayout, panelsForMode(mode));\n restoreModeLayout(context, availableLayout);\n if (seededScopes.has(scopeKey)) return;\n\n let locationEstablished = false;\n let unsubscribeMainPanel: () => void = () => undefined;\n const establishSeededLocation = () => {\n if (locationEstablished) return;\n const primary = context.layout.getActivePanel(\"main\");\n if (!primary) return;\n // Sub Panels cannot become Locations; keep waiting for a Location-capable\n // placement instead of consuming the one-shot on a tab.\n const placement = context.layout\n .getLayout()\n .regions.main.widgets.find((candidate) => candidate.widgetId === primary.instanceId);\n if (placement && (placement.role === \"sub-panel\" || placement.role === \"panel-menu\")) return;\n locationEstablished = true;\n unsubscribeMainPanel();\n input.establishLocation?.(primary.instanceId);\n };\n\n unsubscribeMainPanel = context.layout.store.subscribeSelector(\n (state) => state.layout.regions.main,\n establishSeededLocation,\n );\n try {\n mode.seed?.(context);\n establishSeededLocation();\n seededScopes.add(scopeKey);\n } finally {\n unsubscribeMainPanel();\n }\n };\n\n const disposeActive = () => {\n disposeReverse(activeDisposables);\n activeDisposables = [];\n activeModeContext?.dispose();\n activeModeContext = undefined;\n };\n\n const activate = (id: string, options: { seed: boolean }) => {\n const context = input.resolveContext();\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n\n const contextScope = context.context.createScope(\"workbench.mode\");\n contextScope.set(\"activeWorkbenchMode\", id);\n contextScope.set(`workbenchMode.${id}`, true);\n activeModeContext = contextScope;\n try {\n initializeMode(mode);\n store.setState({ ...store.getState(), activeModeId: id }, false, \"activateMode\");\n if (options.seed) seedScope(mode);\n activeDisposables = toDisposables(mode.enter?.(context));\n } catch (error) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n throw error;\n }\n };\n\n const scopeSubscription = input.resolveContext().layout.onDidChangePersistenceScope(() => {\n const activeModeId = store.getState().activeModeId;\n if (activeModeId === deferredSeedModeId) return;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n if (mode) seedScope(mode);\n });\n const registryDisposable = createDisposable(() => {\n scopeSubscription.dispose();\n disposeActive();\n for (const disposables of initializedModes.values()) disposeReverse(disposables);\n initializedModes.clear();\n seededScopes.clear();\n unscopedLayouts.clear();\n store.setState({ modes: {}, activeModeId: undefined }, false, \"disposeModes\");\n });\n\n return {\n store,\n\n dispose() {\n registryDisposable.dispose();\n },\n\n registerMode(mode) {\n const snapshot = store.getState();\n if (snapshot.modes[mode.id]) throw new Error(`Workbench mode already registered: ${mode.id}`);\n\n store.setState({ ...snapshot, modes: { ...snapshot.modes, [mode.id]: mode } }, false, \"registerMode\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.modes[mode.id] !== mode) return;\n if (current.activeModeId === mode.id) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n }\n disposeReverse(initializedModes.get(mode.id) ?? []);\n initializedModes.delete(mode.id);\n unscopedLayouts.delete(mode.id);\n for (const scopeKey of seededScopes) {\n if (scopeKey.startsWith(`${mode.id}\\0`)) seededScopes.delete(scopeKey);\n }\n const { [mode.id]: _removed, ...rest } = current.modes;\n store.setState({ ...store.getState(), modes: rest }, false, \"unregisterMode\");\n });\n },\n\n getMode(id) {\n return store.getState().modes[id];\n },\n\n listModes() {\n return Object.values(store.getState().modes);\n },\n\n getActiveModeId() {\n return store.getState().activeModeId;\n },\n\n isTransitioning() {\n return transitioning;\n },\n\n setActiveMode(id, setActiveInput = {}) {\n if (id === store.getState().activeModeId) return;\n transitioning = true;\n deferredSeedModeId = setActiveInput.deferSeed ? id : undefined;\n try {\n const context = input.resolveContext();\n const previousModeId = store.getState().activeModeId;\n if (previousModeId && context.layout.getPersistenceScope() === undefined) {\n unscopedLayouts.set(previousModeId, context.layout.getLayout());\n }\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n return;\n }\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n if (context.layout.getPersistenceScope() === undefined) {\n restoreModeLayout(\n context,\n restoreUnscopedModeLayout(context.layout.getLayout(), unscopedLayouts.get(id), panelsForMode(mode)),\n );\n }\n activate(id, { seed: deferredSeedModeId !== id });\n } finally {\n transitioning = false;\n }\n },\n\n seedActiveMode() {\n const activeModeId = store.getState().activeModeId;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n deferredSeedModeId = undefined;\n if (mode) seedScope(mode);\n },\n\n onDidChangeActive(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeModeId,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n} from \"../layout/layout-model\";\n\nexport interface WorkbenchPanelRenderInput {\n workbench: WorkbenchCore;\n panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;\n instance: WorkbenchPanelInstance;\n refresh: () => void;\n}\n\n// Keep-alive renderers are invoked exactly once into a persistent host and\n// reparented across widget mounts via DOM moves. They cannot read the per-widget\n// `WorkbenchPanelRenderInput` from their render args — the subtree subscribes\n// to the current claim through `useWorkbenchClaim()` (React layer) instead.\nexport type WorkbenchRendererRegistration =\n | {\n id: string;\n keepAlive?: false;\n render: (input: WorkbenchPanelRenderInput) => unknown;\n }\n | {\n id: string;\n keepAlive: true;\n render: () => unknown;\n };\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface RegisteredKeepAliveHost {\n rendererId: string;\n host: HTMLElement;\n attachedTo?: HTMLElement;\n}\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n hosts: Record<string, RegisteredKeepAliveHost>;\n claims: Record<string, WorkbenchPanelRenderInput>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n claim(rendererId: string, slot: HTMLElement, input: WorkbenchPanelRenderInput): Disposable;\n getHost(rendererId: string): HTMLElement | undefined;\n getClaim(rendererId: string): WorkbenchPanelRenderInput | undefined;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n // Override for environments without a real DOM (Bun tests). Default reads\n // `document`; SSR callers without DOM should provide their own factory.\n createHost?: () => HTMLElement;\n}\n\nconst removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n};\n\nconst defaultCreateHost = () => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"workbench.renderers.registerRenderer({ keepAlive: true }): no DOM available. \" +\n \"The default host factory uses document.createElement. In a non-browser environment \" +\n \"(Bun tests, SSR), pass a custom factory via \" +\n \"createWorkbenchCore({ renderers: { createHost: () => myHost } }).\",\n );\n }\n const host = document.createElement(\"div\");\n host.style.display = \"contents\";\n host.dataset.workbenchKeepAliveHost = \"\";\n return host;\n};\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const createHost = input.createHost ?? defaultCreateHost;\n\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, hosts: {}, claims: {} },\n });\n\n // Detach the host of `rendererId` from its current slot (if any) and clear\n // the matching claim. Used before reparenting and before unregistering.\n const detachHost = (rendererId: string) => {\n const snapshot = store.getState();\n const hostState = snapshot.hosts[rendererId];\n const previousSlot = hostState?.attachedTo;\n if (!hostState || !previousSlot) return;\n\n if (previousSlot.contains(hostState.host)) previousSlot.removeChild(hostState.host);\n\n store.setState(\n {\n ...snapshot,\n hosts: { ...snapshot.hosts, [rendererId]: { ...hostState, attachedTo: undefined } },\n claims: removeKey(snapshot.claims, rendererId),\n },\n false,\n \"renderers.detach\",\n );\n };\n\n const registry: WorkbenchRendererRegistry = {\n store,\n\n registerRenderer(renderer) {\n const snapshot = store.getState();\n if (snapshot.renderers[renderer.id]) throw new Error(`Renderer already registered: ${renderer.id}`);\n\n const host = renderer.keepAlive ? createHost() : undefined;\n const nextHosts = host ? { ...snapshot.hosts, [renderer.id]: { rendererId: renderer.id, host } } : snapshot.hosts;\n\n store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer }, hosts: nextHosts },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n\n if (renderer.keepAlive) detachHost(renderer.id);\n\n const after = store.getState();\n store.setState(\n {\n ...after,\n renderers: removeKey(after.renderers, renderer.id),\n hosts: removeKey(after.hosts, renderer.id),\n claims: removeKey(after.claims, renderer.id),\n },\n false,\n \"unregisterRenderer\",\n );\n });\n },\n\n getRenderer(id) {\n return store.getState().renderers[id];\n },\n\n listRenderers() {\n return Object.values(store.getState().renderers);\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n\n claim(rendererId, slot, claimInput) {\n const snapshot = store.getState();\n const renderer = snapshot.renderers[rendererId];\n if (!renderer) throw new Error(`Renderer is not registered: ${rendererId}`);\n if (!renderer.keepAlive) throw new Error(`Renderer ${rendererId} is not keep-alive; cannot claim`);\n\n const hostState = snapshot.hosts[rendererId];\n if (!hostState) throw new Error(`Renderer ${rendererId} has no host`);\n\n // If already attached to this slot, only update the claim input and\n // skip the DOM move so re-renders with the same slot stay quiet.\n if (hostState.attachedTo === slot) {\n store.setState(\n { ...snapshot, claims: { ...snapshot.claims, [rendererId]: claimInput } },\n false,\n \"renderers.updateClaim\",\n );\n } else {\n detachHost(rendererId);\n const next = store.getState();\n const refreshedHostState = next.hosts[rendererId]!;\n slot.appendChild(refreshedHostState.host);\n store.setState(\n {\n ...next,\n hosts: { ...next.hosts, [rendererId]: { ...refreshedHostState, attachedTo: slot } },\n claims: { ...next.claims, [rendererId]: claimInput },\n },\n false,\n \"renderers.attach\",\n );\n }\n\n return createDisposable(() => {\n const current = store.getState();\n const currentHostState = current.hosts[rendererId];\n if (!currentHostState || currentHostState.attachedTo !== slot) return;\n detachHost(rendererId);\n });\n },\n\n getHost(rendererId) {\n return store.getState().hosts[rendererId]?.host;\n },\n\n getClaim(rendererId) {\n return store.getState().claims[rendererId];\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n\n return registry;\n};\n","export const standardResourceIcons = {\n project: \"folder-root\",\n workspace: \"computer\",\n worktree: \"git-pull-request-draft\",\n settings: \"settings\",\n kanbanRenderer: \"table-properties\",\n} as const;\n\nexport type StandardResourceIcon = (typeof standardResourceIcons)[keyof typeof standardResourceIcons];\n","import type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchPanelInstance } from \"../layout/layout-types\";\n\nexport interface ResourceRef {\n kind: string;\n uri: string;\n id?: string;\n label?: string;\n icon?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport const workbenchResourceKindContextKey = \"workbench.resource.kind\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceUriMetadataKey = \"workbench.selectionResourceUri\";\n\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceKindContextKey]: resource.kind,\n [workbenchResourceIdContextKey]: resource.id ?? resource.uri,\n };\n\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n\n return values;\n};\n\nexport const createWorkbenchSelectionResourceMetadata = (resource: Pick<ResourceRef, \"uri\">) => ({\n [workbenchSelectionResourceUriMetadataKey]: resource.uri,\n});\n\nexport const getWorkbenchSelectionResourceUris = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n\n const selectionResourceUri = resource.metadata?.[workbenchSelectionResourceUriMetadataKey];\n if (typeof selectionResourceUri !== \"string\" || selectionResourceUri === resource.uri) return [resource.uri];\n\n return [resource.uri, selectionResourceUri];\n};\n\nexport interface OpenResourceInput {\n replaceActive?: boolean;\n}\n\n// The anchor a resource kind routes to. `primary` is the main subject; `secondary` and\n// `attached` are the side anchors (derived terminals, detached sessions). Independent of\n// the region id that currently hosts each anchor.\nexport type ResourceSurface = \"primary\" | \"secondary\" | \"attached\";\n\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n surface?: ResourceSurface;\n paletteOpenInput?: OpenResourceInput;\n}\n\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\n\nexport interface ResourcePresenter {\n id: string;\n priority?: number;\n canOpen(resource: ResourceRef): boolean;\n open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;\n}\n\ntype ResolvedResourcePresenter = Required<ResourcePresenter>;\n\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\n\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\n\nexport interface ResourceHierarchyProvider {\n id: string;\n priority?: number;\n canResolve(resource: ResourceRef): boolean;\n getParent(resource: ResourceRef): ResourceRef | undefined;\n}\n\nexport type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;\n\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n presenters: Record<string, ResolvedResourcePresenter>;\n providers: Record<string, ResourceProvider>;\n hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;\n}\n\nexport interface ResourceRegistry {\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n // The anchor a resource routes to, declared by its kind (undefined → not surface-routed).\n getSurface(resource: ResourceRef): ResourceSurface | undefined;\n listKinds(): RegisteredResourceKind[];\n registerPresenter(presenter: ResourcePresenter): Disposable;\n listPresenters(): ResolvedResourcePresenter[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable;\n listHierarchyProviders(): ResolvedResourceHierarchyProvider[];\n walkHierarchy(resource: ResourceRef | undefined): ResourceRef[];\n isOpeningResource(): boolean;\n openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;\n onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable;\n}\n\nconst sortPresenters = (presenters: ResolvedResourcePresenter[]) =>\n [...presenters].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\n\nconst sortHierarchyProviders = (providers: ResolvedResourceHierarchyProvider[]) =>\n [...providers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\n\nconst isPromiseLike = (value: unknown): value is PromiseLike<unknown> =>\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\";\n\nexport interface CreateResourceRegistryInput {\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n establishLocation?: (instance: WorkbenchPanelInstance) => WorkbenchPanelInstance;\n}\n\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const openListeners = new Set<(resource: ResourceRef) => void>();\n const establishLocation = input.establishLocation;\n let openingResourceDepth = 0;\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, presenters: {}, providers: {}, hierarchyProviders: {} },\n });\n\n return {\n store,\n\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n if (snapshot.kinds[kind.kind]) throw new Error(`Resource kind already registered: ${kind.kind}`);\n\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n\n getSurface(resource) {\n return store.getState().kinds[resource.kind]?.surface;\n },\n\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n\n registerPresenter(presenter) {\n const snapshot = store.getState();\n if (snapshot.presenters[presenter.id]) throw new Error(`Resource presenter already registered: ${presenter.id}`);\n\n const record: ResolvedResourcePresenter = { ...presenter, priority: presenter.priority ?? 0 };\n store.setState(\n { ...snapshot, presenters: { ...snapshot.presenters, [presenter.id]: record } },\n false,\n \"registerPresenter\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.presenters[presenter.id] !== record) return;\n const { [presenter.id]: _removed, ...rest } = current.presenters;\n store.setState({ ...current, presenters: rest }, false, \"unregisterPresenter\");\n });\n },\n\n listPresenters() {\n return sortPresenters(Object.values(store.getState().presenters));\n },\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n\n listProviders() {\n return Object.values(store.getState().providers);\n },\n\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n\n registerHierarchyProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.hierarchyProviders[provider.id]) {\n throw new Error(`Resource hierarchy provider already registered: ${provider.id}`);\n }\n\n const record: ResolvedResourceHierarchyProvider = { ...provider, priority: provider.priority ?? 0 };\n store.setState(\n {\n ...snapshot,\n hierarchyProviders: { ...snapshot.hierarchyProviders, [provider.id]: record },\n },\n false,\n \"registerHierarchyProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.hierarchyProviders[provider.id] !== record) return;\n const { [provider.id]: _removed, ...rest } = current.hierarchyProviders;\n store.setState({ ...current, hierarchyProviders: rest }, false, \"unregisterHierarchyProvider\");\n });\n },\n\n listHierarchyProviders() {\n return sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n },\n\n walkHierarchy(resource) {\n if (!resource) return [];\n\n const providers = sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n const path = [resource];\n const visitedUris = new Set([resource.uri]);\n let current = resource;\n\n while (true) {\n const provider = providers.find((candidate) => candidate.canResolve(current));\n const parent = provider?.getParent(current);\n if (!parent || visitedUris.has(parent.uri)) break;\n\n path.unshift(parent);\n visitedUris.add(parent.uri);\n current = parent;\n }\n\n return path;\n },\n\n isOpeningResource() {\n return openingResourceDepth > 0;\n },\n\n async openResource(resource, input = {}) {\n const snapshot = store.getState();\n if (!snapshot.kinds[resource.kind]) throw new Error(`Unknown resource kind: ${resource.kind}`);\n\n const presenter = sortPresenters(Object.values(snapshot.presenters)).find((candidate) =>\n candidate.canOpen(resource),\n );\n if (!presenter) throw new Error(`No presenter registered for resource kind: ${resource.kind}`);\n\n openingResourceDepth += 1;\n let result: WorkbenchPanelInstance;\n try {\n const opened = presenter.open(resource, input);\n result = isPromiseLike(opened) ? ((await opened) as WorkbenchPanelInstance) : opened;\n result = establishLocation?.(result) ?? result;\n } finally {\n openingResourceDepth -= 1;\n }\n for (const listener of openListeners) listener(resource);\n return result;\n },\n\n onDidOpenResource(listener) {\n openListeners.add(listener);\n return createDisposable(() => {\n openListeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../store/workbench-store\";\n\nexport type ContextKeyValue = boolean | number | string | undefined;\n\nexport interface ContextKeyStoreState {\n values: Record<string, ContextKeyValue>;\n}\n\nexport interface ContextKeyScope extends Disposable {\n ownerId: string;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n}\n\nexport interface ContextKeyService {\n store: WorkbenchStore<ContextKeyStoreState>;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n createScope(ownerId: string): ContextKeyScope;\n deleteOwner(ownerId: string): void;\n snapshot(): Record<string, ContextKeyValue>;\n matches(expression?: string): boolean;\n}\n\nconst readComparisonValue = (value: string) => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst matchesTerm = (values: Record<string, ContextKeyValue>, term: string) => {\n const trimmed = term.trim();\n if (trimmed.length === 0) return true;\n\n const comparison = trimmed.match(/^([A-Za-z0-9_.-]+)\\s*(==|!=)\\s*(.+)$/);\n if (comparison) {\n const [, key, operator, rawValue] = comparison;\n const actual = values[key ?? \"\"];\n const expected = readComparisonValue(rawValue ?? \"\");\n return operator === \"==\" ? String(actual) === expected : String(actual) !== expected;\n }\n\n if (trimmed.startsWith(\"!\")) return !values[trimmed.slice(1)];\n\n return Boolean(values[trimmed]);\n};\n\nexport const matchesContextExpression = (values: Record<string, ContextKeyValue>, expression?: string) => {\n if (!expression) return true;\n return expression.split(\"||\").some((orClause) => orClause.split(\"&&\").every((term) => matchesTerm(values, term)));\n};\n\nexport const createContextKeyService = (): ContextKeyService => {\n const store = createWorkbenchStore<ContextKeyStoreState>({\n name: \"workbench.context\",\n initialState: { values: {} },\n });\n\n let globalValues: Record<string, ContextKeyValue> = {};\n const ownerValues = new Map<string, Record<string, ContextKeyValue>>();\n\n const buildValues = () => {\n const values = { ...globalValues };\n for (const scopedValues of ownerValues.values()) Object.assign(values, scopedValues);\n return values;\n };\n\n const publish = (action: string) => {\n store.setState({ values: buildValues() }, false, action);\n };\n\n return {\n store,\n\n set(key, value) {\n if (globalValues[key] === value) return;\n globalValues = { ...globalValues, [key]: value };\n publish(\"setContextKey\");\n },\n\n get(key) {\n return store.getState().values[key];\n },\n\n delete(key) {\n if (!(key in globalValues)) return;\n const { [key]: _removed, ...rest } = globalValues;\n globalValues = rest;\n publish(\"deleteContextKey\");\n },\n\n createScope(ownerId) {\n ownerValues.set(ownerId, ownerValues.get(ownerId) ?? {});\n let disposed = false;\n\n const assertActive = () => {\n if (disposed) throw new Error(`Context key scope disposed: ${ownerId}`);\n };\n\n return {\n ownerId,\n\n set(key, value) {\n assertActive();\n const values = ownerValues.get(ownerId) ?? {};\n if (values[key] === value) return;\n ownerValues.set(ownerId, { ...values, [key]: value });\n publish(\"setScopedContextKey\");\n },\n\n get(key) {\n assertActive();\n return ownerValues.get(ownerId)?.[key];\n },\n\n delete(key) {\n assertActive();\n const values = ownerValues.get(ownerId);\n if (!values || !(key in values)) return;\n const { [key]: _removed, ...rest } = values;\n ownerValues.set(ownerId, rest);\n publish(\"deleteScopedContextKey\");\n },\n\n dispose() {\n if (disposed) return;\n disposed = true;\n if (!ownerValues.delete(ownerId)) return;\n publish(\"disposeContextKeyScope\");\n },\n };\n },\n\n deleteOwner(ownerId) {\n if (!ownerValues.delete(ownerId)) return;\n publish(\"deleteContextKeyOwner\");\n },\n\n snapshot() {\n return { ...store.getState().values };\n },\n\n matches(expression) {\n return matchesContextExpression(store.getState().values, expression);\n },\n };\n};\n"],"names":["createDisposable","onDispose","disposed","dispose","defaultEquality","left","right","Object","is","createWorkbenchStore","input","api","createStore","devtools","initialState","name","subscribeSelector","selector","listener","options","equalityFn","previousValue","getState","fireImmediately","subscribe","state","nextValue","previous","getInitialState","setState","findPlacement","layout","contributionId","region","values","regions","index","widgets","findIndex","candidate","regionId","id","placement","findResourcePlacement","resourceUri","findPlacementByWidgetId","widgetId","createUniqueWidgetId","widgetIds","Set","flatMap","map","resolveUniqueWidgetId","getActivePlacement","find","activeWidgetId","isLocationPlacement","role","locationWorkspaceKey","setLocationSubPanelSelection","location","key","next","locationSubPanelSelections","current","removeLocationSubPanelSelection","fromEntries","entries","selections","filter","selectedId","getActiveLocationPlacement","locations","main","activeLocationWidgetId","at","buildUpdatedPlacement","widget","update","resource","uri","title","label","undefined","pinned","closable","mountStrategy","hiddenByDefault","tabRetention","tab","ownerId","source","createPlacement","spec","singleton","replaceRegionWidgets","clearActiveWidget","some","removePlacementsForContribution","nextLayout","removed","filtered","length","hasActiveWidget","startsWith","activeResourceUri","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","ownerResourceUri","nextRegion","workbenchPanelRegions","includes","closedPlacement","activePlacement","activateInLayout","panelRegion","panel","selected","withSelection","supportsPanelRegion","fallbackRegion","supportsResource","resourceKinds","kind","canOpen","getActiveWorkbenchSubPanel","ignoreOwnerResourceUri","getActiveWorkbenchLocationPanel","matchesWorkbenchLocationEligibility","modeId","eligibleLocations","matchesWorkbenchModeEligibility","resourceIds","eligibleModeIds","modeIds","matchesWorkbenchPanelPlacementLocation","ignoreResourceLocation","allowsWorkbenchFloatingPanels","activeMainPanel","floatingPanels","matchesWorkbenchPanelMenuOwner","context","owner","panelMenuOwner","level","subPanel","locationPanel","hasOpenSingleton","isSubPanelEligible","listEligibleSubPanels","defaultContributionOwnerId","normalizeContributionMetadata","metadata","priority","byContributionPriority","localeCompare","getKeybindingSteps","keybinding","Array","isArray","trim","split","Boolean","normalizeKeybindingSequence","steps","createKeybindingRegistry","deps","store","keybindings","registerKeybinding","commands","getCommand","commandId","Error","record","snapshot","listKeybindings","sort","listActiveKeybindings","matches","when","toOpenWidgetInput","defaultTabRetention","strategy","shared","tabPosition","position","replaceActive","replaceWidgetId","instanceId","retention","toPanelInstance","panelId","toPanelContribution","ownedPanelMenuIds","_ownedPanelMenuIds","_role","getAnchorResource","anchorId","resolveAnchorRegion","reconcileAnchors","primary","isInScope","actions","listAnchorRegions","surface","getSurface","persistence","push","action","toDisposables","result","modePanelRegions","secondary","side","allModeRegions","flat","panelsForMode","mode","panels","getWorkbenchModePanelForRegion","keys","isWorkbenchModePanelAvailable","placementById","withActivePlacement","candidates","active","clearRegions","regionIds","clearedPanels","regionsNeedClearing","visible","selectionsNeedClearing","has","applyModePanelAvailability","available","unavailableRegions","restoreUnscopedModeLayout","saved","withoutModeContent","merged","savedActive","currentActive","disposeReverse","disposables","restoreModeLayout","getLayout","restoreLayout","setOpen","createWorkbenchModeRegistry","modes","activeModeId","initializedModes","Map","seededScopes","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","activate","resolveContext","set","seedScope","scopeKey","getPersistenceScope","currentLayout","availableLayout","locationEstablished","unsubscribeMainPanel","establishSeededLocation","getActivePanel","establishLocation","seed","add","disposeActive","contextScope","createScope","enter","error","scopeSubscription","onDidChangePersistenceScope","registryDisposable","clear","registerMode","get","delete","_removed","rest","getMode","listModes","getActiveModeId","isTransitioning","setActiveMode","setActiveInput","deferSeed","previousModeId","seedActiveMode","onDidChangeActive","unsubscribe","removeKey","defaultCreateHost","document","host","createElement","style","display","dataset","workbenchKeepAliveHost","createWorkbenchRendererRegistry","createHost","renderers","hosts","claims","detachHost","rendererId","hostState","previousSlot","attachedTo","contains","removeChild","registry","registerRenderer","renderer","keepAlive","nextHosts","after","getRenderer","listRenderers","onDidChange","claim","slot","claimInput","refreshedHostState","appendChild","currentHostState","getHost","getClaim","initialRenderers","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","workbenchResourceKindContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceUriMetadataKey","isContextPrimitive","value","createWorkbenchResourceContextValues","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceUris","selectionResourceUri","sortPresenters","presenters","sortHierarchyProviders","providers","isPromiseLike","then","createResourceRegistry","openListeners","openingResourceDepth","kinds","hierarchyProviders","registerKind","getKind","listKinds","registerPresenter","presenter","listPresenters","registerProvider","provider","listProviders","listResources","query","getPrimary","list","registerHierarchyProvider","listHierarchyProviders","walkHierarchy","path","visitedUris","parent","canResolve","getParent","unshift","isOpeningResource","openResource","opened","open","onDidOpenResource","readComparisonValue","replace","matchesTerm","term","trimmed","comparison","match","operator","rawValue","actual","expected","String","slice","matchesContextExpression","expression","orClause","every","createContextKeyService","globalValues","ownerValues","buildValues","scopedValues","assign","publish","assertActive","deleteOwner"],"mappings":"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"}
@@ -203,6 +203,7 @@ declare interface CommandParamDescriptor {
203
203
  declare interface CommandParamOption {
204
204
  label: string;
205
205
  value: string;
206
+ icon?: string;
206
207
  }
207
208
 
208
209
  declare type CommandParamSchema = Record<string, CommandParamDescriptor>;
@@ -435,6 +436,8 @@ declare interface DataTableRendererContribution {
435
436
  title: string;
436
437
  resourceKind?: string;
437
438
  columns?: DataTableRendererColumn[];
439
+ selectionMode?: "none" | "multiple";
440
+ selectionActions?: DataTableRendererSelectionAction[];
438
441
  rowActions?: DataTableRendererRowAction[];
439
442
  initialPageSize?: number;
440
443
  pageSizeOptions?: number[];
@@ -487,6 +490,14 @@ declare interface DataTableRendererRowAction {
487
490
  run(row: DataTableRendererRow): Promise<void> | void;
488
491
  }
489
492
 
493
+ declare interface DataTableRendererSelectionAction {
494
+ id: string;
495
+ label: string;
496
+ icon?: unknown;
497
+ destructive?: boolean;
498
+ run(rows: DataTableRendererRow[]): Promise<void> | void;
499
+ }
500
+
490
501
  declare interface DataTableRendererStoreState {
491
502
  renderers: Record<string, RegisteredDataTableRendererContribution>;
492
503
  }
@@ -527,6 +538,8 @@ declare interface EnumOptionsSource {
527
538
  getSnapshot: () => EnumOption[];
528
539
  }
529
540
 
541
+ declare type ExtensionPanelPlacement = NonNullable<WorkbenchExtensionMetadata["panels"][number]["placement"]>;
542
+
530
543
  declare type ExtensionTreeRendererRecord = NonNullable<WorkbenchExtensionMetadata["treeRenderers"]>[number];
531
544
 
532
545
  declare type ExtensionTreeViewRecord = WorkbenchExtensionMetadata["panels"][number] | NonNullable<WorkbenchExtensionMetadata["panels"][number]["panelMenus"]>[number];
@@ -1015,6 +1028,10 @@ declare interface OpenWorkbenchPanelInput {
1015
1028
  strategy?: WorkbenchPanelOpenStrategy;
1016
1029
  }
1017
1030
 
1031
+ export declare const panelMenuDeclarationOffsets: <T extends {
1032
+ panelMenus?: readonly unknown[];
1033
+ }>(panels: readonly T[]) => number[];
1034
+
1018
1035
  declare interface PlaceholderContribution {
1019
1036
  id: string;
1020
1037
  title: string;
@@ -1432,6 +1449,10 @@ declare interface ThemeRegistry {
1432
1449
  listThemes(): readonly ThemePreferenceOption[];
1433
1450
  }
1434
1451
 
1452
+ export declare const toWorkbenchExtensionPlacementMetadata: (input: WorkbenchExtensionPlacementInput) => {
1453
+ priority: number;
1454
+ };
1455
+
1435
1456
  declare interface TreeAction {
1436
1457
  id: string;
1437
1458
  label?: string;
@@ -1578,6 +1599,7 @@ declare interface WidgetContribution {
1578
1599
  mountStrategy?: WidgetMountStrategy;
1579
1600
  closable?: boolean;
1580
1601
  hiddenByDefault?: boolean;
1602
+ subPanelsOnly?: boolean;
1581
1603
  regionSize?: WorkbenchRegionSize;
1582
1604
  regionCollapsible?: boolean;
1583
1605
  headerBorderBottom?: boolean;
@@ -1812,6 +1834,11 @@ export declare type WorkbenchExtensionMenuWhenBuilder = (contribution: Extension
1812
1834
 
1813
1835
  export { WorkbenchExtensionMetadata }
1814
1836
 
1837
+ declare interface WorkbenchExtensionPlacementInput {
1838
+ placement?: ExtensionPanelPlacement;
1839
+ declarationIndex?: number;
1840
+ }
1841
+
1815
1842
  export declare type WorkbenchExtensionRoute = WorkbenchExtensionMetadata["routes"][number];
1816
1843
 
1817
1844
  export declare interface WorkbenchExtensionRouteResourceInput {
@@ -2001,6 +2028,7 @@ declare interface WorkbenchPanelContribution {
2001
2028
  reuse?: WorkbenchPanelReusePolicy;
2002
2029
  mountStrategy?: WorkbenchPanelMountStrategy;
2003
2030
  hiddenByDefault?: boolean;
2031
+ subPanelsOnly?: boolean;
2004
2032
  regionSize?: WorkbenchRegionSize;
2005
2033
  regionCollapsible?: boolean;
2006
2034
  headerBorderBottom?: boolean;
@@ -2109,13 +2137,14 @@ declare type WorkbenchPanelMountStrategy = WidgetMountStrategy;
2109
2137
  declare type WorkbenchPanelMountStrategy_2 = WidgetMountStrategy_2;
2110
2138
 
2111
2139
  declare type WorkbenchPanelOpenStrategy = {
2112
- kind: "activate-or-open";
2140
+ kind: "persistent";
2113
2141
  position?: WorkbenchTabPosition;
2114
2142
  } | {
2115
2143
  kind: "replace-active";
2116
2144
  } | {
2117
2145
  kind: "replace-panel";
2118
2146
  instanceId: string;
2147
+ retention?: WorkbenchTabRetention;
2119
2148
  } | {
2120
2149
  kind: "preview";
2121
2150
  position?: WorkbenchTabPosition;