@pstdio/workbench 0.2.0 → 0.3.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 +100 -88
- package/dist/context-key-service-W4QEfVdN.js +1031 -0
- package/dist/context-key-service-W4QEfVdN.js.map +1 -0
- package/dist/extensions.d.ts +737 -255
- package/dist/extensions.js +891 -699
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-DrrhYnb_.js.map +1 -1
- package/dist/index.d.ts +746 -448
- package/dist/index.js +2974 -60
- package/dist/index.js.map +1 -1
- package/dist/layout-types-DMoZz38-.js +100 -0
- package/dist/layout-types-DMoZz38-.js.map +1 -0
- package/dist/react.d.ts +735 -231
- package/dist/react.js +3562 -2584
- package/dist/react.js.map +1 -1
- package/dist/storage.d.ts +109 -14
- package/dist/storage.js +142 -47
- package/dist/storage.js.map +1 -1
- package/dist/surface-map-C1pOTUmF.js +52 -0
- package/dist/surface-map-C1pOTUmF.js.map +1 -0
- package/dist/testing.d.ts +685 -198
- package/dist/testing.js +46 -34
- package/dist/testing.js.map +1 -1
- package/dist/webview-runtime.js +5 -1
- 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/package.json +6 -7
- package/dist/context-key-service-C--cHa0B.js +0 -447
- package/dist/context-key-service-C--cHa0B.js.map +0 -1
- package/dist/core.d.ts +0 -1885
- package/dist/core.js +0 -64
- package/dist/core.js.map +0 -1
- package/dist/surface-reconcile-DkRf01ro.js +0 -260
- package/dist/surface-reconcile-DkRf01ro.js.map +0 -1
- package/dist/workbench-core-DFpwi8Lo.js +0 -2264
- package/dist/workbench-core-DFpwi8Lo.js.map +0 -1
- package/dist/workbench-menu-paths-CQVH6z4_.js +0 -11
- package/dist/workbench-menu-paths-CQVH6z4_.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
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/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/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/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-widget-openers.ts","../src/core/registries/layout/panel-layout-methods.ts","../src/core/registries/layout/panel-registration.ts","../src/core/registries/layout/layout-model.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-built-ins.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 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 { matchesWorkbenchLocationEligibility } 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 ?? layout.getWidget(placement.contributionId)?.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 matchesWorkbenchLocationEligibility(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.closedSubPanel && layout.getWidget(entry.closedSubPanel.reference.contributionId)?.role !== \"sub-panel\") {\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.role !== \"panel-menu\" && contribution.role !== \"sub-panel\") ||\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 widget?.role === \"sub-panel\";\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 { 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 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}\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)?.role === \"location\") {\n layout.openWidget(entry.contributionId, {\n resource,\n title: entry.title,\n replaceActive: Boolean(placement),\n });\n } else if (placement) layout.activateWidget(placement.widgetId);\n else if (entry.contributionId && layout.getWidget(entry.contributionId)) {\n layout.openWidget(entry.contributionId, { title: entry.title });\n }\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 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 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 });\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 runSilent(() => {\n const result = activateEntry(entry, { replayCurrentLocation: true });\n if (result instanceof Promise) pending = result;\n });\n }\n if (pending)\n void pending.then(\n () => finishRestore(scope, entry?.entryId),\n () => finishRestore(scope, entry?.entryId),\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};\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 const 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 input.runSilent(() => {\n const result = input.activateEntry(requestedEntry);\n if (result instanceof Promise) pending = result;\n });\n if (pending) {\n void pending.then(\n () => finish(scope, requestedEntry.entryId),\n () => finish(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 return 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\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) => {\n if (input.modes && input.modes.getActiveModeId() !== entry.modeId) input.modes.setActiveMode(entry.modeId);\n };\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 finishRestore = 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 finishRestore,\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 { 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 CreateWorkbenchSidePanelControllerInput {\n initialMode?: WorkbenchSidePanelMode;\n}\n\nexport const createWorkbenchSidePanelController = (\n input: CreateWorkbenchSidePanelControllerInput = {},\n): WorkbenchSidePanelController => {\n const internal = createWorkbenchStore<WorkbenchSidePanelState>({\n name: \"workbench.sidePanel\",\n initialState: { mode: 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 },\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}\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 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 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 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 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} 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 role: widget.role ?? \"content\",\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\nexport const withoutPreviewTabs = (layout: WorkbenchLayout) =>\n removePlacements(layout, (placement) => placement.tabRetention === \"preview\");\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 { withoutPreviewTabs } from \"./layout-tab-lifecycle\";\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(withoutPreviewTabs(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 {\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 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 (widget.role === \"sub-panel\" || widget.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 candidate.ownerResourceUri === ownerResourceUri &&\n (!openInput.resource || 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 findReplacementIndex = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n widget: RegisteredWidgetContribution,\n openInput: OpenWidgetInput,\n) => {\n const region = layout.regions[regionId];\n const activeWidgetId = widget.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\nexport const createWidgetOpeners = (input: CreateWidgetOpenersInput) => {\n const { getLayout, requireWidget, applyAndActivate } = input;\n\n const bindToActiveLocation = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n ) => {\n if (widget.role !== \"sub-panel\" && widget.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 widget,\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(\n buildUpdatedPlacement(replacement, widget, openInput),\n widget,\n getLayout(),\n );\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 widget,\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 widget,\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), widget, getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n if (replacementIndex < 0) return placeWidget(widgets, placement, openInput.tabPosition);\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 layout = getLayout();\n const regionId = openInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n const region = layout.regions[regionId];\n const replacementIndex = findReplacementIndex(layout, regionId, widget, openInput);\n const replacement = replacementIndex >= 0 ? region.widgets[replacementIndex] : undefined;\n const previewContent =\n !openInput.replaceWidgetId && openInput.tabRetention === \"preview\" && openInput.resource\n ? findResourcePlacement(layout, widget.id, openInput.resource.uri)\n : undefined;\n const existing =\n openInput.replaceWidgetId && replacement ? undefined : findReusablePlacement(widget, layout, openInput);\n\n let placement: WorkbenchWidgetPlacement;\n if (previewContent) {\n placement = applyAndActivate(layout, previewContent.regionId, previewContent.placement);\n } else if (existing) placement = reuseExistingPlacement(widget, existing, regionId, replacementIndex, openInput);\n else if (replacement?.contributionId === widget.id) {\n placement = replaceActive(widget, regionId, replacementIndex, replacement, openInput);\n } else {\n placement = insertWidget(widget, regionId, replacementIndex, openInput);\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 type {\n OpenWorkbenchPanelInput,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchRegion,\n} from \"./layout-types\";\nimport { toOpenWidgetInput, toPanelContribution, toPanelInstance } from \"./panel-api\";\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 if (!input.getWidgets()[id]) throw new Error(`Panel not registered: ${id}`);\n return toPanelInstance(input.widgetOpeners.openWidget(id, toOpenWidgetInput(openInput)));\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 { 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 WorkbenchWidgetRole,\n} from \"./layout-types\";\nimport { workbenchPanelMenuRegions, workbenchPanelRegions } from \"./layout-types\";\n\ntype LegacyWorkbenchPanelContribution = WorkbenchLocationContribution | WorkbenchSubPanelContribution;\ntype RegisteredPanelInput = LegacyWorkbenchPanelContribution | WorkbenchPanelContribution;\ntype WorkbenchPanelRole = Extract<WorkbenchWidgetRole, \"content\" | \"location\" | \"sub-panel\">;\n\ninterface RegisterPanelContributionInput {\n metadata?: ContributionMetadata;\n panel: RegisteredPanelInput;\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n role: WorkbenchPanelRole;\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 role: WorkbenchPanelRole,\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: role === \"sub-panel\" ? \"sub-panel\" : \"panel\",\n contributionId: panel.id,\n },\n role: \"panel-menu\",\n };\n};\n\nexport const registerPanelContribution = (input: RegisterPanelContributionInput) => {\n const { closable, metadata, panel, registerWidget, role } = 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: closable ?? role === \"sub-panel\",\n ownedPanelMenuIds: panelMenus.map((menu) => menu.id),\n role,\n };\n registrations.push(registerWidget(registeredPanel, metadata));\n for (const menu of panelMenus) {\n registrations.push(registerWidget(panelMenuContribution(panel, menu, role), 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 panelRole = (panel: WorkbenchPanelContribution): WorkbenchPanelRole => {\n if (panel.eligibleLocations) return \"sub-panel\";\n return \"content\";\n };\n\n const registerPanel = (panel: WorkbenchPanelContribution, metadata?: ContributionMetadata) => {\n return registerPanelContribution({\n panel,\n role: panelRole(panel),\n closable: panel.closable,\n metadata,\n registerWidget: input.registerWidget,\n });\n };\n\n const registerLocation = (location: WorkbenchLocationContribution, metadata?: ContributionMetadata) =>\n registerPanelContribution({ panel: location, role: \"location\", metadata, registerWidget: input.registerWidget });\n\n const registerSubPanel = (subPanel: WorkbenchSubPanelContribution, metadata?: ContributionMetadata) =>\n registerPanelContribution({ panel: subPanel, role: \"sub-panel\", metadata, registerWidget: input.registerWidget });\n\n const registerPanelMenu = (panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata) =>\n input.registerWidget({ ...panelMenu, role: \"panel-menu\" }, 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, LayoutScope } from \"./layout-model-types\";\nimport {\n activateInLayout,\n closeWidgetInLayout,\n findPlacementByWidgetId,\n getActiveLocationPlacement,\n removePlacementsForContribution,\n setLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport { createLayoutPlacementMethods } from \"./layout-placement-methods\";\nimport {\n carryPinnedWorkbenchChrome,\n carryWorkbenchRegionState,\n createScopeEvent,\n resolveScopedLayout,\n} from \"./layout-scope\";\nimport { withoutPreviewTabs } from \"./layout-tab-lifecycle\";\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 { 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 if (found.regionId !== \"main\") return input.panelMethods.activatePanel(instanceId);\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 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 let currentScope: LayoutScope | undefined;\n const willChangeScope = createScopeEvent<LayoutScope | undefined>();\n const didChangeScope = createScopeEvent<LayoutScope | undefined>();\n const persisted = input.persistence?.getLayout(currentScope);\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 persistLayout = () => input.persistence?.setLayout(withoutPreviewTabs(getLayout()), currentScope);\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 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: widgetOpeners.openWidget,\n\n ...placementMethods,\n\n establishLocation,\n\n setRegionActiveWidget(regionId, widgetId) {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const placement = widgetId ? region.widgets.find((candidate) => candidate.widgetId === widgetId) : undefined;\n if (widgetId && !placement) throw new Error(`Widget placement not found in ${regionId}: ${widgetId}`);\n if (region.activeWidgetId === widgetId) return;\n\n const nextLayout = {\n ...layout,\n activeWidgetId: layout.activeWidgetId === region.activeWidgetId ? placement?.widgetId : layout.activeWidgetId,\n activeResourceUri:\n layout.activeWidgetId === region.activeWidgetId ? placement?.resourceUri : layout.activeResourceUri,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, activeWidgetId: placement?.widgetId },\n },\n };\n const withSelection =\n regionId !== \"side\" && workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n regionId as WorkbenchPanelRegion,\n placement?.role === \"sub-panel\" ? placement.widgetId : undefined,\n )\n : nextLayout;\n setLayout(withSelection);\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(nextScope, scopeInput = {}) {\n if (currentScope === nextScope) return;\n input.persistence?.setLayout(withoutPreviewTabs(getLayout()), currentScope);\n willChangeScope.notify(nextScope);\n currentScope = nextScope;\n const incoming = input.persistence?.getLayout(currentScope);\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(getLayout(), scopedLayout);\n const nextLayout = carryWorkbenchRegionState(getLayout(), withPinnedChrome, scopeInput.carryRegionState ?? []);\n const snapshot = store.getState();\n store.setState({ ...snapshot, layout: nextLayout }, false, \"setPersistenceScope\");\n didChangeScope.notify(currentScope);\n },\n\n getPersistenceScope: () => currentScope,\n\n onWillChangePersistenceScope: willChangeScope.subscribe,\n onDidChangePersistenceScope: didChangeScope.subscribe,\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 DataTableRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n columns?: DataTableRendererColumn[];\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 onRowClick?: (row: DataTableRendererRow) => 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 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}\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?(resource: ResourceRef | undefined, content: string): Promise<void> | void;\n}\n\nexport interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {}\n\nexport interface FileRendererStoreState {\n renderers: Record<string, RegisteredFileRendererContribution>;\n}\n\nexport interface FileRendererRefreshEvent {\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): 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) {\n requireFileRenderer(id);\n const event = { fileRendererId: id };\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\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 interactions surfaced by the renderer (mirrored from <KanbanRenderer>). */\n onRowClick?: (row: TRow) => 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 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 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 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}\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 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}\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 type { KeybindingSequence } from \"./registries/keybindings/keybinding-registry\";\nimport type { WorkbenchRegion } from \"./registries/layout/layout-model\";\nimport { workbenchCommandPaletteMenuPath } from \"./registries/menus/workbench-menu-paths\";\nimport type { WorkbenchCore } from \"./workbench-core\";\n\nconst SIDENAV_PANEL_ID = \"sidenav\";\n\nconst setPanelOpen = (workbench: WorkbenchCore, panelId: WorkbenchRegion, open: boolean) => {\n workbench.panels.setOpen(panelId, open);\n workbench.layout.setRegionVisible(panelId, open);\n};\n\nconst togglePanel = (workbench: WorkbenchCore, panelId: WorkbenchRegion) => {\n setPanelOpen(workbench, panelId, !workbench.panels.isOpen(panelId));\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). Chords listed here must not clash with browser, OS, or\n// developer-tool shortcuts — see `findReservedKeybindingConflict` in\n// `pstdio-extensions` for the reserved table.\nconst builtinCommands: BuiltinCommand[] = [\n {\n id: \"workbench.toggleCommandPalette\",\n label: \"Toggle Command Palette\",\n icon: \"Command\",\n keybinding: \"Mod+K\",\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.history.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.history.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\ninterface WorkbenchSwitchModeCommandArgs {\n modeId: string;\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 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 workbench.commands.registerCommand(\n {\n id: \"workbench.action.switchMode\",\n label: \"Switch Mode\",\n category: \"Workbench\",\n icon: \"PanelTop\",\n when: \"!inputFocus\",\n },\n {\n execute: (args?: WorkbenchSwitchModeCommandArgs) => {\n if (!args?.modeId) {\n workbench.commandPalette.open({ view: \"mode\" });\n return;\n }\n if (!workbench.modes.getMode(args.modeId)) throw new Error(`Workbench mode not registered: ${args.modeId}`);\n workbench.modes.setActiveMode(args.modeId);\n },\n },\n );\n workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, {\n commandId: \"workbench.action.switchMode\",\n group: \"Workbench\",\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 { 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 {\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} 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 context: ContextKeyService;\n focus: WorkbenchFocusController;\n history: HistoryController;\n keybindings: KeybindingRegistry;\n lastResource: WorkbenchLastResourceController;\n layout: WorkbenchLayoutModel;\n modes: WorkbenchModeRegistry;\n navigation: NavigationRegistry;\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 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 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\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({ initialMode: input.initialSidePanelMode });\n const shell = createWorkbenchShellController({ layout, sidePanel });\n\n const core: WorkbenchCore = {\n breadcrumbs: createWorkbenchBreadcrumbController(),\n commandPalette: createWorkbenchCommandPaletteController(),\n commands,\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 notifications: createNotificationRegistry(),\n navigation: createNavigationRegistry({\n resolveDispatcher: () => ({\n createCheckpoint: () => {\n const layout = core.layout.getLayout();\n return () => core.layout.restoreLayout(layout);\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.history = createHistoryController({\n layout: core.layout,\n modes: core.modes,\n resources: core.resources,\n persistence: input.historyPersistence,\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","workbenchFocusRegions","focusContextByRegion","activity","sidenav","main","secondary","side","status","createWorkbenchFocusController","activeRegion","context","createScope","applyContext","region","set","focusRegion","setActiveRegion","isRegionFocusable","clearFocus","getActiveRegion","workbenchNavigationPanelRegions","workbenchPlacementRole","layout","placement","role","getWidget","contributionId","findSubPanelPlacement","reference","instanceKey","exact","findPlacementByWidgetId","getLayout","workbenchPanelRegions","regions","widgets","find","candidate","resourceUri","subPanelRefFromPlacement","widgetId","isSameSubPanel","left","right","selectedSubPanelsFromLayout","modeId","selected","location","getActiveLocationPlacement","regionId","active","activeWidgetId","widget","matchesWorkbenchLocationEligibility","locationPlacementFromLayout","locationFromPlacement","key","entryFromCurrentSnapshot","modes","getActiveModeId","recordedAt","Date","now","base","entryId","counter","selectedSubPanels","getMode","isSameNavigationEntry","every","compactNavigationEntries","entries","compacted","lastIndex","push","withoutSubPanelSelection","closedNavigationEntry","closedSubPanel","WORKBENCH_HISTORY_VERSION","emptyHistoryState","cursor","recentlyClosed","hydrating","hydrateHistoryState","persisted","version","Math","min","max","slice","reconcileEntry","contribution","Boolean","listPresenters","some","presenter","canOpen","Object","fromEntries","filter","reconcileHistoryState","currentEntryId","retainedCursor","findIndex","DEFAULT_MAX_ENTRIES","PERSISTENCE_DELAY_MS","createHistoryPersistenceScheduler","timer","flush","persistence","_hydrating","setHistory","getScope","schedule","setTimeout","suppressTransitionSnapshot","fromLayoutChange","transitioning","uri","currentNavigationEntry","placementsByWidgetId","placements","Map","values","activateHistoryResource","replayCurrentLocation","replayResource","restoreSelections","presenters","activeLocationUri","activateWidget","openWidget","createHistoryControllerApi","activateEntry","controllerInput","finishRestore","getPersistenceScope","moveCursor","runSilent","setPersistenceScope","goBack","goForward","goPrevious","snapshot","reopenLastClosed","last","at","pending","reopenSubPanel","closable","Promise","then","restore","scope","result","clear","createHistoryRestoreFinisher","finish","restoredEntryId","requestedEntry","onFinish","createHistoryCursorMover","delta","trackLayoutScopeRotation","rotating","onWillChangePersistenceScope","onDidChangePersistenceScope","createHistoryController","navigating","awaitingRestore","isRotatingLayoutScope","currentScope","replayingResourceUris","Set","schedulePersist","action","persist","appendEntry","trimmed","replacesCurrentMode","appended","maxEntries","recordSnapshot","completedResourceOpen","isOpeningResource","isTransitioning","has","lastPlacements","normalizeRemovedPlacement","currentId","pushRecentlyClosed","includes","nextPlacements","tracked","onDidChangeActive","onDidOpenResource","fallbackWidgetId","activeLocationWidgetId","setRegionActiveWidget","restoreMode","setActiveMode","add","finally","delete","options","replayScope","hydrated","getHistory","window","addEventListener","createWorkbenchLastResourceController","get","getLastResource","setLastResource","saved","createWorkbenchPanelsController","defaultOpenByRegionId","getPanelStates","resolveOpenByRegionId","openByRegionId","persistState","setPanelStates","setOpen","incoming","subscribe","createWorkbenchSidePanelController","mode","initialMode","setMode","DEFAULT_SESSION_TITLE","INITIAL_DATA_BUFFER_LIMIT","createWorkbenchTerminalController","sessionsById","opener","adapters","adapterDisposers","initialDataBuffers","sessionsWithDataSubscribers","patchSession","sessionId","patch","session","requireAdapter","adapter","Error","cleanupSession","disposers","dispose","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","_removed","rest","listProviders","queryProviders","results","query","providerId","refresh","createCommandRegistry","commands","errorListeners","requireCommand","record","emitError","event","registerCommand","command","handler","metadata","normalizeContributionMetadata","getCommand","listCommands","sort","byContributionPriority","isCommandEnabled","args","isEnabled","isCommandVisible","matches","when","isVisible","isCommandToggled","isToggled","executeCommand","error","commandId","execute","onDidExecuteError","createRegionQueries","getWidgets","getPlaceholder","getRegionSize","persistedSize","size","getActivePlacement","contributionSize","regionSize","defaultPx","getRegionCollapsible","regionCollapsible","getRegionHeaderBorderBottom","headerBorderBottom","createContributionLists","getPlaceholders","listPlaceholders","listWidgets","createContributionRegistrations","persistLayout","registerPlaceholder","placeholder","priority","placeholderContribution","placeholders","nextPlaceholders","registerWidget","reuse","singleton","widgetContribution","nextWidgets","nextLayout","removePlacementsForContribution","insertAtPosition","position","unshift","targetWidgetId","beforeWidgetId","afterWidgetId","targetIndex","splice","placeWidget","tabRetention","persistentWidgets","reorderWidgetPlacement","remaining","removePlacements","shouldRemove","removed","replaceRegionWidgets","clearActiveWidget","removeLocationSubPanelSelection","flatMap","activeResourceUri","expirePreviewTabsInLayout","ownerResourceUri","withoutPreviewTabs","createLayoutPlacementMethods","updateWidgetPlacement","update","requireWidget","nextPlacement","buildUpdatedPlacement","currentIndex","setLayout","reorderWidget","expirePreviewTabs","applyAndActivate","carryPinnedWorkbenchChrome","pinned","contributionIds","incomingRegion","carryWorkbenchRegionState","regionIds","resolveScopedLayout","defaultRegionVisibility","mergeWithDefaultRegions","createDefaultWorkbenchLayout","createScopeEvent","listeners","notify","openOwnedPanelMenus","panelMenuId","ownedPanelMenuIds","panelMenu","findReusablePlacement","findPlacement","findResourcePlacement","findReplacementIndex","replaceWidgetId","replacementWidgetId","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","updated","tabPosition","replacementIndex","replacement","reuseExistingPlacement","withoutExisting","_current","copy","insertWidget","createUniqueWidgetId","createPlacement","fallbackRegion","previewContent","createPanelLayoutMethods","getPanel","toPanelContribution","listPanels","listPanelInstances","toPanelInstance","getActivePanel","activeInstanceId","found","openPanel","widgetOpeners","toOpenWidgetInput","updatePanel","instanceId","placementMethods","reorderPanel","activatePanel","closePanel","closeWidgetInLayout","activePlacement","panelMenuContribution","panel","menu","workbenchPanelMenuRegions","panelMenuOwner","level","registerPanelContribution","panelMenus","panelContribution","registrations","registeredPanel","registration","reverse","createPanelRegistrations","panelRole","eligibleLocations","registerPanel","registerLocation","registerSubPanel","subPanel","registerPanelMenu","createLocationEstablisher","panelMethods","requireRegisteredWidget","createLayoutModel","willChangeScope","didChangeScope","initialLayout","regionQueries","contributionLists","updateRegion","nextRegion","activateInLayout","contributionRegistrations","panelRegistrations","establishLocation","unregisterWidget","setRegionVisible","visible","setRegionSize","withSelection","setLocationSubPanelSelection","closeWidget","closedPlacement","removeWidgetPlacement","clearRegion","cleared","resetRegions","nextRegions","locationSubPanelSelections","restoreLayout","nextScope","scopeInput","scopedLayout","withPinnedChrome","carryRegionState","menuPathKey","join","createMenuRegistry","deps","menuStore","itemsByPath","registerMenuItem","item","list","filtered","listMenuItems","leftOrder","order","rightOrder","byPriorityAndId","localeCompare","noDispatcher","dispatchItem","target","dispatcher","panelId","validateItem","canOpenResource","canOpenPanel","canExecuteCommand","toItems","targets","createNavigationRegistry","resolveDispatcher","parsers","navigators","removeKey","registry","registerParser","parser","parserContribution","listParsers","resolveLocation","canParse","parse","openTarget","rollback","createCheckpoint","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","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","SIDENAV_PANEL_ID","setPanelOpen","workbench","togglePanel","builtinCommands","keybinding","commandPalette","history","registerWorkbenchBuiltIns","category","keybindings","registerKeybinding","workbenchCommandPaletteMenuPath","group","withModuleMetadata","toDisposables","Array","isArray","disposeDisposables","disposables","createModuleContext","core","contextScope","track","disposable","onDidChangePrimaryResource","onDidChangeActiveResource","breadcrumbs","focus","lastResource","instance","registerMode","activate","modeDisposables","modeContext","returnedDisposables","navigation","preferences","registerKind","registerHierarchyProvider","registerPresenter","settings","shell","fileIconThemes","createWorkbenchCore","createContextKeyService","moduleRecords","createWorkbenchRendererRegistry","treeRendererRegistry","treePersistence","kanbanRendererRegistry","dataTableRendererRegistry","fileRendererRegistry","controlsRendererRegistry","locationAwareLayout","defaultPanelOpenByRegionId","getSnapshot","setSnapshot","layoutPersistence","layoutModel","initialSidePanelMode","host","restoreSnapshot","carryRegions","createKeybindingRegistry","lastResourcePersistence","kinds","panelsPersistence","preferencePersistence","commandPaletteResources","createResourceRegistry","getPrimary","terminal","getActiveResource","getPrimaryResource","registerModule","module","unregisterModule","moduleId","createWorkbenchModeRegistry","resolveContext","historyPersistence"],"mappings":"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"}
|