@pstdio/workbench 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-built-ins-BCJ6-fIM.js","sources":["../src/core/shared/contributions/metadata.ts","../src/core/shared/store/workbench-store.ts","../src/core/registries/resources/resource-registry.ts","../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/panel-widget-eligibility.ts","../src/core/registries/layout/panel-api.ts","../src/core/registries/modes/mode-registry.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/layout/surface-reconcile.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/resources/resource-icons.ts","../src/core/shared/context/context-key-service.ts","../src/core/workbench-built-ins.ts"],"sourcesContent":["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 { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return api.subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe: api.subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","import type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchPanelInstance } from \"../layout/layout-types\";\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 interface ResourceRef {\n kind: string;\n uri: string;\n id?: string;\n label?: string;\n icon?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport const workbenchResourceKindContextKey = \"workbench.resource.kind\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceUriMetadataKey = \"workbench.selectionResourceUri\";\n\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceKindContextKey]: resource.kind,\n [workbenchResourceIdContextKey]: resource.id ?? resource.uri,\n };\n\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n\n return values;\n};\n\nexport const createWorkbenchSelectionResourceMetadata = (resource: Pick<ResourceRef, \"uri\">) => ({\n [workbenchSelectionResourceUriMetadataKey]: resource.uri,\n});\n\nexport const getWorkbenchSelectionResourceUris = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n\n const selectionResourceUri = resource.metadata?.[workbenchSelectionResourceUriMetadataKey];\n if (typeof selectionResourceUri !== \"string\" || selectionResourceUri === resource.uri) return [resource.uri];\n\n return [resource.uri, selectionResourceUri];\n};\n\nexport interface OpenResourceInput {\n replaceActive?: boolean;\n}\n\n// The anchor a resource kind routes to. `primary` is the main subject; `secondary` and\n// `attached` are the side anchors (derived terminals, detached sessions). Independent of\n// the region id that currently hosts each anchor.\nexport type ResourceSurface = \"primary\" | \"secondary\" | \"attached\";\n\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n surface?: ResourceSurface;\n paletteOpenInput?: OpenResourceInput;\n}\n\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\n\nexport interface ResourcePresenter {\n id: string;\n priority?: number;\n canOpen(resource: ResourceRef): boolean;\n open(resource: ResourceRef, input: OpenResourceInput): WorkbenchPanelInstance | Promise<WorkbenchPanelInstance>;\n afterOpen?(resource: ResourceRef, instance: WorkbenchPanelInstance, input: OpenResourceInput): void;\n}\n\ntype ResolvedResourcePresenter = Omit<ResourcePresenter, \"priority\"> & { priority: number };\n\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\n\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\n\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n presenters: Record<string, ResolvedResourcePresenter>;\n providers: Record<string, ResourceProvider>;\n hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;\n}\n\nexport interface ResourceRegistry {\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n // The anchor a resource routes to, declared by its kind (undefined → not surface-routed).\n getSurface(resource: ResourceRef): ResourceSurface | undefined;\n listKinds(): RegisteredResourceKind[];\n registerPresenter(presenter: ResourcePresenter): Disposable;\n listPresenters(): ResolvedResourcePresenter[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable;\n listHierarchyProviders(): ResolvedResourceHierarchyProvider[];\n walkHierarchy(resource: ResourceRef | undefined): WorkbenchHierarchyNode[];\n onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable;\n isOpeningResource(): boolean;\n openResource(resource: ResourceRef, input?: OpenResourceInput): Promise<WorkbenchPanelInstance>;\n onDidOpenResource(listener: (resource: ResourceRef) => void): Disposable;\n}\n\nconst sortPresenters = (presenters: ResolvedResourcePresenter[]) =>\n [...presenters].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\n\nconst isPromiseLike = (value: unknown): value is PromiseLike<unknown> =>\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\";\n\nexport interface CreateResourceRegistryInput {\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n establishLocation?: (instance: WorkbenchPanelInstance) => WorkbenchPanelInstance;\n resolveView?: (viewId: string) => { label?: string; icon?: string } | undefined;\n}\n\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const openListeners = new Set<(resource: ResourceRef) => void>();\n const cycleListeners = new Set<(cycle: ResourceHierarchyCycle) => void>();\n const establishLocation = input.establishLocation;\n let openingResourceDepth = 0;\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, presenters: {}, providers: {}, hierarchyProviders: {} },\n });\n\n return {\n store,\n\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n if (snapshot.kinds[kind.kind]) throw new Error(`Resource kind already registered: ${kind.kind}`);\n\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n\n getSurface(resource) {\n return store.getState().kinds[resource.kind]?.surface;\n },\n\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n\n registerPresenter(presenter) {\n const snapshot = store.getState();\n if (snapshot.presenters[presenter.id]) throw new Error(`Resource presenter already registered: ${presenter.id}`);\n\n const record: ResolvedResourcePresenter = { ...presenter, priority: presenter.priority ?? 0 };\n store.setState(\n { ...snapshot, presenters: { ...snapshot.presenters, [presenter.id]: record } },\n false,\n \"registerPresenter\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.presenters[presenter.id] !== record) return;\n const { [presenter.id]: _removed, ...rest } = current.presenters;\n store.setState({ ...current, presenters: rest }, false, \"unregisterPresenter\");\n });\n },\n\n listPresenters() {\n return sortPresenters(Object.values(store.getState().presenters));\n },\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n\n listProviders() {\n return Object.values(store.getState().providers);\n },\n\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n\n registerHierarchyProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.hierarchyProviders[provider.id]) {\n throw new Error(`Resource hierarchy provider already registered: ${provider.id}`);\n }\n\n const record: ResolvedResourceHierarchyProvider = { ...provider, priority: provider.priority ?? 0 };\n store.setState(\n {\n ...snapshot,\n hierarchyProviders: { ...snapshot.hierarchyProviders, [provider.id]: record },\n },\n false,\n \"registerHierarchyProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.hierarchyProviders[provider.id] !== record) return;\n const { [provider.id]: _removed, ...rest } = current.hierarchyProviders;\n store.setState({ ...current, hierarchyProviders: rest }, false, \"unregisterHierarchyProvider\");\n });\n },\n\n listHierarchyProviders() {\n return sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n },\n\n walkHierarchy(resource) {\n if (!resource) return [];\n\n const 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\n onDidDetectHierarchyCycle(listener) {\n cycleListeners.add(listener);\n return createDisposable(() => {\n cycleListeners.delete(listener);\n });\n },\n\n isOpeningResource() {\n return openingResourceDepth > 0;\n },\n\n async openResource(resource, input = {}) {\n const snapshot = store.getState();\n if (!snapshot.kinds[resource.kind]) throw new Error(`Unknown resource kind: ${resource.kind}`);\n\n const presenter = sortPresenters(Object.values(snapshot.presenters)).find((candidate) =>\n candidate.canOpen(resource),\n );\n if (!presenter) throw new Error(`No presenter registered for resource kind: ${resource.kind}`);\n\n openingResourceDepth += 1;\n let result: WorkbenchPanelInstance;\n try {\n const opened = presenter.open(resource, input);\n result = isPromiseLike(opened) ? ((await opened) as WorkbenchPanelInstance) : opened;\n result = establishLocation?.(result) ?? result;\n presenter.afterOpen?.(resource, result, input);\n } finally {\n openingResourceDepth -= 1;\n }\n for (const listener of openListeners) listener(resource);\n return result;\n },\n\n onDidOpenResource(listener) {\n openListeners.add(listener);\n return createDisposable(() => {\n openListeners.delete(listener);\n });\n },\n };\n};\n","import type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionState,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { workbenchPanelRegions } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceUri: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceUri === resourceUri,\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\n\nexport const createUniqueWidgetId = (layout: WorkbenchLayout, contributionId: string) => {\n const widgetIds = new Set(\n Object.values(layout.regions).flatMap((region) => region.widgets.map((placement) => placement.widgetId)),\n );\n return resolveUniqueWidgetId(widgetIds, contributionId);\n};\n\nexport const getActivePlacement = (region: WorkbenchRegionState) =>\n region.widgets.find((placement) => placement.widgetId === region.activeWidgetId) ?? region.widgets[0];\n\nconst isLocationPlacement = (placement: WorkbenchWidgetPlacement) => placement.role === \"location\";\n\nexport const locationWorkspaceKey = (placement: WorkbenchWidgetPlacement) =>\n placement.resourceUri ?? `${placement.contributionId}:${placement.widgetId}`;\n\nexport const setLocationSubPanelSelection = (\n layout: WorkbenchLayout,\n location: WorkbenchWidgetPlacement | undefined,\n region: WorkbenchPanelRegion,\n widgetId: string | undefined,\n) => {\n if (!location) return layout;\n const key = locationWorkspaceKey(location);\n const current = layout.locationSubPanelSelections?.[key] ?? {};\n const next = { ...current };\n if (widgetId) next[region] = widgetId;\n else delete next[region];\n return {\n ...layout,\n locationSubPanelSelections: {\n ...layout.locationSubPanelSelections,\n [key]: next,\n },\n };\n};\n\nexport const removeLocationSubPanelSelection = (layout: WorkbenchLayout, widgetId: string) => {\n if (!layout.locationSubPanelSelections) return layout;\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections).map(([key, selections]) => [\n key,\n Object.fromEntries(Object.entries(selections).filter(([, selectedId]) => selectedId !== widgetId)),\n ]),\n ) as WorkbenchLayout[\"locationSubPanelSelections\"];\n return { ...layout, locationSubPanelSelections };\n};\n\nexport const getActiveLocationPlacement = (layout: WorkbenchLayout) => {\n const locations = layout.regions.main.widgets.filter(isLocationPlacement);\n return locations.find((placement) => placement.widgetId === layout.activeLocationWidgetId) ?? locations.at(-1);\n};\n\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.viewId !== undefined) next.viewId = update.viewId ?? undefined;\n if (update.resource === null) {\n next.resource = undefined;\n next.resourceUri = undefined;\n next.title = update.title ?? widget.title;\n } else if (update.resource) {\n next.resource = update.resource;\n next.resourceUri = update.resource.uri;\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.tabRetention !== undefined) next.tabRetention = update.tabRetention;\n if (update.tab !== undefined) next.tab = update.tab;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n if (update.role !== undefined) next.role = update.role;\n return next;\n};\n\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n viewId: spec.viewId ?? undefined,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource ?? undefined,\n resourceUri: spec.resource?.uri,\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n tabRetention: spec.tabRetention,\n tab: spec.tab ?? widget.tab,\n role: spec.role ?? \"content\",\n});\n\ninterface ReplaceRegionWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\n\nexport const replaceRegionWidgets = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceRegionWidgetsOptions = {},\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n const widgets = update(region.widgets);\n const activeWidgetId =\n options.activeWidgetId !== undefined\n ? options.activeWidgetId\n : options.clearActiveWidget\n ? undefined\n : region.activeWidgetId;\n\n return {\n ...layout,\n activeLocationWidgetId:\n regionId === \"main\" && !widgets.some((placement) => placement.widgetId === layout.activeLocationWidgetId)\n ? widgets.filter(isLocationPlacement).at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, widgets, activeWidgetId },\n },\n };\n};\n\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter((placement) => placement.contributionId === contributionId);\n const filtered = region.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === region.widgets.length) continue;\n const activeWidgetId =\n region.activeWidgetId && !filtered.some((placement) => placement.widgetId === region.activeWidgetId)\n ? undefined\n : region.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n regions: {\n ...nextLayout.regions,\n [region.id]: { ...region, widgets: filtered, activeWidgetId },\n },\n };\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const hasActiveWidget = Object.values(nextLayout.regions).some((region) =>\n region.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceUri: undefined };\n }\n\n if (\n nextLayout.activeLocationWidgetId &&\n !nextLayout.regions.main.widgets.some((placement) => placement.widgetId === nextLayout.activeLocationWidgetId)\n ) {\n nextLayout = {\n ...nextLayout,\n activeLocationWidgetId: nextLayout.regions.main.widgets.filter(isLocationPlacement).at(-1)?.widgetId,\n };\n }\n\n return nextLayout;\n};\n\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n\n const region = layout.regions[found.regionId];\n const widgets = region.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = region.activeWidgetId === widgetId || (!region.activeWidgetId && found.index === 0);\n const fallbackSubPanel =\n found.placement.role === \"sub-panel\"\n ? widgets.find(\n (placement) =>\n placement.role === \"sub-panel\" && placement.ownerResourceUri === found.placement.ownerResourceUri,\n )\n : undefined;\n const nextActivePlacement =\n fallbackSubPanel ??\n (found.placement.role === \"sub-panel\" && found.regionId === \"main\"\n ? getActiveLocationPlacement(layout)\n : (widgets[found.index] ?? widgets[found.index - 1]));\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : region.activeWidgetId;\n const nextRegion = { ...region, widgets, activeWidgetId };\n let nextLayout: WorkbenchLayout = removeLocationSubPanelSelection(\n {\n ...layout,\n activeLocationWidgetId:\n layout.activeLocationWidgetId === widgetId\n ? layout.regions.main.widgets\n .filter((placement) => placement.widgetId !== widgetId && isLocationPlacement(placement))\n .at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [region.id]: nextRegion,\n },\n },\n widgetId,\n );\n\n if (\n closingEffectiveActive &&\n found.regionId !== \"side\" &&\n workbenchPanelRegions.includes(found.regionId as WorkbenchPanelRegion)\n ) {\n nextLayout = setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n found.regionId as WorkbenchPanelRegion,\n nextActivePlacement?.role === \"sub-panel\" ? nextActivePlacement.widgetId : undefined,\n );\n }\n\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceUri: nextActivePlacement?.resourceUri,\n };\n }\n\n return {\n regionId: found.regionId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextRegion),\n layout: nextLayout,\n };\n};\n\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n if (regionId === \"main\" && isLocationPlacement(placement)) {\n const selections = layout.locationSubPanelSelections?.[locationWorkspaceKey(placement)] ?? {};\n const regions = 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.ownerResourceUri !== placement.resourceUri) return candidate;\n if (candidate.resourceUri !== placement.resourceUri) 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.ownerResourceUri || candidate.ownerResourceUri === placement.resourceUri),\n );\n regions[panelRegion] = {\n ...panel,\n activeWidgetId:\n panelRegion === \"side\"\n ? panel.activeWidgetId\n : (selected?.widgetId ?? (panelRegion === \"main\" ? placement.widgetId : undefined)),\n };\n }\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: placement.widgetId,\n activeResourceUri: placement.resourceUri,\n regions,\n };\n }\n\n const withSelection =\n placement.role === \"sub-panel\" &&\n regionId !== \"side\" &&\n workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n layout,\n getActiveLocationPlacement(layout),\n regionId as WorkbenchPanelRegion,\n placement.widgetId,\n )\n : layout;\n return {\n ...withSelection,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: layout.activeLocationWidgetId,\n activeResourceUri: placement.resourceUri,\n regions: {\n ...withSelection.regions,\n [regionId]: { ...region, activeWidgetId: placement.widgetId },\n },\n };\n};\n\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\n const followsRegion = layout.activeWidgetId === region.activeWidgetId;\n const nextLayout: WorkbenchLayout = {\n ...layout,\n activeWidgetId: followsRegion ? placement?.widgetId : layout.activeWidgetId,\n activeResourceUri: followsRegion ? placement?.resourceUri : layout.activeResourceUri,\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 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.kind))) return false;\n if (widget.canOpen && (!resource || !widget.canOpen(resource))) return false;\n return true;\n};\n\nexport const getActiveWorkbenchSubPanel = (\n layout: WorkbenchLayout,\n region: WorkbenchPanelRegion,\n resource: ResourceRef | undefined,\n options: { ignoreOwnerResourceUri?: boolean } = {},\n) => {\n const panel = layout.regions[region];\n return panel.widgets.find(\n (placement) =>\n placement.widgetId === panel.activeWidgetId &&\n placement.role === \"sub-panel\" &&\n (options.ignoreOwnerResourceUri || !placement.ownerResourceUri || placement.ownerResourceUri === resource?.uri),\n );\n};\n\nexport const getActiveWorkbenchLocationPanel = (layout: WorkbenchLayout) => getActiveLocationPlacement(layout);\n\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.kind))\n ) {\n return false;\n }\n if (\n eligibleLocations?.resourceIds?.length &&\n (!resource?.id || !eligibleLocations.resourceIds.includes(resource.id))\n ) {\n return false;\n }\n if (eligibleLocations?.canOpen && (!resource || !eligibleLocations.canOpen(resource))) return false;\n if (\n eligibleLocations?.canOpenLocation &&\n !eligibleLocations.canOpenLocation({ resource, viewId: location?.viewId })\n ) {\n return false;\n }\n if (placement?.ownerResourceUri && placement.ownerResourceUri !== resource?.uri) return false;\n return true;\n};\n\nexport const matchesWorkbenchModeEligibility = (widget: RegisteredWidgetContribution, modeId: string | undefined) => {\n const eligibleModeIds = widget.eligibleLocations?.modeIds;\n return !eligibleModeIds?.length || (modeId !== undefined && eligibleModeIds.includes(modeId));\n};\n\nexport const isWorkbenchPanelPlacementVisible = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n options: { ignoreResourceLocation?: boolean; location?: WorkbenchWidgetPlacement } = {},\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};\n\nexport const allowsWorkbenchFloatingPanels = (\n layout: WorkbenchLayout,\n widgets: readonly RegisteredWidgetContribution[],\n) => {\n const activeMainPanel =\n layout.regions.main.widgets.find((placement) => placement.widgetId === layout.regions.main.activeWidgetId) ??\n getActiveLocationPlacement(layout);\n if (!activeMainPanel) return true;\n\n return widgets.find((widget) => widget.id === activeMainPanel.contributionId)?.floatingPanels !== \"hidden\";\n};\n\nexport const matchesWorkbenchPanelMenuOwner = (\n widget: RegisteredWidgetContribution,\n context: {\n locationPanel?: WorkbenchWidgetPlacement;\n subPanel?: WorkbenchWidgetPlacement;\n },\n) => {\n const owner = widget.panelMenuOwner ?? { level: \"panel\" };\n if (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","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 viewId: placement.viewId,\n ownerId: placement.ownerId,\n source: placement.source,\n resource: placement.resource,\n resourceUri: placement.resourceUri,\n ownerResourceUri: placement.ownerResourceUri,\n title: placement.title,\n pinned: placement.pinned,\n closable: placement.closable === true,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n tabRetention: placement.tabRetention,\n tab: placement.tab,\n});\n\nexport const toPanelContribution = (widget: RegisteredWidgetContribution): WorkbenchPanelContribution => {\n const { closable: _closable, ownedPanelMenuIds: _ownedPanelMenuIds, ...panel } = widget;\n return panel;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCoreContributionContext } from \"../../workbench-core\";\nimport {\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport type WorkbenchModeActivationContext = WorkbenchCoreContributionContext;\n\nexport type WorkbenchModeActivationResult = Disposable | readonly Disposable[] | undefined;\n\nexport interface WorkbenchModeAddablePanel {\n panelId: string;\n region: WorkbenchPanelRegion;\n allowedRegions?: readonly WorkbenchRegion[];\n pinned?: boolean;\n}\n\nexport interface WorkbenchModeAddablePanelContext {\n layout: WorkbenchLayout;\n resource?: ResourceRef;\n}\n\nexport interface WorkbenchModeContribution {\n id: string;\n label?: string;\n panels?: readonly WorkbenchPanelRegion[];\n // Resource kinds this mode accepts. The atomic navigator validates targets\n // against this list; a mode without kinds navigates with a cleared resource.\n resourceKinds?: readonly string[];\n // Fallback resource when the mode is entered without a compatible resource.\n defaultResource?: ResourceRef | (() => Promise<ResourceRef | undefined> | ResourceRef | undefined);\n // Returns optional composition panels that are closed in the current context.\n listAddablePanels?(context: WorkbenchModeAddablePanelContext): readonly WorkbenchModeAddablePanel[];\n // Registers the mode's contributions once for the lifetime of the mode.\n activate(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n // Seeds default placements only when the persistence scope has no layout yet.\n seed?(ctx: WorkbenchModeActivationContext): void;\n // Activates non-layout behavior while the mode is current.\n enter?(ctx: WorkbenchModeActivationContext): WorkbenchModeActivationResult;\n // Repairs required layout structure whenever the mode-scope context activates:\n // first activation, reselecting the active mode, and persistence-scope changes.\n // Reconciliation must not reset valid optional user state.\n reconcile?(ctx: WorkbenchModeActivationContext): void;\n}\n\nexport type WorkbenchModeChangeListener = () => void;\n\nexport interface WorkbenchModeStoreState {\n modes: Record<string, WorkbenchModeContribution>;\n activeModeId: string | undefined;\n}\n\nexport interface WorkbenchModeRegistry {\n store: WorkbenchStore<WorkbenchModeStoreState>;\n dispose(): void;\n registerMode(mode: WorkbenchModeContribution): Disposable;\n getMode(id: string): WorkbenchModeContribution | undefined;\n listModes(): WorkbenchModeContribution[];\n getActiveModeId(): string | undefined;\n isTransitioning(): boolean;\n setActiveMode(id: string | undefined, input?: { deferSeed?: boolean }): void;\n seedActiveMode(): void;\n onDidChangeActive(listener: WorkbenchModeChangeListener): Disposable;\n}\n\nconst toDisposables = (result: WorkbenchModeActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nconst modePanelRegions = {\n main: [\"main-header\", \"main-left-menu\", \"main\", \"main-right-menu\"],\n secondary: [\"secondary-header\", \"secondary-left-menu\", \"secondary\", \"secondary-right-menu\"],\n side: [\"side-header\", \"side-left-menu\", \"side\", \"side-right-menu\"],\n} as const satisfies Record<WorkbenchPanelRegion, readonly WorkbenchRegion[]>;\n\nconst allModeRegions = Object.values(modePanelRegions).flat();\nconst panelsForMode = (mode: WorkbenchModeContribution) => mode.panels ?? workbenchPanelRegions;\n\nexport const getWorkbenchModePanelForRegion = (region: WorkbenchRegion) =>\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).find((panel) =>\n modePanelRegions[panel].some((candidate) => candidate === region),\n );\n\nexport const isWorkbenchModePanelAvailable = (\n mode: WorkbenchModeContribution | undefined,\n panel: WorkbenchPanelRegion,\n) => !mode || panelsForMode(mode).includes(panel);\n\nconst placementById = (layout: WorkbenchLayout, widgetId: string | undefined) => {\n if (!widgetId) return undefined;\n return Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === widgetId);\n};\n\nconst withActivePlacement = (\n layout: WorkbenchLayout,\n candidates: readonly (WorkbenchWidgetPlacement | undefined)[],\n) => {\n const active = candidates.find((placement) => placement && placementById(layout, placement.widgetId));\n return {\n ...layout,\n activeWidgetId: active?.widgetId,\n activeResourceUri: active?.resourceUri,\n };\n};\n\nconst clearRegions = (layout: WorkbenchLayout, regionIds: readonly WorkbenchRegion[]) => {\n if (regionIds.length === 0) return layout;\n const clearedPanels = new Set(\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).filter((panel) =>\n modePanelRegions[panel].some((region) => regionIds.includes(region)),\n ),\n );\n const regionsNeedClearing = regionIds.some((regionId) => {\n const region = layout.regions[regionId];\n return region.widgets.length > 0 || region.activeWidgetId !== undefined || region.visible;\n });\n const selectionsNeedClearing = Object.values(layout.locationSubPanelSelections ?? {}).some((selections) =>\n Object.keys(selections).some((panel) => clearedPanels.has(panel as WorkbenchPanelRegion)),\n );\n if (!regionsNeedClearing && !selectionsNeedClearing) return layout;\n\n const regions = { ...layout.regions };\n for (const regionId of regionIds) {\n regions[regionId] = { ...regions[regionId], widgets: [], activeWidgetId: undefined, visible: false };\n }\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections ?? {}).map(([resourceUri, selections]) => [\n resourceUri,\n Object.fromEntries(\n Object.entries(selections).filter(([panel]) => !clearedPanels.has(panel as WorkbenchPanelRegion)),\n ),\n ]),\n );\n const next = { ...layout, regions };\n return {\n ...withActivePlacement(next, [placementById(next, layout.activeWidgetId)]),\n activeLocationWidgetId: placementById(next, layout.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections,\n };\n};\n\nconst applyModePanelAvailability = (layout: WorkbenchLayout, panels: readonly WorkbenchPanelRegion[]) => {\n const available = new Set(panels);\n const unavailableRegions = (Object.keys(modePanelRegions) as WorkbenchPanelRegion[])\n .filter((panel) => !available.has(panel))\n .flatMap((panel) => modePanelRegions[panel]);\n return clearRegions(layout, unavailableRegions);\n};\n\nconst restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n) => {\n if (!saved) {\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) {\n const region = regions[regionId];\n const widgets = region.widgets.filter((placement) => placement.role !== \"content\");\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n const withoutModeContent = { ...current, regions };\n return applyModePanelAvailability(\n {\n ...withActivePlacement(withoutModeContent, [placementById(withoutModeContent, current.activeWidgetId)]),\n activeLocationWidgetId: placementById(withoutModeContent, current.activeLocationWidgetId)?.widgetId,\n },\n panels,\n );\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, regions }, panels);\n const savedActive = placementById(merged, saved.activeWidgetId);\n const currentActive = placementById(merged, current.activeWidgetId);\n return {\n ...withActivePlacement(merged, [savedActive, currentActive]),\n activeLocationWidgetId:\n placementById(merged, saved.activeLocationWidgetId)?.widgetId ??\n placementById(merged, current.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections: saved.locationSubPanelSelections,\n };\n};\n\nconst disposeReverse = (disposables: readonly Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n disposables[index]?.dispose();\n }\n};\n\nconst restoreModeLayout = (context: WorkbenchModeActivationContext, layout: WorkbenchLayout) => {\n if (layout !== context.layout.getLayout()) context.layout.restoreLayout(layout);\n for (const panel of workbenchPanelRegions) context.panels.setOpen(panel, layout.regions[panel].visible);\n};\n\nexport interface CreateWorkbenchModeRegistryInput {\n establishLocation?(instanceId: string): void;\n resolveContext(): WorkbenchModeActivationContext;\n}\n\nexport const createWorkbenchModeRegistry = (input: CreateWorkbenchModeRegistryInput): WorkbenchModeRegistry => {\n const store = createWorkbenchStore<WorkbenchModeStoreState>({\n name: \"workbench.modes\",\n initialState: { modes: {}, activeModeId: undefined },\n });\n\n const initializedModes = new Map<string, Disposable[]>();\n const seededScopes = new Set<string>();\n const unscopedLayouts = new Map<string, WorkbenchLayout>();\n let activeDisposables: Disposable[] = [];\n let activeModeContext: Disposable | undefined;\n let deferredSeedModeId: string | undefined;\n let transitioning = false;\n\n const initializeMode = (mode: WorkbenchModeContribution) => {\n if (initializedModes.has(mode.id)) return;\n const disposables = toDisposables(mode.activate(input.resolveContext()));\n initializedModes.set(mode.id, disposables);\n };\n\n const seedScope = (mode: WorkbenchModeContribution, context: WorkbenchModeActivationContext) => {\n let locationEstablished = false;\n let unsubscribeMainPanel: () => void = () => undefined;\n const establishSeededLocation = () => {\n if (locationEstablished) return;\n const primary = context.layout.getActivePanel(\"main\");\n if (!primary) return;\n // Sub Panels cannot become Locations; keep waiting for a Location-capable\n // placement instead of consuming the one-shot on a tab.\n const placement = context.layout\n .getLayout()\n .regions.main.widgets.find((candidate) => candidate.widgetId === primary.instanceId);\n if (placement && (placement.role === \"sub-panel\" || placement.role === \"panel-menu\")) return;\n locationEstablished = true;\n unsubscribeMainPanel();\n input.establishLocation?.(primary.instanceId);\n };\n\n unsubscribeMainPanel = context.layout.store.subscribeSelector(\n (state) => state.layout.regions.main,\n establishSeededLocation,\n );\n try {\n mode.seed?.(context);\n establishSeededLocation();\n } finally {\n unsubscribeMainPanel();\n }\n };\n\n // Applies panel availability and seeds default placements only when the scope is\n // new: no persisted layout and not seeded earlier in this session.\n const prepareScope = (mode: WorkbenchModeContribution) => {\n const context = input.resolveContext();\n const scopeKey = `${mode.id}\\0${context.layout.getPersistenceScope() ?? \"unscoped\"}`;\n const availableLayout = applyModePanelAvailability(context.layout.getLayout(), panelsForMode(mode));\n restoreModeLayout(context, availableLayout);\n context.layout.reconcilePanelMenus();\n if (!seededScopes.has(scopeKey) && !context.layout.enteredWithPersistedLayout()) {\n seedScope(mode, context);\n }\n seededScopes.add(scopeKey);\n };\n\n // One reconciliation pass for every context activation: first activation,\n // reselecting the active mode, and persistence-scope changes. Repair of required\n // structure belongs to mode.reconcile and runs every time, so a user can recover\n // required placements by reselecting the active mode. Reconciliation must not\n // rerun activate or enter.\n const reconcileScope = (mode: WorkbenchModeContribution) => {\n prepareScope(mode);\n mode.reconcile?.(input.resolveContext());\n };\n\n // Switching modes stashes the outgoing unscoped layout, disposes the active mode,\n // and restores the incoming mode's unscoped layout before activating it. Scoped\n // layouts are owned by the persistence scope instead.\n const transitionToMode = (id: string | undefined) => {\n const context = input.resolveContext();\n const previousModeId = store.getState().activeModeId;\n const unscoped = context.layout.getPersistenceScope() === undefined;\n if (previousModeId && unscoped) unscopedLayouts.set(previousModeId, context.layout.getLayout());\n\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n return;\n }\n\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n if (unscoped) {\n restoreModeLayout(\n context,\n restoreUnscopedModeLayout(context.layout.getLayout(), unscopedLayouts.get(id), panelsForMode(mode)),\n );\n }\n activate(id, { seed: deferredSeedModeId !== id });\n };\n\n const disposeActive = () => {\n disposeReverse(activeDisposables);\n activeDisposables = [];\n activeModeContext?.dispose();\n activeModeContext = undefined;\n };\n\n const activate = (id: string, options: { seed: boolean }) => {\n const context = input.resolveContext();\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n\n const contextScope = context.context.createScope(\"workbench.mode\");\n contextScope.set(\"activeWorkbenchMode\", id);\n contextScope.set(`workbenchMode.${id}`, true);\n activeModeContext = contextScope;\n try {\n initializeMode(mode);\n store.setState({ ...store.getState(), activeModeId: id }, false, \"activateMode\");\n if (options.seed) prepareScope(mode);\n activeDisposables = toDisposables(mode.enter?.(context));\n if (options.seed) mode.reconcile?.(input.resolveContext());\n } catch (error) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n throw error;\n }\n };\n\n const scopeSubscription = input.resolveContext().layout.onDidChangePersistenceScope(() => {\n const activeModeId = store.getState().activeModeId;\n if (activeModeId === deferredSeedModeId) return;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n if (mode) reconcileScope(mode);\n });\n const registryDisposable = createDisposable(() => {\n scopeSubscription.dispose();\n disposeActive();\n for (const disposables of initializedModes.values()) disposeReverse(disposables);\n initializedModes.clear();\n seededScopes.clear();\n unscopedLayouts.clear();\n store.setState({ modes: {}, activeModeId: undefined }, false, \"disposeModes\");\n });\n\n return {\n store,\n\n dispose() {\n registryDisposable.dispose();\n },\n\n registerMode(mode) {\n const snapshot = store.getState();\n if (snapshot.modes[mode.id]) throw new Error(`Workbench mode already registered: ${mode.id}`);\n\n store.setState({ ...snapshot, modes: { ...snapshot.modes, [mode.id]: mode } }, false, \"registerMode\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.modes[mode.id] !== mode) return;\n if (current.activeModeId === mode.id) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n }\n disposeReverse(initializedModes.get(mode.id) ?? []);\n initializedModes.delete(mode.id);\n unscopedLayouts.delete(mode.id);\n for (const scopeKey of seededScopes) {\n if (scopeKey.startsWith(`${mode.id}\\0`)) seededScopes.delete(scopeKey);\n }\n const { [mode.id]: _removed, ...rest } = current.modes;\n store.setState({ ...store.getState(), modes: rest }, false, \"unregisterMode\");\n });\n },\n\n getMode(id) {\n return store.getState().modes[id];\n },\n\n listModes() {\n return Object.values(store.getState().modes);\n },\n\n getActiveModeId() {\n return store.getState().activeModeId;\n },\n\n // A deferred seed is the second half of one transition: the caller rotates the\n // layout persistence scope between the two halves. Observers must not treat the\n // gap as a settled context, so the transition is not over until the seed runs.\n isTransitioning() {\n return transitioning || deferredSeedModeId !== undefined;\n },\n\n setActiveMode(id, setActiveInput = {}) {\n if (id === store.getState().activeModeId) {\n // Reselecting the active mode reconciles its layout without disposing or\n // rerunning enter, so a missing required placement can recover.\n const mode = id ? store.getState().modes[id] : undefined;\n if (mode && id !== deferredSeedModeId) reconcileScope(mode);\n return;\n }\n transitioning = true;\n deferredSeedModeId = setActiveInput.deferSeed ? id : undefined;\n try {\n transitionToMode(id);\n } finally {\n transitioning = false;\n }\n },\n\n seedActiveMode() {\n const activeModeId = store.getState().activeModeId;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n transitioning = true;\n try {\n if (mode) reconcileScope(mode);\n } finally {\n deferredSeedModeId = undefined;\n transitioning = false;\n }\n },\n\n onDidChangeActive(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeModeId,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\n\nexport interface Keybinding {\n commandId: string;\n keybinding: KeybindingSequence;\n when?: string;\n args?: unknown;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (!deps.commands.getCommand(keybinding.commandId))\n throw new Error(`Keybinding command not registered: ${keybinding.commandId}`);\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n };\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActivePlacement } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\nimport { type AnchorId, getSurface, listAnchorRegions, resolveAnchorRegion } from \"./surface-map\";\n\n// The resource an anchor currently hosts, read from its region's active placement. This\n// is the primary-scoped signal the coordinator keys off — `getAnchorResource(layout,\n// \"primary\")` is the main resource, free of the global active-resource pollution that\n// any side-region activation otherwise introduces.\nexport const getAnchorResource = (layout: WorkbenchLayout, anchorId: AnchorId) =>\n getActivePlacement(layout.regions[resolveAnchorRegion(anchorId)])?.resource;\n\n// What the coordinator should do with a secondary anchor when the primary resource\n// changes. Projections re-render off their anchor (a render concern), so the reconciler\n// only decides the lifecycle of the derived/detached anchor placements.\nexport type AnchorReconcileAction = { region: WorkbenchRegion; action: \"keep\" | \"clear\" };\n\nexport interface ReconcileAnchorsInput {\n layout: WorkbenchLayout;\n primary: ResourceRef | undefined;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scoped candidates. Backed by scoped resource providers once wired.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// On a primary change: derived anchors re-scope (clear, then repopulate from the new\n// scope); detached anchors stay while their resource is still in scope, else disconnect\n// (scope wins). The primary anchor is the subject and is never reconciled.\nexport const reconcileAnchors = ({ layout, primary, isInScope }: ReconcileAnchorsInput): AnchorReconcileAction[] => {\n const actions: AnchorReconcileAction[] = [];\n\n for (const region of listAnchorRegions()) {\n const surface = getSurface(region);\n if (surface.role !== \"anchor\" || surface.persistence === \"primary\") continue;\n\n // Only resource-bearing anchor placements are scoped content. A plain (resourceless)\n // widget parked in a side anchor is not a scoped resource and is left untouched.\n const placement = getActivePlacement(layout.regions[region]);\n if (!placement?.resource) continue;\n\n // Sub Panels are subordinate to their Location workspace. A Location switch\n // changes which placement is selected and rendered; it must not delete the\n // placements retained for the Location that is leaving the foreground.\n if (placement.role === \"sub-panel\" && placement.ownerResourceUri) {\n actions.push({ region, action: \"keep\" });\n continue;\n }\n\n if (surface.persistence === \"derived\") {\n actions.push({ region, action: \"clear\" });\n continue;\n }\n\n actions.push({ region, action: isInScope(placement.resource, primary) ? \"keep\" : \"clear\" });\n }\n\n return actions;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n} from \"../layout/layout-model\";\n\nexport interface WorkbenchPanelRenderInput {\n workbench: WorkbenchCore;\n panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;\n instance: WorkbenchPanelInstance;\n refresh: () => void;\n}\n\n// Keep-alive renderers are invoked exactly once into a persistent host and\n// reparented across widget mounts via DOM moves. They cannot read the per-widget\n// `WorkbenchPanelRenderInput` from their render args — the subtree subscribes\n// to the current claim through `useWorkbenchClaim()` (React layer) instead.\nexport type WorkbenchRendererRegistration =\n | {\n id: string;\n keepAlive?: false;\n render: (input: WorkbenchPanelRenderInput) => unknown;\n }\n | {\n id: string;\n keepAlive: true;\n render: () => unknown;\n };\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface RegisteredKeepAliveHost {\n rendererId: string;\n host: HTMLElement;\n attachedTo?: HTMLElement;\n}\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n hosts: Record<string, RegisteredKeepAliveHost>;\n claims: Record<string, WorkbenchPanelRenderInput>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n claim(rendererId: string, slot: HTMLElement, input: WorkbenchPanelRenderInput): Disposable;\n getHost(rendererId: string): HTMLElement | undefined;\n getClaim(rendererId: string): WorkbenchPanelRenderInput | undefined;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n // Override for environments without a real DOM (Bun tests). Default reads\n // `document`; SSR callers without DOM should provide their own factory.\n createHost?: () => HTMLElement;\n}\n\nconst removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n};\n\nconst defaultCreateHost = () => {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"workbench.renderers.registerRenderer({ keepAlive: true }): no DOM available. \" +\n \"The default host factory uses document.createElement. In a non-browser environment \" +\n \"(Bun tests, SSR), pass a custom factory via \" +\n \"createWorkbenchCore({ renderers: { createHost: () => myHost } }).\",\n );\n }\n const host = document.createElement(\"div\");\n host.style.display = \"contents\";\n host.dataset.workbenchKeepAliveHost = \"\";\n return host;\n};\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const createHost = input.createHost ?? defaultCreateHost;\n\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, hosts: {}, claims: {} },\n });\n\n // Detach the host of `rendererId` from its current slot (if any) and clear\n // the matching claim. Used before reparenting and before unregistering.\n const detachHost = (rendererId: string) => {\n const snapshot = store.getState();\n const hostState = snapshot.hosts[rendererId];\n const previousSlot = hostState?.attachedTo;\n if (!hostState || !previousSlot) return;\n\n if (previousSlot.contains(hostState.host)) previousSlot.removeChild(hostState.host);\n\n store.setState(\n {\n ...snapshot,\n hosts: { ...snapshot.hosts, [rendererId]: { ...hostState, attachedTo: undefined } },\n claims: removeKey(snapshot.claims, rendererId),\n },\n false,\n \"renderers.detach\",\n );\n };\n\n const registry: WorkbenchRendererRegistry = {\n store,\n\n registerRenderer(renderer) {\n const snapshot = store.getState();\n if (snapshot.renderers[renderer.id]) throw new Error(`Renderer already registered: ${renderer.id}`);\n\n const host = renderer.keepAlive ? createHost() : undefined;\n const nextHosts = host ? { ...snapshot.hosts, [renderer.id]: { rendererId: renderer.id, host } } : snapshot.hosts;\n\n store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer }, hosts: nextHosts },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n\n if (renderer.keepAlive) detachHost(renderer.id);\n\n const after = store.getState();\n store.setState(\n {\n ...after,\n renderers: removeKey(after.renderers, renderer.id),\n hosts: removeKey(after.hosts, renderer.id),\n claims: removeKey(after.claims, renderer.id),\n },\n false,\n \"unregisterRenderer\",\n );\n });\n },\n\n getRenderer(id) {\n return store.getState().renderers[id];\n },\n\n listRenderers() {\n return Object.values(store.getState().renderers);\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n\n claim(rendererId, slot, claimInput) {\n const snapshot = store.getState();\n const renderer = snapshot.renderers[rendererId];\n if (!renderer) throw new Error(`Renderer is not registered: ${rendererId}`);\n if (!renderer.keepAlive) throw new Error(`Renderer ${rendererId} is not keep-alive; cannot claim`);\n\n const hostState = snapshot.hosts[rendererId];\n if (!hostState) throw new Error(`Renderer ${rendererId} has no host`);\n\n // If already attached to this slot, only update the claim input and\n // skip the DOM move so re-renders with the same slot stay quiet.\n if (hostState.attachedTo === slot) {\n store.setState(\n { ...snapshot, claims: { ...snapshot.claims, [rendererId]: claimInput } },\n false,\n \"renderers.updateClaim\",\n );\n } else {\n detachHost(rendererId);\n const next = store.getState();\n const refreshedHostState = next.hosts[rendererId]!;\n slot.appendChild(refreshedHostState.host);\n store.setState(\n {\n ...next,\n hosts: { ...next.hosts, [rendererId]: { ...refreshedHostState, attachedTo: slot } },\n claims: { ...next.claims, [rendererId]: claimInput },\n },\n false,\n \"renderers.attach\",\n );\n }\n\n return createDisposable(() => {\n const current = store.getState();\n const currentHostState = current.hosts[rendererId];\n if (!currentHostState || currentHostState.attachedTo !== slot) return;\n detachHost(rendererId);\n });\n },\n\n getHost(rendererId) {\n return store.getState().hosts[rendererId]?.host;\n },\n\n getClaim(rendererId) {\n return store.getState().claims[rendererId];\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n\n return registry;\n};\n","export const standardResourceIcons = {\n project: \"folder-root\",\n workspace: \"computer\",\n worktree: \"git-pull-request-draft\",\n settings: \"settings\",\n kanbanRenderer: \"table-properties\",\n} as const;\n\nexport type StandardResourceIcon = (typeof standardResourceIcons)[keyof typeof standardResourceIcons];\n","import type { 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 { KeybindingSequence } from \"./registries/keybindings/keybinding-registry\";\nimport type { WorkbenchRegion } from \"./registries/layout/layout-model\";\nimport { workbenchCommandPaletteMenuPath } from \"./registries/menus/workbench-menu-paths\";\nimport type { NavigationTarget } from \"./registries/navigation/navigation-registry\";\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). The command palette intentionally claims the browser print\n// chord. Other built-ins must avoid the reserved table in `pstdio-extensions`.\nconst builtinCommands: BuiltinCommand[] = [\n {\n id: \"workbench.toggleCommandPalette\",\n label: \"Toggle Command Palette\",\n icon: \"Command\",\n keybinding: \"Mod+P\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.toggle(),\n },\n {\n id: \"workbench.action.showCommands\",\n label: \"Run Command\",\n icon: \"Terminal\",\n keybinding: \"Alt+Shift+K\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ initialQuery: \"> \" }),\n },\n {\n id: \"workbench.action.changeTheme\",\n label: \"Change Theme\",\n icon: \"Palette\",\n keybinding: \"Alt+Shift+T\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ view: \"theme\" }),\n },\n {\n id: \"workbench.action.navigateBack\",\n label: \"Navigate Back\",\n icon: \"ArrowLeft\",\n keybinding: \"Alt+Shift+ArrowLeft\",\n execute: (workbench: WorkbenchCore) => {\n workbench.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 workbenchSwitchModeCommandId = \"workbench.action.switchMode\";\n\nexport const getSwitchModeNavigationTargetModeId = (target: NavigationTarget) => {\n if (target.kind !== \"command\" || target.commandId !== workbenchSwitchModeCommandId) return;\n if (!target.args || typeof target.args !== \"object\") return;\n\n const modeId = \"modeId\" in target.args ? target.args.modeId : undefined;\n return typeof modeId === \"string\" && modeId.trim().length > 0 ? modeId : undefined;\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: workbenchSwitchModeCommandId,\n label: \"Switch Mode\",\n category: \"Workbench\",\n icon: \"PanelTop\",\n when: \"!inputFocus\",\n },\n {\n execute: async (args?: WorkbenchSwitchModeCommandArgs) => {\n if (!args?.modeId) {\n workbench.commandPalette.open({ view: \"mode\" });\n return;\n }\n // Mode switches run through the atomic navigator so the resource, layout\n // scope, and breadcrumb commit together with the mode.\n const result = await workbench.navigator.open({ modeId: args.modeId });\n if (!result.ok && result.code === \"navigation_mode_missing\") {\n workbench.notifications.show({\n level: \"error\",\n title: \"Mode unavailable\",\n message: result.message,\n });\n }\n },\n },\n );\n workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, {\n commandId: workbenchSwitchModeCommandId,\n group: \"Workbench\",\n });\n};\n"],"names":["defaultContributionOwnerId","normalizeContributionMetadata","metadata","source","ownerId","priority","byContributionPriority","left","right","localeCompare","defaultEquality","Object","is","createWorkbenchStore","input","api","createStore","devtools","initialState","name","subscribeSelector","selector","listener","options","equalityFn","previousValue","getState","fireImmediately","subscribe","state","nextValue","previous","getInitialState","setState","workbenchResourceKindContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","key","workbenchSelectionResourceUriMetadataKey","isContextPrimitive","value","createWorkbenchResourceContextValues","resource","values","kind","id","uri","entries","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceUris","selectionResourceUri","sortPresenters","presenters","sort","isPromiseLike","then","createResourceRegistry","openListeners","Set","cycleListeners","establishLocation","openingResourceDepth","store","kinds","providers","hierarchyProviders","registerKind","snapshot","Error","record","createDisposable","current","_removed","rest","getKind","getSurface","surface","listKinds","registerPresenter","presenter","listPresenters","registerProvider","provider","listProviders","listResources","query","context","primary","getPrimary","push","list","registerHierarchyProvider","listHierarchyProviders","sortHierarchyProviders","walkHierarchy","walkResourceHierarchy","cycle","map","node","isWorkbenchViewHierarchyNode","view","resolveView","viewId","label","icon","onDidDetectHierarchyCycle","add","delete","isOpeningResource","openResource","find","candidate","canOpen","result","opened","open","afterOpen","onDidOpenResource","findPlacement","layout","contributionId","region","regions","index","widgets","findIndex","regionId","placement","findResourcePlacement","resourceUri","findPlacementByWidgetId","widgetId","createUniqueWidgetId","widgetIds","flatMap","resolveUniqueWidgetId","getActivePlacement","activeWidgetId","isLocationPlacement","role","locationWorkspaceKey","setLocationSubPanelSelection","location","next","locationSubPanelSelections","removeLocationSubPanelSelection","fromEntries","selections","filter","selectedId","getActiveLocationPlacement","locations","main","activeLocationWidgetId","at","buildUpdatedPlacement","widget","update","undefined","title","pinned","closable","mountStrategy","hiddenByDefault","tabRetention","tab","createPlacement","spec","singleton","replaceRegionWidgets","clearActiveWidget","some","removePlacementsForContribution","nextLayout","removed","filtered","length","hasActiveWidget","startsWith","activeResourceUri","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","ownerResourceUri","nextRegion","workbenchPanelRegions","includes","closedPlacement","activePlacement","activateInLayout","panel","panelRegion","selected","withSelection","selectRegionActiveWidget","followsRegion","supportsResource","resourceKinds","getActiveWorkbenchSubPanel","ignoreOwnerResourceUri","getActiveWorkbenchLocationPanel","matchesLocationEligibility","modeId","eligibleLocations","matchesWorkbenchModeEligibility","resourceIds","canOpenLocation","eligibleModeIds","modeIds","isWorkbenchPanelPlacementVisible","ignoreResourceLocation","allowsWorkbenchFloatingPanels","activeMainPanel","floatingPanels","matchesWorkbenchPanelMenuOwner","owner","panelMenuOwner","level","subPanel","locationPanel","toOpenWidgetInput","defaultTabRetention","strategy","shared","normalized","tabPosition","position","replaceActive","replaceWidgetId","instanceId","retention","toPanelInstance","panelId","toPanelContribution","_closable","ownedPanelMenuIds","_ownedPanelMenuIds","toDisposables","Array","isArray","modePanelRegions","secondary","side","allModeRegions","flat","panelsForMode","mode","panels","getWorkbenchModePanelForRegion","keys","isWorkbenchModePanelAvailable","placementById","withActivePlacement","candidates","active","clearRegions","regionIds","clearedPanels","regionsNeedClearing","visible","selectionsNeedClearing","has","applyModePanelAvailability","available","unavailableRegions","restoreUnscopedModeLayout","saved","withoutModeContent","merged","savedActive","currentActive","disposeReverse","disposables","dispose","restoreModeLayout","getLayout","restoreLayout","setOpen","createWorkbenchModeRegistry","modes","activeModeId","initializedModes","Map","seededScopes","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","activate","resolveContext","set","seedScope","locationEstablished","unsubscribeMainPanel","establishSeededLocation","getActivePanel","seed","prepareScope","scopeKey","getPersistenceScope","availableLayout","reconcilePanelMenus","enteredWithPersistedLayout","reconcileScope","reconcile","transitionToMode","previousModeId","unscoped","disposeActive","get","contextScope","createScope","enter","error","scopeSubscription","onDidChangePersistenceScope","registryDisposable","clear","registerMode","getMode","listModes","getActiveModeId","isTransitioning","setActiveMode","setActiveInput","deferSeed","seedActiveMode","onDidChangeActive","unsubscribe","getKeybindingSteps","keybinding","trim","split","Boolean","normalizeKeybindingSequence","steps","createKeybindingRegistry","deps","keybindings","registerKeybinding","commands","getCommand","commandId","listKeybindings","listActiveKeybindings","matches","when","getAnchorResource","anchorId","resolveAnchorRegion","reconcileAnchors","isInScope","actions","listAnchorRegions","persistence","action","removeKey","defaultCreateHost","document","host","createElement","style","display","dataset","workbenchKeepAliveHost","createWorkbenchRendererRegistry","createHost","renderers","hosts","claims","detachHost","rendererId","hostState","previousSlot","attachedTo","contains","removeChild","registry","registerRenderer","renderer","keepAlive","nextHosts","after","getRenderer","listRenderers","onDidChange","claim","slot","claimInput","refreshedHostState","appendChild","currentHostState","getHost","getClaim","initialRenderers","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","readComparisonValue","replace","matchesTerm","term","trimmed","comparison","match","operator","rawValue","actual","expected","String","slice","matchesContextExpression","expression","orClause","every","createContextKeyService","globalValues","ownerValues","buildValues","scopedValues","assign","publish","disposed","assertActive","deleteOwner","SIDENAV_PANEL_ID","setPanelOpen","workbench","setRegionVisible","togglePanel","isOpen","builtinCommands","execute","commandPalette","toggle","initialQuery","history","goBack","goForward","workbenchSwitchModeCommandId","getSwitchModeNavigationTargetModeId","target","args","registerWorkbenchBuiltIns","command","registerCommand","category","registerMenuItem","workbenchCommandPaletteMenuPath","group","navigator","ok","code","notifications","show","message"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ const k = (e) => {
2
+ let r = !1;
3
+ return {
4
+ dispose() {
5
+ r || (r = !0, e());
6
+ }
7
+ };
8
+ }, c = (e) => "type" in e && e.type === "view", u = "resource_hierarchy_cycle", b = (e) => [...e].sort((r, n) => n.priority - r.priority || r.id.localeCompare(n.id)), g = (e, r, n) => {
9
+ const d = b(e), o = [r], i = /* @__PURE__ */ new Set([`resource:${r.uri}`]);
10
+ let t = r;
11
+ for (; ; ) {
12
+ const a = d.find((h) => h.canResolve(t))?.getParent(t);
13
+ if (!a) break;
14
+ const s = c(a) ? `view:${a.viewId}` : `resource:${a.uri}`;
15
+ if (i.has(s)) {
16
+ n({
17
+ code: u,
18
+ path: [...o],
19
+ repeatedUri: c(a) ? s : a.uri
20
+ });
21
+ break;
22
+ }
23
+ if (o.unshift(a), i.add(s), c(a)) break;
24
+ t = a;
25
+ }
26
+ return o;
27
+ }, w = (e) => ["workbench", "header", e, "leading"], p = (e) => ["workbench", "header", e, "trailing"], y = (e) => ["workbench", "regionTabs", e, "leading"], P = (e) => ["workbench", "regionTabs", e, "add"], v = ["workbench", "commandPalette"], M = w("nav"), T = p("nav"), f = (e) => ["workbench", "resource", e, "context"];
28
+ export {
29
+ p as a,
30
+ u as b,
31
+ k as c,
32
+ P as d,
33
+ y as e,
34
+ M as f,
35
+ T as g,
36
+ w as h,
37
+ c as i,
38
+ g as j,
39
+ f as r,
40
+ b as s,
41
+ v as w
42
+ };
43
+ //# sourceMappingURL=workbench-menu-paths-D-e7iscN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-menu-paths-D-e7iscN.js","sources":["../src/core/shared/disposable.ts","../src/core/registries/resources/resource-hierarchy.ts","../src/core/registries/menus/workbench-menu-paths.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","import type { ResourceRef } from \"./resource-registry\";\n\nexport interface WorkbenchViewHierarchyNode {\n type: \"view\";\n viewId: string;\n label?: string;\n icon?: string;\n}\n\nexport type WorkbenchHierarchyNode = ResourceRef | WorkbenchViewHierarchyNode;\n\nexport const isWorkbenchViewHierarchyNode = (node: WorkbenchHierarchyNode): node is WorkbenchViewHierarchyNode =>\n \"type\" in node && node.type === \"view\";\n\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}\n\nexport type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;\n\nexport const resourceHierarchyCycleCode = \"resource_hierarchy_cycle\";\n\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}\n\nexport const sortHierarchyProviders = (providers: ResolvedResourceHierarchyProvider[]) =>\n [...providers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\n\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:${resource.uri}`]);\n let current = resource;\n\n while (true) {\n const provider = sorted.find((candidate) => candidate.canResolve(current));\n const parent = provider?.getParent(current);\n if (!parent) break;\n\n const parentKey = isWorkbenchViewHierarchyNode(parent) ? `view:${parent.viewId}` : `resource:${parent.uri}`;\n\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 : parent.uri,\n });\n break;\n }\n\n path.unshift(parent);\n visitedKeys.add(parentKey);\n if (isWorkbenchViewHierarchyNode(parent)) break;\n current = parent;\n }\n\n return path;\n};\n","import type { MenuPath } from \"./menu-registry\";\n\nexport const headerLeadingMenuPath = (region: string): MenuPath => [\"workbench\", \"header\", region, \"leading\"];\n\nexport const headerTrailingMenuPath = (region: string): MenuPath => [\"workbench\", \"header\", region, \"trailing\"];\n\nexport const workbenchRegionTabLeadingMenuPath = (region: string): MenuPath => [\n \"workbench\",\n \"regionTabs\",\n region,\n \"leading\",\n];\n\nexport const workbenchRegionTabAddMenuPath = (region: string): MenuPath => [\"workbench\", \"regionTabs\", region, \"add\"];\n\nexport const workbenchCommandPaletteMenuPath = [\"workbench\", \"commandPalette\"] as const satisfies MenuPath;\n\nexport const workbenchTopHeaderLeadingMenuPath = headerLeadingMenuPath(\"nav\");\n\nexport const workbenchTopHeaderTrailingMenuPath = headerTrailingMenuPath(\"nav\");\n\nexport const resourceContextMenuPath = (resourceKind: string): MenuPath => [\n \"workbench\",\n \"resource\",\n resourceKind,\n \"context\",\n];\n"],"names":["createDisposable","onDispose","disposed","dispose","isWorkbenchViewHierarchyNode","node","type","resourceHierarchyCycleCode","sortHierarchyProviders","providers","sort","left","right","priority","id","localeCompare","walkResourceHierarchy","resource","notifyCycle","sorted","path","visitedKeys","Set","uri","current","parent","find","candidate","canResolve","getParent","parentKey","viewId","has","code","repeatedUri","unshift","add","headerLeadingMenuPath","region","headerTrailingMenuPath","workbenchRegionTabLeadingMenuPath","workbenchRegionTabAddMenuPath","workbenchCommandPaletteMenuPath","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","resourceContextMenuPath","resourceKind"],"mappings":"AAIO,MAAMA,IAAmBA,CAACC,MAAsC;AACrE,MAAIC,IAAW;AAEf,SAAO;AAAA,IACLC,UAAU;AACR,MAAID,MACJA,IAAW,IACXD,EAAAA;AAAAA,IACF;AAAA,EAAA;AAEJ,GCHaG,IAA+BA,CAACC,MAC3C,UAAUA,KAAQA,EAAKC,SAAS,QAarBC,IAA6B,4BAW7BC,IAAyBA,CAACC,MACrC,CAAC,GAAGA,CAAS,EAAEC,KAAK,CAACC,GAAMC,MAAUA,EAAMC,WAAWF,EAAKE,YAAYF,EAAKG,GAAGC,cAAcH,EAAME,EAAE,CAAC,GAE3FE,IAAwBA,CACnCP,GACAQ,GACAC,MACG;AACH,QAAMC,IAASX,EAAuBC,CAAS,GACzCW,IAAiC,CAACH,CAAQ,GAC1CI,wBAAkBC,IAAI,CAAC,YAAYL,EAASM,GAAG,EAAE,CAAC;AACxD,MAAIC,IAAUP;AAEd,aAAa;AAEX,UAAMQ,IADWN,EAAOO,KAAMC,OAAcA,EAAUC,WAAWJ,CAAO,CAAC,GAChDK,UAAUL,CAAO;AAC1C,QAAI,CAACC,EAAQ;AAEb,UAAMK,IAAY1B,EAA6BqB,CAAM,IAAI,QAAQA,EAAOM,MAAM,KAAK,YAAYN,EAAOF,GAAG;AAEzG,QAAIF,EAAYW,IAAIF,CAAS,GAAG;AAG9BZ,MAAAA,EAAY;AAAA,QACVe,MAAM1B;AAAAA,QACNa,MAAM,CAAC,GAAGA,CAAI;AAAA,QACdc,aAAa9B,EAA6BqB,CAAM,IAAIK,IAAYL,EAAOF;AAAAA,MAAAA,CACxE;AACD;AAAA,IACF;AAIA,QAFAH,EAAKe,QAAQV,CAAM,GACnBJ,EAAYe,IAAIN,CAAS,GACrB1B,EAA6BqB,CAAM,EAAG;AAC1CD,IAAAA,IAAUC;AAAAA,EACZ;AAEA,SAAOL;AACT,GCxEaiB,IAAwBA,CAACC,MAA6B,CAAC,aAAa,UAAUA,GAAQ,SAAS,GAE/FC,IAAyBA,CAACD,MAA6B,CAAC,aAAa,UAAUA,GAAQ,UAAU,GAEjGE,IAAoCA,CAACF,MAA6B,CAC7E,aACA,cACAA,GACA,SAAS,GAGEG,IAAgCA,CAACH,MAA6B,CAAC,aAAa,cAAcA,GAAQ,KAAK,GAEvGI,IAAkC,CAAC,aAAa,gBAAgB,GAEhEC,IAAoCN,EAAsB,KAAK,GAE/DO,IAAqCL,EAAuB,KAAK,GAEjEM,IAA0BA,CAACC,MAAmC,CACzE,aACA,YACAA,GACA,SAAS;"}
@@ -0,0 +1,144 @@
1
+ import { jsx as b } from "react/jsx-runtime";
2
+ import { c as T } from "react/compiler-runtime";
3
+ import { Icon as _, Stack as A } from "@chakra-ui/react";
4
+ import * as j from "lucide-react";
5
+ import { TagSettingsPanel as z } from "@pstdio/ui";
6
+ import { useState as L, useEffect as E } from "react";
7
+ import { useStore as U } from "zustand";
8
+ const B = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((t) => `${t.charAt(0).toUpperCase()}${t.slice(1)}`).join(""), H = (e) => {
9
+ const t = B(e), s = [e, t, `${t}Icon`];
10
+ for (const o of s) {
11
+ const n = j[o];
12
+ if (n && (typeof n == "function" || typeof n == "object"))
13
+ return n;
14
+ }
15
+ }, ot = (e) => {
16
+ const t = T(10);
17
+ let s, o, n;
18
+ t[0] !== e ? ({
19
+ name: s,
20
+ size: n,
21
+ ...o
22
+ } = e, t[0] = e, t[1] = s, t[2] = o, t[3] = n) : (s = t[1], o = t[2], n = t[3]);
23
+ const i = n === void 0 ? 14 : n;
24
+ if (!s)
25
+ return null;
26
+ let a;
27
+ t[4] !== s ? (a = H(s), t[4] = s, t[5] = a) : a = t[5];
28
+ const c = a;
29
+ if (!c)
30
+ return null;
31
+ const l = typeof i == "number" ? `${i}px` : i;
32
+ let r;
33
+ return t[6] !== c || t[7] !== o || t[8] !== l ? (r = /* @__PURE__ */ b(_, { as: c, boxSize: l, "aria-hidden": "true", ...o }), t[6] = c, t[7] = o, t[8] = l, t[9] = r) : r = t[9], r;
34
+ }, P = (e, t) => U(e, t), d = {
35
+ canCreate: "workbench.status.can-create",
36
+ canDragIn: "workbench.status.can-drag-in",
37
+ canDragOut: "workbench.status.can-drag-out"
38
+ }, N = (e) => [...e.board?.canCreate ? [d.canCreate] : [], ...e.board?.canDragIn ? [d.canDragIn] : [], ...e.board?.canDragOut ? [d.canDragOut] : [], ...e.board?.actions ?? []], R = (e) => ({
39
+ id: e.id,
40
+ name: e.label,
41
+ color: e.color,
42
+ icon: e.icon,
43
+ sortOrder: e.sortOrder,
44
+ isDefault: e.isDefault,
45
+ actions: N(e)
46
+ }), V = (e, t) => [...e].sort().join("|") === [...t].sort().join("|"), Z = (e, t) => e.label !== t.name || e.color !== t.color || e.icon !== t.icon || e.isDefault !== t.isDefault || !V(N(e), t.actions ?? []), q = (e, t, s) => ({
47
+ id: e.id,
48
+ label: e.name,
49
+ color: e.color,
50
+ icon: e.icon,
51
+ sortOrder: e.sortOrder,
52
+ isDefault: e.isDefault,
53
+ board: {
54
+ ...t?.board,
55
+ canCreate: e.actions?.includes(d.canCreate),
56
+ canDragIn: e.actions?.includes(d.canDragIn),
57
+ canDragOut: e.actions?.includes(d.canDragOut),
58
+ actions: e.actions?.filter((o) => s.has(o))
59
+ }
60
+ }), F = (e) => {
61
+ const t = T(29), {
62
+ statusSet: s,
63
+ workbench: o
64
+ } = e;
65
+ let n;
66
+ t[0] !== s.id || t[1] !== o.statuses ? (n = () => {
67
+ const u = o.statuses.getStatuses(s.id);
68
+ return u ? [...u] : void 0;
69
+ }, t[0] = s.id, t[1] = o.statuses, t[2] = n) : n = t[2];
70
+ const [i, a] = L(n), [c, l] = L();
71
+ let r;
72
+ t[3] !== s.id || t[4] !== o.statuses ? (r = () => {
73
+ let u = !0;
74
+ const I = o.statuses.getStatuses(s.id);
75
+ return a(I ? [...I] : void 0), l(void 0), o.statuses.load(s.id).then((m) => {
76
+ u && a([...m]);
77
+ }, (m) => {
78
+ u && l(m);
79
+ }), () => {
80
+ u = !1;
81
+ };
82
+ }, t[3] = s.id, t[4] = o.statuses, t[5] = r) : r = t[5];
83
+ let f;
84
+ t[6] !== s.id || t[7] !== o ? (f = [s.id, o], t[6] = s.id, t[7] = o, t[8] = f) : f = t[8], E(r, f);
85
+ let p;
86
+ t[9] !== s.actions ? (p = new Set((s.actions ?? []).map(G)), t[9] = s.actions, t[10] = p) : p = t[10];
87
+ const k = p;
88
+ let D, g, h;
89
+ t[11] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (D = {
90
+ value: d.canCreate,
91
+ label: "Create in column"
92
+ }, g = {
93
+ value: d.canDragIn,
94
+ label: "Drag in"
95
+ }, h = {
96
+ value: d.canDragOut,
97
+ label: "Drag out"
98
+ }, t[11] = D, t[12] = g, t[13] = h) : (D = t[11], g = t[12], h = t[13]);
99
+ let v;
100
+ t[14] !== s.actions ? (v = [D, g, h, ...(s.actions ?? []).map(J)], t[14] = s.actions, t[15] = v) : v = t[15];
101
+ const O = v;
102
+ let S;
103
+ t[16] !== k || t[17] !== s.id || t[18] !== o.statuses ? (S = async (u) => {
104
+ const I = u.drafts.map((m) => q(m, u.values.find((W) => W.id === m.id), k));
105
+ a([...await o.statuses.save(s.id, I)]);
106
+ }, t[16] = k, t[17] = s.id, t[18] = o.statuses, t[19] = S) : S = t[19];
107
+ const C = S, $ = !s.save, x = s.save ? "Configure this workflow's columns." : "This status set is read-only.", y = `Unable to update ${s.title}`;
108
+ let w;
109
+ return t[20] !== O || t[21] !== c || t[22] !== C || t[23] !== s.title || t[24] !== i || t[25] !== x || t[26] !== y || t[27] !== $ ? (w = /* @__PURE__ */ b(z, { values: i, loadError: c, onSave: C, toEditorValue: R, valueNeedsUpdate: Z, readOnly: $, title: s.title, description: x, actionOptions: O, showDefault: !0, errorTitle: y, addLabel: "Add status", addName: "New status", resetLabel: "Reset", saveLabel: "Save", deleteHeadline: "Delete status?", deleteNotificationText: K, deleteButtonText: "Delete status" }), t[20] = O, t[21] = c, t[22] = C, t[23] = s.title, t[24] = i, t[25] = x, t[26] = y, t[27] = $, t[28] = w) : w = t[28], w;
110
+ }, nt = (e) => {
111
+ const t = T(12), {
112
+ workbench: s
113
+ } = e;
114
+ P(s.statuses.store, M);
115
+ let o, n, i, a, c;
116
+ if (t[0] !== s) {
117
+ const r = s.statuses.listStatusSets();
118
+ o = A, n = "none", i = "full", a = "bg", c = r.map((f) => /* @__PURE__ */ b(A, { "data-testid": `workflow-status-set-${f.id}`, gap: "none", children: /* @__PURE__ */ b(F, { workbench: s, statusSet: f }) }, f.id)), t[0] = s, t[1] = o, t[2] = n, t[3] = i, t[4] = a, t[5] = c;
119
+ } else
120
+ o = t[1], n = t[2], i = t[3], a = t[4], c = t[5];
121
+ let l;
122
+ return t[6] !== o || t[7] !== n || t[8] !== i || t[9] !== a || t[10] !== c ? (l = /* @__PURE__ */ b(o, { gap: n, minH: i, bg: a, children: c }), t[6] = o, t[7] = n, t[8] = i, t[9] = a, t[10] = c, t[11] = l) : l = t[11], l;
123
+ };
124
+ function G(e) {
125
+ return e.id;
126
+ }
127
+ function J(e) {
128
+ return {
129
+ value: e.id,
130
+ label: e.label
131
+ };
132
+ }
133
+ function K(e) {
134
+ return `This will delete the "${e.name}" status.`;
135
+ }
136
+ function M(e) {
137
+ return e.statusSets;
138
+ }
139
+ export {
140
+ ot as W,
141
+ nt as a,
142
+ P as u
143
+ };
144
+ //# sourceMappingURL=workflow-status-settings-DLiu9FZ0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-status-settings-DLiu9FZ0.js","sources":["../src/react/shared/icon.tsx","../src/react/shared/use-workbench-store.ts","../src/react/statuses/workflow-status-settings.tsx"],"sourcesContent":["import { Icon, type IconProps } from \"@chakra-ui/react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport * as lucideIcons from \"lucide-react\";\n\ninterface WorkbenchIconProps extends Omit<IconProps, \"as\" | \"size\"> {\n name?: string;\n size?: number | string;\n}\n\nconst toPascalCase = (value: string) =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\"\");\n\nconst resolveLucideIcon = (name: string) => {\n const pascalName = toPascalCase(name);\n const candidates = [name, pascalName, `${pascalName}Icon`];\n\n for (const candidate of candidates) {\n const IconComponent = (lucideIcons as Record<string, unknown>)[candidate];\n if (IconComponent && (typeof IconComponent === \"function\" || typeof IconComponent === \"object\")) {\n return IconComponent as LucideIcon;\n }\n }\n\n return undefined;\n};\n\nexport const WorkbenchIcon = (props: WorkbenchIconProps) => {\n const { name, size = 14, ...rest } = props;\n if (!name) return null;\n\n const LucideIcon = resolveLucideIcon(name);\n if (!LucideIcon) return null;\n\n return <Icon as={LucideIcon} boxSize={typeof size === \"number\" ? `${size}px` : size} aria-hidden=\"true\" {...rest} />;\n};\n","import { useStore } from \"zustand\";\nimport type { WorkbenchStore } from \"../../core\";\n\nexport const useWorkbenchStore = <TState, TSlice>(store: WorkbenchStore<TState>, selector: (state: TState) => TSlice) =>\n useStore(store, selector);\n","import { Stack } from \"@chakra-ui/react\";\nimport { type SaveTagSettingsInput, type TagEditorValue, TagSettingsPanel } from \"@pstdio/ui\";\nimport { useEffect, useState } from \"react\";\nimport type { RegisteredWorkbenchStatusSet, WorkbenchStatusRegistry, WorkflowStatus } from \"../../core\";\nimport { useWorkbenchStore } from \"../shared/use-workbench-store\";\n\nconst boardRuleActions = {\n canCreate: \"workbench.status.can-create\",\n canDragIn: \"workbench.status.can-drag-in\",\n canDragOut: \"workbench.status.can-drag-out\",\n} as const;\n\nconst statusActions = (status: WorkflowStatus) => [\n ...(status.board?.canCreate ? [boardRuleActions.canCreate] : []),\n ...(status.board?.canDragIn ? [boardRuleActions.canDragIn] : []),\n ...(status.board?.canDragOut ? [boardRuleActions.canDragOut] : []),\n ...(status.board?.actions ?? []),\n];\n\nconst toEditorValue = (status: WorkflowStatus): TagEditorValue => ({\n id: status.id,\n name: status.label,\n color: status.color,\n icon: status.icon,\n sortOrder: status.sortOrder,\n isDefault: status.isDefault,\n actions: statusActions(status),\n});\n\nconst sameValues = (left: readonly string[], right: readonly string[]) =>\n [...left].sort().join(\"|\") === [...right].sort().join(\"|\");\n\nconst statusNeedsUpdate = (original: WorkflowStatus, draft: TagEditorValue) =>\n original.label !== draft.name ||\n original.color !== draft.color ||\n original.icon !== draft.icon ||\n original.isDefault !== draft.isDefault ||\n !sameValues(statusActions(original), draft.actions ?? []);\n\nconst toWorkflowStatus = (\n draft: TagEditorValue,\n original: WorkflowStatus | undefined,\n providerActionIds: ReadonlySet<string>,\n): WorkflowStatus => ({\n id: draft.id,\n label: draft.name,\n color: draft.color,\n icon: draft.icon,\n sortOrder: draft.sortOrder,\n isDefault: draft.isDefault,\n board: {\n ...original?.board,\n canCreate: draft.actions?.includes(boardRuleActions.canCreate),\n canDragIn: draft.actions?.includes(boardRuleActions.canDragIn),\n canDragOut: draft.actions?.includes(boardRuleActions.canDragOut),\n actions: draft.actions?.filter((action) => providerActionIds.has(action)),\n },\n});\n\ninterface WorkflowStatusSectionProps {\n statusSet: RegisteredWorkbenchStatusSet;\n workbench: { statuses: WorkbenchStatusRegistry };\n}\n\nconst WorkflowStatusSection = (props: WorkflowStatusSectionProps) => {\n const { statusSet, workbench } = props;\n const [statuses, setStatuses] = useState<WorkflowStatus[] | undefined>(() => {\n const cached = workbench.statuses.getStatuses(statusSet.id);\n return cached ? [...cached] : undefined;\n });\n const [loadError, setLoadError] = useState<unknown>();\n\n useEffect(() => {\n let current = true;\n const cached = workbench.statuses.getStatuses(statusSet.id);\n setStatuses(cached ? [...cached] : undefined);\n setLoadError(undefined);\n void workbench.statuses.load(statusSet.id).then(\n (value) => {\n if (current) setStatuses([...value]);\n },\n (error) => {\n if (current) setLoadError(error);\n },\n );\n return () => {\n current = false;\n };\n }, [statusSet.id, workbench]);\n\n const providerActionIds = new Set((statusSet.actions ?? []).map((action) => action.id));\n const actionOptions = [\n { value: boardRuleActions.canCreate, label: \"Create in column\" },\n { value: boardRuleActions.canDragIn, label: \"Drag in\" },\n { value: boardRuleActions.canDragOut, label: \"Drag out\" },\n ...(statusSet.actions ?? []).map((action) => ({ value: action.id, label: action.label })),\n ];\n\n const save = async (input: SaveTagSettingsInput<WorkflowStatus>) => {\n const next = input.drafts.map((draft) =>\n toWorkflowStatus(\n draft,\n input.values.find((status) => status.id === draft.id),\n providerActionIds,\n ),\n );\n setStatuses([...(await workbench.statuses.save(statusSet.id, next))]);\n };\n\n return (\n <TagSettingsPanel\n values={statuses}\n loadError={loadError}\n onSave={save}\n toEditorValue={toEditorValue}\n valueNeedsUpdate={statusNeedsUpdate}\n readOnly={!statusSet.save}\n title={statusSet.title}\n description={statusSet.save ? \"Configure this workflow's columns.\" : \"This status set is read-only.\"}\n actionOptions={actionOptions}\n showDefault\n errorTitle={`Unable to update ${statusSet.title}`}\n addLabel=\"Add status\"\n addName=\"New status\"\n resetLabel=\"Reset\"\n saveLabel=\"Save\"\n deleteHeadline=\"Delete status?\"\n deleteNotificationText={(status) => `This will delete the \"${status.name}\" status.`}\n deleteButtonText=\"Delete status\"\n />\n );\n};\n\ninterface WorkflowStatusSettingsProps {\n workbench: { statuses: WorkbenchStatusRegistry };\n}\n\nexport const WorkflowStatusSettings = (props: WorkflowStatusSettingsProps) => {\n const { workbench } = props;\n useWorkbenchStore(workbench.statuses.store, (state) => state.statusSets);\n const statusSets = workbench.statuses.listStatusSets();\n\n return (\n <Stack gap=\"none\" minH=\"full\" bg=\"bg\">\n {statusSets.map((statusSet) => (\n <Stack key={statusSet.id} data-testid={`workflow-status-set-${statusSet.id}`} gap=\"none\">\n <WorkflowStatusSection workbench={workbench} statusSet={statusSet} />\n </Stack>\n ))}\n </Stack>\n );\n};\n"],"names":["toPascalCase","value","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","resolveLucideIcon","name","pascalName","candidates","candidate","IconComponent","lucideIcons","WorkbenchIcon","props","$","_c","rest","t0","size","undefined","t1","LucideIcon","t2","t3","Icon","useWorkbenchStore","store","selector","useStore","boardRuleActions","canCreate","canDragIn","canDragOut","statusActions","status","board","actions","toEditorValue","id","label","color","icon","sortOrder","isDefault","sameValues","left","right","sort","statusNeedsUpdate","original","draft","toWorkflowStatus","providerActionIds","includes","action","has","WorkflowStatusSection","statusSet","workbench","statuses","cached","getStatuses","setStatuses","useState","loadError","setLoadError","current","cached_0","load","then","error","useEffect","Set","_temp","t4","t5","t6","Symbol","for","t7","_temp2","actionOptions","t8","input","next","drafts","values","find","save","t9","t10","t11","title","t12","jsx","TagSettingsPanel","_temp3","WorkflowStatusSettings","_temp4","T0","statusSets","listStatusSets","Stack","action_0","status_0","state"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pstdio/workbench",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/pufflyai/prompt-studio"
@@ -63,8 +63,8 @@
63
63
  "@dnd-kit/core": "^6.3.1",
64
64
  "@dnd-kit/sortable": "^10.0.0",
65
65
  "@dnd-kit/utilities": "^3.2.2",
66
- "@pstdio/sdk": "^0.19.0",
67
- "@pstdio/ui": "^0.20.1",
66
+ "@pstdio/sdk": "^0.21.0",
67
+ "@pstdio/ui": "^0.21.0",
68
68
  "@tanstack/react-hotkeys": "0.10.0",
69
69
  "lucide-react": "^0.556.0",
70
70
  "rimless": "0.8.2",
@@ -76,7 +76,7 @@
76
76
  "@storybook/addon-docs": "10.1.9",
77
77
  "@storybook/react": "^10.1.9",
78
78
  "@storybook/react-vite": "^10.1.9",
79
- "@types/bun": "1.3.13",
79
+ "@types/bun": "1.3.14",
80
80
  "@types/react": "19.2.3",
81
81
  "@types/react-dom": "19.2.3",
82
82
  "@vitejs/plugin-react": "^5.1.1",