@pstdio/workbench 0.7.1 → 0.9.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.
- package/README.md +39 -317
- package/dist/extensions.d.ts +1492 -698
- package/dist/extensions.js +1679 -1776
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-kfJRY3yR.js +515 -0
- package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
- package/dist/index.d.ts +724 -599
- package/dist/index.js +5151 -2369
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +673 -550
- package/dist/react.js +3585 -3335
- package/dist/react.js.map +1 -1
- package/dist/storage.d.ts +120 -155
- package/dist/storage.js +135 -149
- package/dist/storage.js.map +1 -1
- package/dist/webview-runtime.d.ts +2 -5
- package/dist/webview-runtime.js +3 -3
- package/dist/webview-runtime.js.map +1 -1
- package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
- package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
- package/dist/workbench-renderers-DmsrBGC7.js +960 -0
- package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
- package/dist/workspaces-DJwFj8uq.js +1872 -0
- package/dist/workspaces-DJwFj8uq.js.map +1 -0
- package/package.json +6 -41
- package/dist/composition-resolver-types-CWykPyEK.js +0 -241
- package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
- package/dist/file-renderer-view-B6_iR4EN.js +0 -496
- package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
- package/dist/file-section-navigation-CfYqVObc.js +0 -30
- package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
- package/dist/icon-B9XolQG8.js +0 -35
- package/dist/icon-B9XolQG8.js.map +0 -1
- package/dist/layout-types-DMoZz38-.js +0 -100
- package/dist/layout-types-DMoZz38-.js.map +0 -1
- package/dist/surface-map-C1pOTUmF.js +0 -52
- package/dist/surface-map-C1pOTUmF.js.map +0 -1
- package/dist/testing.d.ts +0 -2284
- package/dist/testing.js +0 -58
- package/dist/testing.js.map +0 -1
- package/dist/workbench-built-ins-BncLJfQA.js +0 -1175
- package/dist/workbench-built-ins-BncLJfQA.js.map +0 -1
- package/dist/workbench-menu-paths-Bb0ICxeG.js +0 -20
- package/dist/workbench-menu-paths-Bb0ICxeG.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/core/controllers/breadcrumbs/breadcrumb-registry.ts","../src/core/controllers/command-palette/command-palette-controller.ts","../src/core/registries/layout/layout-contribution-helpers.ts","../src/core/registries/layout/layout-tab-lifecycle.ts","../src/core/registries/layout/layout-placement-methods.ts","../src/core/registries/layout/layout-scope.ts","../src/core/registries/layout/layout-scope-methods.ts","../src/core/registries/layout/layout-widget-openers.ts","../src/core/registries/layout/panel-layout-methods.ts","../src/core/registries/layout/panel-menu-ownership.ts","../src/core/registries/layout/panel-registration.ts","../src/core/registries/layout/layout-model.ts","../src/core/controllers/composition/composition-controller.ts","../src/core/controllers/focus/focus-controller.ts","../src/core/controllers/history/history-snapshot.ts","../src/core/controllers/history/history-reconciliation.ts","../src/core/controllers/history/history-controller.ts","../src/core/controllers/last-resource/last-resource-controller.ts","../src/core/controllers/navigator/workbench-navigator.ts","../src/core/controllers/panels/panels-controller.ts","../src/core/controllers/side-panel/side-panel-controller.ts","../src/core/controllers/terminal/terminal-controller.ts","../src/core/registries/command-palette-resources/command-palette-resource-registry.ts","../src/core/registries/commands/command-registry.ts","../src/core/registries/menus/menu-registry.ts","../src/core/registries/navigation/navigation-registry.ts","../src/core/registries/notifications/notification-registry.ts","../src/core/registries/preferences/preference-registry.ts","../src/core/registries/renderers/controls-renderer-registry.ts","../src/core/registries/renderers/data-table-renderer-registry.ts","../src/core/registries/renderers/file-renderer-registry.ts","../src/core/registries/renderers/kanban-renderer-registry.ts","../src/core/registries/renderers/tree-renderer-registry.ts","../src/core/registries/settings/settings-registry.ts","../src/core/registries/themes/file-icon-theme-registry.ts","../src/core/registries/themes/theme-registry.ts","../src/core/controllers/primary-coordinator/primary-coordinator.ts","../src/core/controllers/shell/shell-controller.ts","../src/core/workbench-core.ts"],"sourcesContent":["import type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkbenchBreadcrumbItem {\n title: unknown;\n icon?: string;\n indicator?: \"session-status\";\n url?: string;\n onClick?: () => void;\n resource?: ResourceRef;\n}\n\nexport type WorkbenchBreadcrumbChangeListener = () => void;\n\nexport interface WorkbenchBreadcrumbState {\n items: WorkbenchBreadcrumbItem[] | undefined;\n}\n\nexport interface WorkbenchBreadcrumbController {\n store: WorkbenchStore<WorkbenchBreadcrumbState>;\n setItems(items: WorkbenchBreadcrumbItem[]): Disposable;\n clearItems(): void;\n getItems(): WorkbenchBreadcrumbItem[] | undefined;\n onDidChange(listener: WorkbenchBreadcrumbChangeListener): Disposable;\n}\n\nexport const createResourceBreadcrumbItems = (\n resources: ResourceRegistry,\n resource: ResourceRef | undefined,\n): WorkbenchBreadcrumbItem[] => {\n const path = resources.walkHierarchy(resource);\n\n return path.map((entry, index) => ({\n title: entry.label ?? entry.id ?? resources.getKind(entry.kind)?.label ?? entry.kind,\n icon: entry.icon ?? resources.getKind(entry.kind)?.icon,\n resource: entry,\n ...(index < path.length - 1 ? { onClick: () => void resources.openResource(entry, { replaceActive: true }) } : {}),\n }));\n};\n\nexport const createWorkbenchBreadcrumbController = (): WorkbenchBreadcrumbController => {\n const store = createWorkbenchStore<WorkbenchBreadcrumbState>({\n name: \"workbench.breadcrumbs\",\n initialState: { items: undefined },\n });\n\n return {\n store,\n\n setItems(items) {\n store.setState({ items }, false, \"setBreadcrumbItems\");\n return createDisposable(() => {\n if (store.getState().items === items) {\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n }\n });\n },\n\n clearItems() {\n if (store.getState().items === undefined) return;\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n },\n\n getItems() {\n return store.getState().items;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.items,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { CommandParamSchema, WorkbenchCommandExecutionContext } from \"../../registries/commands/command-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchCommandPaletteChangeListener = (open: boolean) => void;\nexport type WorkbenchCommandPaletteView = \"main\" | \"theme\" | \"mode\";\n\n// A pending request to collect a command's params before running it. Held on the\n// controller (not in a single React tree) so any surface — palette entries, header\n// actions, tree actions — can open the one shared params dialog.\nexport interface WorkbenchCommandParamsRequest {\n record: { command: { id: string; label: string; params?: CommandParamSchema } };\n label: string;\n args?: unknown;\n context?: WorkbenchCommandExecutionContext;\n}\n\nexport interface WorkbenchCommandPaletteState {\n open: boolean;\n view: WorkbenchCommandPaletteView;\n initialQuery: string;\n paramsRequest: WorkbenchCommandParamsRequest | null;\n}\n\nexport interface WorkbenchCommandPaletteOpenInput {\n view?: WorkbenchCommandPaletteView;\n initialQuery?: string;\n}\n\nexport interface WorkbenchCommandPaletteController {\n store: WorkbenchStore<WorkbenchCommandPaletteState>;\n isOpen(): boolean;\n getView(): WorkbenchCommandPaletteView;\n getInitialQuery(): string;\n getParamsRequest(): WorkbenchCommandParamsRequest | null;\n open(input?: WorkbenchCommandPaletteOpenInput): void;\n close(): void;\n toggle(): void;\n requestParams(request: WorkbenchCommandParamsRequest): void;\n clearParams(): void;\n onDidChange(listener: WorkbenchCommandPaletteChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchCommandPaletteControllerInput {\n initialOpen?: boolean;\n}\n\nexport const createWorkbenchCommandPaletteController = (\n input: CreateWorkbenchCommandPaletteControllerInput = {},\n): WorkbenchCommandPaletteController => {\n const internal = createWorkbenchStore<WorkbenchCommandPaletteState>({\n name: \"workbench.commandPalette\",\n initialState: { open: input.initialOpen ?? false, view: \"main\", initialQuery: \"\", paramsRequest: null },\n });\n\n // Patches open/view/initialQuery while preserving paramsRequest, which has its own\n // lifecycle (a request can outlive the palette being closed).\n const setOpenState = (next: Pick<WorkbenchCommandPaletteState, \"open\" | \"view\" | \"initialQuery\">) => {\n const current = internal.getState();\n if (current.open === next.open && current.view === next.view && current.initialQuery === next.initialQuery) return;\n internal.setState({ ...current, ...next }, false, \"setCommandPaletteState\");\n };\n\n return {\n store: internal,\n isOpen() {\n return internal.getState().open;\n },\n getView() {\n return internal.getState().view;\n },\n getInitialQuery() {\n return internal.getState().initialQuery;\n },\n getParamsRequest() {\n return internal.getState().paramsRequest;\n },\n open(openInput = {}) {\n setOpenState({ open: true, view: openInput.view ?? \"main\", initialQuery: openInput.initialQuery ?? \"\" });\n },\n close() {\n setOpenState({ open: false, view: \"main\", initialQuery: \"\" });\n },\n toggle() {\n setOpenState({ open: !internal.getState().open, view: \"main\", initialQuery: \"\" });\n },\n requestParams(request) {\n internal.setState({ ...internal.getState(), paramsRequest: request }, false, \"requestCommandParams\");\n },\n clearParams() {\n if (!internal.getState().paramsRequest) return;\n internal.setState({ ...internal.getState(), paramsRequest: null }, false, \"clearCommandParams\");\n },\n onDidChange(listener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.open,\n (value) => listener(value),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { getActivePlacement, removePlacementsForContribution } from \"./layout-operations\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchRegion,\n} from \"./layout-types\";\n\ninterface CreateRegionQueriesInput {\n getLayout(): WorkbenchLayout;\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;\n}\n\nexport const createRegionQueries = (input: CreateRegionQueriesInput) => {\n const { getLayout, getWidgets, getPlaceholder } = input;\n\n return {\n getRegionSize(regionId: WorkbenchRegion) {\n const persistedSize = getLayout().regions[regionId].size;\n const placement = getActivePlacement(getLayout().regions[regionId]);\n const contributionSize = placement\n ? getWidgets()[placement.contributionId]?.regionSize\n : getPlaceholder(regionId)?.regionSize;\n if (persistedSize === undefined) return contributionSize;\n return { ...contributionSize, defaultPx: persistedSize };\n },\n\n getRegionCollapsible(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement) return getPlaceholder(regionId)?.regionCollapsible ?? true;\n return getWidgets()[placement.contributionId]?.regionCollapsible ?? true;\n },\n\n getRegionHeaderBorderBottom(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement) return true;\n return getWidgets()[placement.contributionId]?.headerBorderBottom ?? true;\n },\n };\n};\n\nexport const createContributionLists = (input: {\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n}) => {\n const { getPlaceholders, getWidgets } = input;\n\n return {\n listPlaceholders: () => Object.values(getPlaceholders()).sort(byContributionPriority),\n listWidgets: () => Object.values(getWidgets()).sort(byContributionPriority),\n };\n};\n\nexport const createContributionRegistrations = (input: {\n store: InternalWorkbenchStore<WorkbenchLayoutStoreState>;\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n persistLayout(): void;\n}) => {\n const { store, getPlaceholders, getWidgets, persistLayout } = input;\n\n return {\n registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata) {\n if (getPlaceholders()[placeholder.region]) {\n throw new Error(`Placeholder already registered: ${placeholder.region}`);\n }\n\n const { priority, ...placeholderContribution } = placeholder;\n const record: RegisteredPlaceholderContribution = {\n ...placeholderContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState(\n { ...snapshot, placeholders: { ...snapshot.placeholders, [placeholder.region]: record } },\n false,\n \"registerPlaceholder\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.placeholders[placeholder.region] !== record) return;\n const { [placeholder.region]: _removed, ...nextPlaceholders } = current.placeholders;\n store.setState({ ...current, placeholders: nextPlaceholders }, false, \"unregisterPlaceholder\");\n });\n },\n\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata) {\n if (getWidgets()[widget.id]) throw new Error(`Widget already registered: ${widget.id}`);\n\n const { priority, reuse, singleton, ...widgetContribution } = widget;\n const record: RegisteredWidgetContribution = {\n ...widgetContribution,\n reuse: reuse ?? \"resource\",\n singleton: singleton ?? true,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState({ ...snapshot, widgets: { ...snapshot.widgets, [widget.id]: record } }, false, \"registerWidget\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.widgets[widget.id] !== record) return;\n const { [widget.id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout = removePlacementsForContribution(current.layout, widget.id);\n store.setState({ widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n persistLayout();\n });\n },\n };\n};\n","import { getActivePlacement, removeLocationSubPanelSelection, replaceRegionWidgets } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchTabPosition, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nconst insertAtPosition = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) => {\n const next = [...widgets];\n if (position === \"start\") {\n next.unshift(placement);\n return next;\n }\n if (position === \"end\") {\n next.push(placement);\n return next;\n }\n\n const targetWidgetId = \"beforeWidgetId\" in position ? position.beforeWidgetId : position.afterWidgetId;\n const targetIndex = next.findIndex((candidate) => candidate.widgetId === targetWidgetId);\n if (targetIndex < 0) {\n next.push(placement);\n return next;\n }\n next.splice(targetIndex + (\"afterWidgetId\" in position ? 1 : 0), 0, placement);\n return next;\n};\n\nexport const placeWidget = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position?: WorkbenchTabPosition,\n) => {\n if (placement.tabRetention !== \"preview\") return insertAtPosition(widgets, placement, position);\n const persistentWidgets = widgets.filter(\n (candidate) => candidate.tabRetention !== \"preview\" && candidate.widgetId !== placement.widgetId,\n );\n return insertAtPosition(persistentWidgets, placement, \"start\");\n};\n\nexport const reorderWidgetPlacement = (\n widgets: WorkbenchWidgetPlacement[],\n widgetId: string,\n position: WorkbenchTabPosition,\n) => {\n const placement = widgets.find((candidate) => candidate.widgetId === widgetId);\n if (!placement) return widgets;\n if (placement.tabRetention === \"preview\") {\n throw new Error(`Preview widget cannot be reordered: ${widgetId}`);\n }\n const remaining = widgets.filter((candidate) => candidate.widgetId !== widgetId);\n return insertAtPosition(remaining, placement, position);\n};\n\nconst removePlacements = (layout: WorkbenchLayout, shouldRemove: (placement: WorkbenchWidgetPlacement) => boolean) => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter(shouldRemove);\n if (removed.length === 0) continue;\n const active = getActivePlacement(region);\n nextLayout = replaceRegionWidgets(\n nextLayout,\n region.id,\n (widgets) => widgets.filter((placement) => !shouldRemove(placement)),\n { clearActiveWidget: active ? shouldRemove(active) : false },\n );\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const activePlacement = nextLayout.activeWidgetId\n ? Object.values(nextLayout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === nextLayout.activeWidgetId)\n : undefined;\n if (!activePlacement) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceUri: undefined };\n }\n return nextLayout;\n};\n\nexport const expirePreviewTabsInLayout = (layout: WorkbenchLayout, ownerResourceUri?: string) =>\n removePlacements(\n layout,\n (placement) =>\n placement.tabRetention === \"preview\" &&\n (ownerResourceUri === undefined || placement.ownerResourceUri !== ownerResourceUri),\n );\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { buildUpdatedPlacement, replaceRegionWidgets } from \"./layout-operations\";\nimport { expirePreviewTabsInLayout, reorderWidgetPlacement } from \"./layout-tab-lifecycle\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport const createLayoutPlacementMethods = (input: {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}): Pick<LayoutModel, \"updateWidgetPlacement\" | \"reorderWidget\" | \"expirePreviewTabs\" | \"activateWidget\"> => ({\n updateWidgetPlacement(widgetId, update) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((placement) => placement.widgetId === widgetId);\n if (index < 0) continue;\n const widget = input.requireWidget(region.widgets[index].contributionId);\n const nextPlacement = buildUpdatedPlacement(region.widgets[index], widget, update);\n const nextLayout = replaceRegionWidgets(layout, region.id, (widgets) =>\n widgets.map((current, currentIndex) => (currentIndex === index ? nextPlacement : current)),\n );\n input.setLayout(nextLayout);\n input.persistLayout();\n return nextPlacement;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n reorderWidget(widgetId, position) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n if (!region.widgets.some((placement) => placement.widgetId === widgetId)) continue;\n input.setLayout(\n replaceRegionWidgets(layout, region.id, (widgets) => reorderWidgetPlacement(widgets, widgetId, position)),\n );\n input.persistLayout();\n return;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n expirePreviewTabs(ownerResourceUri) {\n input.setLayout(expirePreviewTabsInLayout(input.getLayout(), ownerResourceUri));\n input.persistLayout();\n },\n\n activateWidget(widgetId) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === widgetId);\n if (placement) return input.applyAndActivate(layout, region.id, placement);\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n});\n","import { createDisposable } from \"../../shared/disposable\";\nimport {\n createDefaultWorkbenchLayout,\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchRegion,\n} from \"./layout-types\";\n\nexport const carryPinnedWorkbenchChrome = (current: WorkbenchLayout, incoming: WorkbenchLayout) => {\n const regions = { ...incoming.regions };\n\n for (const region of Object.values(current.regions)) {\n const pinned = region.widgets.filter((placement) => placement.pinned && placement.role === \"content\");\n if (pinned.length === 0) continue;\n const contributionIds = new Set(pinned.map((placement) => placement.contributionId));\n const incomingRegion = incoming.regions[region.id];\n regions[region.id] = {\n ...incomingRegion,\n widgets: [\n ...pinned,\n ...incomingRegion.widgets.filter((placement) => !contributionIds.has(placement.contributionId)),\n ],\n activeWidgetId: incomingRegion.activeWidgetId ?? pinned[0]?.widgetId,\n };\n }\n return { ...incoming, regions };\n};\n\nexport const carryWorkbenchRegionState = (\n current: WorkbenchLayout,\n incoming: WorkbenchLayout,\n regionIds: readonly WorkbenchRegion[],\n) => {\n if (regionIds.length === 0) return incoming;\n const regions = { ...incoming.regions };\n for (const regionId of regionIds) regions[regionId] = current.regions[regionId];\n return { ...incoming, regions };\n};\n\nexport const resolveScopedLayout = (\n defaultRegionVisibility: Partial<Record<WorkbenchRegion, boolean>> | undefined,\n persisted: WorkbenchLayout | undefined,\n) =>\n persisted\n ? mergeWithDefaultRegions(persisted, defaultRegionVisibility)\n : createDefaultWorkbenchLayout(defaultRegionVisibility);\n\nexport const createScopeEvent = <T>() => {\n const listeners = new Set<(value: T) => void>();\n return {\n notify(value: T) {\n for (const listener of listeners) listener(value);\n },\n subscribe(listener: (value: T) => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import type { LayoutModel, LayoutPersistenceAdapter, LayoutScope } from \"./layout-model-types\";\nimport {\n carryPinnedWorkbenchChrome,\n carryWorkbenchRegionState,\n createScopeEvent,\n resolveScopedLayout,\n} from \"./layout-scope\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\n\nexport interface CreateLayoutScopeMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n persistence?: LayoutPersistenceAdapter;\n setLayout(layout: WorkbenchLayout, action: string): void;\n}\n\n// Owns the active persistence scope and the layout rotation that follows it. Kept\n// beside the layout model so the model factory stays a wiring surface.\nexport const createLayoutScopeMethods = (input: CreateLayoutScopeMethodsInput) => {\n let currentScope: LayoutScope | undefined;\n // Answers \"was this scope entered with a layout the user already had?\", sampled when\n // the scope becomes current. Reading persistence live would be wrong: entering a mode\n // restores and persists panels before the mode seeds, so a new scope would look like\n // a returning one and never get its defaults.\n let enteredWithLayout = input.persistence?.getLayout(undefined) !== undefined;\n const willChangeScope = createScopeEvent<LayoutScope | undefined>();\n const didChangeScope = createScopeEvent<LayoutScope | undefined>();\n\n const setPersistenceScope: LayoutModel[\"setPersistenceScope\"] = (nextScope, scopeInput = {}) => {\n if (currentScope === nextScope) return;\n input.persistence?.setLayout(input.getLayout(), currentScope);\n willChangeScope.notify(nextScope);\n currentScope = nextScope;\n const incoming = input.persistence?.getLayout(currentScope);\n enteredWithLayout = incoming !== undefined;\n const scopedLayout = resolveScopedLayout(input.defaultRegionVisibility, incoming);\n // Module-owned chrome is global workbench structure. Project scopes replace\n // Location workspaces, but must not unmount pinned navigation and headers.\n const withPinnedChrome = carryPinnedWorkbenchChrome(input.getLayout(), scopedLayout);\n const nextLayout = carryWorkbenchRegionState(\n input.getLayout(),\n withPinnedChrome,\n scopeInput.carryRegionState ?? [],\n );\n input.setLayout(nextLayout, \"setPersistenceScope\");\n didChangeScope.notify(currentScope);\n };\n\n return {\n getPersistenceScope: () => currentScope,\n // Live: whether anything is stored for the active scope right now.\n hasPersistedLayout: () => input.persistence?.getLayout(currentScope) !== undefined,\n enteredWithPersistedLayout: () => enteredWithLayout,\n onDidChangePersistenceScope: didChangeScope.subscribe,\n onWillChangePersistenceScope: willChangeScope.subscribe,\n persistLayout: () => input.persistence?.setLayout(input.getLayout(), currentScope),\n setPersistenceScope,\n };\n};\n","import {\n buildUpdatedPlacement,\n createPlacement,\n createUniqueWidgetId,\n findPlacement,\n findResourcePlacement,\n getActiveLocationPlacement,\n replaceRegionWidgets,\n} from \"./layout-operations\";\nimport { placeWidget } from \"./layout-tab-lifecycle\";\nimport type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\ninterface CreateWidgetOpenersInput {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}\n\nconst openOwnedPanelMenus = (input: {\n openWidget(id: string, openInput?: OpenWidgetInput): WorkbenchWidgetPlacement;\n placement: WorkbenchWidgetPlacement;\n requireWidget(id: string): RegisteredWidgetContribution;\n widget: RegisteredWidgetContribution;\n}) => {\n for (const panelMenuId of input.widget.ownedPanelMenuIds ?? []) {\n const panelMenu = input.requireWidget(panelMenuId);\n input.openWidget(panelMenuId, {\n pinned: true,\n role: \"panel-menu\",\n resource: input.placement.resource,\n title: panelMenu.region === \"main-left-menu\" ? input.placement.resource?.label : panelMenu.title,\n });\n }\n};\n\nconst findReusablePlacement = (\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n openInput: OpenWidgetInput,\n) => {\n if (!widget.singleton && widget.reuse === \"none\") return undefined;\n if (openInput.role === \"sub-panel\" || openInput.role === \"panel-menu\") {\n const ownerResourceUri = getActiveLocationPlacement(layout)?.resourceUri;\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) =>\n candidate.contributionId === widget.id &&\n // Pinned placements are structural chrome, not per-location content, so they are\n // reused across location switches instead of accumulating one instance per owner.\n (candidate.pinned === true ||\n (widget.singleton && candidate.ownerResourceUri === undefined) ||\n candidate.ownerResourceUri === ownerResourceUri) &&\n (!openInput.resource ||\n (widget.singleton && candidate.resourceUri === undefined) ||\n candidate.resourceUri === openInput.resource.uri),\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n }\n if (widget.singleton) return findPlacement(layout, widget.id);\n if (openInput.resource) return findResourcePlacement(layout, widget.id, openInput.resource.uri);\n return findPlacement(layout, widget.id);\n};\n\nconst withPlacementRole = (widget: RegisteredWidgetContribution, openInput: OpenWidgetInput): OpenWidgetInput => {\n if (openInput.role) return openInput;\n if (widget.panelMenuOwner) return { ...openInput, role: \"panel-menu\" };\n if (widget.eligibleLocations !== undefined) return { ...openInput, role: \"sub-panel\" };\n return openInput;\n};\n\nconst findReplacementIndex = (layout: WorkbenchLayout, regionId: WorkbenchRegion, openInput: OpenWidgetInput) => {\n const region = layout.regions[regionId];\n const activeWidgetId = openInput.role === \"location\" ? layout.activeLocationWidgetId : region.activeWidgetId;\n\n if (openInput.replaceWidgetId) {\n return region.widgets.findIndex((placement) => placement.widgetId === openInput.replaceWidgetId);\n }\n if (openInput.tabRetention === \"preview\") {\n return region.widgets.findIndex((placement) => placement.tabRetention === \"preview\");\n }\n if (!openInput.replaceActive) return -1;\n const replacementWidgetId =\n regionId === \"main\" && openInput.resource && layout.activeLocationWidgetId\n ? layout.activeLocationWidgetId\n : activeWidgetId;\n return region.widgets.findIndex((placement) => placement.widgetId === replacementWidgetId && !placement.pinned);\n};\n\nconst defaultTabPosition = (\n widgets: WorkbenchWidgetPlacement[],\n widget: RegisteredWidgetContribution,\n requireWidget: (id: string) => RegisteredWidgetContribution,\n) => {\n const before = widgets.find((placement) => {\n try {\n return widget.priority > requireWidget(placement.contributionId).priority;\n } catch {\n return widget.priority > 0;\n }\n });\n return before ? ({ beforeWidgetId: before.widgetId } as const) : undefined;\n};\n\nexport const createWidgetOpeners = (input: CreateWidgetOpenersInput) => {\n const { getLayout, requireWidget, applyAndActivate } = input;\n\n const bindToActiveLocation = (placement: WorkbenchWidgetPlacement, layout: WorkbenchLayout) => {\n if (placement.role !== \"sub-panel\" && placement.role !== \"panel-menu\") return placement;\n return { ...placement, ownerResourceUri: getActiveLocationPlacement(layout)?.resourceUri };\n };\n\n const updateSingleton = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), existing.regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === existing.index ? nextPlacement : current));\n if (!openInput.tabPosition) return updated;\n return placeWidget(\n updated.filter((placement) => placement.widgetId !== nextPlacement.widgetId),\n nextPlacement,\n openInput.tabPosition,\n );\n });\n return applyAndActivate(layout, existing.regionId, nextPlacement);\n };\n\n const replaceActive = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n replacement: WorkbenchWidgetPlacement,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(buildUpdatedPlacement(replacement, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === replacementIndex ? nextPlacement : current));\n if (nextPlacement.tabRetention !== \"preview\") return updated;\n return placeWidget(updated, nextPlacement, \"start\");\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n\n const reuseExistingPlacement = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n if (openInput.tabRetention === \"preview\" && existing.placement.tabRetention !== \"preview\") {\n return applyAndActivate(getLayout(), existing.regionId, existing.placement);\n }\n\n if (existing.regionId !== regionId) {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const withoutExisting = replaceRegionWidgets(\n getLayout(),\n existing.regionId,\n (widgets) => widgets.filter((_current, index) => index !== existing.index),\n { clearActiveWidget: getLayout().regions[existing.regionId].activeWidgetId === existing.placement.widgetId },\n );\n const layout = replaceRegionWidgets(withoutExisting, regionId, (widgets) => {\n if (replacementIndex < 0) return placeWidget(widgets, nextPlacement, openInput.tabPosition);\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, nextPlacement);\n return nextPlacement.tabRetention === \"preview\" ? placeWidget(copy, nextPlacement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n }\n\n if (replacementIndex < 0 || existing.index === replacementIndex) {\n return updateSingleton(widget, existing, openInput);\n }\n\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) =>\n placeWidget(\n widgets\n .map((current, index) => (index === existing.index ? nextPlacement : current))\n .filter((_current, index) => index !== replacementIndex && index !== existing.index),\n nextPlacement,\n openInput.tabPosition,\n ),\n );\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n\n const insertWidget = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n const widgetId = createUniqueWidgetId(getLayout(), widget.id);\n const placement = bindToActiveLocation(createPlacement(widgetId, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n if (replacementIndex < 0) {\n return placeWidget(\n widgets,\n placement,\n openInput.tabPosition ?? defaultTabPosition(widgets, widget, requireWidget),\n );\n }\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, placement);\n return placement.tabRetention === \"preview\" ? placeWidget(copy, placement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, placement);\n };\n\n const openWidget = (id: string, openInput: OpenWidgetInput = {}): WorkbenchWidgetPlacement => {\n const widget = requireWidget(id);\n const placementInput = withPlacementRole(widget, openInput);\n const layout = getLayout();\n const regionId = placementInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n const region = layout.regions[regionId];\n const replacementIndex = findReplacementIndex(layout, regionId, placementInput);\n const replacement = replacementIndex >= 0 ? region.widgets[replacementIndex] : undefined;\n const previewContent =\n !placementInput.replaceWidgetId && placementInput.tabRetention === \"preview\" && placementInput.resource\n ? findResourcePlacement(layout, widget.id, placementInput.resource.uri)\n : undefined;\n const existing =\n placementInput.replaceWidgetId && replacement ? undefined : findReusablePlacement(widget, layout, placementInput);\n\n let placement: WorkbenchWidgetPlacement;\n if (previewContent) {\n placement = applyAndActivate(layout, previewContent.regionId, previewContent.placement);\n } else if (existing) {\n placement = reuseExistingPlacement(widget, existing, regionId, replacementIndex, placementInput);\n } else if (replacement?.contributionId === widget.id) {\n placement = replaceActive(widget, regionId, replacementIndex, replacement, placementInput);\n } else {\n placement = insertWidget(widget, regionId, replacementIndex, placementInput);\n }\n\n openOwnedPanelMenus({ openWidget, placement, requireWidget, widget });\n return applyAndActivate(getLayout(), previewContent?.regionId ?? regionId, placement);\n };\n\n return { openWidget };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { closeWidgetInLayout, findPlacementByWidgetId } from \"./layout-operations\";\nimport {\n type OpenWorkbenchPanelInput,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { toOpenWidgetInput, toPanelContribution, toPanelInstance } from \"./panel-api\";\n\n// A programmatic open into a tabbed region is a peek: it lands as a preview tab that the\n// next peek replaces. Chrome regions and pinned placements are structure, so they stay put.\nconst defaultPanelTabRetention = (widget: RegisteredWidgetContribution, openInput: OpenWorkbenchPanelInput) => {\n if (openInput.pinned) return \"persistent\" as const;\n const region = openInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n return workbenchPanelRegions.includes(region as WorkbenchPanelRegion)\n ? (\"preview\" as const)\n : (\"persistent\" as const);\n};\n\ninterface CreatePanelLayoutMethodsInput {\n getLayout: () => WorkbenchLayout;\n getWidgets: () => WorkbenchLayoutStoreState[\"widgets\"];\n listWidgets: LayoutModel[\"listWidgets\"];\n persistLayout: () => void;\n placementMethods: Pick<LayoutModel, \"activateWidget\" | \"reorderWidget\" | \"updateWidgetPlacement\">;\n setLayout: (layout: WorkbenchLayout) => void;\n widgetOpeners: Pick<LayoutModel, \"openWidget\">;\n}\n\nexport const createPanelLayoutMethods = (input: CreatePanelLayoutMethodsInput) => ({\n getPanel(id: string) {\n const widget = input.getWidgets()[id];\n return widget ? toPanelContribution(widget) : undefined;\n },\n\n listPanels: () => input.listWidgets().map(toPanelContribution),\n\n listPanelInstances(region?: WorkbenchRegion) {\n const placements = region\n ? input.getLayout().regions[region].widgets\n : Object.values(input.getLayout().regions).flatMap((candidate) => candidate.widgets);\n return placements.map(toPanelInstance);\n },\n\n getActivePanel(region?: WorkbenchRegion) {\n if (region) {\n const state = input.getLayout().regions[region];\n const placement =\n state.widgets.find((candidate) => candidate.widgetId === state.activeWidgetId) ?? state.widgets[0];\n return placement ? toPanelInstance(placement) : undefined;\n }\n const activeInstanceId = input.getLayout().activeWidgetId;\n if (!activeInstanceId) return undefined;\n const found = findPlacementByWidgetId(input.getLayout(), activeInstanceId);\n return found ? toPanelInstance(found.placement) : undefined;\n },\n\n openPanel(id: string, openInput: OpenWorkbenchPanelInput = {}) {\n const widget = input.getWidgets()[id];\n if (!widget) throw new Error(`Panel not registered: ${id}`);\n return toPanelInstance(\n input.widgetOpeners.openWidget(id, toOpenWidgetInput(openInput, defaultPanelTabRetention(widget, openInput))),\n );\n },\n\n updatePanel(instanceId: string, update: OpenWorkbenchPanelInput) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.updateWidgetPlacement(instanceId, toOpenWidgetInput(update)));\n },\n\n reorderPanel(instanceId: string, position: Parameters<LayoutModel[\"reorderPanel\"]>[1]) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n input.placementMethods.reorderWidget(instanceId, position);\n },\n\n activatePanel(instanceId: string) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.activateWidget(instanceId));\n },\n\n closePanel(instanceId: string) {\n const found = findPlacementByWidgetId(input.getLayout(), instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (found.placement.closable !== true) throw new Error(`Panel cannot be closed: ${instanceId}`);\n const active = closeWidgetInLayout(input.getLayout(), instanceId);\n if (!active) throw new Error(`Panel instance not found: ${instanceId}`);\n input.setLayout(active.layout);\n input.persistLayout();\n return active.activePlacement ? toPanelInstance(active.activePlacement) : undefined;\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchPanelMenuRegion,\n type WorkbenchPanelMenuSide,\n type WorkbenchPanelRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\ntype GetWidget = (contributionId: string) => RegisteredWidgetContribution | undefined;\n\nconst menuRegions = Object.values(workbenchPanelMenuRegions).flatMap(\n (regions) => Object.values(regions) as WorkbenchPanelMenuRegion[],\n);\n\nconst menuSide = (region: WorkbenchPanelMenuRegion): WorkbenchPanelMenuSide =>\n region.endsWith(\"-left-menu\") ? \"left\" : \"right\";\n\nconst ownerContributionId = (getWidget: GetWidget, contributionId: string) =>\n getWidget(contributionId)?.panelMenuOwner?.contributionId;\n\nconst ownerPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of workbenchPanelRegions) {\n const placement = layout.regions[region].widgets.find((candidate) => candidate.contributionId === contributionId);\n if (placement) return { region, placement };\n }\n return undefined;\n};\n\ninterface MenuResolution {\n placements: WorkbenchWidgetPlacement[];\n changed: boolean;\n}\n\n// One placement per owned menu contribution. A panel opened without a resource and\n// then reopened with one would otherwise leave its first menu behind, because menu\n// reuse keys on the owner's resource. Keeping the first placement and rebinding it\n// preserves the menu's identity and active state.\nconst resolveMenuPlacements = (\n layout: WorkbenchLayout,\n getWidget: GetWidget,\n region: WorkbenchPanelMenuRegion,\n): MenuResolution & { moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] } => {\n const placements: WorkbenchWidgetPlacement[] = [];\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n const seen = new Set<string>();\n let changed = false;\n\n for (const placement of layout.regions[region].widgets) {\n const owner = ownerContributionId(getWidget, placement.contributionId);\n if (!owner) {\n placements.push(placement);\n continue;\n }\n if (seen.has(placement.contributionId)) {\n changed = true;\n continue;\n }\n seen.add(placement.contributionId);\n\n const found = ownerPlacement(layout, owner);\n if (!found) {\n // Orphaned menu: its owner panel has no placement anywhere.\n changed = true;\n continue;\n }\n\n const bound =\n placement.ownerResourceUri === found.placement.resourceUri\n ? placement\n : { ...placement, ownerResourceUri: found.placement.resourceUri };\n if (bound !== placement) changed = true;\n\n const target = workbenchPanelMenuRegions[found.region as WorkbenchPanelRegion][menuSide(region)];\n if (target === region) {\n placements.push(bound);\n continue;\n }\n changed = true;\n moves.push({ placement: bound, target });\n }\n\n return { changed, moves, placements };\n};\n\n// A panel instance owns its menu instances: menus render beside the region their\n// owner currently occupies, stay bound to the owner's resource, and a menu whose\n// owner has no placement is an orphan. Menu identity (widget id, active state) is\n// preserved on a move; no second instance is created.\nexport const reconcilePanelMenuOwnership = (layout: WorkbenchLayout, getWidget: GetWidget): WorkbenchLayout => {\n let changed = false;\n const regions = { ...layout.regions };\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n\n for (const menuRegion of menuRegions) {\n if (layout.regions[menuRegion].widgets.length === 0) continue;\n const resolved = resolveMenuPlacements(layout, getWidget, menuRegion);\n moves.push(...resolved.moves);\n if (!resolved.changed) continue;\n\n changed = true;\n const region = regions[menuRegion];\n regions[menuRegion] = {\n ...region,\n widgets: resolved.placements,\n activeWidgetId: resolved.placements.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n\n for (const move of moves) {\n const target = regions[move.target];\n regions[move.target] = { ...target, widgets: [...target.widgets, move.placement] };\n }\n\n return changed ? { ...layout, regions } : layout;\n};\n\nexport interface CreateOwnedMenuMethodsInput {\n getLayout(): WorkbenchLayout;\n getWidget: GetWidget;\n openWidget: LayoutModel[\"openWidget\"];\n persistLayout(): void;\n setLayout(layout: WorkbenchLayout): void;\n}\n\n// Every open (including a region move or a rebind to a resource) reconciles the\n// owned menus of the panel that moved, so a panel instance always has exactly one\n// instance of each menu it owns.\nexport const createOwnedMenuMethods = (input: CreateOwnedMenuMethodsInput) => {\n const reconcilePanelMenus = () => {\n const next = reconcilePanelMenuOwnership(input.getLayout(), input.getWidget);\n if (next === input.getLayout()) return;\n input.setLayout(next);\n input.persistLayout();\n };\n\n const openWidget: LayoutModel[\"openWidget\"] = (id, openInput) => {\n const placement = input.openWidget(id, openInput);\n reconcilePanelMenus();\n return placement;\n };\n\n return { openWidget, reconcilePanelMenus };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type {\n WidgetContribution,\n WorkbenchLocationContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelRegion,\n WorkbenchSubPanelContribution,\n} from \"./layout-types\";\nimport { workbenchPanelMenuRegions, workbenchPanelRegions } from \"./layout-types\";\n\ntype LegacyWorkbenchPanelContribution = WorkbenchLocationContribution | WorkbenchSubPanelContribution;\ntype RegisteredPanelInput = LegacyWorkbenchPanelContribution | WorkbenchPanelContribution;\ntype WorkbenchPanelKind = \"panel\" | \"location\" | \"sub-panel\";\n\ninterface RegisterPanelContributionInput {\n metadata?: ContributionMetadata;\n panel: RegisteredPanelInput;\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n kind: WorkbenchPanelKind;\n closable?: boolean;\n}\n\ninterface CreatePanelRegistrationsInput {\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nconst panelMenuContribution = (\n panel: RegisteredPanelInput,\n menu: WorkbenchPanelMenuDefinition,\n kind: WorkbenchPanelKind,\n): WidgetContribution => {\n const { side, ...contribution } = menu;\n const region = panel.region as WorkbenchPanelRegion;\n const fallbackRegion = workbenchPanelRegions.find((candidate) => candidate === panel.fallbackRegion);\n return {\n ...contribution,\n region: workbenchPanelMenuRegions[region][side],\n fallbackRegion: fallbackRegion ? workbenchPanelMenuRegions[fallbackRegion][side] : undefined,\n panelMenuOwner: {\n level: kind === \"sub-panel\" ? \"sub-panel\" : \"panel\",\n contributionId: panel.id,\n },\n };\n};\n\nexport const registerPanelContribution = (input: RegisterPanelContributionInput) => {\n const { closable, kind, metadata, panel, registerWidget } = input;\n const { panelMenus = [], ...panelContribution } = panel;\n const registrations: Disposable[] = [];\n\n if (panelMenus.length > 0 && !workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion)) {\n throw new Error(`Panel Menus require a Panel region: ${panel.id}`);\n }\n\n try {\n const registeredPanel: WidgetContribution & { ownedPanelMenuIds: readonly string[] } = {\n ...panelContribution,\n ...(closable === undefined ? {} : { closable }),\n ownedPanelMenuIds: panelMenus.map((menu) => menu.id),\n };\n registrations.push(registerWidget(registeredPanel, metadata));\n for (const menu of panelMenus) {\n registrations.push(registerWidget(panelMenuContribution(panel, menu, kind), metadata));\n }\n } catch (error) {\n for (const registration of registrations.reverse()) registration.dispose();\n throw error;\n }\n\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n};\n\nexport const createPanelRegistrations = (input: CreatePanelRegistrationsInput) => {\n const registerPanel = (panel: WorkbenchPanelContribution, metadata?: ContributionMetadata) => {\n return registerPanelContribution({\n panel,\n kind: panel.eligibleLocations ? \"sub-panel\" : \"panel\",\n metadata,\n registerWidget: input.registerWidget,\n });\n };\n\n const registerLocation = (location: WorkbenchLocationContribution, metadata?: ContributionMetadata) =>\n registerPanelContribution({\n panel: location,\n kind: \"location\",\n closable: location.closable ?? false,\n metadata,\n registerWidget: input.registerWidget,\n });\n\n const registerSubPanel = (subPanel: WorkbenchSubPanelContribution, metadata?: ContributionMetadata) =>\n registerPanelContribution({\n panel: { ...subPanel, eligibleLocations: subPanel.eligibleLocations ?? {} },\n kind: \"sub-panel\",\n closable: subPanel.closable ?? true,\n metadata,\n registerWidget: input.registerWidget,\n });\n\n const registerPanelMenu = (panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata) =>\n input.registerWidget({ ...panelMenu, panelMenuOwner: panelMenu.panelMenuOwner ?? { level: \"panel\" } }, metadata);\n\n return { registerPanel, registerLocation, registerSubPanel, registerPanelMenu };\n};\n","import { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n createContributionLists,\n createContributionRegistrations,\n createRegionQueries,\n} from \"./layout-contribution-helpers\";\nimport type { CreateLayoutModelInput, LayoutModel } from \"./layout-model-types\";\nimport {\n activateInLayout,\n closeWidgetInLayout,\n findPlacementByWidgetId,\n getActiveLocationPlacement,\n removePlacementsForContribution,\n selectRegionActiveWidget,\n setLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport { createLayoutPlacementMethods } from \"./layout-placement-methods\";\nimport { resolveScopedLayout } from \"./layout-scope\";\nimport { createLayoutScopeMethods } from \"./layout-scope-methods\";\nimport {\n mergeWithDefaultRegions,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelInstance,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchRegionState,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { createWidgetOpeners } from \"./layout-widget-openers\";\nimport { createPanelLayoutMethods } from \"./panel-layout-methods\";\nimport { createOwnedMenuMethods } from \"./panel-menu-ownership\";\nimport { createPanelRegistrations } from \"./panel-registration\";\n\nexport type {\n CreateLayoutModelInput,\n LayoutModel,\n LayoutPersistenceAdapter,\n LayoutScope,\n} from \"./layout-model-types\";\nexport type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WidgetMountStrategy,\n WidgetReusePolicy,\n WorkbenchFloatingPanelVisibility,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchLocationContribution,\n WorkbenchLocationEligibility,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelMenuOwner,\n WorkbenchPanelMenuRegion,\n WorkbenchPanelMenuSide,\n WorkbenchPanelMountStrategy,\n WorkbenchPanelOpenStrategy,\n WorkbenchPanelRegion,\n WorkbenchPanelReusePolicy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchRegionSize,\n WorkbenchRegionState,\n WorkbenchSubPanelContribution,\n WorkbenchTabPosition,\n WorkbenchTabRetention,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n WorkbenchWidgetTab,\n} from \"./layout-types\";\nexport {\n createDefaultWorkbenchLayout,\n getWorkbenchPanelForMenuRegion,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n workbenchRegions,\n} from \"./layout-types\";\n\ninterface LocationAwareLayoutModel extends LayoutModel {\n establishLocation(instanceId: string): WorkbenchPanelInstance;\n}\n\ninterface CreateLocationEstablisherInput {\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n getLayout(): WorkbenchLayout;\n getWidget(id: string): RegisteredWidgetContribution | undefined;\n panelMethods: Pick<LayoutModel, \"activatePanel\" | \"getActivePanel\">;\n}\n\nconst createLocationEstablisher = (input: CreateLocationEstablisherInput) => (instanceId: string) => {\n const layout = input.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n // Sub Panels and Panel Menus stay tabs beside their Location: promoting one would\n // create a second Location and clone every Sub Panel per Location.\n if (found.regionId !== \"main\" || found.placement.role === \"sub-panel\" || found.placement.role === \"panel-menu\") {\n return input.panelMethods.activatePanel(instanceId);\n }\n\n const placement = { ...found.placement, role: \"location\" as const };\n const ownedPanelMenuIds = new Set(input.getWidget(placement.contributionId)?.ownedPanelMenuIds ?? []);\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((candidate) => {\n if (candidate.widgetId === instanceId) return placement;\n if (!ownedPanelMenuIds.has(candidate.contributionId)) return candidate;\n if (candidate.resourceUri !== placement.resourceUri) return candidate;\n return { ...candidate, ownerResourceUri: placement.resourceUri };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n input.applyAndActivate(\n {\n ...layout,\n regions,\n },\n \"main\",\n placement,\n );\n // A sub-panels-only Location presents no content of its own: hand the active\n // slot to its first Sub Panel as soon as one exists. A restored selection has\n // already been applied above and remains the active Sub Panel when valid.\n if (input.getWidget(placement.contributionId)?.subPanelsOnly) {\n const main = input.getLayout().regions.main;\n const activeSubPanel = main.widgets.find(\n (candidate) =>\n candidate.widgetId === main.activeWidgetId &&\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceUri || candidate.ownerResourceUri === placement.resourceUri),\n );\n if (activeSubPanel) return input.panelMethods.getActivePanel(\"main\")!;\n\n const subPanel = main.widgets.find(\n (candidate) =>\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceUri || candidate.ownerResourceUri === placement.resourceUri),\n );\n if (subPanel) return input.panelMethods.activatePanel(subPanel.widgetId);\n }\n return input.panelMethods.getActivePanel(\"main\")!;\n};\n\nconst requireRegisteredWidget = (\n widgets: WorkbenchLayoutStoreState[\"widgets\"],\n id: string,\n): RegisteredWidgetContribution => {\n const widget = widgets[id];\n if (!widget) throw new Error(`Widget not registered: ${id}`);\n return widget;\n};\n\nexport const createLayoutModel = (input: CreateLayoutModelInput = {}): LocationAwareLayoutModel => {\n const persisted = input.persistence?.getLayout(undefined);\n const initialLayout = resolveScopedLayout(input.defaultRegionVisibility, persisted);\n\n const store = createWorkbenchStore<WorkbenchLayoutStoreState>({\n name: \"workbench.layout\",\n initialState: { layout: initialLayout, widgets: {}, placeholders: {} },\n });\n\n const getLayout = () => store.getState().layout;\n const getPlaceholders = () => store.getState().placeholders;\n const getWidgets = () => store.getState().widgets;\n const getPlaceholder = (regionId: WorkbenchRegion) => getPlaceholders()[regionId];\n const regionQueries = createRegionQueries({ getLayout, getWidgets, getPlaceholder });\n const contributionLists = createContributionLists({ getPlaceholders, getWidgets });\n\n const scopeMethods = createLayoutScopeMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n persistence: input.persistence,\n setLayout: (layout, action) => store.setState({ ...store.getState(), layout }, false, action),\n });\n const persistLayout = () => scopeMethods.persistLayout();\n\n const requireWidget = (id: string) => requireRegisteredWidget(getWidgets(), id);\n\n const setLayout = (layout: WorkbenchLayout) => {\n const snapshot = store.getState();\n if (snapshot.layout === layout) return;\n store.setState({ ...snapshot, layout }, false, \"setLayout\");\n };\n\n const updateRegion = (regionId: WorkbenchRegion, update: (region: WorkbenchRegionState) => WorkbenchRegionState) => {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const nextRegion = update(region);\n if (nextRegion === region) return;\n setLayout({ ...layout, regions: { ...layout.regions, [regionId]: nextRegion } });\n persistLayout();\n };\n\n const applyAndActivate = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ) => {\n setLayout(activateInLayout(layout, regionId, placement));\n persistLayout();\n return placement;\n };\n\n const contributionRegistrations = createContributionRegistrations({\n store,\n getPlaceholders,\n getWidgets,\n persistLayout,\n });\n const panelRegistrations = createPanelRegistrations({\n registerWidget: contributionRegistrations.registerWidget,\n });\n const widgetOpeners = createWidgetOpeners({ getLayout, requireWidget, applyAndActivate });\n const placementMethods = createLayoutPlacementMethods({\n getLayout,\n requireWidget,\n setLayout,\n persistLayout,\n applyAndActivate,\n });\n const panelMethods = createPanelLayoutMethods({\n getLayout,\n getWidgets,\n listWidgets: contributionLists.listWidgets,\n persistLayout,\n placementMethods,\n setLayout,\n widgetOpeners,\n });\n const ownedMenus = createOwnedMenuMethods({\n getLayout,\n getWidget: (id) => getWidgets()[id],\n openWidget: widgetOpeners.openWidget,\n persistLayout,\n setLayout,\n });\n\n const establishLocation = createLocationEstablisher({\n applyAndActivate,\n getLayout,\n getWidget: requireWidget,\n panelMethods,\n });\n\n return {\n store,\n\n registerPlaceholder: contributionRegistrations.registerPlaceholder,\n\n registerWidget: contributionRegistrations.registerWidget,\n\n ...panelRegistrations,\n\n unregisterWidget(id, options = {}) {\n const current = store.getState();\n if (!current.widgets[id]) return;\n const { [id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout =\n options.removePlacements === false ? current.layout : removePlacementsForContribution(current.layout, id);\n store.setState({ ...current, widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n if (options.persist !== false) persistLayout();\n },\n\n getWidget(id) {\n return getWidgets()[id];\n },\n\n getPlaceholder,\n\n getRegionSize: regionQueries.getRegionSize,\n getRegionCollapsible: regionQueries.getRegionCollapsible,\n getRegionHeaderBorderBottom: regionQueries.getRegionHeaderBorderBottom,\n\n setRegionVisible(regionId, visible) {\n updateRegion(regionId, (region) => (region.visible === visible ? region : { ...region, visible }));\n },\n\n setRegionSize(regionId, size) {\n updateRegion(regionId, (region) => (region.size === size ? region : { ...region, size }));\n },\n\n listPlaceholders: contributionLists.listPlaceholders,\n listWidgets: contributionLists.listWidgets,\n ...panelMethods,\n openWidget: ownedMenus.openWidget,\n\n ...placementMethods,\n\n establishLocation,\n\n reconcilePanelMenus: ownedMenus.reconcilePanelMenus,\n\n setRegionActiveWidget(regionId, widgetId) {\n const nextLayout = selectRegionActiveWidget(getLayout(), regionId, widgetId);\n if (!nextLayout) return;\n setLayout(nextLayout);\n persistLayout();\n },\n\n closeWidget(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) throw new Error(`Widget placement not found: ${widgetId}`);\n if (result.closedPlacement.closable !== true) throw new Error(`Widget cannot be closed: ${widgetId}`);\n\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n removeWidgetPlacement(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) return undefined;\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n clearRegion(regionId) {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const activeWidgetId = region.activeWidgetId;\n\n const cleared: WorkbenchLayout = {\n ...layout,\n regions: { ...layout.regions, [regionId]: { ...region, widgets: [], activeWidgetId: undefined } },\n };\n let next =\n activeWidgetId && layout.activeWidgetId === activeWidgetId\n ? { ...cleared, activeWidgetId: undefined, activeResourceUri: undefined }\n : cleared;\n\n if (regionId !== \"side\" && workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) {\n next = setLocationSubPanelSelection(\n next,\n getActiveLocationPlacement(next),\n regionId as WorkbenchPanelRegion,\n undefined,\n );\n }\n\n setLayout(next);\n persistLayout();\n },\n\n resetRegions() {\n const layout = getLayout();\n const nextRegions = {} as WorkbenchLayout[\"regions\"];\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n nextRegions[id] = { ...region, widgets: [], activeWidgetId: undefined };\n }\n setLayout({\n regions: nextRegions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n activeResourceUri: undefined,\n });\n persistLayout();\n },\n\n getLayout,\n\n restoreLayout(layout) {\n setLayout(mergeWithDefaultRegions(layout, input.defaultRegionVisibility));\n persistLayout();\n },\n\n setPersistenceScope: scopeMethods.setPersistenceScope,\n getPersistenceScope: scopeMethods.getPersistenceScope,\n hasPersistedLayout: scopeMethods.hasPersistedLayout,\n enteredWithPersistedLayout: scopeMethods.enteredWithPersistedLayout,\n onWillChangePersistenceScope: scopeMethods.onWillChangePersistenceScope,\n onDidChangePersistenceScope: scopeMethods.onDidChangePersistenceScope,\n };\n};\n","import type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"../../registries/layout/layout-model\";\nimport { isWorkbenchPanelPlacementVisible } from \"../../registries/layout/panel-widget-eligibility\";\nimport {\n isWorkbenchModePanelAvailable,\n type WorkbenchModeAddablePanel,\n type WorkbenchModeContribution,\n} from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\n\nexport interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {\n contribution: RegisteredWidgetContribution;\n}\n\nexport interface WorkbenchCompositionRegionPanels {\n open: readonly WorkbenchWidgetPlacement[];\n addable: readonly WorkbenchCompositionAddablePanel[];\n closable: readonly string[];\n}\n\nexport interface WorkbenchCompositionController {\n panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;\n}\n\ninterface CreateWorkbenchCompositionControllerInput {\n getActiveMode(): WorkbenchModeContribution | undefined;\n getLayout(): WorkbenchLayout;\n getResource(): ResourceRef | undefined;\n listWidgets(): RegisteredWidgetContribution[];\n}\n\nconst isOpenSingleton = (\n widget: RegisteredWidgetContribution,\n placements: readonly WorkbenchWidgetPlacement[],\n resource: ResourceRef | undefined,\n) => {\n if (!widget.singleton) return false;\n return placements.some((placement) => {\n if (placement.contributionId !== widget.id) return false;\n const scopedResourceUri = placement.role === \"location\" ? placement.resourceUri : placement.ownerResourceUri;\n return !scopedResourceUri || scopedResourceUri === resource?.uri;\n });\n};\n\nconst addModePanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n layout: WorkbenchLayout;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const panel of input.mode?.listAddablePanels?.({ layout: input.layout, resource: input.resource }) ?? []) {\n if (panel.region !== input.region) continue;\n const contribution = input.widgets.find((widget) => widget.id === panel.panelId);\n if (!contribution || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n input.addable.set(panel.panelId, { ...panel, contribution });\n }\n};\n\nconst addRegisteredPanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n modeId: string | undefined;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const contribution of input.widgets) {\n if (!contribution.eligibleLocations) continue;\n if (contribution.region !== input.region && contribution.fallbackRegion !== input.region) continue;\n if (input.addable.has(contribution.id) || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n if (!isWorkbenchPanelPlacementVisible(contribution, input.resource, input.modeId)) continue;\n input.addable.set(contribution.id, { panelId: contribution.id, region: input.region, contribution });\n }\n};\n\nexport const createWorkbenchCompositionController = (\n input: CreateWorkbenchCompositionControllerInput,\n): WorkbenchCompositionController => ({\n panelsFor(region) {\n const layout = input.getLayout();\n const open = layout.regions[region]?.widgets ?? [];\n const resource = input.getResource();\n const mode = input.getActiveMode();\n if (!isWorkbenchModePanelAvailable(mode, region)) return { open, addable: [], closable: [] };\n\n const placements = Object.values(layout.regions).flatMap((candidate) => candidate.widgets);\n const widgets = input.listWidgets();\n const addable = new Map<string, WorkbenchCompositionAddablePanel>();\n\n addModePanels({ addable, layout, mode, placements, region, resource, widgets });\n addRegisteredPanels({ addable, modeId: mode?.id, placements, region, resource, widgets });\n\n return {\n open,\n addable: [...addable.values()],\n closable: open.filter((placement) => placement.closable === true).map((placement) => placement.contributionId),\n };\n },\n});\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport const workbenchFocusRegions = [\"activity\", \"sidenav\", \"main\", \"secondary\", \"side\", \"status\"] as const;\n\nexport type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];\n\nexport type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;\n\nexport interface WorkbenchFocusState {\n activeRegion: WorkbenchFocusRegionId | undefined;\n}\n\nexport interface WorkbenchFocusController {\n store: WorkbenchStore<WorkbenchFocusState>;\n setActiveRegion(region: WorkbenchFocusRegionId): void;\n clearFocus(): void;\n getActiveRegion(): WorkbenchFocusRegionId | undefined;\n onDidChange(listener: WorkbenchFocusChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchFocusControllerInput {\n context: ContextKeyService;\n isRegionFocusable?: (region: WorkbenchFocusRegionId) => boolean;\n}\n\nconst focusContextByRegion = {\n activity: \"activityFocus\",\n sidenav: \"sidenavFocus\",\n main: \"mainFocus\",\n secondary: \"secondaryFocus\",\n side: \"sideFocus\",\n status: \"statusFocus\",\n} as const satisfies Record<WorkbenchFocusRegionId, string>;\n\nexport const createWorkbenchFocusController = (\n input: CreateWorkbenchFocusControllerInput,\n): WorkbenchFocusController => {\n const store = createWorkbenchStore<WorkbenchFocusState>({\n name: \"workbench.focus\",\n initialState: { activeRegion: undefined },\n });\n const context = input.context.createScope(\"workbench.focus\");\n\n const applyContext = (region: WorkbenchFocusRegionId | undefined) => {\n context.set(\"workbenchFocus\", region !== undefined);\n context.set(\"activeWorkbenchFocusRegion\", region);\n for (const focusRegion of workbenchFocusRegions) {\n context.set(focusContextByRegion[focusRegion], focusRegion === region);\n }\n };\n\n applyContext(undefined);\n\n return {\n store,\n\n setActiveRegion(region) {\n if (input.isRegionFocusable?.(region) === false) return;\n if (store.getState().activeRegion === region) return;\n store.setState({ activeRegion: region }, false, \"setActiveWorkbenchFocusRegion\");\n applyContext(region);\n },\n\n clearFocus() {\n if (store.getState().activeRegion === undefined) return;\n store.setState({ activeRegion: undefined }, false, \"clearWorkbenchFocusRegion\");\n applyContext(undefined);\n },\n\n getActiveRegion() {\n return store.getState().activeRegion;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeRegion,\n (region) => listener(region),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { findPlacementByWidgetId, getActiveLocationPlacement } from \"../../registries/layout/layout-operations\";\nimport type { WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { workbenchPanelRegions } from \"../../registries/layout/layout-types\";\nimport { isWorkbenchPanelPlacementVisible } from \"../../registries/layout/panel-widget-eligibility\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport type { WorkbenchLocationRef, WorkbenchNavigationEntry, WorkbenchSubPanelRef } from \"./history-types\";\n\nexport const workbenchNavigationPanelRegions = [\"main\", \"secondary\"] as const;\n\nexport const workbenchPlacementRole = (_layout: LayoutModel, placement: WorkbenchWidgetPlacement) =>\n placement.role ?? \"content\";\n\nexport const findSubPanelPlacement = (layout: LayoutModel, reference: WorkbenchSubPanelRef) => {\n if (reference.instanceKey) {\n const exact = findPlacementByWidgetId(layout.getLayout(), reference.instanceKey)?.placement;\n if (exact) return exact;\n }\n for (const region of workbenchPanelRegions) {\n const placement = layout\n .getLayout()\n .regions[region].widgets.find(\n (candidate) =>\n candidate.contributionId === reference.contributionId && candidate.resourceUri === reference.resourceUri,\n );\n if (placement) return placement;\n }\n return undefined;\n};\n\nexport const subPanelRefFromPlacement = (placement: WorkbenchWidgetPlacement): WorkbenchSubPanelRef => ({\n contributionId: placement.contributionId,\n resourceUri: placement.resourceUri,\n instanceKey: placement.widgetId,\n});\n\nconst isSameSubPanel = (left: WorkbenchSubPanelRef | undefined, right: WorkbenchSubPanelRef | undefined) =>\n left?.contributionId === right?.contributionId &&\n left?.resourceUri === right?.resourceUri &&\n left?.instanceKey === right?.instanceKey;\n\nexport const selectedSubPanelsFromLayout = (layout: LayoutModel, modeId: string | undefined) => {\n const selected: Partial<Record<(typeof workbenchNavigationPanelRegions)[number], WorkbenchSubPanelRef>> = {};\n const location = getActiveLocationPlacement(layout.getLayout());\n for (const regionId of workbenchNavigationPanelRegions) {\n const region = layout.getLayout().regions[regionId];\n const active = region.widgets.find((placement) => placement.widgetId === region.activeWidgetId);\n const widget = active ? layout.getWidget(active.contributionId) : undefined;\n if (\n active &&\n widget &&\n workbenchPlacementRole(layout, active) === \"sub-panel\" &&\n isWorkbenchPanelPlacementVisible(widget, location?.resource, modeId, active)\n ) {\n selected[regionId] = subPanelRefFromPlacement(active);\n }\n }\n return selected;\n};\n\nconst locationPlacementFromLayout = (layout: LayoutModel) => {\n return getActiveLocationPlacement(layout.getLayout());\n};\n\nconst locationFromPlacement = (\n placement: WorkbenchWidgetPlacement,\n modeId: string | undefined,\n): WorkbenchLocationRef => ({\n key: placement.resourceUri\n ? `${modeId ?? \"global\"}:resource:${placement.resourceUri}`\n : `${modeId ?? \"global\"}:widget:${placement.contributionId}:${placement.widgetId}`,\n modeId,\n resource: placement.resource,\n contributionId: placement.contributionId,\n instanceKey: placement.widgetId,\n title: placement.title,\n});\n\nexport const entryFromCurrentSnapshot = (input: {\n counter: number;\n layout: LayoutModel;\n modes?: Pick<WorkbenchModeRegistry, \"getActiveModeId\" | \"getMode\">;\n}): WorkbenchNavigationEntry | undefined => {\n const modeId = input.modes?.getActiveModeId();\n const placement = locationPlacementFromLayout(input.layout);\n const recordedAt = Date.now();\n const base = {\n entryId: `history-${recordedAt}-${input.counter}`,\n recordedAt,\n selectedSubPanels: selectedSubPanelsFromLayout(input.layout, modeId),\n };\n\n if (placement) {\n return {\n ...base,\n location: locationFromPlacement(placement, modeId),\n kind: placement.resource ? \"resource\" : \"widget\",\n modeId,\n resource: placement.resource,\n widgetId: placement.widgetId,\n contributionId: placement.contributionId,\n title: placement.title,\n };\n }\n if (!modeId) return undefined;\n return {\n ...base,\n location: { key: `mode:${modeId}`, modeId, title: input.modes?.getMode(modeId)?.label ?? modeId },\n kind: \"mode\",\n modeId,\n title: input.modes?.getMode(modeId)?.label ?? modeId,\n };\n};\n\nexport const isSameNavigationEntry = (\n left: WorkbenchNavigationEntry | undefined,\n right: WorkbenchNavigationEntry | undefined,\n) => {\n if (!left || !right || left.location.key !== right.location.key) return false;\n return workbenchNavigationPanelRegions.every((region) =>\n isSameSubPanel(left.selectedSubPanels[region], right.selectedSubPanels[region]),\n );\n};\n\nexport const compactNavigationEntries = (entries: readonly WorkbenchNavigationEntry[]) => {\n const compacted: WorkbenchNavigationEntry[] = [];\n for (const entry of entries) {\n const lastIndex = compacted.length - 1;\n if (isSameNavigationEntry(compacted[lastIndex], entry)) compacted[lastIndex] = entry;\n else compacted.push(entry);\n }\n return compacted;\n};\n\nexport const withoutSubPanelSelection = (entry: WorkbenchNavigationEntry, placement: WorkbenchWidgetPlacement) => {\n const selectedSubPanels = { ...entry.selectedSubPanels };\n for (const region of workbenchPanelRegions) {\n const selected = selectedSubPanels[region];\n if (\n selected?.instanceKey === placement.widgetId ||\n (selected?.contributionId === placement.contributionId && selected.resourceUri === placement.resourceUri)\n ) {\n delete selectedSubPanels[region];\n }\n }\n return { ...entry, selectedSubPanels };\n};\n\nexport const closedNavigationEntry = (input: {\n counter: number;\n current?: WorkbenchNavigationEntry;\n closedSubPanel?: WorkbenchNavigationEntry[\"closedSubPanel\"];\n modeId?: string;\n placement: WorkbenchWidgetPlacement;\n}) => {\n const { closedSubPanel, counter, current, modeId, placement } = input;\n const recordedAt = Date.now();\n if (current) {\n return {\n ...current,\n entryId: `history-${recordedAt}-${counter}`,\n recordedAt,\n closedSubPanel,\n } satisfies WorkbenchNavigationEntry;\n }\n return {\n entryId: `history-${recordedAt}-${counter}`,\n recordedAt,\n location: {\n key: placement.resourceUri\n ? `${modeId ?? \"global\"}:resource:${placement.resourceUri}`\n : `${modeId ?? \"global\"}:widget:${placement.contributionId}:${placement.widgetId}`,\n modeId,\n resource: placement.resource,\n contributionId: placement.contributionId,\n instanceKey: placement.widgetId,\n title: placement.title,\n },\n selectedSubPanels: {},\n kind: placement.resource ? \"resource\" : \"widget\",\n modeId,\n resource: placement.resource,\n widgetId: placement.widgetId,\n contributionId: placement.contributionId,\n title: placement.title,\n closedSubPanel,\n } satisfies WorkbenchNavigationEntry;\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport type { ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { compactNavigationEntries } from \"./history-snapshot\";\nimport type { HistoryStoreState, PersistedWorkbenchHistory, WorkbenchNavigationEntry } from \"./history-types\";\n\nexport const WORKBENCH_HISTORY_VERSION = 1 as const;\nconst RECENTLY_CLOSED_LIMIT = 20;\n\nexport const emptyHistoryState = (): HistoryStoreState => ({\n entries: [],\n cursor: -1,\n recentlyClosed: [],\n hydrating: false,\n});\n\nexport const hydrateHistoryState = (persisted: PersistedWorkbenchHistory | undefined): HistoryStoreState => {\n if (persisted?.version !== WORKBENCH_HISTORY_VERSION) return emptyHistoryState();\n const entries = compactNavigationEntries(persisted.entries);\n return {\n entries,\n cursor: Math.min(Math.max(persisted.cursor, entries.length > 0 ? 0 : -1), entries.length - 1),\n recentlyClosed: persisted.recentlyClosed.slice(-RECENTLY_CLOSED_LIMIT),\n hydrating: false,\n };\n};\n\nconst reconcileEntry = (input: {\n entry: WorkbenchNavigationEntry;\n layout: LayoutModel;\n modes?: Pick<WorkbenchModeRegistry, \"getMode\">;\n resources: ResourceRegistry;\n}) => {\n const { entry, layout, modes, resources } = input;\n if (entry.modeId && modes && !modes.getMode(entry.modeId)) return undefined;\n if (entry.closedSubPanel && !layout.getWidget(entry.closedSubPanel.reference.contributionId)) {\n return undefined;\n }\n const contribution = entry.contributionId ? layout.getWidget(entry.contributionId) : undefined;\n const hasLocation =\n entry.kind === \"mode\"\n ? Boolean(entry.modeId && modes?.getMode(entry.modeId))\n : Boolean(\n (contribution && !contribution.panelMenuOwner && !contribution.eligibleLocations) ||\n (entry.resource && resources.listPresenters().some((presenter) => presenter.canOpen(entry.resource!))),\n );\n if (!hasLocation) return undefined;\n\n const selectedSubPanels = Object.fromEntries(\n Object.entries(entry.selectedSubPanels).filter(([, reference]) => {\n const widget = reference ? layout.getWidget(reference.contributionId) : undefined;\n return Boolean(widget);\n }),\n ) as WorkbenchNavigationEntry[\"selectedSubPanels\"];\n return { ...entry, selectedSubPanels };\n};\n\nexport const reconcileHistoryState = (input: {\n state: HistoryStoreState;\n layout: LayoutModel;\n modes?: Pick<WorkbenchModeRegistry, \"getMode\">;\n resources: ResourceRegistry;\n}) => {\n const { state } = input;\n const currentEntryId = state.entries[state.cursor]?.entryId;\n const entries = compactNavigationEntries(\n state.entries\n .map((entry) => reconcileEntry({ ...input, entry }))\n .filter((entry): entry is WorkbenchNavigationEntry => Boolean(entry)),\n );\n const retainedCursor = currentEntryId ? entries.findIndex((entry) => entry.entryId === currentEntryId) : -1;\n const cursor = retainedCursor >= 0 ? retainedCursor : Math.min(state.cursor, entries.length - 1);\n const recentlyClosed = state.recentlyClosed\n .map((entry) => reconcileEntry({ ...input, entry }))\n .filter((entry): entry is WorkbenchNavigationEntry => Boolean(entry));\n return { ...state, entries, cursor, recentlyClosed };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { findPlacementByWidgetId, getActiveLocationPlacement } from \"../../registries/layout/layout-operations\";\nimport type { WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport {\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n workbenchPanelRegions,\n} from \"../../registries/layout/layout-types\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n emptyHistoryState,\n hydrateHistoryState,\n reconcileHistoryState,\n WORKBENCH_HISTORY_VERSION,\n} from \"./history-reconciliation\";\nimport {\n closedNavigationEntry,\n compactNavigationEntries,\n entryFromCurrentSnapshot,\n findSubPanelPlacement,\n isSameNavigationEntry,\n withoutSubPanelSelection,\n workbenchNavigationPanelRegions,\n workbenchPlacementRole,\n} from \"./history-snapshot\";\nimport type {\n HistoryEntry,\n HistoryStoreState,\n WorkbenchHistoryPersistence,\n WorkbenchNavigationEntry,\n} from \"./history-types\";\n\nexport type {\n HistoryEntry,\n HistoryStoreState,\n PersistedWorkbenchHistory,\n WorkbenchHistoryPersistence,\n WorkbenchLocation,\n WorkbenchLocationRef,\n WorkbenchLocationWorkspaceState,\n WorkbenchNavigationEntry,\n WorkbenchPanelMenuRef,\n WorkbenchPanelMenuWorkspaceState,\n WorkbenchPanelWorkspaceState,\n WorkbenchSubPanelRef,\n} from \"./history-types\";\n\nexport interface HistoryController {\n store: WorkbenchStore<HistoryStoreState>;\n /** Snapshot the history for a compound navigation; the returned function restores it. */\n createCheckpoint(): () => void;\n goBack(): HistoryEntry | undefined;\n goForward(): HistoryEntry | undefined;\n goPrevious(): HistoryEntry | undefined;\n recentlyClosed(): readonly HistoryEntry[];\n reopenLastClosed(): HistoryEntry | undefined;\n setPersistenceScope(scope: string | undefined): void;\n getPersistenceScope(): string | undefined;\n restore(): HistoryEntry | undefined;\n flush(): void;\n clear(): void;\n}\n\nexport interface CreateHistoryControllerInput {\n layout: LayoutModel;\n modes?: Pick<\n WorkbenchModeRegistry,\n \"getActiveModeId\" | \"getMode\" | \"isTransitioning\" | \"onDidChangeActive\" | \"setActiveMode\"\n >;\n resources: ResourceRegistry;\n persistence?: WorkbenchHistoryPersistence;\n maxEntries?: number;\n // Replays mode and resource through the atomic navigator so no observer sees an\n // intermediate pair. Entries replay through the legacy mode restore without it.\n commitNavigation?(commit: {\n modeId?: string | null;\n resource?: ResourceRef | null;\n replaceActive?: boolean;\n }): unknown;\n}\n\nconst DEFAULT_MAX_ENTRIES = 50;\nconst RECENTLY_CLOSED_LIMIT = 20;\nconst PERSISTENCE_DELAY_MS = 50;\n\ninterface HistoryPersistenceSchedulerInput {\n persistence?: WorkbenchHistoryPersistence;\n store: WorkbenchStore<HistoryStoreState>;\n getScope(): string | undefined;\n}\n\nconst createHistoryPersistenceScheduler = (input: HistoryPersistenceSchedulerInput) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (!input.persistence) return;\n const { hydrating: _hydrating, ...state } = input.store.getState();\n input.persistence.setHistory({ ...state, version: WORKBENCH_HISTORY_VERSION }, input.getScope());\n };\n\n return {\n flush,\n schedule() {\n if (!input.persistence || timer) return;\n timer = setTimeout(flush, PERSISTENCE_DELAY_MS);\n },\n };\n};\n\nconst suppressTransitionSnapshot = (\n current: WorkbenchNavigationEntry | undefined,\n entry: WorkbenchNavigationEntry | undefined,\n fromLayoutChange: boolean,\n transitioning: boolean,\n) => {\n if (!transitioning) return false;\n if (!fromLayoutChange) return entry?.kind !== \"mode\";\n if (entry?.kind === \"mode\") return true;\n return current?.location.resource?.uri === entry?.location.resource?.uri;\n};\n\nconst currentNavigationEntry = (state: HistoryStoreState) => state.entries[state.cursor];\n\nconst placementsByWidgetId = (layout: LayoutModel) => {\n const placements = new Map<string, { placement: WorkbenchWidgetPlacement; region: WorkbenchRegion }>();\n for (const region of Object.values(layout.getLayout().regions)) {\n for (const placement of region.widgets) placements.set(placement.widgetId, { placement, region: region.id });\n }\n return placements;\n};\n\ninterface ActivateHistoryResourceInput {\n entry: WorkbenchNavigationEntry;\n resource: NonNullable<WorkbenchNavigationEntry[\"resource\"]>;\n placement?: WorkbenchWidgetPlacement;\n layout: LayoutModel;\n resources: ResourceRegistry;\n replayCurrentLocation?: boolean;\n replayResource(entry: WorkbenchNavigationEntry, replaceActive: boolean): Promise<unknown>;\n restoreSelections(entry: WorkbenchNavigationEntry): void;\n}\n\nconst activateHistoryResource = (input: ActivateHistoryResourceInput) => {\n const { entry, layout, placement, replayCurrentLocation, replayResource, resource, resources, restoreSelections } =\n input;\n const presenter = Object.values(resources.store.getState().presenters).find((candidate) =>\n candidate.canOpen(resource),\n );\n const activeLocationUri = getActiveLocationPlacement(layout.getLayout())?.resourceUri;\n if (presenter && (replayCurrentLocation || activeLocationUri !== resource.uri)) {\n return replayResource(entry, placement === undefined);\n }\n\n if (placement?.resourceUri === resource.uri) layout.activateWidget(placement.widgetId);\n else if (entry.contributionId && layout.getWidget(entry.contributionId)) {\n layout.openWidget(entry.contributionId, {\n resource,\n role: \"location\",\n title: entry.title,\n replaceActive: Boolean(placement),\n });\n } else if (placement) layout.activateWidget(placement.widgetId);\n restoreSelections(entry);\n return undefined;\n};\n\ninterface CreateHistoryControllerApiInput {\n controllerInput: CreateHistoryControllerInput;\n store: WorkbenchStore<HistoryStoreState>;\n activateEntry(\n entry: WorkbenchNavigationEntry,\n options?: { replayCurrentLocation?: boolean },\n ): Promise<unknown> | undefined;\n failRestore(scope: string | undefined, failedEntryId: string): void;\n finishRestore(scope?: string, restoredEntryId?: string): void;\n flush(): void;\n getPersistenceScope(): string | undefined;\n moveCursor(delta: number): WorkbenchNavigationEntry | undefined;\n runSilent(action: () => unknown): void;\n setPersistenceScope(scope: string | undefined): void;\n setState(state: HistoryStoreState, action: string, persist?: boolean): void;\n}\n\nconst createHistoryControllerApi = (input: CreateHistoryControllerApiInput): HistoryController => {\n const {\n activateEntry,\n controllerInput,\n failRestore,\n finishRestore,\n flush,\n getPersistenceScope,\n moveCursor,\n runSilent,\n setPersistenceScope,\n setState,\n store,\n } = input;\n\n return {\n store,\n goBack: () => moveCursor(-1),\n goForward: () => moveCursor(1),\n goPrevious() {\n const snapshot = store.getState();\n if (snapshot.hydrating) return undefined;\n const current = snapshot.entries[snapshot.cursor];\n for (let index = snapshot.entries.length - 1; index >= 0; index -= 1) {\n const candidate = snapshot.entries[index];\n if (isSameNavigationEntry(candidate, current)) continue;\n setState({ ...snapshot, cursor: index }, \"history.goPrevious\");\n runSilent(() => activateEntry(candidate));\n return candidate;\n }\n return undefined;\n },\n recentlyClosed: () => store.getState().recentlyClosed,\n reopenLastClosed() {\n const snapshot = store.getState();\n if (snapshot.hydrating) return undefined;\n const last = snapshot.recentlyClosed.at(-1);\n if (!last) return undefined;\n setState({ ...snapshot, recentlyClosed: snapshot.recentlyClosed.slice(0, -1) }, \"history.reopenClosed\");\n runSilent(() => {\n const pending = activateEntry(last);\n const reopenSubPanel = () => {\n if (!last.closedSubPanel) return;\n controllerInput.layout.openWidget(last.closedSubPanel.reference.contributionId, {\n region: last.closedSubPanel.region,\n resource: last.closedSubPanel.resource,\n title: last.closedSubPanel.title,\n closable: true,\n role: \"sub-panel\",\n });\n };\n if (pending instanceof Promise) void pending.then(reopenSubPanel);\n else reopenSubPanel();\n });\n return last;\n },\n setPersistenceScope,\n getPersistenceScope,\n restore() {\n const snapshot = reconcileHistoryState({\n state: store.getState(),\n layout: controllerInput.layout,\n modes: controllerInput.modes,\n resources: controllerInput.resources,\n });\n setState(snapshot, \"history.reconcile\");\n const entry = snapshot.entries[snapshot.cursor];\n const scope = getPersistenceScope();\n let pending: Promise<unknown> | undefined;\n if (entry) {\n try {\n runSilent(() => {\n const result = activateEntry(entry, { replayCurrentLocation: true });\n if (result instanceof Promise) pending = result;\n });\n } catch {\n failRestore(scope, entry.entryId);\n return entry;\n }\n }\n if (pending)\n void pending.then(\n () => finishRestore(scope, entry?.entryId),\n () => (entry ? failRestore(scope, entry.entryId) : finishRestore(scope)),\n );\n else finishRestore(scope, entry?.entryId);\n return entry;\n },\n flush,\n clear() {\n finishRestore();\n setState(emptyHistoryState(), \"history.clear\");\n },\n\n createCheckpoint() {\n const snapshot = store.getState();\n return () => setState(snapshot, \"history.rollback\");\n },\n };\n};\n\ninterface HistoryRestoreFinisherInput {\n store: WorkbenchStore<HistoryStoreState>;\n activateEntry(entry: WorkbenchNavigationEntry): Promise<unknown> | undefined;\n getScope(): string | undefined;\n onFinish(): void;\n runSilent(action: () => unknown): void;\n setState(state: HistoryStoreState, action: string, persist?: boolean): void;\n}\n\nconst createHistoryRestoreFinisher = (input: HistoryRestoreFinisherInput) => {\n function fail(scope: string | undefined, failedEntryId: string) {\n if (scope !== undefined && scope !== input.getScope()) return;\n const snapshot = input.store.getState();\n const currentEntryId = snapshot.entries[snapshot.cursor]?.entryId;\n const entries = snapshot.entries.filter((entry) => entry.entryId !== failedEntryId);\n const retainedCursor = currentEntryId ? entries.findIndex((entry) => entry.entryId === currentEntryId) : -1;\n input.setState(\n {\n ...snapshot,\n entries,\n cursor: retainedCursor >= 0 ? retainedCursor : Math.min(snapshot.cursor, entries.length - 1),\n recentlyClosed: snapshot.recentlyClosed.filter((entry) => entry.entryId !== failedEntryId),\n },\n \"history.discardFailedRestore\",\n );\n finish(scope, failedEntryId);\n }\n\n function finish(scope: string | undefined, restoredEntryId?: string) {\n if (scope !== undefined && scope !== input.getScope()) return;\n const snapshot = input.store.getState();\n const requestedEntry = snapshot.entries[snapshot.cursor];\n if (restoredEntryId && requestedEntry && requestedEntry.entryId !== restoredEntryId) {\n let pending: Promise<unknown> | undefined;\n try {\n input.runSilent(() => {\n const result = input.activateEntry(requestedEntry);\n if (result instanceof Promise) pending = result;\n });\n } catch {\n fail(scope, requestedEntry.entryId);\n return;\n }\n if (pending) {\n void pending.then(\n () => finish(scope, requestedEntry.entryId),\n () => fail(scope, requestedEntry.entryId),\n );\n } else finish(scope, requestedEntry.entryId);\n return;\n }\n input.onFinish();\n if (snapshot.hydrating) {\n input.setState({ ...snapshot, hydrating: false }, \"history.finishRestore\", false);\n }\n }\n\n return { fail, finish };\n};\n\ninterface HistoryCursorMoverInput {\n store: WorkbenchStore<HistoryStoreState>;\n activateEntry(entry: WorkbenchNavigationEntry): Promise<unknown> | undefined;\n flush(): void;\n runSilent(action: () => unknown): void;\n setState(state: HistoryStoreState, action: string): void;\n}\n\nconst createHistoryCursorMover = (input: HistoryCursorMoverInput) => (delta: number) => {\n const snapshot = input.store.getState();\n const cursor = snapshot.cursor + delta;\n const entry = snapshot.entries[cursor];\n if (!entry) return undefined;\n input.setState({ ...snapshot, cursor }, delta < 0 ? \"history.goBack\" : \"history.goForward\");\n input.flush();\n if (!snapshot.hydrating) input.runSilent(() => input.activateEntry(entry));\n return entry;\n};\n\nconst trackLayoutScopeRotation = (layout: CreateHistoryControllerInput[\"layout\"]) => {\n let rotating = false;\n layout.onWillChangePersistenceScope(() => {\n rotating = true;\n });\n layout.onDidChangePersistenceScope(() => {\n rotating = false;\n });\n return () => rotating;\n};\n\n// Restores the entry's context. An entry records the whole committed pair, including\n// \"no mode\" and \"no resource\", so replay commits it verbatim through the atomic\n// navigator and no observer sees an intermediate pair. Presentation of the resource\n// still happens through the replay path.\nconst restoreEntryContext = (input: CreateHistoryControllerInput, entry: WorkbenchNavigationEntry) => {\n if (input.commitNavigation) {\n input.commitNavigation({ modeId: entry.modeId ?? null, resource: entry.resource ?? null, replaceActive: true });\n return;\n }\n if (!entry.modeId) return;\n if (!input.modes?.getMode(entry.modeId)) return;\n if (input.modes.getActiveModeId() !== entry.modeId) input.modes.setActiveMode(entry.modeId);\n};\n\nexport const createHistoryController = (input: CreateHistoryControllerInput): HistoryController => {\n const store = createWorkbenchStore<HistoryStoreState>({\n name: \"workbench.history\",\n initialState: emptyHistoryState(),\n });\n let counter = 0;\n let navigating = false;\n let awaitingRestore = false;\n const isRotatingLayoutScope = trackLayoutScopeRotation(input.layout);\n let currentScope: string | undefined;\n const replayingResourceUris = new Set<string>();\n const { flush, schedule: schedulePersist } = createHistoryPersistenceScheduler({\n persistence: input.persistence,\n store,\n getScope: () => currentScope,\n });\n\n const setState = (state: HistoryStoreState, action: string, persist = true) => {\n store.setState(state, false, action);\n if (persist) schedulePersist();\n };\n\n const appendEntry = (candidate: WorkbenchNavigationEntry | undefined) => {\n if (!candidate) return;\n const snapshot = store.getState();\n const current = snapshot.entries[snapshot.cursor];\n if (isSameNavigationEntry(current, candidate)) return;\n const trimmed = snapshot.entries.slice(0, snapshot.cursor + 1);\n const replacesCurrentMode =\n current?.kind === \"mode\" && candidate.kind !== \"mode\" && current.modeId === candidate.modeId;\n const appended = compactNavigationEntries(\n replacesCurrentMode ? [...trimmed.slice(0, -1), candidate] : [...trimmed, candidate],\n );\n const entries = appended.slice(Math.max(0, appended.length - (input.maxEntries ?? DEFAULT_MAX_ENTRIES)));\n setState({ ...snapshot, entries, cursor: entries.length - 1 }, \"history.record\");\n };\n\n const recordSnapshot = (fromLayoutChange = false, completedResourceOpen = false) => {\n const paused = navigating || awaitingRestore || isRotatingLayoutScope();\n if (paused || (!completedResourceOpen && input.resources.isOpeningResource())) return;\n counter += 1;\n const entry = entryFromCurrentSnapshot({ counter, layout: input.layout, modes: input.modes });\n const current = currentNavigationEntry(store.getState());\n if (suppressTransitionSnapshot(current, entry, fromLayoutChange, input.modes?.isTransitioning() ?? false)) return;\n if (entry?.location.resource && replayingResourceUris.has(entry.location.resource.uri)) return;\n appendEntry(entry);\n };\n\n let lastPlacements = placementsByWidgetId(input.layout);\n\n const normalizeRemovedPlacement = (placement: WorkbenchWidgetPlacement) => {\n const snapshot = store.getState();\n const role = workbenchPlacementRole(input.layout, placement);\n if (role === \"location\" && input.resources.isOpeningResource()) return;\n if (role !== \"sub-panel\") {\n if (input.modes?.isTransitioning() || !input.layout.getWidget(placement.contributionId)) return;\n const entries = compactNavigationEntries(\n snapshot.entries.filter((entry) => entry.widgetId !== placement.widgetId),\n );\n if (entries.length === snapshot.entries.length) return;\n setState({ ...snapshot, entries, cursor: Math.min(snapshot.cursor, entries.length - 1) }, \"history.prune\");\n return;\n }\n\n const currentId = snapshot.entries[snapshot.cursor]?.entryId;\n const entries = compactNavigationEntries(\n snapshot.entries.map((entry) => withoutSubPanelSelection(entry, placement)),\n );\n const retainedCursor = currentId ? entries.findIndex((entry) => entry.entryId === currentId) : -1;\n setState(\n {\n ...snapshot,\n entries,\n cursor: retainedCursor >= 0 ? retainedCursor : Math.min(snapshot.cursor, entries.length - 1),\n },\n \"history.removeSubPanel\",\n );\n };\n\n const pushRecentlyClosed = (placement: WorkbenchWidgetPlacement, region: WorkbenchRegion) => {\n counter += 1;\n const snapshot = store.getState();\n const role = workbenchPlacementRole(input.layout, placement);\n const entry = closedNavigationEntry({\n placement,\n counter,\n current: role === \"sub-panel\" ? snapshot.entries[snapshot.cursor] : undefined,\n modeId: input.modes?.getActiveModeId(),\n closedSubPanel:\n role === \"sub-panel\" && workbenchPanelRegions.includes(region as WorkbenchPanelRegion)\n ? {\n region: region as WorkbenchPanelRegion,\n reference: {\n contributionId: placement.contributionId,\n resourceUri: placement.resourceUri,\n instanceKey: placement.widgetId,\n },\n resource: placement.resource,\n title: placement.title,\n }\n : undefined,\n });\n const recentlyClosed = [\n ...snapshot.recentlyClosed.filter((candidate) => !isSameNavigationEntry(candidate, entry)),\n entry,\n ].slice(-RECENTLY_CLOSED_LIMIT);\n setState({ ...snapshot, recentlyClosed }, \"history.recordClosed\");\n };\n\n input.layout.store.subscribeSelector(\n (state) => state.layout,\n () => {\n const nextPlacements = placementsByWidgetId(input.layout);\n if (awaitingRestore || isRotatingLayoutScope()) {\n lastPlacements = nextPlacements;\n return;\n }\n for (const [widgetId, tracked] of lastPlacements) {\n if (nextPlacements.has(widgetId)) continue;\n if (tracked.placement.closable) pushRecentlyClosed(tracked.placement, tracked.region);\n normalizeRemovedPlacement(tracked.placement);\n }\n lastPlacements = nextPlacements;\n recordSnapshot(true);\n },\n );\n input.modes?.onDidChangeActive(recordSnapshot);\n // A completed open owns a history commit even if another independent async\n // open is still in flight. Layout listeners remain suppressed until their\n // resource transaction completes, so each open still records one snapshot.\n input.resources.onDidOpenResource(() => recordSnapshot(false, true));\n\n const restoreSelections = (entry: WorkbenchNavigationEntry) => {\n for (const region of workbenchNavigationPanelRegions) {\n const reference = entry.selectedSubPanels[region];\n const placement = reference ? findSubPanelPlacement(input.layout, reference) : undefined;\n if (placement) {\n input.layout.activateWidget(placement.widgetId);\n continue;\n }\n const fallbackWidgetId = region === \"main\" ? input.layout.getLayout().activeLocationWidgetId : undefined;\n input.layout.setRegionActiveWidget(region, fallbackWidgetId);\n }\n };\n\n const restoreMode = (entry: WorkbenchNavigationEntry) => restoreEntryContext(input, entry);\n\n const replayResource = (entry: WorkbenchNavigationEntry, scope: string | undefined, replaceActive: boolean) => {\n const resource = entry.resource!;\n replayingResourceUris.add(resource.uri);\n return input.resources.openResource(resource, { replaceActive }).finally(() => {\n if (scope === currentScope) restoreSelections(entry);\n replayingResourceUris.delete(resource.uri);\n });\n };\n\n const activateEntry = (entry: WorkbenchNavigationEntry, options: { replayCurrentLocation?: boolean } = {}) => {\n const replayScope = currentScope;\n restoreMode(entry);\n if (entry.kind === \"mode\") {\n restoreSelections(entry);\n return undefined;\n }\n const placement = entry.widgetId\n ? findPlacementByWidgetId(input.layout.getLayout(), entry.widgetId)?.placement\n : undefined;\n if (entry.kind === \"resource\" && entry.resource) {\n return activateHistoryResource({\n entry,\n resource: entry.resource,\n placement,\n layout: input.layout,\n resources: input.resources,\n replayCurrentLocation: options.replayCurrentLocation,\n replayResource: (candidate, replaceActive) => replayResource(candidate, replayScope, replaceActive),\n restoreSelections,\n });\n }\n if (placement) input.layout.activateWidget(placement.widgetId);\n else if (entry.contributionId && input.layout.getWidget(entry.contributionId)) {\n input.layout.openWidget(entry.contributionId, { title: entry.title });\n }\n restoreSelections(entry);\n return undefined;\n };\n\n const runSilent = (action: () => unknown) => {\n navigating = true;\n try {\n action();\n } finally {\n navigating = false;\n }\n };\n\n const moveCursor = createHistoryCursorMover({ store, activateEntry, flush, runSilent, setState });\n\n const setPersistenceScope = (scope: string | undefined) => {\n if (scope === currentScope) return;\n flush();\n currentScope = scope;\n const hydrated = hydrateHistoryState(input.persistence?.getHistory(scope));\n awaitingRestore = hydrated.entries.length > 0;\n setState({ ...hydrated, hydrating: awaitingRestore }, \"history.setPersistenceScope\", false);\n };\n\n if (typeof window !== \"undefined\") window.addEventListener(\"pagehide\", flush);\n\n const restoreFinisher = createHistoryRestoreFinisher({\n store,\n activateEntry,\n getScope: () => currentScope,\n onFinish: () => {\n awaitingRestore = false;\n },\n runSilent,\n setState,\n });\n\n return createHistoryControllerApi({\n controllerInput: input,\n store,\n failRestore: restoreFinisher.fail,\n finishRestore: restoreFinisher.finish,\n setPersistenceScope,\n getPersistenceScope: () => currentScope,\n activateEntry,\n moveCursor,\n runSilent,\n setState,\n flush,\n });\n};\n","import type { ResourceRef } from \"../../registries/resources/resource-registry\";\n\nexport interface LastResourcePersistenceAdapter {\n getLastResource(): ResourceRef | undefined;\n setLastResource(resource: ResourceRef | undefined): void;\n}\n\nexport interface WorkbenchLastResourceController {\n get(): ResourceRef | undefined;\n set(resource: ResourceRef | undefined): void;\n // Replays the persisted resource through the registered presenters. Returns\n // `true` when the saved resource opened successfully — apps use that signal\n // to decide whether to fall back to a default landing view.\n restore(): Promise<boolean>;\n}\n\nexport interface CreateWorkbenchLastResourceControllerInput {\n persistence?: LastResourcePersistenceAdapter;\n openResource(resource: ResourceRef): Promise<unknown>;\n}\n\nexport const createWorkbenchLastResourceController = (\n input: CreateWorkbenchLastResourceControllerInput,\n): WorkbenchLastResourceController => {\n const get = () => input.persistence?.getLastResource();\n const set = (resource: ResourceRef | undefined) => input.persistence?.setLastResource(resource);\n\n const restore = async () => {\n const saved = get();\n if (!saved) return false;\n try {\n await input.openResource(saved);\n return true;\n } catch {\n // Saved resource is no longer openable (kind unregistered, provider\n // removed, …); let the caller fall back to its default.\n return false;\n }\n };\n\n return { get, set, restore };\n};\n","import type { WorkbenchModeContribution, WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\n\nexport type WorkbenchNavigationDiagnosticCode =\n | \"navigation_mode_missing\"\n | \"navigation_resource_missing\"\n | \"navigation_resource_incompatible\"\n | \"navigation_default_missing\"\n | \"navigation_target_stale\";\n\nexport interface WorkbenchNavigationTarget {\n modeId?: string;\n resource?: ResourceRef;\n replaceActive?: boolean;\n}\n\nexport type WorkbenchNavigationResult =\n | { ok: true; modeId: string | undefined; resource: ResourceRef | undefined }\n | { ok: false; code: WorkbenchNavigationDiagnosticCode; message: string };\n\nexport interface WorkbenchNavigationCommit {\n modeId: string | undefined;\n resource: ResourceRef | undefined;\n replaceActive: boolean;\n}\n\n// Host hooks let the application own selection bookkeeping and persistence-scope\n// naming while the navigator owns ordering and validation. Every hook runs inside\n// one commit; observers never see an intermediate mode-resource pair.\nexport interface WorkbenchNavigatorHostHooks {\n getProjectId?(): string | undefined;\n // The host's currently selected resource; defaults to the workbench primary.\n getSelectedResource?(): ResourceRef | undefined;\n // Maps a host pseudo-resource (for example a dashboard collection view) to the\n // effective selected resource; returning undefined selects an aggregate context.\n interpretSelection?(resource: ResourceRef): ResourceRef | undefined;\n // Applies the selected resource to host state (context keys, selection stores).\n applySelection?(resource: ResourceRef | undefined): void;\n // Rotates panel and layout persistence scopes for the committed context.\n applyScope?(commit: WorkbenchNavigationCommit): void;\n // Applies breadcrumbs for the committed context.\n applyBreadcrumb?(resource: ResourceRef | undefined): void;\n // Presents the committed resource (opens its primary location).\n presentResource?(resource: ResourceRef, input: { replaceActive: boolean }): Promise<unknown> | unknown;\n}\n\nexport interface WorkbenchNavigatorCommitInput {\n // `null` clears the active mode; `undefined` keeps it.\n modeId?: string | null;\n // `null` clears the selected resource; `undefined` keeps a compatible current one.\n resource?: ResourceRef | null;\n replaceActive?: boolean;\n // Skips presenting the resource; used when the caller opens the location itself.\n present?: boolean;\n}\n\nexport interface WorkbenchNavigator {\n configure(hooks: WorkbenchNavigatorHostHooks): void;\n // The currently selected resource as the host sees it.\n getSelectedResource(): ResourceRef | undefined;\n // Resolves fallbacks (last or default resource) and commits atomically.\n open(target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult>;\n // Commits an already-resolved pair synchronously. A failed target changes nothing.\n commitContext(input: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult;\n getLastResource(projectId: string | undefined, modeId: string): ResourceRef | undefined;\n // Clears per-mode last-resource records for a deleted resource.\n forgetResource(uri: string): void;\n onDidCommit(listener: (commit: WorkbenchNavigationCommit) => void): { dispose(): void };\n}\n\nexport interface CreateWorkbenchNavigatorInput {\n modes: WorkbenchModeRegistry;\n getSelectedResource(): ResourceRef | undefined;\n // Default presentation used when the host configures no presentResource hook.\n presentResource?(resource: ResourceRef, input: { replaceActive: boolean }): Promise<unknown> | unknown;\n}\n\n// A mode without declared kinds keeps the legacy accept-anything behavior until\n// PS-270 migrates every mode to explicit kinds. Declared kinds are enforced.\nconst modeAccepts = (mode: WorkbenchModeContribution, resource: ResourceRef | undefined) => {\n if (!resource) return true;\n if (!mode.resourceKinds) return true;\n return mode.resourceKinds.includes(resource.kind);\n};\n\nconst lastResourceKey = (projectId: string | undefined, modeId: string) => `${projectId ?? \"none\"}\\0${modeId}`;\n\nexport const createWorkbenchNavigator = (input: CreateWorkbenchNavigatorInput): WorkbenchNavigator => {\n let hooks: WorkbenchNavigatorHostHooks = {};\n // Hosts without an applySelection hook still get consistent commit semantics:\n // the navigator remembers the committed resource itself.\n let fallbackSelection: ResourceRef | undefined;\n const lastResources = new Map<string, ResourceRef>();\n const listeners = new Set<(commit: WorkbenchNavigationCommit) => void>();\n\n const recordLastResource = (modeId: string | undefined, resource: ResourceRef | undefined) => {\n if (!modeId || !resource) return;\n lastResources.set(lastResourceKey(hooks.getProjectId?.(), modeId), resource);\n };\n\n const getSelectedResource = () => hooks.getSelectedResource?.() ?? fallbackSelection ?? input.getSelectedResource();\n\n const presentResource = (resource: ResourceRef, present: { replaceActive: boolean }) =>\n (hooks.presentResource ?? input.presentResource)?.(resource, present);\n\n // `undefined` keeps the active mode; `null` clears it.\n const resolveTargetMode = (requested: string | null | undefined) => {\n const activeModeId = input.modes.getActiveModeId();\n const targetModeId = requested === undefined ? activeModeId : (requested ?? undefined);\n return { activeModeId, targetModeId, mode: targetModeId ? input.modes.getMode(targetModeId) : undefined };\n };\n\n // Resolves the final pair before anything mutates: a failed target changes nothing.\n const resolveCommit = (commit: WorkbenchNavigatorCommitInput) => {\n const { activeModeId, mode, targetModeId } = resolveTargetMode(commit.modeId);\n if (targetModeId && !mode) {\n return {\n failure: {\n ok: false as const,\n code: \"navigation_mode_missing\" as const,\n message: `Workbench mode not registered: ${targetModeId}`,\n },\n };\n }\n\n const requestedRaw = commit.resource === null ? undefined : commit.resource;\n const requestedEffective = requestedRaw ? (hooks.interpretSelection?.(requestedRaw) ?? requestedRaw) : undefined;\n if (requestedEffective && mode && !modeAccepts(mode, requestedEffective)) {\n return {\n failure: {\n ok: false as const,\n code: \"navigation_resource_incompatible\" as const,\n message: `Mode \"${targetModeId}\" does not accept resource kind \"${requestedEffective.kind}\"`,\n },\n };\n }\n const kept = commit.resource === undefined ? getSelectedResource() : undefined;\n const resource = requestedEffective ?? (mode && kept && modeAccepts(mode, kept) ? kept : undefined);\n return { activeModeId, resource, targetModeId };\n };\n\n const commitContext = (commit: WorkbenchNavigatorCommitInput): WorkbenchNavigationResult => {\n const outcome = resolveCommit(commit);\n if (outcome.failure) return outcome.failure;\n const { activeModeId, resource, targetModeId } = outcome;\n\n const resolved: WorkbenchNavigationCommit = {\n modeId: targetModeId,\n resource,\n replaceActive: commit.replaceActive ?? false,\n };\n\n // Commit order: selection, mode (seed deferred), scope rotation (exactly once),\n // reconciliation, breadcrumb. Observers of the final notification see one\n // committed pair, never an intermediate combination.\n if (hooks.applySelection)\n hooks.applySelection(commit.resource === undefined ? resource : (commit.resource ?? undefined));\n else fallbackSelection = resource;\n if (targetModeId !== activeModeId) {\n input.modes.setActiveMode(targetModeId, { deferSeed: true });\n }\n hooks.applyScope?.(resolved);\n if (targetModeId !== activeModeId) input.modes.seedActiveMode();\n hooks.applyBreadcrumb?.(resource);\n recordLastResource(targetModeId, resource);\n for (const listener of listeners) listener(resolved);\n return { ok: true, modeId: resolved.modeId, resource: resolved.resource };\n };\n\n const resolveDefaultResource = async (mode: WorkbenchModeContribution) => {\n if (!mode.defaultResource) return undefined;\n if (typeof mode.defaultResource === \"function\") return await mode.defaultResource();\n return mode.defaultResource;\n };\n\n // Commits the pair, then presents the resource. Presentation failure is reported\n // rather than thrown so callers can fall back without seeing a partial commit.\n const commitAndPresent = async (\n target: WorkbenchNavigationTarget,\n resource: ResourceRef,\n ): Promise<WorkbenchNavigationResult> => {\n const result = commitContext({\n modeId: target.modeId,\n resource,\n replaceActive: target.replaceActive,\n });\n if (!result.ok) return result;\n try {\n await presentResource(resource, { replaceActive: target.replaceActive ?? false });\n } catch (error) {\n return {\n ok: false,\n code: \"navigation_resource_missing\",\n message: error instanceof Error ? error.message : `Resource cannot be presented: ${resource.uri}`,\n };\n }\n return result;\n };\n\n // Entering a mode that does not accept the active resource restores that mode's\n // last compatible resource, then its default. A mode that needs neither commits\n // with a cleared context.\n const enterModeWithFallback = async (\n target: WorkbenchNavigationTarget,\n mode: WorkbenchModeContribution,\n targetModeId: string,\n ): Promise<WorkbenchNavigationResult> => {\n const key = lastResourceKey(hooks.getProjectId?.(), targetModeId);\n const last = lastResources.get(key);\n const fallback = last && modeAccepts(mode, last) ? last : await resolveDefaultResource(mode);\n\n if (fallback && modeAccepts(mode, fallback)) {\n const result = await commitAndPresent(target, fallback);\n if (result.ok || result.code !== \"navigation_resource_missing\") return result;\n // The stored fallback disappeared; commit the mode with a cleared context.\n lastResources.delete(key);\n return commitContext({ modeId: target.modeId, resource: null, replaceActive: target.replaceActive });\n }\n if ((mode.resourceKinds ?? []).length > 0 && mode.defaultResource) {\n return {\n ok: false,\n code: \"navigation_default_missing\",\n message: `Mode \"${targetModeId}\" has no valid default resource`,\n };\n }\n return commitContext({ modeId: target.modeId, resource: null, replaceActive: target.replaceActive });\n };\n\n const open = async (target: WorkbenchNavigationTarget): Promise<WorkbenchNavigationResult> => {\n const activeModeId = input.modes.getActiveModeId();\n const targetModeId = target.modeId ?? activeModeId;\n const mode = targetModeId ? input.modes.getMode(targetModeId) : undefined;\n if (targetModeId && !mode) {\n return { ok: false, code: \"navigation_mode_missing\", message: `Workbench mode not registered: ${targetModeId}` };\n }\n\n // Resource-only targets keep the mode and fail on incompatible kinds.\n if (target.resource) {\n if (mode && !modeAccepts(mode, target.resource)) {\n return {\n ok: false,\n code: \"navigation_resource_incompatible\",\n message: `Mode \"${targetModeId}\" does not accept resource kind \"${target.resource.kind}\"`,\n };\n }\n return await commitAndPresent(target, target.resource);\n }\n\n // Mode-only targets keep a compatible resource, otherwise restore the mode's\n // last compatible resource, otherwise its default resource.\n if (!mode || !targetModeId) {\n return commitContext({ modeId: target.modeId, replaceActive: target.replaceActive });\n }\n const current = getSelectedResource();\n if (current && modeAccepts(mode, current)) {\n return commitContext({ modeId: target.modeId, replaceActive: target.replaceActive });\n }\n return await enterModeWithFallback(target, mode, targetModeId);\n };\n\n return {\n configure(nextHooks) {\n hooks = nextHooks;\n },\n getSelectedResource,\n open,\n commitContext,\n getLastResource: (projectId, modeId) => lastResources.get(lastResourceKey(projectId, modeId)),\n forgetResource(uri) {\n for (const [key, resource] of lastResources) {\n if (resource.uri === uri) lastResources.delete(key);\n }\n },\n onDidCommit(listener) {\n listeners.add(listener);\n return { dispose: () => listeners.delete(listener) };\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkbenchPanelsState {\n openByRegionId: Record<string, boolean>;\n}\n\nexport interface PersistedWorkbenchPanels {\n openByRegionId: Record<string, boolean>;\n}\n\nexport interface WorkbenchPanelsPersistenceAdapter {\n getPanelStates(scope?: string): PersistedWorkbenchPanels | undefined;\n setPanelStates(state: PersistedWorkbenchPanels, scope?: string): void;\n}\n\nexport type WorkbenchPanelsChangeListener = (state: WorkbenchPanelsState) => void;\n\nexport interface WorkbenchPanelsController {\n store: WorkbenchStore<WorkbenchPanelsState>;\n isOpen(regionId: string): boolean;\n setOpen(regionId: string, open: boolean): void;\n toggle(regionId: string): void;\n setPersistenceScope(scope: string | undefined): void;\n getPersistenceScope(): string | undefined;\n onDidChange(listener: WorkbenchPanelsChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchPanelsControllerInput {\n defaultOpenByRegionId?: Partial<Record<string, boolean>>;\n persistence?: WorkbenchPanelsPersistenceAdapter;\n}\n\nexport const createWorkbenchPanelsController = (\n input: CreateWorkbenchPanelsControllerInput = {},\n): WorkbenchPanelsController => {\n let currentScope: string | undefined;\n const defaultOpenByRegionId = Object.fromEntries(\n Object.entries(input.defaultOpenByRegionId ?? {}).filter(\n (entry): entry is [string, boolean] => entry[1] !== undefined,\n ),\n );\n const persisted = input.persistence?.getPanelStates(currentScope);\n const resolveOpenByRegionId = (state: PersistedWorkbenchPanels | undefined) => ({\n ...defaultOpenByRegionId,\n ...state?.openByRegionId,\n });\n\n const store = createWorkbenchStore<WorkbenchPanelsState>({\n name: \"workbench.panels\",\n initialState: { openByRegionId: resolveOpenByRegionId(persisted) },\n });\n\n const persistState = () => {\n if (!input.persistence) return;\n input.persistence.setPanelStates({ openByRegionId: store.getState().openByRegionId }, currentScope);\n };\n\n const isOpen = (regionId: string) => store.getState().openByRegionId[regionId] ?? true;\n\n return {\n store,\n\n isOpen,\n\n setOpen(regionId, open) {\n const snapshot = store.getState();\n if ((snapshot.openByRegionId[regionId] ?? true) === open) return;\n store.setState(\n {\n openByRegionId: { ...snapshot.openByRegionId, [regionId]: open },\n },\n false,\n \"setPanelOpen\",\n );\n persistState();\n },\n\n toggle(regionId) {\n this.setOpen(regionId, !isOpen(regionId));\n },\n\n setPersistenceScope(scope) {\n if (scope === currentScope) return;\n persistState();\n currentScope = scope;\n const incoming = input.persistence?.getPanelStates(currentScope);\n store.setState({ openByRegionId: resolveOpenByRegionId(incoming) }, false, \"setPersistenceScope\");\n },\n\n getPersistenceScope: () => currentScope,\n\n onDidChange(listener) {\n const unsubscribe = store.subscribe((state) => listener(state));\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchSidePanelMode = \"floating\" | \"closed\" | \"attached\";\n\nexport type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;\n\nexport interface WorkbenchSidePanelState {\n mode: WorkbenchSidePanelMode;\n}\n\nexport interface WorkbenchSidePanelController {\n store: WorkbenchStore<WorkbenchSidePanelState>;\n getMode(): WorkbenchSidePanelMode;\n setMode(mode: WorkbenchSidePanelMode): void;\n onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable;\n}\n\nexport interface WorkbenchSidePanelPersistenceAdapter {\n getMode(): WorkbenchSidePanelMode | undefined;\n setMode(mode: WorkbenchSidePanelMode): void;\n}\n\nexport interface CreateWorkbenchSidePanelControllerInput {\n initialMode?: WorkbenchSidePanelMode;\n persistence?: WorkbenchSidePanelPersistenceAdapter;\n}\n\nexport const createWorkbenchSidePanelController = (\n input: CreateWorkbenchSidePanelControllerInput = {},\n): WorkbenchSidePanelController => {\n const internal = createWorkbenchStore<WorkbenchSidePanelState>({\n name: \"workbench.sidePanel\",\n // What the user last chose outranks the app's opening default.\n initialState: { mode: input.persistence?.getMode() ?? input.initialMode ?? \"floating\" },\n });\n\n return {\n store: internal,\n getMode() {\n return internal.getState().mode;\n },\n setMode(next) {\n if (internal.getState().mode === next) return;\n internal.setState({ mode: next }, false, \"setMode\");\n input.persistence?.setMode(next);\n },\n onDidChange(listener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.mode,\n (mode) => listener(mode),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n// Structural copies of the renderer-side terminal contract (`@pstdio/ui/terminal`\n// and `@pstdio/sdk` mirror the same shapes). Core owns its contracts, so these are\n// declared here instead of importing UI package types — the React layer bridges the two.\nexport interface WorkbenchTerminalSessionRequest {\n command?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols: number;\n rows: number;\n}\n\nexport interface WorkbenchTerminalSessionExit {\n code: number | null;\n signal: string | null;\n}\n\nexport interface WorkbenchTerminalSessionError {\n message: string;\n}\n\nexport interface WorkbenchTerminalSessionAdapter {\n readonly id: string;\n write(data: string | Uint8Array): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): Promise<void> | void;\n onData(handler: (chunk: Uint8Array) => void): () => void;\n /** Foreground process name updates, when the opener can report them (real PTYs). */\n onTitle?(handler: (title: string) => void): () => void;\n onExit(handler: (exit: WorkbenchTerminalSessionExit) => void): () => void;\n onError(handler: (error: WorkbenchTerminalSessionError) => void): () => void;\n}\n\n// Host-injected session factory. Production hosts back this with a PTY transport;\n// the testbench and stories inject a deterministic scripted opener.\nexport type WorkbenchTerminalSessionOpener = (\n request: WorkbenchTerminalSessionRequest,\n) => Promise<WorkbenchTerminalSessionAdapter>;\n\nexport type WorkbenchTerminalSessionStatus = \"running\" | \"exited\" | \"killed\";\n\nexport interface WorkbenchTerminalSessionModel {\n id: string;\n title: string;\n status: WorkbenchTerminalSessionStatus;\n exit?: WorkbenchTerminalSessionExit;\n}\n\nexport interface WorkbenchTerminalState {\n sessionsById: Record<string, WorkbenchTerminalSessionModel>;\n}\n\nexport interface WorkbenchTerminalSessionSink {\n onData?(chunk: Uint8Array): void;\n onExit?(exit: WorkbenchTerminalSessionExit): void;\n onError?(error: WorkbenchTerminalSessionError): void;\n}\n\nexport interface WorkbenchTerminalController {\n store: WorkbenchStore<WorkbenchTerminalState>;\n /** True once the host injected a session opener. */\n isAvailable(): boolean;\n setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;\n /** Opens a session; the live adapter stays host-side and only the id is returned. */\n open(input: { request: WorkbenchTerminalSessionRequest; title?: string }): Promise<{ sessionId: string }>;\n write(input: { sessionId: string; data: string | Uint8Array }): void;\n resize(input: { sessionId: string; cols: number; rows: number }): void;\n kill(input: { sessionId: string; signal?: string }): Promise<void>;\n subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;\n getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;\n listSessions(): WorkbenchTerminalSessionModel[];\n /** Kills every live session. Called when the owning workbench is torn down. */\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_SESSION_TITLE = \"Terminal\";\nconst INITIAL_DATA_BUFFER_LIMIT = 200;\n\nexport const createWorkbenchTerminalController = (): WorkbenchTerminalController => {\n const store = createWorkbenchStore<WorkbenchTerminalState>({\n name: \"workbench.terminal\",\n initialState: { sessionsById: {} },\n });\n\n let opener: WorkbenchTerminalSessionOpener | null = null;\n const adapters = new Map<string, WorkbenchTerminalSessionAdapter>();\n const adapterDisposers = new Map<string, Array<() => void>>();\n const initialDataBuffers = new Map<string, Uint8Array[]>();\n const sessionsWithDataSubscribers = new Set<string>();\n\n const patchSession = (sessionId: string, patch: Partial<WorkbenchTerminalSessionModel>, action: string) => {\n const snapshot = store.getState();\n const session = snapshot.sessionsById[sessionId];\n if (!session) return;\n store.setState(\n { sessionsById: { ...snapshot.sessionsById, [sessionId]: { ...session, ...patch } } },\n false,\n action,\n );\n };\n\n const requireAdapter = (sessionId: string) => {\n const adapter = adapters.get(sessionId);\n if (!adapter) throw new Error(`Unknown terminal session: ${sessionId}`);\n return adapter;\n };\n\n const cleanupSession = (sessionId: string) => {\n adapters.delete(sessionId);\n initialDataBuffers.delete(sessionId);\n sessionsWithDataSubscribers.delete(sessionId);\n const disposers = adapterDisposers.get(sessionId) ?? [];\n adapterDisposers.delete(sessionId);\n for (const dispose of disposers) dispose();\n };\n\n const bufferInitialData = (sessionId: string, chunk: Uint8Array) => {\n if (sessionsWithDataSubscribers.has(sessionId)) return;\n const buffer = initialDataBuffers.get(sessionId);\n if (!buffer) return;\n\n buffer.push(chunk);\n if (buffer.length > INITIAL_DATA_BUFFER_LIMIT) buffer.shift();\n };\n\n const kill = async (input: { sessionId: string; signal?: string }) => {\n const adapter = requireAdapter(input.sessionId);\n await adapter.kill(input.signal);\n patchSession(input.sessionId, { status: \"killed\" }, \"killTerminalSession\");\n cleanupSession(input.sessionId);\n };\n\n return {\n store,\n\n isAvailable: () => opener !== null,\n\n setSessionOpener(next) {\n opener = next;\n },\n\n async open(input) {\n if (!opener) throw new Error(\"Terminal sessions are not available in this workbench host.\");\n const adapter = await opener(input.request);\n adapters.set(adapter.id, adapter);\n initialDataBuffers.set(adapter.id, []);\n\n const disposers = [adapter.onData((chunk) => bufferInitialData(adapter.id, chunk))];\n const unsubscribeTitle = adapter.onTitle?.((title) =>\n patchSession(adapter.id, { title }, \"terminalSessionTitleChanged\"),\n );\n if (unsubscribeTitle) disposers.push(unsubscribeTitle);\n disposers.push(\n adapter.onExit((exit) => {\n const session = store.getState().sessionsById[adapter.id];\n if (session?.status === \"running\") {\n patchSession(adapter.id, { status: \"exited\", exit }, \"terminalSessionExited\");\n }\n cleanupSession(adapter.id);\n }),\n );\n adapterDisposers.set(adapter.id, disposers);\n\n const snapshot = store.getState();\n store.setState(\n {\n sessionsById: {\n ...snapshot.sessionsById,\n [adapter.id]: { id: adapter.id, title: input.title ?? DEFAULT_SESSION_TITLE, status: \"running\" },\n },\n },\n false,\n \"openTerminalSession\",\n );\n\n return { sessionId: adapter.id };\n },\n\n write(input) {\n requireAdapter(input.sessionId).write(input.data);\n },\n\n resize(input) {\n requireAdapter(input.sessionId).resize(input.cols, input.rows);\n },\n\n kill,\n\n subscribe(sessionId, sink) {\n const adapter = requireAdapter(sessionId);\n const unsubscribes: Array<(() => void) | undefined> = [];\n if (sink.onData) {\n const bufferedData = initialDataBuffers.get(sessionId) ?? [];\n initialDataBuffers.delete(sessionId);\n sessionsWithDataSubscribers.add(sessionId);\n unsubscribes.push(adapter.onData(sink.onData));\n for (const chunk of bufferedData) sink.onData(chunk);\n }\n unsubscribes.push(\n sink.onExit ? adapter.onExit(sink.onExit) : undefined,\n sink.onError ? adapter.onError(sink.onError) : undefined,\n );\n return () => {\n for (const unsubscribe of unsubscribes) unsubscribe?.();\n };\n },\n\n getSession(sessionId) {\n return store.getState().sessionsById[sessionId];\n },\n\n listSessions() {\n return Object.values(store.getState().sessionsById);\n },\n\n async dispose() {\n const running = Object.values(store.getState().sessionsById).filter((session) => session.status === \"running\");\n await Promise.all(running.map((session) => kill({ sessionId: session.id })));\n for (const session of Object.values(store.getState().sessionsById)) cleanupSession(session.id);\n adapters.clear();\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface CommandPaletteResourceQueryContext {\n query: string;\n limit: number;\n}\n\n// A single dynamic palette result. `activate` is supplied by whoever registers the\n// provider (e.g. the extension host running a command or opening a resource), keeping\n// this registry free of command/resource execution concerns.\nexport interface CommandPaletteResourceResult {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n group?: string;\n activate(): void | Promise<void>;\n}\n\nexport interface CommandPaletteResourceProvider {\n id: string;\n title: string;\n refreshEventIds?: string[];\n query(context: CommandPaletteResourceQueryContext): Promise<readonly CommandPaletteResourceResult[]>;\n}\n\nexport interface CommandPaletteResourceProviderResult {\n providerId: string;\n title: string;\n results: readonly CommandPaletteResourceResult[];\n}\n\nexport interface CommandPaletteResourceRegistryStoreState {\n providers: Record<string, CommandPaletteResourceProvider>;\n // Bumped to ask the palette to re-query providers (e.g. after a refresh event).\n refreshToken: number;\n}\n\nexport interface CommandPaletteResourceRegistry {\n store: WorkbenchStore<CommandPaletteResourceRegistryStoreState>;\n registerProvider(provider: CommandPaletteResourceProvider): Disposable;\n listProviders(): CommandPaletteResourceProvider[];\n queryProviders(context: CommandPaletteResourceQueryContext): Promise<CommandPaletteResourceProviderResult[]>;\n refresh(): void;\n}\n\nexport const createCommandPaletteResourceRegistry = (): CommandPaletteResourceRegistry => {\n const store = createWorkbenchStore<CommandPaletteResourceRegistryStoreState>({\n name: \"workbench.commandPaletteResources\",\n initialState: { providers: {}, refreshToken: 0 },\n });\n\n return {\n store,\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) {\n throw new Error(`Command palette resource provider already registered: ${provider.id}`);\n }\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 async queryProviders(context) {\n const providers = Object.values(store.getState().providers);\n return Promise.all(\n providers.map(async (provider) => {\n try {\n const results = await provider.query(context);\n return { providerId: provider.id, title: provider.title, results };\n } catch {\n // Error isolation: a failing provider must not blank the palette or break peers.\n return { providerId: provider.id, title: provider.title, results: [] };\n }\n }),\n );\n },\n\n refresh() {\n const snapshot = store.getState();\n store.setState({ ...snapshot, refreshToken: snapshot.refreshToken + 1 }, false, \"refresh\");\n },\n };\n};\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 { ResourceRef } from \"../resources/resource-registry\";\n\nexport interface WorkbenchCommandExecutionError {\n commandId: string;\n args: unknown;\n error: unknown;\n}\n\nexport type WorkbenchCommandExecutionErrorListener = (event: WorkbenchCommandExecutionError) => void;\n\nexport interface WorkbenchCommandExecutionContext {\n resource?: ResourceRef;\n source?: \"panel-add\";\n}\n\nexport interface CommandParamOption {\n label: string;\n value: string;\n icon?: string;\n}\n\nexport interface CommandParamDescriptor {\n type: string;\n label?: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: CommandParamOption[];\n templateType?: string;\n resourceType?: string;\n accept?: string;\n multiple?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport type CommandParamSchema = Record<string, CommandParamDescriptor>;\n\nexport interface Command {\n id: string;\n label: string;\n category?: string;\n description?: string;\n icon?: string;\n when?: string;\n params?: CommandParamSchema;\n}\n\nexport interface CommandHandler<TArgs = unknown, TResult = unknown> {\n prepareArgs?(\n args: TArgs,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: TArgs) => void,\n ): TArgs | Promise<TArgs>;\n execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;\n isEnabled?(args: TArgs): boolean;\n isVisible?(args: TArgs): boolean;\n isToggled?(args: TArgs): boolean;\n}\n\nexport interface RegisteredCommand extends RegisteredContributionMetadata {\n command: Command;\n handler: CommandHandler;\n}\n\nexport interface CommandRegistryStoreState {\n commands: Record<string, RegisteredCommand>;\n}\n\nexport interface CommandRegistry {\n store: WorkbenchStore<CommandRegistryStoreState>;\n registerCommand<TArgs = unknown, TResult = unknown>(\n command: Command,\n handler: CommandHandler<TArgs, TResult>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getCommand(id: string): RegisteredCommand | undefined;\n listCommands(): RegisteredCommand[];\n isCommandEnabled(id: string, args?: unknown): boolean;\n isCommandVisible(id: string, args?: unknown): boolean;\n isCommandToggled(id: string, args?: unknown): boolean;\n prepareCommandArgs(\n id: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown>;\n executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;\n onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable;\n}\n\nexport interface CreateCommandRegistryInput {\n context?: ContextKeyService;\n}\n\nexport const createCommandRegistry = (input: CreateCommandRegistryInput = {}): CommandRegistry => {\n const store = createWorkbenchStore<CommandRegistryStoreState>({\n name: \"workbench.commands\",\n initialState: { commands: {} },\n });\n\n const errorListeners = new Set<WorkbenchCommandExecutionErrorListener>();\n\n const requireCommand = (id: string) => {\n const record = store.getState().commands[id];\n if (!record) throw new Error(`Command not registered: ${id}`);\n return record;\n };\n\n const emitError = (event: WorkbenchCommandExecutionError) => {\n for (const listener of errorListeners) listener(event);\n };\n\n return {\n store,\n\n registerCommand(command, handler, metadata) {\n const snapshot = store.getState();\n if (snapshot.commands[command.id]) throw new Error(`Command already registered: ${command.id}`);\n\n const record: RegisteredCommand = {\n ...normalizeContributionMetadata(metadata),\n command,\n handler: handler as CommandHandler,\n };\n\n store.setState({ commands: { ...snapshot.commands, [command.id]: record } }, false, \"registerCommand\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.commands[command.id] !== record) return;\n const { [command.id]: _removed, ...rest } = current.commands;\n store.setState({ commands: rest }, false, \"unregisterCommand\");\n });\n },\n\n getCommand(id) {\n return store.getState().commands[id];\n },\n\n listCommands() {\n return Object.values(store.getState().commands).sort(byContributionPriority);\n },\n\n isCommandEnabled(id, args) {\n return requireCommand(id).handler.isEnabled?.(args) ?? true;\n },\n\n isCommandVisible(id, args) {\n const record = requireCommand(id);\n if (!input.context?.matches(record.command.when)) return false;\n return record.handler.isVisible?.(args) ?? true;\n },\n\n isCommandToggled(id, args) {\n return requireCommand(id).handler.isToggled?.(args) ?? false;\n },\n\n async prepareCommandArgs(id, args, context, onArgsChange) {\n const prepare = requireCommand(id).handler.prepareArgs;\n return prepare ? prepare(args, context, onArgsChange) : args;\n },\n\n async executeCommand(id, args, context) {\n const record = requireCommand(id);\n if (record.handler.isEnabled?.(args) === false) {\n const error = new Error(`Command is disabled: ${id}`);\n emitError({ commandId: id, args, error });\n throw error;\n }\n try {\n return await record.handler.execute(args, context);\n } catch (error) {\n emitError({ commandId: id, args, error });\n throw error;\n }\n },\n\n onDidExecuteError(listener) {\n errorListeners.add(listener);\n return createDisposable(() => {\n errorListeners.delete(listener);\n });\n },\n };\n};\n","import {\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 type MenuPath = readonly string[];\n\nexport interface MenuItem {\n commandId: string;\n sourceCommandId?: string;\n label?: string;\n description?: string;\n icon?: string;\n iconSrc?: string;\n overflowLabel?: string;\n when?: string;\n group?: string;\n order?: number;\n args?: unknown;\n readOnly?: boolean;\n /** Marks a menu action that navigates outside the app, rendered with a trailing external-link icon. */\n external?: boolean;\n}\n\nexport interface RegisteredMenuItem extends MenuItem, RegisteredContributionMetadata {\n path: MenuPath;\n}\n\ninterface MenuRegistryDeps {\n commands: CommandRegistry;\n}\n\nconst menuPathKey = (path: MenuPath) => path.join(\"/\");\n\nexport interface MenuRegistryStoreState {\n itemsByPath: Record<string, RegisteredMenuItem[]>;\n}\n\nexport interface MenuRegistry {\n menuStore: WorkbenchStore<MenuRegistryStoreState>;\n registerMenuItem(path: MenuPath, item: MenuItem, metadata?: ContributionMetadata): Disposable;\n listMenuItems(path: MenuPath): RegisteredMenuItem[];\n}\n\nexport const createMenuRegistry = (deps: MenuRegistryDeps): MenuRegistry => {\n const menuStore = createWorkbenchStore<MenuRegistryStoreState>({\n name: \"workbench.menus\",\n initialState: { itemsByPath: {} },\n });\n\n return {\n menuStore,\n\n registerMenuItem(path, item, metadata) {\n if (!deps.commands.getCommand(item.commandId)) throw new Error(`Menu command not registered: ${item.commandId}`);\n\n const key = menuPathKey(path);\n const record: RegisteredMenuItem = {\n ...normalizeContributionMetadata(metadata),\n ...item,\n path,\n };\n const snapshot = menuStore.getState();\n const items = snapshot.itemsByPath[key] ?? [];\n menuStore.setState(\n {\n itemsByPath: { ...snapshot.itemsByPath, [key]: [...items, record] },\n },\n false,\n \"registerMenuItem\",\n );\n\n return createDisposable(() => {\n const current = menuStore.getState();\n const list = current.itemsByPath[key] ?? [];\n const filtered = list.filter((entry) => entry !== record);\n if (filtered.length === list.length) return;\n menuStore.setState(\n {\n itemsByPath: { ...current.itemsByPath, [key]: filtered },\n },\n false,\n \"unregisterMenuItem\",\n );\n });\n },\n\n listMenuItems(path) {\n return [...(menuStore.getState().itemsByPath[menuPathKey(path)] ?? [])].sort((left, right) => {\n const leftOrder = left.order ?? 0;\n const rightOrder = right.order ?? 0;\n return leftOrder - rightOrder || byContributionPriority(left, right);\n });\n },\n };\n};\n","import {\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 { OpenWorkbenchPanelInput } from \"../layout/layout-types\";\nimport type { OpenResourceInput, ResourceRef } from \"../resources/resource-registry\";\n\nexport interface NavigationTargetResource {\n kind: \"resource\";\n resource: ResourceRef;\n input?: OpenResourceInput;\n}\n\nexport interface NavigationTargetPanel {\n kind: \"panel\";\n panelId: string;\n input?: OpenWorkbenchPanelInput;\n}\n\nexport interface NavigationTargetCommand {\n kind: \"command\";\n commandId: string;\n args?: unknown;\n}\n\nexport type NavigationTargetItem = NavigationTargetResource | NavigationTargetPanel | NavigationTargetCommand;\n\nexport interface NavigationTargetCompound {\n kind: \"compound\";\n targets: readonly NavigationTargetItem[];\n}\n\nexport type NavigationTarget = NavigationTargetItem | NavigationTargetCompound;\n\nexport interface NavigationParser {\n id: string;\n priority?: number;\n canParse(location: string): boolean;\n parse(location: string): NavigationTarget;\n}\n\nexport type RegisteredNavigationParser = Omit<NavigationParser, \"priority\"> & RegisteredContributionMetadata;\n\nexport interface ResourceNavigator<TResult = unknown> {\n id: string;\n priority?: number;\n canNavigate(resource: ResourceRef): boolean;\n createHref?(resource: ResourceRef): string;\n navigate(resource: ResourceRef): TResult | Promise<TResult>;\n}\n\nexport type RegisteredResourceNavigator = Omit<ResourceNavigator, \"priority\"> & RegisteredContributionMetadata;\n\n// Minimal presenter surface the navigation dispatcher needs; resolved through a\n// closure to break the otherwise-circular core ↔ navigation dep.\nexport interface NavigationDispatcherContext {\n canOpenResource?(resource: ResourceRef): boolean;\n canOpenPanel?(panelId: string): boolean;\n canExecuteCommand?(commandId: string): boolean;\n createCheckpoint?(): undefined | (() => void);\n openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<unknown>;\n openPanel(panelId: string, input?: OpenWorkbenchPanelInput): unknown;\n executeCommand(commandId: string, args?: unknown): Promise<unknown> | unknown;\n}\n\nconst byPriorityAndId = (left: { id: string; priority: number }, right: { id: string; priority: number }) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport interface NavigationRegistryStoreState {\n parsers: Record<string, RegisteredNavigationParser>;\n navigators: Record<string, RegisteredResourceNavigator>;\n}\n\nexport interface NavigationRegistry {\n store: WorkbenchStore<NavigationRegistryStoreState>;\n registerParser(parser: NavigationParser, metadata?: ContributionMetadata): Disposable;\n listParsers(): RegisteredNavigationParser[];\n resolveLocation(location: string): NavigationTarget;\n openTarget(target: NavigationTarget): Promise<readonly unknown[]>;\n navigate(location: string): Promise<readonly unknown[]>;\n registerNavigator(navigator: ResourceNavigator, metadata?: ContributionMetadata): Disposable;\n listNavigators(): RegisteredResourceNavigator[];\n createHref(resource: ResourceRef): string;\n navigateResource(resource: ResourceRef): Promise<unknown>;\n}\n\nexport interface CreateNavigationRegistryInput {\n // Returns the presenters the dispatcher should call. Lazy so `createWorkbenchCore`\n // can install the navigation registry before the rest of the core is ready.\n resolveDispatcher?(): NavigationDispatcherContext;\n}\n\nconst noDispatcher = (): NavigationDispatcherContext => {\n throw new Error(\"navigation.openTarget: no dispatcher available (configure resolveDispatcher)\");\n};\n\nconst dispatchItem = async (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"resource\") return dispatcher.openResource(target.resource, target.input);\n if (target.kind === \"panel\") return dispatcher.openPanel(target.panelId, target.input);\n return dispatcher.executeCommand(target.commandId, target.args);\n};\n\nconst validateItem = (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"resource\" && dispatcher.canOpenResource?.(target.resource) === false) {\n throw new Error(`Cannot open navigation resource target: ${target.resource.uri}`);\n }\n if (target.kind === \"panel\" && dispatcher.canOpenPanel?.(target.panelId) === false) {\n throw new Error(`Cannot open navigation Panel target: ${target.panelId}`);\n }\n if (target.kind === \"command\" && dispatcher.canExecuteCommand?.(target.commandId) === false) {\n throw new Error(`Cannot open navigation command target: ${target.commandId}`);\n }\n};\n\nconst toItems = (target: NavigationTarget): readonly NavigationTargetItem[] =>\n target.kind === \"compound\" ? target.targets : [target];\n\nexport const createNavigationRegistry = (input: CreateNavigationRegistryInput = {}): NavigationRegistry => {\n const resolveDispatcher = input.resolveDispatcher ?? noDispatcher;\n\n const store = createWorkbenchStore<NavigationRegistryStoreState>({\n name: \"workbench.navigation\",\n initialState: { parsers: {}, navigators: {} },\n });\n\n const removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n };\n\n const registry: NavigationRegistry = {\n store,\n\n registerParser(parser, metadata) {\n const snapshot = store.getState();\n if (snapshot.parsers[parser.id]) throw new Error(`Navigation parser already registered: ${parser.id}`);\n\n const { priority, ...parserContribution } = parser;\n const record: RegisteredNavigationParser = {\n ...parserContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n\n store.setState({ ...snapshot, parsers: { ...snapshot.parsers, [parser.id]: record } }, false, \"registerParser\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.parsers[parser.id] !== record) return;\n store.setState({ ...current, parsers: removeKey(current.parsers, parser.id) }, false, \"unregisterParser\");\n });\n },\n\n listParsers() {\n return Object.values(store.getState().parsers).sort(byPriorityAndId);\n },\n\n resolveLocation(location) {\n const parser = this.listParsers().find((candidate) => candidate.canParse(location));\n if (!parser) throw new Error(`No navigation parser registered for location: ${location}`);\n return parser.parse(location);\n },\n\n async openTarget(target) {\n const dispatcher = resolveDispatcher();\n const items = toItems(target);\n const results: unknown[] = [];\n\n for (const item of items) validateItem(item, dispatcher);\n\n const rollback = target.kind === \"compound\" ? dispatcher.createCheckpoint?.() : undefined;\n try {\n for (const item of items) {\n // Sequential by design: a `compound` target's items often depend on\n // each other (open resource, then reveal the view that hosts it).\n const result = await dispatchItem(item, dispatcher);\n results.push(result);\n }\n } catch (error) {\n rollback?.();\n throw error;\n }\n return results;\n },\n\n async navigate(location) {\n return registry.openTarget(registry.resolveLocation(location));\n },\n\n registerNavigator(navigator, metadata) {\n const snapshot = store.getState();\n if (snapshot.navigators[navigator.id]) throw new Error(`Resource navigator already registered: ${navigator.id}`);\n\n const { priority, ...navigatorContribution } = navigator;\n const record: RegisteredResourceNavigator = {\n ...navigatorContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n\n store.setState(\n { ...snapshot, navigators: { ...snapshot.navigators, [navigator.id]: record } },\n false,\n \"registerNavigator\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.navigators[navigator.id] !== record) return;\n store.setState(\n { ...current, navigators: removeKey(current.navigators, navigator.id) },\n false,\n \"unregisterNavigator\",\n );\n });\n },\n\n listNavigators() {\n return Object.values(store.getState().navigators).sort(byPriorityAndId);\n },\n\n createHref(resource) {\n const navigator = this.listNavigators().find(\n (candidate) => candidate.createHref && candidate.canNavigate(resource),\n );\n if (!navigator?.createHref) throw new Error(`No navigator href registered for resource kind: ${resource.kind}`);\n return navigator.createHref(resource);\n },\n\n async navigateResource(resource) {\n const navigator = this.listNavigators().find((candidate) => candidate.canNavigate(resource));\n if (!navigator) throw new Error(`No navigator registered for resource kind: ${resource.kind}`);\n return await navigator.navigate(resource);\n },\n };\n\n return registry;\n};\n","import {\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 { ResourceRef } from \"../resources/resource-registry\";\n\nexport type WorkbenchNotificationLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface WorkbenchNotificationAction {\n commandId: string;\n title: string;\n args?: unknown;\n}\n\nexport interface WorkbenchNotification {\n id?: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt?: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {\n id: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport type WorkbenchNotificationEvent =\n | { type: \"show\"; id: string; notification: RegisteredWorkbenchNotification }\n | { type: \"dismiss\"; id: string };\n\ntype WorkbenchNotificationListener = (event: WorkbenchNotificationEvent) => void;\n\nexport interface WorkbenchNotificationStoreState {\n notifications: Record<string, RegisteredWorkbenchNotification>;\n}\n\nexport interface NotificationRegistry {\n store: WorkbenchStore<WorkbenchNotificationStoreState>;\n show(notification: WorkbenchNotification, metadata?: ContributionMetadata): RegisteredWorkbenchNotification;\n dismiss(id: string): boolean;\n clear(): void;\n listNotifications(): RegisteredWorkbenchNotification[];\n subscribe(listener: WorkbenchNotificationListener): Disposable;\n}\n\nexport const createNotificationRegistry = (): NotificationRegistry => {\n const store = createWorkbenchStore<WorkbenchNotificationStoreState>({\n name: \"workbench.notifications\",\n initialState: { notifications: {} },\n });\n\n const listeners = new Set<WorkbenchNotificationListener>();\n let generatedId = 0;\n\n const emit = (event: WorkbenchNotificationEvent) => {\n for (const listener of listeners) listener(event);\n };\n\n return {\n store,\n\n show(notification, metadata) {\n let id = notification.id;\n if (!id) {\n generatedId += 1;\n id = `workbench.notification.${generatedId.toString()}`;\n }\n\n const record: RegisteredWorkbenchNotification = {\n ...normalizeContributionMetadata(metadata),\n ...notification,\n id,\n createdAt: notification.createdAt ?? new Date().toISOString(),\n };\n\n const snapshot = store.getState();\n store.setState({ notifications: { ...snapshot.notifications, [id]: record } }, false, \"showNotification\");\n emit({ type: \"show\", id, notification: record });\n\n return record;\n },\n\n dismiss(id) {\n const snapshot = store.getState();\n if (!snapshot.notifications[id]) return false;\n const { [id]: _removed, ...rest } = snapshot.notifications;\n store.setState({ notifications: rest }, false, \"dismissNotification\");\n emit({ type: \"dismiss\", id });\n return true;\n },\n\n clear() {\n const ids = Object.keys(store.getState().notifications);\n store.setState({ notifications: {} }, false, \"clearNotifications\");\n for (const id of ids) emit({ type: \"dismiss\", id });\n },\n\n listNotifications() {\n return Object.values(store.getState().notifications).sort((left, right) =>\n right.createdAt.localeCompare(left.createdAt),\n );\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return createDisposable(() => {\n listeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type PreferenceScope = \"default\" | \"user\" | \"project\" | \"repo\" | \"workspace\" | \"extension\" | \"session\";\nexport type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;\n\nexport interface PreferencePropertySchema {\n type: \"boolean\" | \"number\" | \"string\" | \"array\" | \"object\";\n enum?: PreferenceValue[];\n default?: PreferenceValue;\n scope: PreferenceScope;\n description?: string;\n}\n\nexport interface PreferenceSchemaContribution {\n properties: Record<string, PreferencePropertySchema>;\n}\n\nexport interface PreferenceScopeRef {\n scope: PreferenceScope;\n scopeId?: string;\n}\n\nexport interface PreferencePersistenceAdapter {\n getValue(name: string, scope: PreferenceScopeRef): PreferenceValue | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n}\n\nexport interface CreatePreferenceRegistryInput {\n persistence?: PreferencePersistenceAdapter;\n}\n\ntype RegisteredPreferenceSchema = PreferencePropertySchema & { ownerId: string; source: string };\n\nexport interface PreferenceRegistryStoreState {\n schemas: Record<string, RegisteredPreferenceSchema>;\n}\n\nexport interface PreferenceRegistry {\n store: WorkbenchStore<PreferenceRegistryStoreState>;\n registerSchema(schema: PreferenceSchemaContribution, metadata?: ContributionMetadata): Disposable;\n getSchema(name: string): RegisteredPreferenceSchema | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n getValue(name: string, scope?: PreferenceScopeRef): PreferenceValue | undefined;\n}\n\nconst valueKey = (name: string, scope: PreferenceScopeRef) => `${name}:${scope.scope}:${scope.scopeId ?? \"\"}`;\n\nconst createMemoryPreferencePersistence = () => {\n const values = new Map<string, PreferenceValue>();\n\n return {\n getValue(name: string, scope: PreferenceScopeRef) {\n return values.get(valueKey(name, scope));\n },\n\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef) {\n values.set(valueKey(name, scope), value);\n },\n } satisfies PreferencePersistenceAdapter;\n};\n\nexport const createPreferenceRegistry = (input: CreatePreferenceRegistryInput = {}): PreferenceRegistry => {\n const store = createWorkbenchStore<PreferenceRegistryStoreState>({\n name: \"workbench.preferences\",\n initialState: { schemas: {} },\n });\n const persistence = input.persistence ?? createMemoryPreferencePersistence();\n\n return {\n store,\n\n registerSchema(schema, metadata) {\n const registeredNames = Object.keys(schema.properties);\n const snapshot = store.getState();\n\n for (const name of registeredNames) {\n if (snapshot.schemas[name]) throw new Error(`Preference schema already registered: ${name}`);\n }\n\n const additions: Record<string, RegisteredPreferenceSchema> = {};\n for (const name of registeredNames) {\n const property = schema.properties[name];\n if (property) {\n additions[name] = {\n ...property,\n ownerId: metadata?.ownerId ?? \"workbench.core\",\n source: metadata?.source ?? \"module\",\n };\n }\n }\n\n store.setState({ schemas: { ...snapshot.schemas, ...additions } }, false, \"registerSchema\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = { ...current.schemas };\n for (const name of registeredNames) delete next[name];\n store.setState({ schemas: next }, false, \"unregisterSchema\");\n });\n },\n\n getSchema(name) {\n return store.getState().schemas[name];\n },\n\n setValue(name, value, scope) {\n if (!store.getState().schemas[name]) throw new Error(`Preference schema not registered: ${name}`);\n persistence.setValue(name, value, scope);\n },\n\n getValue(name, scope) {\n if (scope) {\n const scoped = persistence.getValue(name, scope);\n if (scoped !== undefined) return scoped;\n }\n\n const userValue = persistence.getValue(name, { scope: \"user\" });\n if (userValue !== undefined) return userValue;\n\n return store.getState().schemas[name]?.default;\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport type ControlsRendererRegion = \"main-right-menu\" | \"secondary\" | \"overlay\";\n\nexport interface ControlsRendererLayout {\n region?: ControlsRendererRegion;\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\n// The control declarations + current values a controls renderer resolves. `params`\n// and `groups` are @pstdio/ui ParamEditor shapes; kept structural here so the core\n// registry stays free of a UI dependency (the React view casts them).\nexport interface ControlsQueryResult {\n params?: unknown[];\n groups?: unknown[];\n values?: Record<string, unknown>;\n readOnly?: boolean;\n}\n\nexport interface ControlsUpdateValueInput {\n controlId: string;\n value: unknown;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface ControlsApplyInput {\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface ControlsResetInput {\n controlIds?: string[];\n resource?: ResourceRef;\n}\n\nexport interface ControlsRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n layout?: ControlsRendererLayout;\n defaultValues?: Record<string, unknown>;\n\n /** Load the control declarations + current values for the active resource. */\n executeQuery(resource?: ResourceRef): Promise<ControlsQueryResult> | ControlsQueryResult;\n /** Live-save a single control edit. Omit for explicit-apply or read-only panels. */\n updateValue?(input: ControlsUpdateValueInput): Promise<void> | void;\n /** Commit the full value map from a sticky footer. */\n apply?(input: ControlsApplyInput): Promise<void> | void;\n /** Reset some or all controls to their defaults. */\n reset?(input: ControlsResetInput): Promise<void> | void;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n}\n\nexport interface RegisteredControlsRendererContribution\n extends ControlsRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface ControlsRendererStoreState {\n renderers: Record<string, RegisteredControlsRendererContribution>;\n}\n\nexport interface ControlsRendererRefreshEvent {\n controlsRendererId: string;\n}\n\nexport type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a controls widget. Set once on\n// workbench mount via setControlsRendererImplementation so registerControlsRenderer\n// can auto-register a widget renderer with the same id.\nexport type ControlsRendererImplementation = (\n input: WorkbenchPanelRenderInput & { controlsRendererId: string },\n) => unknown;\n\nexport interface CreateControlsRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface ControlsRendererRegistry {\n controlsStore: WorkbenchStore<ControlsRendererStoreState>;\n registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable;\n setControlsRendererImplementation(impl: ControlsRendererImplementation): void;\n getControlsRenderer(id: string): RegisteredControlsRendererContribution | undefined;\n listControlsRenderers(): RegisteredControlsRendererContribution[];\n refreshControlsRenderer(id: string): void;\n onDidRefreshControlsRenderer(listener: ControlsRendererRefreshListener): Disposable;\n}\n\nexport const createControlsRendererRegistry = (\n input: CreateControlsRendererRegistryInput,\n): ControlsRendererRegistry => {\n const { rendererRegistry } = input;\n\n const controlsStore = createWorkbenchStore<ControlsRendererStoreState>({\n name: \"workbench.controlsRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<ControlsRendererRefreshListener>();\n let implementation: ControlsRendererImplementation = () => null;\n\n const requireControlsRenderer = (id: string) => {\n const renderer = controlsStore.getState().renderers[id];\n if (!renderer) throw new Error(`Controls renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n controlsStore,\n\n setControlsRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerControlsRenderer(contribution, metadata) {\n const snapshot = controlsStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Controls renderer already registered: ${contribution.id}`);\n }\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredControlsRendererContribution;\n\n controlsStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerControlsRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchControlsView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, controlsRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = controlsStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n controlsStore.setState({ renderers: nextRenderers }, false, \"unregisterControlsRenderer\");\n });\n },\n\n getControlsRenderer(id) {\n return controlsStore.getState().renderers[id];\n },\n\n listControlsRenderers() {\n return Object.values(controlsStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshControlsRenderer(id) {\n requireControlsRenderer(id);\n const event = { controlsRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshControlsRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface DataTableRendererThemeColor {\n light: string;\n dark: string;\n foreground?: { light: string; dark: string };\n}\n\nexport type DataTableRendererColumnStat =\n | { type: \"unique\" }\n | { type: \"histogram\"; bins?: number }\n | { type: \"top-values\"; limit?: number };\n\nexport type DataTableRendererColumnRenderer =\n | { type: \"json\" }\n | { type: \"color-scale\"; stops: Array<{ value: number; color: DataTableRendererThemeColor }> }\n | {\n type: \"categorical-color\";\n categories: Array<{ value: string | number | boolean | null; color: DataTableRendererThemeColor }>;\n };\n\nexport interface DataTableRendererColumn {\n id: string;\n label?: string;\n description?: string;\n icon?: unknown;\n hidden?: boolean;\n stat?: DataTableRendererColumnStat;\n renderer?: DataTableRendererColumnRenderer;\n}\n\nexport interface DataTableRendererRow {\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface DataTableRendererQueryResult {\n rows: DataTableRendererRow[];\n columns?: DataTableRendererColumn[];\n}\n\nexport interface DataTableRendererQueryContext {\n resource?: ResourceRef;\n modeId?: string;\n}\n\nexport interface DataTableRendererRowAction {\n id: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(row: DataTableRendererRow): Promise<void> | void;\n}\n\nexport interface DataTableRendererSelectionAction {\n id: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(rows: DataTableRendererRow[]): Promise<void> | void;\n}\n\nexport interface DataTableRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n columns?: DataTableRendererColumn[];\n selectionMode?: \"none\" | \"multiple\";\n selectionActions?: DataTableRendererSelectionAction[];\n rowActions?: DataTableRendererRowAction[];\n initialPageSize?: number;\n pageSizeOptions?: number[];\n emptyTitle?: string;\n emptyDescription?: string;\n executeQuery(\n context: DataTableRendererQueryContext,\n ): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;\n}\n\nexport interface RegisteredDataTableRendererContribution\n extends DataTableRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface DataTableRendererStoreState {\n renderers: Record<string, RegisteredDataTableRendererContribution>;\n}\n\nexport interface DataTableRendererRefreshEvent {\n dataTableRendererId: string;\n}\n\nexport type DataTableRendererImplementation = (\n input: WorkbenchPanelRenderInput & { dataTableRendererId: string },\n) => unknown;\n\nexport interface DataTableRendererRegistry {\n dataTableStore: WorkbenchStore<DataTableRendererStoreState>;\n registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable;\n setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;\n getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;\n listDataTableRenderers(): RegisteredDataTableRendererContribution[];\n refreshDataTableRenderer(id: string): void;\n onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable;\n}\n\nexport const createDataTableRendererRegistry = (input: {\n rendererRegistry: WorkbenchRendererRegistry;\n}): DataTableRendererRegistry => {\n const dataTableStore = createWorkbenchStore<DataTableRendererStoreState>({\n name: \"workbench.dataTableRenderers\",\n initialState: { renderers: {} },\n });\n const refreshListeners = new Set<(event: DataTableRendererRefreshEvent) => void>();\n let implementation: DataTableRendererImplementation = () => null;\n\n return {\n dataTableStore,\n setDataTableRendererImplementation(next) {\n implementation = next;\n },\n registerDataTableRenderer(contribution, metadata) {\n const snapshot = dataTableStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Data table renderer already registered: ${contribution.id}`);\n }\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredDataTableRendererContribution;\n dataTableStore.setState(\n { renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerDataTableRenderer\",\n );\n const rendererDisposable = input.rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, dataTableRendererId: contribution.id }),\n });\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataTableStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...renderers } = current.renderers;\n dataTableStore.setState({ renderers }, false, \"unregisterDataTableRenderer\");\n });\n },\n getDataTableRenderer(id) {\n return dataTableStore.getState().renderers[id];\n },\n listDataTableRenderers() {\n return Object.values(dataTableStore.getState().renderers).sort(byContributionPriority);\n },\n refreshDataTableRenderer(id) {\n if (!dataTableStore.getState().renderers[id]) throw new Error(`Data table renderer not registered: ${id}`);\n const event = { dataTableRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n onDidRefreshDataTableRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => refreshListeners.delete(listener));\n },\n } satisfies DataTableRendererRegistry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\n// What a file renderer's load resolves to. The React layer dispatches to a\n// markdown editor, a code editor, or an image preview based on `fileName` /\n// `mimeType`; text-ish files carry `content`, images carry `dataUrl`.\nexport interface FileRendererContent {\n fileName?: string;\n /** Workspace-relative path shown above the file preview. */\n filePath?: string;\n mimeType?: string;\n content?: string;\n dataUrl?: string;\n // Shown by the editor when the content is empty (editable text only).\n placeholder?: string;\n /** Override contribution-level save support for one loaded file. */\n editable?: boolean;\n /** Request Monaco for text that automatic dispatch would open as markdown. */\n textRenderer?: \"automatic\" | \"monaco\";\n /** Represent a deliberate no-file selection without an editable blank document. */\n emptyState?: {\n title: string;\n description?: string;\n };\n /** Ordered backing-store revision when one is available. */\n revision?: string;\n}\n\nexport interface FileRendererRefreshOrigin {\n rendererId: string;\n instanceId: string;\n operationId: string;\n}\n\nexport interface FileRendererRefreshEnvelope {\n resourceUri?: string;\n origin?: FileRendererRefreshOrigin;\n revision?: string;\n}\n\nexport interface FileRendererSaveResult {\n revision?: string;\n}\n\nexport interface FileRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n\n /** Resolve the file's content (and identity) for the bound resource. */\n load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;\n /** Persist edited text. Absent ⇒ read-only. Never called for images. */\n save?(\n resource: ResourceRef | undefined,\n content: string,\n origin?: FileRendererRefreshOrigin,\n // biome-ignore lint/suspicious/noConfusingVoidType: Existing synchronous save callbacks return void.\n ): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;\n}\n\nexport interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {}\n\nexport interface FileRendererStoreState {\n renderers: Record<string, RegisteredFileRendererContribution>;\n}\n\nexport interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {\n fileRendererId: string;\n}\n\nexport type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a file-renderer widget. Set once on\n// workbench mount via setFileRendererImplementation so registerFileRenderer can\n// auto-register a widget renderer with the same id.\nexport type FileRendererImplementation = (input: WorkbenchPanelRenderInput & { fileRendererId: string }) => unknown;\n\nexport interface CreateFileRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface FileRendererRegistry {\n fileRendererStore: WorkbenchStore<FileRendererStoreState>;\n registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable;\n setFileRendererImplementation(impl: FileRendererImplementation): void;\n getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;\n listFileRenderers(): RegisteredFileRendererContribution[];\n refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;\n onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable;\n}\n\nexport const createFileRendererRegistry = (input: CreateFileRendererRegistryInput): FileRendererRegistry => {\n const { rendererRegistry } = input;\n\n const fileRendererStore = createWorkbenchStore<FileRendererStoreState>({\n name: \"workbench.fileRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<FileRendererRefreshListener>();\n let implementation: FileRendererImplementation = () => null;\n\n const requireFileRenderer = (id: string) => {\n const renderer = fileRendererStore.getState().renderers[id];\n if (!renderer) throw new Error(`File renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n fileRendererStore,\n\n setFileRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerFileRenderer(contribution, metadata) {\n const snapshot = fileRendererStore.getState();\n if (snapshot.renderers[contribution.id]) throw new Error(`File renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredFileRendererContribution;\n\n fileRendererStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerFileRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchFileRendererView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, fileRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = fileRendererStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n fileRendererStore.setState({ renderers: nextRenderers }, false, \"unregisterFileRenderer\");\n });\n },\n\n getFileRenderer(id) {\n return fileRendererStore.getState().renderers[id];\n },\n\n listFileRenderers(): RegisteredFileRendererContribution[] {\n return Object.values(fileRendererStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshFileRenderer(id, envelope = {}) {\n requireFileRenderer(id);\n const event = { fileRendererId: id, ...envelope };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshFileRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n AttributeDescriptor,\n AttributesSource,\n BoardColumnConfig,\n KanbanRendererCreateRowConfig,\n KanbanRendererCreateSubmission,\n KanbanRendererFilterState,\n KanbanRendererRow,\n KanbanRendererSavedView,\n KanbanRendererSettings,\n ResourceContextAction,\n} from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface KanbanRendererQueryState {\n settings: KanbanRendererSettings;\n filters: KanbanRendererFilterState;\n}\n\nexport interface KanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow> {\n id: string;\n title: string;\n resourceKind?: string;\n /** Host-owned scope for persisted display settings. */\n storageScope?: string;\n\n /**\n * Declarative attribute schema. The renderer dispatches filter / group /\n * sort / display / inline-edit behavior on each descriptor's `type.kind`.\n *\n * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a\n * static array to let the contribution mutate its schema at runtime —\n * `WorkbenchKanbanView` subscribes so additions / removals / kind changes\n * propagate live without re-registering the renderer.\n */\n attributes: AttributeDescriptor[] | AttributesSource;\n\n /** Per-board-column overrides (color, drag/create rules, custom actions). */\n getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;\n hideToolbar?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n\n /** Initial settings/filters applied when the kanban renderer mounts. */\n defaultSettings?: Partial<KanbanRendererSettings>;\n defaultFilters?: KanbanRendererFilterState;\n defaultViews?: KanbanRendererSavedView[];\n defaultActiveViewId?: string;\n\n /**\n * Data source. Receives the current display state so backends can paginate\n * / filter / sort. The renderer re-applies filter / sort / group locally,\n * so this can return unfiltered rows in simple cases.\n */\n executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];\n subscribe?: (listener: () => void) => Disposable | (() => void);\n\n /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */\n onRowActivate?: (row: TRow) => Promise<void> | void;\n /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];\n /**\n * Fires for inline attribute edits AND for cross-column drag-to-reorder on\n * the board (the renderer passes the grouping attribute id + the target\n * column value).\n */\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n /** Manual within-column reorder (only fires when ordering is manual). */\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n createRow?: KanbanRendererCreateRowConfig;\n onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport interface RegisteredKanbanRendererContribution<TRow extends KanbanRendererRow = KanbanRendererRow>\n extends KanbanRendererContribution<TRow>,\n RegisteredContributionMetadata {}\n\nexport interface KanbanRendererStoreState {\n renderers: Record<string, RegisteredKanbanRendererContribution>;\n}\n\nexport interface KanbanRendererRefreshEvent {\n kanbanRendererId: string;\n}\n\nexport type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a kanban-renderer Panel. Set once on\n// workbench mount via setKanbanRendererImplementation so registerKanbanRenderer can\n// auto-register a Panel renderer with the same id.\nexport type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & { kanbanRendererId: string }) => unknown;\n\nexport interface CreateKanbanRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface KanbanRendererRegistry {\n dataStore: WorkbenchStore<KanbanRendererStoreState>;\n registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(\n contribution: KanbanRendererContribution<TRow>,\n metadata?: ContributionMetadata,\n ): Disposable;\n setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;\n getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;\n listKanbanRenderers(): RegisteredKanbanRendererContribution[];\n refreshKanbanRenderer(id: string): void;\n onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable;\n}\n\nexport const createKanbanRendererRegistry = (input: CreateKanbanRendererRegistryInput): KanbanRendererRegistry => {\n const { rendererRegistry } = input;\n\n const dataStore = createWorkbenchStore<KanbanRendererStoreState>({\n name: \"workbench.kanbanRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<KanbanRendererRefreshListener>();\n let implementation: KanbanRendererImplementation = () => null;\n\n const requireKanbanRenderer = (id: string) => {\n const renderer = dataStore.getState().renderers[id];\n if (!renderer) throw new Error(`Kanban renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n dataStore,\n\n setKanbanRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerKanbanRenderer(contribution, metadata) {\n const snapshot = dataStore.getState();\n if (snapshot.renderers[contribution.id])\n throw new Error(`Kanban renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredKanbanRendererContribution;\n\n dataStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerKanbanRenderer\",\n );\n\n // Auto-register a Panel renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchKanbanView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, kanbanRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n dataStore.setState({ renderers: nextRenderers }, false, \"unregisterKanbanRenderer\");\n });\n },\n\n getKanbanRenderer(id) {\n return dataStore.getState().renderers[id];\n },\n\n listKanbanRenderers(): RegisteredKanbanRendererContribution[] {\n return Object.values(dataStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshKanbanRenderer(id) {\n requireKanbanRenderer(id);\n const event = { kanbanRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshKanbanRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandParamSchema } from \"../commands/command-registry\";\nimport type { MenuPath } from \"../menus/menu-registry\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface TreeContext {\n filter?: string;\n resource?: ResourceRef;\n /** Widget/view contribution id for trees rendered through a view-backed widget. */\n viewId?: string;\n}\n\nexport interface TreeAction {\n id: string;\n label?: string;\n icon?: string;\n commandId?: string;\n args?: unknown;\n params?: CommandParamSchema;\n // Confirm-button label for the action's params dialog (defaults to \"Run\").\n submitLabel?: string;\n when?: string;\n disabled?: boolean;\n run?(args?: unknown): Promise<void> | void;\n}\n\nexport type TreeNodeRowVariant = \"empty-state\";\n\nexport interface TreeNodeInlineInput {\n ariaLabel: string;\n defaultValue?: string;\n placeholder?: string;\n onCommit(value: string): Promise<void> | void;\n onCancel?(): void;\n}\n\nexport interface TreeNode {\n id: string;\n label: string;\n icon?: string;\n iconElement?: unknown;\n iconColor?: string;\n iconTooltip?: string;\n endContent?: unknown;\n commandId?: string;\n resource?: ResourceRef;\n target?: NavigationTarget;\n /** Visual row variant for non-data rows such as placeholders. */\n rowVariant?: TreeNodeRowVariant;\n inlineInput?: TreeNodeInlineInput;\n actions?: TreeAction[];\n contextMenuActions?: TreeAction[];\n contextMenuPath?: MenuPath;\n menuPath?: MenuPath;\n menuPlacement?: \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"left-start\";\n showContextMenuTrigger?: boolean;\n collapsible?: boolean;\n disabled?: boolean;\n children?: TreeNode[];\n description?: string;\n contextValue?: string;\n hiddenByDefault?: boolean;\n /** When true, the node (e.g. a header/footer row) opts in to the tree's hide/show customization menu. */\n canHide?: boolean;\n /** When false, the node stays fixed within its Sidenav group. */\n canReorder?: boolean;\n /** Allow this node to be moved to another tree location. */\n canDrag?: boolean;\n /** Allow movable nodes to be dropped on this node. */\n canDrop?: boolean;\n}\n\nexport interface TreeSectionEmptyState {\n title: string;\n description?: string;\n icon?: string;\n}\n\nexport interface TreeViewSection {\n id: string;\n label?: string;\n actions?: TreeAction[];\n collapsible?: boolean;\n emptyState?: TreeSectionEmptyState;\n nodes: TreeNode[];\n hiddenByDefault?: boolean;\n /** When true, the section (category) opts in to the tree's hide/show customization menu. */\n canHide?: boolean;\n /** When false, the section stays fixed within the Sidenav main region. */\n canReorder?: boolean;\n}\n\nexport interface TreeRendererContribution {\n id: string;\n title: string;\n icon?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n when?: string;\n defaultExpandedSectionIds?: string[];\n defaultExpandedNodeIds?: string[];\n getBody(ctx: TreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getHeader?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];\n getFooter?(ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];\n getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];\n moveNode?(source: TreeNode, target: TreeNode | undefined, ctx: TreeContext): Promise<void> | void;\n}\n\nexport interface RegisteredTreeRendererContribution extends TreeRendererContribution, RegisteredContributionMetadata {}\n\nexport interface TreeRendererState {\n expandedNodeIds: string[];\n expandedSectionIds: string[];\n selectedNodeId?: string;\n loading?: boolean;\n}\n\nexport interface TreeRendererRefreshEvent {\n treeId: string;\n}\n\nexport interface TreeRendererStoreState {\n trees: Record<string, RegisteredTreeRendererContribution>;\n statesByTreeId: Record<string, TreeRendererState>;\n refreshKeysByTreeId: Record<string, number>;\n}\n\nexport interface PersistedTreeRendererStates {\n statesByTreeId: Record<string, TreeRendererState>;\n}\n\nexport interface TreeRendererPersistenceAdapter {\n getTreeStates(): PersistedTreeRendererStates | undefined;\n setTreeStates(states: PersistedTreeRendererStates): void;\n}\n\n// The React layer supplies the actual rendering for a tree id when a widget\n// references it. Set once on workbench mount via setTreeRendererImplementation\n// so registerTreeRenderer can auto-register a renderer entry with the same id.\nexport type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & { treeId: string }) => unknown;\n\nexport interface CreateTreeRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n persistence?: TreeRendererPersistenceAdapter;\n}\n\ntype TreeRendererRefreshListener = (event: TreeRendererRefreshEvent) => void;\n\nconst createDefaultState = (view: TreeRendererContribution): TreeRendererState => ({\n expandedNodeIds: [...(view.defaultExpandedNodeIds ?? [])],\n expandedSectionIds: [...(view.defaultExpandedSectionIds ?? [])],\n});\n\n// Section defaults are re-applied on every registration so a section that\n// should start expanded (e.g. a ticket's workspaces) stays expanded even when\n// an older persisted state predates it. Node expansion stays user-controlled.\nconst mergeDefaultSections = (state: TreeRendererState, view: TreeRendererContribution): TreeRendererState => {\n const missing = (view.defaultExpandedSectionIds ?? []).filter((id) => !state.expandedSectionIds.includes(id));\n if (missing.length === 0) return state;\n return { ...state, expandedSectionIds: [...state.expandedSectionIds, ...missing] };\n};\n\nconst toggleId = (ids: string[], id: string, expanded: boolean) => {\n if (expanded) return ids.includes(id) ? ids : [...ids, id];\n return ids.includes(id) ? ids.filter((value) => value !== id) : ids;\n};\n\nexport interface TreeRendererRegistry {\n treeStore: WorkbenchStore<TreeRendererStoreState>;\n registerTreeRenderer(view: TreeRendererContribution, metadata?: ContributionMetadata): Disposable;\n setTreeRendererImplementation(impl: TreeRendererImplementation): void;\n getTreeRenderer(id: string): RegisteredTreeRendererContribution | undefined;\n listTreeRenderers(): RegisteredTreeRendererContribution[];\n getBody(id: string, ctx?: TreeContext): Promise<TreeViewSection[]>;\n getHeader(id: string, ctx?: TreeContext): Promise<TreeNode[]>;\n getFooter(id: string, ctx?: TreeContext): Promise<TreeNode[]>;\n getChildren(id: string, node: TreeNode, ctx?: TreeContext): Promise<TreeNode[]>;\n getTreeState(id: string): TreeRendererState;\n setNodeExpanded(id: string, nodeId: string, expanded: boolean): void;\n setSectionExpanded(id: string, sectionId: string, expanded: boolean): void;\n setSelectedNode(id: string, nodeId: string | undefined): void;\n setLoading(id: string, loading: boolean): void;\n refresh(id: string): void;\n onDidRefresh(listener: TreeRendererRefreshListener): Disposable;\n}\n\nexport const createTreeRendererRegistry = (input: CreateTreeRendererRegistryInput): TreeRendererRegistry => {\n const { rendererRegistry, persistence } = input;\n const persisted = persistence?.getTreeStates();\n\n const treeStore = createWorkbenchStore<TreeRendererStoreState>({\n name: \"workbench.treeRenderers\",\n initialState: {\n trees: {},\n statesByTreeId: persisted?.statesByTreeId ?? {},\n refreshKeysByTreeId: {},\n },\n });\n\n const refreshListeners = new Set<TreeRendererRefreshListener>();\n let implementation: TreeRendererImplementation = () => null;\n\n const requireTree = (id: string) => {\n const tree = treeStore.getState().trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n return tree;\n };\n\n const ensureState = (id: string) => {\n const current = treeStore.getState();\n const existing = current.statesByTreeId[id];\n if (existing) return existing;\n\n const tree = current.trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n\n const fresh = createDefaultState(tree);\n treeStore.setState(\n {\n ...current,\n statesByTreeId: { ...current.statesByTreeId, [id]: fresh },\n },\n false,\n \"ensureTreeState\",\n );\n return fresh;\n };\n\n const persistStates = () => {\n if (!persistence) return;\n const statesByTreeId: Record<string, TreeRendererState> = {};\n for (const [id, state] of Object.entries(treeStore.getState().statesByTreeId)) {\n const { loading: _loading, ...persistable } = state;\n statesByTreeId[id] = persistable;\n }\n persistence.setTreeStates({ statesByTreeId });\n };\n\n const updateState = (id: string, update: (state: TreeRendererState) => TreeRendererState, action: string) => {\n const current = ensureState(id);\n const next = update(current);\n if (next === current) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: next },\n },\n false,\n action,\n );\n persistStates();\n };\n\n return {\n treeStore,\n\n setTreeRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerTreeRenderer(view, metadata) {\n const snapshot = treeStore.getState();\n if (snapshot.trees[view.id]) throw new Error(`Tree renderer already registered: ${view.id}`);\n\n const record: RegisteredTreeRendererContribution = {\n ...normalizeContributionMetadata(metadata),\n ...view,\n };\n const persistedState = snapshot.statesByTreeId[view.id];\n const nextState = persistedState ? mergeDefaultSections(persistedState, view) : createDefaultState(view);\n\n treeStore.setState(\n {\n ...snapshot,\n trees: { ...snapshot.trees, [view.id]: record },\n statesByTreeId: { ...snapshot.statesByTreeId, [view.id]: nextState },\n },\n false,\n \"registerTreeRenderer\",\n );\n\n // Auto-register a widget renderer with the same id so widgets can place\n // this tree via rendererId: view.id. The render fn calls the React-side\n // implementation supplied through setTreeRendererImplementation.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: view.id,\n render: (rendererInput) => implementation({ ...rendererInput, treeId: view.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = treeStore.getState();\n if (current.trees[view.id] !== record) return;\n const { [view.id]: _removed, ...nextTrees } = current.trees;\n const { [view.id]: _removedState, ...nextStates } = current.statesByTreeId;\n const { [view.id]: _removedRefresh, ...nextRefresh } = current.refreshKeysByTreeId;\n treeStore.setState(\n {\n trees: nextTrees,\n statesByTreeId: nextStates,\n refreshKeysByTreeId: nextRefresh,\n },\n false,\n \"unregisterTreeRenderer\",\n );\n persistStates();\n });\n },\n\n getTreeRenderer(id) {\n return treeStore.getState().trees[id];\n },\n\n listTreeRenderers() {\n return Object.values(treeStore.getState().trees).sort(byContributionPriority);\n },\n\n async getBody(id, ctx = {}) {\n return await requireTree(id).getBody(ctx);\n },\n\n async getHeader(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getHeader) return [];\n return await tree.getHeader(ctx);\n },\n\n async getFooter(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getFooter) return [];\n return await tree.getFooter(ctx);\n },\n\n async getChildren(id, node, ctx = {}) {\n return await requireTree(id).getChildren(node, ctx);\n },\n\n getTreeState(id) {\n const state = ensureState(id);\n return {\n expandedNodeIds: [...state.expandedNodeIds],\n expandedSectionIds: [...state.expandedSectionIds],\n selectedNodeId: state.selectedNodeId,\n loading: state.loading,\n };\n },\n\n setNodeExpanded(id, nodeId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedNodeIds, nodeId, expanded);\n if (nextIds === state.expandedNodeIds) return state;\n return { ...state, expandedNodeIds: nextIds };\n },\n \"setNodeExpanded\",\n );\n },\n\n setSectionExpanded(id, sectionId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedSectionIds, sectionId, expanded);\n if (nextIds === state.expandedSectionIds) return state;\n return { ...state, expandedSectionIds: nextIds };\n },\n \"setSectionExpanded\",\n );\n },\n\n setSelectedNode(id, nodeId) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n if (state.selectedNodeId === nodeId) return state;\n return { ...state, selectedNodeId: nodeId };\n },\n \"setSelectedNode\",\n );\n },\n\n setLoading(id, loading) {\n requireTree(id);\n const current = ensureState(id);\n if (current.loading === loading) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: { ...current, loading } },\n },\n false,\n \"setLoading\",\n );\n },\n\n refresh(id) {\n requireTree(id);\n const snapshot = treeStore.getState();\n const current = snapshot.refreshKeysByTreeId[id] ?? 0;\n treeStore.setState(\n {\n ...snapshot,\n refreshKeysByTreeId: { ...snapshot.refreshKeysByTreeId, [id]: current + 1 },\n },\n false,\n \"refreshTreeRenderer\",\n );\n const event = { treeId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefresh(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchPanelRenderInput } from \"../renderers/renderer-registry\";\n\n/** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */\nexport type SettingsScope = \"global\" | \"project\";\n\n/** A \"+ create\"-style action surfaced on a section or a collection's parent node. */\nexport interface SettingsAction {\n id: string;\n label: string;\n icon?: string;\n run(): void | Promise<void>;\n}\n\n/** An ordered sidenav container. Headerless when `title` is omitted. */\nexport interface SettingsSectionContribution {\n id: string;\n title?: string;\n order?: number;\n scope?: SettingsScope;\n actions?: SettingsAction[];\n}\nexport type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;\n\n/** A preference this panel edits; a bare string uses the preference name as its label. */\nexport type SettingsPanelPreference = string | { name: string; label?: string };\n\nexport interface SettingsPanelBase {\n id: string;\n title: string;\n description?: string;\n /** Section id this panel belongs to. */\n section?: string;\n icon?: string;\n /** Lower sorts first; ties fall back to contribution priority then registration order. */\n order?: number;\n scope?: SettingsScope;\n when?: string;\n}\n\n/** Auto-rendered as a param editor from the registered preference schema. */\nexport interface SchemaSettingsPanel extends SettingsPanelBase {\n kind: \"schema\";\n preferences: SettingsPanelPreference[];\n /** \"live\" persists on change (default); \"apply\" stages edits behind Save/Discard. */\n save?: \"live\" | \"apply\";\n}\n\n/**\n * Renders its own page. `render` returns `unknown` so core stays React-free — the\n * React layer treats the result as a node, exactly like WorkbenchRendererRegistration.\n */\nexport interface CustomSettingsPanel extends SettingsPanelBase {\n kind: \"custom\";\n render(input: WorkbenchPanelRenderInput): unknown;\n}\n\nexport interface SettingsCollectionGroupBy<TItem> {\n key(item: TItem): string;\n order?: string[];\n label(key: string): string;\n icon?(key: string): string | undefined;\n}\n\n/**\n * A data-driven list of items, each opening a contributor-supplied editor. The\n * framework knows nothing about what an item is — it only calls these hooks.\n */\nexport interface CollectionSettingsPanel<TItem = unknown> extends SettingsPanelBase {\n kind: \"collection\";\n items(): TItem[] | Promise<TItem[]>;\n itemId(item: TItem): string;\n itemLabel(item: TItem): string;\n itemIcon?(item: TItem): string | undefined;\n groupBy?: SettingsCollectionGroupBy<TItem>;\n renderItem(item: TItem, input: WorkbenchPanelRenderInput): unknown;\n actions?: SettingsAction[];\n}\n\nexport type SettingsPanelContribution = SchemaSettingsPanel | CustomSettingsPanel | CollectionSettingsPanel;\nexport type RegisteredSettingsPanel = SettingsPanelContribution & RegisteredContributionMetadata;\n\nexport interface SettingsRegistryStoreState {\n sections: Record<string, RegisteredSettingsSection>;\n panels: Record<string, RegisteredSettingsPanel>;\n /** Bumped by refresh() so the surface re-reads collection items() after backing data changes. */\n revision: number;\n}\n\nexport interface SettingsRegistry {\n store: WorkbenchStore<SettingsRegistryStoreState>;\n registerSection(section: SettingsSectionContribution, metadata?: ContributionMetadata): Disposable;\n registerPanel<TItem = unknown>(\n panel: SchemaSettingsPanel | CustomSettingsPanel | CollectionSettingsPanel<TItem>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getSection(id: string): RegisteredSettingsSection | undefined;\n getPanel(id: string): RegisteredSettingsPanel | undefined;\n listSections(): RegisteredSettingsSection[];\n listPanels(): RegisteredSettingsPanel[];\n /** Signal that a collection's backing data changed so the surface refreshes. */\n refresh(): void;\n}\n\nconst byOrderThenPriority = <T extends RegisteredContributionMetadata & { order?: number }>(left: T, right: T) =>\n (left.order ?? 0) - (right.order ?? 0) || byContributionPriority(left, right);\n\nexport const createSettingsRegistry = (): SettingsRegistry => {\n const store = createWorkbenchStore<SettingsRegistryStoreState>({\n name: \"workbench.settings\",\n initialState: { sections: {}, panels: {}, revision: 0 },\n });\n\n return {\n store,\n\n refresh() {\n const snapshot = store.getState();\n store.setState({ ...snapshot, revision: snapshot.revision + 1 }, false, \"refreshSettings\");\n },\n\n registerSection(section, metadata) {\n const snapshot = store.getState();\n if (snapshot.sections[section.id]) throw new Error(`Settings section already registered: ${section.id}`);\n\n const record = { ...normalizeContributionMetadata(metadata), ...section } as RegisteredSettingsSection;\n store.setState(\n { ...snapshot, sections: { ...snapshot.sections, [section.id]: record } },\n false,\n \"registerSection\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.sections[section.id] !== record) return;\n const { [section.id]: _removed, ...nextSections } = current.sections;\n store.setState({ ...current, sections: nextSections }, false, \"unregisterSection\");\n });\n },\n\n registerPanel(panel, metadata) {\n const snapshot = store.getState();\n if (snapshot.panels[panel.id]) throw new Error(`Settings panel already registered: ${panel.id}`);\n\n const record = { ...normalizeContributionMetadata(metadata), ...panel } as RegisteredSettingsPanel;\n store.setState({ ...snapshot, panels: { ...snapshot.panels, [panel.id]: record } }, false, \"registerPanel\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.panels[panel.id] !== record) return;\n const { [panel.id]: _removed, ...nextPanels } = current.panels;\n store.setState({ ...current, panels: nextPanels }, false, \"unregisterPanel\");\n });\n },\n\n getSection(id) {\n return store.getState().sections[id];\n },\n\n getPanel(id) {\n return store.getState().panels[id];\n },\n\n listSections() {\n return Object.values(store.getState().sections).sort(byOrderThenPriority);\n },\n\n listPanels() {\n return Object.values(store.getState().panels).sort(byOrderThenPriority);\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { FileIconThemePreferenceOption } from \"./file-icon-theme-contracts\";\n\nexport interface WorkbenchFileIconThemeStoreState {\n themes: readonly FileIconThemePreferenceOption[];\n}\n\nexport interface FileIconThemeRegistry {\n store: WorkbenchStore<WorkbenchFileIconThemeStoreState>;\n register(themes: readonly FileIconThemePreferenceOption[]): Disposable;\n listThemes(): readonly FileIconThemePreferenceOption[];\n}\n\nexport const createFileIconThemeRegistry = (): FileIconThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchFileIconThemeStoreState>({\n name: \"workbench.fileIconThemes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly FileIconThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncFileIconThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ThemePreferenceOption } from \"./theme-contracts\";\n\nexport interface WorkbenchThemeStoreState {\n themes: readonly ThemePreferenceOption[];\n}\n\nexport interface ThemeRegistry {\n store: WorkbenchStore<WorkbenchThemeStoreState>;\n register(themes: readonly ThemePreferenceOption[]): Disposable;\n listThemes(): readonly ThemePreferenceOption[];\n}\n\nexport const createThemeRegistry = (): ThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchThemeStoreState>({\n name: \"workbench.themes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly ThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { getActivePlacement } from \"../../registries/layout/layout-operations\";\nimport { resolveAnchorRegion } from \"../../registries/layout/surface-map\";\nimport { getAnchorResource, reconcileAnchors } from \"../../registries/layout/surface-reconcile\";\nimport type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n\n// Default scope predicate derived from the scoped resource providers. A detached\n// resource stays in scope while a provider for its kind still lists it under the active\n// primary; kinds with no provider can't be scoped, so they are kept. This makes the\n// detached-disconnect behaviour fall out of how providers filter their candidates —\n// no per-app wiring needed (apps can still inject a custom predicate).\n//\n// It deliberately ignores the `primary` argument the coordinator passes: scoping is read\n// from the registry's own `getPrimary` closure (which already reflects the live primary),\n// so the candidate list and this predicate cannot drift to different primaries.\nexport const createScopedIsInScope = (resources: ResourceRegistry) => (resource: ResourceRef) => {\n const hasProvider = resources.listProviders().some((provider) => provider.kind === resource.kind);\n if (!hasProvider) return true;\n return resources.listResources(\"\").some((entry) => entry.resource.uri === resource.uri);\n};\n\nexport interface CreatePrimaryCoordinatorInput {\n layout: LayoutModel;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scope. Injected (no baked default) so apps decide the disconnect policy; the core\n // default keeps detached anchors (() => true) until scoped providers land.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// Keeps the secondary resource anchors consistent with the primary (main) resource.\n// On a primary change, derived anchors clear (they re-scope to the new primary) and\n// detached anchors disconnect once they fall outside the new primary's scope. The\n// primary anchor is never mutated, so the selector keyed on the main region's active\n// resource cannot re-fire — the reconciliation is feedback-loop safe by construction.\nexport const createPrimaryCoordinator = ({ layout, isInScope }: CreatePrimaryCoordinatorInput): Disposable => {\n const unsubscribe = layout.store.subscribeSelector(\n (state) => getActivePlacement(state.layout.regions[resolveAnchorRegion(\"primary\")])?.resourceUri,\n () => {\n const current = layout.getLayout();\n const primary = getAnchorResource(current, \"primary\");\n for (const action of reconcileAnchors({ layout: current, primary, isInScope })) {\n if (action.action === \"clear\") layout.clearRegion(action.region);\n }\n },\n );\n\n return createDisposable(unsubscribe);\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchPanelMenuRegion, WorkbenchRegion } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchSidePanelController, WorkbenchSidePanelMode } from \"../side-panel/side-panel-controller\";\n\nexport type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;\n\nexport type WorkbenchShellOpenRegion = \"sidenav\" | \"secondary\" | WorkbenchPanelMenuRegion;\n\nconst shellOpenRegions = new Set<WorkbenchRegion>([\n \"sidenav\",\n \"secondary\",\n \"main-left-menu\",\n \"main-right-menu\",\n \"secondary-left-menu\",\n \"secondary-right-menu\",\n \"side-left-menu\",\n \"side-right-menu\",\n]);\n\nexport const isWorkbenchShellOpenRegion = (region: WorkbenchRegion): region is WorkbenchShellOpenRegion =>\n shellOpenRegions.has(region);\n\nexport interface WorkbenchShellRegionState {\n open: boolean;\n size?: number;\n}\n\nexport interface WorkbenchShellController {\n getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;\n setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;\n setRegionSize(region: WorkbenchRegion, size: number): void;\n getSidePanelPresentation(): WorkbenchSidePanelPresentation;\n setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;\n onDidChange(listener: () => void): Disposable;\n}\n\nexport const createWorkbenchShellController = (input: {\n layout: LayoutModel;\n sidePanel: WorkbenchSidePanelController;\n}): WorkbenchShellController => ({\n getRegionState(region) {\n const state = input.layout.getLayout().regions[region];\n return { open: state.visible, size: state.size };\n },\n\n setRegionOpen(region, open) {\n input.layout.setRegionVisible(region, open);\n },\n\n setRegionSize(region, size) {\n input.layout.setRegionSize(region, size);\n },\n\n getSidePanelPresentation: input.sidePanel.getMode,\n setSidePanelPresentation: input.sidePanel.setMode,\n\n onDidChange(listener) {\n const unsubscribeLayout = input.layout.store.subscribeSelector((state) => state.layout, listener);\n const sidePanelSubscription = input.sidePanel.onDidChange(listener);\n return createDisposable(() => {\n unsubscribeLayout();\n sidePanelSubscription.dispose();\n });\n },\n});\n","import {\n createWorkbenchBreadcrumbController,\n type WorkbenchBreadcrumbController,\n} from \"./controllers/breadcrumbs/breadcrumb-registry\";\nimport {\n createWorkbenchCommandPaletteController,\n type WorkbenchCommandPaletteController,\n} from \"./controllers/command-palette/command-palette-controller\";\nimport {\n createWorkbenchCompositionController,\n type WorkbenchCompositionController,\n} from \"./controllers/composition/composition-controller\";\nimport { createWorkbenchFocusController, type WorkbenchFocusController } from \"./controllers/focus/focus-controller\";\nimport {\n createHistoryController,\n type HistoryController,\n type WorkbenchHistoryPersistence,\n} from \"./controllers/history/history-controller\";\nimport {\n createWorkbenchLastResourceController,\n type LastResourcePersistenceAdapter,\n type WorkbenchLastResourceController,\n} from \"./controllers/last-resource/last-resource-controller\";\nimport { createWorkbenchNavigator, type WorkbenchNavigator } from \"./controllers/navigator/workbench-navigator\";\nimport {\n createWorkbenchPanelsController,\n type WorkbenchPanelsController,\n type WorkbenchPanelsPersistenceAdapter,\n} from \"./controllers/panels/panels-controller\";\nimport { createPrimaryCoordinator, createScopedIsInScope } from \"./controllers/primary-coordinator/primary-coordinator\";\nimport {\n createWorkbenchShellController,\n isWorkbenchShellOpenRegion,\n type WorkbenchShellController,\n} from \"./controllers/shell/shell-controller\";\nimport {\n createWorkbenchSidePanelController,\n type WorkbenchSidePanelController,\n type WorkbenchSidePanelMode,\n type WorkbenchSidePanelPersistenceAdapter,\n} from \"./controllers/side-panel/side-panel-controller\";\nimport {\n createWorkbenchTerminalController,\n type WorkbenchTerminalController,\n} from \"./controllers/terminal/terminal-controller\";\nimport {\n type CommandPaletteResourceRegistry,\n createCommandPaletteResourceRegistry,\n} from \"./registries/command-palette-resources/command-palette-resource-registry\";\nimport { type CommandRegistry, createCommandRegistry } from \"./registries/commands/command-registry\";\nimport { createKeybindingRegistry, type KeybindingRegistry } from \"./registries/keybindings/keybinding-registry\";\nimport {\n createLayoutModel,\n type LayoutModel,\n type LayoutPersistenceAdapter,\n type WorkbenchLayout,\n type WorkbenchRegion,\n} from \"./registries/layout/layout-model\";\nimport { getActiveLocationPlacement } from \"./registries/layout/layout-operations\";\nimport { createMenuRegistry, type MenuRegistry } from \"./registries/menus/menu-registry\";\nimport { createWorkbenchModeRegistry, type WorkbenchModeRegistry } from \"./registries/modes/mode-registry\";\nimport { createNavigationRegistry, type NavigationRegistry } from \"./registries/navigation/navigation-registry\";\nimport {\n createNotificationRegistry,\n type NotificationRegistry,\n} from \"./registries/notifications/notification-registry\";\nimport {\n createPreferenceRegistry,\n type PreferencePersistenceAdapter,\n type PreferenceRegistry,\n} from \"./registries/preferences/preference-registry\";\nimport {\n type ControlsRendererRegistry,\n createControlsRendererRegistry,\n} from \"./registries/renderers/controls-renderer-registry\";\nimport {\n createDataTableRendererRegistry,\n type DataTableRendererRegistry,\n} from \"./registries/renderers/data-table-renderer-registry\";\nimport { createFileRendererRegistry, type FileRendererRegistry } from \"./registries/renderers/file-renderer-registry\";\nimport {\n createKanbanRendererRegistry,\n type KanbanRendererRegistry,\n} from \"./registries/renderers/kanban-renderer-registry\";\nimport {\n type CreateWorkbenchRendererRegistryInput,\n createWorkbenchRendererRegistry,\n type WorkbenchRendererRegistry,\n} from \"./registries/renderers/renderer-registry\";\nimport {\n createTreeRendererRegistry,\n type TreeRendererPersistenceAdapter,\n type TreeRendererRegistry,\n} from \"./registries/renderers/tree-renderer-registry\";\nimport {\n createResourceRegistry,\n type ResourceRef,\n type ResourceRegistry,\n} from \"./registries/resources/resource-registry\";\nimport { createSettingsRegistry, type SettingsRegistry } from \"./registries/settings/settings-registry\";\nimport { createFileIconThemeRegistry, type FileIconThemeRegistry } from \"./registries/themes/file-icon-theme-registry\";\nimport { createThemeRegistry, type ThemeRegistry } from \"./registries/themes/theme-registry\";\nimport { type ContextKeyService, createContextKeyService } from \"./shared/context/context-key-service\";\nimport type { ContributionMetadata, ContributionSource } from \"./shared/contributions/metadata\";\nimport type { Disposable } from \"./shared/disposable\";\nimport { createDisposable } from \"./shared/disposable\";\nimport { registerWorkbenchBuiltIns } from \"./workbench-built-ins\";\n\n// The workbench layout namespace owns both spatial placements (widgets,\n// placeholders) and command-to-menu-path bindings. Menus collapsed into layout\n// because a menu item is just another \"bind X to a place\" contribution.\nexport type WorkbenchLayoutModel = LayoutModel & MenuRegistry;\n\n// The renderer namespace owns content-producing registrations. Tree renderers\n// and kanban renderers live here too: each auto-registers a widget renderer so\n// they are placed via layout.registerWidget like any other content.\nexport type WorkbenchRenderers = WorkbenchRendererRegistry &\n TreeRendererRegistry &\n KanbanRendererRegistry &\n DataTableRendererRegistry &\n FileRendererRegistry &\n ControlsRendererRegistry;\n\nexport interface WorkbenchCoreContributionContext {\n breadcrumbs: WorkbenchBreadcrumbController;\n commandPalette: WorkbenchCommandPaletteController;\n commandPaletteResources: CommandPaletteResourceRegistry;\n commands: CommandRegistry;\n composition: WorkbenchCompositionController;\n context: ContextKeyService;\n focus: WorkbenchFocusController;\n history: HistoryController;\n keybindings: KeybindingRegistry;\n lastResource: WorkbenchLastResourceController;\n layout: WorkbenchLayoutModel;\n modes: WorkbenchModeRegistry;\n navigation: NavigationRegistry;\n navigator: WorkbenchNavigator;\n notifications: NotificationRegistry;\n panels: WorkbenchPanelsController;\n preferences: PreferenceRegistry;\n renderers: WorkbenchRenderers;\n resources: ResourceRegistry;\n settings: SettingsRegistry;\n shell: WorkbenchShellController;\n sidePanel: WorkbenchSidePanelController;\n terminal: WorkbenchTerminalController;\n themes: ThemeRegistry;\n fileIconThemes: FileIconThemeRegistry;\n // The resource hosted by the primary (main) anchor specifically — free of the global\n // active-resource pollution that any side-region activation introduces. Projections\n // (side panels, headers) follow this signal, not the global active resource.\n getPrimaryResource(): ResourceRef | undefined;\n onDidChangePrimaryResource(listener: (resource: ResourceRef | undefined) => void): Disposable;\n // The globally-focused resource — includes side-anchor selections. Extension hosts\n // (command palette, etc.) read this so they reflect whatever the user is acting on.\n getActiveResource(): ResourceRef | undefined;\n onDidChangeActiveResource(listener: (resource: ResourceRef | undefined) => void): Disposable;\n}\n\nexport interface WorkbenchSnapshot {\n layout: WorkbenchLayout;\n}\n\nexport interface WorkbenchPersistenceAdapter {\n getSnapshot(scope?: string): WorkbenchSnapshot | undefined;\n setSnapshot(snapshot: WorkbenchSnapshot, scope?: string): void;\n flush?(): void;\n dispose?(): void;\n}\n\nexport interface WorkbenchHost {\n getSnapshot(): WorkbenchSnapshot;\n restoreSnapshot(snapshot: WorkbenchSnapshot): void;\n setPersistenceScope(scope: string | undefined, input?: { carryRegions?: readonly WorkbenchRegion[] }): void;\n getPersistenceScope(): string | undefined;\n}\n\nexport interface WorkbenchCore extends WorkbenchCoreContributionContext {\n host: WorkbenchHost;\n registerModule(module: WorkbenchModuleContribution): Disposable;\n unregisterModule(moduleId: string): void;\n}\n\nexport type WorkbenchModuleContext = WorkbenchCoreContributionContext;\n\nexport type WorkbenchModuleContributionContext = WorkbenchModuleContext;\n\nexport interface CreateWorkbenchCoreInput {\n // Whether a detached anchor's resource still belongs to the active primary's scope.\n // Defaults to keeping detached anchors; apps wire this once scoped providers exist.\n isInScope?: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n layoutPersistence?: LayoutPersistenceAdapter;\n persistence?: WorkbenchPersistenceAdapter;\n historyPersistence?: WorkbenchHistoryPersistence;\n preferencePersistence?: PreferencePersistenceAdapter;\n treePersistence?: TreeRendererPersistenceAdapter;\n panelsPersistence?: WorkbenchPanelsPersistenceAdapter;\n defaultPanelOpenByRegionId?: Partial<Record<WorkbenchRegion, boolean>>;\n lastResourcePersistence?: LastResourcePersistenceAdapter;\n sidePanelPersistence?: WorkbenchSidePanelPersistenceAdapter;\n initialSidePanelMode?: WorkbenchSidePanelMode;\n renderers?: CreateWorkbenchRendererRegistryInput;\n}\n\ntype WorkbenchModuleActivationResult = Disposable | readonly Disposable[] | undefined;\n\nexport interface WorkbenchModuleContribution {\n id: string;\n source?: ContributionSource;\n ownerId?: string;\n activate(ctx: WorkbenchModuleContributionContext): WorkbenchModuleActivationResult;\n}\n\nconst withModuleMetadata = (\n input: { ownerId: string; source: ContributionSource },\n metadata?: ContributionMetadata,\n) => ({\n ...metadata,\n source: input.source,\n ownerId: input.ownerId,\n});\n\nconst toDisposables = (result: WorkbenchModuleActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nconst disposeDisposables = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n disposables[index]?.dispose();\n }\n};\n\ninterface CreateModuleContextInput {\n ownerId: string;\n source: ContributionSource;\n track(disposable: Disposable): void;\n}\n\nconst createModuleContext = (core: WorkbenchCore, input: CreateModuleContextInput) => {\n const contextScope = core.context.createScope(input.ownerId);\n input.track(contextScope);\n\n const track = <TDisposable extends Disposable>(disposable: TDisposable) => {\n input.track(disposable);\n return disposable;\n };\n\n const context = {\n ...core,\n onDidChangePrimaryResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangePrimaryResource(listener)),\n onDidChangeActiveResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangeActiveResource(listener)),\n breadcrumbs: {\n ...core.breadcrumbs,\n setItems: (items) => track(core.breadcrumbs.setItems(items)),\n onDidChange: (listener) => track(core.breadcrumbs.onDidChange(listener)),\n },\n commandPalette: {\n ...core.commandPalette,\n onDidChange: (listener) => track(core.commandPalette.onDidChange(listener)),\n },\n context: {\n ...core.context,\n set: (key, value) => contextScope.set(key, value),\n delete: (key) => contextScope.delete(key),\n createScope: (ownerId) => track(core.context.createScope(ownerId)),\n },\n focus: {\n ...core.focus,\n onDidChange: (listener) => track(core.focus.onDidChange(listener)),\n },\n commands: {\n ...core.commands,\n registerCommand: (command, handler, metadata) =>\n track(core.commands.registerCommand(command, handler, withModuleMetadata(input, metadata))),\n onDidExecuteError: (listener) => track(core.commands.onDidExecuteError(listener)),\n },\n keybindings: {\n ...core.keybindings,\n registerKeybinding: (keybinding, metadata) =>\n track(core.keybindings.registerKeybinding(keybinding, withModuleMetadata(input, metadata))),\n },\n lastResource: { ...core.lastResource },\n navigator: core.navigator,\n layout: {\n ...core.layout,\n openPanel: (id, openInput) => {\n const instance = core.layout.openPanel(id, openInput);\n track(createDisposable(() => core.layout.removeWidgetPlacement(instance.instanceId)));\n return instance;\n },\n openWidget: (id, openInput) => {\n const placement = core.layout.openWidget(id, {\n ...openInput,\n ownerId: input.ownerId,\n source: input.source,\n });\n track(createDisposable(() => core.layout.removeWidgetPlacement(placement.widgetId)));\n return placement;\n },\n registerPlaceholder: (placeholder, metadata) =>\n track(core.layout.registerPlaceholder(placeholder, withModuleMetadata(input, metadata))),\n registerPanel: (panel, metadata) => track(core.layout.registerPanel(panel, withModuleMetadata(input, metadata))),\n registerWidget: (widget, metadata) =>\n track(core.layout.registerWidget(widget, withModuleMetadata(input, metadata))),\n registerLocation: (location, metadata) =>\n track(core.layout.registerLocation(location, withModuleMetadata(input, metadata))),\n registerSubPanel: (subPanel, metadata) =>\n track(core.layout.registerSubPanel(subPanel, withModuleMetadata(input, metadata))),\n registerPanelMenu: (panelMenu, metadata) =>\n track(core.layout.registerPanelMenu(panelMenu, withModuleMetadata(input, metadata))),\n registerMenuItem: (path, item, metadata) =>\n track(core.layout.registerMenuItem(path, item, withModuleMetadata(input, metadata))),\n onWillChangePersistenceScope: (listener) => track(core.layout.onWillChangePersistenceScope(listener)),\n onDidChangePersistenceScope: (listener) => track(core.layout.onDidChangePersistenceScope(listener)),\n },\n modes: {\n ...core.modes,\n registerMode: (mode) =>\n track(\n core.modes.registerMode({\n ...mode,\n activate: () => {\n const modeDisposables: Disposable[] = [];\n const modeContext = createModuleContext(core, {\n ...input,\n track: (disposable) => {\n modeDisposables.push(disposable);\n },\n });\n const returnedDisposables = toDisposables(mode.activate(modeContext));\n return createDisposable(() => disposeDisposables([...modeDisposables, ...returnedDisposables]));\n },\n }),\n ),\n onDidChangeActive: (listener) => track(core.modes.onDidChangeActive(listener)),\n },\n navigation: {\n ...core.navigation,\n registerNavigator: (navigator, metadata) =>\n track(core.navigation.registerNavigator(navigator, withModuleMetadata(input, metadata))),\n registerParser: (parser, metadata) =>\n track(core.navigation.registerParser(parser, withModuleMetadata(input, metadata))),\n },\n notifications: {\n ...core.notifications,\n show: (notification, metadata) => core.notifications.show(notification, withModuleMetadata(input, metadata)),\n },\n panels: {\n ...core.panels,\n onDidChange: (listener) => track(core.panels.onDidChange(listener)),\n },\n preferences: {\n ...core.preferences,\n registerSchema: (schema, metadata) =>\n track(core.preferences.registerSchema(schema, withModuleMetadata(input, metadata))),\n },\n renderers: {\n ...core.renderers,\n registerRenderer: (renderer) => track(core.renderers.registerRenderer(renderer)),\n registerTreeRenderer: (view, metadata) =>\n track(core.renderers.registerTreeRenderer(view, withModuleMetadata(input, metadata))),\n registerKanbanRenderer: (contribution, metadata) =>\n track(core.renderers.registerKanbanRenderer(contribution, withModuleMetadata(input, metadata))),\n registerDataTableRenderer: (contribution, metadata) =>\n track(core.renderers.registerDataTableRenderer(contribution, withModuleMetadata(input, metadata))),\n registerFileRenderer: (contribution, metadata) =>\n track(core.renderers.registerFileRenderer(contribution, withModuleMetadata(input, metadata))),\n registerControlsRenderer: (contribution, metadata) =>\n track(core.renderers.registerControlsRenderer(contribution, withModuleMetadata(input, metadata))),\n onDidChange: (listener) => track(core.renderers.onDidChange(listener)),\n onDidRefresh: (listener) => track(core.renderers.onDidRefresh(listener)),\n },\n resources: {\n ...core.resources,\n registerKind: (kind, metadata) => track(core.resources.registerKind(kind, withModuleMetadata(input, metadata))),\n registerHierarchyProvider: (provider) => track(core.resources.registerHierarchyProvider(provider)),\n registerPresenter: (presenter) => track(core.resources.registerPresenter(presenter)),\n registerProvider: (provider) => track(core.resources.registerProvider(provider)),\n onDidOpenResource: (listener) => track(core.resources.onDidOpenResource(listener)),\n },\n settings: {\n ...core.settings,\n registerSection: (section, metadata) =>\n track(core.settings.registerSection(section, withModuleMetadata(input, metadata))),\n registerPanel: (panel, metadata) =>\n track(core.settings.registerPanel(panel, withModuleMetadata(input, metadata))),\n },\n shell: {\n ...core.shell,\n onDidChange: (listener) => track(core.shell.onDidChange(listener)),\n },\n sidePanel: {\n ...core.sidePanel,\n onDidChange: (listener) => track(core.sidePanel.onDidChange(listener)),\n },\n themes: {\n ...core.themes,\n register: (themes) => track(core.themes.register(themes)),\n },\n fileIconThemes: {\n ...core.fileIconThemes,\n register: (themes) => track(core.fileIconThemes.register(themes)),\n },\n } satisfies WorkbenchModuleContributionContext;\n\n return context;\n};\n\nconst createCoreCompositionController = (core: WorkbenchCore) =>\n createWorkbenchCompositionController({\n getActiveMode: () => {\n const modeId = core.modes.getActiveModeId();\n return modeId ? core.modes.getMode(modeId) : undefined;\n },\n getLayout: core.layout.getLayout,\n getResource: core.getPrimaryResource,\n listWidgets: core.layout.listWidgets,\n });\n\nexport const createWorkbenchCore = (input: CreateWorkbenchCoreInput = {}) => {\n const context = createContextKeyService();\n const commands = createCommandRegistry({ context });\n const moduleRecords = new Map<string, { disposable: Disposable }>();\n const rendererRegistry = createWorkbenchRendererRegistry(input.renderers);\n const treeRendererRegistry = createTreeRendererRegistry({\n rendererRegistry,\n persistence: input.treePersistence,\n });\n const kanbanRendererRegistry = createKanbanRendererRegistry({ rendererRegistry });\n const dataTableRendererRegistry = createDataTableRendererRegistry({ rendererRegistry });\n const fileRendererRegistry = createFileRendererRegistry({ rendererRegistry });\n const controlsRendererRegistry = createControlsRendererRegistry({ rendererRegistry });\n const locationAwareLayout = createLayoutModel({\n defaultRegionVisibility: input.defaultPanelOpenByRegionId,\n persistence: input.persistence\n ? {\n getLayout: (scope) => input.persistence?.getSnapshot(scope)?.layout,\n setLayout: (nextLayout, scope) => input.persistence?.setSnapshot({ layout: nextLayout }, scope),\n flush: input.persistence.flush,\n dispose: input.persistence.dispose,\n }\n : input.layoutPersistence,\n });\n const { establishLocation, ...layoutModel } = locationAwareLayout;\n const layout = {\n ...layoutModel,\n ...createMenuRegistry({ commands }),\n };\n const focus = createWorkbenchFocusController({\n context,\n isRegionFocusable: (region) => layout.getLayout().regions[region].visible,\n });\n const sidePanel = createWorkbenchSidePanelController({\n initialMode: input.initialSidePanelMode,\n persistence: input.sidePanelPersistence,\n });\n const shell = createWorkbenchShellController({ layout, sidePanel });\n\n const core: WorkbenchCore = {\n breadcrumbs: createWorkbenchBreadcrumbController(),\n commandPalette: createWorkbenchCommandPaletteController(),\n commands,\n composition: undefined as unknown as WorkbenchCompositionController,\n context,\n focus,\n host: {\n getSnapshot: () => ({ layout: layout.getLayout() }),\n restoreSnapshot: (snapshot) => layout.restoreLayout(snapshot.layout),\n setPersistenceScope: (scope, scopeInput = {}) =>\n layout.setPersistenceScope(scope, { carryRegionState: scopeInput.carryRegions }),\n getPersistenceScope: layout.getPersistenceScope,\n },\n history: undefined as unknown as HistoryController,\n keybindings: createKeybindingRegistry({ commands, context }),\n lastResource: createWorkbenchLastResourceController({\n persistence: input.lastResourcePersistence,\n openResource: (resource) => core.resources.openResource(resource, { replaceActive: true }),\n }),\n layout,\n modes: undefined as unknown as WorkbenchModeRegistry,\n navigator: undefined as unknown as WorkbenchNavigator,\n notifications: createNotificationRegistry(),\n navigation: createNavigationRegistry({\n resolveDispatcher: () => ({\n createCheckpoint: () => {\n // The checkpoint covers the navigation state the workbench owns:\n // layout, history, and breadcrumbs. Side effects of commands that\n // already executed belong to their extensions and cannot be undone.\n const layout = core.layout.getLayout();\n const restoreHistory = core.history.createCheckpoint();\n const breadcrumbs = core.breadcrumbs.getItems();\n return () => {\n core.layout.restoreLayout(layout);\n restoreHistory();\n if (breadcrumbs) core.breadcrumbs.setItems(breadcrumbs);\n else core.breadcrumbs.clearItems();\n };\n },\n canOpenResource: (resource) => {\n const state = core.resources.store.getState();\n return Boolean(\n state.kinds[resource.kind] &&\n Object.values(state.presenters).some((presenter) => presenter.canOpen(resource)),\n );\n },\n canOpenPanel: (panelId) => Boolean(core.layout.getPanel(panelId)),\n canExecuteCommand: (commandId) => Boolean(core.commands.getCommand(commandId)),\n openResource: (resource, openInput) => core.resources.openResource(resource, openInput),\n openPanel: (panelId, openInput) => {\n const instance = core.layout.openPanel(panelId, openInput);\n // Navigation is ingress — revealing the view is part of the intent.\n // The region might be hidden (panel collapsed, persisted state); make\n // sure the user can actually see the widget they navigated to.\n const panel = core.layout.getPanel(panelId);\n const region = openInput?.region ?? panel?.region;\n if (region) {\n if (region === \"side\") core.shell.setSidePanelPresentation(\"attached\");\n else if (isWorkbenchShellOpenRegion(region)) {\n core.shell.setRegionOpen(region, true);\n }\n }\n return instance;\n },\n executeCommand: (commandId, args) => core.commands.executeCommand(commandId, args),\n }),\n }),\n panels: createWorkbenchPanelsController({\n defaultOpenByRegionId: input.defaultPanelOpenByRegionId,\n persistence: input.panelsPersistence,\n }),\n preferences: createPreferenceRegistry({ persistence: input.preferencePersistence }),\n renderers: {\n ...rendererRegistry,\n ...treeRendererRegistry,\n ...kanbanRendererRegistry,\n ...dataTableRendererRegistry,\n ...fileRendererRegistry,\n ...controlsRendererRegistry,\n },\n commandPaletteResources: createCommandPaletteResourceRegistry(),\n resources: createResourceRegistry({\n getPrimary: () => getActiveLocationPlacement(core.layout.getLayout())?.resource,\n establishLocation: (instance) => establishLocation(instance.instanceId),\n }),\n settings: createSettingsRegistry(),\n shell,\n sidePanel,\n terminal: createWorkbenchTerminalController(),\n themes: createThemeRegistry(),\n fileIconThemes: createFileIconThemeRegistry(),\n\n getActiveResource() {\n const activeWidgetId = core.layout.getLayout().activeWidgetId;\n if (!activeWidgetId) return undefined;\n\n for (const region of Object.values(core.layout.getLayout().regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === activeWidgetId);\n if (placement) return placement.resource;\n }\n\n return undefined;\n },\n\n onDidChangeActiveResource(listener) {\n return createDisposable(\n core.layout.store.subscribeSelector(\n (state) => state.layout.activeResourceUri,\n () => listener(core.getActiveResource()),\n ),\n );\n },\n\n getPrimaryResource() {\n return getActiveLocationPlacement(core.layout.getLayout())?.resource;\n },\n\n onDidChangePrimaryResource(listener) {\n return createDisposable(\n core.layout.store.subscribeSelector(\n (state) => getActiveLocationPlacement(state.layout)?.resourceUri,\n () => listener(core.getPrimaryResource()),\n ),\n );\n },\n\n registerModule(module) {\n if (moduleRecords.has(module.id)) throw new Error(`Workbench module already registered: ${module.id}`);\n\n const disposables: Disposable[] = [];\n const record = {\n disposable: undefined as unknown as Disposable,\n };\n record.disposable = createDisposable(() => {\n if (moduleRecords.get(module.id) !== record) return;\n moduleRecords.delete(module.id);\n disposeDisposables(disposables);\n });\n\n moduleRecords.set(module.id, record);\n\n try {\n const context = createModuleContext(core, {\n ownerId: module.ownerId ?? module.id,\n source: module.source ?? \"module\",\n track: (disposable) => {\n disposables.push(disposable);\n },\n });\n disposables.push(...toDisposables(module.activate(context)));\n } catch (error) {\n record.disposable.dispose();\n throw error;\n }\n\n return record.disposable;\n },\n\n unregisterModule(moduleId) {\n moduleRecords.get(moduleId)?.disposable.dispose();\n },\n };\n\n core.modes = createWorkbenchModeRegistry({\n establishLocation: (instanceId) => establishLocation(instanceId),\n resolveContext: () => core,\n });\n core.navigator = createWorkbenchNavigator({\n modes: core.modes,\n getSelectedResource: () => core.getPrimaryResource(),\n presentResource: (resource, present) => core.resources.openResource(resource, present),\n });\n core.composition = createCoreCompositionController(core);\n core.history = createHistoryController({\n layout: core.layout,\n modes: core.modes,\n resources: core.resources,\n persistence: input.historyPersistence,\n commitNavigation: (commit) => core.navigator.commitContext(commit),\n });\n\n core.layout.store.subscribe((state) => {\n const activeRegion = core.focus.getActiveRegion();\n if (activeRegion && !state.layout.regions[activeRegion].visible) core.focus.clearFocus();\n });\n\n // The panels controller is workbench-global, but layout region visibility is\n // per-scope. After a scope switch, mirror each region's `visible` flag into\n // panels so the panel chrome (collapse/expand) reflects the loaded scope —\n // otherwise the previous scope's collapse state sticks around visually.\n core.layout.onDidChangePersistenceScope(() => {\n const layout = core.layout.getLayout();\n for (const region of Object.values(layout.regions)) {\n core.panels.setOpen(region.id, region.visible);\n }\n });\n\n // Persist the last PRIMARY (main) resource so apps can call `lastResource.restore()`\n // on next boot. We track the primary, not the global active resource: \"where you were\"\n // is the main subject (workspace/ticket), not a transient supporting selection like a\n // Side Panel session — those are detached and scoped, so they are intentionally not restored.\n core.onDidChangePrimaryResource((resource) => {\n if (resource) core.lastResource.set(resource);\n });\n\n // Keep the secondary resource anchors (derived/detached) consistent with the primary\n // (main) resource. The default scope predicate keeps detached anchors; apps inject\n // `isInScope` once scoped resource providers exist.\n createPrimaryCoordinator({\n layout: core.layout,\n isInScope: input.isInScope ?? createScopedIsInScope(core.resources),\n });\n\n registerWorkbenchBuiltIns(core);\n\n return core;\n};\n"],"names":["createResourceBreadcrumbItems","resources","resource","path","walkHierarchy","map","entry","index","title","label","id","getKind","kind","icon","length","onClick","openResource","replaceActive","createWorkbenchBreadcrumbController","store","createWorkbenchStore","name","initialState","items","undefined","setItems","setState","createDisposable","getState","clearItems","getItems","onDidChange","listener","unsubscribe","subscribeSelector","state","createWorkbenchCommandPaletteController","input","internal","open","initialOpen","view","initialQuery","paramsRequest","setOpenState","next","current","isOpen","getView","getInitialQuery","getParamsRequest","openInput","close","toggle","requestParams","request","clearParams","value","createRegionQueries","getLayout","getWidgets","getPlaceholder","getRegionSize","regionId","persistedSize","regions","size","placement","getActivePlacement","contributionSize","contributionId","regionSize","defaultPx","getRegionCollapsible","regionCollapsible","getRegionHeaderBorderBottom","headerBorderBottom","createContributionLists","getPlaceholders","listPlaceholders","Object","values","sort","byContributionPriority","listWidgets","createContributionRegistrations","persistLayout","registerPlaceholder","placeholder","metadata","region","Error","priority","placeholderContribution","record","normalizeContributionMetadata","snapshot","placeholders","_removed","nextPlaceholders","registerWidget","widget","reuse","singleton","widgetContribution","widgets","nextWidgets","nextLayout","removePlacementsForContribution","layout","insertAtPosition","position","unshift","push","targetWidgetId","beforeWidgetId","afterWidgetId","targetIndex","findIndex","candidate","widgetId","splice","placeWidget","tabRetention","persistentWidgets","filter","reorderWidgetPlacement","find","remaining","removePlacements","shouldRemove","removed","active","replaceRegionWidgets","clearActiveWidget","removeLocationSubPanelSelection","activeWidgetId","flatMap","activeResourceUri","expirePreviewTabsInLayout","ownerResourceUri","createLayoutPlacementMethods","updateWidgetPlacement","update","requireWidget","nextPlacement","buildUpdatedPlacement","currentIndex","setLayout","reorderWidget","some","expirePreviewTabs","activateWidget","applyAndActivate","carryPinnedWorkbenchChrome","incoming","pinned","role","contributionIds","Set","incomingRegion","has","carryWorkbenchRegionState","regionIds","resolveScopedLayout","defaultRegionVisibility","persisted","mergeWithDefaultRegions","createDefaultWorkbenchLayout","createScopeEvent","listeners","notify","subscribe","add","delete","createLayoutScopeMethods","currentScope","enteredWithLayout","persistence","willChangeScope","didChangeScope","setPersistenceScope","nextScope","scopeInput","scopedLayout","withPinnedChrome","carryRegionState","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","onWillChangePersistenceScope","openOwnedPanelMenus","panelMenuId","ownedPanelMenuIds","panelMenu","openWidget","findReusablePlacement","getActiveLocationPlacement","resourceUri","uri","findPlacement","findResourcePlacement","withPlacementRole","panelMenuOwner","eligibleLocations","findReplacementIndex","activeLocationWidgetId","replaceWidgetId","replacementWidgetId","defaultTabPosition","before","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","updated","tabPosition","replacementIndex","replacement","reuseExistingPlacement","withoutExisting","_current","copy","insertWidget","createUniqueWidgetId","createPlacement","placementInput","fallbackRegion","previewContent","defaultPanelTabRetention","workbenchPanelRegions","includes","createPanelLayoutMethods","getPanel","toPanelContribution","listPanels","listPanelInstances","toPanelInstance","getActivePanel","activeInstanceId","found","findPlacementByWidgetId","openPanel","widgetOpeners","toOpenWidgetInput","updatePanel","instanceId","placementMethods","reorderPanel","activatePanel","closePanel","closable","closeWidgetInLayout","activePlacement","menuRegions","workbenchPanelMenuRegions","menuSide","endsWith","ownerContributionId","getWidget","ownerPlacement","resolveMenuPlacements","placements","moves","seen","changed","owner","bound","target","reconcilePanelMenuOwnership","menuRegion","resolved","move","createOwnedMenuMethods","reconcilePanelMenus","panelMenuContribution","panel","menu","side","contribution","level","registerPanelContribution","panelMenus","panelContribution","registrations","registeredPanel","error","registration","reverse","dispose","createPanelRegistrations","registerPanel","registerLocation","location","registerSubPanel","subPanel","registerPanelMenu","createLocationEstablisher","panelMethods","fromEntries","entries","subPanelsOnly","main","requireRegisteredWidget","createLayoutModel","initialLayout","regionQueries","contributionLists","scopeMethods","action","updateRegion","nextRegion","activateInLayout","contributionRegistrations","panelRegistrations","ownedMenus","establishLocation","unregisterWidget","options","persist","setRegionVisible","visible","setRegionSize","setRegionActiveWidget","selectRegionActiveWidget","closeWidget","result","closedPlacement","removeWidgetPlacement","clearRegion","cleared","setLocationSubPanelSelection","resetRegions","nextRegions","locationSubPanelSelections","restoreLayout","isOpenSingleton","scopedResourceUri","addModePanels","mode","listAddablePanels","panelId","addable","set","addRegisteredPanels","isWorkbenchPanelPlacementVisible","modeId","createWorkbenchCompositionController","panelsFor","getResource","getActiveMode","isWorkbenchModePanelAvailable","Map","workbenchFocusRegions","focusContextByRegion","activity","sidenav","secondary","status","createWorkbenchFocusController","activeRegion","context","createScope","applyContext","focusRegion","setActiveRegion","isRegionFocusable","clearFocus","getActiveRegion","workbenchNavigationPanelRegions","workbenchPlacementRole","_layout","findSubPanelPlacement","reference","instanceKey","exact","subPanelRefFromPlacement","isSameSubPanel","left","right","selectedSubPanelsFromLayout","selected","locationPlacementFromLayout","locationFromPlacement","key","entryFromCurrentSnapshot","modes","getActiveModeId","recordedAt","Date","now","base","entryId","counter","selectedSubPanels","getMode","isSameNavigationEntry","every","compactNavigationEntries","compacted","lastIndex","withoutSubPanelSelection","closedNavigationEntry","closedSubPanel","WORKBENCH_HISTORY_VERSION","emptyHistoryState","cursor","recentlyClosed","hydrating","hydrateHistoryState","version","Math","min","max","slice","reconcileEntry","Boolean","listPresenters","presenter","canOpen","reconcileHistoryState","currentEntryId","retainedCursor","DEFAULT_MAX_ENTRIES","PERSISTENCE_DELAY_MS","createHistoryPersistenceScheduler","timer","flush","_hydrating","setHistory","getScope","schedule","setTimeout","suppressTransitionSnapshot","fromLayoutChange","transitioning","currentNavigationEntry","placementsByWidgetId","activateHistoryResource","replayCurrentLocation","replayResource","restoreSelections","presenters","activeLocationUri","createHistoryControllerApi","activateEntry","controllerInput","failRestore","finishRestore","moveCursor","runSilent","goBack","goForward","goPrevious","reopenLastClosed","last","at","pending","reopenSubPanel","Promise","then","restore","scope","clear","createCheckpoint","createHistoryRestoreFinisher","fail","failedEntryId","finish","restoredEntryId","requestedEntry","onFinish","createHistoryCursorMover","delta","trackLayoutScopeRotation","rotating","restoreEntryContext","commitNavigation","setActiveMode","createHistoryController","navigating","awaitingRestore","isRotatingLayoutScope","replayingResourceUris","schedulePersist","appendEntry","trimmed","replacesCurrentMode","appended","maxEntries","recordSnapshot","completedResourceOpen","isOpeningResource","isTransitioning","lastPlacements","normalizeRemovedPlacement","currentId","pushRecentlyClosed","nextPlacements","tracked","onDidChangeActive","onDidOpenResource","fallbackWidgetId","restoreMode","finally","replayScope","hydrated","getHistory","window","addEventListener","restoreFinisher","createWorkbenchLastResourceController","get","getLastResource","setLastResource","saved","modeAccepts","resourceKinds","lastResourceKey","projectId","createWorkbenchNavigator","hooks","fallbackSelection","lastResources","recordLastResource","getProjectId","getSelectedResource","presentResource","present","resolveTargetMode","requested","activeModeId","targetModeId","resolveCommit","commit","failure","ok","code","message","requestedRaw","requestedEffective","interpretSelection","kept","commitContext","outcome","applySelection","deferSeed","applyScope","seedActiveMode","applyBreadcrumb","resolveDefaultResource","defaultResource","commitAndPresent","enterModeWithFallback","fallback","configure","nextHooks","forgetResource","onDidCommit","createWorkbenchPanelsController","defaultOpenByRegionId","getPanelStates","resolveOpenByRegionId","openByRegionId","persistState","setPanelStates","setOpen","createWorkbenchSidePanelController","initialMode","setMode","DEFAULT_SESSION_TITLE","INITIAL_DATA_BUFFER_LIMIT","createWorkbenchTerminalController","sessionsById","opener","adapters","adapterDisposers","initialDataBuffers","sessionsWithDataSubscribers","patchSession","sessionId","patch","session","requireAdapter","adapter","cleanupSession","disposers","bufferInitialData","chunk","buffer","shift","kill","signal","isAvailable","setSessionOpener","onData","unsubscribeTitle","onTitle","onExit","exit","write","data","resize","cols","rows","sink","unsubscribes","bufferedData","onError","getSession","listSessions","running","all","createCommandPaletteResourceRegistry","providers","refreshToken","registerProvider","provider","rest","listProviders","queryProviders","results","query","providerId","refresh","createCommandRegistry","commands","errorListeners","requireCommand","emitError","event","registerCommand","command","handler","getCommand","listCommands","isCommandEnabled","args","isEnabled","isCommandVisible","matches","when","isVisible","isCommandToggled","isToggled","prepareCommandArgs","onArgsChange","prepare","prepareArgs","executeCommand","commandId","execute","onDidExecuteError","menuPathKey","join","createMenuRegistry","deps","menuStore","itemsByPath","registerMenuItem","item","list","filtered","listMenuItems","leftOrder","order","rightOrder","byPriorityAndId","localeCompare","noDispatcher","dispatchItem","dispatcher","validateItem","canOpenResource","canOpenPanel","canExecuteCommand","toItems","targets","createNavigationRegistry","resolveDispatcher","parsers","navigators","removeKey","registry","registerParser","parser","parserContribution","listParsers","resolveLocation","canParse","parse","openTarget","rollback","navigate","registerNavigator","navigator","navigatorContribution","listNavigators","createHref","canNavigate","navigateResource","createNotificationRegistry","notifications","generatedId","emit","show","notification","toString","createdAt","toISOString","type","dismiss","ids","keys","listNotifications","valueKey","scopeId","createMemoryPreferencePersistence","getValue","setValue","createPreferenceRegistry","schemas","registerSchema","schema","registeredNames","properties","additions","property","ownerId","source","getSchema","scoped","userValue","default","createControlsRendererRegistry","rendererRegistry","controlsStore","renderers","refreshListeners","implementation","requireControlsRenderer","renderer","setControlsRendererImplementation","impl","registerControlsRenderer","rendererDisposable","registerRenderer","render","rendererInput","controlsRendererId","nextRenderers","getControlsRenderer","listControlsRenderers","refreshControlsRenderer","onDidRefreshControlsRenderer","createDataTableRendererRegistry","dataTableStore","setDataTableRendererImplementation","registerDataTableRenderer","dataTableRendererId","getDataTableRenderer","listDataTableRenderers","refreshDataTableRenderer","onDidRefreshDataTableRenderer","createFileRendererRegistry","fileRendererStore","requireFileRenderer","setFileRendererImplementation","registerFileRenderer","fileRendererId","getFileRenderer","listFileRenderers","refreshFileRenderer","envelope","onDidRefreshFileRenderer","createKanbanRendererRegistry","dataStore","requireKanbanRenderer","setKanbanRendererImplementation","registerKanbanRenderer","kanbanRendererId","getKanbanRenderer","listKanbanRenderers","refreshKanbanRenderer","onDidRefreshKanbanRenderer","createDefaultState","expandedNodeIds","defaultExpandedNodeIds","expandedSectionIds","defaultExpandedSectionIds","mergeDefaultSections","missing","toggleId","expanded","createTreeRendererRegistry","getTreeStates","treeStore","trees","statesByTreeId","refreshKeysByTreeId","requireTree","tree","ensureState","fresh","persistStates","loading","_loading","persistable","setTreeStates","updateState","setTreeRendererImplementation","registerTreeRenderer","persistedState","nextState","treeId","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","getTreeRenderer","listTreeRenderers","getBody","ctx","getHeader","getFooter","getChildren","node","getTreeState","selectedNodeId","setNodeExpanded","nodeId","nextIds","setSectionExpanded","sectionId","setSelectedNode","setLoading","onDidRefresh","byOrderThenPriority","createSettingsRegistry","sections","panels","revision","registerSection","section","nextSections","nextPanels","getSection","listSections","createFileIconThemeRegistry","themes","groups","sync","flat","register","listThemes","createThemeRegistry","createScopedIsInScope","listResources","createPrimaryCoordinator","isInScope","resolveAnchorRegion","primary","getAnchorResource","reconcileAnchors","shellOpenRegions","isWorkbenchShellOpenRegion","createWorkbenchShellController","getRegionState","setRegionOpen","getSidePanelPresentation","sidePanel","setSidePanelPresentation","unsubscribeLayout","sidePanelSubscription","withModuleMetadata","toDisposables","Array","isArray","disposeDisposables","disposables","createModuleContext","core","contextScope","track","disposable","onDidChangePrimaryResource","onDidChangeActiveResource","breadcrumbs","commandPalette","focus","keybindings","registerKeybinding","keybinding","lastResource","instance","registerMode","activate","modeDisposables","modeContext","returnedDisposables","navigation","preferences","registerKind","registerHierarchyProvider","registerPresenter","settings","shell","fileIconThemes","createCoreCompositionController","getPrimaryResource","createWorkbenchCore","createContextKeyService","moduleRecords","createWorkbenchRendererRegistry","treeRendererRegistry","treePersistence","kanbanRendererRegistry","dataTableRendererRegistry","fileRendererRegistry","controlsRendererRegistry","locationAwareLayout","defaultPanelOpenByRegionId","getSnapshot","setSnapshot","layoutPersistence","layoutModel","initialSidePanelMode","sidePanelPersistence","composition","host","restoreSnapshot","carryRegions","history","createKeybindingRegistry","lastResourcePersistence","restoreHistory","kinds","panelsPersistence","preferencePersistence","commandPaletteResources","createResourceRegistry","getPrimary","terminal","getActiveResource","registerModule","module","unregisterModule","moduleId","createWorkbenchModeRegistry","resolveContext","historyPersistence","registerWorkbenchBuiltIns"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/controllers/breadcrumbs/breadcrumb-registry.ts","../src/core/controllers/command-palette/command-palette-controller.ts","../src/core/registries/layout/layout-contribution-helpers.ts","../src/core/registries/layout/layout-tab-lifecycle.ts","../src/core/registries/layout/layout-placement-methods.ts","../src/core/registries/layout/layout-scope.ts","../src/core/registries/layout/layout-scope-methods.ts","../src/core/registries/layout/layout-widget-openers.ts","../src/core/registries/layout/panel-layout-methods.ts","../src/core/registries/layout/panel-menu-ownership.ts","../src/core/registries/layout/panel-registration.ts","../src/core/registries/layout/layout-model.ts","../src/core/registries/modes/mode-registry-internals.ts","../src/core/registries/modes/mode-registry.ts","../src/core/controllers/composition/composition-controller.ts","../src/core/controllers/focus/focus-controller.ts","../src/core/registries/pages/page-registry-internals.ts","../src/core/controllers/page-location/page-location-codec.ts","../src/core/controllers/page-location/page-location-actions.ts","../src/core/controllers/page-location/page-location-normalization.ts","../src/core/controllers/page-location/page-location-history-entry.ts","../src/core/controllers/page-location/page-location-preparation.ts","../src/core/controllers/page-location/page-location-publish.ts","../src/core/controllers/page-location/page-placement-closer.ts","../src/core/controllers/page-location/page-location-controller.ts","../src/core/controllers/page-location/page-resource-codec.ts","../src/core/controllers/panel-menus/panel-menu-state-controller.ts","../src/core/controllers/side-panel/side-panel-controller.ts","../src/core/controllers/terminal/terminal-controller.ts","../src/core/registries/command-palette-resources/command-palette-resource-registry.ts","../src/core/registries/commands/command-registry.ts","../src/core/registries/layout/placement-reconciliation.ts","../src/core/registries/menus/menu-registry.ts","../src/core/shared/contributions/reference-id.ts","../src/core/registries/placements/owned-placement-lifecycle.ts","../src/core/registries/placements/owned-placement-preparation.ts","../src/core/registries/placements/owned-placement-restoration.ts","../src/core/registries/views/view-placement.ts","../src/core/registries/modes/mode-placement-registry.ts","../src/core/registries/navigation/navigation-registry.ts","../src/core/registries/navigation/navigation-tree-registry.ts","../src/core/registries/notifications/notification-registry.ts","../src/core/registries/overlays/overlay-registry.ts","../src/core/registries/pages/page-main.ts","../src/core/registries/pages/page-slot-lifecycle.ts","../src/core/registries/pages/page-placement-close.ts","../src/core/registries/pages/page-state-key.ts","../src/core/registries/pages/page-placement-pin.ts","../src/core/registries/pages/page-placement-resolver.ts","../src/core/registries/pages/page-registry-state.ts","../src/core/registries/pages/page-preparation.ts","../src/core/registries/pages/page-registration.ts","../src/core/registries/pages/page-registry.ts","../src/core/registries/placeholders/placeholder-registry.ts","../src/core/registries/placements/shell-placement-registry.ts","../src/core/registries/preferences/preference-registry.ts","../src/core/registries/renderers/controls-renderer-registry.ts","../src/core/registries/renderers/data-table-renderer-registry.ts","../src/core/registries/renderers/file-renderer-registry.ts","../src/core/registries/renderers/kanban-renderer-registry.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/renderers/tree-renderer-registry.ts","../src/core/registries/settings/settings-registry.ts","../src/core/registries/status-bar/status-bar-registry.ts","../src/core/registries/statuses/status-registry.ts","../src/core/registries/themes/file-icon-theme-registry.ts","../src/core/registries/themes/theme-registry.ts","../src/core/registries/view-menus/view-menu-registry.ts","../src/core/registries/views/view-registry.ts","../src/core/controllers/composition/placement-close-controller.ts","../src/core/controllers/composition/placement-pin-controller.ts","../src/core/controllers/page-location/page-breadcrumbs.ts","../src/core/controllers/page-location/page-location-memory.ts","../src/core/registries/layout/owned-placement-layout.ts","../src/core/controllers/page-runtime/page-runtime.ts","../src/core/controllers/page-runtime/page-state-restoration.ts","../src/core/controllers/page-runtime/workbench-layout-cache.ts","../src/core/controllers/shell/shell-controller.ts","../src/core/registries/views/view-body-registration.ts","../src/core/controllers/composition/owned-addable-panels.ts","../src/core/controllers/primary-coordinator/primary-coordinator.ts","../src/core/workbench-built-ins.ts","../src/core/workbench-core-connections.ts","../src/core/controllers/navigation/compound-navigation.ts","../src/core/workbench-core-navigation.ts","../src/core/workbench-core-renderers.ts","../src/core/workbench-module-context.ts","../src/core/workbench-module-registry.ts","../src/core/workbench-core.ts"],"sourcesContent":["import type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkbenchBreadcrumbItem {\n title: unknown;\n icon?: string;\n indicator?: \"session-status\";\n url?: string;\n onClick?: () => void;\n resource?: ResourceRef;\n}\n\nexport type WorkbenchBreadcrumbChangeListener = () => void;\n\nexport interface WorkbenchBreadcrumbState {\n items: WorkbenchBreadcrumbItem[] | undefined;\n}\n\nexport interface WorkbenchBreadcrumbController {\n store: WorkbenchStore<WorkbenchBreadcrumbState>;\n setItems(items: WorkbenchBreadcrumbItem[]): Disposable;\n clearItems(): void;\n getItems(): WorkbenchBreadcrumbItem[] | undefined;\n onDidChange(listener: WorkbenchBreadcrumbChangeListener): Disposable;\n}\n\nexport const createWorkbenchBreadcrumbController = (): WorkbenchBreadcrumbController => {\n const store = createWorkbenchStore<WorkbenchBreadcrumbState>({\n name: \"workbench.breadcrumbs\",\n initialState: { items: undefined },\n });\n\n return {\n store,\n\n setItems(items) {\n store.setState({ items }, false, \"setBreadcrumbItems\");\n return createDisposable(() => {\n if (store.getState().items === items) {\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n }\n });\n },\n\n clearItems() {\n if (store.getState().items === undefined) return;\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n },\n\n getItems() {\n return store.getState().items;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.items,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { CommandParamSchema, WorkbenchCommandExecutionContext } from \"../../registries/commands/command-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchCommandPaletteChangeListener = (open: boolean) => void;\nexport type WorkbenchCommandPaletteView = \"main\" | \"theme\";\n\n// A pending request to collect a command's params before running it. Held on the\n// controller (not in a single React tree) so any surface — palette entries, header\n// actions, tree actions — can open the one shared params dialog.\nexport interface WorkbenchCommandParamsRequest {\n record: { command: { id: string; label: string; params?: CommandParamSchema } };\n label: string;\n args?: unknown;\n context?: WorkbenchCommandExecutionContext;\n}\n\nexport interface WorkbenchCommandPaletteState {\n open: boolean;\n view: WorkbenchCommandPaletteView;\n initialQuery: string;\n paramsRequest: WorkbenchCommandParamsRequest | null;\n}\n\nexport interface WorkbenchCommandPaletteOpenInput {\n view?: WorkbenchCommandPaletteView;\n initialQuery?: string;\n}\n\nexport interface WorkbenchCommandPaletteController {\n store: WorkbenchStore<WorkbenchCommandPaletteState>;\n isOpen(): boolean;\n getView(): WorkbenchCommandPaletteView;\n getInitialQuery(): string;\n getParamsRequest(): WorkbenchCommandParamsRequest | null;\n open(input?: WorkbenchCommandPaletteOpenInput): void;\n close(): void;\n toggle(): void;\n requestParams(request: WorkbenchCommandParamsRequest): void;\n clearParams(): void;\n onDidChange(listener: WorkbenchCommandPaletteChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchCommandPaletteControllerInput {\n initialOpen?: boolean;\n}\n\nexport const createWorkbenchCommandPaletteController = (\n input: CreateWorkbenchCommandPaletteControllerInput = {},\n): WorkbenchCommandPaletteController => {\n const internal = createWorkbenchStore<WorkbenchCommandPaletteState>({\n name: \"workbench.commandPalette\",\n initialState: { open: input.initialOpen ?? false, view: \"main\", initialQuery: \"\", paramsRequest: null },\n });\n\n // Patches open/view/initialQuery while preserving paramsRequest, which has its own\n // lifecycle (a request can outlive the palette being closed).\n const setOpenState = (next: Pick<WorkbenchCommandPaletteState, \"open\" | \"view\" | \"initialQuery\">) => {\n const current = internal.getState();\n if (current.open === next.open && current.view === next.view && current.initialQuery === next.initialQuery) return;\n internal.setState({ ...current, ...next }, false, \"setCommandPaletteState\");\n };\n\n return {\n store: internal,\n isOpen() {\n return internal.getState().open;\n },\n getView() {\n return internal.getState().view;\n },\n getInitialQuery() {\n return internal.getState().initialQuery;\n },\n getParamsRequest() {\n return internal.getState().paramsRequest;\n },\n open(openInput = {}) {\n setOpenState({ open: true, view: openInput.view ?? \"main\", initialQuery: openInput.initialQuery ?? \"\" });\n },\n close() {\n setOpenState({ open: false, view: \"main\", initialQuery: \"\" });\n },\n toggle() {\n setOpenState({ open: !internal.getState().open, view: \"main\", initialQuery: \"\" });\n },\n requestParams(request) {\n internal.setState({ ...internal.getState(), paramsRequest: request }, false, \"requestCommandParams\");\n },\n clearParams() {\n if (!internal.getState().paramsRequest) return;\n internal.setState({ ...internal.getState(), paramsRequest: null }, false, \"clearCommandParams\");\n },\n onDidChange(listener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.open,\n (value) => listener(value),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { getActivePlacement, removePlacementsForContribution } from \"./layout-operations\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n} from \"./layout-types\";\n\ninterface CreateRegionQueriesInput {\n getLayout(): WorkbenchLayout;\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;\n getRegionSettings?(regionId: WorkbenchRegion): WorkbenchRegionSettings | undefined;\n}\n\nexport const createRegionQueries = (input: CreateRegionQueriesInput) => {\n const { getLayout, getWidgets, getPlaceholder } = input;\n\n return {\n getRegionSize(regionId: WorkbenchRegion) {\n const persistedSize = getLayout().regions[regionId].size;\n const placement = getActivePlacement(getLayout().regions[regionId]);\n const contributionSize = placement\n ? getWidgets()[placement.contributionId]?.regionSize\n : getPlaceholder(regionId)?.regionSize;\n const size = contributionSize ?? input.getRegionSettings?.(regionId)?.size;\n if (persistedSize === undefined) return size;\n return { ...size, defaultPx: persistedSize };\n },\n\n getRegionCollapsible(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement)\n return getPlaceholder(regionId)?.regionCollapsible ?? input.getRegionSettings?.(regionId)?.collapsible ?? true;\n return (\n getWidgets()[placement.contributionId]?.regionCollapsible ??\n input.getRegionSettings?.(regionId)?.collapsible ??\n true\n );\n },\n\n getRegionHeaderBorderBottom(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement) return true;\n return getWidgets()[placement.contributionId]?.headerBorderBottom ?? true;\n },\n };\n};\n\nexport const createContributionLists = (input: {\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n}) => {\n const { getPlaceholders, getWidgets } = input;\n\n return {\n listPlaceholders: () => Object.values(getPlaceholders()).sort(byContributionPriority),\n listWidgets: () => Object.values(getWidgets()).sort(byContributionPriority),\n };\n};\n\nexport const createContributionRegistrations = (input: {\n store: InternalWorkbenchStore<WorkbenchLayoutStoreState>;\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n persistLayout(): void;\n}) => {\n const { store, getPlaceholders, getWidgets, persistLayout } = input;\n\n return {\n registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata) {\n if (getPlaceholders()[placeholder.region]) {\n throw new Error(`Placeholder already registered: ${placeholder.region}`);\n }\n\n const { priority, ...placeholderContribution } = placeholder;\n const record: RegisteredPlaceholderContribution = {\n ...placeholderContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState(\n { ...snapshot, placeholders: { ...snapshot.placeholders, [placeholder.region]: record } },\n false,\n \"registerPlaceholder\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.placeholders[placeholder.region] !== record) return;\n const { [placeholder.region]: _removed, ...nextPlaceholders } = current.placeholders;\n store.setState({ ...current, placeholders: nextPlaceholders }, false, \"unregisterPlaceholder\");\n });\n },\n\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata) {\n if (getWidgets()[widget.id]) throw new Error(`Widget already registered: ${widget.id}`);\n\n const { priority, reuse, singleton, ...widgetContribution } = widget;\n const record: RegisteredWidgetContribution = {\n ...widgetContribution,\n reuse: reuse ?? \"resource\",\n singleton: singleton ?? true,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState({ ...snapshot, widgets: { ...snapshot.widgets, [widget.id]: record } }, false, \"registerWidget\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.widgets[widget.id] !== record) return;\n const { [widget.id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout = removePlacementsForContribution(current.layout, widget.id);\n store.setState({ widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n persistLayout();\n });\n },\n };\n};\n","import { getActivePlacement, removeLocationSubPanelSelection, replaceRegionWidgets } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchTabPosition, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nconst insertAtPosition = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) => {\n const next = [...widgets];\n if (position === \"start\") {\n next.unshift(placement);\n return next;\n }\n if (position === \"end\") {\n next.push(placement);\n return next;\n }\n\n const targetWidgetId = \"beforeWidgetId\" in position ? position.beforeWidgetId : position.afterWidgetId;\n const targetIndex = next.findIndex((candidate) => candidate.widgetId === targetWidgetId);\n if (targetIndex < 0) {\n next.push(placement);\n return next;\n }\n next.splice(targetIndex + (\"afterWidgetId\" in position ? 1 : 0), 0, placement);\n return next;\n};\n\nexport const placeWidget = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position?: WorkbenchTabPosition,\n) => {\n if (placement.tabRetention !== \"preview\") return insertAtPosition(widgets, placement, position);\n const persistentWidgets = widgets.filter(\n (candidate) => candidate.tabRetention !== \"preview\" && candidate.widgetId !== placement.widgetId,\n );\n return insertAtPosition(persistentWidgets, placement, \"start\");\n};\n\nexport const reorderWidgetPlacement = (\n widgets: WorkbenchWidgetPlacement[],\n widgetId: string,\n position: WorkbenchTabPosition,\n) => {\n const placement = widgets.find((candidate) => candidate.widgetId === widgetId);\n if (!placement) return widgets;\n if (placement.tabRetention === \"preview\") {\n throw new Error(`Preview widget cannot be reordered: ${widgetId}`);\n }\n const remaining = widgets.filter((candidate) => candidate.widgetId !== widgetId);\n return insertAtPosition(remaining, placement, position);\n};\n\nconst removePlacements = (layout: WorkbenchLayout, shouldRemove: (placement: WorkbenchWidgetPlacement) => boolean) => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter(shouldRemove);\n if (removed.length === 0) continue;\n const active = getActivePlacement(region);\n nextLayout = replaceRegionWidgets(\n nextLayout,\n region.id,\n (widgets) => widgets.filter((placement) => !shouldRemove(placement)),\n { clearActiveWidget: active ? shouldRemove(active) : false },\n );\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const activePlacement = nextLayout.activeWidgetId\n ? Object.values(nextLayout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === nextLayout.activeWidgetId)\n : undefined;\n if (!activePlacement) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n return nextLayout;\n};\n\nexport const expirePreviewTabsInLayout = (layout: WorkbenchLayout, ownerResourceKey?: string) =>\n removePlacements(\n layout,\n (placement) =>\n placement.tabRetention === \"preview\" &&\n (ownerResourceKey === undefined || placement.ownerResourceKey !== ownerResourceKey),\n );\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { buildUpdatedPlacement, replaceRegionWidgets } from \"./layout-operations\";\nimport { expirePreviewTabsInLayout, reorderWidgetPlacement } from \"./layout-tab-lifecycle\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport const createLayoutPlacementMethods = (input: {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}): Pick<LayoutModel, \"updateWidgetPlacement\" | \"reorderWidget\" | \"expirePreviewTabs\" | \"activateWidget\"> => ({\n updateWidgetPlacement(widgetId, update) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((placement) => placement.widgetId === widgetId);\n if (index < 0) continue;\n const widget = input.requireWidget(region.widgets[index].contributionId);\n const nextPlacement = buildUpdatedPlacement(region.widgets[index], widget, update);\n const nextLayout = replaceRegionWidgets(layout, region.id, (widgets) =>\n widgets.map((current, currentIndex) => (currentIndex === index ? nextPlacement : current)),\n );\n input.setLayout(nextLayout);\n input.persistLayout();\n return nextPlacement;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n reorderWidget(widgetId, position) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n if (!region.widgets.some((placement) => placement.widgetId === widgetId)) continue;\n input.setLayout(\n replaceRegionWidgets(layout, region.id, (widgets) => reorderWidgetPlacement(widgets, widgetId, position)),\n );\n input.persistLayout();\n return;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n expirePreviewTabs(ownerResourceKey) {\n input.setLayout(expirePreviewTabsInLayout(input.getLayout(), ownerResourceKey));\n input.persistLayout();\n },\n\n activateWidget(widgetId) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === widgetId);\n if (placement) return input.applyAndActivate(layout, region.id, placement);\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n});\n","import { createDisposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n createDefaultWorkbenchLayout,\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchRegion,\n} from \"./layout-types\";\n\nexport const carryPinnedWorkbenchChrome = (current: WorkbenchLayout, incoming: WorkbenchLayout) => {\n const regions = { ...incoming.regions };\n\n for (const region of Object.values(current.regions)) {\n const pinned = region.widgets.filter((placement) => placement.pinned && placement.role === \"content\");\n if (pinned.length === 0) continue;\n const contributionIds = new Set(pinned.map((placement) => placement.contributionId));\n const incomingRegion = incoming.regions[region.id];\n regions[region.id] = {\n ...incomingRegion,\n widgets: [\n ...pinned,\n ...incomingRegion.widgets.filter((placement) => !contributionIds.has(placement.contributionId)),\n ],\n activeWidgetId: incomingRegion.activeWidgetId ?? pinned[0]?.widgetId,\n };\n }\n return { ...incoming, regions };\n};\n\nexport const carryWorkbenchRegionState = (\n current: WorkbenchLayout,\n incoming: WorkbenchLayout,\n regionIds: readonly WorkbenchRegion[],\n) => {\n if (regionIds.length === 0) return incoming;\n const regions = { ...incoming.regions };\n for (const regionId of regionIds) regions[regionId] = current.regions[regionId];\n return { ...incoming, regions };\n};\n\nexport const resolveScopedLayout = (\n defaultRegionVisibility: Partial<Record<WorkbenchRegion, boolean>> | undefined,\n persisted: WorkbenchLayout | undefined,\n) =>\n persisted\n ? mergeWithDefaultRegions(persisted, defaultRegionVisibility)\n : createDefaultWorkbenchLayout(defaultRegionVisibility);\n\nexport const createScopeEvent = <T>() => {\n const listeners = new Set<(value: T) => void>();\n return {\n notify(value: T) {\n for (const listener of listeners) runWorkbenchEffect(\"layout scope subscriber\", () => listener(value));\n },\n subscribe(listener: (value: T) => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { LayoutModel, LayoutPersistenceAdapter, LayoutScope } from \"./layout-model-types\";\nimport {\n carryPinnedWorkbenchChrome,\n carryWorkbenchRegionState,\n createScopeEvent,\n resolveScopedLayout,\n} from \"./layout-scope\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\n\nexport interface CreateLayoutScopeMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n persistence?: LayoutPersistenceAdapter;\n setLayout(layout: WorkbenchLayout, action: string): void;\n}\n\n// Owns the active persistence scope and the layout rotation that follows it. Kept\n// beside the layout model so the model factory stays a wiring surface.\nexport const createLayoutScopeMethods = (input: CreateLayoutScopeMethodsInput) => {\n let currentScope: LayoutScope | undefined;\n // Answers \"was this scope entered with a layout the user already had?\", sampled when\n // the scope becomes current. Reading persistence live would be wrong: entering a mode\n // restores and persists panels before the mode seeds, so a new scope would look like\n // a returning one and never get its defaults.\n let enteredWithLayout =\n runWorkbenchEffect(\"layout cache read for unscoped\", () => input.persistence?.getLayout(undefined)) !== undefined;\n const willChangeScope = createScopeEvent<LayoutScope | undefined>();\n const didChangeScope = createScopeEvent<LayoutScope | undefined>();\n\n const persistLayout = () =>\n runWorkbenchEffect(`layout cache for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setLayout(input.getLayout(), currentScope),\n );\n\n const setPersistenceScope: LayoutModel[\"setPersistenceScope\"] = (nextScope, scopeInput = {}) => {\n if (currentScope === nextScope) return;\n persistLayout();\n willChangeScope.notify(nextScope);\n currentScope = nextScope;\n const incoming = runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n );\n enteredWithLayout = incoming !== undefined;\n const scopedLayout = resolveScopedLayout(input.defaultRegionVisibility, incoming);\n // Module-owned chrome is global workbench structure. Project scopes replace\n // Location workspaces, but must not unmount pinned navigation and headers.\n const withPinnedChrome = carryPinnedWorkbenchChrome(input.getLayout(), scopedLayout);\n const nextLayout = carryWorkbenchRegionState(\n input.getLayout(),\n withPinnedChrome,\n scopeInput.carryRegionState ?? [],\n );\n input.setLayout(nextLayout, \"setPersistenceScope\");\n didChangeScope.notify(currentScope);\n };\n\n return {\n getPersistenceScope: () => currentScope,\n // Live: whether anything is stored for the active scope right now.\n hasPersistedLayout: () =>\n runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n ) !== undefined,\n enteredWithPersistedLayout: () => enteredWithLayout,\n onDidChangePersistenceScope: didChangeScope.subscribe,\n onWillChangePersistenceScope: willChangeScope.subscribe,\n persistLayout,\n setPersistenceScope,\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport {\n buildUpdatedPlacement,\n createPlacement,\n createUniqueWidgetId,\n findPlacement,\n findResourcePlacement,\n getActiveLocationPlacement,\n replaceRegionWidgets,\n} from \"./layout-operations\";\nimport { placeWidget } from \"./layout-tab-lifecycle\";\nimport type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\ninterface CreateWidgetOpenersInput {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}\nconst openOwnedPanelMenus = (input: {\n openWidget(id: string, openInput?: OpenWidgetInput): WorkbenchWidgetPlacement;\n placement: WorkbenchWidgetPlacement;\n requireWidget(id: string): RegisteredWidgetContribution;\n widget: RegisteredWidgetContribution;\n}) => {\n for (const panelMenuId of input.widget.ownedPanelMenuIds ?? []) {\n const panelMenu = input.requireWidget(panelMenuId);\n input.openWidget(panelMenuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: panelMenu.rendererId,\n resource: input.placement.resource,\n title: panelMenu.region === \"main-left-menu\" ? input.placement.resource?.label : panelMenu.title,\n });\n }\n};\nconst findReusablePlacement = (\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n openInput: OpenWidgetInput,\n) => {\n if (!widget.singleton && widget.reuse === \"none\") return undefined;\n if (openInput.role === \"sub-panel\" || openInput.role === \"panel-menu\") {\n const ownerResourceKey = getActiveLocationPlacement(layout)?.resourceKey;\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) =>\n candidate.contributionId === widget.id &&\n // Pinned placements are structural chrome, not per-location content, so they are\n // reused across location switches instead of accumulating one instance per owner.\n (candidate.pinned === true ||\n (widget.singleton && candidate.ownerResourceKey === undefined) ||\n candidate.ownerResourceKey === ownerResourceKey) &&\n (!openInput.resource ||\n (widget.singleton && candidate.resourceKey === undefined) ||\n candidate.resourceKey === resourceKey(openInput.resource)),\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n }\n if (widget.singleton) return findPlacement(layout, widget.id);\n if (openInput.resource) return findResourcePlacement(layout, widget.id, resourceKey(openInput.resource));\n return findPlacement(layout, widget.id);\n};\nconst withPlacementRole = (widget: RegisteredWidgetContribution, openInput: OpenWidgetInput): OpenWidgetInput => {\n if (openInput.role) return openInput;\n if (widget.panelMenuOwner) return { ...openInput, role: \"panel-menu\" };\n if (widget.eligibleLocations !== undefined) return { ...openInput, role: \"sub-panel\" };\n return openInput;\n};\nconst findReplacementIndex = (layout: WorkbenchLayout, regionId: WorkbenchRegion, openInput: OpenWidgetInput) => {\n const region = layout.regions[regionId];\n const activeWidgetId = openInput.role === \"location\" ? layout.activeLocationWidgetId : region.activeWidgetId;\n if (openInput.replaceWidgetId) {\n return region.widgets.findIndex((placement) => placement.widgetId === openInput.replaceWidgetId);\n }\n if (openInput.tabRetention === \"preview\") {\n return region.widgets.findIndex((placement) => placement.tabRetention === \"preview\");\n }\n if (!openInput.replaceActive) return -1;\n const replacementWidgetId =\n regionId === \"main\" && openInput.resource && layout.activeLocationWidgetId\n ? layout.activeLocationWidgetId\n : activeWidgetId;\n return region.widgets.findIndex((placement) => placement.widgetId === replacementWidgetId && !placement.pinned);\n};\nconst defaultTabPosition = (\n widgets: WorkbenchWidgetPlacement[],\n widget: RegisteredWidgetContribution,\n requireWidget: (id: string) => RegisteredWidgetContribution,\n) => {\n const before = widgets.find((placement) => {\n try {\n return widget.priority > requireWidget(placement.contributionId).priority;\n } catch {\n return widget.priority > 0;\n }\n });\n return before ? ({ beforeWidgetId: before.widgetId } as const) : undefined;\n};\nexport const createWidgetOpeners = (input: CreateWidgetOpenersInput) => {\n const { getLayout, requireWidget, applyAndActivate } = input;\n const bindToActiveLocation = (placement: WorkbenchWidgetPlacement, layout: WorkbenchLayout) => {\n if (placement.role !== \"sub-panel\" && placement.role !== \"panel-menu\") return placement;\n return { ...placement, ownerResourceKey: getActiveLocationPlacement(layout)?.resourceKey };\n };\n const updateSingleton = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), existing.regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === existing.index ? nextPlacement : current));\n if (!openInput.tabPosition) return updated;\n return placeWidget(\n updated.filter((placement) => placement.widgetId !== nextPlacement.widgetId),\n nextPlacement,\n openInput.tabPosition,\n );\n });\n return applyAndActivate(layout, existing.regionId, nextPlacement);\n };\n const replaceActive = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n replacement: WorkbenchWidgetPlacement,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(buildUpdatedPlacement(replacement, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === replacementIndex ? nextPlacement : current));\n if (nextPlacement.tabRetention !== \"preview\") return updated;\n return placeWidget(updated, nextPlacement, \"start\");\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const reuseExistingPlacement = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n if (openInput.tabRetention === \"preview\" && existing.placement.tabRetention !== \"preview\") {\n return applyAndActivate(getLayout(), existing.regionId, existing.placement);\n }\n if (existing.regionId !== regionId) {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const withoutExisting = replaceRegionWidgets(\n getLayout(),\n existing.regionId,\n (widgets) => widgets.filter((_current, index) => index !== existing.index),\n { clearActiveWidget: getLayout().regions[existing.regionId].activeWidgetId === existing.placement.widgetId },\n );\n const layout = replaceRegionWidgets(withoutExisting, regionId, (widgets) => {\n if (replacementIndex < 0) return placeWidget(widgets, nextPlacement, openInput.tabPosition);\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, nextPlacement);\n return nextPlacement.tabRetention === \"preview\" ? placeWidget(copy, nextPlacement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n }\n if (replacementIndex < 0 || existing.index === replacementIndex) {\n return updateSingleton(widget, existing, openInput);\n }\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) =>\n placeWidget(\n widgets\n .map((current, index) => (index === existing.index ? nextPlacement : current))\n .filter((_current, index) => index !== replacementIndex && index !== existing.index),\n nextPlacement,\n openInput.tabPosition,\n ),\n );\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const insertWidget = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n const widgetId = createUniqueWidgetId(getLayout(), widget.id);\n const placement = bindToActiveLocation(createPlacement(widgetId, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n if (replacementIndex < 0) {\n return placeWidget(\n widgets,\n placement,\n openInput.tabPosition ?? defaultTabPosition(widgets, widget, requireWidget),\n );\n }\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, placement);\n return placement.tabRetention === \"preview\" ? placeWidget(copy, placement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, placement);\n };\n const openWidget = (id: string, openInput: OpenWidgetInput = {}): WorkbenchWidgetPlacement => {\n const widget = requireWidget(id);\n const placementInput = withPlacementRole(widget, openInput);\n const layout = getLayout();\n const regionId = placementInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n const region = layout.regions[regionId];\n const replacementIndex = findReplacementIndex(layout, regionId, placementInput);\n const replacement = replacementIndex >= 0 ? region.widgets[replacementIndex] : undefined;\n const previewContent =\n !placementInput.replaceWidgetId && placementInput.tabRetention === \"preview\" && placementInput.resource\n ? findResourcePlacement(layout, widget.id, resourceKey(placementInput.resource))\n : undefined;\n const existing =\n placementInput.replaceWidgetId && replacement ? undefined : findReusablePlacement(widget, layout, placementInput);\n let placement: WorkbenchWidgetPlacement;\n if (previewContent) {\n placement = applyAndActivate(layout, previewContent.regionId, previewContent.placement);\n } else if (existing) {\n placement = reuseExistingPlacement(widget, existing, regionId, replacementIndex, placementInput);\n } else if (replacement?.contributionId === widget.id) {\n placement = replaceActive(widget, regionId, replacementIndex, replacement, placementInput);\n } else {\n placement = insertWidget(widget, regionId, replacementIndex, placementInput);\n }\n openOwnedPanelMenus({ openWidget, placement, requireWidget, widget });\n return applyAndActivate(getLayout(), previewContent?.regionId ?? regionId, placement);\n };\n return { openWidget };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { closeWidgetInLayout, findPlacementByWidgetId } from \"./layout-operations\";\nimport {\n type OpenWorkbenchPanelInput,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { toOpenWidgetInput, toPanelContribution, toPanelInstance } from \"./panel-api\";\n\n// A programmatic open into a tabbed region is a peek: it lands as a preview tab that the\n// next peek replaces. Chrome regions and pinned placements are structure, so they stay put.\nconst defaultPanelTabRetention = (widget: RegisteredWidgetContribution, openInput: OpenWorkbenchPanelInput) => {\n if (openInput.pinned) return \"persistent\" as const;\n const region = openInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n return workbenchPanelRegions.includes(region as WorkbenchPanelRegion)\n ? (\"preview\" as const)\n : (\"persistent\" as const);\n};\n\ninterface CreatePanelLayoutMethodsInput {\n getLayout: () => WorkbenchLayout;\n getWidgets: () => WorkbenchLayoutStoreState[\"widgets\"];\n listWidgets: LayoutModel[\"listWidgets\"];\n persistLayout: () => void;\n placementMethods: Pick<LayoutModel, \"activateWidget\" | \"reorderWidget\" | \"updateWidgetPlacement\">;\n setLayout: (layout: WorkbenchLayout) => void;\n widgetOpeners: Pick<LayoutModel, \"openWidget\">;\n}\n\nexport const createPanelLayoutMethods = (input: CreatePanelLayoutMethodsInput) => ({\n getPanel(id: string) {\n const widget = input.getWidgets()[id];\n return widget ? toPanelContribution(widget) : undefined;\n },\n\n listPanels: () => input.listWidgets().map(toPanelContribution),\n\n listPanelInstances(region?: WorkbenchRegion) {\n const placements = region\n ? input.getLayout().regions[region].widgets\n : Object.values(input.getLayout().regions).flatMap((candidate) => candidate.widgets);\n return placements.map(toPanelInstance);\n },\n\n getActivePanel(region?: WorkbenchRegion) {\n if (region) {\n const state = input.getLayout().regions[region];\n const placement =\n state.widgets.find((candidate) => candidate.widgetId === state.activeWidgetId) ?? state.widgets[0];\n return placement ? toPanelInstance(placement) : undefined;\n }\n const activeInstanceId = input.getLayout().activeWidgetId;\n if (!activeInstanceId) return undefined;\n const found = findPlacementByWidgetId(input.getLayout(), activeInstanceId);\n return found ? toPanelInstance(found.placement) : undefined;\n },\n\n openPanel(id: string, openInput: OpenWorkbenchPanelInput = {}) {\n const widget = input.getWidgets()[id];\n if (!widget) throw new Error(`Panel not registered: ${id}`);\n return toPanelInstance(\n input.widgetOpeners.openWidget(id, toOpenWidgetInput(openInput, defaultPanelTabRetention(widget, openInput))),\n );\n },\n\n updatePanel(instanceId: string, update: OpenWorkbenchPanelInput) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.updateWidgetPlacement(instanceId, toOpenWidgetInput(update)));\n },\n\n reorderPanel(instanceId: string, position: Parameters<LayoutModel[\"reorderPanel\"]>[1]) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n input.placementMethods.reorderWidget(instanceId, position);\n },\n\n activatePanel(instanceId: string) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.activateWidget(instanceId));\n },\n\n closePanel(instanceId: string) {\n const found = findPlacementByWidgetId(input.getLayout(), instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (found.placement.closable !== true) throw new Error(`Panel cannot be closed: ${instanceId}`);\n const active = closeWidgetInLayout(input.getLayout(), instanceId);\n if (!active) throw new Error(`Panel instance not found: ${instanceId}`);\n input.setLayout(active.layout);\n input.persistLayout();\n return active.activePlacement ? toPanelInstance(active.activePlacement) : undefined;\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchPanelMenuRegion,\n type WorkbenchPanelMenuSide,\n type WorkbenchPanelRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\ntype GetWidget = (contributionId: string) => RegisteredWidgetContribution | undefined;\n\nconst menuRegions = Object.values(workbenchPanelMenuRegions).flatMap(\n (regions) => Object.values(regions) as WorkbenchPanelMenuRegion[],\n);\n\nconst menuSide = (region: WorkbenchPanelMenuRegion): WorkbenchPanelMenuSide =>\n region.endsWith(\"-left-menu\") ? \"left\" : \"right\";\n\nconst ownerContributionId = (getWidget: GetWidget, contributionId: string) =>\n getWidget(contributionId)?.panelMenuOwner?.contributionId;\n\nconst ownerPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of workbenchPanelRegions) {\n const placement = layout.regions[region].widgets.find((candidate) => candidate.contributionId === contributionId);\n if (placement) return { region, placement };\n }\n return undefined;\n};\n\ninterface MenuResolution {\n placements: WorkbenchWidgetPlacement[];\n changed: boolean;\n}\n\n// One placement per owned menu contribution. A panel opened without a resource and\n// then reopened with one would otherwise leave its first menu behind, because menu\n// reuse keys on the owner's resource. Keeping the first placement and rebinding it\n// preserves the menu's identity and active state.\nconst resolveMenuPlacements = (\n layout: WorkbenchLayout,\n getWidget: GetWidget,\n region: WorkbenchPanelMenuRegion,\n): MenuResolution & { moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] } => {\n const placements: WorkbenchWidgetPlacement[] = [];\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n const seen = new Set<string>();\n let changed = false;\n\n for (const placement of layout.regions[region].widgets) {\n const owner = ownerContributionId(getWidget, placement.contributionId);\n if (!owner) {\n placements.push(placement);\n continue;\n }\n if (seen.has(placement.contributionId)) {\n changed = true;\n continue;\n }\n seen.add(placement.contributionId);\n\n const found = ownerPlacement(layout, owner);\n if (!found) {\n // Orphaned menu: its owner panel has no placement anywhere.\n changed = true;\n continue;\n }\n\n const bound =\n placement.ownerResourceKey === found.placement.resourceKey\n ? placement\n : { ...placement, ownerResourceKey: found.placement.resourceKey };\n if (bound !== placement) changed = true;\n\n const target = workbenchPanelMenuRegions[found.region as WorkbenchPanelRegion][menuSide(region)];\n if (target === region) {\n placements.push(bound);\n continue;\n }\n changed = true;\n moves.push({ placement: bound, target });\n }\n\n return { changed, moves, placements };\n};\n\n// A panel instance owns its menu instances: menus render beside the region their\n// owner currently occupies, stay bound to the owner's resource, and a menu whose\n// owner has no placement is an orphan. Menu identity (widget id, active state) is\n// preserved on a move; no second instance is created.\nexport const reconcilePanelMenuOwnership = (layout: WorkbenchLayout, getWidget: GetWidget): WorkbenchLayout => {\n let changed = false;\n const regions = { ...layout.regions };\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n\n for (const menuRegion of menuRegions) {\n if (layout.regions[menuRegion].widgets.length === 0) continue;\n const resolved = resolveMenuPlacements(layout, getWidget, menuRegion);\n moves.push(...resolved.moves);\n if (!resolved.changed) continue;\n\n changed = true;\n const region = regions[menuRegion];\n regions[menuRegion] = {\n ...region,\n widgets: resolved.placements,\n activeWidgetId: resolved.placements.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n\n for (const move of moves) {\n const target = regions[move.target];\n regions[move.target] = { ...target, widgets: [...target.widgets, move.placement] };\n }\n\n return changed ? { ...layout, regions } : layout;\n};\n\nexport interface CreateOwnedMenuMethodsInput {\n getLayout(): WorkbenchLayout;\n getWidget: GetWidget;\n openWidget: LayoutModel[\"openWidget\"];\n persistLayout(): void;\n setLayout(layout: WorkbenchLayout): void;\n}\n\n// Every open (including a region move or a rebind to a resource) reconciles the\n// owned menus of the panel that moved, so a panel instance always has exactly one\n// instance of each menu it owns.\nexport const createOwnedMenuMethods = (input: CreateOwnedMenuMethodsInput) => {\n const reconcilePanelMenus = () => {\n const next = reconcilePanelMenuOwnership(input.getLayout(), input.getWidget);\n if (next === input.getLayout()) return;\n input.setLayout(next);\n input.persistLayout();\n };\n\n const openWidget: LayoutModel[\"openWidget\"] = (id, openInput) => {\n const placement = input.openWidget(id, openInput);\n reconcilePanelMenus();\n return placement;\n };\n\n return { openWidget, reconcilePanelMenus };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type {\n WidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelRegion,\n} from \"./layout-types\";\nimport { workbenchPanelMenuRegions, workbenchPanelRegions } from \"./layout-types\";\n\ntype RegisteredPanelInput = WorkbenchPanelContribution;\ntype WorkbenchPanelKind = \"panel\" | \"sub-panel\";\n\ninterface RegisterPanelContributionInput {\n metadata?: ContributionMetadata;\n panel: RegisteredPanelInput;\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n kind: WorkbenchPanelKind;\n}\n\ninterface CreatePanelRegistrationsInput {\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nconst panelMenuContribution = (\n panel: RegisteredPanelInput,\n menu: WorkbenchPanelMenuDefinition,\n kind: WorkbenchPanelKind,\n): WidgetContribution => {\n const { side, ...contribution } = menu;\n const region = panel.region as WorkbenchPanelRegion;\n const fallbackRegion = workbenchPanelRegions.find((candidate) => candidate === panel.fallbackRegion);\n return {\n ...contribution,\n region: workbenchPanelMenuRegions[region][side],\n fallbackRegion: fallbackRegion ? workbenchPanelMenuRegions[fallbackRegion][side] : undefined,\n panelMenuOwner: {\n level: kind === \"sub-panel\" ? \"sub-panel\" : \"panel\",\n contributionId: panel.id,\n },\n };\n};\n\nexport const registerPanelContribution = (input: RegisterPanelContributionInput) => {\n const { kind, metadata, panel, registerWidget } = input;\n const { panelMenus = [], ...panelContribution } = panel;\n const registrations: Disposable[] = [];\n\n if (panelMenus.length > 0 && !workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion)) {\n throw new Error(`Panel Menus require a Panel region: ${panel.id}`);\n }\n\n try {\n const registeredPanel: WidgetContribution & { ownedPanelMenuIds: readonly string[] } = {\n ...panelContribution,\n ownedPanelMenuIds: panelMenus.map((menu) => menu.id),\n };\n registrations.push(registerWidget(registeredPanel, metadata));\n for (const menu of panelMenus) {\n registrations.push(registerWidget(panelMenuContribution(panel, menu, kind), metadata));\n }\n } catch (error) {\n for (const registration of registrations.reverse()) registration.dispose();\n throw error;\n }\n\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n};\n\nexport const createPanelRegistrations = (input: CreatePanelRegistrationsInput) => {\n const registerPanel = (panel: WorkbenchPanelContribution, metadata?: ContributionMetadata) => {\n return registerPanelContribution({\n panel,\n kind: panel.eligibleLocations ? \"sub-panel\" : \"panel\",\n metadata,\n registerWidget: input.registerWidget,\n });\n };\n\n const registerPanelMenu = (panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata) =>\n input.registerWidget({ ...panelMenu, panelMenuOwner: panelMenu.panelMenuOwner ?? { level: \"panel\" } }, metadata);\n\n return { registerPanel, registerPanelMenu };\n};\n","import { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n createContributionLists,\n createContributionRegistrations,\n createRegionQueries,\n} from \"./layout-contribution-helpers\";\nimport type { CreateLayoutModelInput, LayoutModel } from \"./layout-model-types\";\nimport {\n activateInLayout,\n closeWidgetInLayout,\n findPlacementByWidgetId,\n getActiveLocationPlacement,\n removePlacementsForContribution,\n selectRegionActiveWidget,\n setLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport { createLayoutPlacementMethods } from \"./layout-placement-methods\";\nimport { resolveScopedLayout } from \"./layout-scope\";\nimport { createLayoutScopeMethods } from \"./layout-scope-methods\";\nimport {\n mergeWithDefaultRegions,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelInstance,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchRegionState,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { createWidgetOpeners } from \"./layout-widget-openers\";\nimport { createPanelLayoutMethods } from \"./panel-layout-methods\";\nimport { createOwnedMenuMethods } from \"./panel-menu-ownership\";\nimport { createPanelRegistrations } from \"./panel-registration\";\n\nexport type {\n CreateLayoutModelInput,\n LayoutModel,\n LayoutPersistenceAdapter,\n LayoutScope,\n} from \"./layout-model-types\";\nexport type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WidgetMountStrategy,\n WidgetReusePolicy,\n WorkbenchCommandTarget,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchLocationEligibility,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelMenuOwner,\n WorkbenchPanelMenuRegion,\n WorkbenchPanelMenuSide,\n WorkbenchPanelMountStrategy,\n WorkbenchPanelOpenStrategy,\n WorkbenchPanelRegion,\n WorkbenchPanelReusePolicy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n WorkbenchRegionSize,\n WorkbenchRegionState,\n WorkbenchTabAction,\n WorkbenchTabMenuGroup,\n WorkbenchTabMenuRow,\n WorkbenchTabPosition,\n WorkbenchTabRetention,\n WorkbenchTabSnapshot,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n WorkbenchWidgetTab,\n} from \"./layout-types\";\nexport {\n createDefaultWorkbenchLayout,\n getWorkbenchPanelForMenuRegion,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n workbenchRegions,\n} from \"./layout-types\";\n\ninterface LocationAwareLayoutModel extends LayoutModel {\n establishLocation(instanceId: string): WorkbenchPanelInstance;\n}\n\ninterface CreateLocationEstablisherInput {\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n getLayout(): WorkbenchLayout;\n getWidget(id: string): RegisteredWidgetContribution | undefined;\n panelMethods: Pick<LayoutModel, \"activatePanel\" | \"getActivePanel\">;\n}\n\nconst createLocationEstablisher = (input: CreateLocationEstablisherInput) => (instanceId: string) => {\n const layout = input.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n // Sub Panels and Panel Menus stay tabs beside their Location: promoting one would\n // create a second Location and clone every Sub Panel per Location.\n if (found.regionId !== \"main\" || found.placement.role === \"sub-panel\" || found.placement.role === \"panel-menu\") {\n return input.panelMethods.activatePanel(instanceId);\n }\n\n const placement = { ...found.placement, role: \"location\" as const };\n const ownedPanelMenuIds = new Set(input.getWidget(placement.contributionId)?.ownedPanelMenuIds ?? []);\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((candidate) => {\n if (candidate.widgetId === instanceId) return placement;\n if (!ownedPanelMenuIds.has(candidate.contributionId)) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, ownerResourceKey: placement.resourceKey };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n input.applyAndActivate(\n {\n ...layout,\n regions,\n },\n \"main\",\n placement,\n );\n return input.panelMethods.getActivePanel(\"main\")!;\n};\n\nconst requireRegisteredWidget = (\n widgets: WorkbenchLayoutStoreState[\"widgets\"],\n id: string,\n): RegisteredWidgetContribution => {\n const widget = widgets[id];\n if (!widget) throw new Error(`Widget not registered: ${id}`);\n return widget;\n};\n\nexport const createLayoutModel = (input: CreateLayoutModelInput = {}): LocationAwareLayoutModel => {\n const persisted = input.persistence?.getLayout(undefined);\n const initialLayout = resolveScopedLayout(input.defaultRegionVisibility, persisted);\n\n const store = createWorkbenchStore<WorkbenchLayoutStoreState>({\n name: \"workbench.layout\",\n initialState: { layout: initialLayout, widgets: {}, placeholders: {} },\n });\n\n const getLayout = () => store.getState().layout;\n const getPlaceholders = () => store.getState().placeholders;\n const getWidgets = () => store.getState().widgets;\n const getPlaceholder = (regionId: WorkbenchRegion) => getPlaceholders()[regionId];\n const regionQueries = createRegionQueries({\n getLayout,\n getWidgets,\n getPlaceholder,\n getRegionSettings: input.getRegionSettings,\n });\n const contributionLists = createContributionLists({ getPlaceholders, getWidgets });\n\n const scopeMethods = createLayoutScopeMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n persistence: input.persistence,\n setLayout: (layout, action) => store.setState({ ...store.getState(), layout }, false, action),\n });\n const persistLayout = () => scopeMethods.persistLayout();\n\n const requireWidget = (id: string) => requireRegisteredWidget(getWidgets(), id);\n\n const setLayout = (layout: WorkbenchLayout) => {\n const snapshot = store.getState();\n if (snapshot.layout === layout) return;\n store.setState({ ...snapshot, layout }, false, \"setLayout\");\n };\n\n const updateRegion = (regionId: WorkbenchRegion, update: (region: WorkbenchRegionState) => WorkbenchRegionState) => {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const nextRegion = update(region);\n if (nextRegion === region) return;\n setLayout({ ...layout, regions: { ...layout.regions, [regionId]: nextRegion } });\n persistLayout();\n };\n\n const applyAndActivate = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ) => {\n setLayout(activateInLayout(layout, regionId, placement));\n persistLayout();\n return placement;\n };\n\n const contributionRegistrations = createContributionRegistrations({\n store,\n getPlaceholders,\n getWidgets,\n persistLayout,\n });\n const panelRegistrations = createPanelRegistrations({\n registerWidget: contributionRegistrations.registerWidget,\n });\n const widgetOpeners = createWidgetOpeners({ getLayout, requireWidget, applyAndActivate });\n const placementMethods = createLayoutPlacementMethods({\n getLayout,\n requireWidget,\n setLayout,\n persistLayout,\n applyAndActivate,\n });\n const panelMethods = createPanelLayoutMethods({\n getLayout,\n getWidgets,\n listWidgets: contributionLists.listWidgets,\n persistLayout,\n placementMethods,\n setLayout,\n widgetOpeners,\n });\n const ownedMenus = createOwnedMenuMethods({\n getLayout,\n getWidget: (id) => getWidgets()[id],\n openWidget: widgetOpeners.openWidget,\n persistLayout,\n setLayout,\n });\n\n const establishLocation = createLocationEstablisher({\n applyAndActivate,\n getLayout,\n getWidget: requireWidget,\n panelMethods,\n });\n\n return {\n store,\n\n registerPlaceholder: contributionRegistrations.registerPlaceholder,\n\n registerWidget: contributionRegistrations.registerWidget,\n\n ...panelRegistrations,\n\n unregisterWidget(id, options = {}) {\n const current = store.getState();\n if (!current.widgets[id]) return;\n const { [id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout =\n options.removePlacements === false ? current.layout : removePlacementsForContribution(current.layout, id);\n store.setState({ ...current, widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n if (options.persist !== false) persistLayout();\n },\n\n getWidget(id) {\n return getWidgets()[id];\n },\n\n getPlaceholder,\n\n getRegionSize: regionQueries.getRegionSize,\n getRegionSettings: (regionId) => input.getRegionSettings?.(regionId),\n getRegionCollapsible: regionQueries.getRegionCollapsible,\n getRegionHeaderBorderBottom: regionQueries.getRegionHeaderBorderBottom,\n\n setRegionVisible(regionId, visible) {\n updateRegion(regionId, (region) => (region.visible === visible ? region : { ...region, visible }));\n },\n\n setRegionSize(regionId, size) {\n updateRegion(regionId, (region) => (region.size === size ? region : { ...region, size }));\n },\n\n listPlaceholders: contributionLists.listPlaceholders,\n listWidgets: contributionLists.listWidgets,\n ...panelMethods,\n openWidget: ownedMenus.openWidget,\n\n ...placementMethods,\n\n establishLocation,\n\n reconcilePanelMenus: ownedMenus.reconcilePanelMenus,\n\n setRegionActiveWidget(regionId, widgetId) {\n const nextLayout = selectRegionActiveWidget(getLayout(), regionId, widgetId);\n if (!nextLayout) return;\n setLayout(nextLayout);\n persistLayout();\n },\n\n closeWidget(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) throw new Error(`Widget placement not found: ${widgetId}`);\n if (result.closedPlacement.closable !== true) throw new Error(`Widget cannot be closed: ${widgetId}`);\n\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n removeWidgetPlacement(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) return undefined;\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n clearRegion(regionId) {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const activeWidgetId = region.activeWidgetId;\n\n const cleared: WorkbenchLayout = {\n ...layout,\n regions: { ...layout.regions, [regionId]: { ...region, widgets: [], activeWidgetId: undefined } },\n };\n let next =\n activeWidgetId && layout.activeWidgetId === activeWidgetId\n ? { ...cleared, activeWidgetId: undefined, activeResourceKey: undefined }\n : cleared;\n\n if (regionId !== \"side\" && workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) {\n next = setLocationSubPanelSelection(\n next,\n getActiveLocationPlacement(next),\n regionId as WorkbenchPanelRegion,\n undefined,\n );\n }\n\n setLayout(next);\n persistLayout();\n },\n\n resetRegions() {\n const layout = getLayout();\n const nextRegions = {} as WorkbenchLayout[\"regions\"];\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n nextRegions[id] = { ...region, widgets: [], activeWidgetId: undefined };\n }\n setLayout({\n regions: nextRegions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n activeResourceKey: undefined,\n });\n persistLayout();\n },\n\n getLayout,\n\n restoreLayout(layout) {\n setLayout(mergeWithDefaultRegions(layout, input.defaultRegionVisibility));\n persistLayout();\n },\n\n setPersistenceScope: scopeMethods.setPersistenceScope,\n getPersistenceScope: scopeMethods.getPersistenceScope,\n hasPersistedLayout: scopeMethods.hasPersistedLayout,\n enteredWithPersistedLayout: scopeMethods.enteredWithPersistedLayout,\n onWillChangePersistenceScope: scopeMethods.onWillChangePersistenceScope,\n onDidChangePersistenceScope: scopeMethods.onDidChangePersistenceScope,\n };\n};\n","import type { WorkbenchModeRegistry } from \"./mode-registry\";\n\ninterface WorkbenchModeRegistryInternals {\n activatePageMode(modeId: string | undefined, applyLayout: () => void): void;\n}\n\nconst modeRegistryInternals = new WeakMap<WorkbenchModeRegistry, WorkbenchModeRegistryInternals>();\n\nexport const setWorkbenchModeRegistryInternals = (\n registry: WorkbenchModeRegistry,\n internals: WorkbenchModeRegistryInternals,\n) => {\n modeRegistryInternals.set(registry, internals);\n};\n\nexport const activateWorkbenchPageMode = (\n registry: WorkbenchModeRegistry,\n modeId: string | undefined,\n applyLayout: () => void,\n) => {\n const internals = modeRegistryInternals.get(registry);\n if (!internals) throw new Error(\"Workbench mode registry internals are unavailable\");\n internals.activatePageMode(modeId, applyLayout);\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { WorkbenchCoreContributionContext } from \"../../workbench-core\";\nimport type {\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n} from \"../layout/layout-model\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport {\n applyModePanelAvailability,\n disposeReverse,\n panelsForMode,\n restoreModeLayout,\n restoreUnscopedModeLayout,\n} from \"./mode-layout\";\nimport { setWorkbenchModeRegistryInternals } from \"./mode-registry-internals\";\n\nexport { getWorkbenchModePanelForRegion, isWorkbenchModePanelAvailable } from \"./mode-layout\";\n\nexport type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;\n\nexport type WorkbenchModeActivationResult = Disposable | readonly Disposable[] | undefined;\n\nexport interface WorkbenchModeAddablePanel {\n panelId: string;\n region: WorkbenchPanelRegion;\n allowedRegions?: readonly WorkbenchRegion[];\n pinned?: boolean;\n}\n\nexport interface WorkbenchModeAddablePanelContext {\n layout: WorkbenchLayout;\n resource?: ResourceRef;\n}\n\nexport interface WorkbenchModeContribution {\n id: string;\n label?: string;\n defaultTheme?: string;\n floatingPanels?: \"visible\" | \"hidden\";\n chrome?: Partial<Record<\"nav\" | \"sidenav\" | \"activity\" | \"status\", string | false>>;\n panels?: readonly WorkbenchPanelRegion[];\n /** Region-level layout policy while this mode is active. */\n regionSettings?: Partial<Record<WorkbenchRegion, WorkbenchRegionSettings>>;\n // Resource kinds this mode accepts. The atomic navigator validates targets\n // against this list; a mode without kinds navigates with a cleared resource.\n resourceKinds?: readonly string[];\n // Fallback resource when the mode is entered without a compatible resource.\n defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);\n // Returns optional composition panels that are closed in the current context.\n listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];\n // Registers the mode's contributions once for the lifetime of the mode.\n activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n // Seeds default placements only when the persistence scope has no layout yet.\n seed?(ctx: WorkbenchModeActivationContext): void;\n // Activates non-layout behavior while the mode is current.\n enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n // Repairs required layout structure whenever the mode-scope context activates:\n // first activation, reselecting the active mode, and persistence-scope changes.\n // Reconciliation must not reset valid optional user state.\n reconcile?(ctx: WorkbenchModeActivationContext): void;\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\nexport interface CreateWorkbenchModeRegistryInput {\n establishLocation?(instanceId: string): void;\n layout: Pick<WorkbenchCoreContributionContext[\"layout\"], \"onDidChangePersistenceScope\">;\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(\n runWorkbenchEffect(`mode ${mode.id}.activate`, () => mode.activate(input.resolveContext())),\n );\n initializedModes.set(mode.id, disposables);\n };\n\n const seedScope = (mode: WorkbenchModeContribution, context: WorkbenchModeActivationContext) => {\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 runWorkbenchEffect(`mode ${mode.id}.seed`, () => mode.seed?.(context));\n establishSeededLocation();\n } finally {\n unsubscribeMainPanel();\n }\n };\n\n // Applies panel availability and seeds default placements only when the scope is\n // new: no persisted layout and not seeded earlier in this session.\n const prepareScope = (mode: WorkbenchModeContribution) => {\n const context = input.resolveContext();\n const scopeKey = `${mode.id}\\0${context.layout.getPersistenceScope() ?? \"unscoped\"}`;\n const availableLayout = applyModePanelAvailability(context.layout.getLayout(), panelsForMode(mode));\n restoreModeLayout(context, availableLayout);\n context.layout.reconcilePanelMenus();\n if (!seededScopes.has(scopeKey) && !context.layout.enteredWithPersistedLayout()) {\n seedScope(mode, context);\n }\n seededScopes.add(scopeKey);\n };\n\n // One reconciliation pass for every context activation: first activation,\n // reselecting the active mode, and persistence-scope changes. Repair of required\n // structure belongs to mode.reconcile and runs every time, so a user can recover\n // required placements by reselecting the active mode. Reconciliation must not\n // rerun activate or enter.\n const reconcileScope = (mode: WorkbenchModeContribution) => {\n prepareScope(mode);\n runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n };\n\n // Switching modes stashes the outgoing unscoped layout, disposes the active mode,\n // and restores the incoming mode's unscoped layout before activating it. Scoped\n // layouts are owned by the persistence scope instead.\n const transitionToMode = (id: string | undefined) => {\n const context = input.resolveContext();\n const previousModeId = store.getState().activeModeId;\n const unscoped = context.layout.getPersistenceScope() === undefined;\n if (previousModeId && unscoped) 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\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n if (unscoped) {\n restoreModeLayout(\n context,\n restoreUnscopedModeLayout(context.layout.getLayout(), unscopedLayouts.get(id), panelsForMode(mode)),\n );\n }\n activate(id, { seed: deferredSeedModeId !== id });\n };\n\n const activatePageMode = (id: string | undefined, applyLayout: () => void) => {\n if (id && !store.getState().modes[id]) throw new Error(`Workbench mode not registered: ${id}`);\n if (id === store.getState().activeModeId) {\n applyLayout();\n return;\n }\n // Publish the page's mode before its layout. Layout listeners may open panels\n // owned by that mode as soon as the new primary resource appears.\n transitioning = true;\n deferredSeedModeId = undefined;\n try {\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivatePageMode\");\n applyLayout();\n return;\n }\n activate(id, { seed: false, afterPublish: applyLayout });\n } finally {\n transitioning = false;\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; afterPublish?: () => void }) => {\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 options.afterPublish?.();\n if (options.seed) prepareScope(mode);\n activeDisposables = toDisposables(runWorkbenchEffect(`mode ${mode.id}.enter`, () => mode.enter?.(context)));\n if (options.seed) runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n } catch (error) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n throw error;\n }\n };\n\n const scopeSubscription = input.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) reconcileScope(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 const registry: WorkbenchModeRegistry = {\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 // A deferred seed is the second half of one transition: the caller rotates the\n // layout persistence scope between the two halves. Observers must not treat the\n // gap as a settled context, so the transition is not over until the seed runs.\n isTransitioning() {\n return transitioning || deferredSeedModeId !== undefined;\n },\n\n setActiveMode(id, setActiveInput = {}) {\n if (id === store.getState().activeModeId) {\n // Reselecting the active mode reconciles its layout without disposing or\n // rerunning enter, so a missing required placement can recover.\n const mode = id ? store.getState().modes[id] : undefined;\n if (mode && id !== deferredSeedModeId) reconcileScope(mode);\n return;\n }\n transitioning = true;\n deferredSeedModeId = setActiveInput.deferSeed ? id : undefined;\n try {\n transitionToMode(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 transitioning = true;\n try {\n if (mode) reconcileScope(mode);\n } finally {\n deferredSeedModeId = undefined;\n transitioning = false;\n }\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 setWorkbenchModeRegistryInternals(registry, { activatePageMode });\n return registry;\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"../../registries/layout/layout-model\";\nimport { getActiveLocationPlacement } from \"../../registries/layout/layout-operations\";\nimport { isWorkbenchPanelPlacementVisible } from \"../../registries/layout/panel-widget-eligibility\";\nimport {\n isWorkbenchModePanelAvailable,\n type WorkbenchModeAddablePanel,\n type WorkbenchModeContribution,\n} from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nexport interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {\n contribution: RegisteredWidgetContribution;\n open?(resource?: ResourceRef): void;\n}\nexport interface WorkbenchCompositionRegionPanels {\n open: readonly WorkbenchWidgetPlacement[];\n addable: readonly WorkbenchCompositionAddablePanel[];\n closable: readonly string[];\n}\nexport interface WorkbenchCompositionController {\n panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;\n}\ninterface CreateWorkbenchCompositionControllerInput {\n getActiveMode(): WorkbenchModeContribution | undefined;\n getLayout(): WorkbenchLayout;\n getResource(): ResourceRef | undefined;\n listWidgets(): RegisteredWidgetContribution[];\n listOwnedAddablePanels?(input: {\n layout: WorkbenchLayout;\n mode: WorkbenchModeContribution | undefined;\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n }): readonly WorkbenchCompositionAddablePanel[];\n}\nconst isOpenSingleton = (\n widget: RegisteredWidgetContribution,\n placements: readonly WorkbenchWidgetPlacement[],\n resource: ResourceRef | undefined,\n) => {\n if (!widget.singleton) return false;\n return placements.some((placement) => {\n if (placement.contributionId !== widget.id) return false;\n const scopedResourceKey = placement.role === \"location\" ? placement.resourceKey : placement.ownerResourceKey;\n return !scopedResourceKey || scopedResourceKey === resourceKey(resource);\n });\n};\nconst addModePanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n layout: WorkbenchLayout;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const panel of input.mode?.listAddablePanels?.({ layout: input.layout, resource: input.resource }) ?? []) {\n if (panel.region !== input.region) continue;\n const contribution = input.widgets.find((widget) => widget.id === panel.panelId);\n if (!contribution || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n input.addable.set(panel.panelId, { ...panel, contribution });\n }\n};\nconst addRegisteredPanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n modeId: string | undefined;\n location: WorkbenchWidgetPlacement | undefined;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const contribution of input.widgets) {\n if (!contribution.eligibleLocations) continue;\n if (contribution.region !== input.region && contribution.fallbackRegion !== input.region) continue;\n if (input.addable.has(contribution.id) || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n if (\n !isWorkbenchPanelPlacementVisible(contribution, input.resource, input.modeId, undefined, {\n location: input.location,\n })\n )\n continue;\n input.addable.set(contribution.id, { panelId: contribution.id, region: input.region, contribution });\n }\n};\nexport const createWorkbenchCompositionController = (\n input: CreateWorkbenchCompositionControllerInput,\n): WorkbenchCompositionController => ({\n panelsFor(region) {\n const layout = input.getLayout();\n const open = layout.regions[region]?.widgets ?? [];\n const resource = input.getResource();\n const location = getActiveLocationPlacement(layout);\n const mode = input.getActiveMode();\n if (!isWorkbenchModePanelAvailable(mode, region)) return { open, addable: [], closable: [] };\n const placements = Object.values(layout.regions).flatMap((candidate) => candidate.widgets);\n const widgets = input.listWidgets();\n const addable = new Map<string, WorkbenchCompositionAddablePanel>();\n for (const panel of input.listOwnedAddablePanels?.({ layout, mode, region, resource }) ?? []) {\n addable.set(panel.panelId, panel);\n }\n addModePanels({ addable, layout, mode, placements, region, resource, widgets });\n addRegisteredPanels({ addable, location, modeId: mode?.id, placements, region, resource, widgets });\n return {\n open,\n addable: [...addable.values()],\n closable: open.filter((placement) => placement.closable === true).map((placement) => placement.contributionId),\n };\n },\n});\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport const workbenchFocusRegions = [\"activity\", \"sidenav\", \"main\", \"secondary\", \"side\", \"status\"] as const;\n\nexport type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];\n\nexport type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;\n\nexport interface WorkbenchFocusState {\n activeRegion: WorkbenchFocusRegionId | undefined;\n}\n\nexport interface WorkbenchFocusController {\n store: WorkbenchStore<WorkbenchFocusState>;\n setActiveRegion(region: WorkbenchFocusRegionId): void;\n clearFocus(): void;\n getActiveRegion(): WorkbenchFocusRegionId | undefined;\n onDidChange(listener: WorkbenchFocusChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchFocusControllerInput {\n context: ContextKeyService;\n isRegionFocusable?: (region: WorkbenchFocusRegionId) => boolean;\n}\n\nconst focusContextByRegion = {\n activity: \"activityFocus\",\n sidenav: \"sidenavFocus\",\n main: \"mainFocus\",\n secondary: \"secondaryFocus\",\n side: \"sideFocus\",\n status: \"statusFocus\",\n} as const satisfies Record<WorkbenchFocusRegionId, string>;\n\nexport const createWorkbenchFocusController = (\n input: CreateWorkbenchFocusControllerInput,\n): WorkbenchFocusController => {\n const store = createWorkbenchStore<WorkbenchFocusState>({\n name: \"workbench.focus\",\n initialState: { activeRegion: undefined },\n });\n const context = input.context.createScope(\"workbench.focus\");\n\n const applyContext = (region: WorkbenchFocusRegionId | undefined) => {\n context.set(\"workbenchFocus\", region !== undefined);\n context.set(\"activeWorkbenchFocusRegion\", region);\n for (const focusRegion of workbenchFocusRegions) {\n context.set(focusContextByRegion[focusRegion], focusRegion === region);\n }\n };\n\n applyContext(undefined);\n\n return {\n store,\n\n setActiveRegion(region) {\n if (input.isRegionFocusable?.(region) === false) return;\n if (store.getState().activeRegion === region) return;\n store.setState({ activeRegion: region }, false, \"setActiveWorkbenchFocusRegion\");\n applyContext(region);\n },\n\n clearFocus() {\n if (store.getState().activeRegion === undefined) return;\n store.setState({ activeRegion: undefined }, false, \"clearWorkbenchFocusRegion\");\n applyContext(undefined);\n },\n\n getActiveRegion() {\n return store.getState().activeRegion;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeRegion,\n (region) => listener(region),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { PageLocation, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { createPagePreparation } from \"./page-preparation\";\nimport type {\n WorkbenchPageOpenInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nexport interface WorkbenchPageLocationCommitInput extends WorkbenchPageOpenInput {\n projectId: string;\n location: PageLocation;\n action: string;\n pageStates?: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n}\n\nexport type WorkbenchPageCloseResolution =\n | {\n kind: \"stay\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n target: WorkbenchPageOpenInput;\n locationChanged: boolean;\n }\n | {\n kind: \"parent\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n parentId: string;\n };\n\nexport interface WorkbenchPageRegistryInternals<Value> {\n resources: WorkbenchPageResourceCodec;\n prepare: ReturnType<typeof createPagePreparation<Value>>;\n publish(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n onDidCommit(listener: () => void): Disposable;\n getPublishingState(): WorkbenchPageRegistryStoreState<Value>;\n connectRuntime(apply: (state: WorkbenchPageRegistryStoreState<Value>) => void): Disposable;\n activateLocation(input: WorkbenchPageLocationCommitInput): void;\n refreshModePlacements(): void;\n refreshShellPlacements(): void;\n clearProject(projectId: string | undefined): void;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nconst registryInternals = new WeakMap<object, WorkbenchPageRegistryInternals<unknown>>();\n\nexport const setWorkbenchPageRegistryInternals = <Value>(\n registry: WorkbenchPageRegistry<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n) => {\n registryInternals.set(registry, internals as WorkbenchPageRegistryInternals<unknown>);\n};\n\nexport const getWorkbenchPageRegistryInternals = <Value>(registry: WorkbenchPageRegistry<Value>) => {\n const internals = registryInternals.get(registry) as WorkbenchPageRegistryInternals<Value> | undefined;\n if (!internals) throw new Error(\"Workbench page registry internals are unavailable\");\n return internals;\n};\n","import type { FileRendererSectionTarget, PageLocation, PageRef, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\n\nconst hostExtensionId = \"pstdio\";\n\nconst pageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:page:${ref.id}`;\n\nconst pageForRef = (pages: readonly WorkbenchPageContribution[], ref: PageRef) =>\n pages.find((page) => pageRefKey(page.ref) === pageRefKey(ref));\n\nconst encodePath = (path: string) =>\n path\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => encodeURIComponent(segment))\n .join(\"/\");\n\nconst routePath = (projectId: string, page: WorkbenchPageContribution) => {\n const project = `/projects/${encodeURIComponent(projectId)}`;\n const path = encodePath(page.path);\n if (page.ref.extensionId === hostExtensionId) return path ? `${project}/${path}` : project;\n if (!page.ref.extensionId) throw new Error(`Page \"${page.id}\" has no extension id`);\n return `${project}/extensions/${encodeURIComponent(page.ref.extensionId)}/${path}`;\n};\n\nconst normalizedSection = (value: unknown): FileRendererSectionTarget | undefined => {\n if (!value || typeof value !== \"object\" || !Array.isArray((value as { anchors?: unknown }).anchors)) return undefined;\n const anchors = (value as { anchors: unknown[] }).anchors;\n if (\n anchors.some(\n (anchor) =>\n !anchor ||\n typeof anchor !== \"object\" ||\n typeof (anchor as { id?: unknown }).id !== \"string\" ||\n typeof (anchor as { heading?: unknown }).heading !== \"string\" ||\n ((anchor as { occurrence?: unknown }).occurrence !== undefined &&\n (!Number.isInteger((anchor as { occurrence?: unknown }).occurrence) ||\n Number((anchor as { occurrence?: unknown }).occurrence) < 0)),\n )\n ) {\n return undefined;\n }\n return {\n anchors: anchors.map((anchor) => {\n const value = anchor as { id: string; heading: string; occurrence?: number };\n return {\n id: value.id,\n heading: value.heading,\n ...(value.occurrence !== undefined ? { occurrence: value.occurrence } : {}),\n };\n }),\n };\n};\n\nconst serializeSection = (section: FileRendererSectionTarget) => {\n const normalized = normalizedSection(section);\n if (!normalized) throw new Error(\"Page location has an invalid section\");\n return JSON.stringify(normalized);\n};\n\nconst parseSection = (value: string) => {\n try {\n return normalizedSection(JSON.parse(value));\n } catch {\n return undefined;\n }\n};\n\nexport const serializeWorkbenchPageUrl = (input: {\n projectId: string;\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n}) => {\n const page = pageForRef(input.pages, input.location.page);\n if (!page) throw new Error(`Unknown page ref: ${pageRefKey(input.location.page)}`);\n const query = new URLSearchParams();\n if (input.location.resource) {\n query.set(\"resource\", input.resources.toUri(input.resources.normalize(input.location.resource)));\n }\n if (input.location.section) query.set(\"section\", serializeSection(input.location.section));\n const encoded = query.toString();\n const path = routePath(input.projectId, page);\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst decodedSegments = (pathname: string) => {\n try {\n return pathname\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n } catch {\n return undefined;\n }\n};\n\nexport const isWorkbenchProjectUrl = (urlValue: string, projectId: string) => {\n try {\n const url = new URL(urlValue, \"http://workbench.local\");\n const segments = decodedSegments(url.pathname);\n return Boolean(segments && segments[0] === \"projects\" && segments[1] === projectId);\n } catch {\n return false;\n }\n};\n\nconst pageForRoute = (pages: readonly WorkbenchPageContribution[], extensionId: string, path: string) =>\n pages.find((page) => page.ref.extensionId === extensionId && page.path === path);\n\nconst parseResource = (uri: string, resources: WorkbenchPageResourceCodec): ResourceRef | undefined => {\n try {\n const resource = resources.fromUri(uri);\n return resource ? resources.normalize(resource) : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport interface ParsedWorkbenchPageUrl {\n pageId: string;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n}\n\nexport const parseWorkbenchPageUrl = (input: {\n url: string;\n projectId: string;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n}): ParsedWorkbenchPageUrl | undefined => {\n let url: URL;\n try {\n url = new URL(input.url, \"http://workbench.local\");\n } catch {\n return undefined;\n }\n const segments = decodedSegments(url.pathname);\n if (!segments || segments[0] !== \"projects\" || segments[1] !== input.projectId) return undefined;\n const route = segments.slice(2);\n const extensionRoute = route[0] === \"extensions\";\n const extensionId = extensionRoute ? route[1] : hostExtensionId;\n const path = (extensionRoute ? route.slice(2) : route).join(\"/\");\n if (!extensionId || (extensionRoute && !path)) return undefined;\n const page = pageForRoute(input.pages, extensionId, path);\n if (!page) return undefined;\n\n const resourceValue = url.searchParams.get(\"resource\");\n const resource = resourceValue ? parseResource(resourceValue, input.resources) : undefined;\n if (resourceValue && !resource) return undefined;\n const sectionValue = url.searchParams.get(\"section\");\n const section = sectionValue ? parseSection(sectionValue) : undefined;\n if (sectionValue && !section) return undefined;\n return {\n pageId: page.id,\n ...(resource ? { resource } : {}),\n ...(section ? { section } : {}),\n };\n};\n","import type { NavigationTargetPage, PageLocation, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { isWorkbenchProjectUrl } from \"./page-location-codec\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationControllerActionsInput<Value> {\n input: CreateWorkbenchPageLocationControllerInput<Value>;\n historyStore: WorkbenchStore<WorkbenchPageLocationHistoryState>;\n clearProject(projectId: string | undefined): void;\n resetHistory(): void;\n restore(projectId: string, source: \"boot\" | \"project-switch\", useCurrentUrl: boolean): WorkbenchPageNavigationResult;\n resolveUrl(projectId: string, entry: WorkbenchPageBrowserEntry): ResolvedPageLocation | undefined;\n normalizeTarget(target: NavigationTargetPage): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n locationsEqual(left: PageLocation | undefined, right: PageLocation | undefined): boolean;\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown): WorkbenchPageNavigationResult;\n closePlacement(identity: PlacementIdentity): WorkbenchPageNavigationResult;\n canGoBack(): boolean;\n canGoForward(): boolean;\n dispose(): void;\n}\n\nconst hasResolvableCurrentPageUrl = <Value>(actions: PageLocationControllerActionsInput<Value>, projectId: string) => {\n try {\n return Boolean(actions.resolveUrl(projectId, actions.input.browser.current()));\n } catch {\n return false;\n }\n};\n\nexport const createPageLocationControllerActions = <Value>(\n actions: PageLocationControllerActionsInput<Value>,\n): WorkbenchPageLocationController => {\n const { input } = actions;\n return {\n historyStore: actions.historyStore,\n setProject(projectId) {\n if (input.registry.store.getState().projectId === projectId) return;\n actions.clearProject(projectId);\n actions.resetHistory();\n },\n clearProject() {\n actions.clearProject(undefined);\n actions.resetHistory();\n },\n isCurrentProjectUrl: (projectId) => isWorkbenchProjectUrl(input.browser.current().url, projectId),\n hasCurrentPageUrl: (projectId) => hasResolvableCurrentPageUrl(actions, projectId),\n boot: (projectId) => actions.restore(projectId, \"boot\", true),\n switchProject(projectId) {\n actions.clearProject(projectId);\n return actions.restore(projectId, \"project-switch\", false);\n },\n navigate(target) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"navigation\", new Error(\"Cannot navigate before a project is active\"));\n try {\n const resolved = actions.normalizeTarget(target);\n const history = actions.locationsEqual(input.registry.store.getState().location, resolved.location)\n ? \"none\"\n : \"push\";\n return actions.commit(projectId, resolved, history, \"navigatePageLocation\");\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n replay(location) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"history\", new Error(\"Cannot replay a page before a project is active\"));\n try {\n return actions.commit(projectId, actions.normalizeStored(location), \"replace\", \"replayWorkbenchPageHistory\");\n } catch (error) {\n return actions.fail(\"history\", error);\n }\n },\n navigateToParent() {\n const current = input.registry.store.getState();\n if (!current.projectId || !current.location?.parent) {\n return actions.fail(\"navigation\", new Error(\"The active page does not have a parent location\"));\n }\n try {\n return actions.commit(\n current.projectId,\n actions.normalizeStored(current.location.parent),\n \"replace\",\n \"navigateToParentPageLocation\",\n );\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n closePlacement: actions.closePlacement,\n goBack() {\n if (actions.canGoBack()) input.browser.back();\n },\n goForward() {\n if (actions.canGoForward()) input.browser.forward();\n },\n dispose: actions.dispose,\n };\n};\n","import type {\n FileRendererSectionTarget,\n NavigationTargetPage,\n PageLocation,\n PageRef,\n ResourceRef,\n} from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\n\nexport const workbenchPageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:page:${ref.id}`;\n\nconst pageForRef = (pages: readonly WorkbenchPageContribution[], ref: PageRef) =>\n pages.find((page) => workbenchPageRefKey(page.ref) === workbenchPageRefKey(ref));\n\nconst pageForId = (pages: readonly WorkbenchPageContribution[], pageId: string) =>\n pages.find((page) => page.id === pageId);\n\nconst canonicalSection = (section: FileRendererSectionTarget | undefined) => {\n if (!section) return undefined;\n const anchors = section.anchors.map((anchor) =>\n Object.freeze({\n id: anchor.id,\n heading: anchor.heading,\n ...(anchor.occurrence !== undefined ? { occurrence: anchor.occurrence } : {}),\n }),\n );\n return Object.freeze({ anchors: Object.freeze(anchors) }) as FileRendererSectionTarget;\n};\n\nconst cloneMetadata = (metadata: ResourceRef[\"metadata\"]) => {\n if (!metadata) return undefined;\n return JSON.parse(JSON.stringify(metadata)) as NonNullable<ResourceRef[\"metadata\"]>;\n};\n\nconst canonicalResource = (resource: ResourceRef | undefined, resources: WorkbenchPageResourceCodec) => {\n if (!resource) return undefined;\n const normalized = resources.normalize(resource);\n if (!normalized.type || !normalized.id) throw new Error(\"Page resource has no canonical type or id\");\n const canonical = {\n type: normalized.type,\n id: normalized.id,\n ...(normalized.projectId ? { projectId: normalized.projectId } : {}),\n ...(normalized.label ? { label: normalized.label } : {}),\n ...(normalized.icon ? { icon: normalized.icon } : {}),\n ...(normalized.extensionId ? { extensionId: normalized.extensionId } : {}),\n ...(normalized.metadata ? { metadata: cloneMetadata(normalized.metadata) } : {}),\n };\n return Object.freeze(canonical) as ResourceRef;\n};\n\nconst canonicalPageRef = (page: WorkbenchPageContribution) =>\n Object.freeze({ extensionId: page.ref.extensionId, kind: \"page\" as const, id: page.ref.id });\n\nconst sectionKey = (section: FileRendererSectionTarget | undefined) => (section ? JSON.stringify(section) : \"\");\n\nexport const workbenchPageLocationRouteKey = (location: PageLocation, resources: WorkbenchPageResourceCodec) =>\n [\n workbenchPageRefKey(location.page),\n location.resource ? resources.toUri(resources.normalize(location.resource)) : \"\",\n sectionKey(location.section),\n ].join(\"|\");\n\nexport const workbenchPageLocationKey = (location: PageLocation, resources: WorkbenchPageResourceCodec): string => {\n const own = workbenchPageLocationRouteKey(location, resources);\n return location.parent ? `${own}>${workbenchPageLocationKey(location.parent, resources)}` : own;\n};\n\nexport const workbenchPageLocationsEqual = (\n left: PageLocation | undefined,\n right: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) => {\n if (!left || !right) return left === right;\n return workbenchPageLocationKey(left, resources) === workbenchPageLocationKey(right, resources);\n};\n\nconst createLocation = (input: {\n page: WorkbenchPageContribution;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n parent?: PageLocation;\n resources: WorkbenchPageResourceCodec;\n}) =>\n Object.freeze({\n page: canonicalPageRef(input.page),\n ...(input.resource ? { resource: canonicalResource(input.resource, input.resources) } : {}),\n ...(input.section ? { section: canonicalSection(input.section) } : {}),\n ...(input.parent ? { parent: input.parent } : {}),\n }) as PageLocation;\n\nconst declaredParent = (input: {\n page: WorkbenchPageContribution;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n}): PageLocation | undefined => {\n if (!input.page.parentId) return undefined;\n const parent = pageForId(input.pages, input.page.parentId);\n if (!parent) throw new Error(`Unknown parent page: ${input.page.parentId}`);\n return normalizeResolvedLocation({\n page: parent,\n pages: input.pages,\n resources: input.resources,\n seen: input.seen,\n });\n};\n\nconst normalizeResolvedLocation = (input: {\n page: WorkbenchPageContribution;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n parent?: PageLocation;\n}): PageLocation => {\n const candidate = createLocation({\n page: input.page,\n resources: input.resources,\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources);\n if (input.seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${input.page.id}`);\n const seen = new Set(input.seen).add(routeKey);\n const parent =\n input.parent ?? declaredParent({ page: input.page, pages: input.pages, resources: input.resources, seen });\n return createLocation({\n page: input.page,\n resources: input.resources,\n ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(parent ? { parent } : {}),\n });\n};\n\nconst normalizePageTarget = (input: {\n target: NavigationTargetPage;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n}): { pageId: string; location: PageLocation; open?: NavigationTargetPage[\"open\"] } => {\n const page = pageForRef(input.pages, input.target.page);\n if (!page) throw new Error(`Unknown page: ${workbenchPageRefKey(input.target.page)}`);\n const candidate = createLocation({\n page,\n resources: input.resources,\n ...(input.target.resource ? { resource: input.target.resource } : {}),\n ...(input.target.section ? { section: input.target.section } : {}),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources);\n if (input.seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${page.id}`);\n const seen = new Set(input.seen).add(routeKey);\n const contextualParent = input.target.parent\n ? normalizePageTarget({ target: input.target.parent, pages: input.pages, resources: input.resources, seen })\n .location\n : undefined;\n const location = normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen: input.seen,\n ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(contextualParent ? { parent: contextualParent } : {}),\n });\n return { pageId: page.id, location, ...(input.target.open ? { open: input.target.open } : {}) };\n};\n\nexport const normalizeWorkbenchPageTarget = (input: {\n target: NavigationTargetPage;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n}) => normalizePageTarget({ ...input, seen: new Set() });\n\nexport const normalizeWorkbenchPageLocation = (input: {\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n}) => {\n const normalize = (location: PageLocation, seen: Set<string>): { pageId: string; location: PageLocation } => {\n const page = pageForRef(input.pages, location.page);\n if (!page) throw new Error(`Unknown page: ${workbenchPageRefKey(location.page)}`);\n const candidate = createLocation({\n page,\n resources: input.resources,\n ...(location.resource ? { resource: location.resource } : {}),\n ...(location.section ? { section: location.section } : {}),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources);\n if (seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${page.id}`);\n const nextSeen = new Set(seen).add(routeKey);\n const explicitParent = location.parent ? normalize(location.parent, nextSeen).location : undefined;\n return {\n pageId: page.id,\n location: normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen,\n ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(explicitParent ? { parent: explicitParent } : {}),\n }),\n };\n };\n return normalize(input.location, new Set());\n};\n\nexport const normalizeDirectWorkbenchPageLocation = (input: {\n pageId: string;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n}) => {\n const page = pageForId(input.pages, input.pageId);\n if (!page) throw new Error(`Unknown page: ${input.pageId}`);\n return {\n pageId: page.id,\n location: normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen: new Set(),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n }),\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\nimport { serializeWorkbenchPageUrl } from \"./page-location-codec\";\nimport { workbenchPageLocationRouteKey } from \"./page-location-normalization\";\nimport type { WorkbenchPageHistoryState, WorkbenchPageLocationDiagnostic } from \"./page-location-types\";\n\nexport const createPageHistoryEntry =\n (input: { pages(): WorkbenchPageContribution[]; resources: WorkbenchPageResourceCodec }) =>\n (projectId: string, location: PageLocation, index: number) => ({\n url: serializeWorkbenchPageUrl({ projectId, location, pages: input.pages(), resources: input.resources }),\n state: {\n kind: \"pstdio.page-location\",\n index,\n projectId,\n routeKey: workbenchPageLocationRouteKey(location, input.resources),\n location,\n } satisfies WorkbenchPageHistoryState,\n });\n\nexport const createPageLocationFailureHandler =\n (report?: (diagnostic: WorkbenchPageLocationDiagnostic) => void) =>\n (source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown) => {\n const diagnostic: WorkbenchPageLocationDiagnostic = {\n code: \"page-location-unresolved\",\n source,\n message: error instanceof Error ? error.message : String(error),\n };\n report?.(diagnostic);\n return { ok: false, diagnostic } as const;\n };\n","import type { NavigationTargetPage } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type {\n ResolvedPageLocation,\n WorkbenchPageLocationController,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationPreparation<Value> {\n resolve(target: NavigationTargetPage): ResolvedPageLocation;\n commit(state: WorkbenchPageRegistryStoreState<Value>, beforePublish?: () => void): WorkbenchPageNavigationResult;\n}\nconst preparations = new WeakMap<WorkbenchPageLocationController, PageLocationPreparation<unknown>>();\nexport const setPageLocationPreparation = <Value>(\n controller: WorkbenchPageLocationController,\n preparation: PageLocationPreparation<Value>,\n) => preparations.set(controller, preparation as PageLocationPreparation<unknown>);\nexport const getPageLocationPreparation = <Value>(controller: WorkbenchPageLocationController) => {\n const preparation = preparations.get(controller);\n if (!preparation) throw new Error(\"Page location preparation is unavailable\");\n return preparation as PageLocationPreparation<Value>;\n};\n","import type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type { WorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createPageHistoryEntry } from \"./page-location-history-entry\";\nimport type { CreateWorkbenchPageLocationControllerInput } from \"./page-location-types\";\n\nexport const createPageLocationPublisher = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n historyState: {\n getIndex(): number;\n commitIndex(index: number, push: boolean): void;\n entry: ReturnType<typeof createPageHistoryEntry>;\n publish(): void;\n },\n) => {\n return (\n projectId: string,\n state: WorkbenchPageRegistryStoreState<Value>,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n beforePublish?: () => void,\n ) =>\n batchWorkbenchChanges(() => {\n const location = state.location;\n if (!location) throw new Error(\"Prepared page navigation has no location\");\n const nextIndex = history === \"push\" ? historyState.getIndex() + 1 : historyState.getIndex();\n // Browser history is the commit boundary. Serialization and the browser write\n // can fail, so both precede changes to stores, placement owners, and caches.\n if (history !== \"none\") input.browser[history](historyState.entry(projectId, location, nextIndex));\n historyState.commitIndex(nextIndex, history === \"push\");\n beforePublish?.();\n internals.publish(state, action);\n runWorkbenchEffect(`page location cache for ${projectId}`, () => input.persistence.save(projectId, location));\n if (history !== \"none\") historyState.publish();\n return { ok: true, location } as const;\n });\n};\n","import type { PageLocation, PageRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageCloseResolution } from \"../../registries/pages/page-registry-internals\";\nimport type { ResolvedPageLocation, WorkbenchPageNavigationResult } from \"./page-location-types\";\n\ninterface PagePlacementCloserInput {\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: \"navigation\", error: unknown): WorkbenchPageNavigationResult;\n getCurrent(): { projectId?: string; location?: PageLocation };\n getPageRef(pageId: string): PageRef | undefined;\n normalizePage(page: PageRef): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nexport const createPagePlacementCloser = (input: PagePlacementCloserInput) => {\n const closeToParent = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"parent\" }>,\n ) => {\n const contextualParent = location.parent ? input.normalizeStored(location.parent) : undefined;\n const parent = input.getPageRef(resolution.parentId);\n if (!parent) throw new Error(`Unknown parent page: ${resolution.parentId}`);\n const resolved = contextualParent?.pageId === resolution.parentId ? contextualParent : input.normalizePage(parent);\n return input.commit(\n projectId,\n { ...resolved, pageStates: resolution.pageStates },\n \"replace\",\n \"closePagePlacementToParent\",\n );\n };\n\n const closeWithinPage = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"stay\" }>,\n ) => {\n const page = input.getPageRef(resolution.target.pageId);\n if (!page) throw new Error(`Unknown page: ${resolution.target.pageId}`);\n const resolved = input.normalizeStored({\n page,\n ...(resolution.target.resource ? { resource: resolution.target.resource } : {}),\n ...(resolution.target.section ? { section: resolution.target.section } : {}),\n ...(location.parent ? { parent: location.parent } : {}),\n });\n return input.commit(\n projectId,\n {\n ...resolved,\n pageStates: resolution.pageStates,\n ...(resolution.target.open ? { open: resolution.target.open } : {}),\n },\n resolution.locationChanged ? \"replace\" : \"none\",\n \"closePagePlacement\",\n );\n };\n\n return (identity: PlacementIdentity) => {\n const current = input.getCurrent();\n if (!current.projectId || !current.location) {\n return input.fail(\"navigation\", new Error(\"Cannot close a page placement without an active location\"));\n }\n try {\n if (identity.kind !== \"page\") throw new Error(\"Only page-owned placements can close through page navigation\");\n const resolution = input.resolveClosePlacement(identity);\n return resolution.kind === \"parent\"\n ? closeToParent(current.projectId, current.location, resolution)\n : closeWithinPage(current.projectId, current.location, resolution);\n } catch (error) {\n return input.fail(\"navigation\", error);\n }\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { createPageLocationControllerActions } from \"./page-location-actions\";\nimport { isWorkbenchProjectUrl, parseWorkbenchPageUrl } from \"./page-location-codec\";\nimport { createPageHistoryEntry, createPageLocationFailureHandler } from \"./page-location-history-entry\";\nimport {\n normalizeDirectWorkbenchPageLocation,\n normalizeWorkbenchPageLocation,\n normalizeWorkbenchPageTarget,\n workbenchPageLocationRouteKey,\n workbenchPageLocationsEqual,\n} from \"./page-location-normalization\";\nimport { setPageLocationPreparation } from \"./page-location-preparation\";\nimport { createPageLocationPublisher } from \"./page-location-publish\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationController,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\nimport { createPagePlacementCloser } from \"./page-placement-closer\";\n\nexport type {\n CreateWorkbenchPageLocationControllerInput,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageLocationPersistence,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\nconst isHistoryState = (value: unknown): value is WorkbenchPageHistoryState => {\n if (!value || typeof value !== \"object\") return false;\n const state = value as Partial<WorkbenchPageHistoryState>;\n return (\n state.kind === \"pstdio.page-location\" &&\n typeof state.index === \"number\" &&\n typeof state.projectId === \"string\" &&\n typeof state.routeKey === \"string\" &&\n Boolean(state.location && typeof state.location === \"object\")\n );\n};\n\nexport const createWorkbenchPageLocationController = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n): WorkbenchPageLocationController => {\n const internals = getWorkbenchPageRegistryInternals(input.registry);\n const pages = () => input.registry.listPages();\n let historyIndex = 0;\n let maxHistoryIndex = 0;\n const historyStore = createWorkbenchStore<WorkbenchPageLocationHistoryState>({\n name: \"workbench.page-location-history\",\n initialState: { canGoBack: false, canGoForward: false },\n });\n const publishHistory = () =>\n historyStore.setState(\n { canGoBack: historyIndex > 0, canGoForward: historyIndex < maxHistoryIndex },\n false,\n \"pageLocationHistory\",\n );\n const resetHistory = () => {\n historyIndex = 0;\n maxHistoryIndex = 0;\n publishHistory();\n };\n\n const fail = createPageLocationFailureHandler(input.reportDiagnostic);\n const historyEntry = createPageHistoryEntry({ pages, resources: internals.resources });\n\n const publish = createPageLocationPublisher(input, internals, {\n getIndex: () => historyIndex,\n commitIndex: (index, push) => {\n historyIndex = index;\n if (push) maxHistoryIndex = index;\n },\n entry: historyEntry,\n publish: publishHistory,\n });\n const commit = (\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ) => {\n const state = internals.prepare.location(\n {\n pageId: resolved.pageId,\n projectId,\n location: resolved.location,\n action,\n open: resolved.open,\n resource: resolved.location.resource,\n section: resolved.location.section,\n pageStates: resolved.pageStates,\n },\n input.registry.store.getState(),\n );\n return publish(projectId, state, history, action);\n };\n\n const normalizeStored = (location: PageLocation): ResolvedPageLocation =>\n normalizeWorkbenchPageLocation({ location, pages: pages(), resources: internals.resources });\n\n const start = (): ResolvedPageLocation =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page: input.startPage },\n pages: pages(),\n resources: internals.resources,\n });\n\n const resolveUrl = (projectId: string, entry: WorkbenchPageBrowserEntry) => {\n const parsed = parseWorkbenchPageUrl({\n url: entry.url,\n projectId,\n pages: pages(),\n resources: internals.resources,\n });\n if (!parsed) return undefined;\n const direct = normalizeDirectWorkbenchPageLocation({\n ...parsed,\n pages: pages(),\n resources: internals.resources,\n });\n if (!isHistoryState(entry.state) || entry.state.projectId !== projectId) return direct;\n const contextual = normalizeStored(entry.state.location);\n const directKey = workbenchPageLocationRouteKey(direct.location, internals.resources);\n const contextualKey = workbenchPageLocationRouteKey(contextual.location, internals.resources);\n if (entry.state.routeKey !== directKey || contextualKey !== directKey) return direct;\n return contextual;\n };\n\n const restore = (\n projectId: string,\n source: \"boot\" | \"project-switch\",\n useCurrentUrl: boolean,\n ): WorkbenchPageNavigationResult => {\n try {\n const browserEntry = input.browser.current();\n if (isHistoryState(browserEntry.state) && browserEntry.state.projectId === projectId) {\n historyIndex = browserEntry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n } else {\n historyIndex = 0;\n maxHistoryIndex = 0;\n }\n const hasProjectUrl = useCurrentUrl && isWorkbenchProjectUrl(browserEntry.url, projectId);\n const fromUrl = hasProjectUrl ? resolveUrl(projectId, browserEntry) : undefined;\n if (hasProjectUrl && !fromUrl) throw new Error(`Cannot resolve page URL: ${browserEntry.url}`);\n const saved = hasProjectUrl ? undefined : input.persistence.load(projectId);\n const resolved = fromUrl ?? (saved ? normalizeStored(saved) : start());\n return commit(projectId, resolved, \"replace\", source === \"boot\" ? \"bootPageLocation\" : \"switchPageProject\");\n } catch (error) {\n fail(source, error);\n try {\n return commit(projectId, start(), \"replace\", `${source}StartFallback`);\n } catch (fallbackError) {\n return fail(source, fallbackError);\n }\n }\n };\n\n const onPopState = (entry: WorkbenchPageBrowserEntry) => {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return;\n try {\n if (isHistoryState(entry.state) && entry.state.projectId === projectId) {\n historyIndex = entry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n publishHistory();\n }\n const resolved = resolveUrl(projectId, entry);\n if (!resolved) throw new Error(`Cannot resolve page URL: ${entry.url}`);\n commit(projectId, resolved, \"none\", \"replayPageHistory\");\n } catch (error) {\n fail(\"history\", error);\n }\n };\n const popStateSubscription = input.browser.onPopState(onPopState);\n const pageRemovalSubscription = input.registry.store.subscribe((state, previous) => {\n const removedPage = Object.keys(previous.pages).some((pageId) => !state.pages[pageId]);\n if (!removedPage || !state.projectId) return;\n try {\n if (state.location) {\n normalizeStored(state.location);\n return;\n }\n } catch (error) {\n fail(\"navigation\", error);\n }\n try {\n const active = state.activePageId ? state.pages[state.activePageId] : undefined;\n const resolved =\n active && state.location\n ? normalizeDirectWorkbenchPageLocation({\n pageId: active.id,\n pages: pages(),\n resources: internals.resources,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n })\n : start();\n commit(state.projectId, resolved, \"replace\", \"removePageLocationOwner\");\n } catch (error) {\n fail(\"navigation\", error);\n }\n });\n\n const closeActivePlacement = createPagePlacementCloser({\n commit,\n fail,\n getCurrent: () => input.registry.store.getState(),\n getPageRef: (pageId) => input.registry.getPage(pageId)?.ref,\n normalizePage: (page) =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page },\n pages: pages(),\n resources: internals.resources,\n }),\n normalizeStored,\n resolveClosePlacement: internals.resolveClosePlacement,\n });\n\n const controller = createPageLocationControllerActions({\n input,\n historyStore,\n clearProject: internals.clearProject,\n resetHistory,\n restore,\n resolveUrl,\n normalizeTarget: (target) =>\n normalizeWorkbenchPageTarget({\n target,\n pages: pages(),\n resources: internals.resources,\n }),\n normalizeStored,\n locationsEqual: (left, right) => workbenchPageLocationsEqual(left, right, internals.resources),\n commit,\n fail,\n closePlacement: closeActivePlacement,\n canGoBack: () => historyIndex > 0,\n canGoForward: () => historyIndex < maxHistoryIndex,\n dispose() {\n popStateSubscription.dispose();\n pageRemovalSubscription();\n },\n });\n setPageLocationPreparation<Value>(controller, {\n resolve: (target) => normalizeWorkbenchPageTarget({ target, pages: pages(), resources: internals.resources }),\n commit: (state, beforePublish) => {\n if (!state.projectId || !state.location) throw new Error(\"Cannot navigate before a project is active\");\n const history = workbenchPageLocationsEqual(\n input.registry.store.getState().location,\n state.location,\n internals.resources,\n )\n ? \"none\"\n : \"push\";\n return publish(state.projectId, state, history, \"navigateCompoundTarget\", beforePublish);\n },\n });\n return controller;\n};\n","import type { WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry-types\";\n\nconst fromUri = (uri: string) => {\n try {\n const parsed = new URL(uri);\n if (parsed.protocol !== \"pstdio:\" || parsed.hostname !== \"extension-resource\") return undefined;\n const [type, id, ...rest] = parsed.pathname.slice(1).split(\"/\");\n if (!type || !id || rest.length > 0) return undefined;\n const extensionId = parsed.searchParams.get(\"extensionId\");\n const projectId = parsed.searchParams.get(\"projectId\");\n return {\n type: decodeURIComponent(type),\n id: decodeURIComponent(id),\n ...(extensionId ? { extensionId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n } catch {\n return undefined;\n }\n};\n\n/** Resource URI conversion belongs to route and persistence adapters. */\nexport const defaultPageResourceCodec: WorkbenchPageResourceCodec = {\n normalize: (resource) => ({ ...resource }),\n toUri: (resource) => {\n const uri = `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`;\n const query = new URLSearchParams();\n if (resource.extensionId) query.set(\"extensionId\", resource.extensionId);\n if (resource.projectId) query.set(\"projectId\", resource.projectId);\n return query.size ? `${uri}?${query}` : uri;\n },\n fromUri,\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\n\nexport interface WorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface PersistedWorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface WorkbenchPanelMenuStatePersistenceAdapter {\n getMenuStates(scope?: string): PersistedWorkbenchPanelMenuState | undefined;\n setMenuStates(state: PersistedWorkbenchPanelMenuState, scope?: string): void;\n}\n\nexport type WorkbenchPanelMenuStateChangeListener = (state: WorkbenchPanelMenuState) => void;\n\nexport interface WorkbenchPanelMenuStateController {\n store: WorkbenchStore<WorkbenchPanelMenuState>;\n isOpen(menuId: string): boolean;\n setOpen(menuId: string, open: boolean): void;\n toggle(menuId: string): void;\n setPersistenceScope(scope: string | undefined): void;\n getPersistenceScope(): string | undefined;\n onDidChange(listener: WorkbenchPanelMenuStateChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchPanelMenuStateControllerInput {\n persistence?: WorkbenchPanelMenuStatePersistenceAdapter;\n}\n\nexport const createWorkbenchPanelMenuStateController = (\n input: CreateWorkbenchPanelMenuStateControllerInput = {},\n): WorkbenchPanelMenuStateController => {\n let currentScope: string | undefined;\n const persisted = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n const resolveOpenByMenuId = (state: PersistedWorkbenchPanelMenuState | undefined) => ({\n ...state?.openByMenuId,\n });\n\n const store = createWorkbenchStore<WorkbenchPanelMenuState>({\n name: \"workbench.panelMenuState\",\n initialState: { openByMenuId: resolveOpenByMenuId(persisted) },\n });\n\n const persistState = () => {\n if (!input.persistence) return;\n runWorkbenchEffect(`panel menu cache write for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setMenuStates({ openByMenuId: store.getState().openByMenuId }, currentScope),\n );\n };\n\n const isOpen = (menuId: string) => store.getState().openByMenuId[menuId] ?? true;\n\n return {\n store,\n\n isOpen,\n\n setOpen(menuId, open) {\n const snapshot = store.getState();\n if ((snapshot.openByMenuId[menuId] ?? true) === open) return;\n store.setState(\n {\n openByMenuId: { ...snapshot.openByMenuId, [menuId]: open },\n },\n false,\n \"setMenuOpen\",\n );\n persistState();\n },\n\n toggle(menuId) {\n this.setOpen(menuId, !isOpen(menuId));\n },\n\n setPersistenceScope(scope) {\n if (scope === currentScope) return;\n persistState();\n currentScope = scope;\n const incoming = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n store.setState({ openByMenuId: resolveOpenByMenuId(incoming) }, false, \"setPersistenceScope\");\n },\n\n getPersistenceScope: () => currentScope,\n\n onDidChange(listener) {\n const unsubscribe = store.subscribe((state) => listener(state));\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchSidePanelMode = \"floating\" | \"closed\" | \"attached\";\n\nexport type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;\n\nexport interface WorkbenchSidePanelState {\n mode: WorkbenchSidePanelMode;\n}\n\nexport interface WorkbenchSidePanelController {\n canFloat(): boolean;\n store: WorkbenchStore<WorkbenchSidePanelState>;\n getMode(): WorkbenchSidePanelMode;\n setMode(mode: WorkbenchSidePanelMode): void;\n onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable;\n}\n\nexport interface WorkbenchSidePanelPersistenceAdapter {\n getMode(): WorkbenchSidePanelMode | undefined;\n setMode(mode: WorkbenchSidePanelMode): void;\n}\n\nexport interface CreateWorkbenchSidePanelControllerInput {\n getFloatingPanels?(): \"visible\" | \"hidden\";\n onDidChangePolicy?(listener: () => void): Disposable;\n initialMode?: WorkbenchSidePanelMode;\n persistence?: WorkbenchSidePanelPersistenceAdapter;\n}\n\nexport const createWorkbenchSidePanelController = (input: CreateWorkbenchSidePanelControllerInput = {}) => {\n const canFloat = () => input.getFloatingPanels?.() !== \"hidden\";\n const resolveMode = (mode: WorkbenchSidePanelMode) => (!canFloat() && mode === \"floating\" ? \"attached\" : mode);\n const internal = createWorkbenchStore<WorkbenchSidePanelState>({\n name: \"workbench.sidePanel\",\n // What the user last chose outranks the app's opening default.\n initialState: { mode: resolveMode(input.persistence?.getMode() ?? input.initialMode ?? \"floating\") },\n });\n\n const setMode = (mode: WorkbenchSidePanelMode) => {\n const next = resolveMode(mode);\n if (internal.getState().mode === next) return;\n internal.setState({ mode: next }, false, \"setMode\");\n input.persistence?.setMode(next);\n };\n input.onDidChangePolicy?.(() => setMode(internal.getState().mode));\n\n return {\n canFloat,\n store: internal,\n getMode() {\n return internal.getState().mode;\n },\n setMode,\n onDidChange(listener: WorkbenchSidePanelChangeListener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.mode,\n (mode) => listener(mode),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n// Structural copies of the renderer-side terminal contract (`@pstdio/ui/terminal`\n// and `@pstdio/sdk` mirror the same shapes). Core owns its contracts, so these are\n// declared here instead of importing UI package types — the React layer bridges the two.\nexport interface WorkbenchTerminalSessionRequest {\n command?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols: number;\n rows: number;\n}\n\nexport interface WorkbenchTerminalSessionExit {\n code: number | null;\n signal: string | null;\n}\n\nexport interface WorkbenchTerminalSessionError {\n message: string;\n}\n\nexport interface WorkbenchTerminalSessionAdapter {\n readonly id: string;\n write(data: string | Uint8Array): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): Promise<void> | void;\n onData(handler: (chunk: Uint8Array) => void): () => void;\n /** Foreground process name updates, when the opener can report them (real PTYs). */\n onTitle?(handler: (title: string) => void): () => void;\n onExit(handler: (exit: WorkbenchTerminalSessionExit) => void): () => void;\n onError(handler: (error: WorkbenchTerminalSessionError) => void): () => void;\n}\n\n// Host-injected session factory. Production hosts back this with a PTY transport;\n// the testbench and stories inject a deterministic scripted opener.\nexport type WorkbenchTerminalSessionOpener = (\n request: WorkbenchTerminalSessionRequest,\n) => Promise<WorkbenchTerminalSessionAdapter>;\n\nexport type WorkbenchTerminalSessionStatus = \"running\" | \"exited\" | \"killed\";\n\nexport interface WorkbenchTerminalSessionModel {\n id: string;\n title: string;\n status: WorkbenchTerminalSessionStatus;\n exit?: WorkbenchTerminalSessionExit;\n}\n\nexport interface WorkbenchTerminalState {\n sessionsById: Record<string, WorkbenchTerminalSessionModel>;\n}\n\nexport interface WorkbenchTerminalSessionSink {\n onData?(chunk: Uint8Array): void;\n onExit?(exit: WorkbenchTerminalSessionExit): void;\n onError?(error: WorkbenchTerminalSessionError): void;\n}\n\nexport interface WorkbenchTerminalController {\n store: WorkbenchStore<WorkbenchTerminalState>;\n /** True once the host injected a session opener. */\n isAvailable(): boolean;\n setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;\n /** Opens a session; the live adapter stays host-side and only the id is returned. */\n open(input: {\n bindingId?: string;\n request: WorkbenchTerminalSessionRequest;\n title?: string;\n }): Promise<{ sessionId: string }>;\n write(input: { sessionId: string; data: string | Uint8Array }): void;\n resize(input: { sessionId: string; cols: number; rows: number }): void;\n kill(input: { sessionId: string; signal?: string }): Promise<void>;\n killBinding(bindingId: string): Promise<void>;\n subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;\n getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;\n listSessions(): WorkbenchTerminalSessionModel[];\n /** Kills every live session. Called when the owning workbench is torn down. */\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_SESSION_TITLE = \"Terminal\";\nconst SESSION_HISTORY_LIMIT = 200;\n\nexport const createWorkbenchTerminalController = (): WorkbenchTerminalController => {\n const store = createWorkbenchStore<WorkbenchTerminalState>({\n name: \"workbench.terminal\",\n initialState: { sessionsById: {} },\n });\n\n let opener: WorkbenchTerminalSessionOpener | null = null;\n const adapters = new Map<string, WorkbenchTerminalSessionAdapter>();\n const adapterDisposers = new Map<string, Array<() => void>>();\n const dataHistory = new Map<string, Uint8Array[]>();\n const dataSubscribers = new Map<string, Set<(chunk: Uint8Array) => void>>();\n const sessionIdByBindingId = new Map<string, string>();\n const bindingIdBySessionId = new Map<string, string>();\n const pendingSessionByBindingId = new Map<string, Promise<{ sessionId: string }>>();\n\n const patchSession = (sessionId: string, patch: Partial<WorkbenchTerminalSessionModel>, action: string) => {\n const snapshot = store.getState();\n const session = snapshot.sessionsById[sessionId];\n if (!session) return;\n store.setState(\n { sessionsById: { ...snapshot.sessionsById, [sessionId]: { ...session, ...patch } } },\n false,\n action,\n );\n };\n\n const requireAdapter = (sessionId: string) => {\n const adapter = adapters.get(sessionId);\n if (!adapter) throw new Error(`Unknown terminal session: ${sessionId}`);\n return adapter;\n };\n\n const cleanupSession = (sessionId: string) => {\n adapters.delete(sessionId);\n dataHistory.delete(sessionId);\n dataSubscribers.delete(sessionId);\n const bindingId = bindingIdBySessionId.get(sessionId);\n bindingIdBySessionId.delete(sessionId);\n if (bindingId && sessionIdByBindingId.get(bindingId) === sessionId) sessionIdByBindingId.delete(bindingId);\n const disposers = adapterDisposers.get(sessionId) ?? [];\n adapterDisposers.delete(sessionId);\n for (const dispose of disposers) dispose();\n };\n\n const publishData = (sessionId: string, chunk: Uint8Array) => {\n const history = dataHistory.get(sessionId);\n if (!history) return;\n const snapshot = new Uint8Array(chunk);\n history.push(snapshot);\n if (history.length > SESSION_HISTORY_LIMIT) history.shift();\n for (const subscriber of dataSubscribers.get(sessionId) ?? []) subscriber(snapshot);\n };\n\n const kill = async (input: { sessionId: string; signal?: string }) => {\n const adapter = requireAdapter(input.sessionId);\n await adapter.kill(input.signal);\n patchSession(input.sessionId, { status: \"killed\" }, \"killTerminalSession\");\n cleanupSession(input.sessionId);\n };\n\n const killBinding = async (bindingId: string) => {\n const sessionId = sessionIdByBindingId.get(bindingId);\n if (sessionId && adapters.has(sessionId)) {\n await kill({ sessionId });\n return;\n }\n\n const pending = pendingSessionByBindingId.get(bindingId);\n if (!pending) return;\n const opened = await pending.catch(() => undefined);\n if (opened && adapters.has(opened.sessionId)) await kill({ sessionId: opened.sessionId });\n };\n\n const open = async (input: { bindingId?: string; request: WorkbenchTerminalSessionRequest; title?: string }) => {\n if (!opener) throw new Error(\"Terminal sessions are not available in this workbench host.\");\n\n if (input.bindingId) {\n const sessionId = sessionIdByBindingId.get(input.bindingId);\n if (sessionId && adapters.has(sessionId)) return { sessionId };\n const pending = pendingSessionByBindingId.get(input.bindingId);\n if (pending) return await pending;\n }\n\n const openSession = (async () => {\n const adapter = await opener(input.request);\n adapters.set(adapter.id, adapter);\n dataHistory.set(adapter.id, []);\n dataSubscribers.set(adapter.id, new Set());\n if (input.bindingId) {\n sessionIdByBindingId.set(input.bindingId, adapter.id);\n bindingIdBySessionId.set(adapter.id, input.bindingId);\n }\n\n const disposers = [adapter.onData((chunk) => publishData(adapter.id, chunk))];\n const unsubscribeTitle = adapter.onTitle?.((title) =>\n patchSession(adapter.id, { title }, \"terminalSessionTitleChanged\"),\n );\n if (unsubscribeTitle) disposers.push(unsubscribeTitle);\n disposers.push(\n adapter.onExit((exit) => {\n const session = store.getState().sessionsById[adapter.id];\n if (session?.status === \"running\") {\n patchSession(adapter.id, { status: \"exited\", exit }, \"terminalSessionExited\");\n }\n cleanupSession(adapter.id);\n }),\n );\n adapterDisposers.set(adapter.id, disposers);\n\n const snapshot = store.getState();\n store.setState(\n {\n sessionsById: {\n ...snapshot.sessionsById,\n [adapter.id]: { id: adapter.id, title: input.title ?? DEFAULT_SESSION_TITLE, status: \"running\" },\n },\n },\n false,\n \"openTerminalSession\",\n );\n\n return { sessionId: adapter.id };\n })();\n\n if (input.bindingId) pendingSessionByBindingId.set(input.bindingId, openSession);\n try {\n return await openSession;\n } finally {\n if (input.bindingId && pendingSessionByBindingId.get(input.bindingId) === openSession) {\n pendingSessionByBindingId.delete(input.bindingId);\n }\n }\n };\n\n return {\n store,\n\n isAvailable: () => opener !== null,\n\n setSessionOpener(next) {\n opener = next;\n },\n\n open,\n\n write(input) {\n requireAdapter(input.sessionId).write(input.data);\n },\n\n resize(input) {\n requireAdapter(input.sessionId).resize(input.cols, input.rows);\n },\n\n kill,\n\n killBinding,\n\n subscribe(sessionId, sink) {\n const adapter = requireAdapter(sessionId);\n const unsubscribes: Array<(() => void) | undefined> = [];\n if (sink.onData) {\n const onData = sink.onData;\n const subscribers = dataSubscribers.get(sessionId);\n subscribers?.add(onData);\n unsubscribes.push(() => subscribers?.delete(onData));\n for (const chunk of dataHistory.get(sessionId) ?? []) onData(chunk);\n }\n unsubscribes.push(\n sink.onExit ? adapter.onExit(sink.onExit) : undefined,\n sink.onError ? adapter.onError(sink.onError) : undefined,\n );\n return () => {\n for (const unsubscribe of unsubscribes) unsubscribe?.();\n };\n },\n\n getSession(sessionId) {\n return store.getState().sessionsById[sessionId];\n },\n\n listSessions() {\n return Object.values(store.getState().sessionsById);\n },\n\n async dispose() {\n const running = Object.values(store.getState().sessionsById).filter((session) => session.status === \"running\");\n await Promise.all(running.map((session) => kill({ sessionId: session.id })));\n for (const session of Object.values(store.getState().sessionsById)) cleanupSession(session.id);\n adapters.clear();\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface CommandPaletteResourceQueryContext {\n query: string;\n limit: number;\n}\n\n// A single dynamic palette result. `activate` is supplied by whoever registers the\n// provider (e.g. the extension host running a command or opening a resource), keeping\n// this registry free of command/resource execution concerns.\nexport interface CommandPaletteResourceResult {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n group?: string;\n activate(): void | Promise<void>;\n}\n\nexport interface CommandPaletteResourceProvider {\n id: string;\n title: string;\n refreshEventIds?: string[];\n query(context: CommandPaletteResourceQueryContext): Promise<readonly CommandPaletteResourceResult[]>;\n}\n\nexport interface CommandPaletteResourceProviderResult {\n providerId: string;\n title: string;\n results: readonly CommandPaletteResourceResult[];\n}\n\nexport interface CommandPaletteResourceRegistryStoreState {\n providers: Record<string, CommandPaletteResourceProvider>;\n // Bumped to ask the palette to re-query providers (e.g. after a refresh event).\n refreshToken: number;\n}\n\nexport interface CommandPaletteResourceRegistry {\n store: WorkbenchStore<CommandPaletteResourceRegistryStoreState>;\n registerProvider(provider: CommandPaletteResourceProvider): Disposable;\n listProviders(): CommandPaletteResourceProvider[];\n queryProviders(context: CommandPaletteResourceQueryContext): Promise<CommandPaletteResourceProviderResult[]>;\n refresh(): void;\n}\n\nexport const createCommandPaletteResourceRegistry = (): CommandPaletteResourceRegistry => {\n const store = createWorkbenchStore<CommandPaletteResourceRegistryStoreState>({\n name: \"workbench.commandPaletteResources\",\n initialState: { providers: {}, refreshToken: 0 },\n });\n\n return {\n store,\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) {\n throw new Error(`Command palette resource provider already registered: ${provider.id}`);\n }\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 async queryProviders(context) {\n const providers = Object.values(store.getState().providers);\n return Promise.all(\n providers.map(async (provider) => {\n try {\n const results = await provider.query(context);\n return { providerId: provider.id, title: provider.title, results };\n } catch {\n // Error isolation: a failing provider must not blank the palette or break peers.\n return { providerId: provider.id, title: provider.title, results: [] };\n }\n }),\n );\n },\n\n refresh() {\n const snapshot = store.getState();\n store.setState({ ...snapshot, refreshToken: snapshot.refreshToken + 1 }, false, \"refresh\");\n },\n };\n};\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 { ResourceRef } from \"../resources/resource-registry\";\n\nexport interface WorkbenchCommandExecutionError {\n commandId: string;\n args: unknown;\n error: unknown;\n}\n\nexport type WorkbenchCommandExecutionErrorListener = (event: WorkbenchCommandExecutionError) => void;\n\nexport interface WorkbenchCommandExecutionContext {\n resource?: ResourceRef;\n source?: \"panel-add\";\n}\n\nexport interface CommandParamOption {\n label: string;\n value: string;\n icon?: string;\n}\n\nexport interface CommandParamDescriptor {\n type: string;\n label?: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: CommandParamOption[];\n templateType?: string;\n resourceType?: string;\n accept?: string;\n multiple?: boolean;\n metadata?: Record<string, unknown>;\n resolvedFrom?: \"resource\";\n}\n\nexport type CommandParamSchema = Record<string, CommandParamDescriptor>;\n\nexport interface Command {\n id: string;\n label: string;\n category?: string;\n description?: string;\n icon?: string;\n when?: string;\n params?: CommandParamSchema;\n}\n\nexport interface CommandHandler<TArgs = unknown, TResult = unknown> {\n prepareArgs?(\n args: TArgs,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: TArgs) => void,\n ): TArgs | Promise<TArgs>;\n execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;\n isEnabled?(args: TArgs): boolean;\n isVisible?(args: TArgs): boolean;\n isToggled?(args: TArgs): boolean;\n}\n\nexport interface RegisteredCommand extends RegisteredContributionMetadata {\n command: Command;\n handler: CommandHandler;\n}\n\nexport interface CommandRegistryStoreState {\n commands: Record<string, RegisteredCommand>;\n}\n\nexport interface CommandRegistry {\n store: WorkbenchStore<CommandRegistryStoreState>;\n registerCommand<TArgs = unknown, TResult = unknown>(\n command: Command,\n handler: CommandHandler<TArgs, TResult>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getCommand(id: string): RegisteredCommand | undefined;\n listCommands(): RegisteredCommand[];\n isCommandEnabled(id: string, args?: unknown): boolean;\n isCommandVisible(id: string, args?: unknown): boolean;\n isCommandToggled(id: string, args?: unknown): boolean;\n prepareCommandArgs(\n id: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown>;\n executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;\n onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable;\n}\n\nexport interface CreateCommandRegistryInput {\n context?: ContextKeyService;\n}\n\nexport const createCommandRegistry = (input: CreateCommandRegistryInput = {}): CommandRegistry => {\n const store = createWorkbenchStore<CommandRegistryStoreState>({\n name: \"workbench.commands\",\n initialState: { commands: {} },\n });\n\n const errorListeners = new Set<WorkbenchCommandExecutionErrorListener>();\n\n const requireCommand = (id: string) => {\n const record = store.getState().commands[id];\n if (!record) throw new Error(`Command not registered: ${id}`);\n return record;\n };\n\n const emitError = (event: WorkbenchCommandExecutionError) => {\n for (const listener of errorListeners) listener(event);\n };\n\n return {\n store,\n\n registerCommand(command, handler, metadata) {\n const snapshot = store.getState();\n if (snapshot.commands[command.id]) throw new Error(`Command already registered: ${command.id}`);\n\n const record: RegisteredCommand = {\n ...normalizeContributionMetadata(metadata),\n command,\n handler: handler as CommandHandler,\n };\n\n store.setState({ commands: { ...snapshot.commands, [command.id]: record } }, false, \"registerCommand\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.commands[command.id] !== record) return;\n const { [command.id]: _removed, ...rest } = current.commands;\n store.setState({ commands: rest }, false, \"unregisterCommand\");\n });\n },\n\n getCommand(id) {\n return store.getState().commands[id];\n },\n\n listCommands() {\n return Object.values(store.getState().commands).sort(byContributionPriority);\n },\n\n isCommandEnabled(id, args) {\n return requireCommand(id).handler.isEnabled?.(args) ?? true;\n },\n\n isCommandVisible(id, args) {\n const record = requireCommand(id);\n if (!input.context?.matches(record.command.when)) return false;\n return record.handler.isVisible?.(args) ?? true;\n },\n\n isCommandToggled(id, args) {\n return requireCommand(id).handler.isToggled?.(args) ?? false;\n },\n\n async prepareCommandArgs(id, args, context, onArgsChange) {\n const prepare = requireCommand(id).handler.prepareArgs;\n return prepare ? prepare(args, context, onArgsChange) : args;\n },\n\n async executeCommand(id, args, context) {\n const record = requireCommand(id);\n if (record.handler.isEnabled?.(args) === false) {\n const error = new Error(`Command is disabled: ${id}`);\n emitError({ commandId: id, args, error });\n throw error;\n }\n try {\n return await record.handler.execute(args, context);\n } catch (error) {\n emitError({ commandId: id, args, error });\n throw error;\n }\n },\n\n onDidExecuteError(listener) {\n errorListeners.add(listener);\n return createDisposable(() => {\n errorListeners.delete(listener);\n });\n },\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\nexport interface ResolvedOwnedPlacement<Value = unknown> {\n identity: PlacementIdentity;\n region: WorkbenchRegion;\n order: number;\n value: Value;\n}\n\nexport interface ComposeOwnedPlacementsInput<Value> {\n shell: readonly ResolvedOwnedPlacement<Value>[];\n mode?: readonly ResolvedOwnedPlacement<Value>[];\n page?: readonly ResolvedOwnedPlacement<Value>[];\n closed?: readonly PlacementIdentity[];\n}\n\nexport interface ComposedOwnedPlacements<Value> {\n placements: readonly ResolvedOwnedPlacement<Value>[];\n closed: readonly ResolvedOwnedPlacement<Value>[];\n regions: Record<WorkbenchRegion, readonly ResolvedOwnedPlacement<Value>[]>;\n visibleRegions: ReadonlySet<WorkbenchRegion>;\n}\n\nexport interface OwnedPlacementUpdate<Value> {\n current: ResolvedOwnedPlacement<Value>;\n desired: ResolvedOwnedPlacement<Value>;\n}\n\nexport interface OwnedPlacementReconciliation<Value> {\n add: readonly ResolvedOwnedPlacement<Value>[];\n retain: readonly ResolvedOwnedPlacement<Value>[];\n update: readonly OwnedPlacementUpdate<Value>[];\n activate: readonly ResolvedOwnedPlacement<Value>[];\n remove: readonly ResolvedOwnedPlacement<Value>[];\n}\n\nexport interface ReconcileOwnedPlacementsInput<Value> {\n current: readonly ResolvedOwnedPlacement<Value>[];\n desired: readonly ResolvedOwnedPlacement<Value>[];\n activate?: readonly PlacementIdentity[];\n valuesEqual: (current: Value, desired: Value) => boolean;\n}\n\nconst compareText = (left: string, right: string) => (left < right ? -1 : left > right ? 1 : 0);\n\nconst placementOwnerSortKey = (identity: PlacementIdentity) => {\n if (identity.kind === \"shell\") return `shell\\0${identity.placementId}`;\n if (identity.kind === \"mode\") return `mode\\0${identity.modeId}\\0${identity.placementId}`;\n return `page\\0${identity.pageId}\\0${identity.slotId}`;\n};\n\nexport const placementIdentityKey = (identity: PlacementIdentity) => {\n if (identity.kind === \"shell\") return JSON.stringify([\"shell\", identity.placementId, identity.instanceKey]);\n if (identity.kind === \"mode\") {\n return JSON.stringify([\"mode\", identity.modeId, identity.placementId, identity.instanceKey]);\n }\n return JSON.stringify([\"page\", identity.pageId, identity.slotId, identity.instanceKey]);\n};\n\nconst comparePlacementIdentity = (left: ResolvedOwnedPlacement<unknown>, right: ResolvedOwnedPlacement<unknown>) => {\n const owner = compareText(placementOwnerSortKey(left.identity), placementOwnerSortKey(right.identity));\n if (owner !== 0) return owner;\n return compareText(left.identity.instanceKey, right.identity.instanceKey);\n};\n\nconst compareRegionPlacement = (left: ResolvedOwnedPlacement<unknown>, right: ResolvedOwnedPlacement<unknown>) =>\n left.order - right.order || comparePlacementIdentity(left, right);\n\nconst assertOwner = (owner: PlacementIdentity[\"kind\"], placement: ResolvedOwnedPlacement<unknown>) => {\n if (placement.identity.kind === owner) return;\n const label = `${owner[0]?.toUpperCase()}${owner.slice(1)}`;\n throw new Error(`${label} placement must have a ${owner} owner`);\n};\n\nconst collectPlacements = <Value>(input: ComposeOwnedPlacementsInput<Value>) => {\n const placements: ResolvedOwnedPlacement<Value>[] = [];\n const seen = new Set<string>();\n const add = (owner: PlacementIdentity[\"kind\"], candidates: readonly ResolvedOwnedPlacement<Value>[]) => {\n for (const candidate of candidates) {\n assertOwner(owner, candidate);\n if (!Number.isFinite(candidate.order)) throw new Error(\"Placement order must be a finite number\");\n const key = placementIdentityKey(candidate.identity);\n if (seen.has(key)) throw new Error(`Duplicate placement identity: ${key}`);\n seen.add(key);\n placements.push(candidate);\n }\n };\n\n add(\"shell\", input.shell);\n add(\"mode\", input.mode ?? []);\n add(\"page\", input.page ?? []);\n const modeIds = new Set(\n (input.mode ?? []).map((placement) =>\n placement.identity.kind === \"mode\" ? placement.identity.modeId : \"invalid-mode-owner\",\n ),\n );\n const pageIds = new Set(\n (input.page ?? []).map((placement) =>\n placement.identity.kind === \"page\" ? placement.identity.pageId : \"invalid-page-owner\",\n ),\n );\n if (modeIds.size > 1) throw new Error(\"Mode placements must belong to one active mode\");\n if (pageIds.size > 1) throw new Error(\"Page placements must belong to one active page\");\n return placements;\n};\n\nconst emptyRegions = <Value>() =>\n workbenchRegions.reduce(\n (regions, region) => {\n regions[region] = [];\n return regions;\n },\n {} as Record<WorkbenchRegion, ResolvedOwnedPlacement<Value>[]>,\n );\n\nexport const composeOwnedPlacements = <Value>(\n input: ComposeOwnedPlacementsInput<Value>,\n): ComposedOwnedPlacements<Value> => {\n const declared = collectPlacements(input);\n const closedKeys = new Set((input.closed ?? []).map(placementIdentityKey));\n const closed: ResolvedOwnedPlacement<Value>[] = [];\n const regions = emptyRegions<Value>();\n\n for (const placement of declared) {\n if (closedKeys.has(placementIdentityKey(placement.identity))) {\n closed.push(placement);\n continue;\n }\n regions[placement.region].push(placement);\n }\n\n for (const region of workbenchRegions) regions[region].sort(compareRegionPlacement);\n closed.sort(comparePlacementIdentity);\n const placements = workbenchRegions.flatMap((region) => regions[region]);\n const visibleRegions = new Set(workbenchRegions.filter((region) => regions[region].length > 0));\n return { placements, closed, regions, visibleRegions };\n};\n\nconst indexPlacements = <Value>(placements: readonly ResolvedOwnedPlacement<Value>[]) => {\n const indexed = new Map<string, ResolvedOwnedPlacement<Value>>();\n for (const placement of placements) {\n const key = placementIdentityKey(placement.identity);\n if (indexed.has(key)) throw new Error(`Duplicate placement identity: ${key}`);\n indexed.set(key, placement);\n }\n return indexed;\n};\n\nconst placementShapeEqual = <Value>(\n current: ResolvedOwnedPlacement<Value>,\n desired: ResolvedOwnedPlacement<Value>,\n valuesEqual: (current: Value, desired: Value) => boolean,\n) => current.region === desired.region && current.order === desired.order && valuesEqual(current.value, desired.value);\n\nexport const reconcileOwnedPlacements = <Value>(\n input: ReconcileOwnedPlacementsInput<Value>,\n): OwnedPlacementReconciliation<Value> => {\n const current = indexPlacements(input.current);\n const desired = indexPlacements(input.desired);\n const add: ResolvedOwnedPlacement<Value>[] = [];\n const retain: ResolvedOwnedPlacement<Value>[] = [];\n const update: OwnedPlacementUpdate<Value>[] = [];\n const remove: ResolvedOwnedPlacement<Value>[] = [];\n\n for (const [key, desiredPlacement] of desired) {\n const currentPlacement = current.get(key);\n if (!currentPlacement) {\n add.push(desiredPlacement);\n } else if (placementShapeEqual(currentPlacement, desiredPlacement, input.valuesEqual)) {\n retain.push(desiredPlacement);\n } else {\n update.push({ current: currentPlacement, desired: desiredPlacement });\n }\n }\n for (const [key, currentPlacement] of current) if (!desired.has(key)) remove.push(currentPlacement);\n\n const activationKeys = new Set((input.activate ?? []).map(placementIdentityKey));\n const activate = Array.from(activationKeys, (key) => {\n const placement = desired.get(key);\n if (!placement) throw new Error(`Cannot activate missing placement: ${key}`);\n return placement;\n });\n\n add.sort(comparePlacementIdentity);\n retain.sort(comparePlacementIdentity);\n update.sort((left, right) => comparePlacementIdentity(left.desired, right.desired));\n activate.sort(comparePlacementIdentity);\n remove.sort(comparePlacementIdentity);\n return { add, retain, update, activate, remove };\n};\n","import {\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 type MenuPath = readonly string[];\n\nexport interface MenuItem {\n commandId: string;\n sourceCommandId?: string;\n label?: string;\n description?: string;\n icon?: string;\n iconSrc?: string;\n overflowLabel?: string;\n when?: string;\n group?: string;\n order?: number;\n args?: unknown;\n readOnly?: boolean;\n /** Marks a menu action that navigates outside the app, rendered with a trailing external-link icon. */\n external?: boolean;\n}\n\nexport interface RegisteredMenuItem extends MenuItem, RegisteredContributionMetadata {\n path: MenuPath;\n}\n\ninterface MenuRegistryDeps {\n commands: CommandRegistry;\n}\n\nconst menuPathKey = (path: MenuPath) => path.join(\"/\");\n\nexport interface MenuRegistryStoreState {\n itemsByPath: Record<string, RegisteredMenuItem[]>;\n}\n\nexport interface MenuRegistry {\n menuStore: WorkbenchStore<MenuRegistryStoreState>;\n registerMenuItem(path: MenuPath, item: MenuItem, metadata?: ContributionMetadata): Disposable;\n listMenuItems(path: MenuPath): RegisteredMenuItem[];\n}\n\nexport const createMenuRegistry = (deps: MenuRegistryDeps): MenuRegistry => {\n const menuStore = createWorkbenchStore<MenuRegistryStoreState>({\n name: \"workbench.menus\",\n initialState: { itemsByPath: {} },\n });\n\n return {\n menuStore,\n\n registerMenuItem(path, item, metadata) {\n if (!deps.commands.getCommand(item.commandId)) throw new Error(`Menu command not registered: ${item.commandId}`);\n\n const key = menuPathKey(path);\n const record: RegisteredMenuItem = {\n ...normalizeContributionMetadata(metadata),\n ...item,\n path,\n };\n const snapshot = menuStore.getState();\n const items = snapshot.itemsByPath[key] ?? [];\n menuStore.setState(\n {\n itemsByPath: { ...snapshot.itemsByPath, [key]: [...items, record] },\n },\n false,\n \"registerMenuItem\",\n );\n\n return createDisposable(() => {\n const current = menuStore.getState();\n const list = current.itemsByPath[key] ?? [];\n const filtered = list.filter((entry) => entry !== record);\n if (filtered.length === list.length) return;\n menuStore.setState(\n {\n itemsByPath: { ...current.itemsByPath, [key]: filtered },\n },\n false,\n \"unregisterMenuItem\",\n );\n });\n },\n\n listMenuItems(path) {\n return [...(menuStore.getState().itemsByPath[menuPathKey(path)] ?? [])].sort((left, right) => {\n const leftOrder = left.order ?? 0;\n const rightOrder = right.order ?? 0;\n return leftOrder - rightOrder || byContributionPriority(left, right);\n });\n },\n };\n};\n","import type { ContributionKind, ContributionRef, ResourceConstraint, ResourceRef } from \"@pstdio/sdk/extensions\";\n\nexport const contributionRefId = (ref: ContributionRef<ContributionKind>) =>\n !ref.extensionId || ref.extensionId === \"pstdio\" ? ref.id : `${ref.extensionId}.${ref.kind}.${ref.id}`;\n\nexport const resourceMatchesConstraint = (constraint: ResourceConstraint, resource: ResourceRef) =>\n constraint.kinds.some(\n (kind) =>\n kind.id === resource.type &&\n (!resource.extensionId || !kind.extensionId || resource.extensionId === kind.extensionId),\n );\n","import type { PageOpenIntent, PlacementItem } from \"@pstdio/sdk/extensions\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId, resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nexport type WorkbenchPlacementPresence = \"fixed\" | \"open\" | \"closed\";\nexport type WorkbenchOwnedPlacementItem = PlacementItem;\nexport const placementItemViewId = (item: PlacementItem) =>\n contributionRefId(item.kind === \"view\" ? item.view : item.binding.view);\n/** A user's explicit open or close of an optional static placement. */\nexport type StaticPlacementOverride = \"open\" | \"closed\";\nexport interface OwnedResourceInstance {\n instanceKey: string;\n resource: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementState {\n staticOverrides: Map<string, StaticPlacementOverride>;\n resourceInstances: Map<string, readonly OwnedResourceInstance[]>;\n}\nexport const createOwnedPlacementState = (): OwnedPlacementState => ({\n staticOverrides: new Map(),\n resourceInstances: new Map(),\n});\nexport const isStaticPlacementOpen = (item: WorkbenchOwnedPlacementItem, state: OwnedPlacementState, id: string) => {\n if (item.kind !== \"view\") return false;\n if (item.presence === \"fixed\") return true;\n return (state.staticOverrides.get(id) ?? item.presence) === \"open\";\n};\nexport const staticPlacementClosable = (item: WorkbenchOwnedPlacementItem) =>\n item.kind !== \"view\" || item.presence !== \"fixed\";\nexport const validateOwnedPlacementItem = (label: string, id: string, item: WorkbenchOwnedPlacementItem) => {\n if (item.kind === \"binding\" && item.binding.kinds.length === 0) {\n throw new Error(`${label} \"${id}\" must bind at least one resource kind`);\n }\n};\nexport const openStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (input.resource) throw new Error(`${label} \"${id}\" does not accept a resource`);\n if (input.open) throw new Error(`${label} \"${id}\" does not accept an open intent`);\n if (item.presence !== \"fixed\") state.staticOverrides.set(id, \"open\");\n};\nexport const closeStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (item.presence === \"fixed\") throw new Error(`${label} \"${id}\" is fixed and cannot close`);\n state.staticOverrides.set(id, \"closed\");\n};\nconst retainResourceInstances = (\n item: Extract<\n WorkbenchOwnedPlacementItem,\n {\n kind: \"binding\";\n }\n >,\n current: readonly OwnedResourceInstance[],\n next: OwnedResourceInstance,\n): readonly OwnedResourceInstance[] => {\n if (item.binding.cardinality === \"one\") return [next];\n const existing = current.find((candidate) => candidate.instanceKey === next.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || next.open === \"pin\" ? \"pin\" : \"preview\";\n const retained = current.filter(\n (candidate) => candidate.instanceKey !== next.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n );\n return [...retained, { ...next, open }];\n};\nexport const openResourcePlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"binding\") throw new Error(`${label} \"${id}\" is not resource-backed`);\n if (!input.resource) throw new Error(`${label} \"${id}\" requires a resource`);\n if (!resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n if (input.open && item.binding.cardinality !== \"many\") {\n throw new Error(`${label} \"${id}\" accepts open intent only with many cardinality`);\n }\n const instance: OwnedResourceInstance = {\n instanceKey: resourceKey(input.resource),\n resource: input.resource,\n ...(item.binding.cardinality === \"many\" ? { open: input.open ?? (\"preview\" as const) } : {}),\n ...(input.title ? { title: input.title } : {}),\n };\n state.resourceInstances.set(id, retainResourceInstances(item, state.resourceInstances.get(id) ?? [], instance));\n return instance.instanceKey;\n};\nexport const closeOwnedPlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n}) => {\n if (input.instanceKey === \"default\") {\n closeStaticPlacement(input);\n return true;\n }\n const current = input.state.resourceInstances.get(input.id) ?? [];\n const next = current.filter((instance) => instance.instanceKey !== input.instanceKey);\n if (next.length === current.length) return false;\n input.state.resourceInstances.set(input.id, next);\n return true;\n};\nexport const updateResourcePlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (input.instanceKey === \"default\" || item.kind !== \"binding\") return;\n if (input.resource && !resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n const instances = state.resourceInstances.get(id) ?? [];\n state.resourceInstances.set(\n id,\n instances.map((instance) =>\n instance.instanceKey === input.instanceKey\n ? {\n ...instance,\n ...(input.open ? { open: input.open } : {}),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.title === undefined ? {} : { title: input.title }),\n }\n : instance,\n ),\n );\n};\nexport const clearOwnedPlacementState = (state: OwnedPlacementState, id: string) => {\n state.staticOverrides.delete(id);\n state.resourceInstances.delete(id);\n};\n","import type { PageLocation, PageOpenIntent, PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n type OwnedPlacementState,\n openResourcePlacement,\n openStaticPlacement,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\n\nexport interface OwnedPlacementOpenInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementLocationContext {\n modeId: string;\n pageId?: string;\n projectId?: string;\n location?: PageLocation;\n}\nexport interface OwnedPlacementPreparation {\n connectRuntime(listener: () => void): Disposable;\n restore?(\n context: OwnedPlacementLocationContext,\n state?: OwnedPlacementState,\n previousContext?: OwnedPlacementLocationContext,\n ): OwnedPlacementState;\n adopt?(\n modeId: string,\n placements: readonly WorkbenchWidgetPlacement[],\n state?: OwnedPlacementState,\n ): OwnedPlacementState;\n getState(): OwnedPlacementState;\n open(\n target: OwnedPlacementOpenInput,\n current?: OwnedPlacementState,\n ): { state: OwnedPlacementState; identity: PlacementIdentity };\n resolve(modeId?: string, state?: OwnedPlacementState): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n apply(state: OwnedPlacementState): void;\n publish(): void;\n}\nconst preparations = new WeakMap<object, OwnedPlacementPreparation>();\nexport const setOwnedPlacementPreparation = (registry: object, preparation: OwnedPlacementPreparation) =>\n preparations.set(registry, preparation);\nexport const getOwnedPlacementPreparation = (registry: object) => {\n const preparation = preparations.get(registry);\n if (!preparation) throw new Error(\"Owned placement preparation is unavailable\");\n return preparation;\n};\nexport const prepareOwnedPlacement = (input: {\n label: string;\n target: OwnedPlacementOpenInput;\n item: WorkbenchOwnedPlacementItem;\n current: OwnedPlacementState;\n identityFor(instanceKey: string): PlacementIdentity;\n}) => {\n const state = {\n staticOverrides: new Map(input.current.staticOverrides),\n resourceInstances: new Map(input.current.resourceInstances),\n };\n const operation = { ...input.target, label: input.label, id: input.target.placementId, item: input.item, state };\n let instanceKey = \"default\";\n if (input.item.kind === \"view\") openStaticPlacement(operation);\n else instanceKey = openResourcePlacement(operation);\n return { state, identity: input.identityFor(instanceKey) };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { OwnedPlacementState, WorkbenchOwnedPlacementItem } from \"./owned-placement-lifecycle\";\n\nexport const restoreOwnedPlacementState = (input: {\n state: OwnedPlacementState;\n declarations: readonly { id: string; item: WorkbenchOwnedPlacementItem }[];\n saved: readonly WorkbenchWidgetPlacement[];\n owns(identity: PlacementIdentity): boolean;\n}) => {\n const state = {\n staticOverrides: new Map(input.state.staticOverrides),\n resourceInstances: new Map(input.state.resourceInstances),\n };\n for (const placement of input.declarations) {\n const saved = input.saved.filter((candidate) => {\n const identity = candidate.placementIdentity;\n return identity && input.owns(identity) && identity.kind !== \"page\" && identity.placementId === placement.id;\n });\n if (placement.item.kind === \"view\") {\n state.staticOverrides.set(placement.id, saved.length ? \"open\" : \"closed\");\n continue;\n }\n const binding = placement.item.binding;\n const instances = saved.flatMap((candidate) => {\n if (\n !candidate.resource ||\n !candidate.placementIdentity ||\n !resourceMatchesConstraint(binding, candidate.resource)\n )\n return [];\n return [\n {\n instanceKey: candidate.placementIdentity.instanceKey,\n resource: candidate.resource,\n title: candidate.title,\n ...(binding.cardinality === \"many\"\n ? { open: candidate.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n state.resourceInstances.set(placement.id, binding.cardinality === \"one\" ? instances.slice(-1) : instances);\n }\n return state;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type {\n WidgetMountStrategy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport type { WorkbenchViewRegistry } from \"./view-registry\";\n\nexport interface WorkbenchPlacementPresentation {\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n headerBorderBottom?: boolean;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n}\n\nexport interface RegisterWorkbenchViewPlacementInput extends WorkbenchPlacementPresentation {\n id: string;\n viewId: string;\n region: WorkbenchRegion;\n role: WorkbenchWidgetRole;\n singleton: boolean;\n closable: boolean;\n}\n\nexport const registerWorkbenchViewPlacement = (\n layout: Pick<LayoutModel, \"registerPanel\">,\n views: WorkbenchViewRegistry,\n input: RegisterWorkbenchViewPlacementInput,\n viewMenus?: WorkbenchViewMenuRegistry,\n): Disposable => {\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench placement view is not registered: ${input.viewId}`);\n const { role: _role, viewId: _viewId, ...panel } = input;\n return layout.registerPanel({\n ...panel,\n title: view.title,\n icon: view.icon,\n rendererId: view.id,\n panelMenus: viewMenus?.definitionsFor(view.id, input.id),\n });\n};\n\nexport const modePlacementContributionId = (placementId: string) =>\n `workbench.mode-placement.${encodeURIComponent(placementId)}`;\n\nexport const pagePlacementContributionId = (pageId: string, slotId: string) =>\n `workbench.page-placement.${encodeURIComponent(pageId)}.${encodeURIComponent(slotId)}`;\n","import type { DockedWorkbenchRegion, PageOpenIntent, PlacementIdentity, PlacementRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type { RegisteredWidgetContribution, WorkbenchLayout, WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"../placements/owned-placement-lifecycle\";\nimport type { OwnedPlacementLocationContext } from \"../placements/owned-placement-preparation\";\nimport {\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"../placements/owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"../placements/owned-placement-restoration\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport {\n modePlacementContributionId,\n registerWorkbenchViewPlacement,\n type WorkbenchPlacementPresentation,\n} from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchModePlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly ref: PlacementRef;\n readonly modeId: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: DockedWorkbenchRegion;\n readonly order?: number;\n readonly movableTo?: readonly DockedWorkbenchRegion[];\n}\n\ninterface OpenModePlacementTarget {\n panel: PlacementRef;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}\n\nexport interface WorkbenchModePlacementRegistry {\n registerPlacement(placement: WorkbenchModePlacementContribution): Disposable;\n getPlacement(ref: PlacementRef): WorkbenchModePlacementContribution | undefined;\n listPlacements(modeId?: string): WorkbenchModePlacementContribution[];\n openPlacement(input: OpenModePlacementTarget): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: { resource?: ResourceRef; title?: string; open?: PageOpenIntent },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n modeId: string,\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\n\nconst identityFor = (placement: WorkbenchModePlacementContribution, instanceKey: string): PlacementIdentity => ({\n kind: \"mode\",\n modeId: placement.modeId,\n placementId: placement.id,\n instanceKey,\n});\n\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\n\nconst placementRefKey = (ref: PlacementRef) => JSON.stringify([ref.extensionId, ref.id]);\n\nconst validatePlacement = (input: {\n placement: WorkbenchModePlacementContribution;\n placements: Map<string, WorkbenchModePlacementContribution>;\n refs: Map<string, WorkbenchModePlacementContribution>;\n views: WorkbenchViewRegistry;\n}) => {\n const { placement, placements, refs, views } = input;\n if (placements.has(placement.id)) throw new Error(`Mode placement already registered: ${placement.id}`);\n if (placement.ref.kind !== \"placement\" || !placement.ref.extensionId || !placement.ref.id) {\n throw new Error(`Mode placement \"${placement.id}\" must declare a normalized placement ref`);\n }\n const refKey = placementRefKey(placement.ref);\n if (refs.has(refKey)) throw new Error(`Mode placement ref already registered: ${refKey}`);\n if (placement.movableTo && !placement.movableTo.includes(placement.region)) {\n throw new Error(`Mode placement \"${placement.id}\" must include its initial region in movableTo`);\n }\n validateOwnedPlacementItem(\"Mode placement\", placement.id, placement.item);\n if (!views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n return refKey;\n};\n\nconst copyPlacement = (placement: WorkbenchModePlacementContribution) => ({\n ...placement,\n ref: { ...placement.ref },\n item: { ...placement.item },\n ...(placement.movableTo ? { movableTo: [...placement.movableTo] } : {}),\n});\n\nexport const createWorkbenchModePlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n getProjectId?(): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n}): WorkbenchModePlacementRegistry => {\n const placements = new Map<string, WorkbenchModePlacementContribution>();\n const refs = new Map<string, WorkbenchModePlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Mode placement\";\n\n const listPlacements = (modeId?: string) =>\n [...placements.values()]\n .filter((placement) => !modeId || placement.modeId === modeId)\n .sort((left, right) => left.id.localeCompare(right.id));\n\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"mode placement subscriber\", listener));\n };\n\n const resolve = (\n placement: WorkbenchModePlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const view = input.views.getView(placementItemViewId(placement.item));\n if (!view)\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n const contributionId = modePlacementContributionId(placement.id);\n const panel = input.getPanel(contributionId);\n if (!panel) throw new Error(`Workbench mode placement is not registered: ${placement.id}`);\n const identity = identityFor(placement, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.mode.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: placement.region === \"main\" ? \"location\" : \"sub-panel\",\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state) {\n if (input.getProjectId && context.projectId !== input.getProjectId()) current = createOwnedPlacementState();\n const saved = input.loadLayout?.(context);\n if (!saved) return current;\n const declarations = listPlacements(context.modeId).filter((placement) =>\n placement.item.kind === \"view\"\n ? !current.staticOverrides.has(placement.id)\n : !current.resourceInstances.has(placement.id),\n );\n if (!declarations.length) return current;\n return restoreOwnedPlacementState({\n state: current,\n declarations,\n saved: Object.values(saved.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === context.modeId,\n });\n },\n adopt(modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: listPlacements(modeId),\n saved,\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === modeId,\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown mode placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(modeId, current = state) {\n if (!modeId) return [];\n return listPlacements(modeId).flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchModePlacementRegistry = {\n registerPlacement(placement) {\n const refKey = validatePlacement({ placement, placements, refs, views: input.views });\n const registered = copyPlacement(placement);\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: modePlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: registered.region === \"main\" ? \"location\" : \"sub-panel\",\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n refs.set(refKey, registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n refs.delete(refKey);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n\n getPlacement(ref) {\n return refs.get(placementRefKey(ref));\n },\n\n listPlacements,\n\n openPlacement(target) {\n const placement = refs.get(placementRefKey(target.panel));\n if (!placement) throw new Error(`Unknown mode panel: ${target.panel.extensionId}.${target.panel.id}`);\n const prepared = preparation.open({ ...target, placementId: placement.id });\n preparation.apply(prepared.state);\n preparation.publish();\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry closes only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n\n updatePlacement(identity, update) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry updates only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n\n resolvePlacements: (modeId, context) =>\n preparation.resolve(modeId, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type {\n NavigationTargetPage as SdkNavigationTargetPage,\n NavigationTargetPanel as SdkNavigationTargetPanel,\n} from \"@pstdio/sdk/extensions\";\nimport {\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\";\n\n/** Core-only panel ref for host-owned shell placements. Extensions cannot address them. */\nexport interface ShellPlacementRef {\n kind: \"shell-placement\";\n id: string;\n}\n\nexport interface NavigationTargetShellPanel {\n kind: \"panel\";\n panel: ShellPlacementRef;\n resource?: SdkNavigationTargetPanel[\"resource\"];\n open?: SdkNavigationTargetPanel[\"open\"];\n title?: string;\n}\n\nexport type NavigationTargetPanel = SdkNavigationTargetPanel | NavigationTargetShellPanel;\n\nexport type NavigationTargetPage = SdkNavigationTargetPage;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport interface NavigationTargetCommand {\n kind: \"command\";\n commandId: string;\n args?: unknown;\n}\n\nexport interface NavigationTargetHref {\n kind: \"href\";\n href: string;\n}\n\nexport type NavigationTargetItem =\n | NavigationTargetPage\n | NavigationTargetPanel\n | NavigationTargetCommand\n | NavigationTargetHref;\n\nexport interface NavigationTargetCompound {\n kind: \"compound\";\n targets: readonly (NavigationTargetPage | NavigationTargetPanel)[];\n}\n\nexport type NavigationTarget = NavigationTargetItem | NavigationTargetCompound;\n\nexport interface NavigationParser {\n id: string;\n priority?: number;\n canParse(location: string): boolean;\n parse(location: string): NavigationTarget;\n}\n\nexport type RegisteredNavigationParser = Omit<NavigationParser, \"priority\"> & RegisteredContributionMetadata;\n\n// Minimal presenter surface the navigation dispatcher needs; resolved through a\n// closure to break the otherwise-circular core ↔ navigation dep.\nexport interface NavigationDispatcherContext {\n canOpenPanel?(target: NavigationTargetPanel): boolean;\n canExecuteCommand?(commandId: string): boolean;\n prepareNavigation?(targets: readonly (NavigationTargetPage | NavigationTargetPanel)[]): { commit(): unknown };\n openPanelTarget?(target: NavigationTargetPanel): unknown;\n openPageTarget?(target: NavigationTargetPage): unknown;\n executeCommand(commandId: string, args?: unknown): Promise<unknown> | unknown;\n openHref?(href: string): Promise<unknown> | unknown;\n}\n\nconst byPriorityAndId = (left: { id: string; priority: number }, right: { id: string; priority: number }) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport interface NavigationRegistryStoreState {\n parsers: Record<string, RegisteredNavigationParser>;\n}\n\nexport interface NavigationRegistry {\n store: WorkbenchStore<NavigationRegistryStoreState>;\n registerParser(parser: NavigationParser, metadata?: ContributionMetadata): Disposable;\n listParsers(): RegisteredNavigationParser[];\n resolveLocation(location: string): NavigationTarget;\n openTarget(target: NavigationTarget): Promise<readonly unknown[]>;\n /** Opens a page location through the shared executor. */\n openPage(target: Omit<NavigationTargetPage, \"kind\">): Promise<readonly unknown[]>;\n /** Opens or activates an owned panel through the shared executor. */\n openPanel(target: DistributiveOmit<NavigationTargetPanel, \"kind\">): Promise<readonly unknown[]>;\n navigate(location: string): Promise<readonly unknown[]>;\n}\n\nexport interface CreateNavigationRegistryInput {\n // Returns the presenters the dispatcher should call. Lazy so `createWorkbench`\n // can install the navigation registry before the rest of the core is ready.\n resolveDispatcher?(): NavigationDispatcherContext;\n}\n\nconst noDispatcher = (): NavigationDispatcherContext => {\n throw new Error(\"navigation.openTarget: no dispatcher available (configure resolveDispatcher)\");\n};\n\nconst dispatchItem = async (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"page\") {\n if (!dispatcher.openPageTarget) throw new Error(\"navigation.openTarget: page target dispatcher is not configured\");\n return dispatcher.openPageTarget(target);\n }\n if (target.kind === \"panel\") {\n if (!dispatcher.openPanelTarget)\n throw new Error(\"navigation.openTarget: panel target dispatcher is not configured\");\n return dispatcher.openPanelTarget(target);\n }\n if (target.kind === \"href\") {\n if (!dispatcher.openHref) throw new Error(`Cannot open navigation href target: ${target.href}`);\n return dispatcher.openHref(target.href);\n }\n return dispatcher.executeCommand(target.commandId, target.args);\n};\n\nconst validateItem = (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"panel\" && dispatcher.canOpenPanel?.(target) === false) {\n throw new Error(`Cannot open navigation panel target: ${target.panel.id}`);\n }\n if (target.kind === \"command\" && dispatcher.canExecuteCommand?.(target.commandId) === false) {\n throw new Error(`Cannot open navigation command target: ${target.commandId}`);\n }\n};\n\nconst toItems = (target: NavigationTarget): readonly NavigationTargetItem[] =>\n target.kind === \"compound\" ? target.targets : [target];\n\nexport const createNavigationRegistry = (input: CreateNavigationRegistryInput = {}): NavigationRegistry => {\n const resolveDispatcher = input.resolveDispatcher ?? noDispatcher;\n\n const store = createWorkbenchStore<NavigationRegistryStoreState>({\n name: \"workbench.navigation\",\n initialState: { parsers: {} },\n });\n\n const removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n };\n\n const registry: NavigationRegistry = {\n store,\n\n registerParser(parser, metadata) {\n const snapshot = store.getState();\n if (snapshot.parsers[parser.id]) throw new Error(`Navigation parser already registered: ${parser.id}`);\n\n const { priority, ...parserContribution } = parser;\n const record: RegisteredNavigationParser = {\n ...parserContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n\n store.setState({ ...snapshot, parsers: { ...snapshot.parsers, [parser.id]: record } }, false, \"registerParser\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.parsers[parser.id] !== record) return;\n store.setState({ ...current, parsers: removeKey(current.parsers, parser.id) }, false, \"unregisterParser\");\n });\n },\n\n listParsers() {\n return Object.values(store.getState().parsers).sort(byPriorityAndId);\n },\n\n resolveLocation(location) {\n const parser = this.listParsers().find((candidate) => candidate.canParse(location));\n if (!parser) throw new Error(`No navigation parser registered for location: ${location}`);\n return parser.parse(location);\n },\n\n async openTarget(target) {\n const dispatcher = resolveDispatcher();\n const items = toItems(target);\n const results: unknown[] = [];\n\n for (const item of items) validateItem(item, dispatcher);\n\n if (target.kind === \"compound\") {\n if (target.targets.some((item) => item.kind !== \"page\" && item.kind !== \"panel\"))\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n if (!dispatcher.prepareNavigation)\n throw new Error(\"navigation.openTarget: navigation preparation is not configured\");\n const prepared = dispatcher.prepareNavigation(target.targets);\n return [prepared.commit()];\n }\n for (const item of items) results.push(await dispatchItem(item, dispatcher));\n return results;\n },\n\n async openPage(target) {\n return registry.openTarget({ ...target, kind: \"page\" });\n },\n\n async openPanel(target) {\n return registry.openTarget({ ...target, kind: \"panel\" } as NavigationTargetPanel);\n },\n\n async navigate(location) {\n return registry.openTarget(registry.resolveLocation(location));\n },\n };\n\n return registry;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { TreeNode, TreeViewSection } from \"../renderers/tree-renderer-registry\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport type NavigationTreeSlot = \"header\" | \"content\" | \"footer\";\n\nexport interface NavigationTreeOwner {\n kind: \"mode\" | \"page\";\n id: string;\n extensionId: string;\n}\n\nexport interface NavigationTreeContext {\n resource?: ResourceRef;\n}\n\nexport interface NavigationTreeContribution {\n id: string;\n /** Prefix projected section and node ids when they come from an independent tree renderer. */\n idScope?: string;\n owner: NavigationTreeOwner;\n sourceExtensionId: string;\n declarationIndex: number;\n slot?: NavigationTreeSlot;\n viewId?: string;\n defaultExpandedSectionIds?: string[];\n getSections?(context: NavigationTreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getChildren?(node: TreeNode, context: NavigationTreeContext): Promise<TreeNode[]> | TreeNode[];\n}\n\nexport interface CreateNavigationTreeRegistryInput {\n subscribeViewRefresh?(viewId: string, listener: () => void): Disposable;\n getViewDefaultExpandedSectionIds?(viewId: string): readonly string[] | undefined;\n getViewSections?(viewId: string, context: NavigationTreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getViewChildren?(viewId: string, node: TreeNode, context: NavigationTreeContext): Promise<TreeNode[]> | TreeNode[];\n}\n\nexport interface NavigationTreeRegistry {\n registerContribution(contribution: NavigationTreeContribution): Disposable;\n resolveOwner(kind: NavigationTreeOwner[\"kind\"], id: string): NavigationTreeOwner | undefined;\n getSections(\n owner: NavigationTreeOwner,\n slot?: NavigationTreeSlot,\n context?: NavigationTreeContext,\n ): Promise<TreeViewSection[]>;\n getChildren(node: TreeNode, context?: NavigationTreeContext): Promise<TreeNode[]>;\n getDefaultExpandedSectionIds(owner: NavigationTreeOwner): string[];\n onDidChange(listener: () => void): Disposable;\n}\n\nconst ownerId = (owner: NavigationTreeOwner) => `${owner.kind}:${owner.extensionId}:${owner.id}`;\n\nconst ownersEqual = (left: NavigationTreeOwner, right: NavigationTreeOwner) => ownerId(left) === ownerId(right);\n\nconst contributionOrder =\n (owner: NavigationTreeOwner) => (left: NavigationTreeContribution, right: NavigationTreeContribution) => {\n const leftOwn = left.sourceExtensionId === owner.extensionId;\n const rightOwn = right.sourceExtensionId === owner.extensionId;\n if (leftOwn !== rightOwn) return leftOwn ? -1 : 1;\n if (!leftOwn) {\n const extensionOrder = left.sourceExtensionId.localeCompare(right.sourceExtensionId);\n if (extensionOrder !== 0) return extensionOrder;\n }\n return left.declarationIndex - right.declarationIndex || left.id.localeCompare(right.id);\n };\n\nconst scopedId = (scope: string | undefined, id: string) => (scope ? `${scope}:${id}` : id);\n\nconst mergeSection = (sections: TreeViewSection[], section: TreeViewSection) => {\n const index = sections.findIndex((candidate) => candidate.id === section.id);\n if (index < 0) {\n sections.push(section);\n return;\n }\n const current = sections[index]!;\n sections[index] = { ...current, nodes: [...current.nodes, ...section.nodes] };\n};\n\nexport const createNavigationTreeRegistry = (input: CreateNavigationTreeRegistryInput = {}): NavigationTreeRegistry => {\n const contributions = new Map<string, NavigationTreeContribution>();\n const nodeSources = new WeakMap<TreeNode, { contribution: NavigationTreeContribution; node: TreeNode }>();\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n\n const matching = (owner: NavigationTreeOwner, slot: NavigationTreeSlot) =>\n [...contributions.values()]\n .filter((contribution) => ownersEqual(contribution.owner, owner) && (contribution.slot ?? \"content\") === slot)\n .sort(contributionOrder(owner));\n\n const projectNode = (node: TreeNode, contribution: NavigationTreeContribution, moveScope: string): TreeNode => {\n const projected: TreeNode = {\n ...node,\n id: scopedId(contribution.idScope, node.id),\n moveScope,\n canHide: node.canHide ?? true,\n canReorder: node.canReorder ?? true,\n children: node.children?.map((child) => projectNode(child, contribution, moveScope)),\n };\n nodeSources.set(projected, { contribution, node });\n return projected;\n };\n\n const projectSection = (\n section: TreeViewSection,\n contribution: NavigationTreeContribution,\n moveScope: string,\n ): TreeViewSection => ({\n ...section,\n id: scopedId(contribution.idScope, section.id),\n moveScope,\n canHide: section.canHide ?? true,\n canReorder: section.canReorder ?? true,\n nodes: section.nodes.map((node) => projectNode(node, contribution, moveScope)),\n });\n\n return {\n registerContribution(contribution) {\n if (contributions.has(contribution.id)) {\n throw new Error(`Navigation tree contribution already registered: ${contribution.id}`);\n }\n if (!contribution.viewId && !contribution.getSections) {\n throw new Error(`Navigation tree contribution must declare a viewId or getSections: ${contribution.id}`);\n }\n contributions.set(contribution.id, contribution);\n const refreshSubscription = contribution.viewId\n ? input.subscribeViewRefresh?.(contribution.viewId, emit)\n : undefined;\n emit();\n return createDisposable(() => {\n if (contributions.get(contribution.id) !== contribution) return;\n refreshSubscription?.dispose();\n contributions.delete(contribution.id);\n emit();\n });\n },\n\n resolveOwner(kind, id) {\n return [...contributions.values()].find(\n (contribution) => contribution.owner.kind === kind && contribution.owner.id === id,\n )?.owner;\n },\n\n async getSections(owner, slot = \"content\", context = {}) {\n const sections: TreeViewSection[] = [];\n const moveScope = ownerId(owner);\n for (const contribution of matching(owner, slot)) {\n const sourceSections = contribution.viewId\n ? await input.getViewSections?.(contribution.viewId, context)\n : await contribution.getSections?.(context);\n for (const section of sourceSections ?? []) {\n mergeSection(sections, projectSection(section, contribution, moveScope));\n }\n }\n return sections;\n },\n\n async getChildren(node, context = {}) {\n const source = nodeSources.get(node);\n if (!source) return node.children ?? [];\n const moveScope = node.moveScope ?? ownerId(source.contribution.owner);\n const children = source.contribution.viewId\n ? await input.getViewChildren?.(source.contribution.viewId, source.node, context)\n : await source.contribution.getChildren?.(source.node, context);\n if (!children) return node.children ?? [];\n return children.map((child) => projectNode(child, source.contribution, moveScope));\n },\n\n getDefaultExpandedSectionIds(owner) {\n return ([\"header\", \"content\", \"footer\"] as const).flatMap((slot) =>\n matching(owner, slot).flatMap((contribution) =>\n (\n contribution.defaultExpandedSectionIds ??\n (contribution.viewId ? input.getViewDefaultExpandedSectionIds?.(contribution.viewId) : undefined) ??\n []\n ).map((id) => scopedId(contribution.idScope, id)),\n ),\n );\n },\n\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import {\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 { ResourceRef } from \"../resources/resource-registry\";\n\nexport type WorkbenchNotificationLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface WorkbenchNotificationAction {\n commandId: string;\n title: string;\n args?: unknown;\n}\n\nexport interface WorkbenchNotification {\n id?: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt?: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {\n id: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport type WorkbenchNotificationEvent =\n | { type: \"show\"; id: string; notification: RegisteredWorkbenchNotification }\n | { type: \"dismiss\"; id: string };\n\ntype WorkbenchNotificationListener = (event: WorkbenchNotificationEvent) => void;\n\nexport interface WorkbenchNotificationStoreState {\n notifications: Record<string, RegisteredWorkbenchNotification>;\n}\n\nexport interface NotificationRegistry {\n store: WorkbenchStore<WorkbenchNotificationStoreState>;\n show(notification: WorkbenchNotification, metadata?: ContributionMetadata): RegisteredWorkbenchNotification;\n dismiss(id: string): boolean;\n clear(): void;\n listNotifications(): RegisteredWorkbenchNotification[];\n subscribe(listener: WorkbenchNotificationListener): Disposable;\n}\n\nexport const createNotificationRegistry = (): NotificationRegistry => {\n const store = createWorkbenchStore<WorkbenchNotificationStoreState>({\n name: \"workbench.notifications\",\n initialState: { notifications: {} },\n });\n\n const listeners = new Set<WorkbenchNotificationListener>();\n let generatedId = 0;\n\n const emit = (event: WorkbenchNotificationEvent) => {\n for (const listener of listeners) listener(event);\n };\n\n return {\n store,\n\n show(notification, metadata) {\n let id = notification.id;\n if (!id) {\n generatedId += 1;\n id = `workbench.notification.${generatedId.toString()}`;\n }\n\n const record: RegisteredWorkbenchNotification = {\n ...normalizeContributionMetadata(metadata),\n ...notification,\n id,\n createdAt: notification.createdAt ?? new Date().toISOString(),\n };\n\n const snapshot = store.getState();\n store.setState({ notifications: { ...snapshot.notifications, [id]: record } }, false, \"showNotification\");\n emit({ type: \"show\", id, notification: record });\n\n return record;\n },\n\n dismiss(id) {\n const snapshot = store.getState();\n if (!snapshot.notifications[id]) return false;\n const { [id]: _removed, ...rest } = snapshot.notifications;\n store.setState({ notifications: rest }, false, \"dismissNotification\");\n emit({ type: \"dismiss\", id });\n return true;\n },\n\n clear() {\n const ids = Object.keys(store.getState().notifications);\n store.setState({ notifications: {} }, false, \"clearNotifications\");\n for (const id of ids) emit({ type: \"dismiss\", id });\n },\n\n listNotifications() {\n return Object.values(store.getState().notifications).sort((left, right) =>\n right.createdAt.localeCompare(left.createdAt),\n );\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return createDisposable(() => {\n listeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchOverlayContribution extends Omit<WorkbenchPlacementPresentation, \"mountStrategy\"> {\n id: string;\n viewId: string;\n closable?: boolean;\n}\n\nexport interface OpenWorkbenchOverlayInput {\n resource?: ResourceRef;\n title?: string;\n}\n\nexport interface WorkbenchOverlayRegistry {\n registerOverlay(overlay: WorkbenchOverlayContribution): Disposable;\n getOverlay(id: string): WorkbenchOverlayContribution | undefined;\n listOverlays(): WorkbenchOverlayContribution[];\n openOverlay(id: string, input?: OpenWorkbenchOverlayInput): string;\n closeOverlay(instanceId: string): void;\n}\n\nconst overlayContributionId = (id: string) => `workbench.overlay.${encodeURIComponent(id)}`;\n\nexport const createWorkbenchOverlayRegistry = (input: {\n layout: LayoutModel;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}): WorkbenchOverlayRegistry => {\n const overlays = new Map<string, WorkbenchOverlayContribution>();\n const registrations = new Map<string, Disposable>();\n\n return {\n registerOverlay(overlay) {\n if (overlays.has(overlay.id)) throw new Error(`Overlay already registered: ${overlay.id}`);\n const record = { ...overlay };\n const registration = registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...record,\n id: overlayContributionId(record.id),\n region: \"overlay\",\n role: \"content\",\n singleton: true,\n closable: record.closable ?? true,\n },\n input.viewMenus,\n );\n overlays.set(record.id, record);\n registrations.set(record.id, registration);\n return {\n dispose() {\n if (overlays.get(record.id) !== record) return;\n overlays.delete(record.id);\n registrations.delete(record.id);\n registration.dispose();\n },\n };\n },\n\n getOverlay: (id) => overlays.get(id),\n\n listOverlays: () => [...overlays.values()].sort((left, right) => left.id.localeCompare(right.id)),\n\n openOverlay(id, openInput = {}) {\n if (!overlays.has(id)) throw new Error(`Unknown overlay: ${id}`);\n return input.layout.openPanel(overlayContributionId(id), {\n viewId: overlays.get(id)?.viewId,\n resource: openInput.resource,\n title: openInput.title,\n closable: overlays.get(id)?.closable ?? true,\n strategy: { kind: \"persistent\" },\n }).instanceId;\n },\n\n closeOverlay(instanceId) {\n input.layout.removeWidgetPlacement(instanceId);\n },\n };\n};\n","import type { ResourceBinding } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageSlot } from \"./page-registry-types\";\n\nexport const PAGE_MAIN_SLOT_ID = \"$main\";\n\nexport interface ResolvedPageSlot extends WorkbenchPageSlot {\n readonly role: \"primary\" | \"auxiliary\";\n}\n\nexport const primarySlot = (page: WorkbenchPageContribution): ResolvedPageSlot | undefined => {\n if (page.main.kind !== \"view\") return undefined;\n const { kind: _kind, view, cardinality, ...presentation } = page.main;\n const binding: ResourceBinding | undefined = page.resource ? { ...page.resource, view, cardinality } : undefined;\n return {\n ...presentation,\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: binding ? { kind: \"binding\", binding } : { kind: \"view\", view, presence: \"fixed\" },\n };\n};\n\nexport const pageSlots = (page: WorkbenchPageContribution): ResolvedPageSlot[] => {\n const main = primarySlot(page);\n return [...(main ? [main] : []), ...page.slots.map((slot) => ({ ...slot, role: \"auxiliary\" as const }))];\n};\n\nexport const requirePageSlot = (page: WorkbenchPageContribution, slotId: string) => {\n const slot = pageSlots(page).find((candidate) => candidate.id === slotId);\n if (!slot) throw new Error(`Unknown page slot: ${page.id}.${slotId}`);\n return slot;\n};\n\nexport const emptyMainSlot = (page: WorkbenchPageContribution): ResolvedPageSlot | undefined => {\n if (page.main.kind !== \"panels\") return undefined;\n return {\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: { kind: \"view\", view: page.main.empty, presence: \"fixed\" },\n };\n};\nexport const pagePlacementDeclarations = (page: WorkbenchPageContribution) => {\n const empty = emptyMainSlot(page);\n return [...pageSlots(page), ...(empty ? [empty] : [])];\n};\n","import type { PageOpenIntent, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport { primarySlot, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageOpenInput,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"./page-registry-types\";\n\nexport { primarySlot, requirePageSlot } from \"./page-main\";\n\nexport const emptyPageState = (page: WorkbenchPageContribution): WorkbenchPageRuntimeState => ({\n openStaticSlotIds: page.slots\n .filter((slot) => slot.item.kind === \"view\" && slot.item.presence === \"open\")\n .map((slot) => slot.id),\n resourceInstances: {},\n});\n\nexport const staticSlotOpen = (slot: ResolvedPageSlot, state: WorkbenchPageRuntimeState) =>\n slot.item.kind === \"view\" && (slot.item.presence === \"fixed\" || state.openStaticSlotIds.includes(slot.id));\n\nconst nextResourceInstances = (\n slot: ResolvedPageSlot,\n current: readonly WorkbenchPageSlotInstance[],\n instance: WorkbenchPageSlotInstance,\n) => {\n if (slot.item.kind !== \"binding\" || slot.item.binding.cardinality !== \"many\") return [instance];\n const existing = current.find((candidate) => candidate.instanceKey === instance.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || instance.open === \"pin\" ? \"pin\" : \"preview\";\n return [\n ...current.filter(\n (candidate) => candidate.instanceKey !== instance.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n ),\n { ...instance, open },\n ];\n};\n\nexport const openResourceSlot = (input: {\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { slot, state, target } = input;\n if (slot.item.kind !== \"binding\") throw new Error(`Page slot \"${slot.id}\" does not accept a resource`);\n const binding = slot.item.binding;\n if (!target.resource) throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (!resourceMatchesConstraint(binding, target.resource))\n throw new Error(`Page slot \"${slot.id}\" does not accept resource kind \"${target.resource.type}\"`);\n if (target.open && binding.cardinality !== \"many\")\n throw new Error(`Page slot \"${slot.id}\" accepts open intent only with many cardinality`);\n const instanceKey = input.resourceKey(target.resource);\n const instance: WorkbenchPageSlotInstance = {\n instanceKey,\n resource: target.resource,\n ...(target.section ? { section: target.section } : {}),\n ...(binding.cardinality === \"many\" ? { open: target.open ?? \"preview\" } : {}),\n };\n return {\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slot.id]: nextResourceInstances(slot, state.resourceInstances[slot.id] ?? [], instance),\n },\n ...(slot.role === \"primary\" ? { activePrimaryInstanceKey: instanceKey } : {}),\n } satisfies WorkbenchPageRuntimeState;\n};\n\nexport const selectPrimaryTarget = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, target } = input;\n if (page.resource) {\n if (!target.resource) throw new Error(`Page \"${page.id}\" requires a resource`);\n if (!resourceMatchesConstraint(page.resource, target.resource))\n throw new Error(`Page \"${page.id}\" does not accept resource kind \"${target.resource.type}\"`);\n } else if (target.resource) throw new Error(`Page \"${page.id}\" does not accept a resource`);\n const slot = primarySlot(page);\n if (!slot) {\n if (target.open) throw new Error(`Panel collection page \"${page.id}\" does not accept an open intent`);\n return input.state;\n }\n if (target.resource) return openResourceSlot({ ...input, slot });\n if (target.open) throw new Error(`Page \"${page.id}\" accepts open intent only with a resource`);\n return { ...input.state, activePrimaryInstanceKey: \"default\" };\n};\n\nexport const pageResourceBindingSlots = (page: WorkbenchPageContribution, resource: ResourceRef | undefined) =>\n page.slots.filter(\n (slot) =>\n slot.item.kind === \"binding\" &&\n slot.openOn === \"page-resource\" &&\n resource &&\n resourceMatchesConstraint(slot.item.binding, resource),\n );\n\nexport const openPageResourceBindings = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n if (!input.target.resource) return input.state;\n return pageResourceBindingSlots(input.page, input.target.resource).reduce(\n (state, slot) =>\n openResourceSlot({\n slot: { ...slot, role: \"auxiliary\" },\n state,\n target: { pageId: input.page.id, resource: input.target.resource },\n resourceKey: input.resourceKey,\n }),\n input.state,\n );\n};\n\nexport const setStaticSlotOpen = (state: WorkbenchPageRuntimeState, slotId: string, open: boolean) => {\n const ids = new Set(state.openStaticSlotIds);\n if (open) ids.add(slotId);\n else ids.delete(slotId);\n return { ...state, openStaticSlotIds: [...ids] };\n};\n\nexport const removeResourceInstance = (state: WorkbenchPageRuntimeState, slotId: string, instanceKey: string) => ({\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slotId]: (state.resourceInstances[slotId] ?? []).filter((instance) => instance.instanceKey !== instanceKey),\n },\n});\n\nexport type ClosePageSlotResult =\n | { kind: \"stay\"; state: WorkbenchPageRuntimeState; activateInstanceKey?: string }\n | { kind: \"parent\"; state: WorkbenchPageRuntimeState; parentId: string };\n\nexport const closePageSlot = (input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n instanceKey: string;\n}): ClosePageSlotResult => {\n const { page, slot, instanceKey } = input;\n if (slot.item.kind === \"view\" && slot.item.presence === \"fixed\")\n throw new Error(`Page slot \"${slot.id}\" is fixed and cannot close`);\n const state =\n instanceKey === \"default\"\n ? setStaticSlotOpen(input.state, slot.id, false)\n : removeResourceInstance(input.state, slot.id, instanceKey);\n if (slot.role === \"auxiliary\") return { kind: \"stay\", state };\n const remaining = state.resourceInstances[slot.id] ?? [];\n if (remaining.length) {\n const previous = state.activePrimaryInstanceKey;\n const activateInstanceKey = previous && previous !== instanceKey ? previous : remaining.at(-1)?.instanceKey;\n return { kind: \"stay\", state: { ...state, activePrimaryInstanceKey: activateInstanceKey }, activateInstanceKey };\n }\n if (!page.parentId) throw new Error(`Resource page has no parent: ${page.id}`);\n return { kind: \"parent\", state, parentId: page.parentId };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\nimport type { WorkbenchPageCloseResolution } from \"./page-registry-internals\";\nimport type { WorkbenchPageContribution, WorkbenchPageRegistryStoreState } from \"./page-registry-types\";\nimport { closePageSlot, emptyPageState, requirePageSlot } from \"./page-slot-lifecycle\";\n\nexport const resolvePagePlacementClose = <Value>(input: {\n identity: PlacementIdentity;\n page: WorkbenchPageContribution;\n state: WorkbenchPageRegistryStoreState<Value>;\n resourceKey(resource: ResourceRef): string;\n stateKey: string;\n}): WorkbenchPageCloseResolution => {\n const { identity, page, state } = input;\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n if (state.activePageId !== identity.pageId) throw new Error(`Page is not active: ${identity.pageId}`);\n const slot = requirePageSlot(page, identity.slotId);\n const exists = state.placements.some(\n (candidate) => placementIdentityKey(candidate.identity) === placementIdentityKey(identity),\n );\n if (!exists) throw new Error(`Page placement is not open: ${placementIdentityKey(identity)}`);\n if (slot.role === \"primary\" && identity.instanceKey === \"default\") {\n throw new Error(`Static primary placement is not closable: ${page.id}.${slot.id}`);\n }\n\n const pageState = state.pageStates[input.stateKey] ?? emptyPageState(page);\n const closedActivePrimary = slot.role === \"primary\" && pageState.activePrimaryInstanceKey === identity.instanceKey;\n const result = closePageSlot({ page, slot, state: pageState, instanceKey: identity.instanceKey });\n const pageStates = { ...state.pageStates, [input.stateKey]: result.state };\n if (result.kind === \"parent\") return { kind: \"parent\", pageStates, parentId: result.parentId };\n if (slot.role === \"auxiliary\") {\n if (!state.location) throw new Error(\"Active page has no canonical location\");\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n },\n locationChanged: false,\n };\n }\n const activeInstanceKey = result.state.activePrimaryInstanceKey;\n const activeInstance = (result.state.resourceInstances[slot.id] ?? []).find(\n (instance) => instance.instanceKey === activeInstanceKey,\n );\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(activeInstance?.resource ? { resource: activeInstance.resource } : {}),\n ...(activeInstance?.section ? { section: activeInstance.section } : {}),\n ...(activeInstance?.open ? { open: activeInstance.open } : {}),\n },\n locationChanged: closedActivePrimary,\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { workbenchPageLocationKey } from \"../../controllers/page-location/page-location-normalization\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"./page-registry-types\";\n\nexport const pageStateKey = (\n page: WorkbenchPageContribution,\n location: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) =>\n page.main.kind === \"panels\" && location ? `${page.id}|${workbenchPageLocationKey(location, resources)}` : page.id;\n\nexport const removePageStates = <State>(states: Readonly<Record<string, State>>, pageId: string) =>\n Object.fromEntries(Object.entries(states).filter(([key]) => key !== pageId && !key.startsWith(`${pageId}|`)));\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport const pinPagePlacement = <Value>(\n state: WorkbenchPageRegistryStoreState<Value>,\n identity: PlacementIdentity,\n resources: WorkbenchPageResourceCodec,\n) => {\n if (identity.kind !== \"page\" || state.activePageId !== identity.pageId)\n throw new Error(\"Only an active page placement can be pinned\");\n const page = state.pages[identity.pageId]!;\n const key = pageStateKey(page, state.location, resources);\n const current = state.pageStates[key]!;\n const instances = current.resourceInstances[identity.slotId] ?? [];\n if (!instances.some((instance) => instance.instanceKey === identity.instanceKey))\n throw new Error(\"Only an open resource placement can be pinned\");\n return {\n ...state,\n pageStates: {\n ...state.pageStates,\n [key]: {\n ...current,\n resourceInstances: {\n ...current.resourceInstances,\n [identity.slotId]: instances.map((instance) =>\n instance.instanceKey === identity.instanceKey ? { ...instance, open: \"pin\" as const } : instance,\n ),\n },\n },\n },\n };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"../../shared/contributions/reference-id\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport { PAGE_MAIN_SLOT_ID, pageSlots, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPagePlacementInput,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\nimport { pageResourceBindingSlots, staticSlotOpen } from \"./page-slot-lifecycle\";\n\nexport const pagePlacementIdentity = (pageId: string, slotId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"page\",\n pageId,\n slotId,\n instanceKey,\n});\n\nexport const pageFollowerIdentities = (\n page: WorkbenchPageContribution,\n resource: ResourceRef | undefined,\n resourceKey: (resource: ResourceRef) => string,\n) => {\n if (!resource) return [];\n return pageResourceBindingSlots(page, resource)\n .filter((slot) => slot.region !== \"main\")\n .filter((slot, index, slots) => slots.findIndex((candidate) => candidate.region === slot.region) === index)\n .map((slot) => pagePlacementIdentity(page.id, slot.id, resourceKey(resource)));\n};\n\nconst validatePageSlots = (page: WorkbenchPageContribution) => {\n const ids = new Set<string>();\n for (const slot of page.slots) {\n if (slot.id === PAGE_MAIN_SLOT_ID || ids.has(slot.id))\n throw new Error(`Page \"${page.id}\" declares duplicate or reserved slot \"${slot.id}\"`);\n ids.add(slot.id);\n if (slot.item.kind === \"binding\" && slot.item.binding.kinds.length === 0)\n throw new Error(`Page slot \"${slot.id}\" must bind at least one resource kind`);\n if (slot.openOn && slot.item.kind !== \"binding\")\n throw new Error(`Page slot \"${slot.id}\" requires a binding for openOn`);\n }\n};\n\nexport const validateWorkbenchPage = (page: WorkbenchPageContribution) => {\n if (page.ref.kind !== \"page\" || !page.ref.extensionId || !page.ref.id)\n throw new Error(`Page \"${page.id}\" must declare a normalized page ref`);\n if (page.path.startsWith(\"/\") || page.path.endsWith(\"/\"))\n throw new Error(`Page \"${page.id}\" must declare a normalized path`);\n if (!page.main || (page.main.kind !== \"view\" && page.main.kind !== \"panels\"))\n throw new Error(`Page \"${page.id}\" must declare Main content or a panel collection`);\n if (page.resource && page.resource.kinds.length === 0)\n throw new Error(`Page \"${page.id}\" must accept at least one resource kind`);\n if (page.main.kind === \"view\" && page.main.cardinality === \"many\" && !page.resource)\n throw new Error(`Page \"${page.id}\" requires a resource for many cardinality`);\n if (page.main.kind === \"view\" && page.resource && !page.parentId)\n throw new Error(`Resource page \"${page.id}\" must declare a parent`);\n validatePageSlots(page);\n};\n\nconst placementFor = <Value>(input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n instanceKey: string;\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n resource?: ResourceRef;\n section?: WorkbenchPagePlacementInput[\"section\"];\n open?: WorkbenchPagePlacementInput[\"open\"];\n}) => {\n const item = input.slot.item;\n const view = item.kind === \"view\" ? item.view : item.binding.view;\n const identity = pagePlacementIdentity(input.page.id, input.slot.id, input.instanceKey);\n return {\n identity,\n region: input.slot.region,\n order: input.slot.order ?? 0,\n value: input.resolvePagePlacement({\n identity,\n pageId: input.page.id,\n slotId: input.slot.id,\n role: input.slot.role,\n viewId: contributionRefId(view),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n ...(input.open ? { open: input.open } : {}),\n closable: item.kind === \"binding\" || item.presence !== \"fixed\",\n }),\n } satisfies ResolvedOwnedPlacement<Value>;\n};\n\nexport const resolvePagePlacements = <Value>(input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n resource?: ResourceRef;\n sharedPlacements: readonly ResolvedOwnedPlacement<Value>[];\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n}) => {\n const placements: ResolvedOwnedPlacement<Value>[] = [];\n for (const slot of pageSlots(input.page)) {\n if (staticSlotOpen(slot, input.state)) placements.push(placementFor({ ...input, slot, instanceKey: \"default\" }));\n for (const instance of input.state.resourceInstances[slot.id] ?? []) {\n placements.push(placementFor({ ...input, slot, ...instance }));\n }\n }\n if (\n input.page.main.kind === \"panels\" &&\n ![...placements, ...input.sharedPlacements].some((placement) => placement.region === \"main\")\n ) {\n placements.push(\n placementFor({\n ...input,\n instanceKey: \"default\",\n slot: {\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: { kind: \"view\", view: input.page.main.empty, presence: \"fixed\" },\n },\n }),\n );\n }\n return placements;\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n type ResolvedOwnedPlacement,\n} from \"../layout/placement-reconciliation\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport interface PageRegistryCommitInput<Value> {\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n projectId?: string;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n activePageId?: string;\n activeModeId?: string;\n modePlacements?: readonly ResolvedOwnedPlacement<Value>[];\n activate?: readonly PlacementIdentity[];\n action: string;\n}\n\nexport const createPageRegistryStore = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) =>\n createWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>({\n name: \"workbench.pages\",\n initialState: {\n pages: {},\n pageStates: {},\n placements: composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements,\n reconciliation: emptyReconciliation(),\n },\n });\n\nexport const resolveModePlacementSet = <Value>(input: {\n current: WorkbenchPageRegistryStoreState<Value>;\n modeId: string | undefined;\n desired: readonly ResolvedOwnedPlacement<Value>[] | undefined;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n projectId?: string;\n pageId?: string;\n resolveModePlacements: CreateWorkbenchPageRegistryInput<Value>[\"resolveModePlacements\"];\n}) => {\n if (!input.modeId) return undefined;\n if (input.desired) return input.desired;\n if (input.modeId !== input.current.activeModeId || input.projectId !== input.current.projectId)\n return input.resolveModePlacements(input.modeId, input.location, input.projectId, input.pageId);\n return input.current.placements.filter(\n (placement) => placement.identity.kind === \"mode\" && placement.identity.modeId === input.modeId,\n );\n};\n\nexport const refreshActiveModePlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n const modeId = input.state.activeModeId;\n if (!modeId) return;\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: modeId,\n modePlacements: input.registryInput.resolveModePlacements(modeId),\n action: \"refreshModePlacements\",\n });\n};\n\nexport const refreshShellPlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: input.state.activeModeId,\n action: \"refreshShellPlacements\",\n });\n};\n","import { resourceKey as resourceIdentity } from \"@pstdio/sdk/extensions\";\nimport {\n composeOwnedPlacements,\n type ResolvedOwnedPlacement,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { pageFollowerIdentities, pagePlacementIdentity, resolvePagePlacements } from \"./page-placement-resolver\";\nimport type { WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport { type PageRegistryCommitInput, resolveModePlacementSet } from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\nimport {\n emptyPageState,\n openPageResourceBindings,\n openResourceSlot,\n primarySlot,\n requirePageSlot,\n selectPrimaryTarget,\n setStaticSlotOpen,\n} from \"./page-slot-lifecycle\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport interface PreparedOwnedPlacements<Value> {\n shell: readonly ResolvedOwnedPlacement<Value>[];\n mode: readonly ResolvedOwnedPlacement<Value>[];\n}\nexport const createPagePreparation = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) => {\n const normalizeResource = input.resources.normalize;\n const resourceKey = (resource: Parameters<typeof normalizeResource>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const requirePage = (current: WorkbenchPageRegistryStoreState<Value>, pageId: string) => {\n const page = current.pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n const compose = (\n current: WorkbenchPageRegistryStoreState<Value>,\n next: PageRegistryCommitInput<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const page = next.activePageId ? current.pages[next.activePageId] : undefined;\n const pageState = page ? next.pageStates[pageStateKey(page, next.location, input.resources)] : undefined;\n if (next.activeModeId) input.validateMode?.(next.activeModeId);\n const modePlacements =\n owned?.mode ??\n resolveModePlacementSet({\n current,\n modeId: next.activeModeId,\n desired: next.modePlacements,\n location: next.location,\n projectId: next.projectId,\n pageId: next.activePageId,\n resolveModePlacements: input.resolveModePlacements,\n });\n if (\n next.activeModeId &&\n modePlacements?.some(\n (placement) => placement.identity.kind !== \"mode\" || placement.identity.modeId !== next.activeModeId,\n )\n )\n throw new Error(`Mode placement owner does not match active mode: ${next.activeModeId}`);\n const shell =\n owned?.shell ??\n input.resolveShellPlacements(\n next.activeModeId\n ? { modeId: next.activeModeId, pageId: next.activePageId, projectId: next.projectId, location: next.location }\n : undefined,\n );\n const composed = composeOwnedPlacements({\n shell,\n mode: modePlacements,\n ...(page && pageState\n ? {\n page: resolvePagePlacements({\n page,\n state: pageState,\n resource: next.location?.resource,\n sharedPlacements: [...shell, ...(modePlacements ?? [])],\n resolvePagePlacement: input.resolvePagePlacement,\n }),\n }\n : {}),\n });\n const reconciliation = reconcileOwnedPlacements({\n current: current.placements,\n desired: composed.placements,\n activate: next.activate,\n valuesEqual: input.valuesEqual,\n });\n return {\n ...current,\n pageStates: next.pageStates,\n projectId: next.projectId,\n location: next.location,\n activePageId: next.activePageId,\n activeModeId: next.activeModeId,\n placements: composed.placements,\n reconciliation,\n };\n };\n const location = (\n target: WorkbenchPageLocationCommitInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const pageStates = target.pageStates ?? current.pageStates;\n const page = requirePage(current, target.pageId);\n const normalizedTarget = {\n ...target,\n ...(target.resource ? { resource: normalizeResource(target.resource) } : {}),\n };\n const stateKey = pageStateKey(page, target.location, input.resources);\n const currentPageState =\n pageStates[stateKey] ?? input.restorePageState?.(page, target.location, target.projectId) ?? emptyPageState(page);\n const primaryState = selectPrimaryTarget({ page, state: currentPageState, target: normalizedTarget, resourceKey });\n const openFollowers =\n !target.pageStates ||\n current.activePageId !== page.id ||\n resourceIdentity(current.location?.resource) !== resourceIdentity(normalizedTarget.resource) ||\n current.pageStates[stateKey]?.activePrimaryInstanceKey !== primaryState.activePrimaryInstanceKey;\n const pageState = openFollowers\n ? openPageResourceBindings({ page, state: primaryState, target: normalizedTarget, resourceKey })\n : primaryState;\n const primary = primarySlot(page);\n const instanceKey = pageState.activePrimaryInstanceKey;\n const followers = openFollowers ? pageFollowerIdentities(page, normalizedTarget.resource, resourceKey) : [];\n return compose(\n current,\n {\n pageStates: { ...pageStates, [stateKey]: pageState },\n projectId: target.projectId,\n location: target.location,\n activePageId: page.id,\n activeModeId: page.modeId,\n activate: [\n ...(primary && instanceKey ? [pagePlacementIdentity(page.id, primary.id, instanceKey)] : []),\n ...followers,\n ],\n action: target.action,\n },\n owned,\n );\n };\n const slot = (\n target: WorkbenchPageSlotOpenInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n if (current.activePageId !== target.pageId) throw new Error(`Page is not active: ${target.pageId}`);\n const page = requirePage(current, target.pageId);\n const slot = requirePageSlot(page, target.slotId);\n if (slot.role !== \"auxiliary\") throw new Error(`Page slot is not an auxiliary panel: ${page.id}.${slot.id}`);\n const stateKey = pageStateKey(page, current.location, input.resources);\n let pageState = current.pageStates[stateKey] ?? emptyPageState(page);\n let instanceKey = \"default\";\n const resource = target.resource ? normalizeResource(target.resource) : undefined;\n if (resource) {\n instanceKey = resourceKey(resource);\n pageState = openResourceSlot({\n slot,\n state: pageState,\n target: { ...target, resource },\n resourceKey: () => instanceKey,\n });\n } else {\n if (slot.item.kind === \"binding\") throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (target.open) throw new Error(`Page slot \"${slot.id}\" accepts open intent only with a resource`);\n if (slot.item.presence !== \"fixed\") pageState = setStaticSlotOpen(pageState, slot.id, true);\n }\n return compose(\n current,\n {\n ...current,\n pageStates: { ...current.pageStates, [stateKey]: pageState },\n activate: [pagePlacementIdentity(page.id, slot.id, instanceKey)],\n action: \"openPageSlot\",\n },\n owned,\n );\n };\n return { compose, location, slot };\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { validateWorkbenchPage } from \"./page-placement-resolver\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageRegistryStoreState,\n} from \"./page-registry-types\";\nimport { removePageStates } from \"./page-state-key\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport const registerWorkbenchPage = <Value>(input: {\n page: WorkbenchPageContribution;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n store: InternalWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>;\n publishState(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n normalizeResource(resource: ResourceRef): ResourceRef;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, store } = input;\n validateWorkbenchPage(page);\n const current = store.getState();\n if (current.pages[page.id]) throw new Error(`Page already registered: ${page.id}`);\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.ref.id === page.ref.id,\n )\n ) {\n throw new Error(`Page ref already registered: ${page.ref.extensionId}.${page.ref.id}`);\n }\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.path === page.path,\n )\n ) {\n throw new Error(`Page route already registered: ${page.ref.extensionId}.${page.path}`);\n }\n const registered = {\n ...page,\n ref: { ...page.ref },\n slots: page.slots.map((slot) => ({ ...slot })),\n };\n const placementRegistration = input.registryInput.registerPagePlacements?.(registered);\n store.setState(\n {\n ...current,\n pages: { ...current.pages, [page.id]: registered },\n reconciliation: emptyReconciliation(),\n },\n false,\n \"registerPage\",\n );\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.pages[page.id] !== registered) return;\n const { [page.id]: _page, ...pages } = snapshot.pages;\n const pageStates = removePageStates(snapshot.pageStates, page.id);\n if (snapshot.activePageId === page.id) {\n const placements = composeOwnedPlacements({ shell: input.registryInput.resolveShellPlacements() }).placements;\n input.publishState(\n {\n ...snapshot,\n pages,\n pageStates,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: snapshot.placements,\n desired: placements,\n valuesEqual: input.registryInput.valuesEqual,\n }),\n },\n \"unregisterActivePage\",\n );\n placementRegistration?.dispose();\n return;\n }\n store.setState({ ...snapshot, pages, pageStates, reconciliation: emptyReconciliation() }, false, \"unregisterPage\");\n placementRegistration?.dispose();\n });\n};\n","import { createDisposable } from \"../../shared/disposable\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { composeOwnedPlacements, reconcileOwnedPlacements } from \"../layout/placement-reconciliation\";\nimport { resolvePagePlacementClose } from \"./page-placement-close\";\nimport { pinPagePlacement } from \"./page-placement-pin\";\nimport { createPagePreparation } from \"./page-preparation\";\nimport { registerWorkbenchPage } from \"./page-registration\";\nimport { setWorkbenchPageRegistryInternals, type WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport {\n createPageRegistryStore,\n type PageRegistryCommitInput,\n refreshActiveModePlacements,\n refreshShellPlacements,\n} from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n} from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageMain,\n WorkbenchPageOpenInput,\n WorkbenchPagePlacementInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlot,\n WorkbenchPageSlotInstance,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\n\nexport const createWorkbenchPageRegistry = <Value>(\n input: CreateWorkbenchPageRegistryInput<Value>,\n): WorkbenchPageRegistry<Value> => {\n const normalizeResource = (resource: Parameters<WorkbenchPageResourceCodec[\"normalize\"]>[0]) =>\n input.resources.normalize(resource);\n const resourceKey = (resource: Parameters<WorkbenchPageResourceCodec[\"toUri\"]>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const store = createPageRegistryStore(input);\n let runtime: ((state: WorkbenchPageRegistryStoreState<Value>) => void) | undefined;\n let publishingState: WorkbenchPageRegistryStoreState<Value> | undefined;\n\n const publishState = (state: WorkbenchPageRegistryStoreState<Value>, action: string) =>\n batchWorkbenchChanges(() => {\n const storeBeforeRuntime = store.getState();\n const previousPublishingState = publishingState;\n publishingState = state;\n try {\n runtime?.(state);\n } finally {\n publishingState = previousPublishingState;\n }\n // A layout listener may synchronously commit a panel opened for the new page.\n // That nested commit already includes this state and must not be overwritten.\n if (store.getState() === storeBeforeRuntime) store.setState(state, false, action);\n });\n\n const requirePage = (pageId: string) => {\n const page = store.getState().pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n\n const prepare = createPagePreparation(input);\n const commit = (next: PageRegistryCommitInput<Value>) =>\n publishState(prepare.compose(publishingState ?? store.getState(), next), next.action);\n const activatePageWithStates = (target: WorkbenchPageLocationCommitInput) =>\n publishState(prepare.location(target, store.getState()), target.action);\n\n const registry: WorkbenchPageRegistry<Value> = {\n store,\n\n registerPage(page) {\n return registerWorkbenchPage({\n page,\n registryInput: input,\n store,\n publishState,\n normalizeResource,\n resourceKey,\n });\n },\n\n getPage(pageId) {\n return store.getState().pages[pageId];\n },\n\n listPages() {\n return Object.values(store.getState().pages).sort((left, right) => left.id.localeCompare(right.id));\n },\n\n pinPlacement(identity) {\n commit({ ...pinPagePlacement(store.getState(), identity, input.resources), action: \"pinPagePlacement\" });\n },\n\n openSlot(target) {\n publishState(prepare.slot(target, store.getState()), \"openPageSlot\");\n },\n };\n\n setWorkbenchPageRegistryInternals(registry, {\n resources: input.resources,\n prepare,\n publish: publishState,\n onDidCommit: (listener) => createDisposable(store.api.subscribe(listener)),\n getPublishingState: () => publishingState ?? store.getState(),\n connectRuntime(apply) {\n if (runtime) throw new Error(\"Workbench page registry already has a runtime\");\n runtime = apply;\n try {\n apply(store.getState());\n } catch (error) {\n runtime = undefined;\n throw error;\n }\n return createDisposable(() => {\n if (runtime === apply) runtime = undefined;\n });\n },\n refreshModePlacements() {\n refreshActiveModePlacements({ state: publishingState ?? store.getState(), registryInput: input, commit });\n },\n refreshShellPlacements() {\n refreshShellPlacements({ state: publishingState ?? store.getState(), commit });\n },\n activateLocation: activatePageWithStates,\n clearProject(projectId) {\n const current = store.getState();\n const placements = composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements;\n const pageStates = {};\n publishState(\n {\n ...current,\n pageStates,\n projectId,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: current.placements,\n desired: placements,\n valuesEqual: input.valuesEqual,\n }),\n },\n \"clearPageProject\",\n );\n },\n resolveClosePlacement(identity) {\n const current = store.getState();\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n return resolvePagePlacementClose({\n identity,\n page: requirePage(identity.pageId),\n state: current,\n stateKey: pageStateKey(requirePage(identity.pageId), current.location, input.resources),\n resourceKey,\n });\n },\n });\n\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { WorkbenchRegion, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchPlaceholderContribution {\n id: string;\n viewId: string;\n title?: string;\n region: WorkbenchRegion;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchPlaceholderRegistry {\n registerPlaceholder(placeholder: WorkbenchPlaceholderContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nexport const createWorkbenchPlaceholderRegistry = (input: {\n layout: Pick<LayoutModel, \"registerPlaceholder\">;\n views: WorkbenchViewRegistry;\n}): WorkbenchPlaceholderRegistry => ({\n registerPlaceholder(placeholder, metadata) {\n const view = input.views.getView(placeholder.viewId);\n if (!view) throw new Error(`Workbench placeholder view is not registered: ${placeholder.viewId}`);\n return input.layout.registerPlaceholder(\n {\n ...placeholder,\n title: placeholder.title ?? view.title,\n rendererId: view.id,\n },\n metadata,\n );\n },\n});\n","import type { PageOpenIntent, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\nimport {\n type OwnedPlacementLocationContext,\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"./owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"./owned-placement-restoration\";\nexport interface WorkbenchShellPlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: WorkbenchRegion;\n readonly order?: number;\n}\nexport interface OpenWorkbenchShellPlacementInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface WorkbenchShellPlacementRegistry {\n registerPlacement(placement: WorkbenchShellPlacementContribution): Disposable;\n getPlacement(placementId: string): WorkbenchShellPlacementContribution | undefined;\n listPlacements(): WorkbenchShellPlacementContribution[];\n openPlacement(input: OpenWorkbenchShellPlacementInput): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: {\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\nexport const shellPlacementContributionId = (placementId: string) =>\n `workbench.shell-placement.${encodeURIComponent(placementId)}`;\nconst identityFor = (placementId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"shell\",\n placementId,\n instanceKey,\n});\nconst roleForRegion = (region: WorkbenchRegion): WorkbenchWidgetRole => {\n if (region === \"main\") return \"location\";\n if (region === \"secondary\" || region === \"side\") return \"sub-panel\";\n return \"content\";\n};\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\nexport const createWorkbenchShellPlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n activatePanel(instanceId: string): unknown;\n getLayout(): WorkbenchLayout;\n getScope?(): string | undefined;\n resolveScope?(context: OwnedPlacementLocationContext): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n enteredWithPersistedLayout(): boolean;\n onDidChangePersistenceScope(listener: () => void): Disposable;\n}): WorkbenchShellPlacementRegistry => {\n const placements = new Map<string, WorkbenchShellPlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Shell placement\";\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"shell placement subscriber\", listener));\n };\n // A restored layout snapshot is the user's saved choice: placements present in\n // it are open, optional placements missing from it are closed. A scope without\n // a snapshot starts from each placement's declared presence.\n const restorePlacement = (placement: WorkbenchShellPlacementContribution) => {\n if (!input.enteredWithPersistedLayout()) {\n clearOwnedPlacementState(state, placement.id);\n return;\n }\n state = restoreOwnedPlacementState({\n state,\n declarations: [placement],\n saved: Object.values(input.getLayout().regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n };\n input.onDidChangePersistenceScope(() => {\n for (const placement of placements.values()) restorePlacement(placement);\n notifyWorkbenchChange(placements, emitChange);\n });\n const resolve = (\n placement: WorkbenchShellPlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const panel = input.getPanel(shellPlacementContributionId(placement.id));\n if (!panel) throw new Error(`Workbench shell placement is not registered: ${placement.id}`);\n const identity = identityFor(placement.id, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.shell.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: roleForRegion(placement.region),\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state, previousContext) {\n if (!input.resolveScope) return current;\n const scope = input.resolveScope(context);\n const previousScope = previousContext ? input.resolveScope(previousContext) : input.getScope?.();\n if (scope === previousScope) return current;\n if (scope === input.getScope?.()) return state;\n const layout = input.loadLayout?.(context);\n if (!layout) return createOwnedPlacementState();\n return restoreOwnedPlacementState({\n state: createOwnedPlacementState(),\n declarations: [...placements.values()],\n saved: Object.values(layout.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n adopt(_modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: [...placements.values()],\n saved,\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown shell placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement.id, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(_modeId, current = state) {\n return [...placements.values()].flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchShellPlacementRegistry = {\n registerPlacement(placement) {\n if (placements.has(placement.id)) throw new Error(`Shell placement already registered: ${placement.id}`);\n if (!input.views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench shell placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n validateOwnedPlacementItem(label, placement.id, placement.item);\n const registered = { ...placement, item: { ...placement.item } };\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: shellPlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: roleForRegion(registered.region),\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n if (input.enteredWithPersistedLayout()) restorePlacement(registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n getPlacement: (placementId) => placements.get(placementId),\n listPlacements: () => [...placements.values()].sort((left, right) => left.id.localeCompare(right.id)),\n openPlacement(target) {\n const prepared = preparation.open(target);\n preparation.apply(prepared.state);\n preparation.publish();\n input.activatePanel(\n `workbench.shell.${encodeURIComponent(target.placementId)}.${encodeURIComponent(prepared.identity.instanceKey)}`,\n );\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry closes only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n updatePlacement(identity, update) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry updates only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n resolvePlacements: (context) => preparation.resolve(undefined, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type PreferenceScope = \"default\" | \"user\" | \"project\" | \"repo\" | \"workspace\" | \"extension\" | \"session\";\nexport type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;\n\nexport interface PreferencePropertySchema {\n type: \"boolean\" | \"number\" | \"string\" | \"array\" | \"object\";\n enum?: PreferenceValue[];\n default?: PreferenceValue;\n scope: PreferenceScope;\n description?: string;\n}\n\nexport interface PreferenceSchemaContribution {\n properties: Record<string, PreferencePropertySchema>;\n}\n\nexport interface PreferenceScopeRef {\n scope: PreferenceScope;\n scopeId?: string;\n}\n\nexport interface PreferencePersistenceAdapter {\n getValue(name: string, scope: PreferenceScopeRef): PreferenceValue | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n}\n\nexport interface CreatePreferenceRegistryInput {\n persistence?: PreferencePersistenceAdapter;\n}\n\ntype RegisteredPreferenceSchema = PreferencePropertySchema & { ownerId: string; source: string };\n\nexport interface PreferenceRegistryStoreState {\n schemas: Record<string, RegisteredPreferenceSchema>;\n}\n\nexport interface PreferenceRegistry {\n store: WorkbenchStore<PreferenceRegistryStoreState>;\n registerSchema(schema: PreferenceSchemaContribution, metadata?: ContributionMetadata): Disposable;\n getSchema(name: string): RegisteredPreferenceSchema | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n getValue(name: string, scope?: PreferenceScopeRef): PreferenceValue | undefined;\n}\n\nconst valueKey = (name: string, scope: PreferenceScopeRef) => `${name}:${scope.scope}:${scope.scopeId ?? \"\"}`;\n\nconst createMemoryPreferencePersistence = () => {\n const values = new Map<string, PreferenceValue>();\n\n return {\n getValue(name: string, scope: PreferenceScopeRef) {\n return values.get(valueKey(name, scope));\n },\n\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef) {\n values.set(valueKey(name, scope), value);\n },\n } satisfies PreferencePersistenceAdapter;\n};\n\nexport const createPreferenceRegistry = (input: CreatePreferenceRegistryInput = {}): PreferenceRegistry => {\n const store = createWorkbenchStore<PreferenceRegistryStoreState>({\n name: \"workbench.preferences\",\n initialState: { schemas: {} },\n });\n const persistence = input.persistence ?? createMemoryPreferencePersistence();\n\n return {\n store,\n\n registerSchema(schema, metadata) {\n const registeredNames = Object.keys(schema.properties);\n const snapshot = store.getState();\n\n for (const name of registeredNames) {\n if (snapshot.schemas[name]) throw new Error(`Preference schema already registered: ${name}`);\n }\n\n const additions: Record<string, RegisteredPreferenceSchema> = {};\n for (const name of registeredNames) {\n const property = schema.properties[name];\n if (property) {\n additions[name] = {\n ...property,\n ownerId: metadata?.ownerId ?? \"workbench.core\",\n source: metadata?.source ?? \"module\",\n };\n }\n }\n\n store.setState({ schemas: { ...snapshot.schemas, ...additions } }, false, \"registerSchema\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = { ...current.schemas };\n for (const name of registeredNames) delete next[name];\n store.setState({ schemas: next }, false, \"unregisterSchema\");\n });\n },\n\n getSchema(name) {\n return store.getState().schemas[name];\n },\n\n setValue(name, value, scope) {\n if (!store.getState().schemas[name]) throw new Error(`Preference schema not registered: ${name}`);\n persistence.setValue(name, value, scope);\n },\n\n getValue(name, scope) {\n if (scope) {\n const scoped = persistence.getValue(name, scope);\n if (scoped !== undefined) return scoped;\n }\n\n const userValue = persistence.getValue(name, { scope: \"user\" });\n if (userValue !== undefined) return userValue;\n\n return store.getState().schemas[name]?.default;\n },\n };\n};\n","import type { ControlsQueryResult, ControlValue, ControlValueMap } from \"@pstdio/sdk/extensions\";\n\nexport type { ControlsQueryResult } from \"@pstdio/sdk/extensions\";\n\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport type ControlsRendererRegion = \"main-right-menu\" | \"secondary\" | \"overlay\";\n\nexport interface ControlsRendererLayout {\n region?: ControlsRendererRegion;\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport interface ControlsUpdateValueInput {\n controlId: string;\n value: ControlValue;\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsApplyInput {\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsResetInput {\n controlIds?: string[];\n resource?: ResourceRef;\n}\n\nexport interface ControlsRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n layout?: ControlsRendererLayout;\n defaultValues?: ControlValueMap;\n\n /** Load the control declarations + current values for the active resource. */\n executeQuery(resource?: ResourceRef): Promise<ControlsQueryResult> | ControlsQueryResult;\n /** Live-save a single control edit. Omit for explicit-apply or read-only panels. */\n updateValue?(input: ControlsUpdateValueInput): Promise<void> | void;\n /** Commit the full value map from a sticky footer. */\n apply?(input: ControlsApplyInput): Promise<void> | void;\n /** Reset some or all controls to their defaults. */\n reset?(input: ControlsResetInput): Promise<void> | void;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n}\n\nexport interface RegisteredControlsRendererContribution\n extends ControlsRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface ControlsRendererStoreState {\n renderers: Record<string, RegisteredControlsRendererContribution>;\n}\n\nexport interface ControlsRendererRefreshEvent {\n controlsRendererId: string;\n}\n\nexport type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a controls widget. Set once on\n// workbench mount via setControlsRendererImplementation so registerControlsRenderer\n// can auto-register a widget renderer with the same id.\nexport type ControlsRendererImplementation = (\n input: WorkbenchPanelRenderInput & { controlsRendererId: string },\n) => unknown;\n\nexport interface CreateControlsRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface ControlsRendererRegistry {\n controlsStore: WorkbenchStore<ControlsRendererStoreState>;\n registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable;\n setControlsRendererImplementation(impl: ControlsRendererImplementation): void;\n getControlsRenderer(id: string): RegisteredControlsRendererContribution | undefined;\n listControlsRenderers(): RegisteredControlsRendererContribution[];\n refreshControlsRenderer(id: string): void;\n onDidRefreshControlsRenderer(listener: ControlsRendererRefreshListener): Disposable;\n}\n\nexport const createControlsRendererRegistry = (\n input: CreateControlsRendererRegistryInput,\n): ControlsRendererRegistry => {\n const { rendererRegistry } = input;\n\n const controlsStore = createWorkbenchStore<ControlsRendererStoreState>({\n name: \"workbench.controlsRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<ControlsRendererRefreshListener>();\n let implementation: ControlsRendererImplementation = () => null;\n\n const requireControlsRenderer = (id: string) => {\n const renderer = controlsStore.getState().renderers[id];\n if (!renderer) throw new Error(`Controls renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n controlsStore,\n\n setControlsRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerControlsRenderer(contribution, metadata) {\n const snapshot = controlsStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Controls renderer already registered: ${contribution.id}`);\n }\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredControlsRendererContribution;\n\n controlsStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerControlsRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchControlsView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, controlsRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = controlsStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n controlsStore.setState({ renderers: nextRenderers }, false, \"unregisterControlsRenderer\");\n });\n },\n\n getControlsRenderer(id) {\n return controlsStore.getState().renderers[id];\n },\n\n listControlsRenderers() {\n return Object.values(controlsStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshControlsRenderer(id) {\n requireControlsRenderer(id);\n const event = { controlsRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshControlsRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface DataTableRendererThemeColor {\n light: string;\n dark: string;\n foreground?: { light: string; dark: string };\n}\n\nexport type DataTableRendererColumnStat =\n | { type: \"unique\" }\n | { type: \"histogram\"; bins?: number }\n | { type: \"top-values\"; limit?: number };\n\nexport type DataTableRendererColumnRenderer =\n | { type: \"json\" }\n | { type: \"color-scale\"; stops: Array<{ value: number; color: DataTableRendererThemeColor }> }\n | {\n type: \"categorical-color\";\n categories: Array<{ value: string | number | boolean | null; color: DataTableRendererThemeColor }>;\n };\n\nexport interface DataTableRendererColumn {\n id: string;\n label?: string;\n description?: string;\n icon?: unknown;\n hidden?: boolean;\n stat?: DataTableRendererColumnStat;\n renderer?: DataTableRendererColumnRenderer;\n}\n\nexport interface DataTableRendererRow {\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface DataTableRendererQueryResult {\n rows: DataTableRendererRow[];\n columns?: DataTableRendererColumn[];\n}\n\nexport interface DataTableRendererQueryContext {\n resource?: ResourceRef;\n modeId?: string;\n}\n\nexport interface DataTableRendererRowAction {\n id: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(row: DataTableRendererRow): Promise<void> | void;\n}\n\nexport interface DataTableRendererSelectionAction {\n id: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(rows: DataTableRendererRow[]): Promise<void> | void;\n}\n\nexport interface DataTableRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n columns?: DataTableRendererColumn[];\n selectionMode?: \"none\" | \"multiple\";\n selectionActions?: DataTableRendererSelectionAction[];\n rowActions?: DataTableRendererRowAction[];\n initialPageSize?: number;\n pageSizeOptions?: number[];\n emptyTitle?: string;\n emptyDescription?: string;\n executeQuery(\n context: DataTableRendererQueryContext,\n ): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;\n}\n\nexport interface RegisteredDataTableRendererContribution\n extends DataTableRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface DataTableRendererStoreState {\n renderers: Record<string, RegisteredDataTableRendererContribution>;\n}\n\nexport interface DataTableRendererRefreshEvent {\n dataTableRendererId: string;\n}\n\nexport type DataTableRendererImplementation = (\n input: WorkbenchPanelRenderInput & { dataTableRendererId: string },\n) => unknown;\n\nexport interface DataTableRendererRegistry {\n dataTableStore: WorkbenchStore<DataTableRendererStoreState>;\n registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable;\n setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;\n getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;\n listDataTableRenderers(): RegisteredDataTableRendererContribution[];\n refreshDataTableRenderer(id: string): void;\n onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable;\n}\n\nexport const createDataTableRendererRegistry = (input: {\n rendererRegistry: WorkbenchRendererRegistry;\n}): DataTableRendererRegistry => {\n const dataTableStore = createWorkbenchStore<DataTableRendererStoreState>({\n name: \"workbench.dataTableRenderers\",\n initialState: { renderers: {} },\n });\n const refreshListeners = new Set<(event: DataTableRendererRefreshEvent) => void>();\n let implementation: DataTableRendererImplementation = () => null;\n\n return {\n dataTableStore,\n setDataTableRendererImplementation(next) {\n implementation = next;\n },\n registerDataTableRenderer(contribution, metadata) {\n const snapshot = dataTableStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Data table renderer already registered: ${contribution.id}`);\n }\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredDataTableRendererContribution;\n dataTableStore.setState(\n { renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerDataTableRenderer\",\n );\n const rendererDisposable = input.rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, dataTableRendererId: contribution.id }),\n });\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataTableStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...renderers } = current.renderers;\n dataTableStore.setState({ renderers }, false, \"unregisterDataTableRenderer\");\n });\n },\n getDataTableRenderer(id) {\n return dataTableStore.getState().renderers[id];\n },\n listDataTableRenderers() {\n return Object.values(dataTableStore.getState().renderers).sort(byContributionPriority);\n },\n refreshDataTableRenderer(id) {\n if (!dataTableStore.getState().renderers[id]) throw new Error(`Data table renderer not registered: ${id}`);\n const event = { dataTableRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n onDidRefreshDataTableRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => refreshListeners.delete(listener));\n },\n } satisfies DataTableRendererRegistry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\n// What a file renderer's load resolves to. The React layer dispatches to a\n// markdown editor, a code editor, or an image preview based on `fileName` /\n// `mimeType`; text-ish files carry `content`, images carry `dataUrl`.\nexport interface FileRendererContent {\n fileName?: string;\n /** Workspace-relative path shown above the file preview. */\n filePath?: string;\n mimeType?: string;\n content?: string;\n dataUrl?: string;\n // Shown by the editor when the content is empty (editable text only).\n placeholder?: string;\n /** Override contribution-level save support for one loaded file. */\n editable?: boolean;\n /** Request Monaco for text that automatic dispatch would open as markdown. */\n textRenderer?: \"automatic\" | \"monaco\";\n /** Represent a deliberate no-file selection without an editable blank document. */\n emptyState?: {\n title: string;\n description?: string;\n };\n /** Ordered backing-store revision when one is available. */\n revision?: string;\n}\n\nexport interface FileRendererRefreshOrigin {\n rendererId: string;\n instanceId: string;\n operationId: string;\n}\n\nexport interface FileRendererRefreshEnvelope {\n resourceKey?: string;\n origin?: FileRendererRefreshOrigin;\n revision?: string;\n}\n\nexport interface FileRendererSaveResult {\n revision?: string;\n}\n\nexport interface FileRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n\n /** Resolve the file's content (and identity) for the bound resource. */\n load(resource: ResourceRef | undefined): Promise<FileRendererContent> | FileRendererContent;\n /** Persist edited text. Absent ⇒ read-only. Never called for images. */\n save?(\n resource: ResourceRef | undefined,\n content: string,\n origin?: FileRendererRefreshOrigin,\n // biome-ignore lint/suspicious/noConfusingVoidType: Existing synchronous save callbacks return void.\n ): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;\n}\n\nexport interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {}\n\nexport interface FileRendererStoreState {\n renderers: Record<string, RegisteredFileRendererContribution>;\n}\n\nexport interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {\n fileRendererId: string;\n}\n\nexport type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a file-renderer widget. Set once on\n// workbench mount via setFileRendererImplementation so registerFileRenderer can\n// auto-register a widget renderer with the same id.\nexport type FileRendererImplementation = (input: WorkbenchPanelRenderInput & { fileRendererId: string }) => unknown;\n\nexport interface CreateFileRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface FileRendererRegistry {\n fileRendererStore: WorkbenchStore<FileRendererStoreState>;\n registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable;\n setFileRendererImplementation(impl: FileRendererImplementation): void;\n getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;\n listFileRenderers(): RegisteredFileRendererContribution[];\n refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;\n onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable;\n}\n\nexport const createFileRendererRegistry = (input: CreateFileRendererRegistryInput): FileRendererRegistry => {\n const { rendererRegistry } = input;\n\n const fileRendererStore = createWorkbenchStore<FileRendererStoreState>({\n name: \"workbench.fileRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<FileRendererRefreshListener>();\n let implementation: FileRendererImplementation = () => null;\n\n const requireFileRenderer = (id: string) => {\n const renderer = fileRendererStore.getState().renderers[id];\n if (!renderer) throw new Error(`File renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n fileRendererStore,\n\n setFileRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerFileRenderer(contribution, metadata) {\n const snapshot = fileRendererStore.getState();\n if (snapshot.renderers[contribution.id]) throw new Error(`File renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredFileRendererContribution;\n\n fileRendererStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerFileRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchFileRendererView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, fileRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = fileRendererStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n fileRendererStore.setState({ renderers: nextRenderers }, false, \"unregisterFileRenderer\");\n });\n },\n\n getFileRenderer(id) {\n return fileRendererStore.getState().renderers[id];\n },\n\n listFileRenderers(): RegisteredFileRendererContribution[] {\n return Object.values(fileRendererStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshFileRenderer(id, envelope = {}) {\n requireFileRenderer(id);\n const event = { fileRendererId: id, ...envelope };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshFileRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n AttributeDescriptor,\n AttributesSource,\n BoardColumnConfig,\n KanbanRendererCreateRowConfig,\n KanbanRendererCreateSubmission,\n KanbanRendererFilterState,\n KanbanRendererRow,\n KanbanRendererSavedView,\n KanbanRendererSettings,\n ResourceContextAction,\n} from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface KanbanRendererQueryState {\n settings: KanbanRendererSettings;\n filters: KanbanRendererFilterState;\n}\n\nexport interface KanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> {\n id: string;\n title: string;\n resourceKind?: string;\n /** Host-owned scope for persisted display settings. */\n storageScope?: string;\n\n /**\n * Declarative attribute schema. The renderer dispatches filter / group /\n * sort / display / inline-edit behavior on each descriptor's `type.kind`.\n *\n * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a\n * static array to let the contribution mutate its schema at runtime —\n * `WorkbenchKanbanView` subscribes so additions / removals / kind changes\n * propagate live without re-registering the renderer.\n */\n attributes: AttributeDescriptor<TNode>[] | AttributesSource<TNode>;\n\n /** Per-board-column overrides (color, drag/create rules, custom actions). */\n getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig<TIcon>;\n hideToolbar?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n\n /** Initial settings/filters applied when the kanban renderer mounts. */\n defaultSettings?: Partial<KanbanRendererSettings>;\n defaultFilters?: KanbanRendererFilterState;\n defaultViews?: KanbanRendererSavedView[];\n defaultActiveViewId?: string;\n\n /**\n * Data source. Receives the current display state so backends can paginate\n * / filter / sort. The renderer re-applies filter / sort / group locally,\n * so this can return unfiltered rows in simple cases.\n */\n executeQuery(state: KanbanRendererQueryState): Promise<TRow[]> | TRow[];\n subscribe?: (listener: () => void) => Disposable | (() => void);\n\n /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */\n onRowActivate?: (row: TRow) => Promise<void> | void;\n /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction<TNode>[];\n /**\n * Fires for inline attribute edits AND for cross-column drag-to-reorder on\n * the board (the renderer passes the grouping attribute id + the target\n * column value).\n */\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n /** Manual within-column reorder (only fires when ordering is manual). */\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n createRow?: KanbanRendererCreateRowConfig;\n onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport interface RegisteredKanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> extends KanbanRendererContribution<TRow, TNode, TIcon>,\n RegisteredContributionMetadata {}\n\nexport interface KanbanRendererStoreState {\n renderers: Record<string, RegisteredKanbanRendererContribution>;\n}\n\nexport interface KanbanRendererRefreshEvent {\n kanbanRendererId: string;\n}\n\nexport type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a kanban-renderer Panel. Set once on\n// workbench mount via setKanbanRendererImplementation so registerKanbanRenderer can\n// auto-register a Panel renderer with the same id.\nexport type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & { kanbanRendererId: string }) => unknown;\n\nexport interface CreateKanbanRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface KanbanRendererRegistry {\n dataStore: WorkbenchStore<KanbanRendererStoreState>;\n registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(\n contribution: KanbanRendererContribution<TRow>,\n metadata?: ContributionMetadata,\n ): Disposable;\n setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;\n getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;\n listKanbanRenderers(): RegisteredKanbanRendererContribution[];\n refreshKanbanRenderer(id: string): void;\n onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable;\n}\n\nexport const createKanbanRendererRegistry = (input: CreateKanbanRendererRegistryInput): KanbanRendererRegistry => {\n const { rendererRegistry } = input;\n\n const dataStore = createWorkbenchStore<KanbanRendererStoreState>({\n name: \"workbench.kanbanRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<KanbanRendererRefreshListener>();\n let implementation: KanbanRendererImplementation = () => null;\n\n const requireKanbanRenderer = (id: string) => {\n const renderer = dataStore.getState().renderers[id];\n if (!renderer) throw new Error(`Kanban renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n dataStore,\n\n setKanbanRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerKanbanRenderer(contribution, metadata) {\n const snapshot = dataStore.getState();\n if (snapshot.renderers[contribution.id])\n throw new Error(`Kanban renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredKanbanRendererContribution;\n\n dataStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerKanbanRenderer\",\n );\n\n // Auto-register a Panel renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchKanbanView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, kanbanRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n dataStore.setState({ renderers: nextRenderers }, false, \"unregisterKanbanRenderer\");\n });\n },\n\n getKanbanRenderer(id) {\n return dataStore.getState().renderers[id];\n },\n\n listKanbanRenderers(): RegisteredKanbanRendererContribution[] {\n return Object.values(dataStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshKanbanRenderer(id) {\n requireKanbanRenderer(id);\n const event = { kanbanRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshKanbanRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\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\nexport interface WorkbenchRendererRegistration {\n id: string;\n render: (input: WorkbenchPanelRenderInput) => unknown;\n}\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n refreshKeys: Record<string, number>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n refreshRenderer(id: string): void;\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n}\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, refreshKeys: {} },\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 store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer } },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n const { [renderer.id]: _removed, ...renderers } = current.renderers;\n const { [renderer.id]: _refreshKey, ...refreshKeys } = current.refreshKeys;\n store.setState({ renderers, refreshKeys }, false, \"unregisterRenderer\");\n });\n },\n\n getRenderer: (id) => store.getState().renderers[id],\n\n listRenderers: () => Object.values(store.getState().renderers),\n\n refreshRenderer(id) {\n const snapshot = store.getState();\n if (!snapshot.renderers[id]) throw new Error(`Renderer is not registered: ${id}`);\n store.setState(\n { ...snapshot, refreshKeys: { ...snapshot.refreshKeys, [id]: (snapshot.refreshKeys[id] ?? 0) + 1 } },\n false,\n \"refreshRenderer\",\n );\n },\n\n onDidChange(listener) {\n return createDisposable(\n store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n ),\n );\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n return registry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandParamSchema } from \"../commands/command-registry\";\nimport type { MenuPath } from \"../menus/menu-registry\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport interface TreeQueryContext {\n filter?: string;\n resource?: ResourceRef;\n /** Widget/view contribution id for trees rendered through a view-backed widget. */\n viewId?: string;\n}\n\nexport interface TreeContext extends TreeQueryContext {\n state: Readonly<TreeRendererState>;\n refresh(): void;\n setSelectedNode(nodeId: string | undefined): void;\n}\n\nexport interface TreeAction {\n id: string;\n label?: string;\n icon?: string;\n commandId?: string;\n args?: unknown;\n params?: CommandParamSchema;\n // Confirm-button label for the action's params dialog (defaults to \"Run\").\n submitLabel?: string;\n when?: string;\n disabled?: boolean;\n run?(args?: unknown): Promise<void> | void;\n}\n\nexport type TreeNodeRowVariant = \"empty-state\";\n\nexport interface TreeNodeInlineInput {\n ariaLabel: string;\n defaultValue?: string;\n placeholder?: string;\n onCommit(value: string): Promise<void> | void;\n onCancel?(): void;\n}\n\nexport interface TreeNode {\n id: string;\n selected?: boolean;\n /** Host-owned customization boundary. Extension callbacks cannot set it. */\n moveScope?: string;\n label: string;\n icon?: string;\n iconElement?: unknown;\n iconColor?: string;\n iconTooltip?: string;\n endContent?: unknown;\n commandId?: string;\n resource?: ResourceRef;\n target?: NavigationTarget;\n /** Visual row variant for non-data rows such as placeholders. */\n rowVariant?: TreeNodeRowVariant;\n inlineInput?: TreeNodeInlineInput;\n actions?: TreeAction[];\n contextMenuActions?: TreeAction[];\n contextMenuPath?: MenuPath;\n menuPath?: MenuPath;\n menuPlacement?: \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"left-start\";\n showContextMenuTrigger?: boolean;\n collapsible?: boolean;\n disabled?: boolean;\n children?: TreeNode[];\n description?: string;\n contextValue?: string;\n hiddenByDefault?: boolean;\n /** When true, the node (e.g. a header/footer row) opts in to the tree's hide/show customization menu. */\n canHide?: boolean;\n /** When false, the node stays fixed within its Sidenav group. */\n canReorder?: boolean;\n /** Allow this node to be moved to another tree location. */\n canDrag?: boolean;\n /** Allow movable nodes to be dropped on this node. */\n canDrop?: boolean;\n}\n\nexport interface TreeSectionEmptyState {\n title: string;\n description?: string;\n icon?: string;\n}\n\nexport interface TreeViewSection {\n id: string;\n /** Host-owned customization boundary. Extension callbacks cannot set it. */\n moveScope?: string;\n label?: string;\n actions?: TreeAction[];\n collapsible?: boolean;\n emptyState?: TreeSectionEmptyState;\n nodes: TreeNode[];\n hiddenByDefault?: boolean;\n /** When true, the section (category) opts in to the tree's hide/show customization menu. */\n canHide?: boolean;\n /** When false, the section stays fixed within the Sidenav main region. */\n canReorder?: boolean;\n}\n\nexport interface TreeMoveEndpoint {\n kind: \"section\" | \"node\";\n sectionId: string;\n id: string;\n moveScope?: string;\n}\n\nexport type TreeMovePolicy = (move: { source: TreeMoveEndpoint; destination: TreeMoveEndpoint }) => boolean;\n\nexport interface TreeRendererContribution {\n id: string;\n title: string;\n icon?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n when?: string;\n defaultExpandedSectionIds?: string[];\n defaultExpandedNodeIds?: string[];\n getBody(ctx: TreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getHeader?(ctx: TreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getFooter?(ctx: TreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getChildren(node: TreeNode, ctx: TreeContext): Promise<TreeNode[]> | TreeNode[];\n canMove?: TreeMovePolicy;\n moveNode?(source: TreeNode, target: TreeNode | undefined, ctx: TreeContext): Promise<void> | void;\n}\n\nexport interface RegisteredTreeRendererContribution extends TreeRendererContribution, RegisteredContributionMetadata {}\n\nexport interface TreeRendererState {\n expandedNodeIds: string[];\n expandedSectionIds: string[];\n selectedNodeId?: string;\n loading?: boolean;\n}\n\nexport interface TreeRendererRefreshEvent {\n treeId: string;\n}\n\nexport interface TreeRendererStoreState {\n trees: Record<string, RegisteredTreeRendererContribution>;\n statesByTreeId: Record<string, TreeRendererState>;\n refreshKeysByTreeId: Record<string, number>;\n}\n\nexport interface PersistedTreeRendererStates {\n statesByTreeId: Record<string, TreeRendererState>;\n}\n\nexport interface TreeRendererPersistenceAdapter {\n getTreeStates(): PersistedTreeRendererStates | undefined;\n setTreeStates(states: PersistedTreeRendererStates): void;\n}\n\n// The React layer supplies the actual rendering for a tree id when a widget\n// references it. Set once on workbench mount via setTreeRendererImplementation\n// so registerTreeRenderer can auto-register a renderer entry with the same id.\nexport type TreeRendererImplementation = (input: WorkbenchPanelRenderInput & { treeId: string }) => unknown;\n\nexport interface CreateTreeRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n persistence?: TreeRendererPersistenceAdapter;\n}\n\ntype TreeRendererRefreshListener = (event: TreeRendererRefreshEvent) => void;\n\nconst createDefaultState = (view: TreeRendererContribution): TreeRendererState => ({\n expandedNodeIds: [...(view.defaultExpandedNodeIds ?? [])],\n expandedSectionIds: [...(view.defaultExpandedSectionIds ?? [])],\n});\n\n// Section defaults are re-applied on every registration so a section that\n// should start expanded (e.g. a ticket's workspaces) stays expanded even when\n// an older persisted state predates it. Node expansion stays user-controlled.\nconst mergeDefaultSections = (state: TreeRendererState, view: TreeRendererContribution): TreeRendererState => {\n const missing = (view.defaultExpandedSectionIds ?? []).filter((id) => !state.expandedSectionIds.includes(id));\n if (missing.length === 0) return state;\n return { ...state, expandedSectionIds: [...state.expandedSectionIds, ...missing] };\n};\n\nconst toggleId = (ids: string[], id: string, expanded: boolean) => {\n if (expanded) return ids.includes(id) ? ids : [...ids, id];\n return ids.includes(id) ? ids.filter((value) => value !== id) : ids;\n};\n\nexport interface TreeRendererRegistry {\n treeStore: WorkbenchStore<TreeRendererStoreState>;\n registerTreeRenderer(view: TreeRendererContribution, metadata?: ContributionMetadata): Disposable;\n setTreeRendererImplementation(impl: TreeRendererImplementation): void;\n getTreeRenderer(id: string): RegisteredTreeRendererContribution | undefined;\n listTreeRenderers(): RegisteredTreeRendererContribution[];\n getBody(id: string, ctx?: TreeQueryContext): Promise<TreeViewSection[]>;\n getHeader(id: string, ctx?: TreeQueryContext): Promise<TreeViewSection[]>;\n getFooter(id: string, ctx?: TreeQueryContext): Promise<TreeViewSection[]>;\n getChildren(id: string, node: TreeNode, ctx?: TreeQueryContext): Promise<TreeNode[]>;\n getTreeState(id: string): TreeRendererState;\n setNodeExpanded(id: string, nodeId: string, expanded: boolean): void;\n setSectionExpanded(id: string, sectionId: string, expanded: boolean): void;\n setSelectedNode(id: string, nodeId: string | undefined): void;\n setLoading(id: string, loading: boolean): void;\n refresh(id: string): void;\n onDidRefresh(listener: TreeRendererRefreshListener): Disposable;\n}\n\nexport const createTreeRendererRegistry = (input: CreateTreeRendererRegistryInput): TreeRendererRegistry => {\n const { rendererRegistry, persistence } = input;\n const persisted = persistence?.getTreeStates();\n\n const treeStore = createWorkbenchStore<TreeRendererStoreState>({\n name: \"workbench.treeRenderers\",\n initialState: {\n trees: {},\n statesByTreeId: persisted?.statesByTreeId ?? {},\n refreshKeysByTreeId: {},\n },\n });\n\n const refreshListeners = new Set<TreeRendererRefreshListener>();\n let implementation: TreeRendererImplementation = () => null;\n\n const requireTree = (id: string) => {\n const tree = treeStore.getState().trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n return tree;\n };\n\n const ensureState = (id: string) => {\n const current = treeStore.getState();\n const existing = current.statesByTreeId[id];\n if (existing) return existing;\n\n const tree = current.trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n\n const fresh = createDefaultState(tree);\n treeStore.setState(\n {\n ...current,\n statesByTreeId: { ...current.statesByTreeId, [id]: fresh },\n },\n false,\n \"ensureTreeState\",\n );\n return fresh;\n };\n\n const persistStates = () => {\n if (!persistence) return;\n const statesByTreeId: Record<string, TreeRendererState> = {};\n for (const [id, state] of Object.entries(treeStore.getState().statesByTreeId)) {\n const { loading: _loading, ...persistable } = state;\n statesByTreeId[id] = persistable;\n }\n persistence.setTreeStates({ statesByTreeId });\n };\n\n const updateState = (id: string, update: (state: TreeRendererState) => TreeRendererState, action: string) => {\n const current = ensureState(id);\n const next = update(current);\n if (next === current) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: next },\n },\n false,\n action,\n );\n persistStates();\n };\n\n const registry: TreeRendererRegistry = {\n treeStore,\n\n setTreeRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerTreeRenderer(view, metadata) {\n const snapshot = treeStore.getState();\n if (snapshot.trees[view.id]) throw new Error(`Tree renderer already registered: ${view.id}`);\n\n const record: RegisteredTreeRendererContribution = {\n ...normalizeContributionMetadata(metadata),\n ...view,\n };\n const persistedState = snapshot.statesByTreeId[view.id];\n const nextState = persistedState ? mergeDefaultSections(persistedState, view) : createDefaultState(view);\n\n treeStore.setState(\n {\n ...snapshot,\n trees: { ...snapshot.trees, [view.id]: record },\n statesByTreeId: { ...snapshot.statesByTreeId, [view.id]: nextState },\n },\n false,\n \"registerTreeRenderer\",\n );\n\n // Auto-register a widget renderer with the same id so widgets can place\n // this tree via rendererId: view.id. The render fn calls the React-side\n // implementation supplied through setTreeRendererImplementation.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: view.id,\n render: (rendererInput) => implementation({ ...rendererInput, treeId: view.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = treeStore.getState();\n if (current.trees[view.id] !== record) return;\n const { [view.id]: _removed, ...nextTrees } = current.trees;\n const { [view.id]: _removedState, ...nextStates } = current.statesByTreeId;\n const { [view.id]: _removedRefresh, ...nextRefresh } = current.refreshKeysByTreeId;\n treeStore.setState(\n {\n trees: nextTrees,\n statesByTreeId: nextStates,\n refreshKeysByTreeId: nextRefresh,\n },\n false,\n \"unregisterTreeRenderer\",\n );\n persistStates();\n });\n },\n\n getTreeRenderer(id) {\n return treeStore.getState().trees[id];\n },\n\n listTreeRenderers() {\n return Object.values(treeStore.getState().trees).sort(byContributionPriority);\n },\n\n async getBody(id, ctx = {}) {\n return await requireTree(id).getBody({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getHeader(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getHeader) return [];\n return await tree.getHeader({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getFooter(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getFooter) return [];\n return await tree.getFooter({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getChildren(id, node, ctx = {}) {\n return await requireTree(id).getChildren(node, {\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n getTreeState(id) {\n const state = ensureState(id);\n return {\n expandedNodeIds: [...state.expandedNodeIds],\n expandedSectionIds: [...state.expandedSectionIds],\n selectedNodeId: state.selectedNodeId,\n loading: state.loading,\n };\n },\n\n setNodeExpanded(id, nodeId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedNodeIds, nodeId, expanded);\n if (nextIds === state.expandedNodeIds) return state;\n return { ...state, expandedNodeIds: nextIds };\n },\n \"setNodeExpanded\",\n );\n },\n\n setSectionExpanded(id, sectionId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedSectionIds, sectionId, expanded);\n if (nextIds === state.expandedSectionIds) return state;\n return { ...state, expandedSectionIds: nextIds };\n },\n \"setSectionExpanded\",\n );\n },\n\n setSelectedNode(id, nodeId) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n if (state.selectedNodeId === nodeId) return state;\n return { ...state, selectedNodeId: nodeId };\n },\n \"setSelectedNode\",\n );\n },\n\n setLoading(id, loading) {\n requireTree(id);\n const current = ensureState(id);\n if (current.loading === loading) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: { ...current, loading } },\n },\n false,\n \"setLoading\",\n );\n },\n\n refresh(id) {\n requireTree(id);\n const snapshot = treeStore.getState();\n const current = snapshot.refreshKeysByTreeId[id] ?? 0;\n treeStore.setState(\n {\n ...snapshot,\n refreshKeysByTreeId: { ...snapshot.refreshKeysByTreeId, [id]: current + 1 },\n },\n false,\n \"refreshTreeRenderer\",\n );\n const event = { treeId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefresh(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n return registry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n/** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */\nexport type SettingsScope = \"global\" | \"project\";\n\n/** A \"+ create\"-style action surfaced on a section or a collection's parent node. */\nexport interface SettingsAction {\n id: string;\n label: string;\n icon?: string;\n run(): void | Promise<void>;\n}\n\n/** An ordered sidenav container. Headerless when `title` is omitted. */\nexport interface SettingsSectionContribution {\n id: string;\n title?: string;\n order?: number;\n scope?: SettingsScope;\n actions?: SettingsAction[];\n}\nexport type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;\n\n/** A preference this panel edits; a bare string uses the preference name as its label. */\nexport type SettingsPanelPreference = string | { name: string; label?: string };\n\nexport interface SettingsPanelBase {\n id: string;\n title: string;\n description?: string;\n /** Section id this panel belongs to. */\n section?: string;\n icon?: string;\n /** Lower sorts first; ties fall back to contribution priority then registration order. */\n order?: number;\n scope?: SettingsScope;\n when?: string;\n}\n\n/** Auto-rendered as a param editor from the registered preference schema. */\nexport interface SchemaSettingsPanel extends SettingsPanelBase {\n kind: \"schema\";\n preferences: SettingsPanelPreference[];\n /** \"live\" persists on change (default); \"apply\" stages edits behind Save/Discard. */\n save?: \"live\" | \"apply\";\n}\n\nexport interface ViewSettingsPanel extends SettingsPanelBase {\n kind: \"view\";\n viewId: string;\n}\n\nexport interface SettingsCollectionGroupBy<TItem> {\n key(item: TItem): string;\n order?: string[];\n label(key: string): string;\n icon?(key: string): string | undefined;\n}\n\n/**\n * A data-driven list of items, each opening a contributor-supplied editor. The\n * framework knows nothing about what an item is — it only calls these hooks.\n */\nexport interface CollectionSettingsPanel<TItem = unknown> extends SettingsPanelBase {\n kind: \"collection\";\n viewId: string;\n items(): TItem[] | Promise<TItem[]>;\n itemId(item: TItem): string;\n itemLabel(item: TItem): string;\n itemIcon?(item: TItem): string | undefined;\n groupBy?: SettingsCollectionGroupBy<TItem>;\n actions?: SettingsAction[];\n}\n\nexport type SettingsPanelContribution = SchemaSettingsPanel | ViewSettingsPanel | CollectionSettingsPanel;\nexport type RegisteredSettingsPanel = SettingsPanelContribution & RegisteredContributionMetadata;\n\nexport interface SettingsRegistryStoreState {\n sections: Record<string, RegisteredSettingsSection>;\n panels: Record<string, RegisteredSettingsPanel>;\n /** Bumped by refresh() so the surface re-reads collection items() after backing data changes. */\n revision: number;\n}\n\nexport interface SettingsRegistry {\n store: WorkbenchStore<SettingsRegistryStoreState>;\n registerSection(section: SettingsSectionContribution, metadata?: ContributionMetadata): Disposable;\n registerPanel<TItem = unknown>(\n panel: SchemaSettingsPanel | ViewSettingsPanel | CollectionSettingsPanel<TItem>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getSection(id: string): RegisteredSettingsSection | undefined;\n getPanel(id: string): RegisteredSettingsPanel | undefined;\n listSections(): RegisteredSettingsSection[];\n listPanels(): RegisteredSettingsPanel[];\n resolveCollectionItem(panelId: string, itemId: string): Promise<unknown | undefined>;\n getCollectionItem(panelId: string, itemId: string): unknown | undefined;\n /** Signal that a collection's backing data changed so the surface refreshes. */\n refresh(): void;\n}\n\nconst byOrderThenPriority = <T extends RegisteredContributionMetadata & { order?: number }>(left: T, right: T) =>\n (left.order ?? 0) - (right.order ?? 0) || byContributionPriority(left, right);\n\nexport const createSettingsRegistry = (input: { hasView?: (viewId: string) => boolean } = {}): SettingsRegistry => {\n const store = createWorkbenchStore<SettingsRegistryStoreState>({\n name: \"workbench.settings\",\n initialState: { sections: {}, panels: {}, revision: 0 },\n });\n const collectionItems = new Map<string, unknown>();\n const itemKey = (panelId: string, itemId: string) => JSON.stringify([panelId, itemId]);\n\n return {\n store,\n\n refresh() {\n collectionItems.clear();\n const snapshot = store.getState();\n store.setState({ ...snapshot, revision: snapshot.revision + 1 }, false, \"refreshSettings\");\n },\n\n registerSection(section, metadata) {\n const snapshot = store.getState();\n if (snapshot.sections[section.id]) throw new Error(`Settings section already registered: ${section.id}`);\n\n const record = { ...normalizeContributionMetadata(metadata), ...section } as RegisteredSettingsSection;\n store.setState(\n { ...snapshot, sections: { ...snapshot.sections, [section.id]: record } },\n false,\n \"registerSection\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.sections[section.id] !== record) return;\n const { [section.id]: _removed, ...nextSections } = current.sections;\n store.setState({ ...current, sections: nextSections }, false, \"unregisterSection\");\n });\n },\n\n registerPanel(panel, metadata) {\n const snapshot = store.getState();\n if (snapshot.panels[panel.id]) throw new Error(`Settings panel already registered: ${panel.id}`);\n if (panel.kind !== \"schema\" && input.hasView && !input.hasView(panel.viewId)) {\n throw new Error(`Settings panel View is not registered: ${panel.viewId}`);\n }\n\n const record = { ...normalizeContributionMetadata(metadata), ...panel } as RegisteredSettingsPanel;\n store.setState({ ...snapshot, panels: { ...snapshot.panels, [panel.id]: record } }, false, \"registerPanel\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.panels[panel.id] !== record) return;\n const { [panel.id]: _removed, ...nextPanels } = current.panels;\n for (const key of collectionItems.keys()) {\n if (key.startsWith(`[\"${panel.id}\",`)) collectionItems.delete(key);\n }\n store.setState({ ...current, panels: nextPanels }, false, \"unregisterPanel\");\n });\n },\n\n getSection(id) {\n return store.getState().sections[id];\n },\n\n getPanel(id) {\n return store.getState().panels[id];\n },\n\n listSections() {\n return Object.values(store.getState().sections).sort(byOrderThenPriority);\n },\n\n listPanels() {\n return Object.values(store.getState().panels).sort(byOrderThenPriority);\n },\n\n async resolveCollectionItem(panelId, itemId) {\n const panel = store.getState().panels[panelId];\n if (!panel || panel.kind !== \"collection\") return undefined;\n const item = (await panel.items()).find((candidate) => panel.itemId(candidate) === itemId);\n if (item !== undefined) collectionItems.set(itemKey(panelId, itemId), item);\n return item;\n },\n\n getCollectionItem: (panelId, itemId) => collectionItems.get(itemKey(panelId, itemId)),\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchStatusBarSlot = \"leading\" | \"trailing\";\n\nexport interface WorkbenchStatusBarItem {\n id: string;\n viewId: string;\n slot: WorkbenchStatusBarSlot;\n order?: number;\n isVisible?(): boolean;\n}\n\nexport interface WorkbenchStatusBarRegistryState {\n items: Record<string, WorkbenchStatusBarItem>;\n}\n\nexport interface WorkbenchStatusBarRegistry {\n store: WorkbenchStore<WorkbenchStatusBarRegistryState>;\n registerItem(item: WorkbenchStatusBarItem): Disposable;\n getItem(id: string): WorkbenchStatusBarItem | undefined;\n listItems(): WorkbenchStatusBarItem[];\n listVisibleItems(slot?: WorkbenchStatusBarSlot): WorkbenchStatusBarItem[];\n}\n\nexport interface CreateWorkbenchStatusBarRegistryInput {\n hasView(viewId: string): boolean;\n}\n\nconst bySlotOrderAndId = (left: WorkbenchStatusBarItem, right: WorkbenchStatusBarItem) =>\n left.slot.localeCompare(right.slot) || (left.order ?? 0) - (right.order ?? 0) || left.id.localeCompare(right.id);\n\nexport const createStatusBarRegistry = (input: CreateWorkbenchStatusBarRegistryInput): WorkbenchStatusBarRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusBarRegistryState>({\n name: \"workbench.statusBar\",\n initialState: { items: {} },\n });\n\n const listItems = () => Object.values(store.getState().items).sort(bySlotOrderAndId);\n\n return {\n store,\n\n registerItem(item) {\n const current = store.getState();\n if (current.items[item.id]) throw new Error(`Status bar item already registered: ${item.id}`);\n if (!input.hasView(item.viewId)) throw new Error(`Status bar view is not registered: ${item.viewId}`);\n if (item.order !== undefined && !Number.isFinite(item.order)) {\n throw new Error(`Status bar item order must be finite: ${item.id}`);\n }\n\n store.setState({ items: { ...current.items, [item.id]: item } }, false, \"registerItem\");\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.items[item.id] !== item) return;\n const { [item.id]: _removed, ...items } = snapshot.items;\n store.setState({ items }, false, \"unregisterItem\");\n });\n },\n\n getItem(id) {\n return store.getState().items[id];\n },\n\n listItems,\n\n listVisibleItems(slot) {\n return listItems().filter((item) => (!slot || item.slot === slot) && (item.isVisible?.() ?? true));\n },\n };\n};\n","import {\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\";\n\nexport interface WorkflowStatus {\n id: string;\n label: string;\n color: string;\n icon?: string | null;\n sortOrder: number;\n isDefault?: boolean;\n actions?: readonly string[];\n}\n\nexport interface WorkflowStatusAction {\n id: string;\n label: string;\n icon?: string;\n}\n\nexport interface WorkbenchStatusSetContribution {\n id: string;\n title: string;\n actions?: readonly WorkflowStatusAction[];\n query(): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n save?(statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n}\n\nexport type RegisteredWorkbenchStatusSet = WorkbenchStatusSetContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchStatusRegistryState {\n statusSets: Record<string, RegisteredWorkbenchStatusSet>;\n values: Record<string, readonly WorkflowStatus[]>;\n}\n\nexport interface WorkbenchStatusRegistry {\n store: WorkbenchStore<WorkbenchStatusRegistryState>;\n registerStatusSet(contribution: WorkbenchStatusSetContribution, metadata?: ContributionMetadata): Disposable;\n getStatusSet(id: string): RegisteredWorkbenchStatusSet | undefined;\n listStatusSets(): RegisteredWorkbenchStatusSet[];\n getStatuses(id: string): readonly WorkflowStatus[] | undefined;\n load(id: string): Promise<readonly WorkflowStatus[]>;\n query(id: string): Promise<readonly WorkflowStatus[]>;\n save(id: string, statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]>;\n}\n\nconst validateStatusActions = (\n set: WorkbenchStatusSetContribution,\n status: WorkflowStatus,\n actionIds: ReadonlySet<string>,\n) => {\n for (const actionId of status.actions ?? []) {\n if (!actionIds.has(actionId)) {\n throw new Error(`Status \"${set.id}.${status.id}\" references unknown action \"${actionId}\"`);\n }\n }\n};\n\nconst validateStatuses = (set: WorkbenchStatusSetContribution, statuses: readonly WorkflowStatus[]) => {\n const ids = new Set<string>();\n const actionIds = new Set((set.actions ?? []).map((action) => action.id));\n let defaultCount = 0;\n\n for (const status of statuses) {\n if (!status.id.trim()) throw new Error(`Status set \"${set.id}\" contains an empty status id`);\n if (ids.has(status.id)) throw new Error(`Status set \"${set.id}\" contains duplicate id \"${status.id}\"`);\n ids.add(status.id);\n if (!status.label.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a label`);\n if (!status.color.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a color`);\n if (!Number.isFinite(status.sortOrder)) throw new Error(`Status \"${set.id}.${status.id}\" must have a finite order`);\n validateStatusActions(set, status, actionIds);\n if (status.isDefault) defaultCount += 1;\n }\n\n if (defaultCount > 1) throw new Error(`Status set \"${set.id}\" has more than one default status`);\n return [...statuses].sort((left, right) => left.sortOrder - right.sortOrder || left.id.localeCompare(right.id));\n};\n\nexport const createStatusRegistry = (): WorkbenchStatusRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusRegistryState>({\n name: \"workbench.statuses\",\n initialState: { statusSets: {}, values: {} },\n });\n\n const requireSet = (id: string) => {\n const set = store.getState().statusSets[id];\n if (!set) throw new Error(`Status set is not registered: ${id}`);\n return set;\n };\n\n const loadingById = new Map<string, Promise<readonly WorkflowStatus[]>>();\n\n const query = async (id: string) => {\n const set = requireSet(id);\n const statuses = validateStatuses(set, await set.query());\n const current = store.getState();\n if (current.statusSets[id] === set) {\n store.setState({ ...current, values: { ...current.values, [id]: statuses } }, false, \"queryStatuses\");\n }\n return statuses;\n };\n\n return {\n store,\n\n registerStatusSet(contribution, metadata) {\n const current = store.getState();\n if (current.statusSets[contribution.id]) throw new Error(`Status set already registered: ${contribution.id}`);\n const record = { ...normalizeContributionMetadata(metadata), ...contribution };\n store.setState(\n { ...current, statusSets: { ...current.statusSets, [contribution.id]: record } },\n false,\n \"registerStatusSet\",\n );\n return createDisposable(() => {\n loadingById.delete(contribution.id);\n const snapshot = store.getState();\n if (snapshot.statusSets[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...statusSets } = snapshot.statusSets;\n const { [contribution.id]: _removedValues, ...values } = snapshot.values;\n store.setState({ statusSets, values }, false, \"unregisterStatusSet\");\n });\n },\n\n getStatusSet(id) {\n return store.getState().statusSets[id];\n },\n\n listStatusSets() {\n return Object.values(store.getState().statusSets).sort(\n (left, right) => byContributionPriority(left, right) || left.id.localeCompare(right.id),\n );\n },\n\n getStatuses(id) {\n return store.getState().values[id];\n },\n\n load(id) {\n const cached = store.getState().values[id];\n if (cached) return Promise.resolve(cached);\n\n const existing = loadingById.get(id);\n if (existing) return existing;\n\n const loading = query(id).finally(() => {\n if (loadingById.get(id) === loading) loadingById.delete(id);\n });\n loadingById.set(id, loading);\n return loading;\n },\n\n query,\n\n async save(id, statuses) {\n const set = requireSet(id);\n if (!set.save) throw new Error(`Status set is read-only: ${id}`);\n const input = validateStatuses(set, statuses);\n const saved = validateStatuses(set, await set.save(input));\n const current = store.getState();\n store.setState({ ...current, values: { ...current.values, [id]: saved } }, false, \"saveStatuses\");\n return saved;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { FileIconThemePreferenceOption } from \"./file-icon-theme-contracts\";\n\nexport interface WorkbenchFileIconThemeStoreState {\n themes: readonly FileIconThemePreferenceOption[];\n}\n\nexport interface FileIconThemeRegistry {\n store: WorkbenchStore<WorkbenchFileIconThemeStoreState>;\n register(themes: readonly FileIconThemePreferenceOption[]): Disposable;\n listThemes(): readonly FileIconThemePreferenceOption[];\n}\n\nexport const createFileIconThemeRegistry = (): FileIconThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchFileIconThemeStoreState>({\n name: \"workbench.fileIconThemes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly FileIconThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncFileIconThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ThemePreferenceOption } from \"./theme-contracts\";\n\nexport interface WorkbenchThemeStoreState {\n themes: readonly ThemePreferenceOption[];\n}\n\nexport interface ThemeRegistry {\n store: WorkbenchStore<WorkbenchThemeStoreState>;\n register(themes: readonly ThemePreferenceOption[]): Disposable;\n listThemes(): readonly ThemePreferenceOption[];\n}\n\nexport const createThemeRegistry = (): ThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchThemeStoreState>({\n name: \"workbench.themes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly ThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchPanelMenuDefinition, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchViewMenuContribution {\n id: string;\n ownerViewId: string;\n viewId: string;\n side: \"left\" | \"right\";\n priority?: number;\n mountStrategy?: \"active\" | \"keep-mounted\";\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchViewMenuRegistry {\n registerViewMenu(menu: WorkbenchViewMenuContribution): Disposable;\n getViewMenu(id: string): WorkbenchViewMenuContribution | undefined;\n listViewMenus(ownerViewId?: string): WorkbenchViewMenuContribution[];\n definitionsFor(ownerViewId: string, placementId: string): readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport const viewMenuPanelId = (placementId: string, menuId: string) =>\n `workbench.view-menu.${encodeURIComponent(placementId)}.${encodeURIComponent(menuId)}`;\n\nconst viewMenuConfig = (menu: WorkbenchViewMenuContribution) => {\n if (menu.config === undefined) return { viewContextId: menu.id };\n if (!menu.config || typeof menu.config !== \"object\" || Array.isArray(menu.config)) {\n return { viewContextId: menu.id, value: menu.config };\n }\n return { ...menu.config, viewContextId: menu.id };\n};\n\nexport const createWorkbenchViewMenuRegistry = (input: { views: WorkbenchViewRegistry }): WorkbenchViewMenuRegistry => {\n const menus = new Map<string, WorkbenchViewMenuContribution>();\n\n return {\n registerViewMenu(menu) {\n if (menus.has(menu.id)) throw new Error(`View menu already registered: ${menu.id}`);\n if (!input.views.getView(menu.ownerViewId)) {\n throw new Error(`View menu owner is not registered: ${menu.ownerViewId}`);\n }\n if (!input.views.getView(menu.viewId)) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n const record = { ...menu };\n menus.set(record.id, record);\n return createDisposable(() => {\n if (menus.get(record.id) === record) menus.delete(record.id);\n });\n },\n\n getViewMenu: (id) => menus.get(id),\n\n listViewMenus: (ownerViewId) =>\n [...menus.values()].filter((menu) => !ownerViewId || menu.ownerViewId === ownerViewId),\n\n definitionsFor(ownerViewId, placementId) {\n return [...menus.values()]\n .filter((menu) => menu.ownerViewId === ownerViewId)\n .map((menu) => {\n const view = input.views.getView(menu.viewId);\n if (!view) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n return {\n id: viewMenuPanelId(placementId, menu.id),\n title: view.title,\n icon: view.icon,\n side: menu.side,\n rendererId: view.id,\n priority: menu.priority,\n mountStrategy: menu.mountStrategy,\n hiddenByDefault: menu.hiddenByDefault,\n regionSize: menu.regionSize,\n regionCollapsible: menu.regionCollapsible,\n headerBorderBottom: menu.headerBorderBottom,\n config: viewMenuConfig(menu),\n };\n });\n },\n };\n};\n","import {\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 { ControlsRendererContribution } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererContribution } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererContribution } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererContribution } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistration } from \"../renderers/renderer-registry\";\nimport type { TreeRendererContribution } from \"../renderers/tree-renderer-registry\";\n\nexport const workbenchViewIdContextKey = \"workbench.view.id\";\n\ntype NativeViewBody<Kind extends string, Contribution> = { kind: Kind } & Omit<Contribution, \"id\" | \"title\" | \"icon\">;\n\nexport interface WorkbenchReactViewBody {\n kind: \"react\";\n render: WorkbenchRendererRegistration[\"render\"];\n}\n\nexport type WorkbenchViewBody =\n | WorkbenchReactViewBody\n | NativeViewBody<\"tree\", TreeRendererContribution>\n | NativeViewBody<\"file\", FileRendererContribution>\n | NativeViewBody<\"controls\", ControlsRendererContribution>\n | NativeViewBody<\"kanban\", KanbanRendererContribution>\n | NativeViewBody<\"dataTable\", DataTableRendererContribution>;\n\nexport interface WorkbenchViewContribution {\n id: string;\n title: string;\n icon?: string;\n body: WorkbenchViewBody;\n}\n\nexport type RegisteredWorkbenchView = WorkbenchViewContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchViewRegistryStoreState {\n views: Record<string, RegisteredWorkbenchView>;\n}\n\nexport interface WorkbenchViewRegistry {\n store: WorkbenchStore<WorkbenchViewRegistryStoreState>;\n registerView(view: WorkbenchViewContribution, metadata?: ContributionMetadata): Disposable;\n getView(viewId: string): RegisteredWorkbenchView | undefined;\n listViews(): RegisteredWorkbenchView[];\n refreshView(viewId: string, input?: unknown): void;\n}\n\nexport interface CreateWorkbenchViewRegistryInput {\n registerBody(\n view: WorkbenchViewContribution,\n metadata?: ContributionMetadata,\n ): Disposable & { refresh?(input?: unknown): void };\n}\n\nconst byPriorityAndId = (left: RegisteredWorkbenchView, right: RegisteredWorkbenchView) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport const createViewRegistry = (input: CreateWorkbenchViewRegistryInput): WorkbenchViewRegistry => {\n const store = createWorkbenchStore<WorkbenchViewRegistryStoreState>({\n name: \"workbench.views\",\n initialState: { views: {} },\n });\n const bodies = new Map<string, Disposable & { refresh?(input?: unknown): void }>();\n\n return {\n store,\n\n registerView(view, metadata) {\n const snapshot = store.getState();\n if (snapshot.views[view.id]) throw new Error(`View already registered: ${view.id}`);\n\n const body = input.registerBody(view, metadata);\n bodies.set(view.id, body);\n\n const record: RegisteredWorkbenchView = {\n ...view,\n ...normalizeContributionMetadata(metadata),\n };\n store.setState(\n {\n views: { ...snapshot.views, [view.id]: record },\n },\n false,\n \"registerView\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.views[view.id] !== record) return;\n const { [view.id]: _removed, ...views } = current.views;\n store.setState(\n {\n views,\n },\n false,\n \"unregisterView\",\n );\n body.dispose();\n bodies.delete(view.id);\n });\n },\n\n getView(viewId) {\n return store.getState().views[viewId];\n },\n\n listViews() {\n return Object.values(store.getState().views).sort(byPriorityAndId);\n },\n\n refreshView(viewId, refreshInput) {\n if (!store.getState().views[viewId]) throw new Error(`View is not registered: ${viewId}`);\n bodies.get(viewId)?.refresh?.(refreshInput);\n },\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementCloseController = (resolveCore: () => WorkbenchCore) => (identity: PlacementIdentity) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n if (!placement.closable) throw new Error(`Placement is fixed and cannot close: ${key}`);\n if (identity.kind === \"page\") {\n const result = core.pageLocations.closePlacement(identity);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return;\n }\n if (identity.kind === \"mode\") core.modePlacements.closePlacement(identity);\n else core.shellPlacements.closePlacement(identity);\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementPinController = (resolveCore: () => WorkbenchCore) => (identity: PlacementIdentity) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n if (placement.tabRetention !== \"preview\") return;\n if (identity.kind === \"page\") core.pages.pinPlacement(identity);\n else if (identity.kind === \"mode\") core.modePlacements.updatePlacement(identity, { open: \"pin\" });\n else core.shellPlacements.updatePlacement(identity, { open: \"pin\" });\n};\n","import { isLocalizedString, type NavigationTargetPage, type PageLocation, type PageRef } from \"@pstdio/sdk/extensions\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRegistry,\n WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { WorkbenchBreadcrumbController, WorkbenchBreadcrumbItem } from \"../breadcrumbs/breadcrumb-registry\";\nimport type { WorkbenchPageLocationController } from \"./page-location-controller\";\n\nconst pageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:${ref.id}`;\nconst locationsFromRoot = (location: PageLocation): PageLocation[] =>\n location.parent ? [...locationsFromRoot(location.parent), location] : [location];\nconst targetFromLocation = (location: PageLocation): NavigationTargetPage => ({\n kind: \"page\",\n page: location.page,\n ...(location.resource ? { resource: location.resource } : {}),\n ...(location.section ? { section: location.section } : {}),\n ...(location.parent ? { parent: targetFromLocation(location.parent) } : {}),\n});\nconst pageTitle = (page: WorkbenchPageContribution) => {\n if (page.title === undefined) return page.ref.id;\n if (!isLocalizedString(page.title)) return page.title;\n return page.title.default ?? page.title.$l10n;\n};\nexport const createWorkbenchPageBreadcrumbItems = (input: {\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n}): WorkbenchBreadcrumbItem[] => {\n const pagesByRef = new Map(input.pages.map((page) => [pageRefKey(page.ref), page]));\n const locations = locationsFromRoot(input.location);\n return locations.map((location, index) => {\n const page = pagesByRef.get(pageRefKey(location.page));\n const item: WorkbenchBreadcrumbItem = {\n title: location.resource?.label ?? (page ? pageTitle(page) : location.page.id),\n icon: page?.icon,\n ...(location.resource ? { resource: input.resources.normalize(location.resource) } : {}),\n };\n if (index < locations.length - 1) {\n item.onClick = () => input.navigate(targetFromLocation(location));\n }\n return item;\n });\n};\nexport const setWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n}) => input.breadcrumbs.setItems(createWorkbenchPageBreadcrumbItems(input));\nexport const connectWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n locations: WorkbenchPageLocationController;\n pages: WorkbenchPageRegistry<unknown>;\n resources: WorkbenchPageResourceCodec;\n}) => {\n let ownedBreadcrumbs:\n | {\n dispose(): void;\n }\n | undefined;\n const sync = () => {\n const state = input.pages.store.getState();\n if (!state.activePageId || !state.location) {\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = undefined;\n return;\n }\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = setWorkbenchPageBreadcrumbs({\n breadcrumbs: input.breadcrumbs,\n location: state.location,\n pages: Object.values(state.pages),\n resources: input.resources,\n navigate: (target) => {\n input.locations.navigate(target);\n },\n });\n };\n const subscription = getWorkbenchPageRegistryInternals(input.pages).onDidCommit(sync);\n sync();\n return createDisposable(() => {\n subscription.dispose();\n ownedBreadcrumbs?.dispose();\n });\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type {\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationPersistence,\n} from \"./page-location-controller\";\n\nexport const createMemoryWorkbenchPageLocationBrowser = (): WorkbenchPageLocationBrowser => {\n const entries: WorkbenchPageBrowserEntry[] = [{ url: \"/\" }];\n let index = 0;\n const listeners = new Set<(entry: WorkbenchPageBrowserEntry) => void>();\n const notify = () => {\n for (const listener of listeners) listener(entries[index]!);\n };\n return {\n current: () => entries[index]!,\n push: (entry) => {\n entries.splice(index + 1);\n entries.push(entry);\n index = entries.length - 1;\n },\n replace: (entry) => {\n entries[index] = entry;\n },\n back: () => {\n if (index === 0) return;\n index -= 1;\n notify();\n },\n forward: () => {\n if (index >= entries.length - 1) return;\n index += 1;\n notify();\n },\n onPopState: (listener) => {\n listeners.add(listener);\n return { dispose: () => listeners.delete(listener) };\n },\n };\n};\n\nexport const createMemoryWorkbenchPageLocationPersistence = (): WorkbenchPageLocationPersistence => {\n const locations = new Map<string, PageLocation>();\n return {\n load: (projectId) => locations.get(projectId),\n save: (projectId, location) => locations.set(projectId, location),\n };\n};\n","import { dockedWorkbenchRegions, type PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport {\n activateInLayout,\n findPlacementByWidgetId,\n getActiveLocationPlacement,\n removeLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport {\n type WorkbenchLayout,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchRegions,\n} from \"./layout-types\";\nimport { composeOwnedPlacements, placementIdentityKey, type ResolvedOwnedPlacement } from \"./placement-reconciliation\";\n\nexport type WorkbenchOwnedWidgetPlacement = ResolvedOwnedPlacement<WorkbenchWidgetPlacement>;\n\nexport interface ReconcileOwnedWidgetLayoutInput {\n layout: WorkbenchLayout;\n modeLayout?: WorkbenchLayout;\n placements: readonly WorkbenchOwnedWidgetPlacement[];\n activate?: readonly PlacementIdentity[];\n}\n\nexport interface ApplyOwnedWidgetLayoutReconciliationInput extends ReconcileOwnedWidgetLayoutInput {\n remove: readonly PlacementIdentity[];\n}\n\ninterface RenderedOwnedPlacement {\n identity: PlacementIdentity;\n region: WorkbenchOwnedWidgetPlacement[\"region\"];\n placement: WorkbenchWidgetPlacement;\n transferredFromKey?: string;\n}\n\nconst bindsToLocation = (placement: WorkbenchOwnedWidgetPlacement) =>\n placement.value.role === \"sub-panel\" && (placement.identity.kind === \"page\" || Boolean(placement.value.resourceKey));\n\nconst indexCurrentOwnedPlacements = (layout: WorkbenchLayout) => {\n const indexed = new Map<string, { region: WorkbenchRegion; placement: WorkbenchWidgetPlacement }>();\n for (const region of Object.values(layout.regions)) {\n for (const placement of region.widgets) {\n if (!placement.placementIdentity) continue;\n const key = placementIdentityKey(placement.placementIdentity);\n if (indexed.has(key)) throw new Error(`Duplicate rendered placement identity: ${key}`);\n indexed.set(key, { region: region.id, placement });\n }\n }\n return indexed;\n};\n\nconst findModePlacementTransfer = (input: {\n current: ReturnType<typeof indexCurrentOwnedPlacements>;\n desired: WorkbenchOwnedWidgetPlacement;\n desiredKeys: ReadonlySet<string>;\n transferredCurrentKeys: ReadonlySet<string>;\n}) => {\n if (input.desired.identity.kind !== \"mode\") return undefined;\n const desiredIdentity = input.desired.identity;\n return [...input.current.entries()].find(\n ([currentKey, candidate]) =>\n !input.desiredKeys.has(currentKey) &&\n !input.transferredCurrentKeys.has(currentKey) &&\n candidate.placement.placementIdentity?.kind === \"mode\" &&\n (candidate.placement.placementIdentity.modeId !== desiredIdentity.modeId ||\n candidate.placement.placementIdentity.placementId !== desiredIdentity.placementId) &&\n candidate.region === input.desired.region &&\n candidate.placement.contributionId === input.desired.value.contributionId &&\n candidate.placement.viewId === input.desired.value.viewId,\n );\n};\n\nconst indexCurrentWidgetOwners = (layout: WorkbenchLayout) => {\n const owners = new Map<string, string | null>();\n for (const region of Object.values(layout.regions)) {\n for (const placement of region.widgets) {\n if (owners.has(placement.widgetId)) throw new Error(`Duplicate rendered widget ID: ${placement.widgetId}`);\n owners.set(\n placement.widgetId,\n placement.placementIdentity ? placementIdentityKey(placement.placementIdentity) : null,\n );\n }\n }\n return owners;\n};\n\nconst restoreModeWidgets = (\n widgets: readonly WorkbenchWidgetPlacement[],\n saved: readonly WorkbenchWidgetPlacement[],\n desired: ReadonlyMap<string, RenderedOwnedPlacement>,\n) => {\n const currentIds = new Set(widgets.map((widget) => widget.widgetId));\n return [\n ...widgets,\n ...saved.filter(\n (widget) =>\n !currentIds.has(widget.widgetId) &&\n widget.placementIdentity &&\n desired.has(placementIdentityKey(widget.placementIdentity)),\n ),\n ];\n};\n\nconst renderDesiredPlacements = (\n input: ReconcileOwnedWidgetLayoutInput,\n current: ReturnType<typeof indexCurrentOwnedPlacements>,\n) => {\n const rendered: RenderedOwnedPlacement[] = [];\n const identities = new Set<string>();\n const currentWidgetOwners = indexCurrentWidgetOwners(input.layout);\n const desiredWidgetIds = new Set<string>();\n\n const ordered = composeOwnedPlacements({\n shell: input.placements.filter((placement) => placement.identity.kind === \"shell\"),\n mode: input.placements.filter((placement) => placement.identity.kind === \"mode\"),\n page: input.placements.filter((placement) => placement.identity.kind === \"page\"),\n }).placements;\n const desiredKeys = new Set(ordered.map((placement) => placementIdentityKey(placement.identity)));\n const transferredCurrentKeys = new Set<string>();\n for (const desired of ordered) {\n const key = placementIdentityKey(desired.identity);\n if (identities.has(key)) throw new Error(`Duplicate desired placement identity: ${key}`);\n identities.add(key);\n const exact = current.get(key);\n const transfer = exact\n ? undefined\n : findModePlacementTransfer({ current, desired, desiredKeys, transferredCurrentKeys });\n const transferredFromKey = transfer?.[0];\n if (transferredFromKey) transferredCurrentKeys.add(transferredFromKey);\n const widgetId = exact?.placement.widgetId ?? transfer?.[1].placement.widgetId ?? desired.value.widgetId;\n const currentOwner = currentWidgetOwners.get(widgetId);\n if (currentOwner !== undefined && currentOwner !== key && currentOwner !== transferredFromKey) {\n throw new Error(`Rendered widget ID belongs to another placement: ${widgetId}`);\n }\n if (desiredWidgetIds.has(widgetId)) throw new Error(`Duplicate desired widget ID: ${widgetId}`);\n desiredWidgetIds.add(widgetId);\n const ownerResourceKey = bindsToLocation(desired)\n ? (desired.value.ownerResourceKey ??\n exact?.placement.ownerResourceKey ??\n transfer?.[1].placement.ownerResourceKey)\n : desired.value.ownerResourceKey;\n rendered.push({\n identity: desired.identity,\n region: desired.region,\n placement: {\n ...desired.value,\n widgetId,\n placementIdentity: desired.identity,\n ...(ownerResourceKey ? { ownerResourceKey } : {}),\n },\n ...(transferredFromKey ? { transferredFromKey } : {}),\n });\n }\n return rendered;\n};\n\nconst reconcileRegions = (\n layout: WorkbenchLayout,\n desired: readonly RenderedOwnedPlacement[],\n removedKeys: ReadonlySet<string>,\n modeLayout?: WorkbenchLayout,\n) => {\n const docked = new Set<WorkbenchRegion>(dockedWorkbenchRegions);\n const regions = { ...layout.regions };\n const desiredByKey = new Map(desired.map((placement) => [placementIdentityKey(placement.identity), placement]));\n const transferredCurrentKeys = new Set(desired.flatMap((placement) => placement.transferredFromKey ?? []));\n for (const regionId of workbenchRegions) {\n const region = layout.regions[regionId];\n const pageOwnsPrimaryLocation = desired.some(\n (entry) => entry.region === regionId && entry.identity.kind === \"page\" && entry.placement.role === \"location\",\n );\n // A routed page owns the primary Location. An unowned Location cannot coexist\n // with it because that would turn page replacement into tab accumulation.\n // Other unowned host panels remain additive.\n const placedKeys = new Set<string>();\n // Keep the visible order while updating existing placements in place. Any\n // desired placement left afterward is a new tab and belongs at the end.\n const restored = restoreModeWidgets(region.widgets, modeLayout?.regions[regionId].widgets ?? [], desiredByKey);\n const widgets = restored.flatMap((placement) => {\n if (!placement.placementIdentity) {\n return regionId === \"main\" && pageOwnsPrimaryLocation && placement.role === \"location\" ? [] : [placement];\n }\n const key = placementIdentityKey(placement.placementIdentity);\n const replacement = desiredByKey.get(key);\n if (replacement) {\n if (replacement.region !== regionId) return [];\n placedKeys.add(key);\n return [replacement.placement];\n }\n return removedKeys.has(key) || transferredCurrentKeys.has(key) ? [] : [placement];\n });\n for (const entry of desired) {\n const key = placementIdentityKey(entry.identity);\n if (entry.region === regionId && !placedKeys.has(key)) widgets.push(entry.placement);\n }\n // Page caches omit mode tabs. Recover their shared selection from the mode's cache.\n const activeWidgetId =\n [region.activeWidgetId, modeLayout?.regions[regionId].activeWidgetId].find((id) =>\n widgets.some((placement) => placement.widgetId === id),\n ) ?? widgets[0]?.widgetId;\n const opensPreviouslyEmptyRegion =\n region.widgets.length === 0 && widgets.some((placement) => !placement.hiddenByDefault);\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId,\n ...(docked.has(regionId) ? { visible: region.visible || opensPreviouslyEmptyRegion } : {}),\n };\n }\n return { ...layout, regions };\n};\n\nconst normalizeRemovedState = (input: {\n current: ReturnType<typeof indexCurrentOwnedPlacements>;\n desired: readonly RenderedOwnedPlacement[];\n removedKeys: ReadonlySet<string>;\n layout: WorkbenchLayout;\n}) => {\n const transferredCurrentKeys = new Set(input.desired.flatMap((placement) => placement.transferredFromKey ?? []));\n let layout = input.layout;\n for (const [key, current] of input.current) {\n if (input.removedKeys.has(key) && !transferredCurrentKeys.has(key)) {\n layout = removeLocationSubPanelSelection(layout, current.placement.widgetId);\n }\n }\n\n const activeLocation = layout.activeLocationWidgetId\n ? findPlacementByWidgetId(layout, layout.activeLocationWidgetId)?.placement\n : undefined;\n const fallbackLocation = layout.regions.main.widgets.filter((placement) => placement.role === \"location\").at(-1);\n const activeLocationWidgetId = activeLocation?.widgetId ?? fallbackLocation?.widgetId;\n const active = layout.activeWidgetId ? findPlacementByWidgetId(layout, layout.activeWidgetId)?.placement : undefined;\n const fallbackActive = activeLocationWidgetId\n ? findPlacementByWidgetId(layout, activeLocationWidgetId)?.placement\n : Object.values(layout.regions).flatMap((region) => region.widgets)[0];\n\n return {\n ...layout,\n activeWidgetId: active?.widgetId ?? fallbackActive?.widgetId,\n activeLocationWidgetId,\n activeResourceKey: active?.resourceKey ?? fallbackActive?.resourceKey,\n };\n};\n\nconst bindOwnedSubPanelsToLocation = (layout: WorkbenchLayout, desired: readonly RenderedOwnedPlacement[]) => {\n const ownerResourceKey = getActiveLocationPlacement(layout)?.resourceKey;\n if (!ownerResourceKey) return layout;\n const desiredByKey = new Map(desired.map((entry) => [placementIdentityKey(entry.identity), entry]));\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((placement) => {\n if (placement.role !== \"sub-panel\" || !placement.placementIdentity) return placement;\n const desiredPlacement = desiredByKey.get(placementIdentityKey(placement.placementIdentity));\n if (!desiredPlacement) return placement;\n if (desiredPlacement.identity.kind !== \"page\" && !desiredPlacement.placement.resourceKey) return placement;\n return { ...placement, ownerResourceKey };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n return { ...layout, regions };\n};\n\nconst updateOwnedWidgetLayout = (input: ReconcileOwnedWidgetLayoutInput, removedKeys: ReadonlySet<string>) => {\n if (input.placements.length === 0 && removedKeys.size === 0 && (input.activate?.length ?? 0) === 0) {\n return input.layout;\n }\n const current = indexCurrentOwnedPlacements(input.layout);\n const desired = renderDesiredPlacements(input, current);\n let layout: WorkbenchLayout = normalizeRemovedState({\n current,\n desired,\n removedKeys,\n layout: reconcileRegions(input.layout, desired, removedKeys, input.modeLayout),\n });\n const desiredByIdentity = new Map(desired.map((entry) => [placementIdentityKey(entry.identity), entry]));\n\n for (const identity of input.activate ?? []) {\n const entry = desiredByIdentity.get(placementIdentityKey(identity));\n if (!entry) throw new Error(`Cannot activate missing rendered placement: ${placementIdentityKey(identity)}`);\n layout = activateInLayout(layout, entry.region, entry.placement);\n }\n return bindOwnedSubPanelsToLocation(layout, desired);\n};\n\nexport const reconcileOwnedWidgetLayout = (input: ReconcileOwnedWidgetLayoutInput) => {\n const desiredKeys = new Set(input.placements.map((placement) => placementIdentityKey(placement.identity)));\n const current = indexCurrentOwnedPlacements(input.layout);\n const removedKeys = new Set([...current.keys()].filter((key) => !desiredKeys.has(key)));\n return updateOwnedWidgetLayout(input, removedKeys);\n};\n\nexport const applyOwnedWidgetLayoutReconciliation = (input: ApplyOwnedWidgetLayoutReconciliationInput) =>\n updateOwnedWidgetLayout(input, new Set(input.remove.map(placementIdentityKey)));\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel, WorkbenchRegion } from \"../../registries/layout/layout-model\";\nimport { createPlacement } from \"../../registries/layout/layout-operations\";\nimport type { WorkbenchLayout, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport {\n applyOwnedWidgetLayoutReconciliation,\n reconcileOwnedWidgetLayout,\n} from \"../../registries/layout/owned-placement-layout\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchModePlacementRegistry } from \"../../registries/modes/mode-placement-registry\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport { activateWorkbenchPageMode } from \"../../registries/modes/mode-registry-internals\";\nimport { pagePlacementDeclarations } from \"../../registries/pages/page-main\";\nimport {\n type CreateWorkbenchPageRegistryInput,\n createWorkbenchPageRegistry,\n type WorkbenchPagePlacementInput,\n type WorkbenchPageRegistry,\n type WorkbenchPageRegistryStoreState,\n type WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createOwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport type { WorkbenchShellPlacementRegistry } from \"../../registries/placements/shell-placement-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../../registries/view-menus/view-menu-registry\";\nimport { pagePlacementContributionId, registerWorkbenchViewPlacement } from \"../../registries/views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../../registries/views/view-registry\";\nimport { contributionRefId } from \"../../shared/contributions/reference-id\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { defaultPageResourceCodec } from \"../page-location/page-resource-codec\";\nexport interface ConnectWorkbenchPageRuntimeInput {\n loadModeLayout?(projectId: string | undefined, modeId: string): WorkbenchLayout | undefined;\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modes: WorkbenchModeRegistry;\n registry: WorkbenchPageRegistry<WorkbenchWidgetPlacement>;\n}\nconst syncOwnedPanelMenus = (layout: LayoutModel) => {\n const ownedPlacements = Object.values(layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .filter((placement) => Boolean(placement.placementIdentity));\n for (const placement of ownedPlacements) {\n const owner = layout.getWidget(placement.contributionId);\n for (const menuId of owner?.ownedPanelMenuIds ?? []) {\n const menu = layout.getWidget(menuId);\n if (!menu) continue;\n layout.openWidget(menuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: menu.rendererId,\n resource: placement.resource,\n title: menu.region.endsWith(\"-left-menu\") ? placement.resource?.label : menu.title,\n });\n }\n }\n layout.reconcilePanelMenus();\n};\nconst bindPlacementsToActivePageLocation = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const ownerResourceKey = resourceKey(state.location?.resource);\n if (!ownerResourceKey) return state.placements;\n return state.placements.map((placement) =>\n placement.value.role === \"sub-panel\" && (placement.identity.kind === \"page\" || Boolean(placement.value.resourceKey))\n ? { ...placement, value: { ...placement.value, ownerResourceKey } }\n : placement,\n );\n};\nconst applyPageState = (\n input: ConnectWorkbenchPageRuntimeInput,\n state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>,\n source: \"transition\" | \"scope-restore\",\n storeBeforeTransition = input.registry.store.getState(),\n) => {\n const previousScope = input.layout.getPersistenceScope();\n activateWorkbenchPageMode(input.modes, state.activeModeId, () => {\n // Scope listeners must apply the destination mode's panel policy to its saved layout.\n if (source === \"transition\") input.beforeApply?.(state);\n // Mode listeners may open or close mode/shell placements after the mode is\n // published. Reconcile the latest registry state so this transition cannot\n // overwrite those declarative changes with the snapshot that began it.\n const stored = input.registry.store.getState();\n const latest = stored === storeBeforeTransition ? state : stored;\n const activation =\n latest.reconciliation.activate.length > 0 ? latest.reconciliation.activate : state.reconciliation.activate;\n const layoutInput = {\n layout: input.layout.getLayout(),\n modeLayout: latest.activeModeId ? input.loadModeLayout?.(latest.projectId, latest.activeModeId) : undefined,\n placements: bindPlacementsToActivePageLocation(latest),\n activate: activation.map((placement) => placement.identity),\n };\n let layout: ReturnType<typeof reconcileOwnedWidgetLayout>;\n // A restored cache needs the complete owned set; a delta belongs to the previous scope.\n if (source === \"scope-restore\" || input.layout.getPersistenceScope() !== previousScope) {\n layout = reconcileOwnedWidgetLayout(layoutInput);\n } else {\n layout = applyOwnedWidgetLayoutReconciliation({\n ...layoutInput,\n remove: latest.reconciliation.remove.map((placement) => placement.identity),\n });\n }\n input.layout.restoreLayout(layout);\n syncOwnedPanelMenus(input.layout);\n if (source === \"transition\") {\n for (const placement of activation) input.revealRegion?.(placement.region);\n }\n });\n};\nexport const connectWorkbenchPageRuntime = (input: ConnectWorkbenchPageRuntimeInput) => {\n let applyingTransition = false;\n const runtime = getWorkbenchPageRegistryInternals(input.registry).connectRuntime((state) => {\n const storeBeforeTransition = input.registry.store.getState();\n applyingTransition = true;\n try {\n applyPageState(input, state, \"transition\", storeBeforeTransition);\n } finally {\n applyingTransition = false;\n }\n });\n const scope = input.layout.onDidChangePersistenceScope(() => {\n if (!applyingTransition) applyPageState(input, input.registry.store.getState(), \"scope-restore\");\n });\n return createDisposable(() => {\n scope.dispose();\n runtime.dispose();\n });\n};\nconst toTabState = (open: WorkbenchPagePlacementInput[\"open\"]) => {\n if (!open) return {};\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n return { pinned: false, tabRetention: \"preview\" as const };\n};\nconst toWidgetPlacement = (\n input: WorkbenchPagePlacementInput,\n layout: LayoutModel,\n views: WorkbenchViewRegistry,\n): WorkbenchWidgetPlacement => {\n const resource = input.resource;\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench page view is not registered: ${input.viewId}`);\n const panelId = pagePlacementContributionId(input.pageId, input.slotId);\n const panel = layout.getWidget(panelId);\n if (!panel) throw new Error(`Workbench page placement is not registered: ${input.pageId}.${input.slotId}`);\n return {\n ...createPlacement(`workbench.page.${encodeURIComponent(placementIdentityKey(input.identity))}`, panel, {\n viewId: input.viewId,\n title: resource?.label ?? view.title ?? panel.title,\n role: input.role === \"primary\" ? \"location\" : \"sub-panel\",\n closable: input.closable,\n ...(resource ? { resource } : {}),\n ...toTabState(input.open),\n }),\n ...(input.section ? { section: input.section } : {}),\n };\n};\nexport interface CreateLiveWorkbenchPageRegistryInput {\n loadModeLayout?: ConnectWorkbenchPageRuntimeInput[\"loadModeLayout\"];\n restorePageState?: CreateWorkbenchPageRegistryInput<WorkbenchWidgetPlacement>[\"restorePageState\"];\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modePlacements: WorkbenchModePlacementRegistry;\n shellPlacements: WorkbenchShellPlacementRegistry;\n modes: WorkbenchModeRegistry;\n resources?: WorkbenchPageResourceCodec;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}\nexport const createLiveWorkbenchPageRegistry = (input: CreateLiveWorkbenchPageRegistryInput) => {\n const resources = input.resources ?? defaultPageResourceCodec;\n const registry = createWorkbenchPageRegistry<WorkbenchWidgetPlacement>({\n restorePageState: input.restorePageState,\n validateMode: (modeId) => {\n if (!input.modes.getMode(modeId)) throw new Error(`Workbench mode not registered: ${modeId}`);\n },\n resolveShellPlacements: (context) => input.shellPlacements.resolvePlacements(context),\n resolveModePlacements: (modeId, location, projectId, pageId) =>\n input.modePlacements.resolvePlacements(modeId, projectId ? { modeId, location, projectId, pageId } : undefined),\n resolvePagePlacement: (placement) => toWidgetPlacement(placement, input.layout, input.views),\n resources,\n valuesEqual: (left, right) => JSON.stringify(left) === JSON.stringify(right),\n registerPagePlacements: (page) => {\n const registrations = pagePlacementDeclarations(page).map((slot) => {\n const viewId = contributionRefId(slot.item.kind === \"view\" ? slot.item.view : slot.item.binding.view);\n if (!viewId) throw new Error(`Workbench page slot view is not registered: ${page.id}.${slot.id}`);\n const closable = slot.item.kind === \"binding\" || slot.item.presence !== \"fixed\";\n return registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...slot,\n id: pagePlacementContributionId(page.id, slot.id),\n viewId,\n role: slot.role === \"primary\" ? \"location\" : \"sub-panel\",\n singleton: slot.item.kind === \"view\" || slot.item.binding.cardinality !== \"many\",\n closable,\n },\n input.viewMenus,\n );\n });\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n },\n });\n connectWorkbenchPageRuntime({\n loadModeLayout: input.loadModeLayout,\n beforeApply: (state) => {\n input.beforeApply?.(state);\n const shell = getOwnedPlacementPreparation(input.shellPlacements);\n shell.apply(\n shell.adopt!(\n state.activeModeId ?? \"\",\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n const mode = getOwnedPlacementPreparation(input.modePlacements);\n if (state.projectId !== registry.store.getState().projectId) mode.apply(createOwnedPlacementState());\n if (state.activeModeId)\n mode.apply(\n mode.adopt!(\n state.activeModeId,\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n },\n revealRegion: input.revealRegion,\n layout: input.layout,\n modes: input.modes,\n registry,\n });\n getOwnedPlacementPreparation(input.modePlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshModePlacements(),\n );\n getOwnedPlacementPreparation(input.shellPlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshShellPlacements(),\n );\n return registry;\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout } from \"../../registries/layout/layout-types\";\nimport { pageSlots } from \"../../registries/pages/page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"../../registries/pages/page-registry-types\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { createWorkbenchInput, WorkbenchPagePersistenceScopeInput } from \"../../workbench-core-types\";\n\n// The layout already persists instance resources, retention, and selection. Rebuild\n// the page owner's state from that cache instead of storing a second copy.\nexport const pageStateFromLayout = (\n page: WorkbenchPageContribution,\n layout: WorkbenchLayout,\n): WorkbenchPageRuntimeState => {\n const placements = Object.values(layout.regions).flatMap((region) => region.widgets);\n const openStaticSlotIds: string[] = [];\n const resourceInstances: Record<string, WorkbenchPageSlotInstance[]> = {};\n let activePrimaryInstanceKey: string | undefined;\n for (const slot of pageSlots(page)) {\n const matching = placements.filter(\n (placement) =>\n placement.placementIdentity?.kind === \"page\" &&\n placement.placementIdentity.pageId === page.id &&\n placement.placementIdentity.slotId === slot.id,\n );\n if (slot.item.kind === \"view\") {\n if (matching.length) openStaticSlotIds.push(slot.id);\n continue;\n }\n const binding = slot.item.binding;\n const instances = matching.flatMap((placement) => {\n const identity = placement.placementIdentity;\n if (!identity || !placement.resource || !resourceMatchesConstraint(binding, placement.resource)) return [];\n return [\n {\n instanceKey: identity.instanceKey,\n resource: placement.resource,\n ...(placement.section ? { section: placement.section } : {}),\n ...(binding.cardinality === \"many\"\n ? { open: placement.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n resourceInstances[slot.id] = binding.cardinality === \"one\" ? instances.slice(-1) : instances;\n if (slot.role === \"primary\") {\n const active = matching.find((placement) => layout.regions.main.activeWidgetId === placement.widgetId);\n activePrimaryInstanceKey = active?.placementIdentity?.instanceKey;\n }\n }\n return { openStaticSlotIds, resourceInstances, activePrimaryInstanceKey };\n};\n\nexport const loadWorkbenchLocationLayout = (\n input: createWorkbenchInput,\n context: WorkbenchPagePersistenceScopeInput,\n) => {\n const scope = input.resolvePagePersistenceScope?.(context).scope;\n return input.persistence?.getSnapshot(scope)?.layout ?? input.layoutPersistence?.getLayout(scope);\n};\n\nexport const createPageStateRestorer =\n (input: createWorkbenchInput) => (page: WorkbenchPageContribution, location: PageLocation, projectId: string) => {\n const layout = loadWorkbenchLocationLayout(input, {\n modeId: page.modeId,\n pageId: page.id,\n projectId,\n resource: location.resource,\n });\n if (\n !layout ||\n !Object.values(layout.regions).some((region) =>\n region.widgets.some(\n (placement) => placement.placementIdentity?.kind === \"page\" && placement.placementIdentity.pageId === page.id,\n ),\n )\n )\n return undefined;\n return pageStateFromLayout(page, layout);\n };\n","import type { LayoutPersistenceAdapter } from \"../../registries/layout/layout-model-types\";\nimport {\n type WorkbenchLayout,\n type WorkbenchWidgetPlacement,\n workbenchRegions,\n} from \"../../registries/layout/layout-types\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createWorkbenchInput } from \"../../workbench-core-types\";\n\nconst selectPlacements = (layout: WorkbenchLayout, include: (placement: WorkbenchWidgetPlacement) => boolean) => {\n const regions = { ...layout.regions };\n for (const id of workbenchRegions) {\n const region = layout.regions[id];\n const widgets = region.widgets.filter(include);\n regions[id] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((widget) => widget.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n return { ...layout, regions };\n};\nconst modeScope = (projectId: string | undefined, modeId: string) =>\n `workbench-mode:${JSON.stringify([projectId ?? null, modeId])}`;\n\n/** Page caches hold page and shell placements. Shared mode choices have one project/mode owner. */\nexport const createWorkbenchLayoutCache = (input: createWorkbenchInput) => {\n const adapter: LayoutPersistenceAdapter | undefined = input.persistence\n ? {\n getLayout: (scope) => input.persistence?.getSnapshot(scope)?.layout,\n setLayout: (layout, scope) => input.persistence?.setSnapshot({ layout }, scope),\n flush: input.persistence.flush,\n dispose: input.persistence.dispose,\n }\n : input.layoutPersistence;\n const read = (scope?: string) =>\n runWorkbenchEffect(`layout cache read for ${scope ?? \"unscoped\"}`, () => adapter?.getLayout(scope));\n const write = (layout: WorkbenchLayout, scope?: string) =>\n runWorkbenchEffect(`layout cache write for ${scope ?? \"unscoped\"}`, () => adapter?.setLayout(layout, scope));\n return {\n layout: adapter\n ? {\n ...adapter,\n getLayout: read,\n setLayout: (layout: WorkbenchLayout, scope?: string) =>\n write(\n selectPlacements(layout, (p) => p.placementIdentity?.kind !== \"mode\"),\n scope,\n ),\n }\n : undefined,\n readMode: (projectId: string | undefined, modeId: string) => read(modeScope(projectId, modeId)),\n saveMode: (projectId: string | undefined, modeId: string, layout: WorkbenchLayout) =>\n write(\n selectPlacements(layout, (p) => p.placementIdentity?.kind === \"mode\" && p.placementIdentity.modeId === modeId),\n modeScope(projectId, modeId),\n ),\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchRegion } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchSidePanelController, WorkbenchSidePanelMode } from \"../side-panel/side-panel-controller\";\n\nexport type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;\n\nexport type WorkbenchShellOpenRegion = \"sidenav\" | \"secondary\" | \"side\";\n\nexport interface WorkbenchShellRegionState {\n open: boolean;\n size?: number;\n}\n\nexport interface WorkbenchShellController {\n getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;\n setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;\n setRegionSize(region: WorkbenchRegion, size: number): void;\n getSidePanelPresentation(): WorkbenchSidePanelPresentation;\n setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;\n onDidChange(listener: () => void): Disposable;\n}\n\nexport const createWorkbenchShellController = (input: {\n layout: LayoutModel;\n sidePanel: WorkbenchSidePanelController;\n}): WorkbenchShellController => ({\n getRegionState(region) {\n const state = input.layout.getLayout().regions[region];\n return { open: region === \"side\" ? input.sidePanel.getMode() !== \"closed\" : state.visible, size: state.size };\n },\n\n setRegionOpen(region, open) {\n if (region === \"side\") {\n if (!open) input.sidePanel.setMode(\"closed\");\n else if (input.sidePanel.getMode() === \"closed\") input.sidePanel.setMode(\"attached\");\n return;\n }\n input.layout.setRegionVisible(region, open);\n },\n\n setRegionSize(region, size) {\n input.layout.setRegionSize(region, size);\n },\n\n getSidePanelPresentation: input.sidePanel.getMode,\n setSidePanelPresentation: input.sidePanel.setMode,\n\n onDidChange(listener) {\n const unsubscribeLayout = input.layout.store.subscribeSelector((state) => state.layout, listener);\n const sidePanelSubscription = input.sidePanel.onDidChange(listener);\n return createDisposable(() => {\n unsubscribeLayout();\n sidePanelSubscription.dispose();\n });\n },\n});\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ControlsRendererRegistry } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererRegistry } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererRegistry } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererRegistry } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistry } from \"../renderers/renderer-registry\";\nimport type { TreeRendererRegistry } from \"../renderers/tree-renderer-registry\";\nimport type { WorkbenchViewContribution } from \"./view-registry\";\n\ntype ViewBodyRegistries = Pick<WorkbenchRendererRegistry, \"refreshRenderer\" | \"registerRenderer\"> &\n Pick<TreeRendererRegistry, \"refresh\" | \"registerTreeRenderer\"> &\n Pick<KanbanRendererRegistry, \"refreshKanbanRenderer\" | \"registerKanbanRenderer\"> &\n Pick<DataTableRendererRegistry, \"refreshDataTableRenderer\" | \"registerDataTableRenderer\"> &\n Pick<FileRendererRegistry, \"refreshFileRenderer\" | \"registerFileRenderer\"> &\n Pick<ControlsRendererRegistry, \"refreshControlsRenderer\" | \"registerControlsRenderer\">;\n\nconst refreshable = <T extends { dispose(): void }>(registration: T, refresh: (input?: unknown) => void) => ({\n dispose: () => registration.dispose(),\n refresh,\n});\n\nexport const createWorkbenchViewBodyRegistration =\n (registries: ViewBodyRegistries) => (view: WorkbenchViewContribution, metadata?: ContributionMetadata) => {\n const body = view.body;\n if (body.kind === \"react\") {\n return refreshable(registries.registerRenderer({ id: view.id, render: body.render }), () =>\n registries.refreshRenderer(view.id),\n );\n }\n if (body.kind === \"tree\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerTreeRenderer({ ...definition, id: view.id, title: view.title, icon: view.icon }, metadata),\n () => registries.refresh(view.id),\n );\n }\n if (body.kind === \"file\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerFileRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n (input) =>\n registries.refreshFileRenderer(view.id, input as Parameters<FileRendererRegistry[\"refreshFileRenderer\"]>[1]),\n );\n }\n if (body.kind === \"controls\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerControlsRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshControlsRenderer(view.id),\n );\n }\n if (body.kind === \"kanban\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerKanbanRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshKanbanRenderer(view.id),\n );\n }\n\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerDataTableRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshDataTableRenderer(view.id),\n );\n };\n","import type { NavigationTarget, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout, WorkbenchPanelRegion } from \"../../registries/layout/layout-model\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchOwnedPlacementItem } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { shellPlacementContributionId } from \"../../registries/placements/shell-placement-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { modePlacementContributionId, pagePlacementContributionId } from \"../../registries/views/view-placement\";\nimport { contributionRefId, resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type { WorkbenchCompositionAddablePanel } from \"./composition-controller\";\n\nconst ownsPlacement = (layout: WorkbenchLayout, matches: (identity: PlacementIdentity) => boolean) =>\n Object.values(layout.regions).some((region) =>\n region.widgets.some((placement) => placement.placementIdentity && matches(placement.placementIdentity)),\n );\nexport const activateModePlacementInstance = (core: WorkbenchCore, identity: PlacementIdentity) => {\n const instance = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find(\n (candidate) =>\n candidate.placementIdentity &&\n placementIdentityKey(candidate.placementIdentity) === placementIdentityKey(identity),\n );\n if (instance) core.layout.activatePanel(instance.widgetId);\n};\ninterface AddablePanelInput {\n layout: WorkbenchLayout;\n modeId?: string;\n region: WorkbenchPanelRegion;\n resource?: ResourceRef;\n}\ntype AddPanel = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => void;\nconst openPlacementAddTarget = (core: WorkbenchCore, target: NavigationTarget) => {\n if (target.kind === \"command\") {\n void core.commands.executeCommand(contributionRefId(target.target.command), target.target.params, {\n source: \"panel-add\",\n });\n return;\n }\n void core.navigation.openTarget(target);\n};\nconst canAddItem = (core: WorkbenchCore, item: WorkbenchOwnedPlacementItem, resource: ResourceRef | undefined) => {\n if (item.kind !== \"binding\") return true;\n const target = item.binding.add;\n if (!target) return Boolean(resource && resourceMatchesConstraint(item.binding, resource));\n if (target.kind !== \"command\") return true;\n const id = contributionRefId(target.target.command);\n return Boolean(\n core.commands.getCommand(id) &&\n core.commands.isCommandVisible(id, target.target.params) &&\n core.commands.isCommandEnabled(id, target.target.params),\n );\n};\nconst addShellPanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.shellPlacements.listPlacements()) {\n if (placement.region !== input.region) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n (identity) => identity.kind === \"shell\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(shellPlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n openPlacementAddTarget(core, placement.item.binding.add);\n return;\n }\n core.shellPlacements.openPlacement({\n placementId: placement.id,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n });\n }\n};\nconst addModePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.modePlacements.listPlacements(input.modeId)) {\n if (placement.region !== input.region) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n (identity) => identity.kind === \"mode\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(modePlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n openPlacementAddTarget(core, placement.item.binding.add);\n return;\n }\n const identity = core.modePlacements.openPlacement({\n panel: placement.ref,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n activateModePlacementInstance(core, identity);\n });\n }\n};\nconst addPagePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n const pageState = core.pages.store.getState();\n const page = pageState.activePageId ? core.pages.getPage(pageState.activePageId) : undefined;\n if (!page) return;\n for (const slot of page.slots) {\n if (slot.region !== input.region) continue;\n if (slot.item.kind === \"view\" && slot.item.presence === \"fixed\") continue;\n const multiple = slot.item.kind === \"binding\" && slot.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n (identity) => identity.kind === \"page\" && identity.pageId === page.id && identity.slotId === slot.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, slot.item, input.resource)) continue;\n add(pagePlacementContributionId(page.id, slot.id), (resource) => {\n if (slot.item.kind === \"binding\" && slot.item.binding.add) {\n openPlacementAddTarget(core, slot.item.binding.add);\n return;\n }\n core.pages.openSlot({\n pageId: page.id,\n slotId: slot.id,\n ...(resource ? { resource: resource } : {}),\n ...(multiple ? { open: \"pin\" } : {}),\n });\n });\n }\n};\nexport const createOwnedAddablePanels = (core: WorkbenchCore, input: AddablePanelInput) => {\n const addable: WorkbenchCompositionAddablePanel[] = [];\n const add = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => {\n const contribution = core.layout.getWidget(panelId);\n if (contribution) addable.push({ panelId, region: input.region, contribution, open });\n };\n addShellPanels(core, input, add);\n addModePanels(core, input, add);\n addPagePanels(core, input, add);\n return addable;\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { getActivePlacement } from \"../../registries/layout/layout-operations\";\nimport { resolveAnchorRegion } from \"../../registries/layout/surface-map\";\nimport { reconcileAnchors } from \"../../registries/layout/surface-reconcile\";\nimport type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n// Default scope predicate derived from the scoped resource providers. A detached\n// resource stays in scope while a provider for its kind still lists it under the active\n// primary; kinds with no provider can't be scoped, so they are kept. This makes the\n// detached-disconnect behaviour fall out of how providers filter their candidates —\n// no per-app wiring needed (apps can still inject a custom predicate).\n//\n// It deliberately ignores the `primary` argument the coordinator passes: scoping is read\n// from the registry's own `getPrimary` closure (which already reflects the live primary),\n// so the candidate list and this predicate cannot drift to different primaries.\nexport const createScopedIsInScope = (resources: ResourceRegistry) => (resource: ResourceRef) => {\n const hasProvider = resources.listProviders().some((provider) => provider.kind === resource.type);\n if (!hasProvider) return true;\n return resources.listResources(\"\").some((entry) => resourceKey(entry.resource) === resourceKey(resource));\n};\nexport interface CreatePrimaryCoordinatorInput {\n layout: LayoutModel;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scope. Injected (no baked default) so apps decide the disconnect policy; the core\n // default keeps detached anchors (() => true) until scoped providers land.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n// Keeps the secondary resource anchors consistent with the primary (main) resource.\n// On a primary change, derived anchors clear (they re-scope to the new primary) and\n// detached anchors disconnect once they fall outside the new primary's scope. The\n// primary anchor is never mutated, so the selector keyed on the main region's active\n// resource cannot re-fire — the reconciliation is feedback-loop safe by construction.\nexport const createPrimaryCoordinator = ({ layout, isInScope }: CreatePrimaryCoordinatorInput): Disposable => {\n let changingPersistenceScope = false;\n const willChangeScope = layout.onWillChangePersistenceScope(() => {\n changingPersistenceScope = true;\n });\n const didChangeScope = layout.onDidChangePersistenceScope(() => {\n changingPersistenceScope = false;\n });\n const unsubscribe = layout.store.subscribe((state, previous) => {\n const primary = getActivePlacement(state.layout.regions[resolveAnchorRegion(\"primary\")])?.resource;\n const previousPrimaryKey = getActivePlacement(previous.layout.regions[resolveAnchorRegion(\"primary\")])?.resourceKey;\n if (resourceKey(primary) === previousPrimaryKey || changingPersistenceScope) return;\n // Reconcile only placements that belonged to the Location that is leaving.\n // Another listener may synchronously populate the new Location before this\n // callback runs; clearing the live region would delete that new content too.\n for (const action of reconcileAnchors({ layout: previous.layout, primary, isInScope })) {\n if (action.action !== \"clear\") continue;\n for (const placement of previous.layout.regions[action.region].widgets) {\n layout.removeWidgetPlacement(placement.widgetId);\n }\n }\n });\n return createDisposable(() => {\n unsubscribe();\n willChangeScope.dispose();\n didChangeScope.dispose();\n });\n};\n","import type { WorkbenchShellOpenRegion } from \"./controllers/shell/shell-controller\";\nimport type { KeybindingSequence } from \"./registries/keybindings/keybinding-registry\";\nimport { workbenchCommandPaletteMenuPath } from \"./registries/menus/workbench-menu-paths\";\nimport type { WorkbenchCore } from \"./workbench-core\";\n\nconst SIDENAV_PANEL_ID = \"sidenav\";\n\nconst togglePanel = (workbench: WorkbenchCore, region: WorkbenchShellOpenRegion) => {\n workbench.shell.setRegionOpen(region, !workbench.shell.getRegionState(region).open);\n};\n\ninterface BuiltinCommand {\n id: string;\n label: string;\n icon: string;\n keybinding: KeybindingSequence;\n execute: (workbench: WorkbenchCore) => void;\n}\n\n// Defaults use `Mod` so a single chord works on macOS (Cmd), Windows, and\n// Linux (Ctrl). The command palette intentionally claims the browser print\n// chord. Other built-ins must avoid the reserved table in `pstdio-extensions`.\nconst builtinCommands: BuiltinCommand[] = [\n {\n id: \"workbench.toggleCommandPalette\",\n label: \"Toggle Command Palette\",\n icon: \"Command\",\n keybinding: \"Mod+P\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.toggle(),\n },\n {\n id: \"workbench.action.showCommands\",\n label: \"Run Command\",\n icon: \"Terminal\",\n keybinding: \"Alt+Shift+K\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ initialQuery: \"> \" }),\n },\n {\n id: \"workbench.action.changeTheme\",\n label: \"Change Theme\",\n icon: \"Palette\",\n keybinding: \"Alt+Shift+T\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ view: \"theme\" }),\n },\n {\n id: \"workbench.action.navigateBack\",\n label: \"Navigate Back\",\n icon: \"ArrowLeft\",\n keybinding: \"Alt+Shift+ArrowLeft\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goBack();\n },\n },\n {\n id: \"workbench.action.navigateForward\",\n label: \"Navigate Forward\",\n icon: \"ArrowRight\",\n keybinding: \"Alt+Shift+ArrowRight\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goForward();\n },\n },\n {\n id: \"workbench.toggleSideBar\",\n label: \"Toggle Sidenav\",\n icon: \"PanelLeft\",\n keybinding: \"Mod+B\",\n execute: (workbench: WorkbenchCore) => togglePanel(workbench, SIDENAV_PANEL_ID),\n },\n];\n\nexport const registerWorkbenchBuiltIns = (workbench: WorkbenchCore) => {\n for (const command of builtinCommands) {\n workbench.commands.registerCommand(\n {\n id: command.id,\n label: command.label,\n category: \"Workbench\",\n icon: command.icon,\n when: \"!inputFocus\",\n },\n { execute: () => command.execute(workbench) },\n );\n workbench.keybindings.registerKeybinding({\n action: { kind: \"command\", commandId: command.id },\n keybinding: command.keybinding,\n when: \"!inputFocus\",\n });\n workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, {\n commandId: command.id,\n group: \"Workbench\",\n });\n }\n};\n","import { createWorkbenchCompositionController } from \"./controllers/composition/composition-controller\";\nimport { createOwnedAddablePanels } from \"./controllers/composition/owned-addable-panels\";\nimport { createPrimaryCoordinator, createScopedIsInScope } from \"./controllers/primary-coordinator/primary-coordinator\";\nimport { workbenchViewIdContextKey } from \"./registries/views/view-registry\";\nimport { registerWorkbenchBuiltIns } from \"./workbench-built-ins\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\n\nexport const createCoreCompositionController = (resolveCore: () => WorkbenchCore) =>\n createWorkbenchCompositionController({\n getActiveMode: () => {\n const core = resolveCore();\n const modeId = core.modes.getActiveModeId();\n return modeId ? core.modes.getMode(modeId) : undefined;\n },\n getLayout: () => resolveCore().layout.getLayout(),\n getResource: () => resolveCore().getPrimaryResource(),\n listWidgets: () => resolveCore().layout.listWidgets(),\n listOwnedAddablePanels: ({ layout, mode, region, resource }) => {\n const core = resolveCore();\n return createOwnedAddablePanels(core, { layout, modeId: mode?.id, region, resource });\n },\n });\n\nexport const connectWorkbenchCoreState = (core: WorkbenchCore, input: createWorkbenchInput) => {\n core.layout.store.subscribe((state) => {\n const activeRegion = core.focus.getActiveRegion();\n if (activeRegion && !state.layout.regions[activeRegion].visible) core.focus.clearFocus();\n });\n core.layout.store.subscribeSelector(\n (state) => {\n const activeId = state.layout.activeWidgetId;\n if (!activeId) return undefined;\n return Object.values(state.layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === activeId)?.viewId;\n },\n (viewId) => {\n if (viewId) core.context.set(workbenchViewIdContextKey, viewId);\n else core.context.delete(workbenchViewIdContextKey);\n },\n { fireImmediately: true },\n );\n\n createPrimaryCoordinator({\n layout: core.layout,\n isInScope: input.isInScope ?? createScopedIsInScope(core.resources),\n });\n registerWorkbenchBuiltIns(core);\n};\n\nexport const activeWorkbenchResource = (core: WorkbenchCore) => {\n const activeWidgetId = core.layout.getLayout().activeWidgetId;\n if (!activeWidgetId) return undefined;\n for (const region of Object.values(core.layout.getLayout().regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === activeWidgetId);\n if (placement) return placement.resource;\n }\n return undefined;\n};\n\nexport const primaryWorkbenchResource = (core: WorkbenchCore) => core.pages.store.getState().location?.resource;\n","import type { PageSlotRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchRegion, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { NavigationTargetPage, NavigationTargetPanel } from \"../../registries/navigation/navigation-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport type { OwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\nimport { getPageLocationPreparation } from \"../page-location/page-location-preparation\";\n\ntype NavigationOperation = NavigationTargetPage | NavigationTargetPanel;\n\nconst placementContext = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) =>\n state.activeModeId\n ? {\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n location: state.location,\n }\n : undefined;\nconst requirePanelPage = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>, panel: PageSlotRef) => {\n const page = Object.values(state.pages).find(\n (page) => page.ref.extensionId === panel.page.extensionId && page.ref.id === panel.page.id,\n );\n if (!page || page.id !== state.activePageId)\n throw new Error(`Page panel \"${panel.id}\" is not owned by the proposed page`);\n return page;\n};\nconst prepareSharedPanel = (\n core: WorkbenchCore,\n target: NavigationTargetPanel,\n modeId: string | undefined,\n modeState: OwnedPlacementState,\n shellState: OwnedPlacementState,\n) => {\n const panel = target.panel;\n if (panel.kind === \"placement\") {\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== modeId)\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the proposed mode`);\n const prepared = getOwnedPlacementPreparation(core.modePlacements).open(\n { placementId: placement.id, resource: target.resource, open: target.open },\n modeState,\n );\n return { modeState: prepared.state, shellState, identity: prepared.identity };\n }\n const prepared = getOwnedPlacementPreparation(core.shellPlacements).open(\n {\n placementId: panel.id,\n resource: target.resource,\n open: target.open,\n ...(\"title\" in target ? { title: target.title } : {}),\n },\n shellState,\n );\n return { modeState, shellState: prepared.state, identity: prepared.identity };\n};\n\nexport const prepareWorkbenchNavigation = (core: WorkbenchCore, targets: readonly NavigationOperation[]) => {\n if (!targets.length) throw new Error(\"Compound navigation requires at least one page or panel target\");\n const pages = getWorkbenchPageRegistryInternals(core.pages);\n const locations = getPageLocationPreparation<WorkbenchWidgetPlacement>(core.pageLocations);\n const mode = getOwnedPlacementPreparation(core.modePlacements);\n const shell = getOwnedPlacementPreparation(core.shellPlacements);\n const original = core.pages.store.getState();\n const originalMode = mode.getState();\n const originalShell = shell.getState();\n let modeState = originalMode;\n let shellState = originalShell;\n let proposed = original;\n const activate = new Map<WorkbenchRegion, PlacementIdentity>();\n const owned = (modeId = proposed.activeModeId) => ({\n shell: shell.resolve(undefined, shellState),\n mode: mode.resolve(modeId, modeState),\n });\n\n for (const target of targets) {\n if (target.kind === \"page\") {\n if (!proposed.projectId) throw new Error(\"Cannot navigate before a project is active\");\n const resolved = locations.resolve(target);\n const page = proposed.pages[resolved.pageId]!;\n shellState =\n shell.restore?.(\n { modeId: page.modeId, pageId: page.id, projectId: proposed.projectId, location: resolved.location },\n shellState,\n placementContext(proposed),\n ) ?? shellState;\n modeState =\n mode.restore?.(\n { modeId: page.modeId, pageId: page.id, location: resolved.location, projectId: proposed.projectId },\n modeState,\n ) ?? modeState;\n proposed = pages.prepare.location(\n {\n pageId: page.id,\n projectId: proposed.projectId,\n location: resolved.location,\n resource: resolved.location.resource,\n section: resolved.location.section,\n open: resolved.open,\n action: \"preparePageNavigation\",\n },\n proposed,\n owned(page.modeId),\n );\n } else if (target.kind === \"panel\") {\n const panel = target.panel;\n if (panel.kind === \"page-slot\") {\n const page = requirePanelPage(proposed, panel);\n proposed = pages.prepare.slot(\n { pageId: page.id, slotId: panel.id, resource: target.resource, open: target.open },\n proposed,\n owned(),\n );\n } else {\n const modeId = proposed.activeModeId ?? core.modes.getActiveModeId();\n const prepared = prepareSharedPanel(core, target, modeId, modeState, shellState);\n modeState = prepared.modeState;\n shellState = prepared.shellState;\n const identity = prepared.identity;\n proposed = pages.prepare.compose(\n proposed,\n { ...proposed, activeModeId: modeId, activate: [identity], action: \"preparePanelNavigation\" },\n owned(modeId),\n );\n }\n } else {\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n }\n for (const placement of proposed.reconciliation.activate) activate.set(placement.region, placement.identity);\n }\n const present = new Set(proposed.placements.map((placement) => placementIdentityKey(placement.identity)));\n const final = pages.prepare.compose(\n original,\n {\n ...proposed,\n activate: [...activate.values()].filter((identity) => present.has(placementIdentityKey(identity))),\n action: \"prepareCompoundNavigation\",\n },\n owned(),\n );\n return {\n commit: () =>\n batchWorkbenchChanges(() => {\n const applyOwners = () => {\n mode.apply(modeState);\n shell.apply(shellState);\n };\n const publishWithoutLocation = () => {\n applyOwners();\n return pages.publish(final, \"navigateCompoundTarget\");\n };\n const result = final.location ? locations.commit(final, applyOwners) : publishWithoutLocation();\n if (modeState !== originalMode) mode.publish();\n if (shellState !== originalShell) shell.publish();\n return result;\n }),\n };\n};\n","import { activateModePlacementInstance } from \"./controllers/composition/owned-addable-panels\";\nimport { prepareWorkbenchNavigation } from \"./controllers/navigation/compound-navigation\";\nimport type { WorkbenchRegion } from \"./registries/layout/layout-model\";\nimport {\n createNavigationRegistry,\n type NavigationTargetPanel,\n type NavigationTargetShellPanel,\n} from \"./registries/navigation/navigation-registry\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\n\ntype PageSlotPanelRef = Extract<NavigationTargetPanel[\"panel\"], { kind: \"page-slot\" }>;\n\nconst findPagePanelOwner = (core: WorkbenchCore, panel: PageSlotPanelRef) =>\n core.pages\n .listPages()\n .find((candidate) => candidate.ref.extensionId === panel.page.extensionId && candidate.ref.id === panel.page.id);\n\nconst canOpenCorePanel = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") return Boolean(core.shellPlacements.getPlacement(panel.id));\n if (panel.kind !== \"page-slot\") return Boolean(core.modePlacements.getPlacement(panel));\n return Boolean(findPagePanelOwner(core, panel)?.slots.some((slot) => slot.id === panel.id));\n};\n\nexport const revealPanelRegion = (core: WorkbenchCore, region: WorkbenchRegion) => {\n if (region === \"secondary\") {\n core.shell.setRegionOpen(\"secondary\", true);\n }\n if (region === \"side\" && core.sidePanel.getMode() === \"closed\") core.sidePanel.setMode(\"attached\");\n};\n\nconst openPageSlotTarget = (core: WorkbenchCore, target: NavigationTargetPanel, panel: PageSlotPanelRef) => {\n const page = findPagePanelOwner(core, panel);\n if (!page || core.pages.store.getState().activePageId !== page.id) {\n throw new Error(`Page panel \"${panel.id}\" is not owned by the active page`);\n }\n const slot = page.slots.find((candidate) => candidate.id === panel.id);\n if (!slot) throw new Error(`Page panel \"${panel.id}\" is not an auxiliary slot`);\n core.pages.openSlot({\n pageId: page.id,\n slotId: panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n revealPanelRegion(core, slot.region);\n};\n\nconst openModePlacementTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind !== \"placement\") throw new Error(`Expected a mode placement panel: ${panel.id}`);\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== core.modes.getActiveModeId()) {\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the active mode`);\n }\n const identity = core.modePlacements.openPlacement({\n panel,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n revealPanelRegion(core, placement.region);\n activateModePlacementInstance(core, identity);\n};\n\nconst openShellPlacementTarget = (core: WorkbenchCore, target: NavigationTargetShellPanel) => {\n const placement = core.shellPlacements.getPlacement(target.panel.id);\n if (!placement) throw new Error(`Unknown shell placement: ${target.panel.id}`);\n const identity = core.shellPlacements.openPlacement({\n placementId: target.panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n ...(target.title ? { title: target.title } : {}),\n });\n revealPanelRegion(core, placement.region);\n activateModePlacementInstance(core, identity);\n};\n\nconst openCorePanelTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") {\n openShellPlacementTarget(core, { ...target, panel });\n return;\n }\n if (panel.kind === \"page-slot\") {\n openPageSlotTarget(core, target, panel);\n return;\n }\n openModePlacementTarget(core, target);\n};\n\nexport const createCoreNavigationRegistry = (resolveCore: () => WorkbenchCore) =>\n createNavigationRegistry({\n resolveDispatcher: () => {\n const core = resolveCore();\n return {\n prepareNavigation: (targets) => prepareWorkbenchNavigation(core, targets),\n canOpenPanel: (target) => canOpenCorePanel(core, target),\n canExecuteCommand: (commandId) => Boolean(core.commands.getCommand(commandId)),\n openPanelTarget: (target) => openCorePanelTarget(core, target),\n openPageTarget: (target) => {\n const result = core.pageLocations.navigate(target);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return result;\n },\n executeCommand: (commandId, args) => core.commands.executeCommand(commandId, args),\n openHref: (href) => globalThis.open(href, \"_blank\", \"noopener,noreferrer\"),\n };\n },\n });\n","import { createControlsRendererRegistry } from \"./registries/renderers/controls-renderer-registry\";\nimport { createDataTableRendererRegistry } from \"./registries/renderers/data-table-renderer-registry\";\nimport { createFileRendererRegistry } from \"./registries/renderers/file-renderer-registry\";\nimport { createKanbanRendererRegistry } from \"./registries/renderers/kanban-renderer-registry\";\nimport { createWorkbenchRendererRegistry } from \"./registries/renderers/renderer-registry\";\nimport { createTreeRendererRegistry } from \"./registries/renderers/tree-renderer-registry\";\nimport type { createWorkbenchInput, WorkbenchRenderers } from \"./workbench-core-types\";\n\nexport const createCoreRenderers = (input: createWorkbenchInput): WorkbenchRenderers => {\n const rendererRegistry = createWorkbenchRendererRegistry();\n return {\n ...rendererRegistry,\n ...createTreeRendererRegistry({ rendererRegistry, persistence: input.treePersistence }),\n ...createKanbanRendererRegistry({ rendererRegistry }),\n ...createDataTableRendererRegistry({ rendererRegistry }),\n ...createFileRendererRegistry({ rendererRegistry }),\n ...createControlsRendererRegistry({ rendererRegistry }),\n };\n};\n","import type { ResourceRef } from \"./registries/resources/resource-registry\";\nimport type { ContributionMetadata, ContributionSource } from \"./shared/contributions/metadata\";\nimport type { Disposable } from \"./shared/disposable\";\nimport { createDisposable } from \"./shared/disposable\";\nimport type { WorkbenchCore, WorkbenchModuleContribution, WorkbenchModuleContributionContext } from \"./workbench-core\";\n\ntype WorkbenchModuleActivationResult = Disposable | readonly Disposable[] | undefined;\n\nconst withModuleMetadata = (\n input: { ownerId: string; source: ContributionSource },\n metadata?: ContributionMetadata,\n) => ({\n ...metadata,\n source: input.source,\n ownerId: input.ownerId,\n});\n\nexport const toDisposables = (result: WorkbenchModuleActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nexport const disposeDisposables = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\n\ninterface CreateModuleContextInput {\n ownerId: string;\n source: ContributionSource;\n track(disposable: Disposable): void;\n}\n\nexport const createModuleContext = (\n core: WorkbenchCore,\n input: CreateModuleContextInput,\n): WorkbenchModuleContributionContext => {\n const contextScope = core.context.createScope(input.ownerId);\n input.track(contextScope);\n\n const track = <TDisposable extends Disposable>(disposable: TDisposable) => {\n input.track(disposable);\n return disposable;\n };\n\n const {\n openPanel: _openPanel,\n openWidget: _openWidget,\n registerPanel: _registerPanel,\n registerPanelMenu: _registerPanelMenu,\n registerPlaceholder: _registerPlaceholder,\n registerWidget: _registerWidget,\n ...moduleLayout\n } = core.layout;\n return {\n ...core,\n registerChildModule: (module: WorkbenchModuleContribution) => track(core.registerModule(module)),\n onDidChangePrimaryResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangePrimaryResource(listener)),\n onDidChangeActiveResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangeActiveResource(listener)),\n breadcrumbs: {\n ...core.breadcrumbs,\n setItems: (items) => track(core.breadcrumbs.setItems(items)),\n onDidChange: (listener) => track(core.breadcrumbs.onDidChange(listener)),\n },\n commandPalette: {\n ...core.commandPalette,\n onDidChange: (listener) => track(core.commandPalette.onDidChange(listener)),\n },\n context: {\n ...core.context,\n set: (key, value) => contextScope.set(key, value),\n delete: (key) => contextScope.delete(key),\n createScope: (ownerId) => track(core.context.createScope(ownerId)),\n },\n focus: {\n ...core.focus,\n onDidChange: (listener) => track(core.focus.onDidChange(listener)),\n },\n commands: {\n ...core.commands,\n registerCommand: (command, handler, metadata) =>\n track(core.commands.registerCommand(command, handler, withModuleMetadata(input, metadata))),\n onDidExecuteError: (listener) => track(core.commands.onDidExecuteError(listener)),\n },\n keybindings: {\n ...core.keybindings,\n registerKeybinding: (keybinding, metadata) =>\n track(core.keybindings.registerKeybinding(keybinding, withModuleMetadata(input, metadata))),\n },\n layout: {\n ...moduleLayout,\n registerMenuItem: (path, item, metadata) =>\n track(core.layout.registerMenuItem(path, item, withModuleMetadata(input, metadata))),\n onWillChangePersistenceScope: (listener) => track(core.layout.onWillChangePersistenceScope(listener)),\n onDidChangePersistenceScope: (listener) => track(core.layout.onDidChangePersistenceScope(listener)),\n },\n modes: {\n ...core.modes,\n registerMode: (mode) =>\n track(\n core.modes.registerMode({\n ...mode,\n activate: () => {\n const modeDisposables: Disposable[] = [];\n const modeContext = createModuleContext(core, {\n ...input,\n track: (disposable) => modeDisposables.push(disposable),\n });\n const returnedDisposables = toDisposables(mode.activate(modeContext));\n return createDisposable(() => disposeDisposables([...modeDisposables, ...returnedDisposables]));\n },\n }),\n ),\n onDidChangeActive: (listener) => track(core.modes.onDidChangeActive(listener)),\n },\n modePlacements: {\n ...core.modePlacements,\n registerPlacement: (placement) => track(core.modePlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.modePlacements.onDidChange(listener)),\n },\n shellPlacements: {\n ...core.shellPlacements,\n registerPlacement: (placement) => track(core.shellPlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.shellPlacements.onDidChange(listener)),\n },\n navigation: {\n ...core.navigation,\n registerParser: (parser, metadata) =>\n track(core.navigation.registerParser(parser, withModuleMetadata(input, metadata))),\n },\n navigationTrees: {\n ...core.navigationTrees,\n registerContribution: (contribution) => track(core.navigationTrees.registerContribution(contribution)),\n onDidChange: (listener) => track(core.navigationTrees.onDidChange(listener)),\n },\n notifications: {\n ...core.notifications,\n show: (notification, metadata) => core.notifications.show(notification, withModuleMetadata(input, metadata)),\n },\n overlays: {\n ...core.overlays,\n registerOverlay: (overlay) => track(core.overlays.registerOverlay(overlay)),\n },\n placeholders: {\n ...core.placeholders,\n registerPlaceholder: (placeholder, metadata) =>\n track(core.placeholders.registerPlaceholder(placeholder, withModuleMetadata(input, metadata))),\n },\n pages: {\n ...core.pages,\n registerPage: (page) => track(core.pages.registerPage(page)),\n },\n panelMenuState: {\n ...core.panelMenuState,\n onDidChange: (listener) => track(core.panelMenuState.onDidChange(listener)),\n },\n preferences: {\n ...core.preferences,\n registerSchema: (schema, metadata) =>\n track(core.preferences.registerSchema(schema, withModuleMetadata(input, metadata))),\n },\n resources: {\n ...core.resources,\n registerKind: (kind, metadata) => track(core.resources.registerKind(kind, withModuleMetadata(input, metadata))),\n registerHierarchyProvider: (provider) => track(core.resources.registerHierarchyProvider(provider)),\n registerProvider: (provider) => track(core.resources.registerProvider(provider)),\n },\n views: {\n ...core.views,\n registerView: (view, metadata) => track(core.views.registerView(view, withModuleMetadata(input, metadata))),\n },\n viewMenus: {\n ...core.viewMenus,\n registerViewMenu: (menu) => track(core.viewMenus.registerViewMenu(menu)),\n },\n settings: {\n ...core.settings,\n registerSection: (section, metadata) =>\n track(core.settings.registerSection(section, withModuleMetadata(input, metadata))),\n registerPanel: (panel, metadata) =>\n track(core.settings.registerPanel(panel, withModuleMetadata(input, metadata))),\n },\n statusBar: {\n ...core.statusBar,\n registerItem: (item) => track(core.statusBar.registerItem(item)),\n },\n statuses: {\n ...core.statuses,\n registerStatusSet: (statusSet, metadata) =>\n track(core.statuses.registerStatusSet(statusSet, withModuleMetadata(input, metadata))),\n },\n shell: {\n ...core.shell,\n onDidChange: (listener) => track(core.shell.onDidChange(listener)),\n },\n sidePanel: {\n ...core.sidePanel,\n onDidChange: (listener) => track(core.sidePanel.onDidChange(listener)),\n },\n themes: {\n ...core.themes,\n register: (themes) => track(core.themes.register(themes)),\n },\n fileIconThemes: {\n ...core.fileIconThemes,\n register: (themes) => track(core.fileIconThemes.register(themes)),\n },\n } satisfies WorkbenchModuleContributionContext;\n};\n","import { createDisposable, type Disposable } from \"./shared/disposable\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\nimport { createModuleContext, disposeDisposables, toDisposables } from \"./workbench-module-context\";\n\nexport const createWorkbenchModuleRegistry = (\n resolveCore: () => WorkbenchCore,\n): Pick<WorkbenchCore, \"registerModule\" | \"unregisterModule\"> => {\n const moduleRecords = new Map<string, { disposable: Disposable }>();\n return {\n registerModule(module) {\n if (moduleRecords.has(module.id)) throw new Error(`Workbench module already registered: ${module.id}`);\n\n const disposables: Disposable[] = [];\n let registration: Disposable;\n\n registration = createDisposable(() => {\n if (moduleRecords.get(module.id)?.disposable !== registration) return;\n moduleRecords.delete(module.id);\n disposeDisposables(disposables);\n });\n\n const record = { disposable: registration };\n\n moduleRecords.set(module.id, record);\n\n try {\n const context = createModuleContext(resolveCore(), {\n ownerId: module.ownerId ?? module.id,\n source: module.source ?? \"module\",\n track: (disposable) => {\n disposables.push(disposable);\n },\n });\n disposables.push(...toDisposables(module.activate(context)));\n } catch (error) {\n record.disposable.dispose();\n throw error;\n }\n\n return record.disposable;\n },\n\n unregisterModule(moduleId) {\n moduleRecords.get(moduleId)?.disposable.dispose();\n },\n };\n};\n","import { workbenchPages } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchBreadcrumbController } from \"./controllers/breadcrumbs/breadcrumb-registry\";\nimport { createWorkbenchCommandPaletteController } from \"./controllers/command-palette/command-palette-controller\";\nimport { createPlacementCloseController } from \"./controllers/composition/placement-close-controller\";\nimport { createPlacementPinController } from \"./controllers/composition/placement-pin-controller\";\nimport { createWorkbenchFocusController } from \"./controllers/focus/focus-controller\";\nimport { connectWorkbenchPageBreadcrumbs } from \"./controllers/page-location/page-breadcrumbs\";\nimport { createWorkbenchPageLocationController } from \"./controllers/page-location/page-location-controller\";\nimport {\n createMemoryWorkbenchPageLocationBrowser,\n createMemoryWorkbenchPageLocationPersistence,\n} from \"./controllers/page-location/page-location-memory\";\nimport { defaultPageResourceCodec } from \"./controllers/page-location/page-resource-codec\";\nimport { createLiveWorkbenchPageRegistry } from \"./controllers/page-runtime/page-runtime\";\nimport {\n createPageStateRestorer,\n loadWorkbenchLocationLayout,\n} from \"./controllers/page-runtime/page-state-restoration\";\nimport { createWorkbenchLayoutCache } from \"./controllers/page-runtime/workbench-layout-cache\";\nimport { createWorkbenchPanelMenuStateController } from \"./controllers/panel-menus/panel-menu-state-controller\";\nimport { createWorkbenchShellController } from \"./controllers/shell/shell-controller\";\nimport { createWorkbenchSidePanelController } from \"./controllers/side-panel/side-panel-controller\";\nimport { createWorkbenchTerminalController } from \"./controllers/terminal/terminal-controller\";\nimport { createCommandPaletteResourceRegistry } from \"./registries/command-palette-resources/command-palette-resource-registry\";\nimport { createCommandRegistry } from \"./registries/commands/command-registry\";\nimport { createKeybindingRegistry } from \"./registries/keybindings/keybinding-registry\";\nimport { createLayoutModel } from \"./registries/layout/layout-model\";\nimport type { WorkbenchWidgetPlacement } from \"./registries/layout/layout-types\";\nimport { createMenuRegistry } from \"./registries/menus/menu-registry\";\nimport { createWorkbenchModePlacementRegistry } from \"./registries/modes/mode-placement-registry\";\nimport { createWorkbenchModeRegistry } from \"./registries/modes/mode-registry\";\nimport { createNavigationTreeRegistry } from \"./registries/navigation/navigation-tree-registry\";\nimport { createNotificationRegistry } from \"./registries/notifications/notification-registry\";\nimport { createWorkbenchOverlayRegistry } from \"./registries/overlays/overlay-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"./registries/pages/page-registry\";\nimport { createWorkbenchPlaceholderRegistry } from \"./registries/placeholders/placeholder-registry\";\nimport { createWorkbenchShellPlacementRegistry } from \"./registries/placements/shell-placement-registry\";\nimport { createPreferenceRegistry } from \"./registries/preferences/preference-registry\";\nimport { createResourceRegistry } from \"./registries/resources/resource-registry\";\nimport { createSettingsRegistry } from \"./registries/settings/settings-registry\";\nimport { createStatusBarRegistry } from \"./registries/status-bar/status-bar-registry\";\nimport { createStatusRegistry } from \"./registries/statuses/status-registry\";\nimport { createFileIconThemeRegistry } from \"./registries/themes/file-icon-theme-registry\";\nimport { createThemeRegistry } from \"./registries/themes/theme-registry\";\nimport { createWorkbenchViewMenuRegistry } from \"./registries/view-menus/view-menu-registry\";\nimport { createWorkbenchViewBodyRegistration } from \"./registries/views/view-body-registration\";\nimport { createViewRegistry } from \"./registries/views/view-registry\";\nimport { createContextKeyService } from \"./shared/context/context-key-service\";\nimport { createDisposable } from \"./shared/disposable\";\nimport {\n activeWorkbenchResource,\n connectWorkbenchCoreState,\n createCoreCompositionController,\n primaryWorkbenchResource,\n} from \"./workbench-core-connections\";\nimport { createCoreNavigationRegistry, revealPanelRegion } from \"./workbench-core-navigation\";\nimport { createCoreRenderers } from \"./workbench-core-renderers\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\nimport { createWorkbenchModuleRegistry } from \"./workbench-module-registry\";\nimport { setWorkbenchRenderers } from \"./workbench-renderers\";\n\nexport * from \"./workbench-core-types\";\n\nconst createPagePersistenceScopeHandler = (\n input: createWorkbenchInput,\n layout: Pick<ReturnType<typeof createLayoutModel>, \"getPersistenceScope\" | \"setPersistenceScope\">,\n panelMenuState: ReturnType<typeof createWorkbenchPanelMenuStateController>,\n) => {\n const resolveScope = input.resolvePagePersistenceScope;\n if (!resolveScope) return undefined;\n return (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const resolved = resolveScope({\n currentScope: layout.getPersistenceScope(),\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n resource: state.location?.resource,\n });\n panelMenuState.setPersistenceScope(resolved.scope);\n layout.setPersistenceScope(resolved.scope, { carryRegionState: resolved.carryRegions });\n };\n};\n\nexport const createWorkbench = (input: createWorkbenchInput = {}) => {\n const context = createContextKeyService();\n const commands = createCommandRegistry({ context });\n const renderers = createCoreRenderers(input);\n\n const layoutCache = createWorkbenchLayoutCache(input);\n const locationAwareLayout = createLayoutModel({\n defaultRegionVisibility: input.defaultPanelOpenByRegionId,\n // The active mode owns region policy; the host input is the fallback. Resolved\n // lazily because the mode registry is created after the layout model.\n getRegionSettings: (regionId) => {\n const activeModeId = core?.modes.getActiveModeId();\n const activeMode = activeModeId ? core?.modes.getMode(activeModeId) : undefined;\n return { ...input.regionSettings?.[regionId], ...activeMode?.regionSettings?.[regionId] };\n },\n persistence: layoutCache.layout,\n });\n\n const { establishLocation, ...layoutModel } = locationAwareLayout;\n\n const layout = {\n ...layoutModel,\n ...createMenuRegistry({ commands }),\n };\n\n const focus = createWorkbenchFocusController({\n context,\n isRegionFocusable: (region) => layout.getLayout().regions[region].visible,\n });\n\n const views = createViewRegistry({ registerBody: createWorkbenchViewBodyRegistration(renderers) });\n const viewMenus = createWorkbenchViewMenuRegistry({ views });\n const pageResources = input.pageResources ?? defaultPageResourceCodec;\n\n const modePlacements = createWorkbenchModePlacementRegistry({\n loadLayout: (context) => layoutCache.readMode(context.projectId, context.modeId),\n getProjectId: () => core?.pages.store.getState().projectId,\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n });\n\n const shellPlacements = createWorkbenchShellPlacementRegistry({\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n activatePanel: layout.activatePanel,\n getLayout: layout.getLayout,\n getScope: layout.getPersistenceScope,\n resolveScope: input.resolvePagePersistenceScope\n ? (context) =>\n input.resolvePagePersistenceScope!({\n ...context,\n currentScope: layout.getPersistenceScope(),\n resource: context.location?.resource,\n }).scope\n : undefined,\n loadLayout: (context) => loadWorkbenchLocationLayout(input, { ...context, resource: context.location?.resource }),\n enteredWithPersistedLayout: layout.enteredWithPersistedLayout,\n onDidChangePersistenceScope: layout.onDidChangePersistenceScope,\n });\n\n const statusBar = createStatusBarRegistry({ hasView: (viewId) => Boolean(views.getView(viewId)) });\n\n const navigationTrees = createNavigationTreeRegistry({\n subscribeViewRefresh: (viewId, listener) =>\n renderers.onDidRefresh(({ treeId }) => {\n if (treeId === viewId) listener();\n }),\n getViewDefaultExpandedSectionIds: (viewId) => renderers.getTreeRenderer(viewId)?.defaultExpandedSectionIds,\n getViewSections: (viewId, context) => renderers.getBody(viewId, { ...context, viewId }),\n getViewChildren: (viewId, node, context) => renderers.getChildren(viewId, node, { ...context, viewId }),\n });\n\n const overlays = createWorkbenchOverlayRegistry({ layout, views, viewMenus });\n const placeholders = createWorkbenchPlaceholderRegistry({ layout, views });\n const breadcrumbs = createWorkbenchBreadcrumbController();\n const panelMenuState = createWorkbenchPanelMenuStateController({\n persistence: input.panelMenuStatePersistence,\n });\n\n const resources = createResourceRegistry({\n getPrimary: () => core.getPrimaryResource(),\n resolveView: views.getView,\n });\n\n let core: WorkbenchCore;\n\n const modes = createWorkbenchModeRegistry({\n establishLocation,\n layout,\n resolveContext: () => core,\n });\n\n const sidePanel = createWorkbenchSidePanelController({\n getFloatingPanels: () => {\n const activeModeId = modes.getActiveModeId();\n return (\n (activeModeId ? modes.getMode(activeModeId)?.floatingPanels : undefined) ?? input.floatingPanels ?? \"visible\"\n );\n },\n onDidChangePolicy: modes.onDidChangeActive,\n initialMode: input.initialSidePanelMode,\n persistence: input.sidePanelPersistence,\n });\n const shell = createWorkbenchShellController({ layout, sidePanel });\n\n const pages = createLiveWorkbenchPageRegistry({\n loadModeLayout: layoutCache.readMode,\n beforeApply: createPagePersistenceScopeHandler(input, layout, panelMenuState),\n restorePageState: createPageStateRestorer(input),\n\n revealRegion: (region) => revealPanelRegion(core, region),\n layout,\n modePlacements,\n modes,\n shellPlacements,\n views,\n viewMenus,\n resources: pageResources,\n });\n\n const pageLocations = createWorkbenchPageLocationController({\n registry: pages,\n browser: input.pageLocationBrowser ?? createMemoryWorkbenchPageLocationBrowser(),\n persistence: input.pageLocationPersistence ?? createMemoryWorkbenchPageLocationPersistence(),\n startPage: input.startPage ?? workbenchPages.start,\n });\n\n const composition = createCoreCompositionController(() => core);\n const navigation = createCoreNavigationRegistry(() => core);\n\n core = {\n closePlacement: createPlacementCloseController(() => core),\n pinPlacement: createPlacementPinController(() => core),\n breadcrumbs,\n commandPalette: createWorkbenchCommandPaletteController(),\n commands,\n composition,\n context,\n focus,\n host: {\n getSnapshot: () => ({ layout: layout.getLayout() }),\n restoreSnapshot: (snapshot) => layout.restoreLayout(snapshot.layout),\n setPersistenceScope: (scope, scopeInput = {}) =>\n layout.setPersistenceScope(scope, { carryRegionState: scopeInput.carryRegions }),\n getPersistenceScope: layout.getPersistenceScope,\n },\n keybindings: createKeybindingRegistry({ commands, context }),\n layout,\n modes,\n modePlacements,\n shellPlacements,\n notifications: createNotificationRegistry(),\n overlays,\n placeholders,\n pageLocations,\n pages,\n navigation,\n navigationTrees,\n panelMenuState,\n preferences: createPreferenceRegistry({ persistence: input.preferencePersistence }),\n treeViews: {\n getTreeState: renderers.getTreeState,\n setNodeExpanded: renderers.setNodeExpanded,\n setSectionExpanded: renderers.setSectionExpanded,\n setSelectedNode: renderers.setSelectedNode,\n },\n commandPaletteResources: createCommandPaletteResourceRegistry(),\n resources,\n views,\n viewMenus,\n settings: createSettingsRegistry({ hasView: (viewId) => Boolean(views.getView(viewId)) }),\n statusBar,\n statuses: createStatusRegistry(),\n shell,\n sidePanel,\n terminal: createWorkbenchTerminalController(),\n themes: createThemeRegistry(),\n fileIconThemes: createFileIconThemeRegistry(),\n\n getActiveResource() {\n return activeWorkbenchResource(core);\n },\n\n onDidChangeActiveResource(listener) {\n return createDisposable(\n core.layout.store.subscribeSelector(\n (state) => state.layout.activeResourceKey,\n () => listener(core.getActiveResource()),\n ),\n );\n },\n\n getPrimaryResource() {\n return primaryWorkbenchResource(core);\n },\n\n onDidChangePrimaryResource(listener) {\n return createDisposable(\n core.pages.store.subscribeSelector(\n (state) => state.location?.resource,\n () => listener(core.getPrimaryResource()),\n ),\n );\n },\n\n registerChildModule(module) {\n return core.registerModule(module);\n },\n\n ...createWorkbenchModuleRegistry(() => core),\n };\n\n setWorkbenchRenderers(core, renderers);\n layout.store.subscribe(() => {\n const state = pages.store.getState();\n if (state.activeModeId) layoutCache.saveMode(state.projectId, state.activeModeId, layout.getLayout());\n });\n connectWorkbenchPageBreadcrumbs({ breadcrumbs, locations: pageLocations, pages, resources: pageResources });\n connectWorkbenchCoreState(core, input);\n\n return core;\n};\n"],"names":["createWorkbenchBreadcrumbController","store","createWorkbenchStore","name","initialState","items","undefined","setItems","setState","createDisposable","getState","clearItems","getItems","onDidChange","listener","unsubscribe","subscribeSelector","state","createWorkbenchCommandPaletteController","input","internal","open","initialOpen","view","initialQuery","paramsRequest","setOpenState","next","current","isOpen","getView","getInitialQuery","getParamsRequest","openInput","close","toggle","requestParams","request","clearParams","value","createRegionQueries","getLayout","getWidgets","getPlaceholder","getRegionSize","regionId","persistedSize","regions","size","placement","getActivePlacement","contributionId","regionSize","getRegionSettings","defaultPx","getRegionCollapsible","regionCollapsible","collapsible","getRegionHeaderBorderBottom","headerBorderBottom","createContributionLists","getPlaceholders","listPlaceholders","Object","values","sort","byContributionPriority","listWidgets","createContributionRegistrations","persistLayout","registerPlaceholder","placeholder","metadata","region","Error","priority","placeholderContribution","record","normalizeContributionMetadata","snapshot","placeholders","_removed","nextPlaceholders","registerWidget","widget","id","reuse","singleton","widgetContribution","widgets","nextWidgets","nextLayout","removePlacementsForContribution","layout","insertAtPosition","position","unshift","push","targetWidgetId","beforeWidgetId","afterWidgetId","targetIndex","findIndex","candidate","widgetId","splice","placeWidget","tabRetention","persistentWidgets","filter","reorderWidgetPlacement","find","remaining","removePlacements","shouldRemove","removed","length","active","replaceRegionWidgets","clearActiveWidget","removeLocationSubPanelSelection","activeWidgetId","flatMap","activeResourceKey","expirePreviewTabsInLayout","ownerResourceKey","createLayoutPlacementMethods","updateWidgetPlacement","update","index","requireWidget","nextPlacement","buildUpdatedPlacement","map","currentIndex","setLayout","reorderWidget","some","expirePreviewTabs","activateWidget","applyAndActivate","carryPinnedWorkbenchChrome","incoming","pinned","role","contributionIds","Set","incomingRegion","has","carryWorkbenchRegionState","regionIds","resolveScopedLayout","defaultRegionVisibility","persisted","mergeWithDefaultRegions","createDefaultWorkbenchLayout","createScopeEvent","listeners","notify","runWorkbenchEffect","subscribe","add","delete","createLayoutScopeMethods","currentScope","enteredWithLayout","persistence","willChangeScope","didChangeScope","setPersistenceScope","nextScope","scopeInput","scopedLayout","withPinnedChrome","carryRegionState","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","onWillChangePersistenceScope","openOwnedPanelMenus","panelMenuId","ownedPanelMenuIds","panelMenu","openWidget","viewId","rendererId","resource","title","label","findReusablePlacement","getActiveLocationPlacement","resourceKey","findPlacement","findResourcePlacement","withPlacementRole","panelMenuOwner","eligibleLocations","findReplacementIndex","activeLocationWidgetId","replaceWidgetId","replaceActive","replacementWidgetId","defaultTabPosition","before","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","updated","tabPosition","replacementIndex","replacement","reuseExistingPlacement","withoutExisting","_current","copy","insertWidget","createUniqueWidgetId","createPlacement","placementInput","fallbackRegion","previewContent","defaultPanelTabRetention","workbenchPanelRegions","includes","createPanelLayoutMethods","getPanel","toPanelContribution","listPanels","listPanelInstances","toPanelInstance","getActivePanel","activeInstanceId","found","findPlacementByWidgetId","openPanel","widgetOpeners","toOpenWidgetInput","updatePanel","instanceId","placementMethods","reorderPanel","activatePanel","closePanel","closable","closeWidgetInLayout","activePlacement","menuRegions","workbenchPanelMenuRegions","menuSide","endsWith","ownerContributionId","getWidget","ownerPlacement","resolveMenuPlacements","placements","moves","seen","changed","owner","bound","target","reconcilePanelMenuOwnership","menuRegion","resolved","move","createOwnedMenuMethods","reconcilePanelMenus","panelMenuContribution","panel","menu","kind","side","contribution","level","registerPanelContribution","panelMenus","panelContribution","registrations","registeredPanel","error","registration","reverse","dispose","createPanelRegistrations","registerPanel","registerPanelMenu","createLocationEstablisher","panelMethods","fromEntries","entries","requireRegisteredWidget","createLayoutModel","initialLayout","regionQueries","contributionLists","scopeMethods","action","updateRegion","nextRegion","activateInLayout","contributionRegistrations","panelRegistrations","ownedMenus","establishLocation","unregisterWidget","options","persist","setRegionVisible","visible","setRegionSize","setRegionActiveWidget","selectRegionActiveWidget","closeWidget","result","closedPlacement","removeWidgetPlacement","clearRegion","cleared","setLocationSubPanelSelection","resetRegions","nextRegions","locationSubPanelSelections","restoreLayout","modeRegistryInternals","WeakMap","setWorkbenchModeRegistryInternals","registry","internals","set","activateWorkbenchPageMode","modeId","applyLayout","get","activatePageMode","toDisposables","Array","isArray","createWorkbenchModeRegistry","modes","activeModeId","initializedModes","Map","seededScopes","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","mode","disposables","activate","resolveContext","seedScope","context","locationEstablished","unsubscribeMainPanel","establishSeededLocation","primary","main","seed","prepareScope","scopeKey","availableLayout","applyModePanelAvailability","panelsForMode","restoreModeLayout","reconcileScope","reconcile","transitionToMode","previousModeId","unscoped","disposeActive","restoreUnscopedModeLayout","afterPublish","disposeReverse","contextScope","createScope","enter","scopeSubscription","registryDisposable","clear","registerMode","startsWith","rest","getMode","listModes","getActiveModeId","isTransitioning","setActiveMode","setActiveInput","deferSeed","seedActiveMode","onDidChangeActive","isOpenSingleton","scopedResourceKey","addModePanels","listAddablePanels","panelId","addable","addRegisteredPanels","isWorkbenchPanelPlacementVisible","location","createWorkbenchCompositionController","panelsFor","getResource","getActiveMode","isWorkbenchModePanelAvailable","listOwnedAddablePanels","workbenchFocusRegions","focusContextByRegion","activity","sidenav","secondary","status","createWorkbenchFocusController","activeRegion","applyContext","focusRegion","setActiveRegion","isRegionFocusable","clearFocus","getActiveRegion","registryInternals","setWorkbenchPageRegistryInternals","getWorkbenchPageRegistryInternals","hostExtensionId","pageRefKey","ref","extensionId","pageForRef","pages","page","encodePath","path","split","Boolean","segment","encodeURIComponent","join","routePath","projectId","project","normalizedSection","anchors","anchor","heading","occurrence","Number","isInteger","serializeSection","section","normalized","JSON","stringify","parseSection","parse","serializeWorkbenchPageUrl","query","URLSearchParams","resources","toUri","normalize","encoded","toString","decodedSegments","pathname","decodeURIComponent","isWorkbenchProjectUrl","urlValue","url","URL","segments","pageForRoute","parseResource","uri","fromUri","parseWorkbenchPageUrl","route","slice","extensionRoute","resourceValue","searchParams","sectionValue","pageId","hasResolvableCurrentPageUrl","actions","resolveUrl","browser","createPageLocationControllerActions","historyStore","setProject","clearProject","resetHistory","isCurrentProjectUrl","hasCurrentPageUrl","boot","restore","switchProject","navigate","fail","normalizeTarget","history","locationsEqual","commit","replay","normalizeStored","navigateToParent","parent","closePlacement","goBack","canGoBack","back","goForward","canGoForward","forward","workbenchPageRefKey","pageForId","canonicalSection","freeze","cloneMetadata","canonicalResource","type","canonical","icon","canonicalPageRef","sectionKey","workbenchPageLocationRouteKey","workbenchPageLocationKey","own","workbenchPageLocationsEqual","left","right","createLocation","declaredParent","parentId","normalizeResolvedLocation","routeKey","normalizePageTarget","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","createPageHistoryEntry","createPageLocationFailureHandler","report","source","diagnostic","code","message","String","ok","preparations","setPageLocationPreparation","controller","preparation","getPageLocationPreparation","createPageLocationPublisher","historyState","beforePublish","batchWorkbenchChanges","nextIndex","getIndex","entry","commitIndex","publish","save","createPagePlacementCloser","closeToParent","resolution","getPageRef","normalizePage","pageStates","closeWithinPage","locationChanged","identity","getCurrent","resolveClosePlacement","isHistoryState","createWorkbenchPageLocationController","listPages","historyIndex","maxHistoryIndex","publishHistory","reportDiagnostic","historyEntry","prepare","start","startPage","parsed","direct","contextual","directKey","contextualKey","useCurrentUrl","browserEntry","Math","max","hasProjectUrl","fromUrl","saved","load","fallbackError","onPopState","popStateSubscription","pageRemovalSubscription","previous","keys","activePageId","closeActivePlacement","getPage","resolve","protocol","hostname","defaultPageResourceCodec","createWorkbenchPanelMenuStateController","getMenuStates","resolveOpenByMenuId","openByMenuId","persistState","setMenuStates","menuId","setOpen","scope","createWorkbenchSidePanelController","canFloat","getFloatingPanels","resolveMode","initialMode","setMode","onDidChangePolicy","DEFAULT_SESSION_TITLE","SESSION_HISTORY_LIMIT","createWorkbenchTerminalController","sessionsById","opener","adapters","adapterDisposers","dataHistory","dataSubscribers","sessionIdByBindingId","bindingIdBySessionId","pendingSessionByBindingId","patchSession","sessionId","patch","session","requireAdapter","adapter","cleanupSession","bindingId","disposers","publishData","chunk","Uint8Array","shift","subscriber","kill","signal","isAvailable","setSessionOpener","pending","openSession","onData","unsubscribeTitle","onTitle","onExit","exit","write","data","resize","cols","rows","killBinding","opened","catch","sink","unsubscribes","subscribers","onError","getSession","listSessions","running","Promise","all","createCommandPaletteResourceRegistry","providers","refreshToken","registerProvider","provider","listProviders","queryProviders","results","providerId","refresh","createCommandRegistry","commands","errorListeners","requireCommand","emitError","event","registerCommand","command","handler","getCommand","listCommands","isCommandEnabled","args","isEnabled","isCommandVisible","matches","when","isVisible","isCommandToggled","isToggled","prepareCommandArgs","onArgsChange","prepareArgs","executeCommand","commandId","execute","onDidExecuteError","compareText","placementOwnerSortKey","placementId","slotId","placementIdentityKey","instanceKey","comparePlacementIdentity","compareRegionPlacement","order","assertOwner","toUpperCase","collectPlacements","candidates","isFinite","key","shell","modeIds","pageIds","emptyRegions","workbenchRegions","reduce","composeOwnedPlacements","declared","closedKeys","closed","visibleRegions","indexPlacements","indexed","placementShapeEqual","desired","valuesEqual","reconcileOwnedPlacements","retain","remove","desiredPlacement","currentPlacement","activationKeys","from","menuPathKey","createMenuRegistry","deps","menuStore","itemsByPath","registerMenuItem","item","list","filtered","listMenuItems","leftOrder","rightOrder","contributionRefId","resourceMatchesConstraint","constraint","kinds","placementItemViewId","binding","createOwnedPlacementState","staticOverrides","resourceInstances","isStaticPlacementOpen","presence","staticPlacementClosable","validateOwnedPlacementItem","openStaticPlacement","closeStaticPlacement","retainResourceInstances","cardinality","openResourcePlacement","instance","closeOwnedPlacementInstance","updateResourcePlacementInstance","instances","clearOwnedPlacementState","setOwnedPlacementPreparation","getOwnedPlacementPreparation","prepareOwnedPlacement","operation","identityFor","restoreOwnedPlacementState","declarations","placementIdentity","owns","registerWorkbenchViewPlacement","views","viewMenus","_role","_viewId","definitionsFor","modePlacementContributionId","pagePlacementContributionId","tabState","placementRefKey","validatePlacement","refs","refKey","movableTo","copyPlacement","createWorkbenchModePlacementRegistry","listPlacements","localeCompare","runtime","emitChange","notifyWorkbenchChange","connectRuntime","getProjectId","loadLayout","adopt","apply","registerPlacement","registered","getPlacement","openPlacement","prepared","updatePlacement","resolvePlacements","byPriorityAndId","noDispatcher","dispatchItem","dispatcher","openPageTarget","openPanelTarget","openHref","href","validateItem","canOpenPanel","canExecuteCommand","toItems","targets","createNavigationRegistry","resolveDispatcher","parsers","removeKey","registerParser","parser","parserContribution","listParsers","resolveLocation","canParse","openTarget","prepareNavigation","openPage","ownerId","ownersEqual","contributionOrder","leftOwn","sourceExtensionId","rightOwn","extensionOrder","declarationIndex","scopedId","mergeSection","sections","nodes","createNavigationTreeRegistry","contributions","nodeSources","emit","matching","slot","projectNode","node","moveScope","projected","idScope","canHide","canReorder","children","child","projectSection","registerContribution","getSections","refreshSubscription","subscribeViewRefresh","resolveOwner","sourceSections","getViewSections","getChildren","getViewChildren","getDefaultExpandedSectionIds","defaultExpandedSectionIds","getViewDefaultExpandedSectionIds","createNotificationRegistry","notifications","generatedId","show","notification","createdAt","Date","toISOString","dismiss","ids","listNotifications","overlayContributionId","createWorkbenchOverlayRegistry","overlays","registerOverlay","overlay","getOverlay","listOverlays","openOverlay","strategy","closeOverlay","PAGE_MAIN_SLOT_ID","primarySlot","_kind","presentation","pageSlots","slots","requirePageSlot","emptyMainSlot","empty","pagePlacementDeclarations","emptyPageState","openStaticSlotIds","staticSlotOpen","nextResourceInstances","openResourceSlot","activePrimaryInstanceKey","selectPrimaryTarget","pageResourceBindingSlots","openOn","openPageResourceBindings","setStaticSlotOpen","removeResourceInstance","closePageSlot","activateInstanceKey","at","resolvePagePlacementClose","pageState","stateKey","closedActivePrimary","activeInstanceKey","activeInstance","pageStateKey","removePageStates","states","pinPagePlacement","pagePlacementIdentity","pageFollowerIdentities","validatePageSlots","validateWorkbenchPage","placementFor","resolvePagePlacement","resolvePagePlacements","sharedPlacements","emptyReconciliation","createPageRegistryStore","resolveShellPlacements","reconciliation","resolveModePlacementSet","resolveModePlacements","refreshActiveModePlacements","modePlacements","registryInput","refreshShellPlacements","createPagePreparation","normalizeResource","requirePage","compose","owned","validateMode","composed","normalizedTarget","currentPageState","restorePageState","primaryState","openFollowers","resourceIdentity","followers","registerWorkbenchPage","placementRegistration","registerPagePlacements","_page","publishState","createWorkbenchPageRegistry","publishingState","storeBeforeRuntime","previousPublishingState","activatePageWithStates","registerPage","pinPlacement","openSlot","onDidCommit","api","getPublishingState","refreshModePlacements","activateLocation","createWorkbenchPlaceholderRegistry","shellPlacementContributionId","roleForRegion","createWorkbenchShellPlacementRegistry","restorePlacement","previousContext","resolveScope","previousScope","getScope","_modeId","valueKey","scopeId","createMemoryPreferencePersistence","getValue","setValue","createPreferenceRegistry","schemas","registerSchema","schema","registeredNames","properties","additions","property","getSchema","scoped","userValue","default","createControlsRendererRegistry","rendererRegistry","controlsStore","renderers","refreshListeners","implementation","requireControlsRenderer","renderer","setControlsRendererImplementation","impl","registerControlsRenderer","rendererDisposable","registerRenderer","render","rendererInput","controlsRendererId","nextRenderers","getControlsRenderer","listControlsRenderers","refreshControlsRenderer","onDidRefreshControlsRenderer","createDataTableRendererRegistry","dataTableStore","setDataTableRendererImplementation","registerDataTableRenderer","dataTableRendererId","getDataTableRenderer","listDataTableRenderers","refreshDataTableRenderer","onDidRefreshDataTableRenderer","createFileRendererRegistry","fileRendererStore","requireFileRenderer","setFileRendererImplementation","registerFileRenderer","fileRendererId","getFileRenderer","listFileRenderers","refreshFileRenderer","envelope","onDidRefreshFileRenderer","createKanbanRendererRegistry","dataStore","requireKanbanRenderer","setKanbanRendererImplementation","registerKanbanRenderer","kanbanRendererId","getKanbanRenderer","listKanbanRenderers","refreshKanbanRenderer","onDidRefreshKanbanRenderer","createWorkbenchRendererRegistry","refreshKeys","_refreshKey","getRenderer","listRenderers","refreshRenderer","initialRenderers","createDefaultState","expandedNodeIds","defaultExpandedNodeIds","expandedSectionIds","mergeDefaultSections","missing","toggleId","expanded","createTreeRendererRegistry","getTreeStates","treeStore","trees","statesByTreeId","refreshKeysByTreeId","requireTree","tree","ensureState","fresh","persistStates","loading","_loading","persistable","setTreeStates","updateState","setTreeRendererImplementation","registerTreeRenderer","persistedState","nextState","treeId","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","getTreeRenderer","listTreeRenderers","getBody","ctx","getTreeState","setSelectedNode","nodeId","getHeader","getFooter","selectedNodeId","setNodeExpanded","nextIds","setSectionExpanded","sectionId","setLoading","onDidRefresh","byOrderThenPriority","createSettingsRegistry","panels","revision","collectionItems","itemKey","itemId","registerSection","nextSections","hasView","nextPanels","getSection","listSections","resolveCollectionItem","getCollectionItem","bySlotOrderAndId","createStatusBarRegistry","listItems","registerItem","getItem","listVisibleItems","validateStatusActions","actionIds","actionId","validateStatuses","statuses","defaultCount","trim","color","sortOrder","isDefault","createStatusRegistry","statusSets","requireSet","loadingById","registerStatusSet","_removedValues","getStatusSet","listStatusSets","getStatuses","cached","finally","createFileIconThemeRegistry","themes","groups","sync","flat","register","listThemes","createThemeRegistry","viewMenuPanelId","viewMenuConfig","config","viewContextId","createWorkbenchViewMenuRegistry","menus","registerViewMenu","ownerViewId","getViewMenu","listViewMenus","mountStrategy","hiddenByDefault","workbenchViewIdContextKey","createViewRegistry","bodies","registerView","body","registerBody","listViews","refreshView","refreshInput","createPlacementCloseController","resolveCore","core","pageLocations","shellPlacements","createPlacementPinController","locationsFromRoot","targetFromLocation","pageTitle","isLocalizedString","$l10n","createWorkbenchPageBreadcrumbItems","pagesByRef","locations","onClick","setWorkbenchPageBreadcrumbs","breadcrumbs","connectWorkbenchPageBreadcrumbs","ownedBreadcrumbs","subscription","createMemoryWorkbenchPageLocationBrowser","replace","createMemoryWorkbenchPageLocationPersistence","bindsToLocation","indexCurrentOwnedPlacements","findModePlacementTransfer","desiredIdentity","currentKey","desiredKeys","transferredCurrentKeys","indexCurrentWidgetOwners","owners","restoreModeWidgets","currentIds","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","ordered","exact","transfer","transferredFromKey","currentOwner","reconcileRegions","removedKeys","modeLayout","docked","dockedWorkbenchRegions","desiredByKey","pageOwnsPrimaryLocation","placedKeys","opensPreviouslyEmptyRegion","normalizeRemovedState","activeLocation","fallbackLocation","fallbackActive","bindOwnedSubPanelsToLocation","updateOwnedWidgetLayout","desiredByIdentity","reconcileOwnedWidgetLayout","applyOwnedWidgetLayoutReconciliation","syncOwnedPanelMenus","ownedPlacements","bindPlacementsToActivePageLocation","applyPageState","storeBeforeTransition","beforeApply","stored","latest","activation","layoutInput","loadModeLayout","revealRegion","connectWorkbenchPageRuntime","applyingTransition","toTabState","toWidgetPlacement","createLiveWorkbenchPageRegistry","pageStateFromLayout","loadWorkbenchLocationLayout","resolvePagePersistenceScope","getSnapshot","layoutPersistence","createPageStateRestorer","selectPlacements","include","modeScope","createWorkbenchLayoutCache","setSnapshot","flush","read","p","readMode","saveMode","createWorkbenchShellController","getRegionState","sidePanel","setRegionOpen","getSidePanelPresentation","setSidePanelPresentation","unsubscribeLayout","sidePanelSubscription","refreshable","createWorkbenchViewBodyRegistration","registries","definition","ownsPlacement","activateModePlacementInstance","openPlacementAddTarget","params","navigation","canAddItem","addShellPanels","multiple","addPagePanels","createOwnedAddablePanels","createScopedIsInScope","listResources","createPrimaryCoordinator","isInScope","changingPersistenceScope","resolveAnchorRegion","previousPrimaryKey","reconcileAnchors","SIDENAV_PANEL_ID","togglePanel","workbench","builtinCommands","keybinding","commandPalette","registerWorkbenchBuiltIns","category","keybindings","registerKeybinding","workbenchCommandPaletteMenuPath","group","createCoreCompositionController","getPrimaryResource","connectWorkbenchCoreState","focus","activeId","fireImmediately","activeWorkbenchResource","primaryWorkbenchResource","placementContext","requirePanelPage","prepareSharedPanel","modeState","shellState","prepareWorkbenchNavigation","original","originalMode","originalShell","proposed","present","final","applyOwners","publishWithoutLocation","findPagePanelOwner","canOpenCorePanel","revealPanelRegion","openPageSlotTarget","openModePlacementTarget","openShellPlacementTarget","openCorePanelTarget","createCoreNavigationRegistry","globalThis","createCoreRenderers","treePersistence","withModuleMetadata","disposeDisposables","createModuleContext","track","disposable","_openPanel","_openWidget","_registerPanel","_registerPanelMenu","_registerPlaceholder","_registerWidget","moduleLayout","registerChildModule","module","registerModule","onDidChangePrimaryResource","onDidChangeActiveResource","modeDisposables","modeContext","returnedDisposables","navigationTrees","panelMenuState","preferences","registerKind","registerHierarchyProvider","settings","statusBar","statusSet","fileIconThemes","createWorkbenchModuleRegistry","moduleRecords","unregisterModule","moduleId","createPagePersistenceScopeHandler","carryRegions","createWorkbench","createContextKeyService","layoutCache","locationAwareLayout","defaultPanelOpenByRegionId","activeMode","regionSettings","layoutModel","pageResources","panelMenuStatePersistence","createResourceRegistry","getPrimary","resolveView","floatingPanels","initialSidePanelMode","sidePanelPersistence","pageLocationBrowser","pageLocationPersistence","workbenchPages","composition","host","restoreSnapshot","createKeybindingRegistry","preferencePersistence","treeViews","commandPaletteResources","terminal","getActiveResource","setWorkbenchRenderers"],"mappings":"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"}
|