@pstdio/workbench 0.45.0 → 0.46.0-nightly.20261024001730
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 +10 -4
- package/dist/extensions.js +1141 -1076
- package/dist/extensions.js.map +1 -1
- package/dist/{index-DL-0XKr0.d.ts → index-BKw8sMcc.d.ts} +188 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1077 -1158
- package/dist/index.js.map +1 -1
- package/dist/{kanban-presentation-CdHu43iH.d.ts → kanban-presentation-C98tAc0L.d.ts} +1 -1
- package/dist/{navigation-tree-registry-DM4Lhfir.js → navigation-tree-registry-7yzLPxqD.js} +65 -44
- package/dist/navigation-tree-registry-7yzLPxqD.js.map +1 -0
- package/dist/{react-7X-EBlBD.js → react-BT0I-th2.js} +3395 -3023
- package/dist/react-BT0I-th2.js.map +1 -0
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/dist/storage.d.ts +1 -1
- package/dist/webview-runtime.js +1 -1
- package/dist/{workbench-renderers-DOc_oE0K.js → workbench-renderers-DLrojHYg.js} +320 -233
- package/dist/workbench-renderers-DLrojHYg.js.map +1 -0
- package/package.json +3 -3
- package/dist/navigation-tree-registry-DM4Lhfir.js.map +0 -1
- package/dist/react-7X-EBlBD.js.map +0 -1
- package/dist/workbench-renderers-DOc_oE0K.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-renderers-DLrojHYg.js","names":["PageParamDefinition","PageParams","PageParamValue","PageParamDefinitions","Readonly","Record","reserved","Set","invalid","name","Error","equal","left","right","JSON","stringify","isPageParamValue","definition","value","type","Array","isArray","every","item","values","includes","Number","isFinite","validatePageParamDefinitions","definitions","Object","keys","length","entries","test","has","default","undefined","validateNames","hasOwn","normalizePageParams","strict","result","freeze","params","pageParamsQuery","toString","resolvePageParams","query","URLSearchParams","append","String","parsePageParams","items","getAll","raw","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","WorkbenchTabPosition","WorkbenchWidgetPlacement","planTrayTabs","widgets","preferredWidgetId","previews","filter","widget","tabRetention","preview","find","widgetId","replaced","planTrayPlacement","placement","position","remaining","index","length","before","target","beforeWidgetId","afterWidgetId","found","findIndex","splice","undefined","planTrayDrop","pinned","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","visible","includes","closedPlacement","activePlacement","activateInLayout","panelRegion","panel","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","panelPositions","side","sidenav","main","secondary","activity","const","WorkbenchPositionedRegion","WorkbenchPanelPosition","WorkbenchArrangement","defaultArrangement","resolvePanelPosition","arrangement","region","supportedPosition","value","T","allowed","fallback","includes","resolveArrangement","saved","Partial","Disposable","runWorkbenchEffect","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchRegion","WorkbenchRegionSettings","WorkbenchWidgetPlacement","workbenchPanelRegions","defaultArrangement","resolveArrangement","WorkbenchModeActivationContext","WorkbenchModeContribution","modePanelRegions","main","secondary","side","const","Record","allModeRegions","Object","values","flat","panelsForMode","mode","panels","Set","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","filter","regionsNeedClearing","regionId","visible","selectionsNeedClearing","locationSubPanelSelections","selections","has","fromEntries","entries","map","next","activeLocationWidgetId","applyModePanelAvailability","available","unavailableRegions","applyModePanelPolicy","getSettings","canClose","arrangement","movable","assign","unchanged","every","restoreUnscopedModeLayout","current","saved","defaults","cleared","merged","savedActive","currentActive","disposeReverse","disposables","index","dispose","restoreModeLayout","context","getLayout","restoreLayout","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","PageLocation","WorkbenchModeContribution","NavigationTreeRegistry","WorkbenchPageContribution","NavigationLevelsInput","location","pages","navigationTrees","NavigationLevelModes","getMode","id","Pick","ProjectNavigationSources","modes","ProjectNavigationInput","findPage","find","candidate","ref","page","extensionId","levelOwner","input","resolveOwner","undefined","leavesProjectNavigation","modeId","chrome","sidenav","resolveNavigationLevels","levels","owner","NonNullable","ReturnType","current","parent","some","level","unshift","resolveRootLevelLocation","rootLevel","FileRendererSectionTarget","FileSourcePosition","NavigationTargetPage","PageLocation","PageParams","PageRef","ResourceRef","isFileSourcePosition","normalizePageParams","WorkbenchPageContribution","WorkbenchPageResourceCodec","workbenchPageRefKey","ref","extensionId","id","pageForRef","pages","find","page","pageForId","pageId","canonicalSection","section","undefined","anchors","map","anchor","Object","freeze","heading","occurrence","cloneMetadata","metadata","JSON","parse","stringify","NonNullable","canonicalResource","resource","resources","normalized","normalize","type","Error","canonical","projectId","label","icon","canonicalPageRef","kind","const","sectionKey","resourceKey","location","toUri","sharesPageResource","left","right","workbenchPageLocationRouteKey","declaration","document","metadataKey","position","line","column","endLine","endColumn","workbenchPageLocationKey","own","parent","workbenchPageLocationsEqual","a","b","params","canonicalPosition","isFrozen","createLocation","input","key","declaredParent","seen","Set","parentId","normalizeResolvedLocation","locationFields","Pick","candidate","routeKey","has","add","inheritedParent","active","normalizePageTarget","target","open","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","resourceKey","PlacementIdentity","WorkbenchRegion","workbenchRegions","PlacementDestination","identity","region","ResolvedOwnedPlacement","order","value","Value","ComposeOwnedPlacementsInput","shell","mode","page","closed","ComposedOwnedPlacements","placements","regions","Record","visibleRegions","ReadonlySet","OwnedPlacementUpdate","current","desired","OwnedPlacementReconciliation","destinations","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","size","emptyRegions","reduce","composeOwnedPlacements","declared","closedKeys","sort","flatMap","filter","length","indexPlacements","indexed","Map","set","placementShapeEqual","reconcileOwnedPlacements","desiredPlacement","currentPlacement","get","activationKeys","Array","from","ResourceBinding","WorkbenchPageContribution","WorkbenchPageSlot","PAGE_MAIN_SLOT_ID","ResolvedPageSlot","role","isPageSlotClosable","slot","item","kind","presence","binding","cardinality","primarySlot","page","main","undefined","_kind","view","presentation","resource","id","region","pageSlots","slots","map","const","requirePageSlot","slotId","find","candidate","Error","emptyMainSlot","empty","pagePlacementDeclarations","PageLocation","ResourceRef","workbenchPageLocationKey","WorkbenchPageContribution","WorkbenchPageResourceCodec","pageStateOwnerKey","page","resource","resources","id","JSON","stringify","toUri","normalize","document","metadata","metadataKey","staticPageInstanceKey","ownsStaticPageInstance","key","pageId","instanceKey","owner","startsWith","pageStateKey","location","main","kind","position","undefined","removePageStates","states","Readonly","Record","State","Object","fromEntries","entries","filter","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","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","RelatedResourceOpenings","ResourceRef","NavigationTarget","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","relatedOpenings","signal","AbortSignal","Promise","label","icon","resolve","subscribe","listener","RegisteredResourceKind","ResourceBrowseEntry","indicator","color","target","searchText","description","group","order","activate","ResourceListContext","primary","ResourceProvider","list","query","context","related","ResourceRegistryStoreState","kinds","providers","hierarchyProviders","ResourceRegistry","preview","ReturnType","removed","onWillRemove","onDidRemove","store","registerKind","getKind","listKinds","registerProvider","provider","listProviders","listResources","listRelatedResources","registerHierarchyProvider","listHierarchyProviders","walkHierarchy","onDidDetectHierarchyCycle","cycle","CreateResourceRegistryInput","remove","retained","getPrimary","resolveView","viewId","createResourceRegistry","input","removalListeners","Set","removedListeners","cycleListeners","name","initialState","flatMap","add","delete","snapshot","getState","Error","record","setState","current","_removed","rest","find","candidate","sort","push","priority","path","map","node","view","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","placementIdentity","kind","keep","push","MenuPath","headerLeadingMenuPath","region","headerTrailingMenuPath","workbenchRegionTabLeadingMenuPath","workbenchRegionTabAddMenuPath","workbenchCommandPaletteMenuPath","const","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","workbenchBreadcrumbLocationMenuPath","resourceContextMenuPath","resourceKind","ResourceConstraint","ResourceRef","resourceMatchesConstraint","constraint","resource","kinds","some","kind","id","type","extensionId","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","ResourceRef","resourceKey","resourceMatchesConstraint","WorkbenchPageContribution","WorkbenchPageResourceCodec","pageStateOwnerKey","pageResourceContextKey","page","resource","JSON","stringify","document","metadata","metadataKey","pageResourceInstanceKey","resources","normalized","normalize","toUri","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","const","StandardResourceIcon","WorkbenchPanelInstance","placementIdentityKey","rendererReadKey","placement","lane","JSON","stringify","placementIdentity","instanceId","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","SettingsScope","SettingsAction","id","label","icon","run","Promise","SettingsSectionContribution","title","order","scope","actions","RegisteredSettingsSection","SettingsPanelPreference","name","SettingsPanelBase","description","section","parentPanelId","when","SchemaSettingsPanel","kind","preferences","save","ViewSettingsPanel","viewId","SettingsCollectionGroupBy","key","item","TItem","CollectionSettingsPanel","items","itemId","itemLabel","itemIcon","groupBy","SettingsPanelContribution","RegisteredSettingsPanel","SettingsRegistryStoreState","sections","Record","panels","revision","SettingsRegistry","store","registerSection","metadata","registerPanel","panel","getSection","getPanel","listSections","listPanels","resolveCollectionItem","panelId","getCollectionItem","refresh","byOrderThenPriority","left","T","right","getSettingsPanels","state","Object","values","sort","createSettingsRegistry","input","hasView","initialState","collectionItems","Map","itemKey","JSON","stringify","clear","snapshot","getState","setState","Error","record","current","_removed","nextSections","nextPanels","keys","startsWith","delete","undefined","find","candidate","set","get","NotificationRegistry","reportUserActionError","workbench","notifications","Pick","label","error","captureActionError","runUserAction","run","options","inlineTarget","onSuccess","reportError","resourceKey","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchWidgetPlacement","placementIdentityKey","reconcileOwnedPlacements","pagePlacementDeclarations","WorkbenchPageRegistryStoreState","pageResourceContextKey","ownsStaticPageInstance","resourceMatchesConstraint","State","pagePlacementClosed","widget","next","previous","identity","placementIdentity","kind","contains","key","state","pageId","instanceKey","openStaticSlotIds","includes","slotId","resourceInstances","some","instance","Object","entries","pageStates","startsWith","pageLayoutContext","projectId","modeId","activeModeId","activePageId","resource","location","pageContextChanged","pages","sharedKeys","layout","main","Set","values","regions","flatMap","region","widgets","id","PageTabsInput","pageLayout","modeLayout","getWidget","contributionId","mainTabNeedsCache","changingPage","page","slot","find","constraint","item","binding","Boolean","restoreMainTabs","input","current","shared","ReadonlySet","activated","reconciliation","activate","map","entry","placements","order","has","existing","filter","push","value","refreshSharedPageTab","title","label","sharedPageTabValue","explicit","widgetId","canRestoreSharedPageTab","leavingPage","tabRetention","restoreSharedPageTabs","sharedLayout","scopePageMainTabs","sameMode","departing","retained","desired","destinations","candidate","valuesEqual","left","right","JSON","stringify","PlacementIdentity","WorkbenchPageRuntimeState","ownsStaticPageInstance","PagePlacementEdit","kind","open","editPagePlacementStates","states","Readonly","Record","identity","Extract","edit","Object","fromEntries","entries","map","key","current","pageId","startsWith","instances","resourceInstances","slotId","remaining","flatMap","instance","instanceKey","openStaticSlotIds","filter","id","activePrimaryInstanceKey","at","dockedWorkbenchRegions","PlacementIdentity","activateInLayout","findPlacementByWidgetId","getActiveLocationPlacement","removeLocationSubPanelSelection","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","workbenchRegions","composeOwnedPlacements","PlacementDestination","placementIdentityKey","ResolvedOwnedPlacement","planTrayTabs","WorkbenchOwnedWidgetPlacement","ReconcileOwnedWidgetLayoutInput","layout","modeLayout","placements","activate","destinations","ApplyOwnedWidgetLayoutReconciliationInput","remove","RenderedOwnedPlacement","identity","region","placement","transferredFromKey","bindsToLocation","value","role","kind","resolveOwnerResourceKey","desired","exact","transfer","ownerResourceKey","indexCurrentOwnedPlacements","indexed","Map","Object","values","regions","widgets","placementIdentity","key","has","Error","set","id","findModePlacementTransfer","input","current","ReturnType","desiredKeys","ReadonlySet","transferredCurrentKeys","undefined","desiredIdentity","entries","find","currentKey","candidate","modeId","placementId","contributionId","viewId","indexCurrentWidgetOwners","owners","widgetId","restoreModeWidgets","saved","ReadonlyMap","order","currentIds","Set","map","widget","restored","filter","positions","index","ordered","sort","a","b","get","length","sharedPositions","shared","sharedIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","destination","shell","mode","page","add","currentOwner","push","reconcileRegions","removedKeys","docked","desiredByKey","flatMap","regionId","pageOwnsPrimaryLocation","some","entry","placedKeys","savedWidgetOrder","replacement","tray","tabRetention","activeWidgetId","selected","opensPreviouslyEmptyRegion","hiddenByDefault","closesEmptyPanel","visible","normalizeRemovedState","activeLocation","activeLocationWidgetId","fallbackLocation","active","fallbackActive","activeResourceKey","resourceKey","bindOwnedSubPanelsToLocation","fromEntries","desiredPlacement","updateOwnedWidgetLayout","size","desiredByIdentity","reconcileOwnedWidgetLayout","keys","applyOwnedWidgetLayoutReconciliation","WorkbenchLayout","WorkbenchWidgetPlacement","indexCurrentOwnedPlacements","renderDesiredPlacements","placementIdentityKey","reconcileOwnedPlacements","planTrayTabs","editPagePlacementStates","WorkbenchPageRegistryStoreState","State","retainTrayPreviews","state","previous","current","modeLayout","rendered","layout","placements","destinations","reconciliation","incoming","activate","add","update","map","entry","desired","preferred","filter","value","tabRetention","identity","removed","Set","region","Object","values","regions","candidates","id","preferredEntry","key","find","Boolean","plan","placement","widgetId","activeWidgetId","widget","replaced","placementIdentity","removeTrayPreviews","ReadonlySet","size","has","pageStates","kind","valuesEqual","left","right","JSON","stringify","resourceKey","WorkbenchLayout","WorkbenchWidgetPlacement","placementIdentityKey","editPagePlacementStates","WorkbenchPageRegistryStoreState","pageContextChanged","removeTrayPreviews","State","departingPagePreviews","next","previous","layout","activePageId","projectId","activeModeId","Object","values","regions","flatMap","region","widgets","filter","widget","tabRetention","closeDepartingPagePreviews","state","previews","removed","Set","placementIdentity","key","incoming","placements","find","entry","identity","value","resource","pageStates","kind","length","WorkbenchCore","WorkbenchRenderers","renderersByWorkbench","WeakMap","setWorkbenchRenderers","workbench","renderers","set","getWorkbenchRenderers","get","Error","reserved","invalid","name","equal","left","right","isPageParamValue","definition","value","item","validatePageParamDefinitions","definitions","validateNames","values","normalizePageParams","result","strict","params","pageParamsQuery","resolvePageParams","query","parsePageParams","items","raw","createDisposable","disposed","onDispose","runWorkbenchEffect","effect","error","owner","depth","pending","notifyWorkbenchChange","notify","batchWorkbenchChanges","commit","defaultEquality","createWorkbenchStore","api","createStore","devtools","input","subscribe","listener","previous","equalityFn","options","previousValue","selector","nextValue","state","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","planTrayTabs","previews","widgets","widget","preview","preferredWidgetId","planTrayPlacement","remaining","placement","index","position","before","target","found","planTrayDrop","resolveUniqueWidgetId","contributionId","widgetIds","preferredId","suffix","findPlacement","layout","candidate","findResourcePlacement","resourceKey","findPlacementByWidgetId","widgetId","createUniqueWidgetId","getActivePlacement","isLocationPlacement","locationWorkspaceKey","setLocationSubPanelSelection","location","key","next","removeLocationSubPanelSelection","locationSubPanelSelections","selections","selectedId","getActiveLocationPlacement","locations","replaceRegionWidgets","regionId","update","activeWidgetId","p","r","removePlacementsForContribution","nextLayout","removed","filtered","hasActiveWidget","closeWidgetInLayout","closingEffectiveActive","nextActivePlacement","nextRegion","activeLocationWidgetId","activateInLayout","regions","panelRegion","panel","selected","withSelection","selectRegionActiveWidget","followsRegion","supportsResource","resource","getActiveWorkbenchSubPanel","getActiveWorkbenchLocationPanel","matchesLocationEligibility","eligibleLocations","matchesWorkbenchModeEligibility","modeId","eligibleModeIds","isWorkbenchPanelPlacementVisible","matchesWorkbenchPanelMenuOwner","context","defaultContributionOwnerId","normalizeContributionMetadata","metadata","byContributionPriority","toOpenWidgetInput","shared","normalized","strategy","defaultTabRetention","toPanelInstance","toPanelContribution","_closable","_ownedPanelMenuIds","panelPositions","defaultArrangement","resolvePanelPosition","arrangement","supportedPosition","allowed","fallback","resolveArrangement","saved","modePanelRegions","allModeRegions","panelsForMode","mode","getWorkbenchModePanelForRegion","isWorkbenchModePanelAvailable","placementById","withActivePlacement","active","candidates","clearRegions","regionIds","clearedPanels","regionsNeedClearing","selectionsNeedClearing","applyModePanelAvailability","available","panels","applyModePanelPolicy","getSettings","restoreUnscopedModeLayout","cleared","current","defaults","merged","disposeReverse","disposables","restoreModeLayout","settleReadBatch","controller","abort","signal","firstError","results","tasks","load","findPage","pages","levelOwner","page","leavesProjectNavigation","resolveNavigationLevels","levels","level","resolveRootLevelLocation","rootLevel","workbenchPageRefKey","ref","pageForRef","pageForId","pageId","canonicalSection","section","anchors","anchor","cloneMetadata","canonicalResource","resources","canonical","canonicalPageRef","sectionKey","resourceKey$1","sharesPageResource","workbenchPageLocationRouteKey","declaration","document","workbenchPageLocationKey","own","workbenchPageLocationsEqual","a","b","canonicalPosition","createLocation","isFileSourcePosition","declaredParent","parent","normalizeResolvedLocation","locationFields","routeKey","seen","inheritedParent","normalizePageTarget","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","normalize","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","compareText","placementOwnerSortKey","identity","placementIdentityKey","comparePlacementIdentity","compareRegionPlacement","assertOwner","label","collectPlacements","placements","add","emptyRegions","composeOwnedPlacements","declared","closedKeys","closed","indexPlacements","indexed","placementShapeEqual","desired","valuesEqual","reconcileOwnedPlacements","retain","remove","desiredPlacement","currentPlacement","activationKeys","activate","PAGE_MAIN_SLOT_ID","isPageSlotClosable","slot","primarySlot","_kind","presentation","binding","pageSlots","main","requirePageSlot","slotId","emptyMainSlot","pagePlacementDeclarations","empty","pageStateOwnerKey","staticPageInstanceKey","ownsStaticPageInstance","instanceKey","pageStateKey","removePageStates","states","readComparisonValue","matchesTerm","trimmed","term","comparison","operator","rawValue","actual","expected","matchesContextExpression","expression","orClause","createContextKeyService","store","globalValues","ownerValues","buildValues","scopedValues","publish","action","_removed","rest","ownerId","assertActive","resolveResourcePreview","intent","changes","createResourcePreview","writes","refreshers","token","save","refresh","isWorkbenchViewHierarchyNode","node","resourceHierarchyCycleCode","sortHierarchyProviders","providers","walkResourceHierarchy","sorted","path","visitedKeys","parentKey","workbenchResourceTypeContextKey","workbenchResourceOwnerContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceKeyMetadataKey","isContextPrimitive","createWorkbenchResourceContextValues","isWorkbenchResourceContextKey","scopeWorkbenchResourceContextValues","scoped","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceKeys","selectionResourceKey","createResourceRegistry","removalListeners","removedListeners","cycleListeners","retained","snapshot","kind","record","kinds","extensionId","provider","entries","cycle","view","getKeybindingSteps","keybinding","normalizeKeybindingSequence","steps","createKeybindingRegistry","deps","projection","navigator","surfaceMap","getSurface","listAnchorRegions","resolveAnchorRegion","surface","anchorId","getAnchorResource","reconcileAnchors","actions","keep","isInScope","primary","headerLeadingMenuPath","headerTrailingMenuPath","workbenchRegionTabLeadingMenuPath","workbenchRegionTabAddMenuPath","workbenchCommandPaletteMenuPath","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","workbenchBreadcrumbLocationMenuPath","resourceContextMenuPath","resourceKind","resourceMatchesConstraint","constraint","stableValue","getNavigationTargetKey","_args","sources","setNavigationTreeNodeSource","source","getNavigationTreeNodeSource","registryToken","pageResourceContextKey","pageResourceInstanceKey","standardResourceIcons","rendererReadKey","lane","byOrderThenPriority","getSettingsPanels","createSettingsRegistry","collectionItems","itemKey","panelId","itemId","nextSections","nextPanels","id","reportUserActionError","runUserAction","reportError","workbench","run","pagePlacementClosed","contains","instance","pageLayoutContext","pageContextChanged","sharedKeys","mainTabNeedsCache","changingPage","restoreMainTabs","activated","entry","pageLayout","order","existing","refreshSharedPageTab","sharedPageTabValue","explicit","canRestoreSharedPageTab","leavingPage","restoreSharedPageTabs","sharedLayout","scopePageMainTabs","modeLayout","departing","editPagePlacementStates","edit","bindsToLocation","resolveOwnerResourceKey","exact","transfer","indexCurrentOwnedPlacements","findModePlacementTransfer","desiredIdentity","currentKey","indexCurrentWidgetOwners","owners","restoreModeWidgets","currentIds","restored","positions","ordered","sharedPositions","sharedIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","destinations","destination","desiredKeys","transferredCurrentKeys","transferredFromKey","currentOwner","ownerResourceKey","reconcileRegions","docked","dockedWorkbenchRegions","desiredByKey","pageOwnsPrimaryLocation","placedKeys","replacement","removedKeys","tray","opensPreviouslyEmptyRegion","closesEmptyPanel","normalizeRemovedState","activeLocation","fallbackLocation","fallbackActive","bindOwnedSubPanelsToLocation","updateOwnedWidgetLayout","desiredByIdentity","reconcileOwnedWidgetLayout","applyOwnedWidgetLayoutReconciliation","retainTrayPreviews","preferred","preferredEntry","plan","removeTrayPreviews","pageStates","departingPagePreviews","closeDepartingPagePreviews","incoming","renderersByWorkbench","setWorkbenchRenderers","renderers","getWorkbenchRenderers"],"sources":["../../pstdio-api-contracts/src/extension-kernel/page-params.ts","../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/tray-tabs.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/layout/panel-positions.ts","../src/core/registries/modes/mode-layout.ts","../src/core/registries/views/settle-read-batch.ts","../src/core/controllers/page-location/navigation-level.ts","../src/core/controllers/page-location/page-location-normalization.ts","../src/core/registries/layout/placement-reconciliation.ts","../src/core/registries/pages/page-main.ts","../src/core/registries/pages/page-state-key.ts","../src/core/shared/context/context-key-service.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/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/shared/contributions/reference-id.ts","../src/core/registries/navigation/navigation-target-key.ts","../src/core/registries/navigation/navigation-tree-node-source.ts","../src/core/registries/pages/page-resource-context.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/views/renderer-read-key.ts","../src/core/registries/settings/settings-registry.ts","../src/core/shared/run-user-action.ts","../src/core/controllers/page-runtime/page-main-tabs.ts","../src/core/registries/pages/page-placement-state.ts","../src/core/registries/layout/owned-placement-layout.ts","../src/core/controllers/page-runtime/tray-preview-retention.ts","../src/core/controllers/page-runtime/page-preview-lifetime.ts","../src/core/workbench-renderers.ts"],"sourcesContent":["import type { PageParamDefinition, PageParams, PageParamValue } from \"./types/pages\";\n\nexport type PageParamDefinitions = Readonly<Record<string, PageParamDefinition>>;\n\n// Existing host selectors keep their meaning. Future host keys must start with `_`.\nconst reserved = new Set([\"resource\", \"section\", \"document\", \"line\", \"column\", \"endLine\", \"endColumn\"]);\nconst invalid = (name: string) => new Error(`page_param_invalid: ${name}`);\nconst equal = (left: unknown, right: unknown) => JSON.stringify(left) === JSON.stringify(right);\n\nexport const isPageParamValue = (definition: PageParamDefinition, value: unknown): value is PageParamValue => {\n if (definition.type === \"string[]\") return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n if (definition.type === \"string\")\n return typeof value === \"string\" && (!definition.values || definition.values.includes(value));\n if (definition.type === \"number\") return typeof value === \"number\" && Number.isFinite(value);\n return typeof value === \"boolean\";\n};\n\nexport const validatePageParamDefinitions = (definitions: PageParamDefinitions = {}) => {\n if (Object.keys(definitions).length > 32) throw invalid(\"at most 32 params\");\n for (const [name, definition] of Object.entries(definitions)) {\n if (name.length > 64 || !/^[a-z][a-z0-9-]*$/.test(name) || reserved.has(name))\n throw new Error(`page_param_reserved: ${name}`);\n if (definition.default !== undefined && !isPageParamValue(definition, definition.default)) throw invalid(name);\n }\n};\n\nconst validateNames = (definitions: PageParamDefinitions, values: Readonly<Record<string, unknown>>) => {\n for (const name of Object.keys(values)) if (!Object.hasOwn(definitions, name)) throw invalid(name);\n};\n\nexport const normalizePageParams = (\n definitions: PageParamDefinitions = {},\n values: Readonly<Record<string, unknown>> = {},\n strict = true,\n) => {\n const result: Record<string, PageParamValue> = {};\n if (strict) validateNames(definitions, values);\n for (const name of Object.keys(definitions)) {\n if (!Object.hasOwn(values, name)) continue;\n const value = values[name];\n const definition = definitions[name]!;\n if (!isPageParamValue(definition, value)) {\n if (strict) throw invalid(name);\n continue;\n }\n if (equal(value, definition.default) || (Array.isArray(value) && !value.length)) continue;\n result[name] = Array.isArray(value) ? Object.freeze([...value]) : value;\n }\n const params = Object.keys(result).length ? Object.freeze(result) : undefined;\n if (pageParamsQuery(definitions, params).toString().length > 2048) {\n if (strict) throw invalid(\"query exceeds 2048 characters\");\n return undefined;\n }\n return params;\n};\n\nexport const resolvePageParams = (definitions: PageParamDefinitions = {}, params?: PageParams) => {\n const result: Record<string, PageParamValue> = {};\n for (const [name, definition] of Object.entries(definitions)) {\n if (definition.default !== undefined)\n result[name] = Array.isArray(definition.default) ? Object.freeze([...definition.default]) : definition.default;\n }\n return Object.freeze({ ...result, ...params });\n};\n\nexport const pageParamsQuery = (definitions: PageParamDefinitions = {}, params?: PageParams) => {\n const query = new URLSearchParams();\n for (const name of Object.keys(definitions)) {\n const value = params?.[name];\n if (value === undefined) continue;\n for (const item of Array.isArray(value) ? value : [value]) query.append(name, String(item));\n }\n return query;\n};\n\nexport const parsePageParams = (definitions: PageParamDefinitions = {}, query: URLSearchParams) => {\n const values: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(definitions)) {\n const items = query.getAll(name);\n if (!items.length || (definition.type !== \"string[]\" && items.length !== 1)) continue;\n const raw = items[0]!;\n if (definition.type === \"string[]\") values[name] = items;\n else if (definition.type === \"number\") {\n if (String(Number(raw)) === raw) values[name] = Number(raw);\n } else if (definition.type === \"boolean\") {\n if (raw === \"true\" || raw === \"false\") values[name] = raw === \"true\";\n } else values[name] = raw;\n }\n const params = normalizePageParams(definitions, values, false);\n return pageParamsQuery(definitions, params).toString().length <= 2048 ? params : undefined;\n};\n","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","import type { WorkbenchTabPosition, WorkbenchWidgetPlacement } from \"./layout-types\";\n\n// The incoming preview wins. Restored trays keep their selected preview, or the first one.\nexport const planTrayTabs = (widgets: readonly WorkbenchWidgetPlacement[], preferredWidgetId?: string) => {\n const previews = widgets.filter((widget) => widget.tabRetention === \"preview\");\n const preview = previews.find((widget) => widget.widgetId === preferredWidgetId) ?? previews[0];\n return {\n widgets: [...(preview ? [preview] : []), ...widgets.filter((widget) => widget.tabRetention !== \"preview\")],\n replaced: previews.filter((widget) => widget !== preview),\n };\n};\n\nexport const planTrayPlacement = (\n widgets: readonly WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) => {\n const remaining = widgets.filter((widget) => widget.widgetId !== placement.widgetId);\n let index = position === \"start\" ? 0 : remaining.length;\n if (typeof position === \"object\") {\n const before = \"beforeWidgetId\" in position;\n const target = before ? position.beforeWidgetId : position.afterWidgetId;\n const found = remaining.findIndex((widget) => widget.widgetId === target);\n if (found >= 0) index = found + (before ? 0 : 1);\n }\n remaining.splice(index, 0, placement);\n return planTrayTabs(remaining, placement.tabRetention === \"preview\" ? placement.widgetId : undefined);\n};\n\nexport const planTrayDrop = (\n widgets: readonly WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) =>\n planTrayPlacement(\n widgets,\n placement.tabRetention === \"preview\" ? { ...placement, pinned: true, tabRetention: \"persistent\" } : placement,\n position,\n );\n","export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","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 = {\n ...region,\n widgets,\n activeWidgetId,\n visible: widgets.length === 0 && (region.id === \"side\" || region.id === \"secondary\") ? false : region.visible,\n };\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 = { ...layout.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 === \"secondary\") && 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\" && regionId === \"main\"\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","export const panelPositions = {\n side: [\"left\", \"right\"],\n sidenav: [\"left\", \"right\"],\n main: [\"top\", \"bottom\"],\n secondary: [\"top\", \"bottom\"],\n activity: [\"left\", \"right\", \"top\", \"bottom\"],\n} as const;\n\nexport type WorkbenchPositionedRegion = keyof typeof panelPositions;\nexport type WorkbenchPanelPosition = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport interface WorkbenchArrangement {\n side: \"left\" | \"right\";\n sidenav: \"left\" | \"right\";\n secondary: \"top\" | \"bottom\";\n activity: WorkbenchPanelPosition;\n}\nexport const defaultArrangement: WorkbenchArrangement = {\n side: \"right\",\n sidenav: \"left\",\n secondary: \"bottom\",\n activity: \"left\",\n};\n\nexport const resolvePanelPosition = (arrangement: WorkbenchArrangement, region: WorkbenchPositionedRegion) => {\n if (region === \"main\") return arrangement.secondary === \"top\" ? \"bottom\" : \"top\";\n return arrangement[region];\n};\n\nconst supportedPosition = <T extends WorkbenchPanelPosition>(\n value: T | undefined,\n allowed: readonly T[],\n fallback: T,\n) => (value && allowed.includes(value) ? value : fallback);\n\nexport const resolveArrangement = (saved?: Partial<WorkbenchArrangement>) => ({\n side: supportedPosition(saved?.side, panelPositions.side, defaultArrangement.side),\n sidenav: supportedPosition(saved?.sidenav, panelPositions.sidenav, defaultArrangement.sidenav),\n secondary: supportedPosition(saved?.secondary, panelPositions.secondary, defaultArrangement.secondary),\n activity: supportedPosition(saved?.activity, panelPositions.activity, defaultArrangement.activity),\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 WorkbenchRegionSettings,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\nimport { defaultArrangement, resolveArrangement } from \"../layout/panel-positions\";\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) =>\n mode.panels ? [...new Set([\"main\" as const, ...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\n// Availability and close permissions constrain restored layouts as well as commands.\nexport const applyModePanelPolicy = (\n layout: WorkbenchLayout,\n mode: WorkbenchModeContribution | undefined,\n getSettings: (region: WorkbenchRegion) => WorkbenchRegionSettings | undefined,\n) => {\n let next = mode ? applyModePanelAvailability(layout, panelsForMode(mode)) : layout;\n for (const region of [\"side\", \"secondary\"] as const) {\n if (\n isWorkbenchModePanelAvailable(mode, region) &&\n getSettings(region)?.canClose === false &&\n !next.regions[region].visible\n ) {\n next = { ...next, regions: { ...next.regions, [region]: { ...next.regions[region], visible: true } } };\n }\n }\n if (!next.arrangement) return next;\n const arrangement = resolveArrangement(next.arrangement);\n for (const region of [\"side\", \"sidenav\", \"secondary\", \"activity\"] as const) {\n if (getSettings(region)?.movable === false || (region === \"secondary\" && getSettings(\"main\")?.movable === false))\n Object.assign(arrangement, { [region]: defaultArrangement[region] });\n }\n const unchanged = (Object.keys(arrangement) as (keyof typeof arrangement)[]).every(\n (region) => arrangement[region] === next.arrangement?.[region],\n );\n return unchanged ? next : { ...next, arrangement };\n};\n\nexport const restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n defaults: WorkbenchLayout,\n) => {\n if (!saved) {\n const cleared = clearRegions(current, allModeRegions);\n const regions = { ...cleared.regions };\n for (const regionId of allModeRegions) regions[regionId] = defaults.regions[regionId];\n return applyModePanelAvailability({ ...cleared, arrangement: defaults.arrangement, regions }, panels);\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, arrangement: saved.arrangement, 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","// 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 { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchModeContribution } from \"../../registries/modes/mode-registry\";\nimport type { NavigationTreeRegistry } from \"../../registries/navigation/navigation-tree-registry\";\nimport type { WorkbenchPageContribution } from \"../../registries/pages/page-registry\";\n\ninterface NavigationLevelsInput {\n location: PageLocation | undefined;\n pages: readonly WorkbenchPageContribution[];\n navigationTrees: NavigationTreeRegistry;\n}\n\n// The part of the mode registry that tells whether a mode replaces the project Sidenav.\nexport interface NavigationLevelModes {\n getMode(id: string): Pick<WorkbenchModeContribution, \"chrome\"> | undefined;\n}\n\n// The registries that decide whether a page leaves the project navigation.\nexport interface ProjectNavigationSources {\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n}\n\ntype ProjectNavigationInput = NavigationLevelsInput & ProjectNavigationSources;\n\nconst findPage = (location: PageLocation, pages: readonly WorkbenchPageContribution[]) =>\n pages.find(\n (candidate) => candidate.ref.id === location.page.id && candidate.ref.extensionId === location.page.extensionId,\n );\n\nconst levelOwner = (location: PageLocation, input: NavigationLevelsInput) => {\n const page = findPage(location, input.pages);\n return page ? input.navigationTrees.resolveOwner(\"page\", page.id, \"content\") : undefined;\n};\n\n// A page leaves the project navigation when it starts a Sidenav level, or when its mode replaces the\n// whole Sidenav, such as a mode with its own activity rail. Either way the project rows are gone.\nexport const leavesProjectNavigation = (location: PageLocation, input: ProjectNavigationInput) => {\n const page = findPage(location, input.pages);\n if (!page) return false;\n if (input.navigationTrees.resolveOwner(\"page\", page.id, \"content\")) return true;\n return input.modes.getMode(page.modeId)?.chrome?.sidenav !== undefined;\n};\n\n// A page with a content navigation tree starts a Sidenav level. Levels nest along the location's\n// parent chain; the list runs from the outermost level to the innermost one. A page opened inside\n// itself, such as a sub-ticket, stays one level, shown for its innermost location.\nexport const resolveNavigationLevels = (input: NavigationLevelsInput) => {\n const levels: { owner: NonNullable<ReturnType<NavigationTreeRegistry[\"resolveOwner\"]>>; location: PageLocation }[] =\n [];\n for (let current = input.location; current; current = current.parent) {\n const owner = levelOwner(current, input);\n if (owner && !levels.some((level) => level.owner.id === owner.id)) levels.unshift({ owner, location: current });\n }\n return levels;\n};\n\n// The part of a location's parent chain that sits before the first page that leaves the project\n// navigation. A location that starts outside it has none, so its breadcrumb cannot lead the user back.\n// Every level counts here, including a page opened inside itself, which the level list folds into one.\nexport const resolveRootLevelLocation = (input: ProjectNavigationInput) => {\n let rootLevel = input.location;\n for (let current = input.location; current; current = current.parent) {\n if (leavesProjectNavigation(current, input)) rootLevel = current.parent;\n }\n return rootLevel;\n};\n","import type {\n FileRendererSectionTarget,\n FileSourcePosition,\n NavigationTargetPage,\n PageLocation,\n PageParams,\n PageRef,\n ResourceRef,\n} from \"@pstdio/sdk/extensions\";\nimport { isFileSourcePosition } from \"@pstdio/sdk/extensions\";\nimport { normalizePageParams } from \"pstdio-api-contracts\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\n\nexport const workbenchPageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:page:${ref.id}`;\n\nconst pageForRef = (pages: readonly WorkbenchPageContribution[], ref: PageRef) =>\n pages.find((page) => workbenchPageRefKey(page.ref) === workbenchPageRefKey(ref));\n\nconst pageForId = (pages: readonly WorkbenchPageContribution[], pageId: string) =>\n pages.find((page) => page.id === pageId);\n\nconst canonicalSection = (section: FileRendererSectionTarget | undefined) => {\n if (!section) return undefined;\n const anchors = section.anchors.map((anchor) =>\n Object.freeze({\n id: anchor.id,\n heading: anchor.heading,\n ...(anchor.occurrence !== undefined ? { occurrence: anchor.occurrence } : {}),\n }),\n );\n return Object.freeze({ anchors: Object.freeze(anchors) }) as FileRendererSectionTarget;\n};\n\nconst cloneMetadata = (metadata: ResourceRef[\"metadata\"]) => {\n if (!metadata) return undefined;\n return JSON.parse(JSON.stringify(metadata)) as NonNullable<ResourceRef[\"metadata\"]>;\n};\n\nconst canonicalResource = (resource: ResourceRef | undefined, resources: WorkbenchPageResourceCodec) => {\n if (!resource) return undefined;\n const normalized = resources.normalize(resource);\n if (!normalized.type || !normalized.id) throw new Error(\"Page resource has no canonical type or id\");\n const canonical = {\n type: normalized.type,\n id: normalized.id,\n ...(normalized.projectId ? { projectId: normalized.projectId } : {}),\n ...(normalized.label ? { label: normalized.label } : {}),\n ...(normalized.icon ? { icon: normalized.icon } : {}),\n ...(normalized.extensionId ? { extensionId: normalized.extensionId } : {}),\n ...(normalized.metadata ? { metadata: cloneMetadata(normalized.metadata) } : {}),\n };\n return Object.freeze(canonical) as ResourceRef;\n};\n\nconst canonicalPageRef = (page: WorkbenchPageContribution) =>\n Object.freeze({ extensionId: page.ref.extensionId, kind: \"page\" as const, id: page.ref.id });\n\nconst sectionKey = (section: FileRendererSectionTarget | undefined) => (section ? JSON.stringify(section) : \"\");\n\nconst resourceKey = (location: PageLocation, resources: WorkbenchPageResourceCodec) =>\n location.resource ? resources.toUri(resources.normalize(location.resource)) : \"\";\n\n// Same page and resource identity. The section is a position inside that resource.\nconst sharesPageResource = (left: PageLocation, right: PageLocation, resources: WorkbenchPageResourceCodec) =>\n workbenchPageRefKey(left.page) === workbenchPageRefKey(right.page) &&\n resourceKey(left, resources) === resourceKey(right, resources);\n\nexport const workbenchPageLocationRouteKey = (\n location: PageLocation,\n resources: WorkbenchPageResourceCodec,\n pages: readonly WorkbenchPageContribution[] = [],\n) => {\n const declaration = pageForRef(pages, location.page)?.document;\n const document = declaration ? location.resource?.metadata?.[declaration.metadataKey] : undefined;\n return JSON.stringify([\n workbenchPageRefKey(location.page),\n resourceKey(location, resources),\n document ?? null,\n location.position\n ? [\n location.position.line,\n location.position.column ?? 1,\n location.position.endLine ?? null,\n location.position.endColumn ?? null,\n ]\n : null,\n sectionKey(location.section),\n ]);\n};\n\nexport const workbenchPageLocationKey = (\n location: PageLocation,\n resources: WorkbenchPageResourceCodec,\n pages: readonly WorkbenchPageContribution[] = [],\n): string => {\n const own = workbenchPageLocationRouteKey(location, resources, pages);\n return location.parent ? `${own}>${workbenchPageLocationKey(location.parent, resources, pages)}` : own;\n};\n\nexport const workbenchPageLocationsEqual = (\n left: PageLocation | undefined,\n right: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n pages: readonly WorkbenchPageContribution[] = [],\n) => {\n let a = left;\n let b = right;\n while (a && b) {\n if (\n workbenchPageLocationRouteKey(a, resources, pages) !== workbenchPageLocationRouteKey(b, resources, pages) ||\n JSON.stringify(a.params ?? {}) !== JSON.stringify(b.params ?? {})\n )\n return false;\n a = a.parent;\n b = b.parent;\n }\n return a === b;\n};\n\nconst canonicalPosition = (position: FileSourcePosition) =>\n Object.isFrozen(position)\n ? position\n : Object.freeze({\n line: position.line,\n ...(position.column !== undefined ? { column: position.column } : {}),\n ...(position.endLine !== undefined ? { endLine: position.endLine } : {}),\n ...(position.endColumn !== undefined ? { endColumn: position.endColumn } : {}),\n });\n\nconst createLocation = (input: {\n page: WorkbenchPageContribution;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n position?: FileSourcePosition;\n params?: PageParams;\n parent?: PageLocation;\n resources: WorkbenchPageResourceCodec;\n}) => {\n const key = input.page.document?.metadataKey;\n const document = key ? input.resource?.metadata?.[key] : undefined;\n if (document !== undefined && (typeof document !== \"string\" || !document))\n throw new Error(\"Page location has an invalid document\");\n if (input.position && (!key || !document || input.section || !isFileSourcePosition(input.position)))\n throw new Error(\"Page location has an invalid source position\");\n return Object.freeze({\n page: canonicalPageRef(input.page),\n ...(input.params ? { params: input.params } : {}),\n ...(input.resource ? { resource: canonicalResource(input.resource, input.resources) } : {}),\n ...(input.section ? { section: canonicalSection(input.section) } : {}),\n ...(input.position\n ? {\n position: canonicalPosition(input.position),\n }\n : {}),\n ...(input.parent ? { parent: input.parent } : {}),\n }) as PageLocation;\n};\n\nconst declaredParent = (input: {\n page: WorkbenchPageContribution;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n}): PageLocation | undefined => {\n if (!input.page.parentId) return undefined;\n const parent = pageForId(input.pages, input.page.parentId);\n if (!parent) throw new Error(`Unknown parent page: ${input.page.parentId}`);\n return normalizeResolvedLocation({\n page: parent,\n pages: input.pages,\n resources: input.resources,\n seen: input.seen,\n });\n};\n\nconst locationFields = (location: Pick<PageLocation, \"resource\" | \"section\" | \"position\" | \"params\">) => ({\n resource: location.resource,\n section: location.section,\n position: location.position,\n params: location.params,\n});\n\nconst normalizeResolvedLocation = (input: {\n page: WorkbenchPageContribution;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n position?: FileSourcePosition;\n params?: PageParams;\n parent?: PageLocation;\n}): PageLocation => {\n const candidate = createLocation({\n page: input.page,\n resources: input.resources,\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n ...(input.position ? { position: input.position } : {}),\n ...(input.params ? { params: input.params } : {}),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources, input.pages);\n if (input.seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${input.page.id}`);\n const seen = new Set(input.seen).add(routeKey);\n const parent =\n input.parent ?? declaredParent({ page: input.page, pages: input.pages, resources: input.resources, seen });\n return createLocation({\n page: input.page,\n resources: input.resources,\n ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(candidate.position ? { position: candidate.position } : {}),\n ...(candidate.params ? { params: candidate.params } : {}),\n ...(parent ? { parent } : {}),\n });\n};\n\n// A page that re-targets its own resource, such as selecting another file in the open\n// workspace, keeps its place in the hierarchy instead of falling back to its declared parent.\nconst inheritedParent = (\n candidate: PageLocation,\n active: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) => (active?.parent && sharesPageResource(candidate, active, resources) ? active.parent : undefined);\n\nconst normalizePageTarget = (input: {\n target: NavigationTargetPage;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n seen: Set<string>;\n active?: PageLocation;\n}): { pageId: string; location: PageLocation; open?: NavigationTargetPage[\"open\"] } => {\n const page = pageForRef(input.pages, input.target.page);\n if (!page) throw new Error(`Unknown page: ${workbenchPageRefKey(input.target.page)}`);\n const candidate = createLocation({\n page,\n resources: input.resources,\n ...(input.target.resource ? { resource: input.target.resource } : {}),\n ...(input.target.section ? { section: input.target.section } : {}),\n ...(input.target.position ? { position: { ...input.target.position } } : {}),\n params: normalizePageParams(page.params, input.target.params),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources, input.pages);\n if (input.seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${page.id}`);\n const seen = new Set(input.seen).add(routeKey);\n const contextualParent = input.target.parent\n ? normalizePageTarget({ target: input.target.parent, pages: input.pages, resources: input.resources, seen })\n .location\n : inheritedParent(candidate, input.active, input.resources);\n const location = normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen: input.seen,\n ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(candidate.position ? { position: candidate.position } : {}),\n ...(candidate.params ? { params: candidate.params } : {}),\n ...(contextualParent ? { parent: contextualParent } : {}),\n });\n return { pageId: page.id, location, ...(input.target.open ? { open: input.target.open } : {}) };\n};\n\nexport const normalizeWorkbenchPageTarget = (input: {\n target: NavigationTargetPage;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n active?: PageLocation;\n}) => normalizePageTarget({ ...input, seen: new Set() });\n\nexport const normalizeWorkbenchPageLocation = (input: {\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n}) => {\n const normalize = (location: PageLocation, seen: Set<string>): { pageId: string; location: PageLocation } => {\n const page = pageForRef(input.pages, location.page);\n if (!page) throw new Error(`Unknown page: ${workbenchPageRefKey(location.page)}`);\n const candidate = createLocation({\n page,\n resources: input.resources,\n ...(location.resource ? { resource: location.resource } : {}),\n ...(location.section ? { section: location.section } : {}),\n ...(location.position ? { position: location.position } : {}),\n params: normalizePageParams(page.params, location.params, false),\n });\n const routeKey = workbenchPageLocationRouteKey(candidate, input.resources, input.pages);\n if (seen.has(routeKey)) throw new Error(`Page location parent cycle reaches ${page.id}`);\n const nextSeen = new Set(seen).add(routeKey);\n const explicitParent = location.parent ? normalize(location.parent, nextSeen).location : undefined;\n return {\n pageId: page.id,\n location: normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen,\n ...locationFields(candidate),\n ...(explicitParent ? { parent: explicitParent } : {}),\n }),\n };\n };\n return normalize(input.location, new Set());\n};\n\nexport const normalizeDirectWorkbenchPageLocation = (input: {\n pageId: string;\n pages: readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n resource?: ResourceRef;\n section?: FileRendererSectionTarget;\n position?: FileSourcePosition;\n params?: PageParams;\n}) => {\n const page = pageForId(input.pages, input.pageId);\n if (!page) throw new Error(`Unknown page: ${input.pageId}`);\n return {\n pageId: page.id,\n location: normalizeResolvedLocation({\n page,\n pages: input.pages,\n resources: input.resources,\n seen: new Set(),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n ...(input.position ? { position: input.position } : {}),\n ...(input.params ? { params: input.params } : {}),\n }),\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\nexport interface PlacementDestination {\n identity: PlacementIdentity;\n region: WorkbenchRegion;\n}\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 destinations?: readonly PlacementDestination[];\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 destinations?: readonly PlacementDestination[];\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 if (modeIds.size > 1) throw new Error(\"Mode placements must belong to one active mode\");\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 {\n add,\n retain,\n update,\n activate,\n remove,\n ...(input.destinations?.length ? { destinations: input.destinations } : {}),\n };\n};\n","import type { ResourceBinding } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageSlot } from \"./page-registry-types\";\n\nexport const PAGE_MAIN_SLOT_ID = \"$main\";\n\nexport interface ResolvedPageSlot extends WorkbenchPageSlot {\n readonly role: \"primary\" | \"auxiliary\";\n}\n\nexport const isPageSlotClosable = (slot: ResolvedPageSlot) => {\n if (slot.item.kind === \"view\") return slot.item.presence !== \"fixed\";\n // A single-resource Main is the page itself, not a dismissible resource tab.\n return slot.role !== \"primary\" || slot.item.binding.cardinality === \"many\";\n};\n\nexport const primarySlot = (page: WorkbenchPageContribution): ResolvedPageSlot | undefined => {\n if (page.main.kind !== \"view\") return undefined;\n const { kind: _kind, view, cardinality, ...presentation } = page.main;\n const binding: ResourceBinding | undefined = page.resource ? { ...page.resource, view, cardinality } : undefined;\n return {\n ...presentation,\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: binding ? { kind: \"binding\", binding } : { kind: \"view\", view, presence: \"fixed\" },\n };\n};\n\nexport const pageSlots = (page: WorkbenchPageContribution): ResolvedPageSlot[] => {\n const main = primarySlot(page);\n return [...(main ? [main] : []), ...page.slots.map((slot) => ({ ...slot, role: \"auxiliary\" as const }))];\n};\n\nexport const requirePageSlot = (page: WorkbenchPageContribution, slotId: string) => {\n const slot = pageSlots(page).find((candidate) => candidate.id === slotId);\n if (!slot) throw new Error(`Unknown page slot: ${page.id}.${slotId}`);\n return slot;\n};\n\nexport const emptyMainSlot = (page: WorkbenchPageContribution): ResolvedPageSlot | undefined => {\n if (page.main.kind !== \"panels\") return undefined;\n return {\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: { kind: \"view\", view: page.main.empty, presence: \"fixed\" },\n };\n};\nexport const pagePlacementDeclarations = (page: WorkbenchPageContribution) => {\n const empty = emptyMainSlot(page);\n return [...pageSlots(page), ...(empty ? [empty] : [])];\n};\n","import type { PageLocation, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { workbenchPageLocationKey } from \"../../controllers/page-location/page-location-normalization\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"./page-registry-types\";\n\nexport const pageStateOwnerKey = (\n page: WorkbenchPageContribution,\n resource: ResourceRef | undefined,\n resources: WorkbenchPageResourceCodec,\n) =>\n page.resource && resource\n ? `${page.id}|${JSON.stringify([\n resources.toUri(resources.normalize(resource)),\n page.document ? resource.metadata?.[page.document.metadataKey] : null,\n ])}`\n : page.id;\n\nexport const staticPageInstanceKey = (\n page: WorkbenchPageContribution,\n resource: ResourceRef | undefined,\n resources: WorkbenchPageResourceCodec,\n) => (page.resource && resource ? pageStateOwnerKey(page, resource, resources) : \"default\");\n\nexport const ownsStaticPageInstance = (key: string, pageId: string, instanceKey: string) => {\n const owner = instanceKey === \"default\" ? pageId : instanceKey;\n return key === owner || key.startsWith(`${owner}|`);\n};\n\nexport const pageStateKey = (\n page: WorkbenchPageContribution,\n location: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) => {\n if (page.resource) return pageStateOwnerKey(page, location?.resource, resources);\n return page.main.kind === \"panels\" && location\n ? `${page.id}|${workbenchPageLocationKey({ ...location, position: undefined }, resources)}`\n : page.id;\n};\n\nexport const removePageStates = <State>(states: Readonly<Record<string, State>>, pageId: string) =>\n Object.fromEntries(Object.entries(states).filter(([key]) => key !== pageId && !key.startsWith(`${pageId}|`)));\n","import type { 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 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, RelatedResourceOpenings, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\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 extensionId?: string;\n relatedOpenings?(\n resource: ResourceRef,\n signal: AbortSignal,\n ): RelatedResourceOpenings | Promise<RelatedResourceOpenings>;\n label: string;\n icon?: string;\n /** Read current owner data without storing a second copy in the workbench. */\n resolve?(resource: ResourceRef): ResourceRef | undefined;\n subscribe?(listener: () => void): Disposable | (() => void);\n}\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n indicator?: { icon: string; color?: string; label?: string };\n target?: NavigationTarget;\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 /** Direct relationships in the owner's recent-first order. */\n related?(resource: ResourceRef): 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 onDidRemove(listener: (resource: ResourceRef) => void): Disposable;\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string, extensionId?: string): RegisteredResourceKind | undefined;\n listKinds(): RegisteredResourceKind[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n listRelatedResources(resource: ResourceRef): 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 removedListeners = new Set<(resource: ResourceRef) => void>();\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 const retained = [...removalListeners].flatMap((listener) => listener(resource));\n try {\n input.remove?.(resource, retained);\n } finally {\n for (const listener of removedListeners) listener(resource);\n }\n },\n onWillRemove(listener) {\n removalListeners.add(listener);\n return createDisposable(() => removalListeners.delete(listener));\n },\n onDidRemove(listener) {\n removedListeners.add(listener);\n return createDisposable(() => removedListeners.delete(listener));\n },\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n const key = kind.extensionId ? `${kind.extensionId}:${kind.kind}` : kind.kind;\n if (snapshot.kinds[key]) throw new Error(`Resource kind already registered: ${key}`);\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [key]: record } }, false, \"registerKind\");\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[key] !== record) return;\n const { [key]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n getKind(kind, extensionId) {\n const kinds = store.getState().kinds;\n if (extensionId) return kinds[`${extensionId}:${kind}`] ?? kinds[kind];\n return kinds[kind] ?? Object.values(kinds).find((candidate) => candidate.kind === 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 listRelatedResources(resource) {\n return Object.values(store.getState().providers).flatMap((provider) => provider.related?.(resource) ?? []);\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 { 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\" ||\n (placement.role === \"sub-panel\" &&\n (Boolean(placement.ownerResourceKey) ||\n placement.placementIdentity?.kind === \"shell\" ||\n placement.placementIdentity?.kind === \"mode\"));\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 { ResourceConstraint, ResourceRef } from \"@pstdio/sdk/extensions\";\n\nexport const resourceMatchesConstraint = (constraint: ResourceConstraint, resource: ResourceRef) =>\n constraint.kinds.some(\n (kind) =>\n kind.id === resource.type &&\n (!resource.extensionId || !kind.extensionId || resource.extensionId === kind.extensionId),\n );\n","import type { 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","import { type ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateOwnerKey } from \"./page-state-key\";\n\nexport const pageResourceContextKey = (\n page: WorkbenchPageContribution | undefined,\n resource: ResourceRef | undefined,\n) =>\n JSON.stringify([\n resourceKey(resource),\n page?.document ? (resource?.metadata?.[page.document.metadataKey] ?? null) : null,\n ]);\n\nexport const pageResourceInstanceKey = (\n page: WorkbenchPageContribution,\n resource: ResourceRef,\n resources: WorkbenchPageResourceCodec,\n) => {\n const normalized = resources.normalize(resource);\n if (page.document && page.resource && resourceMatchesConstraint(page.resource, normalized))\n return pageStateOwnerKey(page, normalized, resources);\n return resources.toUri(normalized);\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 { 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","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n/** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */\nexport type SettingsScope = \"global\" | \"project\";\n\n/** A \"+ create\"-style action surfaced on a section or a collection's parent node. */\nexport interface SettingsAction {\n id: string;\n label: string;\n icon?: string;\n run(): void | Promise<void>;\n}\n\n/** An ordered sidenav container. Headerless when `title` is omitted. */\nexport interface SettingsSectionContribution {\n id: string;\n title?: string;\n order?: number;\n scope?: SettingsScope;\n actions?: SettingsAction[];\n}\nexport type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;\n\n/** A preference this panel edits; a bare string uses the preference name as its label. */\nexport type SettingsPanelPreference = string | { name: string; label?: string };\n\nexport interface SettingsPanelBase {\n id: string;\n title: string;\n description?: string;\n /** Section id this panel belongs to. */\n section?: string;\n /** Render this view inside an existing settings panel instead of a navigation entry. */\n parentPanelId?: string;\n icon?: string;\n /** Lower sorts first; ties fall back to contribution priority then registration order. */\n order?: number;\n scope?: SettingsScope;\n when?: string;\n}\n\n/** Auto-rendered as a param editor from the registered preference schema. */\nexport interface SchemaSettingsPanel extends SettingsPanelBase {\n kind: \"schema\";\n preferences: SettingsPanelPreference[];\n /** \"live\" persists on change (default); \"apply\" stages edits behind Save/Discard. */\n save?: \"live\" | \"apply\";\n}\n\nexport interface ViewSettingsPanel extends SettingsPanelBase {\n kind: \"view\";\n viewId: string;\n}\n\nexport interface SettingsCollectionGroupBy<TItem> {\n key(item: TItem): string;\n order?: string[];\n label(key: string): string;\n icon?(key: string): string | undefined;\n}\n\n/**\n * A data-driven list of items, each opening a contributor-supplied editor. The\n * framework knows nothing about what an item is — it only calls these hooks.\n */\nexport interface CollectionSettingsPanel<TItem = unknown> extends SettingsPanelBase {\n kind: \"collection\";\n viewId: string;\n items(): TItem[] | Promise<TItem[]>;\n itemId(item: TItem): string;\n itemLabel(item: TItem): string;\n itemIcon?(item: TItem): string | undefined;\n groupBy?: SettingsCollectionGroupBy<TItem>;\n actions?: SettingsAction[];\n}\n\nexport type SettingsPanelContribution = SchemaSettingsPanel | ViewSettingsPanel | CollectionSettingsPanel;\nexport type RegisteredSettingsPanel = SettingsPanelContribution & RegisteredContributionMetadata;\n\nexport interface SettingsRegistryStoreState {\n sections: Record<string, RegisteredSettingsSection>;\n panels: Record<string, RegisteredSettingsPanel>;\n /** Bumped by refresh() so the surface re-reads collection items() after backing data changes. */\n revision: number;\n}\n\nexport interface SettingsRegistry {\n store: WorkbenchStore<SettingsRegistryStoreState>;\n registerSection(section: SettingsSectionContribution, metadata?: ContributionMetadata): Disposable;\n registerPanel<TItem = unknown>(\n panel: SchemaSettingsPanel | ViewSettingsPanel | CollectionSettingsPanel<TItem>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getSection(id: string): RegisteredSettingsSection | undefined;\n getPanel(id: string): RegisteredSettingsPanel | undefined;\n listSections(): RegisteredSettingsSection[];\n listPanels(): RegisteredSettingsPanel[];\n resolveCollectionItem(panelId: string, itemId: string): Promise<unknown | undefined>;\n getCollectionItem(panelId: string, itemId: string): unknown | undefined;\n /** Signal that a collection's backing data changed so the surface refreshes. */\n refresh(): void;\n}\n\nconst byOrderThenPriority = <T extends RegisteredContributionMetadata & { order?: number }>(left: T, right: T) =>\n (left.order ?? 0) - (right.order ?? 0) || byContributionPriority(left, right);\n\nexport const getSettingsPanels = (state: SettingsRegistryStoreState) =>\n Object.values(state.panels).sort(byOrderThenPriority);\n\nexport const createSettingsRegistry = (input: { hasView?: (viewId: string) => boolean } = {}): SettingsRegistry => {\n const store = createWorkbenchStore<SettingsRegistryStoreState>({\n name: \"workbench.settings\",\n initialState: { sections: {}, panels: {}, revision: 0 },\n });\n const collectionItems = new Map<string, unknown>();\n const itemKey = (panelId: string, itemId: string) => JSON.stringify([panelId, itemId]);\n\n return {\n store,\n\n refresh() {\n collectionItems.clear();\n const snapshot = store.getState();\n store.setState({ ...snapshot, revision: snapshot.revision + 1 }, false, \"refreshSettings\");\n },\n\n registerSection(section, metadata) {\n const snapshot = store.getState();\n if (snapshot.sections[section.id]) throw new Error(`Settings section already registered: ${section.id}`);\n\n const record = { ...normalizeContributionMetadata(metadata), ...section } as RegisteredSettingsSection;\n store.setState(\n { ...snapshot, sections: { ...snapshot.sections, [section.id]: record } },\n false,\n \"registerSection\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.sections[section.id] !== record) return;\n const { [section.id]: _removed, ...nextSections } = current.sections;\n store.setState({ ...current, sections: nextSections }, false, \"unregisterSection\");\n });\n },\n\n registerPanel(panel, metadata) {\n const snapshot = store.getState();\n if (snapshot.panels[panel.id]) throw new Error(`Settings panel already registered: ${panel.id}`);\n if (panel.kind !== \"schema\" && input.hasView && !input.hasView(panel.viewId)) {\n throw new Error(`Settings panel View is not registered: ${panel.viewId}`);\n }\n\n const record = { ...normalizeContributionMetadata(metadata), ...panel } as RegisteredSettingsPanel;\n store.setState({ ...snapshot, panels: { ...snapshot.panels, [panel.id]: record } }, false, \"registerPanel\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.panels[panel.id] !== record) return;\n const { [panel.id]: _removed, ...nextPanels } = current.panels;\n for (const key of collectionItems.keys()) {\n if (key.startsWith(`[\"${panel.id}\",`)) collectionItems.delete(key);\n }\n store.setState({ ...current, panels: nextPanels }, false, \"unregisterPanel\");\n });\n },\n\n getSection(id) {\n return store.getState().sections[id];\n },\n\n getPanel(id) {\n return store.getState().panels[id];\n },\n\n listSections() {\n return Object.values(store.getState().sections).sort(byOrderThenPriority);\n },\n\n listPanels() {\n return getSettingsPanels(store.getState());\n },\n\n async resolveCollectionItem(panelId, itemId) {\n const panel = store.getState().panels[panelId];\n if (!panel || panel.kind !== \"collection\") return undefined;\n const item = (await panel.items()).find((candidate) => panel.itemId(candidate) === itemId);\n if (item !== undefined) collectionItems.set(itemKey(panelId, itemId), item);\n return item;\n },\n\n getCollectionItem: (panelId, itemId) => collectionItems.get(itemKey(panelId, itemId)),\n };\n};\n","import type { NotificationRegistry } from \"../registries/notifications/notification-registry\";\n\nexport const reportUserActionError = (\n workbench: { notifications: Pick<NotificationRegistry, \"captureActionError\"> },\n label: string,\n error: unknown,\n) => {\n workbench.notifications.captureActionError(label)(error);\n};\n\n// Capture the originating view before awaiting work, so switching focus cannot\n// move its failure into another view. Dialogs may keep their own rejected promise.\nexport const runUserAction = async (\n workbench: { notifications: Pick<NotificationRegistry, \"captureActionError\"> },\n label: string,\n run: () => unknown,\n options?: { inlineTarget?: string; onSuccess?: () => void },\n) => {\n const reportError = workbench.notifications.captureActionError(label, options?.inlineTarget);\n try {\n await run();\n options?.onSuccess?.();\n } catch (error) {\n reportError(error);\n }\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchWidgetPlacement,\n} from \"../../registries/layout/layout-types\";\nimport { placementIdentityKey, reconcileOwnedPlacements } from \"../../registries/layout/placement-reconciliation\";\nimport { pagePlacementDeclarations } from \"../../registries/pages/page-main\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport { pageResourceContextKey } from \"../../registries/pages/page-resource-context\";\nimport { ownsStaticPageInstance } from \"../../registries/pages/page-state-key\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\n\ntype State = WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>;\n\nconst pagePlacementClosed = (widget: WorkbenchWidgetPlacement, next: State, previous: State) => {\n const identity = widget.placementIdentity;\n if (identity?.kind !== \"page\") return false;\n const contains = (key: string, state: State[\"pageStates\"][string] | undefined) =>\n (ownsStaticPageInstance(key, identity.pageId, identity.instanceKey) &&\n state?.openStaticSlotIds.includes(identity.slotId)) ||\n state?.resourceInstances[identity.slotId]?.some((instance) => instance.instanceKey === identity.instanceKey);\n return Object.entries(previous.pageStates).some(\n ([key, state]) =>\n (key === identity.pageId || key.startsWith(`${identity.pageId}|`)) &&\n contains(key, state) &&\n !contains(key, next.pageStates[key]),\n );\n};\n\nexport const pageLayoutContext = (state: State) => ({\n projectId: state.projectId,\n modeId: state.activeModeId,\n pageId: state.activePageId,\n resource: state.location?.resource,\n});\n\nexport const pageContextChanged = (next: State, previous: State) =>\n next.projectId !== previous.projectId ||\n next.activeModeId !== previous.activeModeId ||\n next.activePageId !== previous.activePageId ||\n pageResourceContextKey(next.pages[next.activePageId ?? \"\"], next.location?.resource) !==\n pageResourceContextKey(previous.pages[previous.activePageId ?? \"\"], previous.location?.resource);\n\nconst sharedKeys = (layout: WorkbenchLayout | undefined, main: boolean) =>\n new Set(\n Object.values(layout?.regions ?? {}).flatMap((region) =>\n region.widgets.flatMap((widget) =>\n (region.id === \"main\") === main && widget.placementIdentity\n ? [placementIdentityKey(widget.placementIdentity)]\n : [],\n ),\n ),\n );\n\ninterface PageTabsInput {\n state: State;\n previous: State;\n layout: WorkbenchLayout;\n pageLayout?: WorkbenchLayout;\n modeLayout?: WorkbenchLayout;\n getWidget(contributionId: string): RegisteredWidgetContribution | undefined;\n}\n\nconst mainTabNeedsCache = (widget: WorkbenchWidgetPlacement, state: State, changingPage: boolean) => {\n const identity = widget.placementIdentity;\n if (!identity) return false;\n if (identity.kind !== \"page\") return changingPage;\n if (identity.pageId !== state.activePageId) return true;\n const page = state.pages[identity.pageId];\n const slot = page && pagePlacementDeclarations(page).find((slot) => slot.id === identity.slotId);\n const constraint = slot?.item.kind === \"binding\" ? slot.item.binding : page?.resource;\n // A changed declaration must not restore a resource that its slot no longer accepts.\n if (constraint && (!widget.resource || !resourceMatchesConstraint(constraint, widget.resource))) return false;\n return Boolean(\n page?.resource &&\n pageResourceContextKey(page, widget.resource) !== pageResourceContextKey(page, state.location?.resource),\n );\n};\n\nconst restoreMainTabs = (input: PageTabsInput, current: State[\"placements\"], shared: ReadonlySet<string>) => {\n const { state, previous, layout, pageLayout } = input;\n const changingPage = pageContextChanged(state, previous);\n const activated = new Set(state.reconciliation.activate.map((entry) => placementIdentityKey(entry.identity)));\n let placements = [...current];\n const main = changingPage ? pageLayout?.regions.main.widgets : layout.regions.main.widgets;\n for (const [order, widget] of (main ?? []).entries()) {\n const identity = widget.placementIdentity;\n if (!identity || !input.getWidget(widget.contributionId) || pagePlacementClosed(widget, state, previous)) continue;\n if (!mainTabNeedsCache(widget, state, changingPage)) continue;\n const key = placementIdentityKey(identity);\n if (shared.has(key)) continue;\n const existing = placements.find((entry) => placementIdentityKey(entry.identity) === key);\n placements = placements.filter((entry) => placementIdentityKey(entry.identity) !== key);\n placements.push({\n identity,\n region: \"main\",\n order,\n value: activated.has(key) && existing ? existing.value : widget,\n });\n }\n return placements;\n};\n\nconst refreshSharedPageTab = (input: PageTabsInput, widget: WorkbenchWidgetPlacement) => {\n const identity = widget.placementIdentity;\n if (identity?.kind !== \"page\" || !widget.resource) return widget;\n const instance = Object.entries(input.state.pageStates)\n .filter(([key]) => key === identity.pageId || key.startsWith(`${identity.pageId}|`))\n .flatMap(([, page]) => page.resourceInstances[identity.slotId] ?? [])\n .find(\n (entry) =>\n entry.instanceKey === identity.instanceKey && resourceKey(entry.resource) === resourceKey(widget.resource),\n );\n if (!instance) return widget;\n return {\n ...widget,\n resource: instance.resource,\n title: instance.resource.label ?? input.getWidget(widget.contributionId)?.title ?? widget.title,\n };\n};\n\nconst sharedPageTabValue = (input: PageTabsInput, widget: WorkbenchWidgetPlacement) => {\n const key = placementIdentityKey(widget.placementIdentity!);\n const explicit = input.state.reconciliation.activate.find((entry) => placementIdentityKey(entry.identity) === key);\n return explicit ? { ...explicit.value, widgetId: widget.widgetId } : refreshSharedPageTab(input, widget);\n};\n\nconst canRestoreSharedPageTab = (input: PageTabsInput, widget: WorkbenchWidgetPlacement, leavingPage: boolean) => {\n const identity = widget.placementIdentity;\n return (\n identity?.kind === \"page\" &&\n Boolean(input.getWidget(widget.contributionId)) &&\n input.state.pages[identity.pageId]?.modeId === input.state.activeModeId &&\n !(leavingPage && widget.tabRetention === \"preview\") &&\n !pagePlacementClosed(widget, input.state, input.previous)\n );\n};\n\nconst restoreSharedPageTabs = (input: PageTabsInput, current: State[\"placements\"], sharedLayout?: WorkbenchLayout) => {\n const { state, previous } = input;\n const leavingPage =\n pageContextChanged(state, previous) &&\n state.projectId === previous.projectId &&\n state.activeModeId === previous.activeModeId;\n let placements = [...current];\n // A placement's owner creates its content; its actual tray determines its\n // navigation lifetime. Page-created tabs in Side/Bottom share the mode too.\n for (const region of Object.values(sharedLayout?.regions ?? {})) {\n if (region.id !== \"side\" && region.id !== \"secondary\") continue;\n for (const [order, widget] of region.widgets.entries()) {\n const identity = widget.placementIdentity;\n if (!identity || !canRestoreSharedPageTab(input, widget, leavingPage)) continue;\n const key = placementIdentityKey(identity);\n placements = placements.filter((entry) => placementIdentityKey(entry.identity) !== key);\n placements.push({ identity, region: region.id, order, value: sharedPageTabValue(input, widget) });\n }\n }\n return placements;\n};\n\nexport const scopePageMainTabs = (input: PageTabsInput) => {\n const { state, previous, layout, modeLayout } = input;\n if (!state.activePageId) return state;\n const changingPage = pageContextChanged(state, previous);\n const sameMode = state.projectId === previous.projectId && state.activeModeId === previous.activeModeId;\n const sharedLayout = sameMode ? layout : modeLayout;\n const departing = previous.activePageId ? sharedKeys(layout, true) : new Set<string>();\n const shared = sharedKeys(sharedLayout, false);\n const activated = new Set(state.reconciliation.activate.map((entry) => placementIdentityKey(entry.identity)));\n const retained = state.placements.filter((entry) => {\n const key = placementIdentityKey(entry.identity);\n return !changingPage || !departing.has(key) || shared.has(key) || activated.has(key);\n });\n const placements = restoreSharedPageTabs(input, restoreMainTabs(input, retained, shared), sharedLayout);\n return {\n ...state,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: previous.placements,\n desired: placements,\n destinations: state.reconciliation.destinations,\n activate: state.reconciliation.activate\n .filter((entry) =>\n placements.some(\n (candidate) => placementIdentityKey(candidate.identity) === placementIdentityKey(entry.identity),\n ),\n )\n .map((entry) => entry.identity),\n valuesEqual: (left, right) => JSON.stringify(left) === JSON.stringify(right),\n }),\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRuntimeState } from \"./page-registry-types\";\nimport { ownsStaticPageInstance } from \"./page-state-key\";\n\nexport type PagePlacementEdit = { kind: \"close\" } | { kind: \"retention\"; open: \"pin\" | \"preview\" };\n\n// A shared tab can outlive its source location. Edit its owner instances without\n// assuming that the current route still belongs to that owner.\nexport const editPagePlacementStates = (\n states: Readonly<Record<string, WorkbenchPageRuntimeState>>,\n identity: Extract<PlacementIdentity, { kind: \"page\" }>,\n edit: PagePlacementEdit,\n) =>\n Object.fromEntries(\n Object.entries(states).map(([key, current]) => {\n if (key !== identity.pageId && !key.startsWith(`${identity.pageId}|`)) return [key, current];\n const instances = current.resourceInstances[identity.slotId] ?? [];\n const remaining = instances.flatMap((instance) => {\n if (instance.instanceKey !== identity.instanceKey) return [instance];\n return edit.kind === \"close\" ? [] : [{ ...instance, open: edit.open }];\n });\n return [\n key,\n {\n ...current,\n openStaticSlotIds:\n edit.kind === \"close\" && ownsStaticPageInstance(key, identity.pageId, identity.instanceKey)\n ? current.openStaticSlotIds.filter((id) => id !== identity.slotId)\n : current.openStaticSlotIds,\n resourceInstances: { ...current.resourceInstances, [identity.slotId]: remaining },\n activePrimaryInstanceKey:\n edit.kind === \"close\" && current.activePrimaryInstanceKey === identity.instanceKey\n ? remaining.at(-1)?.instanceKey\n : current.activePrimaryInstanceKey,\n },\n ];\n }),\n );\n","import { dockedWorkbenchRegions, type PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport {\n activateInLayout,\n findPlacementByWidgetId,\n getActiveLocationPlacement,\n removeLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport {\n type WorkbenchLayout,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchRegions,\n} from \"./layout-types\";\nimport {\n composeOwnedPlacements,\n type PlacementDestination,\n placementIdentityKey,\n type ResolvedOwnedPlacement,\n} from \"./placement-reconciliation\";\nimport { planTrayTabs } from \"./tray-tabs\";\n\nexport type WorkbenchOwnedWidgetPlacement = ResolvedOwnedPlacement<WorkbenchWidgetPlacement>;\n\nexport interface ReconcileOwnedWidgetLayoutInput {\n layout: WorkbenchLayout;\n modeLayout?: WorkbenchLayout;\n placements: readonly WorkbenchOwnedWidgetPlacement[];\n activate?: readonly PlacementIdentity[];\n destinations?: readonly PlacementDestination[];\n}\n\nexport interface ApplyOwnedWidgetLayoutReconciliationInput extends ReconcileOwnedWidgetLayoutInput {\n remove: readonly PlacementIdentity[];\n}\n\ninterface RenderedOwnedPlacement {\n identity: PlacementIdentity;\n region: WorkbenchOwnedWidgetPlacement[\"region\"];\n placement: WorkbenchWidgetPlacement;\n transferredFromKey?: string;\n}\n\nconst bindsToLocation = (placement: WorkbenchOwnedWidgetPlacement) =>\n placement.value.role === \"sub-panel\" && placement.identity.kind === \"page\";\n\nconst resolveOwnerResourceKey = (\n desired: WorkbenchOwnedWidgetPlacement,\n exact?: WorkbenchWidgetPlacement,\n transfer?: WorkbenchWidgetPlacement,\n) =>\n bindsToLocation(desired)\n ? (desired.value.ownerResourceKey ?? exact?.ownerResourceKey ?? transfer?.ownerResourceKey)\n : desired.value.ownerResourceKey;\n\nexport const indexCurrentOwnedPlacements = (layout: WorkbenchLayout) => {\n const indexed = new Map<string, { region: WorkbenchRegion; placement: WorkbenchWidgetPlacement }>();\n for (const region of Object.values(layout.regions)) {\n for (const placement of region.widgets) {\n if (!placement.placementIdentity) continue;\n const key = placementIdentityKey(placement.placementIdentity);\n if (indexed.has(key)) throw new Error(`Duplicate rendered placement identity: ${key}`);\n indexed.set(key, { region: region.id, placement });\n }\n }\n return indexed;\n};\n\nconst findModePlacementTransfer = (input: {\n current: ReturnType<typeof indexCurrentOwnedPlacements>;\n desired: WorkbenchOwnedWidgetPlacement;\n desiredKeys: ReadonlySet<string>;\n transferredCurrentKeys: ReadonlySet<string>;\n}) => {\n if (input.desired.identity.kind !== \"mode\") return undefined;\n const desiredIdentity = input.desired.identity;\n return [...input.current.entries()].find(\n ([currentKey, candidate]) =>\n !input.desiredKeys.has(currentKey) &&\n !input.transferredCurrentKeys.has(currentKey) &&\n candidate.placement.placementIdentity?.kind === \"mode\" &&\n (candidate.placement.placementIdentity.modeId !== desiredIdentity.modeId ||\n candidate.placement.placementIdentity.placementId !== desiredIdentity.placementId) &&\n candidate.region === input.desired.region &&\n candidate.placement.contributionId === input.desired.value.contributionId &&\n candidate.placement.viewId === input.desired.value.viewId,\n );\n};\n\nconst indexCurrentWidgetOwners = (layout: WorkbenchLayout) => {\n const owners = new Map<string, string | null>();\n for (const region of Object.values(layout.regions)) {\n for (const placement of region.widgets) {\n if (owners.has(placement.widgetId)) throw new Error(`Duplicate rendered widget ID: ${placement.widgetId}`);\n owners.set(\n placement.widgetId,\n placement.placementIdentity ? placementIdentityKey(placement.placementIdentity) : null,\n );\n }\n }\n return owners;\n};\n\nconst restoreModeWidgets = (\n widgets: readonly WorkbenchWidgetPlacement[],\n saved: readonly WorkbenchWidgetPlacement[],\n desired: ReadonlyMap<string, RenderedOwnedPlacement>,\n order?: readonly string[],\n) => {\n const currentIds = new Set(widgets.map((widget) => widget.widgetId));\n const restored = [\n ...widgets,\n ...saved.filter(\n (widget) =>\n !currentIds.has(widget.widgetId) &&\n widget.placementIdentity &&\n desired.has(placementIdentityKey(widget.placementIdentity)),\n ),\n ];\n if (!order) return restored;\n const positions = new Map(order.map((id, index) => [id, index]));\n const ordered = restored.sort(\n (a, b) => (positions.get(a.widgetId) ?? order.length) - (positions.get(b.widgetId) ?? order.length),\n );\n // Page snapshots own the mixed slots. Mode snapshots own the order of\n // shared tabs occupying those slots, including edits made on another page.\n const sharedPositions = new Map(saved.map((widget, index) => [widget.widgetId, index]));\n const shared = ordered\n .filter((widget) => widget.placementIdentity?.kind !== \"page\")\n .sort(\n (a, b) => (sharedPositions.get(a.widgetId) ?? saved.length) - (sharedPositions.get(b.widgetId) ?? saved.length),\n );\n let sharedIndex = 0;\n return ordered.map((widget) => (widget.placementIdentity?.kind !== \"page\" ? shared[sharedIndex++]! : widget));\n};\n\nexport const renderDesiredPlacements = (\n input: ReconcileOwnedWidgetLayoutInput,\n current: ReturnType<typeof indexCurrentOwnedPlacements>,\n) => {\n const rendered: RenderedOwnedPlacement[] = [];\n const identities = new Set<string>();\n const currentWidgetOwners = indexCurrentWidgetOwners(input.layout);\n const saved = input.modeLayout ? indexCurrentOwnedPlacements(input.modeLayout) : new Map();\n const desiredWidgetIds = new Set<string>();\n const destinations = new Map(\n input.destinations?.map((destination) => [placementIdentityKey(destination.identity), destination.region]),\n );\n\n const ordered = composeOwnedPlacements({\n shell: input.placements.filter((placement) => placement.identity.kind === \"shell\"),\n mode: input.placements.filter((placement) => placement.identity.kind === \"mode\"),\n page: input.placements.filter((placement) => placement.identity.kind === \"page\"),\n }).placements;\n const desiredKeys = new Set(ordered.map((placement) => placementIdentityKey(placement.identity)));\n const transferredCurrentKeys = new Set<string>();\n for (const desired of ordered) {\n const key = placementIdentityKey(desired.identity);\n if (identities.has(key)) throw new Error(`Duplicate desired placement identity: ${key}`);\n identities.add(key);\n const exact = current.get(key) ?? saved.get(key);\n const transfer = exact\n ? undefined\n : findModePlacementTransfer({ current, desired, desiredKeys, transferredCurrentKeys });\n const transferredFromKey = transfer?.[0];\n if (transferredFromKey) transferredCurrentKeys.add(transferredFromKey);\n const widgetId = exact?.placement.widgetId ?? transfer?.[1].placement.widgetId ?? desired.value.widgetId;\n const currentOwner = currentWidgetOwners.get(widgetId);\n if (currentOwner !== undefined && currentOwner !== key && currentOwner !== transferredFromKey) {\n throw new Error(`Rendered widget ID belongs to another placement: ${widgetId}`);\n }\n if (desiredWidgetIds.has(widgetId)) throw new Error(`Duplicate desired widget ID: ${widgetId}`);\n desiredWidgetIds.add(widgetId);\n const ownerResourceKey = resolveOwnerResourceKey(desired, exact?.placement, transfer?.[1].placement);\n rendered.push({\n identity: desired.identity,\n region: destinations.get(key) ?? exact?.region ?? desired.region,\n placement: {\n ...desired.value,\n widgetId,\n placementIdentity: desired.identity,\n ...(ownerResourceKey ? { ownerResourceKey } : {}),\n },\n ...(transferredFromKey ? { transferredFromKey } : {}),\n });\n }\n return rendered;\n};\n\nconst reconcileRegions = (\n layout: WorkbenchLayout,\n desired: readonly RenderedOwnedPlacement[],\n removedKeys: ReadonlySet<string>,\n modeLayout?: WorkbenchLayout,\n) => {\n // Content opens an empty docked region, except the Side Panel: it opens only\n // when the user chooses it or a navigation reveals it.\n const docked = new Set<WorkbenchRegion>(dockedWorkbenchRegions.filter((region) => region !== \"side\"));\n const regions = { ...layout.regions };\n const desiredByKey = new Map(desired.map((placement) => [placementIdentityKey(placement.identity), placement]));\n const transferredCurrentKeys = new Set(desired.flatMap((placement) => placement.transferredFromKey ?? []));\n for (const regionId of workbenchRegions) {\n const region = layout.regions[regionId];\n const pageOwnsPrimaryLocation = desired.some(\n (entry) => entry.region === regionId && entry.identity.kind === \"page\" && entry.placement.role === \"location\",\n );\n // A routed page owns the primary Location. An unowned Location cannot coexist\n // with it because that would turn page replacement into tab accumulation.\n // Other unowned host panels remain additive.\n const placedKeys = new Set<string>();\n // Keep the visible order while updating existing placements in place. Any\n // desired placement left afterward is a new tab and belongs at the end.\n const restored = restoreModeWidgets(\n region.widgets,\n modeLayout?.regions[regionId].widgets ?? [],\n desiredByKey,\n region.savedWidgetOrder,\n );\n const widgets = restored.flatMap((placement) => {\n if (!placement.placementIdentity) {\n return regionId === \"main\" && pageOwnsPrimaryLocation && placement.role === \"location\" ? [] : [placement];\n }\n const key = placementIdentityKey(placement.placementIdentity);\n const replacement = desiredByKey.get(key);\n if (replacement) {\n if (replacement.region !== regionId) return [];\n placedKeys.add(key);\n return [replacement.placement];\n }\n return removedKeys.has(key) || transferredCurrentKeys.has(key) ? [] : [placement];\n });\n for (const entry of desired) {\n const key = placementIdentityKey(entry.identity);\n if (entry.region === regionId && !placedKeys.has(key)) widgets.push(entry.placement);\n }\n const tray = planTrayTabs(\n widgets,\n desired.find((entry) => entry.region === regionId && entry.placement.tabRetention === \"preview\")?.placement\n .widgetId ?? region.activeWidgetId,\n );\n const selected = region.widgets.find((widget) => widget.widgetId === region.activeWidgetId);\n // A selected preview keeps its slot when replaced; other selections stay put.\n // Page caches omit mode tabs, so recover their shared selection from the mode's cache.\n const activeWidgetId =\n [\n region.activeWidgetId,\n selected?.tabRetention === \"preview\"\n ? tray.widgets.find((widget) => widget.tabRetention === \"preview\")?.widgetId\n : undefined,\n modeLayout?.regions[regionId].activeWidgetId,\n ].find((id) => tray.widgets.some((placement) => placement.widgetId === id)) ?? tray.widgets[0]?.widgetId;\n const opensPreviouslyEmptyRegion =\n region.widgets.length === 0 && widgets.some((placement) => !placement.hiddenByDefault);\n const closesEmptyPanel =\n (regionId === \"side\" || regionId === \"secondary\") && region.widgets.length > 0 && widgets.length === 0;\n regions[regionId] = {\n ...region,\n widgets: tray.widgets,\n savedWidgetOrder: undefined,\n activeWidgetId,\n ...(docked.has(regionId) ? { visible: region.visible || opensPreviouslyEmptyRegion } : {}),\n ...(closesEmptyPanel ? { visible: false } : {}),\n };\n }\n return { ...layout, regions };\n};\n\nconst normalizeRemovedState = (input: {\n current: ReturnType<typeof indexCurrentOwnedPlacements>;\n desired: readonly RenderedOwnedPlacement[];\n removedKeys: ReadonlySet<string>;\n layout: WorkbenchLayout;\n}) => {\n const transferredCurrentKeys = new Set(input.desired.flatMap((placement) => placement.transferredFromKey ?? []));\n let layout = input.layout;\n for (const [key, current] of input.current) {\n if (input.removedKeys.has(key) && !transferredCurrentKeys.has(key)) {\n layout = removeLocationSubPanelSelection(layout, current.placement.widgetId);\n }\n }\n\n const activeLocation = layout.activeLocationWidgetId\n ? findPlacementByWidgetId(layout, layout.activeLocationWidgetId)?.placement\n : undefined;\n const fallbackLocation = getActiveLocationPlacement(layout);\n const activeLocationWidgetId = activeLocation?.widgetId ?? fallbackLocation?.widgetId;\n const active = layout.activeWidgetId ? findPlacementByWidgetId(layout, layout.activeWidgetId)?.placement : undefined;\n const fallbackActive = activeLocationWidgetId\n ? findPlacementByWidgetId(layout, activeLocationWidgetId)?.placement\n : Object.values(layout.regions).flatMap((region) => region.widgets)[0];\n\n return {\n ...layout,\n activeWidgetId: active?.widgetId ?? fallbackActive?.widgetId,\n activeLocationWidgetId,\n activeResourceKey: active?.resourceKey ?? fallbackActive?.resourceKey,\n };\n};\n\nconst bindOwnedSubPanelsToLocation = (layout: WorkbenchLayout, desired: readonly RenderedOwnedPlacement[]) => {\n const ownerResourceKey = getActiveLocationPlacement(layout)?.resourceKey;\n if (!ownerResourceKey) return layout;\n const desiredByKey = new Map(desired.map((entry) => [placementIdentityKey(entry.identity), entry]));\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((placement) => {\n if (placement.role !== \"sub-panel\" || !placement.placementIdentity) return placement;\n const desiredPlacement = desiredByKey.get(placementIdentityKey(placement.placementIdentity));\n if (!desiredPlacement) return placement;\n // Shared resources own their content; visiting a page does not make it their owner.\n if (desiredPlacement.identity.kind !== \"page\") return placement;\n return { ...placement, ownerResourceKey };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n return { ...layout, regions };\n};\n\nconst updateOwnedWidgetLayout = (input: ReconcileOwnedWidgetLayoutInput, removedKeys: ReadonlySet<string>) => {\n if (input.placements.length === 0 && removedKeys.size === 0 && (input.activate?.length ?? 0) === 0) {\n return input.layout;\n }\n const current = indexCurrentOwnedPlacements(input.layout);\n const desired = renderDesiredPlacements(input, current);\n let layout: WorkbenchLayout = normalizeRemovedState({\n current,\n desired,\n removedKeys,\n layout: reconcileRegions(input.layout, desired, removedKeys, input.modeLayout),\n });\n const desiredByIdentity = new Map(desired.map((entry) => [placementIdentityKey(entry.identity), entry]));\n\n for (const identity of input.activate ?? []) {\n const entry = desiredByIdentity.get(placementIdentityKey(identity));\n if (!entry) throw new Error(`Cannot activate missing rendered placement: ${placementIdentityKey(identity)}`);\n layout = activateInLayout(layout, entry.region, entry.placement);\n }\n return bindOwnedSubPanelsToLocation(layout, desired);\n};\n\nexport const reconcileOwnedWidgetLayout = (input: ReconcileOwnedWidgetLayoutInput) => {\n const desiredKeys = new Set(input.placements.map((placement) => placementIdentityKey(placement.identity)));\n const current = indexCurrentOwnedPlacements(input.layout);\n const removedKeys = new Set([...current.keys()].filter((key) => !desiredKeys.has(key)));\n return updateOwnedWidgetLayout(input, removedKeys);\n};\n\nexport const applyOwnedWidgetLayoutReconciliation = (input: ApplyOwnedWidgetLayoutReconciliationInput) =>\n updateOwnedWidgetLayout(input, new Set(input.remove.map(placementIdentityKey)));\n","import type { WorkbenchLayout, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { indexCurrentOwnedPlacements, renderDesiredPlacements } from \"../../registries/layout/owned-placement-layout\";\nimport { placementIdentityKey, reconcileOwnedPlacements } from \"../../registries/layout/placement-reconciliation\";\nimport { planTrayTabs } from \"../../registries/layout/tray-tabs\";\nimport { editPagePlacementStates } from \"../../registries/pages/page-placement-state\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\n\ntype State = WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>;\nexport const retainTrayPreviews = (\n state: State,\n previous: State,\n current: WorkbenchLayout,\n modeLayout?: WorkbenchLayout,\n) => {\n const rendered = renderDesiredPlacements(\n { layout: current, modeLayout, placements: state.placements, destinations: state.reconciliation.destinations },\n indexCurrentOwnedPlacements(current),\n );\n const incoming = [\n ...state.reconciliation.activate,\n ...state.reconciliation.add,\n ...state.reconciliation.update.map((entry) => entry.desired),\n ];\n const preferred = incoming\n .filter((entry) => entry.value.tabRetention === \"preview\")\n .map((entry) => placementIdentityKey(entry.identity));\n const removed = new Set<string>();\n for (const region of Object.values(current.regions)) {\n const candidates = rendered.filter((entry) => entry.region === region.id);\n const preferredEntry = preferred\n .map((key) => candidates.find((entry) => placementIdentityKey(entry.identity) === key))\n .find(Boolean);\n const plan = planTrayTabs(\n candidates.map((entry) => entry.placement),\n preferredEntry?.placement.widgetId ?? region.activeWidgetId,\n );\n for (const widget of plan.replaced)\n if (widget.placementIdentity) removed.add(placementIdentityKey(widget.placementIdentity));\n }\n return removeTrayPreviews(state, previous, removed);\n};\n\nexport const removeTrayPreviews = (state: State, previous: State, removed: ReadonlySet<string>) => {\n if (!removed.size) return state;\n const placements = state.placements.filter((entry) => !removed.has(placementIdentityKey(entry.identity)));\n let pageStates = state.pageStates;\n for (const entry of state.placements) {\n const identity = entry.identity;\n if (identity.kind !== \"page\" || !removed.has(placementIdentityKey(identity))) continue;\n pageStates = editPagePlacementStates(pageStates, identity, { kind: \"close\" });\n }\n return {\n ...state,\n placements,\n pageStates,\n reconciliation: reconcileOwnedPlacements({\n current: previous.placements,\n desired: placements,\n destinations: state.reconciliation.destinations,\n activate: state.reconciliation.activate\n .filter((entry) => !removed.has(placementIdentityKey(entry.identity)))\n .map((entry) => entry.identity),\n valuesEqual: (left, right) => JSON.stringify(left) === JSON.stringify(right),\n }),\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport { editPagePlacementStates } from \"../../registries/pages/page-placement-state\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport { pageContextChanged } from \"./page-main-tabs\";\nimport { removeTrayPreviews } from \"./tray-preview-retention\";\n\ntype State = WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>;\n\nexport const departingPagePreviews = (next: State, previous: State, layout: WorkbenchLayout) => {\n if (\n !previous.activePageId ||\n previous.projectId !== next.projectId ||\n previous.activeModeId !== next.activeModeId ||\n !pageContextChanged(next, previous)\n )\n return [];\n return Object.values(layout.regions).flatMap((region) =>\n region.widgets.filter((widget) => widget.tabRetention === \"preview\"),\n );\n};\n\nexport const closeDepartingPagePreviews = (state: State, previous: State, layout: WorkbenchLayout) => {\n const previews = departingPagePreviews(state, previous, layout);\n const removed = new Set(\n previews.flatMap((widget) => {\n if (!widget.placementIdentity) return [];\n const key = placementIdentityKey(widget.placementIdentity);\n const incoming = state.placements.find((entry) => placementIdentityKey(entry.identity) === key);\n return incoming?.value.tabRetention === \"preview\" &&\n resourceKey(incoming.value.resource) === resourceKey(widget.resource)\n ? [key]\n : [];\n }),\n );\n const next = removeTrayPreviews(state, previous, removed);\n let pageStates = next.pageStates;\n for (const widget of previews) {\n const identity = widget.placementIdentity;\n if (identity?.kind !== \"page\") continue;\n pageStates = editPagePlacementStates(pageStates, identity, { kind: \"close\" });\n }\n return previews.length ? { ...next, pageStates } : next;\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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"}
|