@pstdio/workbench 0.41.0 → 0.43.0-nightly.20261011183426
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions.d.ts +15 -9
- package/dist/extensions.js +323 -250
- package/dist/extensions.js.map +1 -1
- package/dist/{file-renderer-view-CiuJ_aMB.js → file-renderer-view-CTVhwDGe.js} +26 -26
- package/dist/{file-renderer-view-CiuJ_aMB.js.map → file-renderer-view-CTVhwDGe.js.map} +1 -1
- package/dist/{index-Dh0tRr9k.d.ts → index-dbYXNnIr.d.ts} +79 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1668 -1625
- package/dist/index.js.map +1 -1
- package/dist/{kanban-presentation-C21WIlnn.d.ts → kanban-presentation-DnZgAsZo.d.ts} +1 -1
- package/dist/navigation-tree-registry-CIwRvLFJ.js +120 -0
- package/dist/navigation-tree-registry-CIwRvLFJ.js.map +1 -0
- package/dist/react-vsxj0hQ2.js +10718 -0
- package/dist/react-vsxj0hQ2.js.map +1 -0
- package/dist/react.d.ts +53 -12
- package/dist/react.js +2 -2
- package/dist/storage.d.ts +1 -1
- package/dist/webview-runtime.js +1 -1
- package/dist/{workbench-renderers-CUHzLWMx.js → workbench-renderers-Bj4sazP5.js} +94 -36
- package/dist/workbench-renderers-Bj4sazP5.js.map +1 -0
- package/package.json +4 -4
- package/dist/navigation-tree-registry-DkJ3i8ym.js +0 -106
- package/dist/navigation-tree-registry-DkJ3i8ym.js.map +0 -1
- package/dist/react-B-rd34kK.js +0 -9750
- package/dist/react-B-rd34kK.js.map +0 -1
- package/dist/workbench-renderers-CUHzLWMx.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-renderers-Bj4sazP5.js","names":["Disposable","dispose","createDisposable","onDispose","disposed","runWorkbenchEffect","owner","effect","Result","error","console","undefined","runWorkbenchEffect","depth","pending","Map","notifyWorkbenchChange","owner","notify","has","set","batchWorkbenchChanges","commit","Result","size","entries","next","value","delete","devtools","NamedSet","createStore","StoreApi","notifyWorkbenchChange","WorkbenchStoreSelector","state","TState","TValue","WorkbenchStoreListener","previousState","WorkbenchStoreSelectorListener","value","previousValue","WorkbenchStore","getState","getInitialState","subscribe","listener","subscribeSelector","selector","options","equalityFn","left","right","fireImmediately","InternalWorkbenchStore","setState","api","CreateWorkbenchStoreInput","name","initialState","defaultEquality","Object","is","createWorkbenchStore","input","owner","_state","previous","nextValue","workbenchRegions","const","WorkbenchRegion","workbenchPanelRegions","WorkbenchPanelRegion","WorkbenchPanelMenuSide","workbenchPanelMenuRegions","main","left","right","secondary","side","Record","WorkbenchPanelMenuRegion","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","resolveUniqueWidgetId","widgetIds","ReadonlySet","contributionId","preferredId","has","suffix","buildUpdatedPlacement","createPlacement","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchRegion","WorkbenchRegionState","WorkbenchWidgetPlacement","workbenchPanelRegions","resolveUniqueWidgetId","findPlacement","layout","contributionId","region","Object","values","regions","index","widgets","findIndex","candidate","regionId","id","placement","undefined","findResourcePlacement","resourceKey","findPlacementByWidgetId","widgetId","createUniqueWidgetId","widgetIds","Set","flatMap","map","getActivePlacement","find","activeWidgetId","isLocationPlacement","role","locationWorkspaceKey","setLocationSubPanelSelection","location","key","current","locationSubPanelSelections","next","removeLocationSubPanelSelection","fromEntries","entries","selections","filter","selectedId","getActiveLocationPlacement","locations","activeLocationWidgetId","at","ReplaceRegionWidgetsOptions","clearActiveWidget","replaceRegionWidgets","update","options","some","p","r","removePlacementsForContribution","nextLayout","removed","filtered","length","hasActiveWidget","startsWith","activeResourceKey","closeWidgetInLayout","found","closingEffectiveActive","fallbackSubPanel","ownerResourceKey","nextActivePlacement","nextRegion","includes","closedPlacement","activePlacement","activateInLayout","panel","resource","panelRegion","selected","withSelection","selectRegionActiveWidget","Error","followsRegion","resourceKey","ResourceRef","getActiveLocationPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchWidgetPlacement","supportsResource","widget","resource","resourceKinds","length","includes","type","canOpen","getActiveWorkbenchSubPanel","layout","region","options","ignoreOwnerResourceKey","panel","regions","widgets","find","placement","widgetId","activeWidgetId","role","ownerResourceKey","getActiveWorkbenchLocationPanel","matchesLocationEligibility","modeId","location","eligibleLocations","matchesWorkbenchModeEligibility","resourceIds","id","canOpenLocation","viewId","eligibleModeIds","modeIds","undefined","isWorkbenchPanelPlacementVisible","ignoreResourceLocation","matchesWorkbenchPanelMenuOwner","context","locationPanel","subPanel","owner","panelMenuOwner","level","contributionId","activeOwner","ContributionSource","ContributionMetadata","source","ownerId","priority","RegisteredContributionMetadata","defaultContributionOwnerId","normalizeContributionMetadata","metadata","byContributionPriority","left","right","localeCompare","OpenWidgetInput","OpenWorkbenchPanelInput","RegisteredWidgetContribution","WorkbenchPanelContribution","WorkbenchPanelInstance","WorkbenchTabRetention","WorkbenchWidgetPlacement","toOpenWidgetInput","input","defaultTabRetention","strategy","shared","normalized","resource","viewId","undefined","tabRetention","kind","tabPosition","position","replaceActive","replaceWidgetId","instanceId","retention","toPanelInstance","placement","widgetId","panelId","contributionId","placementIdentity","ownerId","source","section","resourceKey","ownerResourceKey","title","pinned","closable","mountStrategy","hiddenByDefault","tab","toPanelContribution","widget","_closable","ownedPanelMenuIds","_ownedPanelMenuIds","panel","Disposable","runWorkbenchEffect","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchRegion","WorkbenchWidgetPlacement","workbenchPanelRegions","WorkbenchModeActivationContext","WorkbenchModeContribution","modePanelRegions","main","secondary","side","const","Record","allModeRegions","Object","values","flat","panelsForMode","mode","panels","getWorkbenchModePanelForRegion","region","keys","find","panel","some","candidate","isWorkbenchModePanelAvailable","includes","placementById","layout","widgetId","undefined","regions","flatMap","widgets","placement","withActivePlacement","candidates","active","activeWidgetId","activeResourceKey","resourceKey","clearRegions","regionIds","length","clearedPanels","Set","filter","regionsNeedClearing","regionId","visible","selectionsNeedClearing","locationSubPanelSelections","selections","has","fromEntries","entries","map","next","activeLocationWidgetId","applyModePanelAvailability","available","unavailableRegions","restoreUnscopedModeLayout","current","saved","role","withoutModeContent","merged","savedActive","currentActive","disposeReverse","disposables","index","dispose","restoreModeLayout","context","getLayout","restoreLayout","PlacementIdentity","WorkbenchRegion","workbenchRegions","ResolvedOwnedPlacement","identity","region","order","value","Value","ComposeOwnedPlacementsInput","shell","mode","page","closed","ComposedOwnedPlacements","placements","regions","Record","visibleRegions","ReadonlySet","OwnedPlacementUpdate","current","desired","OwnedPlacementReconciliation","add","retain","update","activate","remove","ReconcileOwnedPlacementsInput","valuesEqual","compareText","left","right","placementOwnerSortKey","kind","placementId","modeId","pageId","slotId","placementIdentityKey","JSON","stringify","instanceKey","comparePlacementIdentity","owner","compareRegionPlacement","assertOwner","placement","label","toUpperCase","slice","Error","collectPlacements","input","seen","Set","candidates","candidate","Number","isFinite","key","has","push","modeIds","map","pageIds","size","emptyRegions","reduce","composeOwnedPlacements","declared","closedKeys","sort","flatMap","filter","length","indexPlacements","indexed","Map","set","placementShapeEqual","reconcileOwnedPlacements","desiredPlacement","currentPlacement","get","activationKeys","Array","from","ContextKeyService","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","CommandRegistry","NavigationTarget","Keybinding","sourceExtensionId","action","keybinding","KeybindingSequence","when","RegisteredKeybinding","KeybindingRegistryDeps","commands","context","KeybindingRegistryStoreState","keybindings","KeybindingRegistry","store","registerKeybinding","metadata","listKeybindings","listActiveKeybindings","listCommandKeybindings","commandId","getKeybindingSteps","Array","isArray","trim","split","filter","Boolean","normalizeKeybindingSequence","steps","length","createKeybindingRegistry","deps","name","initialState","kind","getCommand","Error","record","snapshot","getState","setState","current","next","candidate","sort","matches","flatMap","WorkbenchRegion","workbenchRegions","AnchorId","AnchorPersistence","AnchorCandidates","AnchorReadId","AnchorSurface","role","anchor","persistence","candidates","ProjectionSurface","reads","navigator","ChromeSurface","TransientSurface","SurfaceDescriptor","projection","chrome","transient","surfaceMap","Record","nav","activity","sidenav","main","secondary","status","overlay","side","getSurface","region","listAnchorRegions","filter","listProjectionRegions","listProjectionsReading","anchorId","surface","includes","resolveAnchorRegion","find","candidate","Error","ResourceRef","getActiveLocationPlacement","getActivePlacement","WorkbenchLayout","WorkbenchRegion","AnchorId","getSurface","listAnchorRegions","resolveAnchorRegion","getAnchorResource","layout","anchorId","active","regions","resource","location","role","undefined","AnchorReconcileAction","region","widgetId","action","ReconcileAnchorsInput","primary","isInScope","reconcileAnchors","actions","surface","persistence","placement","widgets","retained","Boolean","ownerResourceKey","keep","push","MenuPath","headerLeadingMenuPath","region","headerTrailingMenuPath","workbenchRegionTabLeadingMenuPath","workbenchRegionTabAddMenuPath","workbenchCommandPaletteMenuPath","const","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","workbenchBreadcrumbLocationMenuPath","resourceContextMenuPath","resourceKind","NavigationTarget","stableValue","value","Array","isArray","map","Object","fromEntries","entries","sort","a","b","localeCompare","key","item","getNavigationTargetKey","action","kind","args","keys","length","_args","target","JSON","stringify","TreeNode","ResourceRef","NavigationTreeContribution","sources","WeakMap","contribution","registryToken","node","resource","setNavigationTreeNodeSource","source","NonNullable","ReturnType","getNavigationTreeNodeSource","set","get","undefined","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","const","StandardResourceIcon","ResourceRef","resourceKey","createDisposable","createWorkbenchStore","ResourceChange","label","removed","ResourcePreviewChanges","ReadonlyMap","resource","change","resolveResourcePreview","changes","result","intent","values","undefined","createResourcePreview","store","name","initialState","Map","writes","Promise","refreshers","Set","remove","token","getState","delete","setState","resolve","persist","save","T","key","pending","get","catch","then","set","finally","subscribeRefresh","refresh","add","begin","Symbol","rollback","commit","allSettled","map","resourceKey","ResourceRef","WorkbenchViewHierarchyNode","type","viewId","label","icon","WorkbenchHierarchyNode","isWorkbenchViewHierarchyNode","node","ResourceHierarchyProvider","id","priority","canResolve","resource","getParent","ResolvedResourceHierarchyProvider","Required","resourceHierarchyCycleCode","ResourceHierarchyCycle","code","path","repeatedUri","sortHierarchyProviders","providers","sort","left","right","localeCompare","walkResourceHierarchy","notifyCycle","cycle","sorted","visitedKeys","Set","current","provider","find","candidate","parent","parentKey","has","unshift","add","PlacementIdentity","ResourceRef","createResourcePreview","resourceKey","ContextKeyValue","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","isWorkbenchViewHierarchyNode","ResolvedResourceHierarchyProvider","ResourceHierarchyCycle","ResourceHierarchyProvider","sortHierarchyProviders","WorkbenchHierarchyNode","walkResourceHierarchy","WorkbenchViewHierarchyNode","resourceHierarchyCycleCode","workbenchResourceTypeContextKey","workbenchResourceOwnerContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","key","workbenchSelectionResourceKeyMetadataKey","isContextPrimitive","value","Exclude","createWorkbenchResourceContextValues","resource","values","Record","type","id","extensionId","Object","entries","metadata","isWorkbenchResourceContextKey","startsWith","scopeWorkbenchResourceContextValues","scoped","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceKeys","selectionResourceKey","ResourceKindContribution","kind","label","icon","RegisteredResourceKind","ResourceBrowseEntry","searchText","description","group","order","activate","Promise","ResourceListContext","primary","ResourceProvider","list","query","context","ResourceRegistryStoreState","kinds","providers","hierarchyProviders","ResourceRegistry","preview","ReturnType","removed","onWillRemove","listener","store","registerKind","getKind","listKinds","registerProvider","provider","listProviders","listResources","registerHierarchyProvider","listHierarchyProviders","walkHierarchy","onDidDetectHierarchyCycle","cycle","CreateResourceRegistryInput","remove","retained","getPrimary","resolveView","viewId","createResourceRegistry","input","removalListeners","Set","cycleListeners","name","initialState","flatMap","add","delete","snapshot","getState","Error","record","setState","current","_removed","rest","sort","push","priority","path","map","node","view","WorkbenchPanelInstance","placementIdentityKey","rendererReadKey","placement","lane","JSON","stringify","placementIdentity","instanceId","settleReadBatch","tasks","signal","AbortSignal","Promise","T","controller","AbortController","abort","reason","aborted","addEventListener","once","firstError","results","allSettled","map","load","throwIfAborted","error","undefined","result","status","value","removeEventListener","Disposable","createWorkbenchStore","WorkbenchStore","ContextKeyValue","ContextKeyStoreState","values","Record","ContextKeyScope","ownerId","set","key","value","get","delete","ContextKeyService","store","createScope","deleteOwner","snapshot","matches","expression","readComparisonValue","replace","matchesTerm","term","trimmed","trim","length","comparison","match","operator","rawValue","actual","expected","String","startsWith","slice","Boolean","matchesContextExpression","split","some","orClause","every","createContextKeyService","name","initialState","globalValues","ownerValues","Map","buildValues","scopedValues","Object","assign","publish","action","setState","getState","_removed","rest","disposed","assertActive","Error","dispose","NotificationRegistry","reportUserActionError","workbench","notifications","Pick","label","error","show","level","title","message","Error","String","runUserAction","run","WorkbenchCore","WorkbenchRenderers","renderersByWorkbench","WeakMap","setWorkbenchRenderers","workbench","renderers","set","getWorkbenchRenderers","get","Error","createDisposable","disposed","onDispose","runWorkbenchEffect","effect","error","owner","depth","pending","notifyWorkbenchChange","notify","batchWorkbenchChanges","commit","defaultEquality","left","right","createWorkbenchStore","api","createStore","devtools","input","subscribe","listener","previous","equalityFn","options","previousValue","selector","nextValue","state","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","resolveUniqueWidgetId","contributionId","widgetIds","preferredId","suffix","findPlacement","layout","index","candidate","findResourcePlacement","resourceKey","findPlacementByWidgetId","widgetId","createUniqueWidgetId","placement","getActivePlacement","isLocationPlacement","locationWorkspaceKey","setLocationSubPanelSelection","location","key","next","removeLocationSubPanelSelection","locationSubPanelSelections","selections","selectedId","getActiveLocationPlacement","locations","replaceRegionWidgets","regionId","widgets","update","activeWidgetId","p","r","removePlacementsForContribution","nextLayout","removed","filtered","hasActiveWidget","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","nextRegion","activeLocationWidgetId","activateInLayout","regions","id","panel","panelRegion","selected","withSelection","selectRegionActiveWidget","followsRegion","supportsResource","widget","resource","getActiveWorkbenchSubPanel","getActiveWorkbenchLocationPanel","matchesLocationEligibility","eligibleLocations","matchesWorkbenchModeEligibility","modeId","eligibleModeIds","isWorkbenchPanelPlacementVisible","matchesWorkbenchPanelMenuOwner","context","defaultContributionOwnerId","normalizeContributionMetadata","metadata","byContributionPriority","toOpenWidgetInput","shared","normalized","strategy","defaultTabRetention","toPanelInstance","toPanelContribution","_closable","_ownedPanelMenuIds","modePanelRegions","allModeRegions","panelsForMode","mode","getWorkbenchModePanelForRegion","isWorkbenchModePanelAvailable","placementById","withActivePlacement","active","candidates","clearRegions","regionIds","clearedPanels","regionsNeedClearing","selectionsNeedClearing","applyModePanelAvailability","available","panels","restoreUnscopedModeLayout","saved","current","withoutModeContent","merged","disposeReverse","disposables","restoreModeLayout","compareText","placementOwnerSortKey","identity","placementIdentityKey","comparePlacementIdentity","compareRegionPlacement","assertOwner","label","collectPlacements","placements","seen","add","modeIds","pageIds","emptyRegions","composeOwnedPlacements","declared","closedKeys","closed","indexPlacements","indexed","placementShapeEqual","desired","valuesEqual","reconcileOwnedPlacements","retain","remove","desiredPlacement","currentPlacement","activationKeys","activate","getKeybindingSteps","keybinding","normalizeKeybindingSequence","steps","createKeybindingRegistry","store","deps","record","snapshot","anchor","projection","navigator","surfaceMap","getSurface","listAnchorRegions","resolveAnchorRegion","surface","anchorId","getAnchorResource","reconcileAnchors","actions","keep","isInScope","primary","headerLeadingMenuPath","headerTrailingMenuPath","workbenchRegionTabLeadingMenuPath","workbenchRegionTabAddMenuPath","workbenchCommandPaletteMenuPath","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","workbenchBreadcrumbLocationMenuPath","resourceContextMenuPath","resourceKind","stableValue","value","a","b","item","getNavigationTargetKey","action","_args","target","sources","setNavigationTreeNodeSource","node","source","getNavigationTreeNodeSource","registryToken","standardResourceIcons","resolveResourcePreview","result","intent","changes","createResourcePreview","writes","refreshers","token","save","refresh","isWorkbenchViewHierarchyNode","resourceHierarchyCycleCode","sortHierarchyProviders","providers","walkResourceHierarchy","sorted","path","visitedKeys","parent","parentKey","workbenchResourceTypeContextKey","workbenchResourceOwnerContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceKeyMetadataKey","isContextPrimitive","createWorkbenchResourceContextValues","values","isWorkbenchResourceContextKey","scopeWorkbenchResourceContextValues","scoped","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceKeys","selectionResourceKey","createResourceRegistry","removalListeners","cycleListeners","kind","_removed","rest","provider","entries","query","cycle","view","rendererReadKey","lane","settleReadBatch","controller","abort","signal","firstError","results","tasks","load","readComparisonValue","matchesTerm","trimmed","term","comparison","operator","rawValue","actual","expected","matchesContextExpression","expression","orClause","createContextKeyService","globalValues","ownerValues","buildValues","scopedValues","publish","ownerId","assertActive","reportUserActionError","runUserAction","run","workbench","renderersByWorkbench","setWorkbenchRenderers","renderers","getWorkbenchRenderers"],"sources":["../src/core/shared/disposable.ts","../src/core/shared/workbench-effect.ts","../src/core/shared/store/workbench-batch.ts","../src/core/shared/store/workbench-store.ts","../src/core/registries/layout/layout-regions.ts","../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/panel-widget-eligibility.ts","../src/core/shared/contributions/metadata.ts","../src/core/registries/layout/panel-api.ts","../src/core/registries/modes/mode-layout.ts","../src/core/registries/layout/placement-reconciliation.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/layout/surface-map.ts","../src/core/registries/layout/surface-reconcile.ts","../src/core/registries/menus/workbench-menu-paths.ts","../src/core/registries/navigation/navigation-target-key.ts","../src/core/registries/navigation/navigation-tree-node-source.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/resources/resource-preview.ts","../src/core/registries/resources/resource-hierarchy.ts","../src/core/registries/resources/resource-registry.ts","../src/core/registries/views/renderer-read-key.ts","../src/core/registries/views/settle-read-batch.ts","../src/core/shared/context/context-key-service.ts","../src/core/shared/run-user-action.ts","../src/core/workbench-renderers.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","/** Host effects run after state commits. A failed effect must not interrupt other owners. */\nexport function runWorkbenchEffect<Result>(owner: string, effect: () => Result) {\n try {\n return effect();\n } catch (error) {\n console.error(`Workbench effect failed (${owner})`, error);\n return undefined;\n }\n}\n","import { runWorkbenchEffect } from \"../workbench-effect\";\n\nlet depth = 0;\nconst pending = new Map<object, () => void>();\n\nexport const notifyWorkbenchChange = (owner: object, notify: () => void) => {\n if (depth === 0) {\n runWorkbenchEffect(\"store subscriber\", notify);\n return;\n }\n if (!pending.has(owner)) pending.set(owner, notify);\n};\n\n/** Commit related stores before their subscribers read the resulting workbench state. */\nexport const batchWorkbenchChanges = <Result>(commit: () => Result) => {\n depth++;\n try {\n return commit();\n } finally {\n depth--;\n if (depth === 0) {\n depth++;\n try {\n while (pending.size) {\n const [owner, notify] = pending.entries().next().value!;\n pending.delete(owner);\n runWorkbenchEffect(\"store subscriber\", notify);\n }\n } finally {\n depth--;\n }\n }\n }\n};\n","import { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\nimport { notifyWorkbenchChange } from \"./workbench-batch\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribe: WorkbenchStore<TState>[\"subscribe\"] = (listener) => {\n const owner = {};\n return api.subscribe((_state, previous) => notifyWorkbenchChange(owner, () => listener(api.getState(), previous)));\n };\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","export const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n","export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","export { buildUpdatedPlacement, createPlacement } from \"./widget-placement\";\n\nimport type {\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionState,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { workbenchPanelRegions } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceKey: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceKey === resourceKey,\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const createUniqueWidgetId = (layout: WorkbenchLayout, contributionId: string) => {\n const widgetIds = new Set(\n Object.values(layout.regions).flatMap((region) => region.widgets.map((placement) => placement.widgetId)),\n );\n return resolveUniqueWidgetId(widgetIds, contributionId);\n};\nexport const getActivePlacement = (region: WorkbenchRegionState) =>\n region.widgets.find((placement) => placement.widgetId === region.activeWidgetId) ?? region.widgets[0];\nconst isLocationPlacement = (placement: WorkbenchWidgetPlacement) => placement.role === \"location\";\nexport const locationWorkspaceKey = (placement: WorkbenchWidgetPlacement) =>\n placement.resourceKey ?? `${placement.contributionId}:${placement.widgetId}`;\nexport const setLocationSubPanelSelection = (\n layout: WorkbenchLayout,\n location: WorkbenchWidgetPlacement | undefined,\n region: WorkbenchPanelRegion,\n widgetId: string | undefined,\n) => {\n if (!location) return layout;\n const key = locationWorkspaceKey(location);\n const current = layout.locationSubPanelSelections?.[key] ?? {};\n const next = { ...current };\n if (widgetId) next[region] = widgetId;\n else delete next[region];\n return {\n ...layout,\n locationSubPanelSelections: {\n ...layout.locationSubPanelSelections,\n [key]: next,\n },\n };\n};\nexport const removeLocationSubPanelSelection = (layout: WorkbenchLayout, widgetId: string) => {\n if (!layout.locationSubPanelSelections) return layout;\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections).map(([key, selections]) => [\n key,\n Object.fromEntries(Object.entries(selections).filter(([, selectedId]) => selectedId !== widgetId)),\n ]),\n ) as WorkbenchLayout[\"locationSubPanelSelections\"];\n return { ...layout, locationSubPanelSelections };\n};\nexport const getActiveLocationPlacement = (layout: WorkbenchLayout) => {\n const locations = Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .filter(isLocationPlacement);\n return locations.find((placement) => placement.widgetId === layout.activeLocationWidgetId) ?? locations.at(-1);\n};\ninterface ReplaceRegionWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\nexport const replaceRegionWidgets = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceRegionWidgetsOptions = {},\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n const widgets = update(region.widgets);\n const activeWidgetId = options.activeWidgetId ?? (options.clearActiveWidget ? undefined : region.activeWidgetId);\n return {\n ...layout,\n activeLocationWidgetId:\n region.widgets.some((p) => p.widgetId === layout.activeLocationWidgetId) &&\n !widgets.some((placement) => placement.widgetId === layout.activeLocationWidgetId)\n ? Object.values(layout.regions)\n .flatMap((r) => (r.id === regionId ? widgets : r.widgets))\n .filter(isLocationPlacement)\n .at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, widgets, activeWidgetId },\n },\n };\n};\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter((placement) => placement.contributionId === contributionId);\n const filtered = region.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === region.widgets.length) continue;\n const activeWidgetId =\n region.activeWidgetId && !filtered.some((placement) => placement.widgetId === region.activeWidgetId)\n ? undefined\n : region.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n regions: {\n ...nextLayout.regions,\n [region.id]: { ...region, widgets: filtered, activeWidgetId },\n },\n };\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n const hasActiveWidget = Object.values(nextLayout.regions).some((region) =>\n region.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n if (nextLayout.activeLocationWidgetId && !findPlacementByWidgetId(nextLayout, nextLayout.activeLocationWidgetId)) {\n nextLayout = {\n ...nextLayout,\n activeLocationWidgetId: getActiveLocationPlacement(nextLayout)?.widgetId,\n };\n }\n return nextLayout;\n};\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n const region = layout.regions[found.regionId];\n const widgets = region.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = region.activeWidgetId === widgetId || (!region.activeWidgetId && found.index === 0);\n const fallbackSubPanel =\n found.placement.role === \"sub-panel\"\n ? widgets.find(\n (placement) =>\n placement.role === \"sub-panel\" && placement.ownerResourceKey === found.placement.ownerResourceKey,\n )\n : undefined;\n const nextActivePlacement =\n fallbackSubPanel ??\n (found.placement.role === \"sub-panel\" ? widgets.find(isLocationPlacement) : undefined) ??\n widgets[found.index] ??\n widgets[found.index - 1];\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : region.activeWidgetId;\n const nextRegion = { ...region, widgets, activeWidgetId };\n let activeLocationWidgetId = layout.activeLocationWidgetId;\n if (layout.activeWidgetId === widgetId && nextActivePlacement?.role === \"location\") {\n activeLocationWidgetId = nextActivePlacement.widgetId;\n } else if (activeLocationWidgetId === widgetId) {\n activeLocationWidgetId = Object.values(layout.regions)\n .flatMap((r) => r.widgets)\n .filter((placement) => placement.widgetId !== widgetId && isLocationPlacement(placement))\n .at(-1)?.widgetId;\n }\n let nextLayout: WorkbenchLayout = removeLocationSubPanelSelection(\n {\n ...layout,\n activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [region.id]: nextRegion,\n },\n },\n widgetId,\n );\n if (\n closingEffectiveActive &&\n found.regionId !== \"side\" &&\n workbenchPanelRegions.includes(found.regionId as WorkbenchPanelRegion)\n ) {\n nextLayout = setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n found.regionId as WorkbenchPanelRegion,\n nextActivePlacement?.role === \"sub-panel\" ? nextActivePlacement.widgetId : undefined,\n );\n }\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceKey: nextActivePlacement?.resourceKey,\n };\n }\n return {\n regionId: found.regionId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextRegion),\n layout: nextLayout,\n };\n};\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n if (isLocationPlacement(placement)) {\n const selections = layout.locationSubPanelSelections?.[locationWorkspaceKey(placement)] ?? {};\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([id, panel]) => [\n id,\n {\n ...panel,\n widgets: panel.widgets.map((candidate) => {\n if (!placement.resource || candidate.widgetId === placement.widgetId) return candidate;\n if (candidate.ownerResourceKey !== placement.resourceKey) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, resource: placement.resource };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n for (const panelRegion of workbenchPanelRegions) {\n const panel = regions[panelRegion];\n const selectedId = selections[panelRegion];\n const selected = panel.widgets.find(\n (candidate) =>\n candidate.widgetId === selectedId &&\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceKey || candidate.ownerResourceKey === placement.resourceKey),\n );\n regions[panelRegion] = {\n ...panel,\n activeWidgetId:\n panelRegion === \"side\" && panelRegion !== regionId\n ? panel.activeWidgetId\n : (selected?.widgetId ?? (panelRegion === regionId ? placement.widgetId : undefined)),\n };\n }\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: placement.widgetId,\n activeResourceKey: placement.resourceKey,\n regions,\n };\n }\n const withSelection =\n placement.role === \"sub-panel\" &&\n regionId !== \"side\" &&\n workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n layout,\n getActiveLocationPlacement(layout),\n regionId as WorkbenchPanelRegion,\n placement.widgetId,\n )\n : layout;\n return {\n ...withSelection,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: layout.activeLocationWidgetId,\n activeResourceKey: placement.resourceKey,\n regions: {\n ...withSelection.regions,\n [regionId]: { ...region, activeWidgetId: placement.widgetId },\n },\n };\n};\n// Selects one widget as a region's active tab. In main the selected Location tab is the\n// active Location: panel menus, Sub Panel selections, and the primary resource all\n// follow it, so selecting a Location without moving it would leave them on the old\n// panel. Returns undefined when the selection is already current.\nexport const selectRegionActiveWidget = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n widgetId: string | undefined,\n) => {\n const region = layout.regions[regionId];\n const placement = widgetId ? region.widgets.find((candidate) => candidate.widgetId === widgetId) : undefined;\n if (widgetId && !placement) throw new Error(`Widget placement not found in ${regionId}: ${widgetId}`);\n if (region.activeWidgetId === widgetId) return undefined;\n const followsRegion = layout.activeWidgetId === region.activeWidgetId;\n const nextLayout: WorkbenchLayout = {\n ...layout,\n activeWidgetId: followsRegion ? placement?.widgetId : layout.activeWidgetId,\n activeResourceKey: followsRegion ? placement?.resourceKey : layout.activeResourceKey,\n activeLocationWidgetId: placement?.role === \"location\" ? placement.widgetId : layout.activeLocationWidgetId,\n regions: { ...layout.regions, [regionId]: { ...region, activeWidgetId: placement?.widgetId } },\n };\n if (regionId === \"side\" || !workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) return nextLayout;\n return setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n regionId as WorkbenchPanelRegion,\n placement?.role === \"sub-panel\" ? placement.widgetId : undefined,\n );\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActiveLocationPlacement } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nconst supportsResource = (widget: RegisteredWidgetContribution, resource: ResourceRef | undefined) => {\n if (widget.resourceKinds?.length && (!resource || !widget.resourceKinds.includes(resource.type))) return false;\n if (widget.canOpen && (!resource || !widget.canOpen(resource))) return false;\n return true;\n};\nexport const getActiveWorkbenchSubPanel = (\n layout: WorkbenchLayout,\n region: WorkbenchPanelRegion,\n resource: ResourceRef | undefined,\n options: {\n ignoreOwnerResourceKey?: boolean;\n } = {},\n) => {\n const panel = layout.regions[region];\n return panel.widgets.find(\n (placement) =>\n placement.widgetId === panel.activeWidgetId &&\n placement.role === \"sub-panel\" &&\n (options.ignoreOwnerResourceKey ||\n !placement.ownerResourceKey ||\n placement.ownerResourceKey === resourceKey(resource)),\n );\n};\nexport const getActiveWorkbenchLocationPanel = (layout: WorkbenchLayout) => getActiveLocationPlacement(layout);\nconst matchesLocationEligibility = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n location?: WorkbenchWidgetPlacement,\n) => {\n const eligibleLocations = widget.eligibleLocations;\n if (!matchesWorkbenchModeEligibility(widget, modeId)) return false;\n if (\n eligibleLocations?.resourceKinds?.length &&\n (!resource || !eligibleLocations.resourceKinds.includes(resource.type))\n ) {\n return false;\n }\n if (\n eligibleLocations?.resourceIds?.length &&\n (!resource?.id || !eligibleLocations.resourceIds.includes(resource.id))\n ) {\n return false;\n }\n if (eligibleLocations?.canOpen && (!resource || !eligibleLocations.canOpen(resource))) return false;\n if (\n eligibleLocations?.canOpenLocation &&\n !eligibleLocations.canOpenLocation({ resource, viewId: location?.viewId })\n ) {\n return false;\n }\n if (placement?.ownerResourceKey && placement.ownerResourceKey !== resourceKey(resource)) return false;\n return true;\n};\nexport const matchesWorkbenchModeEligibility = (widget: RegisteredWidgetContribution, modeId: string | undefined) => {\n const eligibleModeIds = widget.eligibleLocations?.modeIds;\n return !eligibleModeIds?.length || (modeId !== undefined && eligibleModeIds.includes(modeId));\n};\nexport const isWorkbenchPanelPlacementVisible = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n options: {\n ignoreResourceLocation?: boolean;\n location?: WorkbenchWidgetPlacement;\n } = {},\n) => {\n if (!supportsResource(widget, placement?.resource ?? resource)) return false;\n if (options.ignoreResourceLocation) return matchesWorkbenchModeEligibility(widget, modeId);\n return matchesLocationEligibility(widget, resource, modeId, placement, options.location);\n};\nexport const matchesWorkbenchPanelMenuOwner = (\n widget: RegisteredWidgetContribution,\n context: {\n locationPanel?: WorkbenchWidgetPlacement;\n subPanel?: WorkbenchWidgetPlacement;\n },\n) => {\n const owner = widget.panelMenuOwner ?? { level: \"panel\" };\n if (owner.contributionId) {\n const activeOwner = context.subPanel ?? context.locationPanel;\n return activeOwner?.contributionId === owner.contributionId;\n }\n if (context.subPanel) {\n return owner.level === \"sub-panel\";\n }\n if (owner.level === \"panel\") {\n return true;\n }\n return false;\n};\n","export type ContributionSource = \"module\" | \"extension\";\n\nexport interface ContributionMetadata {\n source?: ContributionSource;\n ownerId?: string;\n priority?: number;\n}\n\nexport interface RegisteredContributionMetadata {\n source: ContributionSource;\n ownerId: string;\n priority: number;\n}\n\nconst defaultContributionOwnerId = \"workbench.core\";\n\nexport const normalizeContributionMetadata = (metadata: ContributionMetadata = {}) => ({\n source: metadata.source ?? \"module\",\n ownerId: metadata.ownerId ?? defaultContributionOwnerId,\n priority: metadata.priority ?? 0,\n});\n\nexport const byContributionPriority = (left: RegisteredContributionMetadata, right: RegisteredContributionMetadata) =>\n right.priority - left.priority || left.ownerId.localeCompare(right.ownerId);\n","import type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n RegisteredWidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchTabRetention,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\n// Without a `defaultTabRetention` the retention of an existing placement is left alone,\n// so updating a panel's title never promotes a preview tab.\nexport const toOpenWidgetInput = (\n input: OpenWorkbenchPanelInput = {},\n defaultTabRetention?: WorkbenchTabRetention,\n): OpenWidgetInput => {\n const { strategy, ...shared } = input;\n const normalized = shared.resource && shared.viewId === undefined ? { ...shared, viewId: null } : shared;\n if (!strategy) return { ...normalized, tabRetention: defaultTabRetention };\n if (strategy.kind === \"persistent\") {\n return { ...normalized, tabPosition: strategy.position, tabRetention: \"persistent\" };\n }\n if (strategy.kind === \"replace-active\") return { ...normalized, replaceActive: true };\n if (strategy.kind === \"replace-panel\") {\n return { ...normalized, replaceWidgetId: strategy.instanceId, tabRetention: strategy.retention };\n }\n return { ...normalized, tabRetention: \"preview\", tabPosition: strategy.position };\n};\n\nexport const toPanelInstance = (placement: WorkbenchWidgetPlacement): WorkbenchPanelInstance => ({\n instanceId: placement.widgetId,\n panelId: placement.contributionId,\n placementIdentity: placement.placementIdentity,\n viewId: placement.viewId,\n ownerId: placement.ownerId,\n source: placement.source,\n resource: placement.resource,\n section: placement.section,\n resourceKey: placement.resourceKey,\n ownerResourceKey: placement.ownerResourceKey,\n title: placement.title,\n pinned: placement.pinned,\n closable: placement.closable === true,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n tabRetention: placement.tabRetention,\n tab: placement.tab,\n});\n\nexport const toPanelContribution = (widget: RegisteredWidgetContribution): WorkbenchPanelContribution => {\n const { closable: _closable, ownedPanelMenuIds: _ownedPanelMenuIds, ...panel } = widget;\n return panel;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\nimport type { WorkbenchModeActivationContext, WorkbenchModeContribution } from \"./mode-registry-types\";\n\nconst modePanelRegions = {\n main: [\"main-header\", \"main-left-menu\", \"main\", \"main-right-menu\"],\n secondary: [\"secondary-header\", \"secondary-left-menu\", \"secondary\", \"secondary-right-menu\"],\n side: [\"side-header\", \"side-left-menu\", \"side\", \"side-right-menu\"],\n} as const satisfies Record<WorkbenchPanelRegion, readonly WorkbenchRegion[]>;\n\nconst allModeRegions = Object.values(modePanelRegions).flat();\n\nexport const panelsForMode = (mode: WorkbenchModeContribution) => mode.panels ?? workbenchPanelRegions;\n\nexport const getWorkbenchModePanelForRegion = (region: WorkbenchRegion) =>\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).find((panel) =>\n modePanelRegions[panel].some((candidate) => candidate === region),\n );\n\nexport const isWorkbenchModePanelAvailable = (\n mode: WorkbenchModeContribution | undefined,\n panel: WorkbenchPanelRegion,\n) => !mode || panelsForMode(mode).includes(panel);\n\nconst placementById = (layout: WorkbenchLayout, widgetId: string | undefined) => {\n if (!widgetId) return undefined;\n return Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === widgetId);\n};\n\nconst withActivePlacement = (\n layout: WorkbenchLayout,\n candidates: readonly (WorkbenchWidgetPlacement | undefined)[],\n) => {\n const active = candidates.find((placement) => placement && placementById(layout, placement.widgetId));\n return {\n ...layout,\n activeWidgetId: active?.widgetId,\n activeResourceKey: active?.resourceKey,\n };\n};\n\nconst clearRegions = (layout: WorkbenchLayout, regionIds: readonly WorkbenchRegion[]) => {\n if (regionIds.length === 0) return layout;\n const clearedPanels = new Set(\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).filter((panel) =>\n modePanelRegions[panel].some((region) => regionIds.includes(region)),\n ),\n );\n const regionsNeedClearing = regionIds.some((regionId) => {\n const region = layout.regions[regionId];\n return region.widgets.length > 0 || region.activeWidgetId !== undefined || region.visible;\n });\n const selectionsNeedClearing = Object.values(layout.locationSubPanelSelections ?? {}).some((selections) =>\n Object.keys(selections).some((panel) => clearedPanels.has(panel as WorkbenchPanelRegion)),\n );\n if (!regionsNeedClearing && !selectionsNeedClearing) return layout;\n\n const regions = { ...layout.regions };\n for (const regionId of regionIds) {\n regions[regionId] = { ...regions[regionId], widgets: [], activeWidgetId: undefined, visible: false };\n }\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections ?? {}).map(([resourceKey, selections]) => [\n resourceKey,\n Object.fromEntries(\n Object.entries(selections).filter(([panel]) => !clearedPanels.has(panel as WorkbenchPanelRegion)),\n ),\n ]),\n );\n const next = { ...layout, regions };\n return {\n ...withActivePlacement(next, [placementById(next, layout.activeWidgetId)]),\n activeLocationWidgetId: placementById(next, layout.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections,\n };\n};\n\nexport const applyModePanelAvailability = (layout: WorkbenchLayout, panels: readonly WorkbenchPanelRegion[]) => {\n const available = new Set(panels);\n const unavailableRegions = (Object.keys(modePanelRegions) as WorkbenchPanelRegion[])\n .filter((panel) => !available.has(panel))\n .flatMap((panel) => modePanelRegions[panel]);\n return clearRegions(layout, unavailableRegions);\n};\n\nexport const restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n) => {\n if (!saved) {\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) {\n const region = regions[regionId];\n const widgets = region.widgets.filter((placement) => placement.role !== \"content\");\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n const withoutModeContent = { ...current, regions };\n return applyModePanelAvailability(\n {\n ...withActivePlacement(withoutModeContent, [placementById(withoutModeContent, current.activeWidgetId)]),\n activeLocationWidgetId: placementById(withoutModeContent, current.activeLocationWidgetId)?.widgetId,\n },\n panels,\n );\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, regions }, panels);\n const savedActive = placementById(merged, saved.activeWidgetId);\n const currentActive = placementById(merged, current.activeWidgetId);\n return {\n ...withActivePlacement(merged, [savedActive, currentActive]),\n activeLocationWidgetId:\n placementById(merged, saved.activeLocationWidgetId)?.widgetId ??\n placementById(merged, current.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections: saved.locationSubPanelSelections,\n };\n};\n\nexport const disposeReverse = (disposables: readonly Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n runWorkbenchEffect(\"mode disposal\", () => disposables[index]?.dispose());\n }\n};\n\nexport const restoreModeLayout = (context: WorkbenchModeActivationContext, layout: WorkbenchLayout) => {\n if (layout !== context.layout.getLayout()) context.layout.restoreLayout(layout);\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\nexport interface ResolvedOwnedPlacement<Value = unknown> {\n identity: PlacementIdentity;\n region: WorkbenchRegion;\n order: number;\n value: Value;\n}\n\nexport interface ComposeOwnedPlacementsInput<Value> {\n shell: readonly ResolvedOwnedPlacement<Value>[];\n mode?: readonly ResolvedOwnedPlacement<Value>[];\n page?: readonly ResolvedOwnedPlacement<Value>[];\n closed?: readonly PlacementIdentity[];\n}\n\nexport interface ComposedOwnedPlacements<Value> {\n placements: readonly ResolvedOwnedPlacement<Value>[];\n closed: readonly ResolvedOwnedPlacement<Value>[];\n regions: Record<WorkbenchRegion, readonly ResolvedOwnedPlacement<Value>[]>;\n visibleRegions: ReadonlySet<WorkbenchRegion>;\n}\n\nexport interface OwnedPlacementUpdate<Value> {\n current: ResolvedOwnedPlacement<Value>;\n desired: ResolvedOwnedPlacement<Value>;\n}\n\nexport interface OwnedPlacementReconciliation<Value> {\n add: readonly ResolvedOwnedPlacement<Value>[];\n retain: readonly ResolvedOwnedPlacement<Value>[];\n update: readonly OwnedPlacementUpdate<Value>[];\n activate: readonly ResolvedOwnedPlacement<Value>[];\n remove: readonly ResolvedOwnedPlacement<Value>[];\n}\n\nexport interface ReconcileOwnedPlacementsInput<Value> {\n current: readonly ResolvedOwnedPlacement<Value>[];\n desired: readonly ResolvedOwnedPlacement<Value>[];\n activate?: readonly PlacementIdentity[];\n valuesEqual: (current: Value, desired: Value) => boolean;\n}\n\nconst compareText = (left: string, right: string) => {\n if (left < right) return -1;\n return left > right ? 1 : 0;\n};\n\nconst placementOwnerSortKey = (identity: PlacementIdentity) => {\n if (identity.kind === \"shell\") return `shell\\0${identity.placementId}`;\n if (identity.kind === \"mode\") return `mode\\0${identity.modeId}\\0${identity.placementId}`;\n return `page\\0${identity.pageId}\\0${identity.slotId}`;\n};\n\nexport const placementIdentityKey = (identity: PlacementIdentity) => {\n if (identity.kind === \"shell\") return JSON.stringify([\"shell\", identity.placementId, identity.instanceKey]);\n if (identity.kind === \"mode\") {\n return JSON.stringify([\"mode\", identity.modeId, identity.placementId, identity.instanceKey]);\n }\n return JSON.stringify([\"page\", identity.pageId, identity.slotId, identity.instanceKey]);\n};\n\nconst comparePlacementIdentity = (left: ResolvedOwnedPlacement<unknown>, right: ResolvedOwnedPlacement<unknown>) => {\n const owner = compareText(placementOwnerSortKey(left.identity), placementOwnerSortKey(right.identity));\n if (owner !== 0) return owner;\n return compareText(left.identity.instanceKey, right.identity.instanceKey);\n};\n\nconst compareRegionPlacement = (left: ResolvedOwnedPlacement<unknown>, right: ResolvedOwnedPlacement<unknown>) =>\n left.order - right.order || comparePlacementIdentity(left, right);\n\nconst assertOwner = (owner: PlacementIdentity[\"kind\"], placement: ResolvedOwnedPlacement<unknown>) => {\n if (placement.identity.kind === owner) return;\n const label = `${owner[0]?.toUpperCase()}${owner.slice(1)}`;\n throw new Error(`${label} placement must have a ${owner} owner`);\n};\n\nconst collectPlacements = <Value>(input: ComposeOwnedPlacementsInput<Value>) => {\n const placements: ResolvedOwnedPlacement<Value>[] = [];\n const seen = new Set<string>();\n const add = (owner: PlacementIdentity[\"kind\"], candidates: readonly ResolvedOwnedPlacement<Value>[]) => {\n for (const candidate of candidates) {\n assertOwner(owner, candidate);\n if (!Number.isFinite(candidate.order)) throw new Error(\"Placement order must be a finite number\");\n const key = placementIdentityKey(candidate.identity);\n if (seen.has(key)) throw new Error(`Duplicate placement identity: ${key}`);\n seen.add(key);\n placements.push(candidate);\n }\n };\n\n add(\"shell\", input.shell);\n add(\"mode\", input.mode ?? []);\n add(\"page\", input.page ?? []);\n const modeIds = new Set(\n (input.mode ?? []).map((placement) =>\n placement.identity.kind === \"mode\" ? placement.identity.modeId : \"invalid-mode-owner\",\n ),\n );\n const pageIds = new Set(\n (input.page ?? []).map((placement) =>\n placement.identity.kind === \"page\" ? placement.identity.pageId : \"invalid-page-owner\",\n ),\n );\n if (modeIds.size > 1) throw new Error(\"Mode placements must belong to one active mode\");\n if (pageIds.size > 1) throw new Error(\"Page placements must belong to one active page\");\n return placements;\n};\n\nconst emptyRegions = <Value>() =>\n workbenchRegions.reduce(\n (regions, region) => {\n regions[region] = [];\n return regions;\n },\n {} as Record<WorkbenchRegion, ResolvedOwnedPlacement<Value>[]>,\n );\n\nexport const composeOwnedPlacements = <Value>(\n input: ComposeOwnedPlacementsInput<Value>,\n): ComposedOwnedPlacements<Value> => {\n const declared = collectPlacements(input);\n const closedKeys = new Set((input.closed ?? []).map(placementIdentityKey));\n const closed: ResolvedOwnedPlacement<Value>[] = [];\n const regions = emptyRegions<Value>();\n\n for (const placement of declared) {\n if (closedKeys.has(placementIdentityKey(placement.identity))) {\n closed.push(placement);\n continue;\n }\n regions[placement.region].push(placement);\n }\n\n for (const region of workbenchRegions) regions[region].sort(compareRegionPlacement);\n closed.sort(comparePlacementIdentity);\n const placements = workbenchRegions.flatMap((region) => regions[region]);\n const visibleRegions = new Set(workbenchRegions.filter((region) => regions[region].length > 0));\n return { placements, closed, regions, visibleRegions };\n};\n\nconst indexPlacements = <Value>(placements: readonly ResolvedOwnedPlacement<Value>[]) => {\n const indexed = new Map<string, ResolvedOwnedPlacement<Value>>();\n for (const placement of placements) {\n const key = placementIdentityKey(placement.identity);\n if (indexed.has(key)) throw new Error(`Duplicate placement identity: ${key}`);\n indexed.set(key, placement);\n }\n return indexed;\n};\n\nconst placementShapeEqual = <Value>(\n current: ResolvedOwnedPlacement<Value>,\n desired: ResolvedOwnedPlacement<Value>,\n valuesEqual: (current: Value, desired: Value) => boolean,\n) => current.region === desired.region && current.order === desired.order && valuesEqual(current.value, desired.value);\n\nexport const reconcileOwnedPlacements = <Value>(\n input: ReconcileOwnedPlacementsInput<Value>,\n): OwnedPlacementReconciliation<Value> => {\n const current = indexPlacements(input.current);\n const desired = indexPlacements(input.desired);\n const add: ResolvedOwnedPlacement<Value>[] = [];\n const retain: ResolvedOwnedPlacement<Value>[] = [];\n const update: OwnedPlacementUpdate<Value>[] = [];\n const remove: ResolvedOwnedPlacement<Value>[] = [];\n\n for (const [key, desiredPlacement] of desired) {\n const currentPlacement = current.get(key);\n if (!currentPlacement) {\n add.push(desiredPlacement);\n } else if (placementShapeEqual(currentPlacement, desiredPlacement, input.valuesEqual)) {\n retain.push(desiredPlacement);\n } else {\n update.push({ current: currentPlacement, desired: desiredPlacement });\n }\n }\n for (const [key, currentPlacement] of current) if (!desired.has(key)) remove.push(currentPlacement);\n\n const activationKeys = new Set((input.activate ?? []).map(placementIdentityKey));\n const activate = Array.from(activationKeys, (key) => {\n const placement = desired.get(key);\n if (!placement) throw new Error(`Cannot activate missing placement: ${key}`);\n return placement;\n });\n\n add.sort(comparePlacementIdentity);\n retain.sort(comparePlacementIdentity);\n update.sort((left, right) => comparePlacementIdentity(left.desired, right.desired));\n activate.sort(comparePlacementIdentity);\n remove.sort(comparePlacementIdentity);\n return { add, retain, update, activate, remove };\n};\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\n\nexport interface Keybinding {\n /** Extension that authored this binding, when registered by an extension host. */\n sourceExtensionId?: string;\n /** Action the chord executes through the shared navigation executor. */\n action: NavigationTarget;\n keybinding: KeybindingSequence;\n when?: string;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n /** Chords bound to plain command actions, for rendering shortcut hints beside commands. */\n listCommandKeybindings(): { commandId: string; keybinding: KeybindingSequence }[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (keybinding.action.kind === \"command\" && !deps.commands.getCommand(keybinding.action.commandId)) {\n throw new Error(`Keybinding command not registered: ${keybinding.action.commandId}`);\n }\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n\n listCommandKeybindings() {\n return [...store.getState().keybindings]\n .sort(byContributionPriority)\n .flatMap((record) =>\n record.action.kind === \"command\"\n ? [{ commandId: record.action.commandId, keybinding: record.keybinding }]\n : [],\n );\n },\n };\n};\n","import { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\n// The surface map describes the *behavioural* role of each workbench region: which\n// regions host a resource (anchors), which render an anchor's resource (projections),\n// and which are frame chrome or the transient overlay layer. The project scope root is\n// not a surface; it is handled by the layout persistence scope.\n\n// Logical anchor identity, independent of the region id that currently hosts it.\nexport type AnchorId = \"primary\" | \"secondary\" | \"attached\";\n\n// Does an anchor's active selection survive a primary change?\n// - primary: the subject itself.\n// - derived: re-scopes/clears on primary change (terminals follow the workspace).\n// - detached: persists across primary navigation, but disconnects when the new\n// primary's scoped candidates no longer list it (scope wins).\nexport type AnchorPersistence = \"primary\" | \"derived\" | \"detached\";\n\n// What the anchor's quick-pick offers: everything, or filtered by primary.\nexport type AnchorCandidates = \"global\" | \"scoped\";\n\n// Which anchor(s) a projection renders.\nexport type AnchorReadId = AnchorId;\n\nexport interface AnchorSurface {\n role: \"anchor\";\n anchor: AnchorId;\n persistence: AnchorPersistence;\n candidates: AnchorCandidates;\n}\n\nexport interface ProjectionSurface {\n role: \"projection\";\n reads: AnchorReadId[];\n // The sidenav navigator both reads primary (highlight) and selects it (the picker).\n navigator?: boolean;\n}\n\nexport interface ChromeSurface {\n role: \"chrome\";\n}\n\nexport interface TransientSurface {\n role: \"transient\";\n}\n\nexport type SurfaceDescriptor = AnchorSurface | ProjectionSurface | ChromeSurface | TransientSurface;\n\nconst anchor = (anchor: AnchorId, persistence: AnchorPersistence, candidates: AnchorCandidates): AnchorSurface => ({\n role: \"anchor\",\n anchor,\n persistence,\n candidates,\n});\n\nconst projection = (reads: AnchorReadId[], navigator = false): ProjectionSurface =>\n navigator ? { role: \"projection\", reads, navigator } : { role: \"projection\", reads };\n\nconst chrome: ChromeSurface = { role: \"chrome\" };\nconst transient: TransientSurface = { role: \"transient\" };\n\nexport const surfaceMap: Record<WorkbenchRegion, SurfaceDescriptor> = {\n // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it\n // reads both anchors — it is a projection, not inert chrome.\n nav: projection([\"primary\", \"attached\"]),\n activity: chrome,\n sidenav: projection([\"primary\"], true),\n \"main-header\": projection([\"primary\"]),\n \"main-left-menu\": projection([\"primary\"]),\n main: anchor(\"primary\", \"primary\", \"global\"),\n \"main-right-menu\": projection([\"primary\"]),\n \"secondary-header\": projection([\"primary\"]),\n \"secondary-left-menu\": projection([\"secondary\"]),\n secondary: anchor(\"secondary\", \"derived\", \"scoped\"),\n \"secondary-right-menu\": projection([\"secondary\"]),\n status: projection([\"primary\", \"attached\"]),\n overlay: transient,\n \"side-header\": projection([\"attached\"]),\n \"side-left-menu\": projection([\"attached\"]),\n side: anchor(\"attached\", \"detached\", \"scoped\"),\n \"side-right-menu\": projection([\"attached\"]),\n};\n\nexport const getSurface = (region: WorkbenchRegion) => surfaceMap[region];\n\nexport const listAnchorRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"anchor\");\n\nexport const listProjectionRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"projection\");\n\nexport const listProjectionsReading = (anchorId: AnchorReadId) =>\n workbenchRegions.filter((region) => {\n const surface = surfaceMap[region];\n return surface.role === \"projection\" && surface.reads.includes(anchorId);\n });\n\n// Reverse lookup: which region currently hosts a given logical anchor.\nexport const resolveAnchorRegion = (anchorId: AnchorId) => {\n const region = workbenchRegions.find((candidate) => {\n const surface = surfaceMap[candidate];\n return surface.role === \"anchor\" && surface.anchor === anchorId;\n });\n if (!region) throw new Error(`No region hosts anchor: ${anchorId}`);\n return region;\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActiveLocationPlacement, 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 const active = getActivePlacement(layout.regions[resolveAnchorRegion(anchorId)]);\n if (anchorId !== \"primary\") return active?.resource;\n const location = getActiveLocationPlacement(layout);\n if (location) return location.resource;\n // Low-level host panels can establish a primary without an explicit role.\n // An auxiliary panel moved into Main cannot become that primary.\n return active?.role === \"sub-panel\" ? undefined : active?.resource;\n};\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; widgetId: string; 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 for (const placement of layout.regions[region].widgets) {\n if (!placement.resource) continue;\n // A moved Location and its owned Sub Panels retain their owner lifecycle.\n // Sharing a region with derived content cannot change that ownership.\n const retained =\n placement.role === \"location\" || (placement.role === \"sub-panel\" && Boolean(placement.ownerResourceKey));\n const keep = retained || (surface.persistence !== \"derived\" && isInScope(placement.resource, primary));\n actions.push({ region, widgetId: placement.widgetId, action: keep ? \"keep\" : \"clear\" });\n }\n }\n\n return actions;\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\n// Actions on the current location, such as copying its link. Resource row menus never show them,\n// because a row's location is not the current page.\nexport const workbenchBreadcrumbLocationMenuPath = [\"workbench\", \"breadcrumb\", \"location\"] as const satisfies MenuPath;\n\nexport const resourceContextMenuPath = (resourceKind: string): MenuPath => [\n \"workbench\",\n \"resource\",\n resourceKind,\n \"context\",\n];\n","import type { NavigationTarget } from \"./navigation-registry\";\n\n// Parameter order does not change the action, while array order changes compound navigation.\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => [key, stableValue(item)]),\n );\n }\n return value;\n};\n\nexport const getNavigationTargetKey = (action: NavigationTarget) => {\n if (\n action.kind === \"command\" &&\n action.args &&\n typeof action.args === \"object\" &&\n !Array.isArray(action.args) &&\n Object.keys(action.args).length === 0\n ) {\n const { args: _args, ...target } = action;\n return JSON.stringify(stableValue(target));\n }\n return JSON.stringify(stableValue(action));\n};\n","import type { TreeNode } from \"../renderers/tree-renderer-types\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { NavigationTreeContribution } from \"./navigation-tree-registry\";\n\nconst sources = new WeakMap<\n TreeNode,\n {\n contribution: NavigationTreeContribution;\n registryToken: object;\n node: TreeNode;\n resource?: ResourceRef;\n }\n>();\n\nexport const setNavigationTreeNodeSource = (\n node: TreeNode,\n source: NonNullable<ReturnType<typeof getNavigationTreeNodeSource>>,\n) => {\n sources.set(node, source);\n};\nexport const getNavigationTreeNodeSource = (node: TreeNode, registryToken?: object) => {\n const source = sources.get(node);\n return registryToken && source?.registryToken !== registryToken ? undefined : source;\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 ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\n\ntype ResourceChange = { label: string } | { removed: true };\n\nexport type ResourcePreviewChanges = ReadonlyMap<symbol, { resource: ResourceRef; change: ResourceChange }>;\n\nexport const resolveResourcePreview = (resource: ResourceRef, changes: ResourcePreviewChanges) => {\n let result: ResourceRef | undefined = resource;\n for (const intent of changes.values()) {\n if (resourceKey(intent.resource) !== resourceKey(resource)) continue;\n result = \"removed\" in intent.change ? undefined : { ...resource, label: intent.change.label };\n }\n return result;\n};\n\nexport const createResourcePreview = () => {\n const store = createWorkbenchStore<{ changes: ResourcePreviewChanges }>({\n name: \"workbench.resource-preview\",\n initialState: { changes: new Map() },\n });\n const writes = new Map<string, Promise<unknown>>();\n const refreshers = new Set<(resource: ResourceRef) => Promise<void>>();\n const remove = (token: symbol) => {\n const changes = new Map(store.getState().changes);\n changes.delete(token);\n store.setState({ changes });\n };\n return {\n store,\n resolve(resource: ResourceRef) {\n return resolveResourcePreview(resource, store.getState().changes);\n },\n persist<T>(resource: ResourceRef, save: () => Promise<T>): Promise<T> {\n const key = resourceKey(resource);\n const pending = (writes.get(key) ?? Promise.resolve()).catch(() => undefined).then(save);\n writes.set(key, pending);\n void pending\n .finally(() => {\n if (writes.get(key) === pending) writes.delete(key);\n })\n .catch(() => undefined);\n return pending;\n },\n subscribeRefresh(refresh: (resource: ResourceRef) => Promise<void>) {\n refreshers.add(refresh);\n return createDisposable(() => refreshers.delete(refresh));\n },\n begin(resource: ResourceRef, change: ResourceChange) {\n const token = Symbol(\"resource mutation\");\n store.setState({ changes: new Map([...store.getState().changes, [token, { resource, change }]]) });\n return {\n rollback: () => remove(token),\n async commit() {\n // Keep the preview through the authoritative reads, so old snapshots cannot flash back.\n await Promise.allSettled([...refreshers].map((refresh) => refresh(resource)));\n remove(token);\n },\n };\n },\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"./resource-registry\";\nexport interface WorkbenchViewHierarchyNode {\n type: \"view\";\n viewId: string;\n label?: string;\n icon?: string;\n}\nexport type WorkbenchHierarchyNode = ResourceRef | WorkbenchViewHierarchyNode;\nexport const isWorkbenchViewHierarchyNode = (node: WorkbenchHierarchyNode): node is WorkbenchViewHierarchyNode =>\n \"viewId\" in node && node.type === \"view\";\n// Hierarchy comes from resource identity: providers resolve a resource's parent,\n// and the walk below turns those edges into the root-to-leaf breadcrumb path.\nexport interface ResourceHierarchyProvider {\n id: string;\n priority?: number;\n canResolve(resource: ResourceRef): boolean;\n getParent(resource: ResourceRef): WorkbenchHierarchyNode | undefined;\n}\nexport type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;\nexport const resourceHierarchyCycleCode = \"resource_hierarchy_cycle\";\n// Emitted when parent resolution repeats a resource URI. Traversal keeps the\n// acyclic root-to-leaf prefix, so consumers such as breadcrumbs stay usable\n// while the faulty provider is diagnosed.\nexport interface ResourceHierarchyCycle {\n code: typeof resourceHierarchyCycleCode;\n path: WorkbenchHierarchyNode[];\n repeatedUri: string;\n}\nexport const sortHierarchyProviders = (providers: ResolvedResourceHierarchyProvider[]) =>\n [...providers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\nexport const walkResourceHierarchy = (\n providers: ResolvedResourceHierarchyProvider[],\n resource: ResourceRef,\n notifyCycle: (cycle: ResourceHierarchyCycle) => void,\n) => {\n const sorted = sortHierarchyProviders(providers);\n const path: WorkbenchHierarchyNode[] = [resource];\n const visitedKeys = new Set([`resource:${resourceKey(resource)}`]);\n let current = resource;\n while (true) {\n const provider = sorted.find((candidate) => candidate.canResolve(current));\n const parent = provider?.getParent(current);\n if (!parent) break;\n const parentKey = isWorkbenchViewHierarchyNode(parent)\n ? `view:${parent.viewId}`\n : `resource:${resourceKey(parent)}`;\n if (visitedKeys.has(parentKey)) {\n // A repeated URI means the providers formed a cycle. Keep the acyclic\n // prefix and surface the fault instead of looping or dropping the path.\n notifyCycle({\n code: resourceHierarchyCycleCode,\n path: [...path],\n repeatedUri: isWorkbenchViewHierarchyNode(parent) ? parentKey : resourceKey(parent),\n });\n break;\n }\n path.unshift(parent);\n visitedKeys.add(parentKey);\n if (isWorkbenchViewHierarchyNode(parent)) break;\n current = parent;\n }\n return path;\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createResourcePreview } from \"./resource-preview\";\n\nexport type { ResourceRef } from \"@pstdio/sdk/extensions\";\n\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n isWorkbenchViewHierarchyNode,\n type ResolvedResourceHierarchyProvider,\n type ResourceHierarchyCycle,\n type ResourceHierarchyProvider,\n sortHierarchyProviders,\n type WorkbenchHierarchyNode,\n walkResourceHierarchy,\n} from \"./resource-hierarchy\";\n\nexport type {\n ResolvedResourceHierarchyProvider,\n ResourceHierarchyCycle,\n ResourceHierarchyProvider,\n WorkbenchHierarchyNode,\n WorkbenchViewHierarchyNode,\n} from \"./resource-hierarchy\";\nexport { isWorkbenchViewHierarchyNode, resourceHierarchyCycleCode } from \"./resource-hierarchy\";\n\nexport const workbenchResourceTypeContextKey = \"workbench.resource.type\";\nexport const workbenchResourceOwnerContextKey = \"workbench.resource.extensionId\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceKeyMetadataKey = \"workbench.selectionResourceKey\";\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceTypeContextKey]: resource.type,\n [workbenchResourceIdContextKey]: resource.id,\n [workbenchResourceOwnerContextKey]: resource.extensionId,\n };\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n return values;\n};\nconst isWorkbenchResourceContextKey = (key: string) =>\n key === workbenchResourceTypeContextKey ||\n key === workbenchResourceOwnerContextKey ||\n key === workbenchResourceIdContextKey ||\n key.startsWith(workbenchResourceMetadataContextKey(\"\"));\n// A menu for one resource must not see the open page's resource keys. Otherwise a key\n// the resource leaves out would silently take the page's value.\nexport const scopeWorkbenchResourceContextValues = (\n values: Record<string, ContextKeyValue>,\n resource: ResourceRef | undefined,\n) => {\n const scoped: Record<string, ContextKeyValue> = {};\n for (const [key, value] of Object.entries(values)) {\n if (!isWorkbenchResourceContextKey(key)) scoped[key] = value;\n }\n return { ...scoped, ...createWorkbenchResourceContextValues(resource) };\n};\nexport const createWorkbenchSelectionResourceMetadata = (resource: ResourceRef) => ({\n [workbenchSelectionResourceKeyMetadataKey]: resourceKey(resource),\n});\nexport const getWorkbenchSelectionResourceKeys = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n const selectionResourceKey = resource.metadata?.[workbenchSelectionResourceKeyMetadataKey];\n if (typeof selectionResourceKey !== \"string\" || selectionResourceKey === resourceKey(resource))\n return [resourceKey(resource)];\n return [resourceKey(resource), selectionResourceKey];\n};\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n}\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n providers: Record<string, ResourceProvider>;\n hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;\n}\nexport interface ResourceRegistry {\n preview: ReturnType<typeof createResourcePreview>;\n removed(resource: ResourceRef): void;\n onWillRemove(listener: (resource: ResourceRef) => readonly PlacementIdentity[]): Disposable;\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n listKinds(): RegisteredResourceKind[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable;\n listHierarchyProviders(): ResolvedResourceHierarchyProvider[];\n walkHierarchy(resource: ResourceRef | undefined): WorkbenchHierarchyNode[];\n onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable;\n}\nexport interface CreateResourceRegistryInput {\n remove?(resource: ResourceRef, retained: readonly PlacementIdentity[]): void;\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n resolveView?: (viewId: string) =>\n | {\n label?: string;\n icon?: string;\n }\n | undefined;\n}\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const removalListeners = new Set<(resource: ResourceRef) => readonly PlacementIdentity[]>();\n const cycleListeners = new Set<(cycle: ResourceHierarchyCycle) => void>();\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, providers: {}, hierarchyProviders: {} },\n });\n return {\n store,\n preview: createResourcePreview(),\n removed(resource) {\n input.remove?.(\n resource,\n [...removalListeners].flatMap((listener) => listener(resource)),\n );\n },\n onWillRemove(listener) {\n removalListeners.add(listener);\n return createDisposable(() => removalListeners.delete(listener));\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 const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n listProviders() {\n return Object.values(store.getState().providers);\n },\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n registerHierarchyProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.hierarchyProviders[provider.id]) {\n throw new Error(`Resource hierarchy provider already registered: ${provider.id}`);\n }\n const record: ResolvedResourceHierarchyProvider = { ...provider, priority: provider.priority ?? 0 };\n store.setState(\n {\n ...snapshot,\n hierarchyProviders: { ...snapshot.hierarchyProviders, [provider.id]: record },\n },\n false,\n \"registerHierarchyProvider\",\n );\n return createDisposable(() => {\n const current = store.getState();\n if (current.hierarchyProviders[provider.id] !== record) return;\n const { [provider.id]: _removed, ...rest } = current.hierarchyProviders;\n store.setState({ ...current, hierarchyProviders: rest }, false, \"unregisterHierarchyProvider\");\n });\n },\n listHierarchyProviders() {\n return sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n },\n walkHierarchy(resource) {\n if (!resource) return [];\n const path = walkResourceHierarchy(Object.values(store.getState().hierarchyProviders), resource, (cycle) => {\n for (const listener of cycleListeners) listener(cycle);\n });\n return path.map((node) => {\n if (!isWorkbenchViewHierarchyNode(node)) return node;\n const view = input.resolveView?.(node.viewId);\n return view ? { ...node, label: view.label, icon: view.icon } : node;\n });\n },\n onDidDetectHierarchyCycle(listener) {\n cycleListeners.add(listener);\n return createDisposable(() => {\n cycleListeners.delete(listener);\n });\n },\n };\n};\n","import type { WorkbenchPanelInstance } from \"../layout/layout-types\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\n\nexport const rendererReadKey = (placement: WorkbenchPanelInstance, lane = \"view\") =>\n JSON.stringify([\n lane,\n placement.placementIdentity ? placementIdentityKey(placement.placementIdentity) : placement.instanceId,\n ]);\n","// Every issued child must settle before its parent's counted read slot is free.\nexport const settleReadBatch = async <T>(tasks: ((signal: AbortSignal) => Promise<T> | T)[], signal?: AbortSignal) => {\n const controller = new AbortController();\n const abort = () => controller.abort(signal?.reason);\n if (signal?.aborted) abort();\n else signal?.addEventListener(\"abort\", abort, { once: true });\n let firstError: unknown;\n try {\n const results = await Promise.allSettled(\n tasks.map(async (load) => {\n try {\n controller.signal.throwIfAborted();\n return await load(controller.signal);\n } catch (error) {\n firstError ??= error;\n controller.abort(error);\n throw error;\n }\n }),\n );\n if (firstError !== undefined) throw firstError;\n signal?.throwIfAborted();\n return results.map((result) => {\n if (result.status === \"rejected\") throw result.reason;\n return result.value;\n });\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n};\n","import type { Disposable } from \"../disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../store/workbench-store\";\n\nexport type ContextKeyValue = boolean | number | string | undefined;\n\nexport interface ContextKeyStoreState {\n values: Record<string, ContextKeyValue>;\n}\n\nexport interface ContextKeyScope extends Disposable {\n ownerId: string;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n}\n\nexport interface ContextKeyService {\n store: WorkbenchStore<ContextKeyStoreState>;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n createScope(ownerId: string): ContextKeyScope;\n deleteOwner(ownerId: string): void;\n snapshot(): Record<string, ContextKeyValue>;\n matches(expression?: string): boolean;\n}\n\nconst readComparisonValue = (value: string) => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst matchesTerm = (values: Record<string, ContextKeyValue>, term: string) => {\n const trimmed = term.trim();\n if (trimmed.length === 0) return true;\n\n const comparison = trimmed.match(/^([A-Za-z0-9_.-]+)\\s*(==|!=)\\s*(.+)$/);\n if (comparison) {\n const [, key, operator, rawValue] = comparison;\n const actual = values[key ?? \"\"];\n const expected = readComparisonValue(rawValue ?? \"\");\n return operator === \"==\" ? String(actual) === expected : String(actual) !== expected;\n }\n\n if (trimmed.startsWith(\"!\")) return !values[trimmed.slice(1)];\n\n return Boolean(values[trimmed]);\n};\n\nexport const matchesContextExpression = (values: Record<string, ContextKeyValue>, expression?: string) => {\n if (!expression) return true;\n return expression.split(\"||\").some((orClause) => orClause.split(\"&&\").every((term) => matchesTerm(values, term)));\n};\n\nexport const createContextKeyService = (): ContextKeyService => {\n const store = createWorkbenchStore<ContextKeyStoreState>({\n name: \"workbench.context\",\n initialState: { values: {} },\n });\n\n let globalValues: Record<string, ContextKeyValue> = {};\n const ownerValues = new Map<string, Record<string, ContextKeyValue>>();\n\n const buildValues = () => {\n const values = { ...globalValues };\n for (const scopedValues of ownerValues.values()) Object.assign(values, scopedValues);\n return values;\n };\n\n const publish = (action: string) => {\n store.setState({ values: buildValues() }, false, action);\n };\n\n return {\n store,\n\n set(key, value) {\n if (globalValues[key] === value) return;\n globalValues = { ...globalValues, [key]: value };\n publish(\"setContextKey\");\n },\n\n get(key) {\n return store.getState().values[key];\n },\n\n delete(key) {\n if (!(key in globalValues)) return;\n const { [key]: _removed, ...rest } = globalValues;\n globalValues = rest;\n publish(\"deleteContextKey\");\n },\n\n createScope(ownerId) {\n ownerValues.set(ownerId, ownerValues.get(ownerId) ?? {});\n let disposed = false;\n\n const assertActive = () => {\n if (disposed) throw new Error(`Context key scope disposed: ${ownerId}`);\n };\n\n return {\n ownerId,\n\n set(key, value) {\n assertActive();\n const values = ownerValues.get(ownerId) ?? {};\n if (values[key] === value) return;\n ownerValues.set(ownerId, { ...values, [key]: value });\n publish(\"setScopedContextKey\");\n },\n\n get(key) {\n assertActive();\n return ownerValues.get(ownerId)?.[key];\n },\n\n delete(key) {\n assertActive();\n const values = ownerValues.get(ownerId);\n if (!values || !(key in values)) return;\n const { [key]: _removed, ...rest } = values;\n ownerValues.set(ownerId, rest);\n publish(\"deleteScopedContextKey\");\n },\n\n dispose() {\n if (disposed) return;\n disposed = true;\n if (!ownerValues.delete(ownerId)) return;\n publish(\"disposeContextKeyScope\");\n },\n };\n },\n\n deleteOwner(ownerId) {\n if (!ownerValues.delete(ownerId)) return;\n publish(\"deleteContextKeyOwner\");\n },\n\n snapshot() {\n return { ...store.getState().values };\n },\n\n matches(expression) {\n return matchesContextExpression(store.getState().values, expression);\n },\n };\n};\n","import type { NotificationRegistry } from \"../registries/notifications/notification-registry\";\n\nexport const reportUserActionError = (\n workbench: { notifications: Pick<NotificationRegistry, \"show\"> },\n label: string,\n error: unknown,\n) => {\n workbench.notifications.show({\n level: \"error\",\n title: `${label} failed`,\n message: error instanceof Error ? error.message : String(error),\n });\n};\n\n// Use at UI entry points without an inline error display. Dialogs and reads\n// retain the rejected promise so their own error display remains the owner.\nexport const runUserAction = async (\n workbench: { notifications: Pick<NotificationRegistry, \"show\"> },\n label: string,\n run: () => unknown,\n) => {\n try {\n await run();\n } catch (error) {\n reportUserActionError(workbench, label, error);\n }\n};\n","import type { WorkbenchCore, WorkbenchRenderers } from \"./workbench-core-types\";\n\nconst renderersByWorkbench = new WeakMap<WorkbenchCore, WorkbenchRenderers>();\n\nexport const setWorkbenchRenderers = (workbench: WorkbenchCore, renderers: WorkbenchRenderers) => {\n renderersByWorkbench.set(workbench, renderers);\n};\n\nexport const getWorkbenchRenderers = (workbench: WorkbenchCore) => {\n const renderers = renderersByWorkbench.get(workbench);\n if (!renderers) throw new Error(\"Workbench renderers are not initialized\");\n return renderers;\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pstdio/workbench",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0-nightly.20261011183426",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/pufflyai/prompt-studio"
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@dnd-kit/core": "^6.3.1",
|
|
46
|
-
"@pstdio/sdk": "^0.
|
|
47
|
-
"@pstdio/ui": "^0.
|
|
46
|
+
"@pstdio/sdk": "^0.43.0-nightly.20261011183426",
|
|
47
|
+
"@pstdio/ui": "^0.43.0-nightly.20261011183426",
|
|
48
48
|
"@tanstack/react-hotkeys": "0.10.0",
|
|
49
49
|
"lucide-react": "^0.557.0",
|
|
50
|
-
"rimless": "0.8.
|
|
50
|
+
"rimless": "0.8.3",
|
|
51
51
|
"zod": "^4.1.12",
|
|
52
52
|
"zustand": "^5.0.8"
|
|
53
53
|
},
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { Ct as e } from "./workbench-renderers-CUHzLWMx.js";
|
|
2
|
-
import { resourceKey as t } from "@pstdio/sdk/extensions";
|
|
3
|
-
//#region src/core/registries/navigation/navigation-tree-registry.ts
|
|
4
|
-
var n = "navigation.root", r = (e = "content") => e === "content" ? n : `navigation.${e}`, i = (e) => `${e.kind}:${e.extensionId}:${e.id}`, a = (e, t) => i(e) === i(t), o = (e) => (t, n) => {
|
|
5
|
-
let r = t.sourceExtensionId === e.extensionId;
|
|
6
|
-
if (r !== (n.sourceExtensionId === e.extensionId)) return r ? -1 : 1;
|
|
7
|
-
if (!r) {
|
|
8
|
-
let e = t.sourceExtensionId.localeCompare(n.sourceExtensionId);
|
|
9
|
-
if (e !== 0) return e;
|
|
10
|
-
}
|
|
11
|
-
return t.declarationIndex - n.declarationIndex || t.id.localeCompare(n.id);
|
|
12
|
-
}, s = (e, t) => e ? `${e}:${t}` : t, c = (e, t) => ({
|
|
13
|
-
...t,
|
|
14
|
-
resource: e.resolveResource ? e.resolveResource(t.resource) : t.resource
|
|
15
|
-
}), l = (e, t) => {
|
|
16
|
-
let n = e.findIndex((e) => e.id === t.id);
|
|
17
|
-
if (n < 0) {
|
|
18
|
-
e.push(t);
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
let r = e[n];
|
|
22
|
-
e[n] = {
|
|
23
|
-
...r,
|
|
24
|
-
nodes: [...r.nodes, ...t.nodes]
|
|
25
|
-
};
|
|
26
|
-
}, u = (n = {}) => {
|
|
27
|
-
let u = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new WeakMap(), f = /* @__PURE__ */ new Set(), p = () => {
|
|
28
|
-
for (let e of f) e();
|
|
29
|
-
}, m = (e, t) => [...u.values()].filter((n) => a(n.owner, e) && (n.slot ?? "content") === t).sort(o(e)), h = (e, t, n, r) => {
|
|
30
|
-
let i = {
|
|
31
|
-
...e,
|
|
32
|
-
id: s(t.idScope, e.id),
|
|
33
|
-
moveScope: n,
|
|
34
|
-
canHide: e.canHide ?? t.owner.kind === "mode",
|
|
35
|
-
canReorder: e.canReorder ?? t.owner.kind === "mode",
|
|
36
|
-
children: e.children?.map((e) => h(e, t, n, r))
|
|
37
|
-
};
|
|
38
|
-
return d.set(i, {
|
|
39
|
-
contribution: t,
|
|
40
|
-
node: e,
|
|
41
|
-
resource: r
|
|
42
|
-
}), i;
|
|
43
|
-
}, g = (e, t, n, a) => ({
|
|
44
|
-
...e,
|
|
45
|
-
id: t.sourceExtensionId !== n.extensionId && !e.label ? r(t.slot) : s(t.idScope, e.id),
|
|
46
|
-
moveScope: i(n),
|
|
47
|
-
canHide: e.canHide ?? !0,
|
|
48
|
-
canReorder: e.canReorder ?? !0,
|
|
49
|
-
nodes: e.nodes.map((e) => h(e, t, i(n), a))
|
|
50
|
-
});
|
|
51
|
-
return {
|
|
52
|
-
registerContribution(t) {
|
|
53
|
-
if (u.has(t.id)) throw Error(`Navigation tree contribution already registered: ${t.id}`);
|
|
54
|
-
if (!t.viewId && !t.getSections) throw Error(`Navigation tree contribution must declare a viewId or getSections: ${t.id}`);
|
|
55
|
-
u.set(t.id, t);
|
|
56
|
-
let r = t.viewId ? n.subscribeViewRefresh?.(t.viewId, p) : void 0;
|
|
57
|
-
return p(), e(() => {
|
|
58
|
-
u.get(t.id) === t && (r?.dispose(), u.delete(t.id), p());
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
resolveOwner(e, t, n) {
|
|
62
|
-
return [...u.values()].find((r) => r.owner.kind === e && r.owner.id === t && (!n || (r.slot ?? "content") === n))?.owner;
|
|
63
|
-
},
|
|
64
|
-
getReadKey(e, n = {}) {
|
|
65
|
-
return JSON.stringify([
|
|
66
|
-
"header",
|
|
67
|
-
"content",
|
|
68
|
-
"footer"
|
|
69
|
-
].flatMap((r) => m(e, r).map((e) => [e.id, t(c(e, n).resource)])));
|
|
70
|
-
},
|
|
71
|
-
async getSections(e, t = "content", r = {}) {
|
|
72
|
-
let i = [];
|
|
73
|
-
for (let a of m(e, t)) {
|
|
74
|
-
r.signal?.throwIfAborted();
|
|
75
|
-
let t = c(a, r), o = a.viewId ? await n.getViewSections?.(a.viewId, t) : await a.getSections?.(t);
|
|
76
|
-
r.signal?.throwIfAborted();
|
|
77
|
-
for (let n of o ?? []) l(i, g(n, a, e, t.resource));
|
|
78
|
-
}
|
|
79
|
-
return i;
|
|
80
|
-
},
|
|
81
|
-
async getChildren(e, t = {}) {
|
|
82
|
-
t.signal?.throwIfAborted();
|
|
83
|
-
let r = d.get(e);
|
|
84
|
-
if (!r) return e.children ?? [];
|
|
85
|
-
let a = e.moveScope ?? i(r.contribution.owner), o = {
|
|
86
|
-
...t,
|
|
87
|
-
resource: r.resource
|
|
88
|
-
}, s = r.contribution.viewId ? await n.getViewChildren?.(r.contribution.viewId, r.node, o) : await r.contribution.getChildren?.(r.node, o);
|
|
89
|
-
return s ? s.map((e) => h(e, r.contribution, a, r.resource)) : e.children ?? [];
|
|
90
|
-
},
|
|
91
|
-
getDefaultExpandedSectionIds(e, t) {
|
|
92
|
-
return (t ? [t] : [
|
|
93
|
-
"header",
|
|
94
|
-
"content",
|
|
95
|
-
"footer"
|
|
96
|
-
]).flatMap((t) => m(e, t).flatMap((e) => (e.defaultExpandedSectionIds ?? (e.viewId ? n.getViewDefaultExpandedSectionIds?.(e.viewId) : void 0) ?? []).map((t) => s(e.idScope, t))));
|
|
97
|
-
},
|
|
98
|
-
onDidChange(t) {
|
|
99
|
-
return f.add(t), e(() => f.delete(t));
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
//#endregion
|
|
104
|
-
export { r as n, u as t };
|
|
105
|
-
|
|
106
|
-
//# sourceMappingURL=navigation-tree-registry-DkJ3i8ym.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-tree-registry-DkJ3i8ym.js","names":["resourceKey","createDisposable","Disposable","TreeNode","TreeViewSection","ResourceRef","NavigationTreeSlot","NavigationTreeOwner","kind","id","extensionId","NavigationTreeContext","resource","signal","AbortSignal","NavigationTreeContribution","idScope","owner","sourceExtensionId","declarationIndex","slot","viewId","defaultExpandedSectionIds","resolveResource","getSections","context","Promise","getChildren","node","CreateNavigationTreeRegistryInput","subscribeViewRefresh","listener","getViewDefaultExpandedSectionIds","getViewSections","getViewChildren","NavigationTreeRegistry","registerContribution","contribution","resolveOwner","getReadKey","getDefaultExpandedSectionIds","onDidChange","navigationRootSectionId","navigationSlotRootSectionId","ownerId","ownersEqual","left","right","contributionOrder","leftOwn","rightOwn","extensionOrder","localeCompare","scopedId","scope","readContext","mergeSection","sections","section","index","findIndex","candidate","push","current","nodes","createNavigationTreeRegistry","input","contributions","Map","nodeSources","WeakMap","listeners","Set","emit","matching","values","filter","sort","projectNode","moveScope","projected","canHide","canReorder","children","map","child","set","projectSection","label","has","Error","refreshSubscription","undefined","get","dispose","delete","find","JSON","stringify","const","flatMap","throwIfAborted","query","sourceSections","source","selectedSlot","slots","add","createDisposable","navigationRootSectionId","navigationSlotRootSectionId","slot","ownerId","owner","ownersEqual","left","right","contributionOrder","leftOwn","extensionOrder","scopedId","scope","id","readContext","context","contribution","mergeSection","index","sections","candidate","section","current","createNavigationTreeRegistry","contributions","nodeSources","listeners","emit","listener","matching","projectNode","projected","node","child","moveScope","resource","projectSection","refreshSubscription","input","kind","resourceKey","query","sourceSections","source","children","selectedSlot"],"sources":["../src/core/registries/navigation/navigation-tree-registry.ts"],"sourcesContent":["import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { TreeNode, TreeViewSection } from \"../renderers/tree-renderer-registry\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport type NavigationTreeSlot = \"header\" | \"content\" | \"footer\";\n\nexport interface NavigationTreeOwner {\n kind: \"mode\" | \"page\";\n id: string;\n extensionId: string;\n}\n\nexport interface NavigationTreeContext {\n resource?: ResourceRef;\n signal?: AbortSignal;\n}\n\nexport interface NavigationTreeContribution {\n id: string;\n /** Prefix projected section and node ids when they come from an independent tree renderer. */\n idScope?: string;\n owner: NavigationTreeOwner;\n sourceExtensionId: string;\n declarationIndex: number;\n slot?: NavigationTreeSlot;\n viewId?: string;\n defaultExpandedSectionIds?: string[];\n /** Resolve the data resource independently of the selected navigation item. */\n resolveResource?(resource: ResourceRef | undefined): ResourceRef | undefined;\n getSections?(context: NavigationTreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getChildren?(node: TreeNode, context: NavigationTreeContext): Promise<TreeNode[]> | TreeNode[];\n}\n\nexport interface CreateNavigationTreeRegistryInput {\n subscribeViewRefresh?(viewId: string, listener: () => void): Disposable;\n getViewDefaultExpandedSectionIds?(viewId: string): readonly string[] | undefined;\n getViewSections?(viewId: string, context: NavigationTreeContext): Promise<TreeViewSection[]> | TreeViewSection[];\n getViewChildren?(viewId: string, node: TreeNode, context: NavigationTreeContext): Promise<TreeNode[]> | TreeNode[];\n}\n\nexport interface NavigationTreeRegistry {\n registerContribution(contribution: NavigationTreeContribution): Disposable;\n resolveOwner(\n kind: NavigationTreeOwner[\"kind\"],\n id: string,\n slot?: NavigationTreeSlot,\n ): NavigationTreeOwner | undefined;\n getReadKey(owner: NavigationTreeOwner, context?: NavigationTreeContext): string;\n getSections(\n owner: NavigationTreeOwner,\n slot?: NavigationTreeSlot,\n context?: NavigationTreeContext,\n ): Promise<TreeViewSection[]>;\n getChildren(node: TreeNode, context?: NavigationTreeContext): Promise<TreeNode[]>;\n getDefaultExpandedSectionIds(owner: NavigationTreeOwner, slot?: NavigationTreeSlot): string[];\n onDidChange(listener: () => void): Disposable;\n}\n\n// The owner's top-level section. Extensions add ungrouped entries here and use a labeled section for a named group.\nexport const navigationRootSectionId = \"navigation.root\";\n// Each slot keeps its own root, so pinned header and footer rows never share a section id with the body.\nexport const navigationSlotRootSectionId = (slot: NavigationTreeSlot = \"content\") =>\n slot === \"content\" ? navigationRootSectionId : `navigation.${slot}`;\n\nconst ownerId = (owner: NavigationTreeOwner) => `${owner.kind}:${owner.extensionId}:${owner.id}`;\n\nconst ownersEqual = (left: NavigationTreeOwner, right: NavigationTreeOwner) => ownerId(left) === ownerId(right);\n\nconst contributionOrder =\n (owner: NavigationTreeOwner) => (left: NavigationTreeContribution, right: NavigationTreeContribution) => {\n const leftOwn = left.sourceExtensionId === owner.extensionId;\n const rightOwn = right.sourceExtensionId === owner.extensionId;\n if (leftOwn !== rightOwn) return leftOwn ? -1 : 1;\n if (!leftOwn) {\n const extensionOrder = left.sourceExtensionId.localeCompare(right.sourceExtensionId);\n if (extensionOrder !== 0) return extensionOrder;\n }\n return left.declarationIndex - right.declarationIndex || left.id.localeCompare(right.id);\n };\n\nconst scopedId = (scope: string | undefined, id: string) => (scope ? `${scope}:${id}` : id);\n\nconst readContext = (contribution: NavigationTreeContribution, context: NavigationTreeContext) => ({\n ...context,\n resource: contribution.resolveResource ? contribution.resolveResource(context.resource) : context.resource,\n});\n\nconst mergeSection = (sections: TreeViewSection[], section: TreeViewSection) => {\n const index = sections.findIndex((candidate) => candidate.id === section.id);\n if (index < 0) {\n sections.push(section);\n return;\n }\n const current = sections[index]!;\n sections[index] = { ...current, nodes: [...current.nodes, ...section.nodes] };\n};\n\nexport const createNavigationTreeRegistry = (input: CreateNavigationTreeRegistryInput = {}): NavigationTreeRegistry => {\n const contributions = new Map<string, NavigationTreeContribution>();\n const nodeSources = new WeakMap<\n TreeNode,\n { contribution: NavigationTreeContribution; node: TreeNode; resource?: ResourceRef }\n >();\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n\n const matching = (owner: NavigationTreeOwner, slot: NavigationTreeSlot) =>\n [...contributions.values()]\n .filter((contribution) => ownersEqual(contribution.owner, owner) && (contribution.slot ?? \"content\") === slot)\n .sort(contributionOrder(owner));\n\n const projectNode = (\n node: TreeNode,\n contribution: NavigationTreeContribution,\n moveScope: string,\n resource?: ResourceRef,\n ): TreeNode => {\n const projected: TreeNode = {\n ...node,\n id: scopedId(contribution.idScope, node.id),\n moveScope,\n // Mode rows are navigation links users may hide and arrange; page-owned level rows are data such as notes\n // or sessions, which keep the order their owner gives them unless a row opts in.\n canHide: node.canHide ?? contribution.owner.kind === \"mode\",\n canReorder: node.canReorder ?? contribution.owner.kind === \"mode\",\n children: node.children?.map((child) => projectNode(child, contribution, moveScope, resource)),\n };\n nodeSources.set(projected, { contribution, node, resource });\n return projected;\n };\n\n const projectSection = (\n section: TreeViewSection,\n contribution: NavigationTreeContribution,\n owner: NavigationTreeOwner,\n resource?: ResourceRef,\n ): TreeViewSection => ({\n ...section,\n id:\n contribution.sourceExtensionId !== owner.extensionId && !section.label\n ? navigationSlotRootSectionId(contribution.slot)\n : scopedId(contribution.idScope, section.id),\n moveScope: ownerId(owner),\n canHide: section.canHide ?? true,\n canReorder: section.canReorder ?? true,\n nodes: section.nodes.map((node) => projectNode(node, contribution, ownerId(owner), resource)),\n });\n\n return {\n registerContribution(contribution) {\n if (contributions.has(contribution.id)) {\n throw new Error(`Navigation tree contribution already registered: ${contribution.id}`);\n }\n if (!contribution.viewId && !contribution.getSections) {\n throw new Error(`Navigation tree contribution must declare a viewId or getSections: ${contribution.id}`);\n }\n contributions.set(contribution.id, contribution);\n const refreshSubscription = contribution.viewId\n ? input.subscribeViewRefresh?.(contribution.viewId, emit)\n : undefined;\n emit();\n return createDisposable(() => {\n if (contributions.get(contribution.id) !== contribution) return;\n refreshSubscription?.dispose();\n contributions.delete(contribution.id);\n emit();\n });\n },\n\n resolveOwner(kind, id, slot) {\n return [...contributions.values()].find(\n (contribution) =>\n contribution.owner.kind === kind &&\n contribution.owner.id === id &&\n (!slot || (contribution.slot ?? \"content\") === slot),\n )?.owner;\n },\n\n getReadKey(owner, context = {}) {\n return JSON.stringify(\n ([\"header\", \"content\", \"footer\"] as const).flatMap((slot) =>\n matching(owner, slot).map((contribution) => [\n contribution.id,\n resourceKey(readContext(contribution, context).resource),\n ]),\n ),\n );\n },\n\n async getSections(owner, slot = \"content\", context = {}) {\n const sections: TreeViewSection[] = [];\n for (const contribution of matching(owner, slot)) {\n context.signal?.throwIfAborted();\n const query = readContext(contribution, context);\n const sourceSections = contribution.viewId\n ? await input.getViewSections?.(contribution.viewId, query)\n : await contribution.getSections?.(query);\n context.signal?.throwIfAborted();\n for (const section of sourceSections ?? []) {\n mergeSection(sections, projectSection(section, contribution, owner, query.resource));\n }\n }\n return sections;\n },\n\n async getChildren(node, context = {}) {\n context.signal?.throwIfAborted();\n const source = nodeSources.get(node);\n if (!source) return node.children ?? [];\n const moveScope = node.moveScope ?? ownerId(source.contribution.owner);\n const query = { ...context, resource: source.resource };\n const children = source.contribution.viewId\n ? await input.getViewChildren?.(source.contribution.viewId, source.node, query)\n : await source.contribution.getChildren?.(source.node, query);\n if (!children) return node.children ?? [];\n return children.map((child) => projectNode(child, source.contribution, moveScope, source.resource));\n },\n\n getDefaultExpandedSectionIds(owner, selectedSlot) {\n const slots: readonly NavigationTreeSlot[] = selectedSlot ? [selectedSlot] : [\"header\", \"content\", \"footer\"];\n return slots.flatMap((slot) =>\n matching(owner, slot).flatMap((contribution) =>\n (\n contribution.defaultExpandedSectionIds ??\n (contribution.viewId ? input.getViewDefaultExpandedSectionIds?.(contribution.viewId) : undefined) ??\n []\n ).map((id) => scopedId(contribution.idScope, id)),\n ),\n );\n },\n\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n"],"mappings":"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"}
|