@pstdio/workbench 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +39 -317
  2. package/dist/extensions.d.ts +1283 -774
  3. package/dist/extensions.js +1454 -1924
  4. package/dist/extensions.js.map +1 -1
  5. package/dist/file-renderer-view-kfJRY3yR.js +515 -0
  6. package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
  7. package/dist/index.d.ts +589 -644
  8. package/dist/index.js +5011 -2644
  9. package/dist/index.js.map +1 -1
  10. package/dist/react.d.ts +540 -585
  11. package/dist/react.js +3583 -3424
  12. package/dist/react.js.map +1 -1
  13. package/dist/storage.d.ts +118 -157
  14. package/dist/storage.js +135 -149
  15. package/dist/storage.js.map +1 -1
  16. package/dist/webview-runtime.d.ts +2 -5
  17. package/dist/webview-runtime.js +3 -3
  18. package/dist/webview-runtime.js.map +1 -1
  19. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  20. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  21. package/dist/workbench-renderers-DmsrBGC7.js +960 -0
  22. package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
  23. package/dist/workspaces-DJwFj8uq.js +1872 -0
  24. package/dist/workspaces-DJwFj8uq.js.map +1 -0
  25. package/package.json +6 -41
  26. package/dist/composition-resolver-types-CWykPyEK.js +0 -241
  27. package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
  28. package/dist/file-renderer-view-B6_iR4EN.js +0 -496
  29. package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
  30. package/dist/file-section-navigation-CfYqVObc.js +0 -30
  31. package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
  32. package/dist/layout-types-DMoZz38-.js +0 -100
  33. package/dist/layout-types-DMoZz38-.js.map +0 -1
  34. package/dist/surface-map-C1pOTUmF.js +0 -52
  35. package/dist/surface-map-C1pOTUmF.js.map +0 -1
  36. package/dist/testing.d.ts +0 -2443
  37. package/dist/testing.js +0 -58
  38. package/dist/testing.js.map +0 -1
  39. package/dist/workbench-built-ins-BCJ6-fIM.js +0 -1173
  40. package/dist/workbench-built-ins-BCJ6-fIM.js.map +0 -1
  41. package/dist/workbench-menu-paths-D-e7iscN.js +0 -43
  42. package/dist/workbench-menu-paths-D-e7iscN.js.map +0 -1
  43. package/dist/workflow-status-settings-DLiu9FZ0.js +0 -144
  44. package/dist/workflow-status-settings-DLiu9FZ0.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-renderers-DmsrBGC7.js","sources":["../src/core/shared/disposable.ts","../src/core/shared/workbench-effect.ts","../src/core/shared/store/workbench-batch.ts","../src/core/shared/store/workbench-store.ts","../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-types.ts","../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/panel-widget-eligibility.ts","../src/core/shared/contributions/metadata.ts","../src/core/registries/layout/panel-api.ts","../src/core/registries/modes/mode-layout.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/layout/surface-map.ts","../src/core/registries/layout/surface-reconcile.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/resources/resource-hierarchy.ts","../src/core/registries/resources/resource-registry.ts","../src/core/shared/context/context-key-service.ts","../src/core/workbench-renderers.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","/** Host effects run after state commits. A failed effect must not interrupt other owners. */\nexport function runWorkbenchEffect<Result>(owner: string, effect: () => Result) {\n try {\n return effect();\n } catch (error) {\n console.error(`Workbench effect failed (${owner})`, error);\n return undefined;\n }\n}\n","import { runWorkbenchEffect } from \"../workbench-effect\";\n\nlet depth = 0;\nconst pending = new Map<object, () => void>();\n\nexport const notifyWorkbenchChange = (owner: object, notify: () => void) => {\n if (depth === 0) {\n runWorkbenchEffect(\"store subscriber\", notify);\n return;\n }\n if (!pending.has(owner)) pending.set(owner, notify);\n};\n\n/** Commit related stores before their subscribers read the resulting workbench state. */\nexport const batchWorkbenchChanges = <Result>(commit: () => Result) => {\n depth++;\n try {\n return commit();\n } finally {\n depth--;\n if (depth === 0) {\n depth++;\n try {\n while (pending.size) {\n const [owner, notify] = pending.entries().next().value!;\n pending.delete(owner);\n runWorkbenchEffect(\"store subscriber\", notify);\n }\n } finally {\n depth--;\n }\n }\n }\n};\n","import { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\nimport { notifyWorkbenchChange } from \"./workbench-batch\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribe: WorkbenchStore<TState>[\"subscribe\"] = (listener) => {\n const owner = {};\n return api.subscribe((_state, previous) => notifyWorkbenchChange(owner, () => listener(api.getState(), previous)));\n };\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","import type { FileRendererSectionTarget, ModeRegionSettings, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { ContributionSource, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n\nexport interface WorkbenchRegionSize {\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\n/** Region-level layout policy owned by the active mode or the host, never by a placement. */\nexport type WorkbenchRegionSettings = ModeRegionSettings;\n\nexport type WidgetReusePolicy = \"resource\" | \"none\";\n\nexport type WidgetMountStrategy = \"active\" | \"keep-mounted\";\n\nexport type WorkbenchPanelReusePolicy = WidgetReusePolicy;\n\nexport type WorkbenchPanelMountStrategy = WidgetMountStrategy;\n\nexport type WorkbenchWidgetRole = \"content\" | \"location\" | \"sub-panel\" | \"panel-menu\";\n\nexport type WorkbenchTabRetention = \"preview\" | \"persistent\";\n\nexport type WorkbenchTabPosition = \"start\" | \"end\" | { beforeWidgetId: string } | { afterWidgetId: string };\n\nexport interface WorkbenchLocationEligibility {\n modeIds?: string[];\n resourceKinds?: string[];\n resourceIds?: string[];\n canOpen?(resource: ResourceRef): boolean;\n canOpenLocation?(location: { resource?: ResourceRef; viewId?: string }): boolean;\n}\n\nexport type WorkbenchPanelMenuOwner =\n | { level: \"panel\"; contributionId?: string }\n | { level: \"sub-panel\"; contributionId: string };\n\nexport interface WorkbenchCommandTarget {\n commandId: string;\n args?: unknown;\n}\n\nexport type WorkbenchTabAction =\n | ({ kind: \"command\" } & WorkbenchCommandTarget)\n | { kind: \"navigation\"; target: NavigationTarget };\n\nexport interface WorkbenchTabMenuRow {\n id: string;\n label: string;\n icon?: string;\n iconColor?: string;\n selected?: boolean;\n disabled?: boolean;\n action?: WorkbenchTabAction;\n}\n\nexport interface WorkbenchTabMenuGroup {\n id: string;\n rows: readonly WorkbenchTabMenuRow[];\n}\n\nexport interface WorkbenchTabSnapshot {\n label?: string;\n icon?: string;\n indicator?: { icon: string; color?: string; label?: string };\n menu?: readonly WorkbenchTabMenuGroup[];\n}\n\nexport interface WorkbenchWidgetTab {\n getSnapshot(instance: WorkbenchPanelInstance): WorkbenchTabSnapshot;\n subscribe?(listener: () => void): { dispose(): void } | (() => void);\n refreshEvents?: readonly string[];\n}\n\nexport type WorkbenchPanelTab = WorkbenchWidgetTab;\n\nexport interface WidgetContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n singleton?: boolean;\n reuse?: WidgetReusePolicy;\n mountStrategy?: WidgetMountStrategy;\n closable?: boolean;\n // Non-closeable widgets opt into the tab visibility menu; closeable widgets\n // ignore this and use the X button for dismissal.\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n resourceKinds?: string[];\n priority?: number;\n rendererId: string;\n openCommand?: WorkbenchCommandTarget;\n eligibleLocations?: WorkbenchLocationEligibility;\n panelMenuOwner?: WorkbenchPanelMenuOwner;\n tab?: WorkbenchWidgetTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport interface WorkbenchPanelMenuDefinition {\n id: string;\n title: string;\n icon?: string;\n side: WorkbenchPanelMenuSide;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n rendererId: string;\n priority?: number;\n config?: unknown;\n}\n\nexport interface WorkbenchPanelContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n rendererId: string;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n closable?: boolean;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n resourceKinds?: string[];\n eligibleLocations?: WorkbenchLocationEligibility;\n priority?: number;\n openCommand?: WorkbenchCommandTarget;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n ownerId?: string;\n source?: ContributionSource;\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport type WorkbenchPanelMenuContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\"> & {\n region: WorkbenchPanelMenuRegion;\n fallbackRegion?: WorkbenchPanelMenuRegion;\n};\n\nexport type RegisteredWidgetContribution = Omit<WidgetContribution, \"priority\" | \"singleton\" | \"reuse\"> & {\n ownedPanelMenuIds?: readonly string[];\n singleton: boolean;\n reuse: WidgetReusePolicy;\n} & RegisteredContributionMetadata;\n\nexport interface PlaceholderContribution {\n id: string;\n title: string;\n region: WorkbenchRegion;\n rendererId: string;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n priority?: number;\n}\n\nexport type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, \"priority\"> &\n RegisteredContributionMetadata;\n\nexport interface WorkbenchWidgetPlacement {\n widgetId: string;\n contributionId: string;\n // Owner-scoped composition uses this canonical identity. Widget IDs remain renderer keys\n // and must never be parsed to recover placement ownership.\n placementIdentity?: PlacementIdentity;\n viewId?: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n resourceKey?: string;\n ownerResourceKey?: string;\n title?: string;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchWidgetTab;\n role?: WorkbenchWidgetRole;\n}\n\nexport interface WorkbenchPanelInstance {\n instanceId: string;\n panelId: string;\n placementIdentity?: PlacementIdentity;\n viewId?: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n resourceKey?: string;\n ownerResourceKey?: string;\n title?: string;\n pinned?: boolean;\n closable: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchPanelTab;\n}\n\nexport interface WorkbenchRegionState {\n id: WorkbenchRegion;\n visible: boolean;\n size?: number;\n widgets: WorkbenchWidgetPlacement[];\n activeWidgetId?: string;\n}\n\nexport interface WorkbenchLayout {\n regions: Record<WorkbenchRegion, WorkbenchRegionState>;\n locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;\n activeWidgetId?: string;\n activeLocationWidgetId?: string;\n activeResourceKey?: string;\n}\n\nexport interface WorkbenchLayoutStoreState {\n layout: WorkbenchLayout;\n widgets: Record<string, RegisteredWidgetContribution>;\n placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;\n}\n\nexport interface OpenWidgetInput {\n viewId?: string | null;\n resource?: ResourceRef | null;\n title?: string;\n region?: WorkbenchRegion;\n // The role this placement takes when the caller knows it better than the widget.\n // A panel is a Location in main and a Sub Panel elsewhere.\n role?: WorkbenchWidgetRole;\n ownerId?: string;\n source?: ContributionSource;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tabPosition?: WorkbenchTabPosition;\n tab?: WorkbenchWidgetTab;\n replaceActive?: boolean;\n replaceWidgetId?: string;\n}\n\nexport type WorkbenchPanelOpenStrategy =\n | { kind: \"persistent\"; position?: WorkbenchTabPosition }\n | { kind: \"replace-active\" }\n | { kind: \"replace-panel\"; instanceId: string; retention?: WorkbenchTabRetention }\n | { kind: \"preview\"; position?: WorkbenchTabPosition };\n\nexport interface OpenWorkbenchPanelInput {\n /** Set by the view registry. Low-level layout callers should leave this undefined. */\n viewId?: string | null;\n /** `null` explicitly clears an existing singleton placement's resource binding. */\n resource?: ResourceRef | null;\n title?: string;\n region?: WorkbenchRegion;\n role?: WorkbenchWidgetRole;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tab?: WorkbenchPanelTab;\n strategy?: WorkbenchPanelOpenStrategy;\n}\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceKey = layout.activeResourceKey;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceKey = widgets[activeIndex]?.resourceKey;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceKey };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n const persistedRegions = Object.fromEntries(\n workbenchRegions.flatMap((region) => (persisted.regions[region] ? [[region, persisted.regions[region]]] : [])),\n ) as Partial<WorkbenchLayout[\"regions\"]>;\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persistedRegions },\n });\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionState,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { workbenchPanelRegions } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceKey: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceKey === resourceKey,\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const createUniqueWidgetId = (layout: WorkbenchLayout, contributionId: string) => {\n const widgetIds = new Set(\n Object.values(layout.regions).flatMap((region) => region.widgets.map((placement) => placement.widgetId)),\n );\n return resolveUniqueWidgetId(widgetIds, contributionId);\n};\nexport const getActivePlacement = (region: WorkbenchRegionState) =>\n region.widgets.find((placement) => placement.widgetId === region.activeWidgetId) ?? region.widgets[0];\nconst isLocationPlacement = (placement: WorkbenchWidgetPlacement) => placement.role === \"location\";\nexport const locationWorkspaceKey = (placement: WorkbenchWidgetPlacement) =>\n placement.resourceKey ?? `${placement.contributionId}:${placement.widgetId}`;\nexport const setLocationSubPanelSelection = (\n layout: WorkbenchLayout,\n location: WorkbenchWidgetPlacement | undefined,\n region: WorkbenchPanelRegion,\n widgetId: string | undefined,\n) => {\n if (!location) return layout;\n const key = locationWorkspaceKey(location);\n const current = layout.locationSubPanelSelections?.[key] ?? {};\n const next = { ...current };\n if (widgetId) next[region] = widgetId;\n else delete next[region];\n return {\n ...layout,\n locationSubPanelSelections: {\n ...layout.locationSubPanelSelections,\n [key]: next,\n },\n };\n};\nexport const removeLocationSubPanelSelection = (layout: WorkbenchLayout, widgetId: string) => {\n if (!layout.locationSubPanelSelections) return layout;\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections).map(([key, selections]) => [\n key,\n Object.fromEntries(Object.entries(selections).filter(([, selectedId]) => selectedId !== widgetId)),\n ]),\n ) as WorkbenchLayout[\"locationSubPanelSelections\"];\n return { ...layout, locationSubPanelSelections };\n};\nexport const getActiveLocationPlacement = (layout: WorkbenchLayout) => {\n const locations = layout.regions.main.widgets.filter(isLocationPlacement);\n return locations.find((placement) => placement.widgetId === layout.activeLocationWidgetId) ?? locations.at(-1);\n};\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.viewId !== undefined) next.viewId = update.viewId ?? undefined;\n if (update.resource === null) {\n next.resource = undefined;\n next.resourceKey = undefined;\n next.title = update.title ?? widget.title;\n } else if (update.resource) {\n next.resource = update.resource;\n next.resourceKey = resourceKey(update.resource);\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.tabRetention !== undefined) next.tabRetention = update.tabRetention;\n if (update.tab !== undefined) next.tab = update.tab;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n if (update.role !== undefined) next.role = update.role;\n return next;\n};\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n viewId: spec.viewId ?? undefined,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource ?? undefined,\n resourceKey: resourceKey(spec.resource ?? undefined),\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n tabRetention: spec.tabRetention,\n tab: spec.tab ?? widget.tab,\n role: spec.role ?? \"content\",\n});\ninterface ReplaceRegionWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\nexport const replaceRegionWidgets = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceRegionWidgetsOptions = {},\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n const widgets = update(region.widgets);\n const activeWidgetId =\n options.activeWidgetId !== undefined\n ? options.activeWidgetId\n : options.clearActiveWidget\n ? undefined\n : region.activeWidgetId;\n return {\n ...layout,\n activeLocationWidgetId:\n regionId === \"main\" && !widgets.some((placement) => placement.widgetId === layout.activeLocationWidgetId)\n ? widgets.filter(isLocationPlacement).at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, widgets, activeWidgetId },\n },\n };\n};\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter((placement) => placement.contributionId === contributionId);\n const filtered = region.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === region.widgets.length) continue;\n const activeWidgetId =\n region.activeWidgetId && !filtered.some((placement) => placement.widgetId === region.activeWidgetId)\n ? undefined\n : region.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n regions: {\n ...nextLayout.regions,\n [region.id]: { ...region, widgets: filtered, activeWidgetId },\n },\n };\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n const hasActiveWidget = Object.values(nextLayout.regions).some((region) =>\n region.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n if (\n nextLayout.activeLocationWidgetId &&\n !nextLayout.regions.main.widgets.some((placement) => placement.widgetId === nextLayout.activeLocationWidgetId)\n ) {\n nextLayout = {\n ...nextLayout,\n activeLocationWidgetId: nextLayout.regions.main.widgets.filter(isLocationPlacement).at(-1)?.widgetId,\n };\n }\n return nextLayout;\n};\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n const region = layout.regions[found.regionId];\n const widgets = region.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = region.activeWidgetId === widgetId || (!region.activeWidgetId && found.index === 0);\n const fallbackSubPanel =\n found.placement.role === \"sub-panel\"\n ? widgets.find(\n (placement) =>\n placement.role === \"sub-panel\" && placement.ownerResourceKey === found.placement.ownerResourceKey,\n )\n : undefined;\n const nextActivePlacement =\n fallbackSubPanel ??\n (found.placement.role === \"sub-panel\" && found.regionId === \"main\"\n ? getActiveLocationPlacement(layout)\n : (widgets[found.index] ?? widgets[found.index - 1]));\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : region.activeWidgetId;\n const nextRegion = { ...region, widgets, activeWidgetId };\n let nextLayout: WorkbenchLayout = removeLocationSubPanelSelection(\n {\n ...layout,\n activeLocationWidgetId:\n layout.activeLocationWidgetId === widgetId\n ? layout.regions.main.widgets\n .filter((placement) => placement.widgetId !== widgetId && isLocationPlacement(placement))\n .at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [region.id]: nextRegion,\n },\n },\n widgetId,\n );\n if (\n closingEffectiveActive &&\n found.regionId !== \"side\" &&\n workbenchPanelRegions.includes(found.regionId as WorkbenchPanelRegion)\n ) {\n nextLayout = setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n found.regionId as WorkbenchPanelRegion,\n nextActivePlacement?.role === \"sub-panel\" ? nextActivePlacement.widgetId : undefined,\n );\n }\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceKey: nextActivePlacement?.resourceKey,\n };\n }\n return {\n regionId: found.regionId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextRegion),\n layout: nextLayout,\n };\n};\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n if (regionId === \"main\" && isLocationPlacement(placement)) {\n const selections = layout.locationSubPanelSelections?.[locationWorkspaceKey(placement)] ?? {};\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([id, panel]) => [\n id,\n {\n ...panel,\n widgets: panel.widgets.map((candidate) => {\n if (!placement.resource || candidate.widgetId === placement.widgetId) return candidate;\n if (candidate.ownerResourceKey !== placement.resourceKey) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, resource: placement.resource };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n for (const panelRegion of workbenchPanelRegions) {\n const panel = regions[panelRegion];\n const selectedId = selections[panelRegion];\n const selected = panel.widgets.find(\n (candidate) =>\n candidate.widgetId === selectedId &&\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceKey || candidate.ownerResourceKey === placement.resourceKey),\n );\n regions[panelRegion] = {\n ...panel,\n activeWidgetId:\n panelRegion === \"side\"\n ? panel.activeWidgetId\n : (selected?.widgetId ?? (panelRegion === \"main\" ? placement.widgetId : undefined)),\n };\n }\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: placement.widgetId,\n activeResourceKey: placement.resourceKey,\n regions,\n };\n }\n const withSelection =\n placement.role === \"sub-panel\" &&\n regionId !== \"side\" &&\n workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n layout,\n getActiveLocationPlacement(layout),\n regionId as WorkbenchPanelRegion,\n placement.widgetId,\n )\n : layout;\n return {\n ...withSelection,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: layout.activeLocationWidgetId,\n activeResourceKey: placement.resourceKey,\n regions: {\n ...withSelection.regions,\n [regionId]: { ...region, activeWidgetId: placement.widgetId },\n },\n };\n};\n// Selects one widget as a region's active tab. In main the selected Location tab is the\n// active Location: panel menus, Sub Panel selections, and the primary resource all\n// follow it, so selecting a Location without moving it would leave them on the old\n// panel. Returns undefined when the selection is already current.\nexport const selectRegionActiveWidget = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n widgetId: string | undefined,\n) => {\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 undefined;\n const followsRegion = layout.activeWidgetId === region.activeWidgetId;\n const nextLayout: WorkbenchLayout = {\n ...layout,\n activeWidgetId: followsRegion ? placement?.widgetId : layout.activeWidgetId,\n activeResourceKey: followsRegion ? placement?.resourceKey : layout.activeResourceKey,\n activeLocationWidgetId:\n regionId === \"main\" && placement?.role === \"location\" ? placement.widgetId : layout.activeLocationWidgetId,\n regions: { ...layout.regions, [regionId]: { ...region, activeWidgetId: placement?.widgetId } },\n };\n if (regionId === \"side\" || !workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) return nextLayout;\n return setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n regionId as WorkbenchPanelRegion,\n placement?.role === \"sub-panel\" ? placement.widgetId : undefined,\n );\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActiveLocationPlacement } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nconst supportsResource = (widget: RegisteredWidgetContribution, resource: ResourceRef | undefined) => {\n if (widget.resourceKinds?.length && (!resource || !widget.resourceKinds.includes(resource.type))) return false;\n if (widget.canOpen && (!resource || !widget.canOpen(resource))) return false;\n return true;\n};\nexport const getActiveWorkbenchSubPanel = (\n layout: WorkbenchLayout,\n region: WorkbenchPanelRegion,\n resource: ResourceRef | undefined,\n options: {\n ignoreOwnerResourceKey?: boolean;\n } = {},\n) => {\n const panel = layout.regions[region];\n return panel.widgets.find(\n (placement) =>\n placement.widgetId === panel.activeWidgetId &&\n placement.role === \"sub-panel\" &&\n (options.ignoreOwnerResourceKey ||\n !placement.ownerResourceKey ||\n placement.ownerResourceKey === resourceKey(resource)),\n );\n};\nexport const getActiveWorkbenchLocationPanel = (layout: WorkbenchLayout) => getActiveLocationPlacement(layout);\nconst matchesLocationEligibility = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n location?: WorkbenchWidgetPlacement,\n) => {\n const eligibleLocations = widget.eligibleLocations;\n if (!matchesWorkbenchModeEligibility(widget, modeId)) return false;\n if (\n eligibleLocations?.resourceKinds?.length &&\n (!resource || !eligibleLocations.resourceKinds.includes(resource.type))\n ) {\n return false;\n }\n if (\n eligibleLocations?.resourceIds?.length &&\n (!resource?.id || !eligibleLocations.resourceIds.includes(resource.id))\n ) {\n return false;\n }\n if (eligibleLocations?.canOpen && (!resource || !eligibleLocations.canOpen(resource))) return false;\n if (\n eligibleLocations?.canOpenLocation &&\n !eligibleLocations.canOpenLocation({ resource, viewId: location?.viewId })\n ) {\n return false;\n }\n if (placement?.ownerResourceKey && placement.ownerResourceKey !== resourceKey(resource)) return false;\n return true;\n};\nexport const matchesWorkbenchModeEligibility = (widget: RegisteredWidgetContribution, modeId: string | undefined) => {\n const eligibleModeIds = widget.eligibleLocations?.modeIds;\n return !eligibleModeIds?.length || (modeId !== undefined && eligibleModeIds.includes(modeId));\n};\nexport const isWorkbenchPanelPlacementVisible = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n options: {\n ignoreResourceLocation?: boolean;\n location?: WorkbenchWidgetPlacement;\n } = {},\n) => {\n if (!supportsResource(widget, placement?.resource ?? resource)) return false;\n if (options.ignoreResourceLocation) return matchesWorkbenchModeEligibility(widget, modeId);\n return matchesLocationEligibility(widget, resource, modeId, placement, options.location);\n};\nexport const matchesWorkbenchPanelMenuOwner = (\n widget: RegisteredWidgetContribution,\n context: {\n locationPanel?: WorkbenchWidgetPlacement;\n subPanel?: WorkbenchWidgetPlacement;\n },\n) => {\n const owner = widget.panelMenuOwner ?? { level: \"panel\" };\n if (owner.contributionId) {\n const activeOwner = context.subPanel ?? context.locationPanel;\n return activeOwner?.contributionId === owner.contributionId;\n }\n if (context.subPanel) {\n return owner.level === \"sub-panel\";\n }\n if (owner.level === \"panel\") {\n return true;\n }\n return false;\n};\n","export type ContributionSource = \"module\" | \"extension\";\n\nexport interface ContributionMetadata {\n source?: ContributionSource;\n ownerId?: string;\n priority?: number;\n}\n\nexport interface RegisteredContributionMetadata {\n source: ContributionSource;\n ownerId: string;\n priority: number;\n}\n\nconst defaultContributionOwnerId = \"workbench.core\";\n\nexport const normalizeContributionMetadata = (metadata: ContributionMetadata = {}) => ({\n source: metadata.source ?? \"module\",\n ownerId: metadata.ownerId ?? defaultContributionOwnerId,\n priority: metadata.priority ?? 0,\n});\n\nexport const byContributionPriority = (left: RegisteredContributionMetadata, right: RegisteredContributionMetadata) =>\n right.priority - left.priority || left.ownerId.localeCompare(right.ownerId);\n","import type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n RegisteredWidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchTabRetention,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\n// Without a `defaultTabRetention` the retention of an existing placement is left alone,\n// so updating a panel's title never promotes a preview tab.\nexport const toOpenWidgetInput = (\n input: OpenWorkbenchPanelInput = {},\n defaultTabRetention?: WorkbenchTabRetention,\n): OpenWidgetInput => {\n const { strategy, ...shared } = input;\n const normalized = shared.resource && shared.viewId === undefined ? { ...shared, viewId: null } : shared;\n if (!strategy) return { ...normalized, tabRetention: defaultTabRetention };\n if (strategy.kind === \"persistent\") {\n return { ...normalized, tabPosition: strategy.position, tabRetention: \"persistent\" };\n }\n if (strategy.kind === \"replace-active\") return { ...normalized, replaceActive: true };\n if (strategy.kind === \"replace-panel\") {\n return { ...normalized, replaceWidgetId: strategy.instanceId, tabRetention: strategy.retention };\n }\n return { ...normalized, tabRetention: \"preview\", tabPosition: strategy.position };\n};\n\nexport const toPanelInstance = (placement: WorkbenchWidgetPlacement): WorkbenchPanelInstance => ({\n instanceId: placement.widgetId,\n panelId: placement.contributionId,\n placementIdentity: placement.placementIdentity,\n viewId: placement.viewId,\n ownerId: placement.ownerId,\n source: placement.source,\n resource: placement.resource,\n section: placement.section,\n resourceKey: placement.resourceKey,\n ownerResourceKey: placement.ownerResourceKey,\n title: placement.title,\n pinned: placement.pinned,\n closable: placement.closable === true,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n tabRetention: placement.tabRetention,\n tab: placement.tab,\n});\n\nexport const toPanelContribution = (widget: RegisteredWidgetContribution): WorkbenchPanelContribution => {\n const { closable: _closable, ownedPanelMenuIds: _ownedPanelMenuIds, ...panel } = widget;\n return panel;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\nimport type { WorkbenchModeActivationContext, WorkbenchModeContribution } from \"./mode-registry\";\n\nconst modePanelRegions = {\n main: [\"main-header\", \"main-left-menu\", \"main\", \"main-right-menu\"],\n secondary: [\"secondary-header\", \"secondary-left-menu\", \"secondary\", \"secondary-right-menu\"],\n side: [\"side-header\", \"side-left-menu\", \"side\", \"side-right-menu\"],\n} as const satisfies Record<WorkbenchPanelRegion, readonly WorkbenchRegion[]>;\n\nconst allModeRegions = Object.values(modePanelRegions).flat();\n\nexport const panelsForMode = (mode: WorkbenchModeContribution) => mode.panels ?? workbenchPanelRegions;\n\nexport const getWorkbenchModePanelForRegion = (region: WorkbenchRegion) =>\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).find((panel) =>\n modePanelRegions[panel].some((candidate) => candidate === region),\n );\n\nexport const isWorkbenchModePanelAvailable = (\n mode: WorkbenchModeContribution | undefined,\n panel: WorkbenchPanelRegion,\n) => !mode || panelsForMode(mode).includes(panel);\n\nconst placementById = (layout: WorkbenchLayout, widgetId: string | undefined) => {\n if (!widgetId) return undefined;\n return Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === widgetId);\n};\n\nconst withActivePlacement = (\n layout: WorkbenchLayout,\n candidates: readonly (WorkbenchWidgetPlacement | undefined)[],\n) => {\n const active = candidates.find((placement) => placement && placementById(layout, placement.widgetId));\n return {\n ...layout,\n activeWidgetId: active?.widgetId,\n activeResourceKey: active?.resourceKey,\n };\n};\n\nconst clearRegions = (layout: WorkbenchLayout, regionIds: readonly WorkbenchRegion[]) => {\n if (regionIds.length === 0) return layout;\n const clearedPanels = new Set(\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).filter((panel) =>\n modePanelRegions[panel].some((region) => regionIds.includes(region)),\n ),\n );\n const regionsNeedClearing = regionIds.some((regionId) => {\n const region = layout.regions[regionId];\n return region.widgets.length > 0 || region.activeWidgetId !== undefined || region.visible;\n });\n const selectionsNeedClearing = Object.values(layout.locationSubPanelSelections ?? {}).some((selections) =>\n Object.keys(selections).some((panel) => clearedPanels.has(panel as WorkbenchPanelRegion)),\n );\n if (!regionsNeedClearing && !selectionsNeedClearing) return layout;\n\n const regions = { ...layout.regions };\n for (const regionId of regionIds) {\n regions[regionId] = { ...regions[regionId], widgets: [], activeWidgetId: undefined, visible: false };\n }\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections ?? {}).map(([resourceKey, selections]) => [\n resourceKey,\n Object.fromEntries(\n Object.entries(selections).filter(([panel]) => !clearedPanels.has(panel as WorkbenchPanelRegion)),\n ),\n ]),\n );\n const next = { ...layout, regions };\n return {\n ...withActivePlacement(next, [placementById(next, layout.activeWidgetId)]),\n activeLocationWidgetId: placementById(next, layout.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections,\n };\n};\n\nexport const applyModePanelAvailability = (layout: WorkbenchLayout, panels: readonly WorkbenchPanelRegion[]) => {\n const available = new Set(panels);\n const unavailableRegions = (Object.keys(modePanelRegions) as WorkbenchPanelRegion[])\n .filter((panel) => !available.has(panel))\n .flatMap((panel) => modePanelRegions[panel]);\n return clearRegions(layout, unavailableRegions);\n};\n\nexport const restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n) => {\n if (!saved) {\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) {\n const region = regions[regionId];\n const widgets = region.widgets.filter((placement) => placement.role !== \"content\");\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n const withoutModeContent = { ...current, regions };\n return applyModePanelAvailability(\n {\n ...withActivePlacement(withoutModeContent, [placementById(withoutModeContent, current.activeWidgetId)]),\n activeLocationWidgetId: placementById(withoutModeContent, current.activeLocationWidgetId)?.widgetId,\n },\n panels,\n );\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, regions }, panels);\n const savedActive = placementById(merged, saved.activeWidgetId);\n const currentActive = placementById(merged, current.activeWidgetId);\n return {\n ...withActivePlacement(merged, [savedActive, currentActive]),\n activeLocationWidgetId:\n placementById(merged, saved.activeLocationWidgetId)?.widgetId ??\n placementById(merged, current.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections: saved.locationSubPanelSelections,\n };\n};\n\nexport const disposeReverse = (disposables: readonly Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n runWorkbenchEffect(\"mode disposal\", () => disposables[index]?.dispose());\n }\n};\n\nexport const restoreModeLayout = (context: WorkbenchModeActivationContext, layout: WorkbenchLayout) => {\n if (layout !== context.layout.getLayout()) context.layout.restoreLayout(layout);\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 { CommandRegistry } from \"../commands/command-registry\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\n\nexport interface Keybinding {\n /** Action the chord executes through the shared navigation executor. */\n action: NavigationTarget;\n keybinding: KeybindingSequence;\n when?: string;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n /** Chords bound to plain command actions, for rendering shortcut hints beside commands. */\n listCommandKeybindings(): { commandId: string; keybinding: KeybindingSequence }[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (keybinding.action.kind === \"command\" && !deps.commands.getCommand(keybinding.action.commandId)) {\n throw new Error(`Keybinding command not registered: ${keybinding.action.commandId}`);\n }\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n\n listCommandKeybindings() {\n return [...store.getState().keybindings]\n .sort(byContributionPriority)\n .flatMap((record) =>\n record.action.kind === \"command\"\n ? [{ commandId: record.action.commandId, keybinding: record.keybinding }]\n : [],\n );\n },\n };\n};\n","import { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\n// The surface map describes the *behavioural* role of each workbench region: which\n// regions host a resource (anchors), which render an anchor's resource (projections),\n// and which are frame chrome or the transient overlay layer. The project scope root is\n// not a surface; it is handled by the layout persistence scope.\n\n// Logical anchor identity, independent of the region id that currently hosts it.\nexport type AnchorId = \"primary\" | \"secondary\" | \"attached\";\n\n// Does an anchor's active selection survive a primary change?\n// - primary: the subject itself.\n// - derived: re-scopes/clears on primary change (terminals follow the workspace).\n// - detached: persists across primary navigation, but disconnects when the new\n// primary's scoped candidates no longer list it (scope wins).\nexport type AnchorPersistence = \"primary\" | \"derived\" | \"detached\";\n\n// What the anchor's quick-pick offers: everything, or filtered by primary.\nexport type AnchorCandidates = \"global\" | \"scoped\";\n\n// Which anchor(s) a projection renders.\nexport type AnchorReadId = AnchorId;\n\nexport interface AnchorSurface {\n role: \"anchor\";\n anchor: AnchorId;\n persistence: AnchorPersistence;\n candidates: AnchorCandidates;\n}\n\nexport interface ProjectionSurface {\n role: \"projection\";\n reads: AnchorReadId[];\n // The sidenav navigator both reads primary (highlight) and selects it (the picker).\n navigator?: boolean;\n}\n\nexport interface ChromeSurface {\n role: \"chrome\";\n}\n\nexport interface TransientSurface {\n role: \"transient\";\n}\n\nexport type SurfaceDescriptor = AnchorSurface | ProjectionSurface | ChromeSurface | TransientSurface;\n\nconst anchor = (anchor: AnchorId, persistence: AnchorPersistence, candidates: AnchorCandidates): AnchorSurface => ({\n role: \"anchor\",\n anchor,\n persistence,\n candidates,\n});\n\nconst projection = (reads: AnchorReadId[], navigator = false): ProjectionSurface =>\n navigator ? { role: \"projection\", reads, navigator } : { role: \"projection\", reads };\n\nconst chrome: ChromeSurface = { role: \"chrome\" };\nconst transient: TransientSurface = { role: \"transient\" };\n\nexport const surfaceMap: Record<WorkbenchRegion, SurfaceDescriptor> = {\n // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it\n // reads both anchors — it is a projection, not inert chrome.\n nav: projection([\"primary\", \"attached\"]),\n activity: chrome,\n sidenav: projection([\"primary\"], true),\n \"main-header\": projection([\"primary\"]),\n \"main-left-menu\": projection([\"primary\"]),\n main: anchor(\"primary\", \"primary\", \"global\"),\n \"main-right-menu\": projection([\"primary\"]),\n \"secondary-header\": projection([\"primary\"]),\n \"secondary-left-menu\": projection([\"secondary\"]),\n secondary: anchor(\"secondary\", \"derived\", \"scoped\"),\n \"secondary-right-menu\": projection([\"secondary\"]),\n status: projection([\"primary\", \"attached\"]),\n overlay: transient,\n \"side-header\": projection([\"attached\"]),\n \"side-left-menu\": projection([\"attached\"]),\n side: anchor(\"attached\", \"detached\", \"scoped\"),\n \"side-right-menu\": projection([\"attached\"]),\n};\n\nexport const getSurface = (region: WorkbenchRegion) => surfaceMap[region];\n\nexport const listAnchorRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"anchor\");\n\nexport const listProjectionRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"projection\");\n\nexport const listProjectionsReading = (anchorId: AnchorReadId) =>\n workbenchRegions.filter((region) => {\n const surface = surfaceMap[region];\n return surface.role === \"projection\" && surface.reads.includes(anchorId);\n });\n\n// Reverse lookup: which region currently hosts a given logical anchor.\nexport const resolveAnchorRegion = (anchorId: AnchorId) => {\n const region = workbenchRegions.find((candidate) => {\n const surface = surfaceMap[candidate];\n return surface.role === \"anchor\" && surface.anchor === anchorId;\n });\n if (!region) throw new Error(`No region hosts anchor: ${anchorId}`);\n return region;\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActivePlacement } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\nimport { type AnchorId, getSurface, listAnchorRegions, resolveAnchorRegion } from \"./surface-map\";\n\n// The resource an anchor currently hosts, read from its region's active placement. This\n// is the primary-scoped signal the coordinator keys off — `getAnchorResource(layout,\n// \"primary\")` is the main resource, free of the global active-resource pollution that\n// any side-region activation otherwise introduces.\nexport const getAnchorResource = (layout: WorkbenchLayout, anchorId: AnchorId) =>\n getActivePlacement(layout.regions[resolveAnchorRegion(anchorId)])?.resource;\n\n// What the coordinator should do with a secondary anchor when the primary resource\n// changes. Projections re-render off their anchor (a render concern), so the reconciler\n// only decides the lifecycle of the derived/detached anchor placements.\nexport type AnchorReconcileAction = { region: WorkbenchRegion; action: \"keep\" | \"clear\" };\n\nexport interface ReconcileAnchorsInput {\n layout: WorkbenchLayout;\n primary: ResourceRef | undefined;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scoped candidates. Backed by scoped resource providers once wired.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// On a primary change: derived anchors re-scope (clear, then repopulate from the new\n// scope); detached anchors stay while their resource is still in scope, else disconnect\n// (scope wins). The primary anchor is the subject and is never reconciled.\nexport const reconcileAnchors = ({ layout, primary, isInScope }: ReconcileAnchorsInput): AnchorReconcileAction[] => {\n const actions: AnchorReconcileAction[] = [];\n\n for (const region of listAnchorRegions()) {\n const surface = getSurface(region);\n if (surface.role !== \"anchor\" || surface.persistence === \"primary\") continue;\n\n // Only resource-bearing anchor placements are scoped content. A plain (resourceless)\n // widget parked in a side anchor is not a scoped resource and is left untouched.\n const placement = getActivePlacement(layout.regions[region]);\n if (!placement?.resource) continue;\n\n // Sub Panels are subordinate to their Location workspace. A Location switch\n // changes which placement is selected and rendered; it must not delete the\n // placements retained for the Location that is leaving the foreground.\n if (placement.role === \"sub-panel\" && placement.ownerResourceKey) {\n actions.push({ region, action: \"keep\" });\n continue;\n }\n\n if (surface.persistence === \"derived\") {\n actions.push({ region, action: \"clear\" });\n continue;\n }\n\n actions.push({ region, action: isInScope(placement.resource, primary) ? \"keep\" : \"clear\" });\n }\n\n return actions;\n};\n","export const standardResourceIcons = {\n project: \"folder-root\",\n workspace: \"computer\",\n worktree: \"git-pull-request-draft\",\n settings: \"settings\",\n kanbanRenderer: \"table-properties\",\n} as const;\n\nexport type StandardResourceIcon = (typeof standardResourceIcons)[keyof typeof standardResourceIcons];\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"./resource-registry\";\nexport interface WorkbenchViewHierarchyNode {\n type: \"view\";\n viewId: string;\n label?: string;\n icon?: string;\n}\nexport type WorkbenchHierarchyNode = ResourceRef | WorkbenchViewHierarchyNode;\nexport const isWorkbenchViewHierarchyNode = (node: WorkbenchHierarchyNode): node is WorkbenchViewHierarchyNode =>\n \"viewId\" in node && node.type === \"view\";\n// Hierarchy comes from resource identity: providers resolve a resource's parent,\n// and the walk below turns those edges into the root-to-leaf breadcrumb path.\nexport interface ResourceHierarchyProvider {\n id: string;\n priority?: number;\n canResolve(resource: ResourceRef): boolean;\n getParent(resource: ResourceRef): WorkbenchHierarchyNode | undefined;\n}\nexport type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;\nexport const resourceHierarchyCycleCode = \"resource_hierarchy_cycle\";\n// Emitted when parent resolution repeats a resource URI. Traversal keeps the\n// acyclic root-to-leaf prefix, so consumers such as breadcrumbs stay usable\n// while the faulty provider is diagnosed.\nexport interface ResourceHierarchyCycle {\n code: typeof resourceHierarchyCycleCode;\n path: WorkbenchHierarchyNode[];\n repeatedUri: string;\n}\nexport const sortHierarchyProviders = (providers: ResolvedResourceHierarchyProvider[]) =>\n [...providers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\nexport const walkResourceHierarchy = (\n providers: ResolvedResourceHierarchyProvider[],\n resource: ResourceRef,\n notifyCycle: (cycle: ResourceHierarchyCycle) => void,\n) => {\n const sorted = sortHierarchyProviders(providers);\n const path: WorkbenchHierarchyNode[] = [resource];\n const visitedKeys = new Set([`resource:${resourceKey(resource)}`]);\n let current = resource;\n while (true) {\n const provider = sorted.find((candidate) => candidate.canResolve(current));\n const parent = provider?.getParent(current);\n if (!parent) break;\n const parentKey = isWorkbenchViewHierarchyNode(parent)\n ? `view:${parent.viewId}`\n : `resource:${resourceKey(parent)}`;\n if (visitedKeys.has(parentKey)) {\n // A repeated URI means the providers formed a cycle. Keep the acyclic\n // prefix and surface the fault instead of looping or dropping the path.\n notifyCycle({\n code: resourceHierarchyCycleCode,\n path: [...path],\n repeatedUri: isWorkbenchViewHierarchyNode(parent) ? parentKey : resourceKey(parent),\n });\n break;\n }\n path.unshift(parent);\n visitedKeys.add(parentKey);\n if (isWorkbenchViewHierarchyNode(parent)) break;\n current = parent;\n }\n return path;\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\n\nexport type { ResourceRef } from \"@pstdio/sdk/extensions\";\n\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n isWorkbenchViewHierarchyNode,\n type ResolvedResourceHierarchyProvider,\n type ResourceHierarchyCycle,\n type ResourceHierarchyProvider,\n sortHierarchyProviders,\n type WorkbenchHierarchyNode,\n walkResourceHierarchy,\n} from \"./resource-hierarchy\";\n\nexport type {\n ResolvedResourceHierarchyProvider,\n ResourceHierarchyCycle,\n ResourceHierarchyProvider,\n WorkbenchHierarchyNode,\n WorkbenchViewHierarchyNode,\n} from \"./resource-hierarchy\";\nexport { isWorkbenchViewHierarchyNode, resourceHierarchyCycleCode } from \"./resource-hierarchy\";\n\nexport const workbenchResourceTypeContextKey = \"workbench.resource.type\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceKeyMetadataKey = \"workbench.selectionResourceKey\";\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceTypeContextKey]: resource.type,\n [workbenchResourceIdContextKey]: resource.id,\n };\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n return values;\n};\nexport const createWorkbenchSelectionResourceMetadata = (resource: ResourceRef) => ({\n [workbenchSelectionResourceKeyMetadataKey]: resourceKey(resource),\n});\nexport const getWorkbenchSelectionResourceKeys = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n const selectionResourceKey = resource.metadata?.[workbenchSelectionResourceKeyMetadataKey];\n if (typeof selectionResourceKey !== \"string\" || selectionResourceKey === resourceKey(resource))\n return [resourceKey(resource)];\n return [resourceKey(resource), selectionResourceKey];\n};\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n}\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n providers: Record<string, ResourceProvider>;\n hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;\n}\nexport interface ResourceRegistry {\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n listKinds(): RegisteredResourceKind[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable;\n listHierarchyProviders(): ResolvedResourceHierarchyProvider[];\n walkHierarchy(resource: ResourceRef | undefined): WorkbenchHierarchyNode[];\n onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable;\n}\nexport interface CreateResourceRegistryInput {\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n resolveView?: (viewId: string) =>\n | {\n label?: string;\n icon?: string;\n }\n | undefined;\n}\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const cycleListeners = new Set<(cycle: ResourceHierarchyCycle) => void>();\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, providers: {}, hierarchyProviders: {} },\n });\n return {\n store,\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n if (snapshot.kinds[kind.kind]) throw new Error(`Resource kind already registered: ${kind.kind}`);\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\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 listProviders() {\n return Object.values(store.getState().providers);\n },\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n registerHierarchyProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.hierarchyProviders[provider.id]) {\n throw new Error(`Resource hierarchy provider already registered: ${provider.id}`);\n }\n const record: ResolvedResourceHierarchyProvider = { ...provider, priority: provider.priority ?? 0 };\n store.setState(\n {\n ...snapshot,\n hierarchyProviders: { ...snapshot.hierarchyProviders, [provider.id]: record },\n },\n false,\n \"registerHierarchyProvider\",\n );\n return createDisposable(() => {\n const current = store.getState();\n if (current.hierarchyProviders[provider.id] !== record) return;\n const { [provider.id]: _removed, ...rest } = current.hierarchyProviders;\n store.setState({ ...current, hierarchyProviders: rest }, false, \"unregisterHierarchyProvider\");\n });\n },\n listHierarchyProviders() {\n return sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n },\n walkHierarchy(resource) {\n if (!resource) return [];\n const path = walkResourceHierarchy(Object.values(store.getState().hierarchyProviders), resource, (cycle) => {\n for (const listener of cycleListeners) listener(cycle);\n });\n return path.map((node) => {\n if (!isWorkbenchViewHierarchyNode(node)) return node;\n const view = input.resolveView?.(node.viewId);\n return view ? { ...node, label: view.label, icon: view.icon } : node;\n });\n },\n onDidDetectHierarchyCycle(listener) {\n cycleListeners.add(listener);\n return createDisposable(() => {\n cycleListeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../store/workbench-store\";\n\nexport type ContextKeyValue = boolean | number | string | undefined;\n\nexport interface ContextKeyStoreState {\n values: Record<string, ContextKeyValue>;\n}\n\nexport interface ContextKeyScope extends Disposable {\n ownerId: string;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n}\n\nexport interface ContextKeyService {\n store: WorkbenchStore<ContextKeyStoreState>;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n createScope(ownerId: string): ContextKeyScope;\n deleteOwner(ownerId: string): void;\n snapshot(): Record<string, ContextKeyValue>;\n matches(expression?: string): boolean;\n}\n\nconst readComparisonValue = (value: string) => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst matchesTerm = (values: Record<string, ContextKeyValue>, term: string) => {\n const trimmed = term.trim();\n if (trimmed.length === 0) return true;\n\n const comparison = trimmed.match(/^([A-Za-z0-9_.-]+)\\s*(==|!=)\\s*(.+)$/);\n if (comparison) {\n const [, key, operator, rawValue] = comparison;\n const actual = values[key ?? \"\"];\n const expected = readComparisonValue(rawValue ?? \"\");\n return operator === \"==\" ? String(actual) === expected : String(actual) !== expected;\n }\n\n if (trimmed.startsWith(\"!\")) return !values[trimmed.slice(1)];\n\n return Boolean(values[trimmed]);\n};\n\nexport const matchesContextExpression = (values: Record<string, ContextKeyValue>, expression?: string) => {\n if (!expression) return true;\n return expression.split(\"||\").some((orClause) => orClause.split(\"&&\").every((term) => matchesTerm(values, term)));\n};\n\nexport const createContextKeyService = (): ContextKeyService => {\n const store = createWorkbenchStore<ContextKeyStoreState>({\n name: \"workbench.context\",\n initialState: { values: {} },\n });\n\n let globalValues: Record<string, ContextKeyValue> = {};\n const ownerValues = new Map<string, Record<string, ContextKeyValue>>();\n\n const buildValues = () => {\n const values = { ...globalValues };\n for (const scopedValues of ownerValues.values()) Object.assign(values, scopedValues);\n return values;\n };\n\n const publish = (action: string) => {\n store.setState({ values: buildValues() }, false, action);\n };\n\n return {\n store,\n\n set(key, value) {\n if (globalValues[key] === value) return;\n globalValues = { ...globalValues, [key]: value };\n publish(\"setContextKey\");\n },\n\n get(key) {\n return store.getState().values[key];\n },\n\n delete(key) {\n if (!(key in globalValues)) return;\n const { [key]: _removed, ...rest } = globalValues;\n globalValues = rest;\n publish(\"deleteContextKey\");\n },\n\n createScope(ownerId) {\n ownerValues.set(ownerId, ownerValues.get(ownerId) ?? {});\n let disposed = false;\n\n const assertActive = () => {\n if (disposed) throw new Error(`Context key scope disposed: ${ownerId}`);\n };\n\n return {\n ownerId,\n\n set(key, value) {\n assertActive();\n const values = ownerValues.get(ownerId) ?? {};\n if (values[key] === value) return;\n ownerValues.set(ownerId, { ...values, [key]: value });\n publish(\"setScopedContextKey\");\n },\n\n get(key) {\n assertActive();\n return ownerValues.get(ownerId)?.[key];\n },\n\n delete(key) {\n assertActive();\n const values = ownerValues.get(ownerId);\n if (!values || !(key in values)) return;\n const { [key]: _removed, ...rest } = values;\n ownerValues.set(ownerId, rest);\n publish(\"deleteScopedContextKey\");\n },\n\n dispose() {\n if (disposed) return;\n disposed = true;\n if (!ownerValues.delete(ownerId)) return;\n publish(\"disposeContextKeyScope\");\n },\n };\n },\n\n deleteOwner(ownerId) {\n if (!ownerValues.delete(ownerId)) return;\n publish(\"deleteContextKeyOwner\");\n },\n\n snapshot() {\n return { ...store.getState().values };\n },\n\n matches(expression) {\n return matchesContextExpression(store.getState().values, expression);\n },\n };\n};\n","import type { WorkbenchCore, WorkbenchRenderers } from \"./workbench-core-types\";\n\nconst renderersByWorkbench = new WeakMap<WorkbenchCore, WorkbenchRenderers>();\n\nexport const setWorkbenchRenderers = (workbench: WorkbenchCore, renderers: WorkbenchRenderers) => {\n renderersByWorkbench.set(workbench, renderers);\n};\n\nexport const getWorkbenchRenderers = (workbench: WorkbenchCore) => {\n const renderers = renderersByWorkbench.get(workbench);\n if (!renderers) throw new Error(\"Workbench renderers are not initialized\");\n return renderers;\n};\n"],"names":["createDisposable","onDispose","disposed","dispose","runWorkbenchEffect","owner","effect","error","console","depth","pending","Map","notifyWorkbenchChange","notify","has","set","batchWorkbenchChanges","commit","size","entries","next","value","delete","defaultEquality","left","right","Object","is","createWorkbenchStore","input","api","createStore","devtools","initialState","name","subscribe","listener","_state","previous","getState","subscribeSelector","selector","options","equalityFn","previousValue","fireImmediately","state","nextValue","getInitialState","setState","resolveUniqueWidgetId","widgetIds","contributionId","preferredId","suffix","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","main","secondary","side","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","createRegion","regions","nav","activity","sidenav","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","Set","activeWidgetId","activeResourceKey","originalActiveWidgetId","activeIndex","map","placement","add","normalizedActiveWidgetId","resourceKey","mergeWithDefaultRegions","persisted","defaults","persistedRegions","fromEntries","flatMap","findPlacement","values","findIndex","candidate","regionId","findResourcePlacement","findPlacementByWidgetId","createUniqueWidgetId","getActivePlacement","find","isLocationPlacement","role","locationWorkspaceKey","setLocationSubPanelSelection","location","key","locationSubPanelSelections","current","removeLocationSubPanelSelection","selections","filter","selectedId","getActiveLocationPlacement","locations","activeLocationWidgetId","at","buildUpdatedPlacement","widget","update","viewId","undefined","resource","title","label","pinned","closable","mountStrategy","hiddenByDefault","tabRetention","tab","ownerId","source","createPlacement","spec","singleton","replaceRegionWidgets","clearActiveWidget","some","removePlacementsForContribution","nextLayout","removed","filtered","hasActiveWidget","startsWith","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","ownerResourceKey","nextRegion","includes","closedPlacement","activePlacement","activateInLayout","panel","panelRegion","selected","withSelection","selectRegionActiveWidget","Error","followsRegion","supportsResource","resourceKinds","type","canOpen","getActiveWorkbenchSubPanel","ignoreOwnerResourceKey","getActiveWorkbenchLocationPanel","matchesLocationEligibility","modeId","eligibleLocations","matchesWorkbenchModeEligibility","resourceIds","canOpenLocation","eligibleModeIds","modeIds","isWorkbenchPanelPlacementVisible","ignoreResourceLocation","matchesWorkbenchPanelMenuOwner","context","panelMenuOwner","level","subPanel","locationPanel","defaultContributionOwnerId","normalizeContributionMetadata","metadata","priority","byContributionPriority","localeCompare","toOpenWidgetInput","defaultTabRetention","strategy","shared","normalized","kind","tabPosition","position","replaceActive","replaceWidgetId","instanceId","retention","toPanelInstance","panelId","placementIdentity","section","toPanelContribution","_closable","ownedPanelMenuIds","_ownedPanelMenuIds","modePanelRegions","allModeRegions","flat","panelsForMode","mode","panels","getWorkbenchModePanelForRegion","keys","isWorkbenchModePanelAvailable","placementById","withActivePlacement","candidates","active","clearRegions","regionIds","clearedPanels","regionsNeedClearing","selectionsNeedClearing","applyModePanelAvailability","available","unavailableRegions","restoreUnscopedModeLayout","saved","withoutModeContent","merged","savedActive","currentActive","disposeReverse","disposables","restoreModeLayout","getLayout","restoreLayout","getKeybindingSteps","keybinding","Array","isArray","trim","split","Boolean","normalizeKeybindingSequence","steps","createKeybindingRegistry","deps","store","keybindings","registerKeybinding","action","commands","getCommand","commandId","record","snapshot","listKeybindings","sort","listActiveKeybindings","matches","when","listCommandKeybindings","anchor","persistence","projection","reads","navigator","chrome","transient","surfaceMap","getSurface","listAnchorRegions","resolveAnchorRegion","anchorId","surface","getAnchorResource","reconcileAnchors","primary","isInScope","actions","push","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","isWorkbenchViewHierarchyNode","node","resourceHierarchyCycleCode","sortHierarchyProviders","providers","walkResourceHierarchy","notifyCycle","sorted","path","visitedKeys","parent","canResolve","getParent","parentKey","code","repeatedUri","unshift","workbenchResourceTypeContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceKeyMetadataKey","isContextPrimitive","createWorkbenchResourceContextValues","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceKeys","selectionResourceKey","createResourceRegistry","cycleListeners","kinds","hierarchyProviders","registerKind","_removed","rest","getKind","listKinds","registerProvider","provider","listProviders","listResources","query","getPrimary","list","registerHierarchyProvider","listHierarchyProviders","walkHierarchy","cycle","view","resolveView","icon","onDidDetectHierarchyCycle","readComparisonValue","replace","matchesTerm","term","trimmed","comparison","match","operator","rawValue","actual","expected","String","slice","matchesContextExpression","expression","orClause","every","createContextKeyService","globalValues","ownerValues","buildValues","scopedValues","assign","publish","get","createScope","assertActive","deleteOwner","renderersByWorkbench","WeakMap","setWorkbenchRenderers","workbench","renderers","getWorkbenchRenderers"],"mappings":"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"}